diff options
| author | Stef Walter <stef@memberwebs.com> | 2008-12-05 20:23:01 +0000 | 
|---|---|---|
| committer | Stef Walter <stef@memberwebs.com> | 2008-12-05 20:23:01 +0000 | 
| commit | 9bf245ea2afb75c4180d7fac707bb0c1bcb6b17d (patch) | |
| tree | f02ab06675059a887c53ebc0507e6d13a70fabc5 /src/key.c | |
| parent | d4c964b8c29e931e7561ac05c7a07445e2b3a26c (diff) | |
Implement RSA encrypt and decrypt.
Diffstat (limited to 'src/key.c')
| -rw-r--r-- | src/key.c | 78 | 
1 files changed, 78 insertions, 0 deletions
diff --git a/src/key.c b/src/key.c new file mode 100644 index 0000000..f8b79ae --- /dev/null +++ b/src/key.c @@ -0,0 +1,78 @@ + +#include "config.h" + +#include "p11-tests.h" + +CK_OBJECT_HANDLE +find_related_object(CK_SESSION_HANDLE session, CK_OBJECT_HANDLE key, CK_OBJECT_CLASS klass) +{ +	CK_BYTE id[4096]; +	CK_ATTRIBUTE attrs[2]; + +	attrs[0].type = CKA_ID; +	attrs[0].pValue = id; +	attrs[0].ulValueLen = sizeof(id); + +	if(!p11t_object_get(session, key, attrs, 1)) +		return CK_INVALID; + +	attrs[1].type = CKA_CLASS; +	attrs[1].ulValueLen = sizeof(klass); +	attrs[1].pValue = &klass; + +	return p11t_object_find_one(session, attrs, 2); +} + +CK_OBJECT_HANDLE +p11t_key_get_public(CK_SESSION_HANDLE session, CK_OBJECT_HANDLE key) +{ +	return find_related_object(session, key, CKO_PUBLIC_KEY); +} + +CK_OBJECT_HANDLE +p11t_key_get_private(CK_SESSION_HANDLE session, CK_OBJECT_HANDLE key) +{ +	return find_related_object(session, key, CKO_PRIVATE_KEY); +} + +RSA* +p11t_key_export_public_rsa(CK_SESSION_HANDLE session, CK_OBJECT_HANDLE key) +{ +	CK_ATTRIBUTE attrs[3]; +	CK_BYTE modulus[4096]; +	CK_BYTE public_exponent[4096]; +	CK_ULONG modulus_bits; +	RSA *rsa; + +	attrs[0].type = CKA_MODULUS; +	attrs[0].ulValueLen = sizeof(modulus); +	attrs[0].pValue = modulus; + +	attrs[1].type = CKA_MODULUS_BITS; +	attrs[1].ulValueLen = sizeof(modulus_bits); +	attrs[1].pValue = &modulus_bits; + +	attrs[2].type = CKA_PUBLIC_EXPONENT; +	attrs[2].ulValueLen = sizeof(public_exponent); +	attrs[2].pValue = public_exponent; + +	if(!p11t_object_get(session, key, attrs, 3)) +		return NULL; + +	if(attrs[0].ulValueLen == CK_INVALID || +	   attrs[2].ulValueLen == CK_INVALID) +		return NULL; + +	rsa = RSA_new(); +	rsa->n = BN_bin2bn(modulus, attrs[0].ulValueLen, NULL); +	rsa->e = BN_bin2bn(public_exponent, attrs[2].ulValueLen, NULL); +	assert(rsa && rsa->n && rsa->e); + +	if(attrs[1].ulValueLen != CK_INVALID) +	{ +		assert(RSA_size(rsa) == modulus_bits / 8); +	} + +	return rsa; +} +  | 
