ECC export/import of EC PUBLIC keys should be compatible with rfc5480 and openssl
Karel Miko
10 years ago
80 | 80 | int ecc_import_full(const unsigned char *in, unsigned long inlen, ecc_key *key, ltc_ecc_set_type *dp) |
81 | 81 | { |
82 | 82 | void *prime, *order, *a, *b, *gx, *gy; |
83 | ltc_asn1_list seq_fieldid[3], seq_curve[3], seq_ecparams[7], seq_priv[5]; | |
84 | unsigned char bin_a[ECC_MAXSIZE], bin_b[ECC_MAXSIZE], bin_k[ECC_MAXSIZE], bin_g[2*ECC_MAXSIZE+1], bin_xy[2*ECC_MAXSIZE+2]; | |
83 | ltc_asn1_list seq_fieldid[2], seq_curve[3], seq_ecparams[6], seq_priv[4]; | |
84 | unsigned char bin_a[ECC_MAXSIZE], bin_b[ECC_MAXSIZE], bin_k[ECC_MAXSIZE], bin_g[2*ECC_MAXSIZE+1], bin_xy[2*ECC_MAXSIZE+2], bin_seed[128]; | |
85 | 85 | unsigned long len_a, len_b, len_k, len_g, len_xy; |
86 | 86 | unsigned long cofactor = 0, ecver = 0, pkver = 0, tmpoid[16]; |
87 | 87 | /*oid_st oid;*/ |
92 | 92 | /* ECParameters SEQUENCE */ |
93 | 93 | LTC_SET_ASN1(seq_ecparams, 0, LTC_ASN1_SHORT_INTEGER, &ecver, 1UL); |
94 | 94 | LTC_SET_ASN1(seq_ecparams, 1, LTC_ASN1_SEQUENCE, seq_fieldid, 2UL); |
95 | LTC_SET_ASN1(seq_ecparams, 2, LTC_ASN1_SEQUENCE, seq_curve, 2UL); | |
95 | LTC_SET_ASN1(seq_ecparams, 2, LTC_ASN1_SEQUENCE, seq_curve, 3UL); | |
96 | 96 | LTC_SET_ASN1(seq_ecparams, 3, LTC_ASN1_OCTET_STRING, bin_g, (unsigned long)2*ECC_MAXSIZE+1); |
97 | 97 | LTC_SET_ASN1(seq_ecparams, 4, LTC_ASN1_INTEGER, order, 1UL); |
98 | 98 | LTC_SET_ASN1(seq_ecparams, 5, LTC_ASN1_SHORT_INTEGER, &cofactor, 1UL); |
99 | seq_ecparams[5].optional = 1; | |
99 | 100 | /* FieldID SEQUENCE */ |
100 | 101 | LTC_SET_ASN1(seq_fieldid, 0, LTC_ASN1_OBJECT_IDENTIFIER, tmpoid, 16UL); |
101 | 102 | LTC_SET_ASN1(seq_fieldid, 1, LTC_ASN1_INTEGER, prime, 1UL); |
102 | 103 | /* Curve SEQUENCE */ |
103 | 104 | LTC_SET_ASN1(seq_curve, 0, LTC_ASN1_OCTET_STRING, bin_a, (unsigned long)ECC_MAXSIZE); |
104 | 105 | LTC_SET_ASN1(seq_curve, 1, LTC_ASN1_OCTET_STRING, bin_b, (unsigned long)ECC_MAXSIZE); |
106 | LTC_SET_ASN1(seq_curve, 2, LTC_ASN1_RAW_BIT_STRING, bin_seed, (unsigned long)8*128); | |
107 | seq_curve[2].optional = 1; | |
105 | 108 | |
106 | 109 | len_xy = sizeof(bin_xy); |
107 | 110 | /* try to load public key */ |
128 | 131 | /* ECParameters SEQUENCE */ |
129 | 132 | LTC_SET_ASN1(seq_ecparams, 0, LTC_ASN1_SHORT_INTEGER, &ecver, 1UL); |
130 | 133 | LTC_SET_ASN1(seq_ecparams, 1, LTC_ASN1_SEQUENCE, seq_fieldid, 2UL); |
131 | LTC_SET_ASN1(seq_ecparams, 2, LTC_ASN1_SEQUENCE, seq_curve, 2UL); | |
134 | LTC_SET_ASN1(seq_ecparams, 2, LTC_ASN1_SEQUENCE, seq_curve, 3UL); | |
132 | 135 | LTC_SET_ASN1(seq_ecparams, 3, LTC_ASN1_OCTET_STRING, bin_g, (unsigned long)2*ECC_MAXSIZE+1); |
133 | 136 | LTC_SET_ASN1(seq_ecparams, 4, LTC_ASN1_INTEGER, order, 1UL); |
134 | 137 | LTC_SET_ASN1(seq_ecparams, 5, LTC_ASN1_SHORT_INTEGER, &cofactor, 1UL); |
138 | seq_ecparams[5].optional = 1; | |
135 | 139 | /* FieldID SEQUENCE */ |
136 | 140 | LTC_SET_ASN1(seq_fieldid, 0, LTC_ASN1_OBJECT_IDENTIFIER, tmpoid, 16UL); |
137 | 141 | LTC_SET_ASN1(seq_fieldid, 1, LTC_ASN1_INTEGER, prime, 1UL); |
138 | 142 | /* Curve SEQUENCE */ |
139 | 143 | LTC_SET_ASN1(seq_curve, 0, LTC_ASN1_OCTET_STRING, bin_a, (unsigned long)ECC_MAXSIZE); |
140 | 144 | LTC_SET_ASN1(seq_curve, 1, LTC_ASN1_OCTET_STRING, bin_b, (unsigned long)ECC_MAXSIZE); |
145 | LTC_SET_ASN1(seq_curve, 2, LTC_ASN1_RAW_BIT_STRING, bin_seed, (unsigned long)8*128); | |
146 | seq_curve[2].optional = 1; | |
141 | 147 | |
142 | 148 | /* try to load private key */ |
143 | 149 | if ((err = der_decode_sequence(in, inlen, seq_priv, 3)) != CRYPT_OK) { goto error; } |