diff options
author | jp161948 <none@none> | 2006-10-05 10:49:36 -0700 |
---|---|---|
committer | jp161948 <none@none> | 2006-10-05 10:49:36 -0700 |
commit | 00de47050febf166a83576bc8c4a685ea11fa457 (patch) | |
tree | 9afa9e9baa276eebf05c883a38ac2f2ee45d2073 /usr/src | |
parent | b760ebbf2958f42920969bccd6ccab1b129076a8 (diff) | |
download | illumos-joyent-00de47050febf166a83576bc8c4a685ea11fa457.tar.gz |
6476279 multiple vulnerabilities in OpenSSL (CVE-2006-2937, CVE-2006-2940)
6476772 update OpenSSL version string with information about security patches included
Diffstat (limited to 'usr/src')
-rw-r--r-- | usr/src/common/openssl/crypto/asn1/tasn_dec.c | 1 | ||||
-rw-r--r-- | usr/src/common/openssl/crypto/dh/dh.h | 5 | ||||
-rw-r--r-- | usr/src/common/openssl/crypto/dh/dh_err.c | 1 | ||||
-rw-r--r-- | usr/src/common/openssl/crypto/dh/dh_key.c | 6 | ||||
-rw-r--r-- | usr/src/common/openssl/crypto/dsa/dsa.h | 6 | ||||
-rw-r--r-- | usr/src/common/openssl/crypto/dsa/dsa_err.c | 2 | ||||
-rw-r--r-- | usr/src/common/openssl/crypto/dsa/dsa_ossl.c | 12 | ||||
-rw-r--r-- | usr/src/common/openssl/crypto/ec/ec.h | 7 | ||||
-rw-r--r-- | usr/src/common/openssl/crypto/ec/ec_asn1.c | 47 | ||||
-rw-r--r-- | usr/src/common/openssl/crypto/ec/ec_err.c | 3 | ||||
-rw-r--r-- | usr/src/common/openssl/crypto/opensslv.h | 2 | ||||
-rw-r--r-- | usr/src/common/openssl/crypto/rsa/rsa.h | 13 | ||||
-rw-r--r-- | usr/src/common/openssl/crypto/rsa/rsa_eay.c | 53 | ||||
-rw-r--r-- | usr/src/common/openssl/crypto/rsa/rsa_err.c | 2 |
14 files changed, 148 insertions, 12 deletions
diff --git a/usr/src/common/openssl/crypto/asn1/tasn_dec.c b/usr/src/common/openssl/crypto/asn1/tasn_dec.c index 2b9c25611e..75399edfa8 100644 --- a/usr/src/common/openssl/crypto/asn1/tasn_dec.c +++ b/usr/src/common/openssl/crypto/asn1/tasn_dec.c @@ -826,6 +826,7 @@ static int asn1_d2i_ex_primitive(ASN1_VALUE **pval, } else if (ret == -1) return -1; + ret = 0; /* SEQUENCE, SET and "OTHER" are left in encoded form */ if ((utype == V_ASN1_SEQUENCE) || (utype == V_ASN1_SET) || (utype == V_ASN1_OTHER)) diff --git a/usr/src/common/openssl/crypto/dh/dh.h b/usr/src/common/openssl/crypto/dh/dh.h index 7871882e35..43afc2b854 100644 --- a/usr/src/common/openssl/crypto/dh/dh.h +++ b/usr/src/common/openssl/crypto/dh/dh.h @@ -72,6 +72,10 @@ #ifndef OPENSSL_NO_DEPRECATED #include <openssl/bn.h> #endif + +#ifndef OPENSSL_DH_MAX_MODULUS_BITS +# define OPENSSL_DH_MAX_MODULUS_BITS 10000 +#endif #define DH_FLAG_CACHE_MONT_P 0x01 #define DH_FLAG_NO_EXP_CONSTTIME 0x02 /* new with 0.9.7h; the built-in DH @@ -222,6 +226,7 @@ void ERR_load_DH_strings(void); #define DH_R_BAD_GENERATOR 101 #define DH_R_NO_PRIVATE_VALUE 100 #define DH_R_INVALID_PUBKEY 102 +#define DH_R_MODULUS_TOO_LARGE 103 #ifdef __cplusplus } diff --git a/usr/src/common/openssl/crypto/dh/dh_err.c b/usr/src/common/openssl/crypto/dh/dh_err.c index ea67fb71a0..502e9d1c27 100644 --- a/usr/src/common/openssl/crypto/dh/dh_err.c +++ b/usr/src/common/openssl/crypto/dh/dh_err.c @@ -85,6 +85,7 @@ static ERR_STRING_DATA DH_str_reasons[]= {ERR_REASON(DH_R_BAD_GENERATOR) ,"bad generator"}, {ERR_REASON(DH_R_NO_PRIVATE_VALUE) ,"no private value"}, {ERR_REASON(DH_R_INVALID_PUBKEY) ,"invalid public key"}, +{ERR_REASON(DH_R_MODULUS_TOO_LARGE) ,"modulus too large"}, {0,NULL} }; diff --git a/usr/src/common/openssl/crypto/dh/dh_key.c b/usr/src/common/openssl/crypto/dh/dh_key.c index cc17c8851b..994546e044 100644 --- a/usr/src/common/openssl/crypto/dh/dh_key.c +++ b/usr/src/common/openssl/crypto/dh/dh_key.c @@ -179,6 +179,12 @@ static int compute_key(unsigned char *key, const BIGNUM *pub_key, DH *dh) int ret= -1; int check_result; + if (BN_num_bits(dh->p) > OPENSSL_DH_MAX_MODULUS_BITS) + { + DHerr(DH_F_COMPUTE_KEY,DH_R_MODULUS_TOO_LARGE); + goto err; + } + ctx = BN_CTX_new(); if (ctx == NULL) goto err; BN_CTX_start(ctx); diff --git a/usr/src/common/openssl/crypto/dsa/dsa.h b/usr/src/common/openssl/crypto/dsa/dsa.h index b12db98b13..ab72922c2f 100644 --- a/usr/src/common/openssl/crypto/dsa/dsa.h +++ b/usr/src/common/openssl/crypto/dsa/dsa.h @@ -84,6 +84,10 @@ #endif #endif +#ifndef OPENSSL_DSA_MAX_MODULUS_BITS +# define OPENSSL_DSA_MAX_MODULUS_BITS 10000 +#endif + #define DSA_FLAG_CACHE_MONT_P 0x01 #define DSA_FLAG_NO_EXP_CONSTTIME 0x02 /* new with 0.9.7h; the built-in DSA * implementation now uses constant time @@ -272,6 +276,8 @@ void ERR_load_DSA_strings(void); /* Reason codes. */ #define DSA_R_DATA_TOO_LARGE_FOR_KEY_SIZE 100 #define DSA_R_MISSING_PARAMETERS 101 +#define DSA_R_BAD_Q_VALUE 102 +#define DSA_R_MODULUS_TOO_LARGE 103 #ifdef __cplusplus } diff --git a/usr/src/common/openssl/crypto/dsa/dsa_err.c b/usr/src/common/openssl/crypto/dsa/dsa_err.c index fd42053572..44d75d65f0 100644 --- a/usr/src/common/openssl/crypto/dsa/dsa_err.c +++ b/usr/src/common/openssl/crypto/dsa/dsa_err.c @@ -89,8 +89,10 @@ static ERR_STRING_DATA DSA_str_functs[]= static ERR_STRING_DATA DSA_str_reasons[]= { +{ERR_REASON(DSA_R_BAD_Q_VALUE) ,"bad q value"}, {ERR_REASON(DSA_R_DATA_TOO_LARGE_FOR_KEY_SIZE),"data too large for key size"}, {ERR_REASON(DSA_R_MISSING_PARAMETERS) ,"missing parameters"}, +{ERR_REASON(DSA_R_MODULUS_TOO_LARGE) ,"modulus too large"}, {0,NULL} }; diff --git a/usr/src/common/openssl/crypto/dsa/dsa_ossl.c b/usr/src/common/openssl/crypto/dsa/dsa_ossl.c index 3fd8a35613..d6addc2ac1 100644 --- a/usr/src/common/openssl/crypto/dsa/dsa_ossl.c +++ b/usr/src/common/openssl/crypto/dsa/dsa_ossl.c @@ -304,6 +304,18 @@ static int dsa_do_verify(const unsigned char *dgst, int dgst_len, DSA_SIG *sig, return -1; } + if (BN_num_bits(dsa->q) != 160) + { + DSAerr(DSA_F_DSA_DO_VERIFY,DSA_R_BAD_Q_VALUE); + return -1; + } + + if (BN_num_bits(dsa->p) > OPENSSL_DSA_MAX_MODULUS_BITS) + { + DSAerr(DSA_F_DSA_DO_VERIFY,DSA_R_MODULUS_TOO_LARGE); + return -1; + } + BN_init(&u1); BN_init(&u2); BN_init(&t1); diff --git a/usr/src/common/openssl/crypto/ec/ec.h b/usr/src/common/openssl/crypto/ec/ec.h index a19a075b0d..db62abc917 100644 --- a/usr/src/common/openssl/crypto/ec/ec.h +++ b/usr/src/common/openssl/crypto/ec/ec.h @@ -92,6 +92,10 @@ extern "C" { # endif #endif +#ifndef OPENSSL_ECC_MAX_FIELD_BITS +# define OPENSSL_ECC_MAX_FIELD_BITS 661 +#endif + typedef enum { /* values as defined in X9.62 (ECDSA) and elsewhere */ @@ -482,6 +486,7 @@ void ERR_load_EC_strings(void); #define EC_R_D2I_ECPKPARAMETERS_FAILURE 117 #define EC_R_DISCRIMINANT_IS_ZERO 118 #define EC_R_EC_GROUP_NEW_BY_NAME_FAILURE 119 +#define EC_R_FIELD_TOO_LARGE 138 #define EC_R_GROUP2PKPARAMETERS_FAILURE 120 #define EC_R_I2D_ECPKPARAMETERS_FAILURE 121 #define EC_R_INCOMPATIBLE_OBJECTS 101 @@ -492,7 +497,9 @@ void ERR_load_EC_strings(void); #define EC_R_INVALID_FIELD 103 #define EC_R_INVALID_FORM 104 #define EC_R_INVALID_GROUP_ORDER 122 +#define EC_R_INVALID_PENTANOMIAL_BASIS 132 #define EC_R_INVALID_PRIVATE_KEY 123 +#define EC_R_INVALID_TRINOMIAL_BASIS 137 #define EC_R_MISSING_PARAMETERS 124 #define EC_R_MISSING_PRIVATE_KEY 125 #define EC_R_NOT_A_NIST_PRIME 135 diff --git a/usr/src/common/openssl/crypto/ec/ec_asn1.c b/usr/src/common/openssl/crypto/ec/ec_asn1.c index 5693201a26..3b0392a7a2 100644 --- a/usr/src/common/openssl/crypto/ec/ec_asn1.c +++ b/usr/src/common/openssl/crypto/ec/ec_asn1.c @@ -741,6 +741,7 @@ static EC_GROUP *ec_asn1_parameters2group(const ECPARAMETERS *params) EC_GROUP *ret = NULL; BIGNUM *p = NULL, *a = NULL, *b = NULL; EC_POINT *point=NULL; + long field_bits; if (!params->fieldID || !params->fieldID->fieldType || !params->fieldID->p.ptr) @@ -779,6 +780,13 @@ static EC_GROUP *ec_asn1_parameters2group(const ECPARAMETERS *params) char_two = params->fieldID->p.char_two; + field_bits = char_two->m; + if (field_bits > OPENSSL_ECC_MAX_FIELD_BITS) + { + ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, EC_R_FIELD_TOO_LARGE); + goto err; + } + if ((p = BN_new()) == NULL) { ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, ERR_R_MALLOC_FAILURE); @@ -799,6 +807,13 @@ static EC_GROUP *ec_asn1_parameters2group(const ECPARAMETERS *params) } tmp_long = ASN1_INTEGER_get(char_two->p.tpBasis); + + if (!(char_two->m > tmp_long && tmp_long > 0)) + { + ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, EC_R_INVALID_TRINOMIAL_BASIS); + goto err; + } + /* create the polynomial */ if (!BN_set_bit(p, (int)char_two->m)) goto err; @@ -817,6 +832,13 @@ static EC_GROUP *ec_asn1_parameters2group(const ECPARAMETERS *params) ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, EC_R_ASN1_ERROR); goto err; } + + if (!(char_two->m > penta->k3 && penta->k3 > penta->k2 && penta->k2 > penta->k1 && penta->k1 > 0)) + { + ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, EC_R_INVALID_PENTANOMIAL_BASIS); + goto err; + } + /* create the polynomial */ if (!BN_set_bit(p, (int)char_two->m)) goto err; if (!BN_set_bit(p, (int)penta->k1)) goto err; @@ -858,6 +880,20 @@ static EC_GROUP *ec_asn1_parameters2group(const ECPARAMETERS *params) ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, ERR_R_ASN1_LIB); goto err; } + + if (BN_is_negative(p) || BN_is_zero(p)) + { + ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, EC_R_INVALID_FIELD); + goto err; + } + + field_bits = BN_num_bits(p); + if (field_bits > OPENSSL_ECC_MAX_FIELD_BITS) + { + ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, EC_R_FIELD_TOO_LARGE); + goto err; + } + /* create the EC_GROUP structure */ ret = EC_GROUP_new_curve_GFp(p, a, b, NULL); if (ret == NULL) @@ -909,6 +945,17 @@ static EC_GROUP *ec_asn1_parameters2group(const ECPARAMETERS *params) ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, ERR_R_ASN1_LIB); goto err; } + + if (BN_is_negative(a) || BN_is_zero(a)) + { + ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, EC_R_INVALID_GROUP_ORDER); + goto err; + } + if (BN_num_bits(a) > (int)field_bits + 1) /* Hasse bound */ + { + ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, EC_R_INVALID_GROUP_ORDER); + goto err; + } /* extract the cofactor (optional) */ if (params->cofactor == NULL) diff --git a/usr/src/common/openssl/crypto/ec/ec_err.c b/usr/src/common/openssl/crypto/ec/ec_err.c index 73c0055f01..49e59d3841 100644 --- a/usr/src/common/openssl/crypto/ec/ec_err.c +++ b/usr/src/common/openssl/crypto/ec/ec_err.c @@ -188,6 +188,7 @@ static ERR_STRING_DATA EC_str_reasons[]= {ERR_REASON(EC_R_D2I_ECPKPARAMETERS_FAILURE),"d2i ecpkparameters failure"}, {ERR_REASON(EC_R_DISCRIMINANT_IS_ZERO) ,"discriminant is zero"}, {ERR_REASON(EC_R_EC_GROUP_NEW_BY_NAME_FAILURE),"ec group new by name failure"}, +{ERR_REASON(EC_R_FIELD_TOO_LARGE) ,"field too large"}, {ERR_REASON(EC_R_GROUP2PKPARAMETERS_FAILURE),"group2pkparameters failure"}, {ERR_REASON(EC_R_I2D_ECPKPARAMETERS_FAILURE),"i2d ecpkparameters failure"}, {ERR_REASON(EC_R_INCOMPATIBLE_OBJECTS) ,"incompatible objects"}, @@ -198,7 +199,9 @@ static ERR_STRING_DATA EC_str_reasons[]= {ERR_REASON(EC_R_INVALID_FIELD) ,"invalid field"}, {ERR_REASON(EC_R_INVALID_FORM) ,"invalid form"}, {ERR_REASON(EC_R_INVALID_GROUP_ORDER) ,"invalid group order"}, +{ERR_REASON(EC_R_INVALID_PENTANOMIAL_BASIS),"invalid pentanomial basis"}, {ERR_REASON(EC_R_INVALID_PRIVATE_KEY) ,"invalid private key"}, +{ERR_REASON(EC_R_INVALID_TRINOMIAL_BASIS),"invalid trinomial basis"}, {ERR_REASON(EC_R_MISSING_PARAMETERS) ,"missing parameters"}, {ERR_REASON(EC_R_MISSING_PRIVATE_KEY) ,"missing private key"}, {ERR_REASON(EC_R_NOT_A_NIST_PRIME) ,"not a NIST prime"}, diff --git a/usr/src/common/openssl/crypto/opensslv.h b/usr/src/common/openssl/crypto/opensslv.h index e056bffc72..63b2ca8a97 100644 --- a/usr/src/common/openssl/crypto/opensslv.h +++ b/usr/src/common/openssl/crypto/opensslv.h @@ -29,7 +29,7 @@ #ifdef OPENSSL_FIPS #define OPENSSL_VERSION_TEXT "OpenSSL 0.9.8a-fips 11 Oct 2005" #else -#define OPENSSL_VERSION_TEXT "OpenSSL 0.9.8a 11 Oct 2005" +#define OPENSSL_VERSION_TEXT "OpenSSL 0.9.8a 11 Oct 2005 (+ security patches to 2006-09-29)" #endif #define OPENSSL_VERSION_PTEXT " part of " OPENSSL_VERSION_TEXT diff --git a/usr/src/common/openssl/crypto/rsa/rsa.h b/usr/src/common/openssl/crypto/rsa/rsa.h index baf8bc51e3..b1c42d71ab 100644 --- a/usr/src/common/openssl/crypto/rsa/rsa.h +++ b/usr/src/common/openssl/crypto/rsa/rsa.h @@ -159,6 +159,17 @@ struct rsa_st BN_BLINDING *mt_blinding; }; +#ifndef OPENSSL_RSA_MAX_MODULUS_BITS +# define OPENSSL_RSA_MAX_MODULUS_BITS 16384 +#endif + +#ifndef OPENSSL_RSA_SMALL_MODULUS_BITS +# define OPENSSL_RSA_SMALL_MODULUS_BITS 3072 +#endif +#ifndef OPENSSL_RSA_MAX_PUBEXP_BITS +# define OPENSSL_RSA_MAX_PUBEXP_BITS 64 /* exponent limit enforced for "large" modulus only */ +#endif + #define RSA_3 0x3L #define RSA_F4 0x10001L @@ -407,13 +418,13 @@ void ERR_load_RSA_strings(void); #define RSA_R_IQMP_NOT_INVERSE_OF_Q 126 #define RSA_R_KEY_SIZE_TOO_SMALL 120 #define RSA_R_LAST_OCTET_INVALID 134 +#define RSA_R_MODULUS_TOO_LARGE 105 #define RSA_R_NO_PUBLIC_EXPONENT 140 #define RSA_R_NULL_BEFORE_BLOCK_MISSING 113 #define RSA_R_N_DOES_NOT_EQUAL_P_Q 127 #define RSA_R_OAEP_DECODING_ERROR 121 #define RSA_R_SLEN_RECOVERY_FAILED 135 #define RSA_R_PADDING_CHECK_FAILED 114 -#define RSA_R_PKCS1_PADDING_TOO_SHORT 105 #define RSA_R_P_NOT_PRIME 128 #define RSA_R_Q_NOT_PRIME 129 #define RSA_R_RSA_OPERATIONS_NOT_SUPPORTED 130 diff --git a/usr/src/common/openssl/crypto/rsa/rsa_eay.c b/usr/src/common/openssl/crypto/rsa/rsa_eay.c index 306a1fea21..6a95ec953f 100644 --- a/usr/src/common/openssl/crypto/rsa/rsa_eay.c +++ b/usr/src/common/openssl/crypto/rsa/rsa_eay.c @@ -168,6 +168,28 @@ static int RSA_eay_public_encrypt(int flen, const unsigned char *from, unsigned char *buf=NULL; BN_CTX *ctx=NULL; + if (BN_num_bits(rsa->n) > OPENSSL_RSA_MAX_MODULUS_BITS) + { + RSAerr(RSA_F_RSA_EAY_PUBLIC_ENCRYPT, RSA_R_MODULUS_TOO_LARGE); + return -1; + } + + if (BN_ucmp(rsa->n, rsa->e) <= 0) + { + RSAerr(RSA_F_RSA_EAY_PUBLIC_ENCRYPT, RSA_R_BAD_E_VALUE); + return -1; + } + + /* for large moduli, enforce exponent limit */ + if (BN_num_bits(rsa->n) > OPENSSL_RSA_SMALL_MODULUS_BITS) + { + if (BN_num_bits(rsa->e) > OPENSSL_RSA_MAX_PUBEXP_BITS) + { + RSAerr(RSA_F_RSA_EAY_PUBLIC_ENCRYPT, RSA_R_BAD_E_VALUE); + return -1; + } + } + if ((ctx=BN_CTX_new()) == NULL) goto err; BN_CTX_start(ctx); f = BN_CTX_get(ctx); @@ -574,6 +596,28 @@ static int RSA_eay_public_decrypt(int flen, const unsigned char *from, unsigned char *buf=NULL; BN_CTX *ctx=NULL; + if (BN_num_bits(rsa->n) > OPENSSL_RSA_MAX_MODULUS_BITS) + { + RSAerr(RSA_F_RSA_EAY_PUBLIC_DECRYPT, RSA_R_MODULUS_TOO_LARGE); + return -1; + } + + if (BN_ucmp(rsa->n, rsa->e) <= 0) + { + RSAerr(RSA_F_RSA_EAY_PUBLIC_DECRYPT, RSA_R_BAD_E_VALUE); + return -1; + } + + /* for large moduli, enforce exponent limit */ + if (BN_num_bits(rsa->n) > OPENSSL_RSA_SMALL_MODULUS_BITS) + { + if (BN_num_bits(rsa->e) > OPENSSL_RSA_MAX_PUBEXP_BITS) + { + RSAerr(RSA_F_RSA_EAY_PUBLIC_DECRYPT, RSA_R_BAD_E_VALUE); + return -1; + } + } + if((ctx = BN_CTX_new()) == NULL) goto err; BN_CTX_start(ctx); f = BN_CTX_get(ctx); @@ -617,15 +661,6 @@ static int RSA_eay_public_decrypt(int flen, const unsigned char *from, { case RSA_PKCS1_PADDING: r=RSA_padding_check_PKCS1_type_1(to,num,buf,i,num); - /* Generally signatures should be at least 2/3 padding, though - this isn't possible for really short keys and some standard - signature schemes, so don't check if the unpadded data is - small. */ - if(r > 42 && 3*8*r >= BN_num_bits(rsa->n)) - { - RSAerr(RSA_F_RSA_EAY_PUBLIC_DECRYPT, RSA_R_PKCS1_PADDING_TOO_SHORT); - goto err; - } break; case RSA_X931_PADDING: r=RSA_padding_check_X931(to,num,buf,i,num); diff --git a/usr/src/common/openssl/crypto/rsa/rsa_err.c b/usr/src/common/openssl/crypto/rsa/rsa_err.c index dfb0816c8a..2afc9cf73f 100644 --- a/usr/src/common/openssl/crypto/rsa/rsa_err.c +++ b/usr/src/common/openssl/crypto/rsa/rsa_err.c @@ -137,13 +137,13 @@ static ERR_STRING_DATA RSA_str_reasons[]= {ERR_REASON(RSA_R_IQMP_NOT_INVERSE_OF_Q) ,"iqmp not inverse of q"}, {ERR_REASON(RSA_R_KEY_SIZE_TOO_SMALL) ,"key size too small"}, {ERR_REASON(RSA_R_LAST_OCTET_INVALID) ,"last octet invalid"}, +{ERR_REASON(RSA_R_MODULUS_TOO_LARGE) ,"modulus too large"}, {ERR_REASON(RSA_R_NO_PUBLIC_EXPONENT) ,"no public exponent"}, {ERR_REASON(RSA_R_NULL_BEFORE_BLOCK_MISSING),"null before block missing"}, {ERR_REASON(RSA_R_N_DOES_NOT_EQUAL_P_Q) ,"n does not equal p q"}, {ERR_REASON(RSA_R_OAEP_DECODING_ERROR) ,"oaep decoding error"}, {ERR_REASON(RSA_R_SLEN_RECOVERY_FAILED) ,"salt length recovery failed"}, {ERR_REASON(RSA_R_PADDING_CHECK_FAILED) ,"padding check failed"}, -{ERR_REASON(RSA_R_PKCS1_PADDING_TOO_SHORT),"pkcs1 padding too short"}, {ERR_REASON(RSA_R_P_NOT_PRIME) ,"p not prime"}, {ERR_REASON(RSA_R_Q_NOT_PRIME) ,"q not prime"}, {ERR_REASON(RSA_R_RSA_OPERATIONS_NOT_SUPPORTED),"rsa operations not supported"}, |