View | Details | Raw Unified | Return to bug 2638 | Differences between
and this patch

Collapse All | Expand All

(-)a/ssh-pkcs11.c (-20 / +62 lines)
Lines 216-221 pkcs11_find(struct pkcs11_provider *p, CK_ULONG slotidx, CK_ATTRIBUTE *attr, Link Here
216
	return (ret);
216
	return (ret);
217
}
217
}
218
218
219
int
220
pkcs11_login(struct pkcs11_provider *p, struct pkcs11_slotinfo *si,
221
    int login_type)
222
{
223
	CK_RV			rv;
224
	CK_FUNCTION_LIST	*f;
225
	char			*pin = NULL, prompt[1024];
226
227
	f = p->function_list;
228
229
	if (si->token.flags & CKF_PROTECTED_AUTHENTICATION_PATH)
230
		verbose("Deferring PIN entry to reader keypad.");
231
	else {
232
		snprintf(prompt, sizeof(prompt),
233
		    "Enter PIN for '%s': ", si->token.label);
234
		pin = read_passphrase(prompt, RP_ALLOW_EOF);
235
		if (pin == NULL)
236
			return (-1);	/* bail out */
237
	}
238
	/* context specific login */
239
	rv = f->C_Login(si->session, login_type, (u_char *)pin,
240
		(pin != NULL) ? strlen(pin) : 0);
241
242
	if (pin != NULL) {
243
		explicit_bzero(pin, strlen(pin));
244
		free(pin);
245
	}
246
	if (rv != CKR_OK && rv != CKR_USER_ALREADY_LOGGED_IN) {
247
		error("C_Login failed: %lu", rv);
248
		return (-1);
249
	}
250
	/* authentication successful */
251
	return (0);
252
}
253
254
int
255
pkcs11_always_authenticate(struct pkcs11_provider *p,
256
    struct pkcs11_slotinfo *si, CK_OBJECT_HANDLE obj)
257
{
258
	CK_RV			rv;
259
	CK_FUNCTION_LIST	*f;
260
	CK_BBOOL		always_authenticate = 0;
261
	CK_ATTRIBUTE template = { CKA_ALWAYS_AUTHENTICATE, &always_authenticate, 1};
262
263
	f = p->function_list;
264
265
	rv = f->C_GetAttributeValue(si->session, obj, &(template), 1);
266
	if (rv != CKR_OK || always_authenticate == CK_FALSE) {
267
		/* not needed */
268
		return (0);
269
	}
270
271
	return pkcs11_login(p, si, CKU_CONTEXT_SPECIFIC);
272
}
273
219
/* openssl callback doing the actual signing operation */
274
/* openssl callback doing the actual signing operation */
220
static int
275
static int
221
pkcs11_rsa_private_encrypt(int flen, const u_char *from, u_char *to, RSA *rsa,
276
pkcs11_rsa_private_encrypt(int flen, const u_char *from, u_char *to, RSA *rsa,
Lines 237-244 pkcs11_rsa_private_encrypt(int flen, const u_char *from, u_char *to, RSA *rsa, Link Here
237
		{CKA_ID, NULL, 0},
292
		{CKA_ID, NULL, 0},
238
		{CKA_SIGN, NULL, sizeof(true_val) }
293
		{CKA_SIGN, NULL, sizeof(true_val) }
239
	};
294
	};
240
	char			*pin = NULL, prompt[1024];
295
	int			rval = -1, login_performed = 0;
241
	int			rval = -1;
242
296
243
	key_filter[0].pValue = &private_key_class;
297
	key_filter[0].pValue = &private_key_class;
244
	key_filter[2].pValue = &true_val;
298
	key_filter[2].pValue = &true_val;
Lines 260-285 pkcs11_rsa_private_encrypt(int flen, const u_char *from, u_char *to, RSA *rsa, Link Here
260
			    " on reader keypad" : "");
314
			    " on reader keypad" : "");
261
			return (-1);
315
			return (-1);
262
		}
316
		}
263
		if (si->token.flags & CKF_PROTECTED_AUTHENTICATION_PATH)
317
264
			verbose("Deferring PIN entry to reader keypad.");
318
		if (pkcs11_login(k11->provider, si, CKU_USER) < 0)
265
		else {
266
			snprintf(prompt, sizeof(prompt),
267
			    "Enter PIN for '%s': ", si->token.label);
268
			pin = read_passphrase(prompt, RP_ALLOW_EOF);
269
			if (pin == NULL)
270
				return (-1);	/* bail out */
271
		}
272
		rv = f->C_Login(si->session, CKU_USER, (u_char *)pin,
273
		    (pin != NULL) ? strlen(pin) : 0);
274
		if (pin != NULL) {
275
			explicit_bzero(pin, strlen(pin));
276
			free(pin);
277
		}
278
		if (rv != CKR_OK && rv != CKR_USER_ALREADY_LOGGED_IN) {
279
			error("C_Login failed: %lu", rv);
280
			return (-1);
319
			return (-1);
281
		}
282
		si->logged_in = 1;
320
		si->logged_in = 1;
321
		login_performed = 1;
283
	}
322
	}
284
	key_filter[1].pValue = k11->keyid;
323
	key_filter[1].pValue = k11->keyid;
285
	key_filter[1].ulValueLen = k11->keyid_len;
324
	key_filter[1].ulValueLen = k11->keyid_len;
Lines 289-294 pkcs11_rsa_private_encrypt(int flen, const u_char *from, u_char *to, RSA *rsa, Link Here
289
		error("cannot find private key");
328
		error("cannot find private key");
290
	} else if ((rv = f->C_SignInit(si->session, &mech, obj)) != CKR_OK) {
329
	} else if ((rv = f->C_SignInit(si->session, &mech, obj)) != CKR_OK) {
291
		error("C_SignInit failed: %lu", rv);
330
		error("C_SignInit failed: %lu", rv);
331
	} else if (!login_performed &&
332
	    pkcs11_always_authenticate(k11->provider, si, obj) < 0) {
333
		error("Failed to re-authenticate to access ALWAYS_AUTHENTICATE object");
292
	} else {
334
	} else {
293
		/* XXX handle CKR_BUFFER_TOO_SMALL */
335
		/* XXX handle CKR_BUFFER_TOO_SMALL */
294
		tlen = RSA_size(rsa);
336
		tlen = RSA_size(rsa);

Return to bug 2638