diff --git a/lib/des/rsa.c b/lib/des/rsa.c index aa4bbd6bf..496d8a8f2 100644 --- a/lib/des/rsa.c +++ b/lib/des/rsa.c @@ -379,6 +379,50 @@ d2i_RSAPrivateKey(RSA *rsa, const unsigned char **pp, size_t len) return k; } +int +i2d_RSAPrivateKey(RSA *rsa, unsigned char **pp) +{ + RSAPrivateKey data; + size_t size; + int ret; + + memset(&data, 0, sizeof(data)); + + ret = bn2heim_int(rsa->n, &data.modulus) + ret |= bn2heim_int(rsa->e, &data.publicExponent); + ret |= bn2heim_int(rsa->d, &data.privateExponent); + ret |= bn2heim_int(rsa->p, &data.prime1); + ret |= bn2heim_int(rsa->q, &data.prime2); + ret |= bn2heim_int(rsa->dmp1, &data.exponent1); + ret |= bn2heim_int(rsa->dmq1, &data.exponent2); + if (ret) { + free_RSAPrivateKey(&data); + return -1; + } + + if (pp == NULL) { + size = length_RSAPrivateKey(&data); + free_RSAPrivateKey(&data); + } else { + void *p; + size_t len; + + ASN1_MALLOC_ENCODE(RSAPrivateKey, p, len, &data, &size, ret); + free_RSAPrivateKey(&data); + if (ret) + return -1; + if (len != size) + abort(); + + memcpy(*pp, p, size); + free(p); + + *pp += size; + + } + return size; +} + int i2d_RSAPublicKey(RSA *rsa, unsigned char **pp) { diff --git a/lib/des/rsa.h b/lib/des/rsa.h index 58f8b8759..afc9818ce 100644 --- a/lib/des/rsa.h +++ b/lib/des/rsa.h @@ -61,6 +61,7 @@ #define RSA_verify hc_RSA_verify #define RSA_generate_key_ex hc_RSA_generate_key_ex #define d2i_RSAPrivateKey hc_d2i_RSAPrivateKey +#define i2d_RSAPrivateKey hc_i2d_RSAPrivateKey #define i2d_RSAPublicKey hc_i2d_RSAPublicKey /* @@ -167,6 +168,8 @@ int RSA_verify(int, const unsigned char *, unsigned int, int RSA_generate_key_ex(RSA *, int, BIGNUM *, BN_GENCB *); RSA * d2i_RSAPrivateKey(RSA *, const unsigned char **, size_t); +int i2d_RSAPrivateKey(RSA *, unsigned char **); + int i2d_RSAPublicKey(RSA *, unsigned char **); #endif /* _HEIM_RSA_H */