34
34
35
35
#if defined(WOLFSSL_ASN_PRINT ) && !defined(NO_FILESYSTEM )
36
36
37
+ #include "oid_names.h"
38
+
37
39
/* Increment allocated data by this much. */
38
40
#define DATA_INC_LEN 256
39
41
@@ -50,6 +52,20 @@ static Asn1PrintOptions opts;
50
52
/* ASN.1 parsing state. */
51
53
static Asn1 asn1 ;
52
54
55
+ static const char * asn1App_OidToName (unsigned char * oid , word32 len )
56
+ {
57
+ int i ;
58
+
59
+ for (i = 0 ; i < asn1App_oid_names_len ; i ++ ) {
60
+ if ((len == asn1App_oid_name [i ].len ) &&
61
+ (XMEMCMP (oid , asn1App_oid_name [i ].oid , len ) == 0 )) {
62
+ return asn1App_oid_name [i ].name ;
63
+ }
64
+ }
65
+
66
+ return NULL ;
67
+ }
68
+
53
69
/* Read the contents of a file into a dynamically allocated buffer.
54
70
*
55
71
* Uses realloc as input may be stdin.
@@ -65,9 +81,10 @@ static int asn1App_ReadFile(FILE* fp, unsigned char** pdata, word32* plen)
65
81
int ret = 0 ;
66
82
word32 len = 0 ;
67
83
size_t read_len ;
68
- /* Allocate a minimum amount. */
69
- unsigned char * data = (unsigned char * )XMALLOC (DATA_INC_LEN , NULL , DYNAMIC_TYPE_TMP_BUFFER );
84
+ unsigned char * data ;
70
85
86
+ /* Allocate a minimum amount. */
87
+ data = (unsigned char * )XMALLOC (DATA_INC_LEN , NULL , DYNAMIC_TYPE_TMP_BUFFER );
71
88
if (data != NULL ) {
72
89
/* Read more data. */
73
90
while ((read_len = fread (data + len , 1 , DATA_INC_LEN , fp )) != 0 ) {
@@ -87,7 +104,8 @@ static int asn1App_ReadFile(FILE* fp, unsigned char** pdata, word32* plen)
87
104
}
88
105
89
106
/* Make space for more data to be added to buffer. */
90
- p = (unsigned char * )XREALLOC (data , len + DATA_INC_LEN , NULL , DYNAMIC_TYPE_TMP_BUFFER );
107
+ p = (unsigned char * )XREALLOC (data , len + DATA_INC_LEN , NULL ,
108
+ DYNAMIC_TYPE_TMP_BUFFER );
91
109
if (p == NULL ) {
92
110
/* Reallocation failed - free current buffer. */
93
111
XFREE (data , NULL , DYNAMIC_TYPE_TMP_BUFFER );
@@ -299,6 +317,7 @@ const char* usage[] = {
299
317
" -B, --base64 file contents are Base64 encoded" ,
300
318
#endif
301
319
" -d, --dump show all ASN.1 item data as a hex dump" ,
320
+ " -D, --der file format is DER" ,
302
321
" -h, --headers show all ASN.1 item headers as a hex dump" ,
303
322
" -i, --indent indent tag name with depth" ,
304
323
" -l, --length LEN display length bytes of data" ,
@@ -340,6 +359,7 @@ int main(int argc, char* argv[])
340
359
int file_format = FORMAT_DER ;
341
360
word32 indent = 0 ;
342
361
int pem_skip = 0 ;
362
+ int format_set = 0 ;
343
363
344
364
/* Reset options. */
345
365
(void )wc_Asn1PrintOptions_Init (& opts );
@@ -365,6 +385,11 @@ int main(int argc, char* argv[])
365
385
(strcmp (argv [0 ], "--dump" ) == 0 )) {
366
386
wc_Asn1PrintOptions_Set (& opts , ASN1_PRINT_OPT_SHOW_DATA , 1 );
367
387
}
388
+ else if ((strcmp (argv [0 ], "- D ") == 0) ||
389
+ (strcmp (argv [0 ], "--der" ) == 0 )) {
390
+ file_format = FORMAT_DER ;
391
+ format_set = 1 ;
392
+ }
368
393
/* Dump ASN.1 item headers. */
369
394
else if ((strcmp (argv [0 ], "- h ") == 0) ||
370
395
(strcmp (argv [0 ], "--headers" ) == 0 )) {
@@ -421,6 +446,7 @@ int main(int argc, char* argv[])
421
446
else if ((strcmp (argv [0 ], "- p ") == 0) ||
422
447
(strcmp (argv [0 ], "--pem" ) == 0 )) {
423
448
file_format = FORMAT_PEM ;
449
+ format_set = 1 ;
424
450
}
425
451
#endif
426
452
/* Skip a number of PEM blocks. */
@@ -451,10 +477,25 @@ int main(int argc, char* argv[])
451
477
return 1 ;
452
478
}
453
479
else {
480
+ int nameLen ;
481
+
454
482
if (fp != stdin ) {
455
483
fprintf (stderr , "At most one input file can be supplied.\n" );
456
484
return 1 ;
457
485
}
486
+
487
+ if (!format_set ) {
488
+ nameLen = (int )XSTRLEN (argv [0 ]);
489
+ if (nameLen > 3 ) {
490
+ if (XMEMCMP (argv [0 ] + nameLen - 4 , ".pem" , 4 ) == 0 ) {
491
+ file_format = FORMAT_PEM ;
492
+ }
493
+ else if (XMEMCMP (argv [0 ] + nameLen - 4 , ".der" , 4 ) == 0 ) {
494
+ file_format = FORMAT_DER ;
495
+ }
496
+ }
497
+ }
498
+
458
499
/* Name of file to read. */
459
500
fp = fopen (argv [0 ], "r" );
460
501
if (fp == NULL ) {
@@ -472,6 +513,7 @@ int main(int argc, char* argv[])
472
513
473
514
(void )wc_Asn1_Init (& asn1 );
474
515
(void )wc_Asn1_SetFile (& asn1 , stdout );
516
+ (void )wc_Asn1_SetOidToNameCb (& asn1 , asn1App_OidToName );
475
517
476
518
/* Process file based on type. */
477
519
if (file_format == FORMAT_DER ) {
0 commit comments