You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
242 lines
5.9 KiB
242 lines
5.9 KiB
From 31d9cebc43833de939a0e13be0110ed830b66cbd Mon Sep 17 00:00:00 2001
|
|
From: Alon Bar-Lev <alon.barlev@gmail.com>
|
|
Date: Sat, 8 Dec 2018 23:28:54 +0200
|
|
Subject: [PATCH] data_import.c: support openssl-1.1
|
|
|
|
Signed-off-by: Alon Bar-Lev <alon.barlev@gmail.com>
|
|
Bug: https://sourceforge.net/p/trousers/bugs/227/
|
|
---
|
|
src/data_mgmt/data_import.c | 159 +++++++++++++++++++++++++-----------
|
|
1 file changed, 112 insertions(+), 47 deletions(-)
|
|
|
|
diff --git a/src/data_mgmt/data_import.c b/src/data_mgmt/data_import.c
|
|
index f534717..33c76e7 100644
|
|
--- a/src/data_mgmt/data_import.c
|
|
+++ b/src/data_mgmt/data_import.c
|
|
@@ -39,6 +39,30 @@
|
|
#include <openssl/evp.h>
|
|
#include <openssl/err.h>
|
|
|
|
+#if OPENSSL_VERSION_NUMBER < 0x10100000L || (defined(LIBRESSL_VERSION_NUMBER) && LIBRESSL_VERSION_NUMBER < 0x20700000L)
|
|
+static void RSA_get0_key(const RSA *r, const BIGNUM **n, const BIGNUM **e, const BIGNUM **d) {
|
|
+ if ( n )
|
|
+ *n = r->n;
|
|
+ if ( e )
|
|
+ *e = r->e;
|
|
+ if ( d )
|
|
+ *d = r->d;
|
|
+}
|
|
+static void RSA_get0_factors(const RSA *r, const BIGNUM **p, const BIGNUM **q) {
|
|
+ if ( p )
|
|
+ *p = r->p;
|
|
+ if ( q )
|
|
+ *q = r->q;
|
|
+}
|
|
+static void RSA_get0_crt_params(const RSA *r, const BIGNUM **dmp1, const BIGNUM **dmq1, const BIGNUM **iqmp) {
|
|
+ if ( dmp1 )
|
|
+ *dmp1 = r->dmp1;
|
|
+ if ( dmq1 )
|
|
+ *dmq1 = r->dmq1;
|
|
+ if ( iqmp )
|
|
+ *iqmp = r->iqmp;
|
|
+}
|
|
+#endif
|
|
|
|
/*
|
|
* Global variables
|
|
@@ -372,7 +396,7 @@ readX509Cert( const char *a_pszFile,
|
|
goto out;
|
|
}
|
|
|
|
- if ( EVP_PKEY_type( pKey->type ) != EVP_PKEY_RSA ) {
|
|
+ if ( EVP_PKEY_base_id( pKey ) != EVP_PKEY_RSA ) {
|
|
logError( TOKEN_RSA_KEY_ERROR );
|
|
|
|
X509_free( pX509 );
|
|
@@ -691,17 +715,35 @@ createRsaPubKeyObject( RSA *a_pRsa,
|
|
|
|
int rc = -1;
|
|
|
|
- int nLen = BN_num_bytes( a_pRsa->n );
|
|
- int eLen = BN_num_bytes( a_pRsa->e );
|
|
+ const BIGNUM *bn;
|
|
+ const BIGNUM *be;
|
|
+ int nLen;
|
|
+ int eLen;
|
|
+ CK_BYTE *n = NULL;
|
|
+ CK_BYTE *e = NULL;
|
|
+
|
|
+ RSA_get0_key( a_pRsa, &bn, &be, NULL );
|
|
+
|
|
+ nLen = BN_num_bytes( bn );
|
|
+ eLen = BN_num_bytes( be );
|
|
+ n = malloc( nLen );
|
|
+ e = malloc( eLen );
|
|
+
|
|
+ if ( !n || !e ) {
|
|
+ logError( TOKEN_MEMORY_ERROR );
|
|
+ goto out;
|
|
+ }
|
|
+
|
|
+ // Get binary representations of the RSA key information
|
|
+ BN_bn2bin( bn, n );
|
|
+ BN_bn2bin( be, e );
|
|
|
|
+ {
|
|
CK_RV rv;
|
|
|
|
CK_BBOOL bTrue = TRUE;
|
|
CK_BBOOL bFalse = FALSE;
|
|
|
|
- CK_BYTE *n = malloc( nLen );
|
|
- CK_BYTE *e = malloc( eLen );
|
|
-
|
|
CK_OBJECT_CLASS clPubClass = CKO_PUBLIC_KEY;
|
|
CK_KEY_TYPE tKeyType = CKK_RSA;
|
|
CK_BBOOL bPrivate = ( !g_bPublic ) ? TRUE : FALSE;
|
|
@@ -726,21 +768,13 @@ createRsaPubKeyObject( RSA *a_pRsa,
|
|
|
|
*a_hObject = 0;
|
|
|
|
- if ( !n || !e ) {
|
|
- logError( TOKEN_MEMORY_ERROR );
|
|
- goto out;
|
|
- }
|
|
-
|
|
- // Get binary representations of the RSA key information
|
|
- BN_bn2bin( a_pRsa->n, n );
|
|
- BN_bn2bin( a_pRsa->e, e );
|
|
-
|
|
// Create the RSA public key object
|
|
rv = createObject( a_hSession, tAttr, ulAttrCount, a_hObject );
|
|
if ( rv != CKR_OK )
|
|
goto out;
|
|
|
|
rc = 0;
|
|
+ }
|
|
|
|
out:
|
|
free( n );
|
|
@@ -760,29 +794,74 @@ createRsaPrivKeyObject( RSA *a_pRsa,
|
|
|
|
int rc = -1;
|
|
|
|
- int nLen = BN_num_bytes( a_pRsa->n );
|
|
- int eLen = BN_num_bytes( a_pRsa->e );
|
|
- int dLen = BN_num_bytes( a_pRsa->d );
|
|
- int pLen = BN_num_bytes( a_pRsa->p );
|
|
- int qLen = BN_num_bytes( a_pRsa->q );
|
|
- int dmp1Len = BN_num_bytes( a_pRsa->dmp1 );
|
|
- int dmq1Len = BN_num_bytes( a_pRsa->dmq1 );
|
|
- int iqmpLen = BN_num_bytes( a_pRsa->iqmp );
|
|
+ const BIGNUM *bn;
|
|
+ const BIGNUM *be;
|
|
+ const BIGNUM *bd;
|
|
+ const BIGNUM *bp;
|
|
+ const BIGNUM *bq;
|
|
+ const BIGNUM *bdmp1;
|
|
+ const BIGNUM *bdmq1;
|
|
+ const BIGNUM *biqmp;
|
|
+ int nLen;
|
|
+ int eLen;
|
|
+ int dLen;
|
|
+ int pLen;
|
|
+ int qLen;
|
|
+ int dmp1Len;
|
|
+ int dmq1Len;
|
|
+ int iqmpLen;
|
|
+ CK_BYTE *n = NULL;
|
|
+ CK_BYTE *e = NULL;
|
|
+ CK_BYTE *d = NULL;
|
|
+ CK_BYTE *p = NULL;
|
|
+ CK_BYTE *q = NULL;
|
|
+ CK_BYTE *dmp1 = NULL;
|
|
+ CK_BYTE *dmq1 = NULL;
|
|
+ CK_BYTE *iqmp = NULL;
|
|
+
|
|
+ RSA_get0_key( a_pRsa, &bn, &be, &bd);
|
|
+ RSA_get0_factors( a_pRsa, &bp, &bq);
|
|
+ RSA_get0_crt_params( a_pRsa, &bdmp1, &bdmq1, &biqmp );
|
|
+
|
|
+ nLen = BN_num_bytes( bn );
|
|
+ eLen = BN_num_bytes( be );
|
|
+ dLen = BN_num_bytes( bd );
|
|
+ pLen = BN_num_bytes( bp );
|
|
+ qLen = BN_num_bytes( bq );
|
|
+ dmp1Len = BN_num_bytes( bdmp1 );
|
|
+ dmq1Len = BN_num_bytes( bdmq1 );
|
|
+ iqmpLen = BN_num_bytes( biqmp );
|
|
+
|
|
+ n = malloc( nLen );
|
|
+ e = malloc( eLen );
|
|
+ d = malloc( dLen );
|
|
+ p = malloc( pLen );
|
|
+ q = malloc( qLen );
|
|
+ dmp1 = malloc( dmp1Len );
|
|
+ dmq1 = malloc( dmq1Len );
|
|
+ iqmp = malloc( iqmpLen );
|
|
|
|
+ if ( !n || !e || !d || !p || !q || !dmp1 || !dmq1 || !iqmp ) {
|
|
+ logError( TOKEN_MEMORY_ERROR );
|
|
+ goto out;
|
|
+ }
|
|
+
|
|
+ // Get binary representations of the RSA key information
|
|
+ BN_bn2bin( bn, n );
|
|
+ BN_bn2bin( be, e );
|
|
+ BN_bn2bin( bd, d );
|
|
+ BN_bn2bin( bp, p );
|
|
+ BN_bn2bin( bq, q );
|
|
+ BN_bn2bin( bdmp1, dmp1 );
|
|
+ BN_bn2bin( bdmq1, dmq1 );
|
|
+ BN_bn2bin( biqmp, iqmp );
|
|
+
|
|
+ {
|
|
CK_RV rv;
|
|
|
|
CK_BBOOL bTrue = TRUE;
|
|
CK_BBOOL bFalse = FALSE;
|
|
|
|
- CK_BYTE *n = malloc( nLen );
|
|
- CK_BYTE *e = malloc( eLen );
|
|
- CK_BYTE *d = malloc( dLen );
|
|
- CK_BYTE *p = malloc( pLen );
|
|
- CK_BYTE *q = malloc( qLen );
|
|
- CK_BYTE *dmp1 = malloc( dmp1Len );
|
|
- CK_BYTE *dmq1 = malloc( dmq1Len );
|
|
- CK_BYTE *iqmp = malloc( iqmpLen );
|
|
-
|
|
CK_OBJECT_CLASS clPrivClass = CKO_PRIVATE_KEY;
|
|
CK_KEY_TYPE tKeyType = CKK_RSA;
|
|
CK_BBOOL bPrivate = ( !g_bPublic ) ? TRUE : FALSE;
|
|
@@ -815,25 +894,11 @@ createRsaPrivKeyObject( RSA *a_pRsa,
|
|
|
|
*a_hObject = 0;
|
|
|
|
- if ( !n || !e || !d || !p || !q || !dmp1 || !dmq1 || !iqmp ) {
|
|
- logError( TOKEN_MEMORY_ERROR );
|
|
- goto out;
|
|
- }
|
|
-
|
|
- // Get binary representations of the RSA key information
|
|
- BN_bn2bin( a_pRsa->n, n );
|
|
- BN_bn2bin( a_pRsa->e, e );
|
|
- BN_bn2bin( a_pRsa->d, d );
|
|
- BN_bn2bin( a_pRsa->p, p );
|
|
- BN_bn2bin( a_pRsa->q, q );
|
|
- BN_bn2bin( a_pRsa->dmp1, dmp1 );
|
|
- BN_bn2bin( a_pRsa->dmq1, dmq1 );
|
|
- BN_bn2bin( a_pRsa->iqmp, iqmp );
|
|
-
|
|
// Create the RSA private key object
|
|
rv = createObject( a_hSession, tAttr, ulAttrCount, a_hObject );
|
|
if ( rv != CKR_OK )
|
|
goto out;
|
|
+ }
|
|
|
|
rc = 0;
|
|
|
|
--
|
|
2.19.2
|
|
|