@@ -267,8 +267,8 @@ dkim_test_dns_get(DKIM *dkim, u_char *buf, size_t buflen)
267
267
}
268
268
269
269
/*
270
- ** DKIM_TEST_KEY -- retrieve a public key and verify it against a provided
271
- ** private key
270
+ ** DKIM_TEST_KEY2 -- retrieve a public key and verify it against a provided
271
+ ** private key
272
272
**
273
273
** Parameters:
274
274
** lib -- DKIM library handle
@@ -277,6 +277,7 @@ dkim_test_dns_get(DKIM *dkim, u_char *buf, size_t buflen)
277
277
** key -- private key to verify (PEM format)
278
278
** keylen -- size of private key
279
279
** dnssec -- DNSSEC result (may be NULL)
280
+ ** alg -- signing algorithm
280
281
** err -- error buffer (may be NULL)
281
282
** errlen -- size of error buffer
282
283
**
@@ -287,8 +288,9 @@ dkim_test_dns_get(DKIM *dkim, u_char *buf, size_t buflen)
287
288
*/
288
289
289
290
int
290
- dkim_test_key (DKIM_LIB * lib , char * selector , char * domain ,
291
- char * key , size_t keylen , int * dnssec , char * err , size_t errlen )
291
+ dkim_test_key2 (DKIM_LIB * lib , char * selector , char * domain ,
292
+ char * key , size_t keylen , dkim_alg_t alg ,
293
+ int * dnssec , char * err , size_t errlen )
292
294
{
293
295
int status = 0 ;
294
296
DKIM_STAT stat ;
@@ -300,10 +302,12 @@ dkim_test_key(DKIM_LIB *lib, char *selector, char *domain,
300
302
#else /* USE_GNUTLS */
301
303
BIO * keybuf ;
302
304
BIO * outkey ;
305
+ size_t outkey_len ;
303
306
#endif /* USE_GNUTLS */
304
307
void * ptr ;
305
308
struct dkim_crypto * crypto ;
306
309
char buf [BUFRSZ ];
310
+ const char * algstr ;
307
311
308
312
assert (lib != NULL );
309
313
assert (selector != NULL );
@@ -317,8 +321,10 @@ dkim_test_key(DKIM_LIB *lib, char *selector, char *domain,
317
321
return -1 ;
318
322
}
319
323
320
- snprintf (buf , sizeof buf , "v=1; d=%s; s=%s; h=x; b=x; a=x" ,
321
- domain , selector );
324
+ algstr = dkim_code_to_name (dkim_table_algorithms , alg );
325
+
326
+ snprintf (buf , sizeof buf , "v=1; d=%s; s=%s; h=x; b=x; a=%s" ,
327
+ domain , selector , algstr );
322
328
323
329
stat = dkim_process_set (dkim , DKIM_SETTYPE_SIGNATURE , (u_char * ) buf ,
324
330
strlen (buf ), NULL , FALSE, NULL );
@@ -408,7 +414,18 @@ dkim_test_key(DKIM_LIB *lib, char *selector, char *domain,
408
414
#endif /* USE_GNUTLS */
409
415
410
416
sig -> sig_signature = (void * ) crypto ;
411
- sig -> sig_keytype = DKIM_KEYTYPE_RSA ;
417
+ switch (alg )
418
+ {
419
+ case DKIM_SIGN_RSASHA1 :
420
+ case DKIM_SIGN_RSASHA256 :
421
+ sig -> sig_keytype = DKIM_KEYTYPE_RSA ;
422
+ break ;
423
+ case DKIM_SIGN_ED25519SHA256 :
424
+ sig -> sig_keytype = DKIM_KEYTYPE_ED25519 ;
425
+ break ;
426
+ default :
427
+ return -1 ;
428
+ }
412
429
413
430
#ifdef USE_GNUTLS
414
431
if (err != NULL )
@@ -432,48 +449,105 @@ dkim_test_key(DKIM_LIB *lib, char *selector, char *domain,
432
449
return -1 ;
433
450
}
434
451
435
- crypto -> crypto_keysize = EVP_PKEY_size (crypto -> crypto_pkey );
436
-
437
- outkey = BIO_new (BIO_s_mem ());
438
- if (outkey == NULL )
439
- {
440
- BIO_free (keybuf );
441
- (void ) dkim_free (dkim );
442
- if (err != NULL )
443
- strlcpy (err , "BIO_new() failed" , errlen );
444
- return -1 ;
445
- }
446
-
447
- status = i2d_PUBKEY_bio (outkey , crypto -> crypto_pkey );
448
- if (status == 0 )
452
+ if (sig -> sig_keytype == DKIM_KEYTYPE_ED25519 )
449
453
{
450
- BIO_free (keybuf );
451
- BIO_free (outkey );
452
- (void ) dkim_free (dkim );
453
- if (err != NULL )
454
+ outkey_len = sizeof (buf );
455
+ if (! EVP_PKEY_get_raw_public_key (crypto -> crypto_pkey ,
456
+ buf , & outkey_len ))
454
457
{
455
- strlcpy (err , "i2d_RSA_PUBKEY_bio() failed" ,
458
+ strlcpy (err ,
459
+ "EVP_PKEY_get_raw_public_key() failed" ,
456
460
errlen );
461
+ return -1 ;
457
462
}
458
- return -1 ;
463
+ ptr = buf ;
459
464
}
465
+ else
466
+ {
467
+ crypto -> crypto_keysize = EVP_PKEY_size (crypto -> crypto_pkey );
460
468
461
- (void ) BIO_get_mem_data (outkey , & ptr );
469
+ outkey = BIO_new (BIO_s_mem ());
470
+ if (outkey == NULL )
471
+ {
472
+ BIO_free (keybuf );
473
+ (void ) dkim_free (dkim );
474
+ if (err != NULL )
475
+ strlcpy (err , "BIO_new() failed" , errlen );
476
+ return -1 ;
477
+ }
462
478
463
- if (BIO_number_written (outkey ) == sig -> sig_keylen )
479
+ status = i2d_PUBKEY_bio (outkey , crypto -> crypto_pkey );
480
+ if (status == 0 )
481
+ {
482
+ BIO_free (keybuf );
483
+ BIO_free (outkey );
484
+ (void ) dkim_free (dkim );
485
+ if (err != NULL )
486
+ {
487
+ strlcpy (err , "i2d_RSA_PUBKEY_bio() failed" ,
488
+ errlen );
489
+ }
490
+ return -1 ;
491
+ }
492
+ (void ) BIO_get_mem_data (outkey , & ptr );
493
+
494
+ outkey_len = BIO_number_written (outkey );
495
+
496
+ }
497
+
498
+ if (outkey_len == sig -> sig_keylen )
499
+ {
464
500
status = memcmp (ptr , sig -> sig_key , sig -> sig_keylen );
501
+ if (status != 0 )
502
+ {
503
+ strlcpy (err , "keys do not match" , errlen );
504
+ }
505
+ }
465
506
else
507
+ {
466
508
status = 1 ;
509
+ snprintf (err , errlen ,
510
+ "key do not match: local = %zd, remote = %zd" ,
511
+ outkey_len , sig -> sig_keylen );
512
+ }
467
513
468
- if (status != 0 )
469
- strlcpy ( err , "keys do not match" , errlen );
470
-
471
- BIO_free (keybuf );
472
- BIO_free ( outkey );
514
+ if (sig -> sig_keytype != DKIM_KEYTYPE_ED25519 )
515
+ {
516
+ BIO_free ( keybuf );
517
+ BIO_free (outkey );
518
+ }
473
519
#endif /* USE_GNUTLS */
474
520
}
475
521
476
522
(void ) dkim_free (dkim );
477
523
478
524
return (status == 0 ? 0 : 1 );
479
525
}
526
+
527
+ /*
528
+ ** DKIM_TEST_KEY -- retrieve a public key and verify it against a provided
529
+ ** private key
530
+ **
531
+ ** Parameters:
532
+ ** lib -- DKIM library handle
533
+ ** selector -- selector
534
+ ** domain -- domain name
535
+ ** key -- private key to verify (PEM format)
536
+ ** keylen -- size of private key
537
+ ** dnssec -- DNSSEC result (may be NULL)
538
+ ** err -- error buffer (may be NULL)
539
+ ** errlen -- size of error buffer
540
+ **
541
+ ** Return value:
542
+ ** 1 -- keys don't match
543
+ ** 0 -- keys match (or no key provided)
544
+ ** -1 -- error
545
+ */
546
+
547
+ int
548
+ dkim_test_key (DKIM_LIB * lib , char * selector , char * domain ,
549
+ char * key , size_t keylen , int * dnssec , char * err , size_t errlen )
550
+ {
551
+ return dkim_test_key2 (lib , selector , domain , key , keylen ,
552
+ DKIM_SIGN_RSASHA256 , dnssec , err , errlen );
553
+ }
0 commit comments