diff options
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; +} + |