| 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 |
| |