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