1 /* PR target/53886  */
2 typedef struct asn1_string_st ASN1_BIT_STRING;
3 typedef struct bignum_st BIGNUM;
4 typedef struct ec_group_st EC_GROUP;
5 typedef struct ec_key_st EC_KEY;
6 
7 struct ec_key_st
8 {
9   EC_GROUP *group;
10   BIGNUM *priv_key;
11   unsigned int enc_flag;
12 }
13 X9_62_PENTANOMIAL;
14 typedef struct ec_privatekey_st
15 {
16   ASN1_BIT_STRING *publicKey;
17 }
18 EC_PRIVATEKEY;
19 
20 extern EC_PRIVATEKEY* EC_PRIVATEKEY_new (void);
21 extern void EC_PRIVATEKEY_free (EC_PRIVATEKEY*);
22 extern unsigned char* CRYPTO_realloc (char*,int,const char*,int);
23 
24 int
i2d_ECPrivateKey(EC_KEY * a,unsigned char ** out)25 i2d_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;
62 err:
63   if (buffer)
64     CRYPTO_free (buffer);
65   if (priv_key)
66     EC_PRIVATEKEY_free (priv_key);
67   return (ok ? ret : 0);
68 }
69