| /* PR target/53886 */ |
| typedef struct asn1_string_st ASN1_BIT_STRING; |
| typedef struct bignum_st BIGNUM; |
| typedef struct ec_group_st EC_GROUP; |
| typedef struct ec_key_st EC_KEY; |
| |
| struct ec_key_st |
| { |
| EC_GROUP *group; |
| BIGNUM *priv_key; |
| unsigned int enc_flag; |
| } |
| X9_62_PENTANOMIAL; |
| typedef struct ec_privatekey_st |
| { |
| ASN1_BIT_STRING *publicKey; |
| } |
| EC_PRIVATEKEY; |
| |
| extern EC_PRIVATEKEY* EC_PRIVATEKEY_new (void); |
| extern void EC_PRIVATEKEY_free (EC_PRIVATEKEY*); |
| extern unsigned char* CRYPTO_realloc (char*,int,const char*,int); |
| |
| int |
| i2d_ECPrivateKey (EC_KEY * a, unsigned char **out) |
| { |
| int ret = 0, ok = 0; |
| unsigned char *buffer = 0; |
| unsigned buf_len = 0, tmp_len; |
| EC_PRIVATEKEY *priv_key = 0; |
| if (a == 0 || a->group == 0 || a->priv_key == 0) |
| { |
| ERR_put_error (16, (192), ((3 | 64)), |
| "", |
| 1234); |
| goto err; |
| } |
| if ((priv_key = EC_PRIVATEKEY_new ()) == 0) |
| { |
| ERR_put_error (16, (192), ((1 | 64)), |
| "", |
| 1241); |
| goto err; |
| } |
| if (!(a->enc_flag & 0x002)) |
| { |
| if (priv_key->publicKey == 0) |
| { |
| goto err; |
| } |
| if (tmp_len > buf_len) |
| { |
| unsigned char *tmp_buffer = |
| CRYPTO_realloc ((char *) buffer, (int) tmp_len, "", 1293); |
| buffer = tmp_buffer; |
| } |
| } |
| if ((ret = i2d_EC_PRIVATEKEY (priv_key, out)) == 0) |
| { |
| } |
| ok = 1; |
| err: |
| if (buffer) |
| CRYPTO_free (buffer); |
| if (priv_key) |
| EC_PRIVATEKEY_free (priv_key); |
| return (ok ? ret : 0); |
| } |