int i2d_DHparams(DH *dh, unsigned char **pp) { DHParameter data; size_t size; int ret; memset(&data, 0, sizeof(data)); if (bn2heim_int(dh->p, &data.prime) || bn2heim_int(dh->g, &data.base)) { free_DHParameter(&data); return -1; } if (pp == NULL) { size = length_DHParameter(&data); free_DHParameter(&data); } else { void *p; size_t len; ASN1_MALLOC_ENCODE(DHParameter, p, len, &data, &size, ret); free_DHParameter(&data); if (ret) return -1; if (len != size) { abort(); return -1; } memcpy(*pp, p, size); free(p); *pp += size; } return size; }
int i2d_RSAPrivateKey(RSA *rsa, unsigned char **pp) { RSAPrivateKey data; size_t size; int ret; if (rsa->n == NULL || rsa->e == NULL || rsa->d == NULL || rsa->p == NULL || rsa->q == NULL || rsa->dmp1 == NULL || rsa->dmq1 == NULL || rsa->iqmp == NULL) return -1; 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); ret |= bn2heim_int(rsa->iqmp, &data.coefficient); 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) { RSAPublicKey data; size_t size; int ret; memset(&data, 0, sizeof(data)); if (bn2heim_int(rsa->n, &data.modulus) || bn2heim_int(rsa->e, &data.publicExponent)) { free_RSAPublicKey(&data); return -1; } if (pp == NULL) { size = length_RSAPublicKey(&data); free_RSAPublicKey(&data); } else { void *p; size_t len; ASN1_MALLOC_ENCODE(RSAPublicKey, p, len, &data, &size, ret); free_RSAPublicKey(&data); if (ret) return -1; if (len != size) abort(); memcpy(*pp, p, size); free(p); *pp += size; } return size; }