@@ -31,31 +31,21 @@ int cmd_keypair_gen() {
31
31
}
32
32
int ret = 0 ;
33
33
34
- uint16_t tout = 0 ;
35
34
//sc_asn1_print_tags(apdu.data, apdu.nc);
36
- uint8_t * p = NULL ;
37
35
//DEBUG_DATA(apdu.data,apdu.nc);
38
- if ( asn1_find_tag ( apdu . data , ( uint16_t ) apdu . nc , 0x7f49 , & tout , & p ) && tout > 0 && p != NULL ) {
39
- uint16_t oid_len = 0 ;
40
- uint8_t * oid = NULL ;
41
- if ( asn1_find_tag ( p , tout , 0x6 , & oid_len , & oid ) && oid_len > 0 && oid != NULL ) {
42
- if (memcmp ( oid , OID_ID_TA_RSA_V1_5_SHA_256 , oid_len ) == 0 ) { //RSA
43
- uint16_t ex_len = 3 , ks_len = 2 ;
44
- uint8_t * ex = NULL , * ks = NULL ;
36
+ asn1_ctx_t ctxi , ctxo = { 0 };
37
+ asn1_ctx_init ( apdu . data , ( uint16_t ) apdu . nc , & ctxi ) ;
38
+ if ( asn1_find_tag ( & ctxi , 0x7f49 , & ctxo ) && asn1_len ( & ctxo ) > 0 ) {
39
+ asn1_ctx_t oid = { 0 };
40
+ if (asn1_find_tag ( & ctxo , 0x6 , & oid ) && asn1_len ( & oid ) > 0 ) {
41
+ if ( memcmp ( oid . data , OID_ID_TA_RSA_V1_5_SHA_256 , oid . len ) == 0 ) { //RSA
42
+ asn1_ctx_t ex = { 0 }, ks = { 0 } ;
45
43
uint32_t exponent = 65537 , key_size = 2048 ;
46
- if (asn1_find_tag (p , tout , 0x82 , & ex_len , & ex ) && ex_len > 0 && ex != NULL ) {
47
- uint8_t * dt = ex ;
48
- exponent = 0 ;
49
- for (uint16_t i = 0 ; i < ex_len ; i ++ ) {
50
- exponent = (exponent << 8 ) | * dt ++ ;
51
- }
44
+ if (asn1_find_tag (& ctxo , 0x82 , & ex ) && asn1_len (& ex ) > 0 ) {
45
+ exponent = asn1_get_uint (& ex );
52
46
}
53
- if (asn1_find_tag (p , tout , 0x2 , & ks_len , & ks ) && ks_len > 0 && ks != NULL ) {
54
- uint8_t * dt = ks ;
55
- key_size = 0 ;
56
- for (uint16_t i = 0 ; i < ks_len ; i ++ ) {
57
- key_size = (key_size << 8 ) | * dt ++ ;
58
- }
47
+ if (asn1_find_tag (& ctxo , 0x2 , & ks ) && asn1_len (& ks ) > 0 ) {
48
+ key_size = asn1_get_uint (& ks );
59
49
}
60
50
printf ("KEYPAIR RSA %lu (%lx)\r\n" ,
61
51
(unsigned long ) key_size ,
@@ -79,13 +69,12 @@ int cmd_keypair_gen() {
79
69
}
80
70
mbedtls_rsa_free (& rsa );
81
71
}
82
- else if (memcmp (oid , OID_ID_TA_ECDSA_SHA_256 , MIN (oid_len , 10 )) == 0 ) { //ECC
83
- uint16_t prime_len ;
84
- uint8_t * prime = NULL ;
85
- if (asn1_find_tag (p , tout , 0x81 , & prime_len , & prime ) != true) {
72
+ else if (memcmp (oid .data , OID_ID_TA_ECDSA_SHA_256 , MIN (oid .len , 10 )) == 0 ) { //ECC
73
+ asn1_ctx_t prime = { 0 };
74
+ if (asn1_find_tag (& ctxo , 0x81 , & prime ) != true) {
86
75
return SW_WRONG_DATA ();
87
76
}
88
- mbedtls_ecp_group_id ec_id = ec_get_curve_from_prime (prime , prime_len );
77
+ mbedtls_ecp_group_id ec_id = ec_get_curve_from_prime (prime . data , prime . len );
89
78
printf ("KEYPAIR ECC %d\r\n" , ec_id );
90
79
if (ec_id == MBEDTLS_ECP_DP_NONE ) {
91
80
return SW_FUNC_NOT_SUPPORTED ();
@@ -98,30 +87,27 @@ int cmd_keypair_gen() {
98
87
mbedtls_ecdsa_free (& ecdsa );
99
88
return SW_EXEC_ERROR ();
100
89
}
101
- uint16_t l91 = 0 , ext_len = 0 ;
102
- uint8_t * p91 = NULL , * ext = NULL ;
103
- if (asn1_find_tag (apdu .data , (uint16_t )apdu .nc , 0x91 , & l91 , & p91 ) && p91 != NULL && l91 > 0 ) {
104
- for (size_t n = 0 ; n < l91 ; n ++ ) {
105
- if (p91 [n ] == ALGO_EC_DH_XKEK ) {
106
- uint16_t l92 = 0 ;
107
- uint8_t * p92 = NULL ;
108
- if (!asn1_find_tag (apdu .data , (uint16_t )apdu .nc , 0x92 , & l92 ,
109
- & p92 ) || p92 == NULL || l92 == 0 ) {
90
+ asn1_ctx_t a91 = { 0 }, ext = { 0 };
91
+ if (asn1_find_tag (& ctxi , 0x91 , & a91 ) && asn1_len (& a91 ) > 0 ) {
92
+ for (size_t n = 0 ; n < a91 .len ; n ++ ) {
93
+ if (a91 .data [n ] == ALGO_EC_DH_XKEK ) {
94
+ asn1_ctx_t a92 = {0 };
95
+ if (!asn1_find_tag (& ctxi , 0x92 , & a92 ) || asn1_len (& a92 ) == 0 ) {
110
96
return SW_WRONG_DATA ();
111
97
}
112
- if (p92 [0 ] > MAX_KEY_DOMAINS ) {
98
+ if (a92 . data [0 ] > MAX_KEY_DOMAINS ) {
113
99
return SW_WRONG_DATA ();
114
100
}
115
- file_t * tf_xkek = search_dynamic_file (EF_XKEK + p92 [0 ]);
101
+ file_t * tf_xkek = search_dynamic_file (EF_XKEK + a92 . data [0 ]);
116
102
if (!tf_xkek ) {
117
103
return SW_WRONG_DATA ();
118
104
}
119
- ext_len = 2 + 2 + (uint16_t )strlen (OID_ID_KEY_DOMAIN_UID ) + 2 + file_get_size (
105
+ ext . len = 2 + 2 + (uint16_t )strlen (OID_ID_KEY_DOMAIN_UID ) + 2 + file_get_size (
120
106
tf_xkek );
121
- ext = (uint8_t * ) calloc (1 , ext_len );
122
- uint8_t * pe = ext ;
107
+ ext . data = (uint8_t * ) calloc (1 , ext . len );
108
+ uint8_t * pe = ext . data ;
123
109
* pe ++ = 0x73 ;
124
- * pe ++ = (uint8_t )ext_len - 2 ;
110
+ * pe ++ = (uint8_t )ext . len - 2 ;
125
111
* pe ++ = 0x6 ;
126
112
* pe ++ = (uint8_t )strlen (OID_ID_KEY_DOMAIN_UID );
127
113
memcpy (pe , OID_ID_KEY_DOMAIN_UID , strlen (OID_ID_KEY_DOMAIN_UID ));
@@ -133,15 +119,15 @@ int cmd_keypair_gen() {
133
119
}
134
120
}
135
121
if ((res_APDU_size =
136
- (uint16_t )asn1_cvc_aut (& ecdsa , PICO_KEYS_KEY_EC , res_APDU , 4096 , ext , ext_len )) == 0 ) {
137
- if (ext ) {
138
- free (ext );
122
+ (uint16_t )asn1_cvc_aut (& ecdsa , PICO_KEYS_KEY_EC , res_APDU , 4096 , ext . data , ext . len )) == 0 ) {
123
+ if (ext . data ) {
124
+ free (ext . data );
139
125
}
140
126
mbedtls_ecdsa_free (& ecdsa );
141
127
return SW_EXEC_ERROR ();
142
128
}
143
- if (ext ) {
144
- free (ext );
129
+ if (ext . data ) {
130
+ free (ext . data );
145
131
}
146
132
ret = store_keys (& ecdsa , PICO_KEYS_KEY_EC , key_id );
147
133
mbedtls_ecdsa_free (& ecdsa );
0 commit comments