52
52
#include "config.h"
53
53
#include "opendkim-config.h"
54
54
#include "opendkim-crypto.h"
55
+ #include "opendkim-const.h"
55
56
56
57
/* macros */
57
58
#define CMDLINEOPTS "d:k:s:vx:"
@@ -236,6 +237,8 @@ main(int argc, char **argv)
236
237
char domain [BUFRSZ ];
237
238
char selector [BUFRSZ ];
238
239
char keypath [MAXBUFRSZ ];
240
+ char signalgstr [BUFRSZ ];
241
+ dkim_alg_t signalg ;
239
242
240
243
progname = (p = strrchr (argv [0 ], '/' )) == NULL ? argv [0 ] : p + 1 ;
241
244
@@ -464,7 +467,7 @@ main(int argc, char **argv)
464
467
size_t keylen ;
465
468
DKIMF_DB db ;
466
469
char keyname [BUFRSZ + 1 ];
467
- struct dkimf_db_data dbd [3 ];
470
+ struct dkimf_db_data dbd [4 ];
468
471
469
472
memset (dbd , '\0' , sizeof dbd );
470
473
@@ -491,18 +494,22 @@ main(int argc, char **argv)
491
494
memset (domain , '\0' , sizeof domain );
492
495
memset (selector , '\0' , sizeof selector );
493
496
memset (keypath , '\0' , sizeof keypath );
497
+ memset (signalgstr , '\0' , sizeof signalgstr );
494
498
495
499
dbd [0 ].dbdata_buffer = domain ;
496
500
dbd [0 ].dbdata_buflen = sizeof domain ;
497
501
dbd [1 ].dbdata_buffer = selector ;
498
502
dbd [1 ].dbdata_buflen = sizeof selector ;
499
503
dbd [2 ].dbdata_buffer = keypath ;
500
504
dbd [2 ].dbdata_buflen = sizeof keypath ;
505
+ dbd [3 ].dbdata_buffer = signalgstr ;
506
+ dbd [3 ].dbdata_buflen = sizeof signalgstr ;
507
+ dbd [3 ].dbdata_flags = DKIMF_DB_DATA_OPTIONAL ;
501
508
502
509
keylen = sizeof keyname ;
503
510
504
511
status = dkimf_db_walk (db , c == 0 , keyname , & keylen ,
505
- dbd , 3 );
512
+ dbd , 4 );
506
513
if (status == -1 )
507
514
{
508
515
fprintf (stderr ,
@@ -524,6 +531,26 @@ main(int argc, char **argv)
524
531
progname , c , keyname );
525
532
}
526
533
534
+ if (signalgstr [0 ] != '\0' )
535
+ {
536
+ signalg = dkimf_lookup_strtoint (signalgstr , dkimf_sign );
537
+ if (signalg == -1 )
538
+ {
539
+ fprintf (stderr ,
540
+ "%s: unknown sign algorithm "
541
+ "'%s' for key '%s'\n" ,
542
+ progname , signalgstr , keyname );
543
+ return 1 ;
544
+ }
545
+
546
+ if (verbose > 1 )
547
+ {
548
+ fprintf (stderr ,
549
+ "%s: key '%s': sign algorithm is '%s'\n" ,
550
+ progname , keyname , signalgstr );
551
+ }
552
+ }
553
+
527
554
if (keypath [0 ] == '/' ||
528
555
strncmp (keypath , "./" , 2 ) == 0 ||
529
556
strncmp (keypath , "../" , 3 ) == 0 )
@@ -572,6 +599,9 @@ main(int argc, char **argv)
572
599
progname , keyname );
573
600
}
574
601
602
+ /* To do: check consistency of the key and algorithm.
603
+ It is needed to extend dkim_test_key() for it */
604
+
575
605
dnssec = DKIM_DNSSEC_UNKNOWN ;
576
606
577
607
status = dkim_test_key (lib , selector , domain ,
0 commit comments