@@ -182,6 +182,68 @@ static int UIF_TO_TOUCH_POLICY[3] = {[UIF_DISABLED] = TOUCH_POLICY_DEFAULT,
182
182
[UIF_ENABLED ] = TOUCH_POLICY_CACHED ,
183
183
[UIF_PERMANENTLY ] = TOUCH_POLICY_PERMANENT };
184
184
185
+ // Algorithm information structure to reduce code size
186
+ typedef struct {
187
+ uint8_t tag ;
188
+ int algo_index ; // Algorithm index in algo_attr array
189
+ uint8_t id ;
190
+ } algo_info_t ;
191
+
192
+ // Add a single algorithm information to the buffer
193
+ static uint16_t add_algo_info (uint8_t * buffer , uint16_t offset , uint8_t tag , int algo_index , uint8_t id ) {
194
+ buffer [offset ++ ] = tag ;
195
+ const uint8_t * attr = algo_attr [algo_index ];
196
+ memcpy (buffer + offset , attr , attr [0 ] + 1 );
197
+ buffer [offset + 1 ] = id ;
198
+ return offset + attr [0 ] + 1 ;
199
+ }
200
+
201
+ // Add all supported algorithm information to the buffer
202
+ static uint16_t add_all_algorithm_info (uint8_t * buffer ) {
203
+ uint16_t offset = 0 ;
204
+
205
+ // Define a static array of all algorithm information to avoid duplicate code
206
+ static const algo_info_t all_algo_infos [] = {
207
+ // SIG algorithms
208
+ {TAG_ALGORITHM_ATTRIBUTES_SIG , RSA2048 , ALGO_ID_RSA },
209
+ {TAG_ALGORITHM_ATTRIBUTES_SIG , RSA3072 , ALGO_ID_RSA },
210
+ {TAG_ALGORITHM_ATTRIBUTES_SIG , RSA4096 , ALGO_ID_RSA },
211
+ {TAG_ALGORITHM_ATTRIBUTES_SIG , SECP256R1 , ALGO_ID_ECDSA },
212
+ {TAG_ALGORITHM_ATTRIBUTES_SIG , SECP256K1 , ALGO_ID_ECDSA },
213
+ {TAG_ALGORITHM_ATTRIBUTES_SIG , SECP384R1 , ALGO_ID_ECDSA },
214
+ {TAG_ALGORITHM_ATTRIBUTES_SIG , SECP521R1 , ALGO_ID_ECDSA },
215
+ {TAG_ALGORITHM_ATTRIBUTES_SIG , ED25519 , ALGO_ID_ED25519 },
216
+ {TAG_ALGORITHM_ATTRIBUTES_SIG , SM2 , ALGO_ID_ECDSA },
217
+ // DEC algorithms
218
+ {TAG_ALGORITHM_ATTRIBUTES_DEC , RSA2048 , ALGO_ID_RSA },
219
+ {TAG_ALGORITHM_ATTRIBUTES_DEC , RSA3072 , ALGO_ID_RSA },
220
+ {TAG_ALGORITHM_ATTRIBUTES_DEC , RSA4096 , ALGO_ID_RSA },
221
+ {TAG_ALGORITHM_ATTRIBUTES_DEC , SECP256R1 , ALGO_ID_ECDH },
222
+ {TAG_ALGORITHM_ATTRIBUTES_DEC , SECP256K1 , ALGO_ID_ECDH },
223
+ {TAG_ALGORITHM_ATTRIBUTES_DEC , SECP384R1 , ALGO_ID_ECDH },
224
+ {TAG_ALGORITHM_ATTRIBUTES_DEC , SECP521R1 , ALGO_ID_ECDH },
225
+ {TAG_ALGORITHM_ATTRIBUTES_DEC , X25519 , ALGO_ID_ECDH },
226
+ {TAG_ALGORITHM_ATTRIBUTES_DEC , SM2 , ALGO_ID_ECDH },
227
+ // AUT algorithms
228
+ {TAG_ALGORITHM_ATTRIBUTES_AUT , RSA2048 , ALGO_ID_RSA },
229
+ {TAG_ALGORITHM_ATTRIBUTES_AUT , RSA3072 , ALGO_ID_RSA },
230
+ {TAG_ALGORITHM_ATTRIBUTES_AUT , RSA4096 , ALGO_ID_RSA },
231
+ {TAG_ALGORITHM_ATTRIBUTES_AUT , SECP256R1 , ALGO_ID_ECDSA },
232
+ {TAG_ALGORITHM_ATTRIBUTES_AUT , SECP256K1 , ALGO_ID_ECDSA },
233
+ {TAG_ALGORITHM_ATTRIBUTES_AUT , SECP384R1 , ALGO_ID_ECDSA },
234
+ {TAG_ALGORITHM_ATTRIBUTES_AUT , SECP521R1 , ALGO_ID_ECDSA },
235
+ {TAG_ALGORITHM_ATTRIBUTES_AUT , ED25519 , ALGO_ID_ED25519 },
236
+ {TAG_ALGORITHM_ATTRIBUTES_AUT , SM2 , ALGO_ID_ECDSA },
237
+ };
238
+
239
+ // Use a loop to iterate through all algorithm information instead of repeated code blocks
240
+ for (size_t i = 0 ; i < sizeof (all_algo_infos ) / sizeof (algo_info_t ); i ++ ) {
241
+ offset = add_algo_info (buffer , offset , all_algo_infos [i ].tag , all_algo_infos [i ].algo_index , all_algo_infos [i ].id );
242
+ }
243
+
244
+ return offset ;
245
+ }
246
+
185
247
void openpgp_poweroff (void ) {
186
248
pw1_mode = 0 ;
187
249
pw1 .is_validated = 0 ;
@@ -526,47 +588,9 @@ static int openpgp_get_data(const CAPDU *capdu, RAPDU *rapdu) {
526
588
break ;
527
589
528
590
case TAG_ALGORITHM_INFORMATION :
529
- #define ALGO_INFO (tag , algo , id ) \
530
- do { \
531
- RDATA[off++] = tag; \
532
- const uint8_t *attr = algo_attr[algo]; \
533
- memcpy(RDATA + off, attr, attr[0] + 1); \
534
- RDATA[off + 1] = id; \
535
- off += attr[0] + 1; \
536
- } while (0)
537
-
538
- // SIG
539
- ALGO_INFO (TAG_ALGORITHM_ATTRIBUTES_SIG , RSA2048 , ALGO_ID_RSA );
540
- ALGO_INFO (TAG_ALGORITHM_ATTRIBUTES_SIG , RSA3072 , ALGO_ID_RSA );
541
- ALGO_INFO (TAG_ALGORITHM_ATTRIBUTES_SIG , RSA4096 , ALGO_ID_RSA );
542
- ALGO_INFO (TAG_ALGORITHM_ATTRIBUTES_SIG , SECP256R1 , ALGO_ID_ECDSA );
543
- ALGO_INFO (TAG_ALGORITHM_ATTRIBUTES_SIG , SECP256K1 , ALGO_ID_ECDSA );
544
- ALGO_INFO (TAG_ALGORITHM_ATTRIBUTES_SIG , SECP384R1 , ALGO_ID_ECDSA );
545
- ALGO_INFO (TAG_ALGORITHM_ATTRIBUTES_SIG , SECP521R1 , ALGO_ID_ECDSA );
546
- ALGO_INFO (TAG_ALGORITHM_ATTRIBUTES_SIG , ED25519 , ALGO_ID_ED25519 );
547
- ALGO_INFO (TAG_ALGORITHM_ATTRIBUTES_SIG , SM2 , ALGO_ID_ECDSA );
548
- // DEC
549
- ALGO_INFO (TAG_ALGORITHM_ATTRIBUTES_DEC , RSA2048 , ALGO_ID_RSA );
550
- ALGO_INFO (TAG_ALGORITHM_ATTRIBUTES_DEC , RSA3072 , ALGO_ID_RSA );
551
- ALGO_INFO (TAG_ALGORITHM_ATTRIBUTES_DEC , RSA4096 , ALGO_ID_RSA );
552
- ALGO_INFO (TAG_ALGORITHM_ATTRIBUTES_DEC , SECP256R1 , ALGO_ID_ECDH );
553
- ALGO_INFO (TAG_ALGORITHM_ATTRIBUTES_DEC , SECP256K1 , ALGO_ID_ECDH );
554
- ALGO_INFO (TAG_ALGORITHM_ATTRIBUTES_DEC , SECP384R1 , ALGO_ID_ECDH );
555
- ALGO_INFO (TAG_ALGORITHM_ATTRIBUTES_DEC , SECP521R1 , ALGO_ID_ECDH );
556
- ALGO_INFO (TAG_ALGORITHM_ATTRIBUTES_DEC , X25519 , ALGO_ID_ECDH );
557
- ALGO_INFO (TAG_ALGORITHM_ATTRIBUTES_DEC , SM2 , ALGO_ID_ECDH );
558
- // AUT
559
- ALGO_INFO (TAG_ALGORITHM_ATTRIBUTES_AUT , RSA2048 , ALGO_ID_RSA );
560
- ALGO_INFO (TAG_ALGORITHM_ATTRIBUTES_AUT , RSA3072 , ALGO_ID_RSA );
561
- ALGO_INFO (TAG_ALGORITHM_ATTRIBUTES_AUT , RSA4096 , ALGO_ID_RSA );
562
- ALGO_INFO (TAG_ALGORITHM_ATTRIBUTES_AUT , SECP256R1 , ALGO_ID_ECDSA );
563
- ALGO_INFO (TAG_ALGORITHM_ATTRIBUTES_AUT , SECP256K1 , ALGO_ID_ECDSA );
564
- ALGO_INFO (TAG_ALGORITHM_ATTRIBUTES_AUT , SECP384R1 , ALGO_ID_ECDSA );
565
- ALGO_INFO (TAG_ALGORITHM_ATTRIBUTES_AUT , SECP521R1 , ALGO_ID_ECDSA );
566
- ALGO_INFO (TAG_ALGORITHM_ATTRIBUTES_AUT , ED25519 , ALGO_ID_ED25519 );
567
- ALGO_INFO (TAG_ALGORITHM_ATTRIBUTES_AUT , SM2 , ALGO_ID_ECDSA );
568
-
569
- LL = off ;
591
+ RDATA [0 ] = TAG_ALGORITHM_INFORMATION ;
592
+ RDATA [1 ] = add_all_algorithm_info (RDATA + 2 );
593
+ LL = RDATA [1 ] + 2 ;
570
594
break ;
571
595
572
596
case TAG_UIF_CACHE_TIME :
0 commit comments