1/* PR target/53886 */ 2typedef struct asn1_string_st ASN1_BIT_STRING; 3typedef struct bignum_st BIGNUM; 4typedef struct ec_group_st EC_GROUP; 5typedef struct ec_key_st EC_KEY; 6 7struct ec_key_st 8{ 9 EC_GROUP *group; 10 BIGNUM *priv_key; 11 unsigned int enc_flag; 12} 13X9_62_PENTANOMIAL; 14typedef struct ec_privatekey_st 15{ 16 ASN1_BIT_STRING *publicKey; 17} 18EC_PRIVATEKEY; 19 20extern EC_PRIVATEKEY* EC_PRIVATEKEY_new (void); 21extern void EC_PRIVATEKEY_free (EC_PRIVATEKEY*); 22extern unsigned char* CRYPTO_realloc (char*,int,const char*,int); 23 24int 25i2d_ECPrivateKey (EC_KEY * a, unsigned char **out) 26{ 27 int ret = 0, ok = 0; 28 unsigned char *buffer = 0; 29 unsigned buf_len = 0, tmp_len; 30 EC_PRIVATEKEY *priv_key = 0; 31 if (a == 0 || a->group == 0 || a->priv_key == 0) 32 { 33 ERR_put_error (16, (192), ((3 | 64)), 34 "", 35 1234); 36 goto err; 37 } 38 if ((priv_key = EC_PRIVATEKEY_new ()) == 0) 39 { 40 ERR_put_error (16, (192), ((1 | 64)), 41 "", 42 1241); 43 goto err; 44 } 45 if (!(a->enc_flag & 0x002)) 46 { 47 if (priv_key->publicKey == 0) 48 { 49 goto err; 50 } 51 if (tmp_len > buf_len) 52 { 53 unsigned char *tmp_buffer = 54 CRYPTO_realloc ((char *) buffer, (int) tmp_len, "", 1293); 55 buffer = tmp_buffer; 56 } 57 } 58 if ((ret = i2d_EC_PRIVATEKEY (priv_key, out)) == 0) 59 { 60 } 61 ok = 1; 62err: 63 if (buffer) 64 CRYPTO_free (buffer); 65 if (priv_key) 66 EC_PRIVATEKEY_free (priv_key); 67 return (ok ? ret : 0); 68} 69