Skip to content

Commit 9db378c

Browse files
committed
refactor TAG_ALGORITHM_INFORMATION of openpgp
1 parent ab420c4 commit 9db378c

File tree

1 file changed

+65
-41
lines changed

1 file changed

+65
-41
lines changed

applets/openpgp/openpgp.c

Lines changed: 65 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,68 @@ static int UIF_TO_TOUCH_POLICY[3] = {[UIF_DISABLED] = TOUCH_POLICY_DEFAULT,
182182
[UIF_ENABLED] = TOUCH_POLICY_CACHED,
183183
[UIF_PERMANENTLY] = TOUCH_POLICY_PERMANENT};
184184

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+
185247
void openpgp_poweroff(void) {
186248
pw1_mode = 0;
187249
pw1.is_validated = 0;
@@ -526,47 +588,9 @@ static int openpgp_get_data(const CAPDU *capdu, RAPDU *rapdu) {
526588
break;
527589

528590
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;
570594
break;
571595

572596
case TAG_UIF_CACHE_TIME:

0 commit comments

Comments
 (0)