Hello,

I would like to commit the attached patch. It modifies the method of
public key retrieval in pkcs11-tool.

Currently the non standard attribute CKA_VALUE is uses. With the patch
applied, only attributes defined by PKCS#11 are used for public key
retrieval. Tested with OpenSSL 0.9.8.

Regards
Andre
Index: src/tools/pkcs11-tool.c
===================================================================
--- src/tools/pkcs11-tool.c	(revision 4880)
+++ src/tools/pkcs11-tool.c	(working copy)
@@ -1930,6 +1930,7 @@
 VARATTR_METHOD(ID, unsigned char);
 VARATTR_METHOD(OBJECT_ID, unsigned char);
 VARATTR_METHOD(MODULUS, unsigned char);
+VARATTR_METHOD(PUBLIC_EXPONENT, unsigned char);
 VARATTR_METHOD(VALUE, unsigned char);
 VARATTR_METHOD(GOSTR3410_PARAMS, unsigned char);
 
@@ -2490,13 +2491,14 @@
 #ifdef ENABLE_OPENSSL
 static EVP_PKEY *get_public_key(CK_SESSION_HANDLE session, CK_OBJECT_HANDLE privKeyObject)
 {
-	unsigned char  *id;
-	CK_ULONG        idLen;
+	unsigned char  *id, *modulus, *exponent;
+	CK_ULONG        idLen, modLen, expLen;
 	CK_OBJECT_HANDLE pubkeyObject;
 	unsigned char  *pubkey;
 	const unsigned char *pubkey_c;
 	CK_ULONG        pubkeyLen;
 	EVP_PKEY       *pkey;
+	RSA            *rsa;
 
 	id = NULL;
 	id = getID(session, privKeyObject, &idLen);
@@ -2512,6 +2514,39 @@
 	}
 	free(id);
 
+	switch(getKEY_TYPE(session, pubkeyObject)) {
+		case CKK_RSA:
+			pkey = EVP_PKEY_new();
+			rsa = RSA_new();
+			modulus = getMODULUS(session, pubkeyObject, &modLen);
+			exponent = getPUBLIC_EXPONENT(session, pubkeyObject, &expLen);
+			if ( !pkey || !rsa || !modulus || !exponent) {
+				printf("public key not extractable\n");
+				if (pkey)
+					free(pkey);
+				if (rsa)
+					free(rsa);
+				if (modulus)
+					free(modulus);
+				if (exponent)
+					free(exponent);
+				return NULL;
+			}
+			rsa->n = BN_bin2bn(modulus, modLen, NULL);
+			rsa->e = BN_bin2bn(exponent, expLen, NULL);
+			EVP_PKEY_assign_RSA(pkey, rsa);
+			free(modulus);
+			free(exponent);
+			return pkey;
+		case CKK_DSA:
+		case CKK_ECDSA:
+		case CKK_GOSTR3410:
+			break;
+		default:
+			printf("public key of unsupported type\n");
+			return NULL;
+	}
+
 	pubkey = getVALUE(session, pubkeyObject, &pubkeyLen);
 	if (pubkey == NULL) {
 		printf("couldn't get the pubkey VALUE attribute, no validation done\n");
_______________________________________________
opensc-devel mailing list
opensc-devel@lists.opensc-project.org
http://www.opensc-project.org/mailman/listinfo/opensc-devel

Reply via email to