summaryrefslogtreecommitdiff
path: root/src/key.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/key.c')
-rw-r--r--src/key.c78
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;
+}
+