111
|
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
|
|
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 }
|