@@ -34,41 +34,6 @@ int ecc_export_openssl(unsigned char *out, unsigned long *outlen, int type, cons
3434
3535 if (key -> type != PK_PRIVATE && flag_pri ) return CRYPT_PK_TYPE_MISMATCH ;
3636
37- prime = key -> dp .prime ;
38- order = key -> dp .order ;
39- b = key -> dp .B ;
40- a = key -> dp .A ;
41- gx = key -> dp .base .x ;
42- gy = key -> dp .base .y ;
43-
44- /* curve param a */
45- len_a = mp_unsigned_bin_size (a );
46- if (len_a > sizeof (bin_a )) { err = CRYPT_BUFFER_OVERFLOW ; goto error ; }
47- if ((err = mp_to_unsigned_bin (a , bin_a )) != CRYPT_OK ) { goto error ; }
48- if (len_a == 0 ) { len_a = 1 ; bin_a [0 ] = 0 ; } /* handle case a == 0 */
49-
50- /* curve param b */
51- len_b = mp_unsigned_bin_size (b );
52- if (len_b > sizeof (bin_b )) { err = CRYPT_BUFFER_OVERFLOW ; goto error ; }
53- if ((err = mp_to_unsigned_bin (b , bin_b )) != CRYPT_OK ) { goto error ; }
54- if (len_b == 0 ) { len_b = 1 ; bin_b [0 ] = 0 ; } /* handle case b == 0 */
55-
56- /* base point - (un)compressed based on flag_com */
57- len_g = sizeof (bin_g );
58- err = ltc_ecc_export_point (bin_g , & len_g , gx , gy , key -> dp .size , flag_com );
59- if (err != CRYPT_OK ) { goto error ; }
60-
61- /* public key - (un)compressed based on flag_com */
62- len_xy = sizeof (bin_xy );
63- err = ltc_ecc_export_point (bin_xy , & len_xy , key -> pubkey .x , key -> pubkey .y , key -> dp .size , flag_com );
64- if (err != CRYPT_OK ) { goto error ; }
65-
66- /* co-factor */
67- cofactor = key -> dp .cofactor ;
68-
69- /* we support only prime-field EC */
70- if ((err = pk_get_oid (PKA_EC_PRIMEF , & OID )) != CRYPT_OK ) { goto error ; }
71-
7237 if (flag_oid ) {
7338 /* http://tools.ietf.org/html/rfc5912
7439 ECParameters ::= CHOICE {
@@ -79,6 +44,34 @@ int ecc_export_openssl(unsigned char *out, unsigned long *outlen, int type, cons
7944 LTC_SET_ASN1 (& ecparams , 0 , LTC_ASN1_OBJECT_IDENTIFIER , key -> dp .oid , key -> dp .oidlen );
8045 }
8146 else {
47+ prime = key -> dp .prime ;
48+ order = key -> dp .order ;
49+ a = key -> dp .A ;
50+ b = key -> dp .B ;
51+ gx = key -> dp .base .x ;
52+ gy = key -> dp .base .y ;
53+ cofactor = key -> dp .cofactor ;
54+
55+ /* curve param a */
56+ len_a = mp_unsigned_bin_size (a );
57+ if (len_a > sizeof (bin_a )) { err = CRYPT_BUFFER_OVERFLOW ; goto error ; }
58+ if ((err = mp_to_unsigned_bin (a , bin_a )) != CRYPT_OK ) { goto error ; }
59+ if (len_a == 0 ) { len_a = 1 ; bin_a [0 ] = 0 ; } /* handle case a == 0 */
60+
61+ /* curve param b */
62+ len_b = mp_unsigned_bin_size (b );
63+ if (len_b > sizeof (bin_b )) { err = CRYPT_BUFFER_OVERFLOW ; goto error ; }
64+ if ((err = mp_to_unsigned_bin (b , bin_b )) != CRYPT_OK ) { goto error ; }
65+ if (len_b == 0 ) { len_b = 1 ; bin_b [0 ] = 0 ; } /* handle case b == 0 */
66+
67+ /* base point - (un)compressed based on flag_com */
68+ len_g = sizeof (bin_g );
69+ err = ltc_ecc_export_point (bin_g , & len_g , gx , gy , key -> dp .size , flag_com );
70+ if (err != CRYPT_OK ) { goto error ; }
71+
72+ /* we support only prime-field EC */
73+ if ((err = pk_get_oid (PKA_EC_PRIMEF , & OID )) != CRYPT_OK ) { goto error ; }
74+
8275 /* http://tools.ietf.org/html/rfc3279
8376 ECParameters ::= SEQUENCE { # SEQUENCE
8477 version INTEGER { ecpVer1(1) } (ecpVer1) # INTEGER :01
@@ -122,7 +115,15 @@ int ecc_export_openssl(unsigned char *out, unsigned long *outlen, int type, cons
122115 LTC_SET_ASN1 (& ecparams , 0 , LTC_ASN1_SEQUENCE , seq_ecparams , 6UL );
123116 }
124117
118+ /* public key - (un)compressed based on flag_com */
119+ len_xy = sizeof (bin_xy );
120+ err = ltc_ecc_export_point (bin_xy , & len_xy , key -> pubkey .x , key -> pubkey .y , key -> dp .size , flag_com );
121+ if (err != CRYPT_OK ) {
122+ goto error ;
123+ }
124+
125125 if (flag_pri ) {
126+
126127 /* http://tools.ietf.org/html/rfc5915
127128 ECPrivateKey ::= SEQUENCE { # SEQUENCE
128129 version INTEGER { ecPrivkeyVer1(1) } (ecPrivkeyVer1) # INTEGER :01
0 commit comments