1package Mail::OpenDKIM::DKIM; 2 3use 5.010000; 4use strict; 5use warnings; 6 7use Error; 8 9use Mail::OpenDKIM; 10 11=head1 NAME 12 13Mail::OpenDKIM::DKIM - Provides an interface to libOpenDKIM 14 15=head1 DESCRIPTION 16 17Mail::OpenDKIM::DKIM, coupled with Mail::OpenDKIM, provides a means of calling libOpenDKIM 18from Perl. 19Mail::OpenDKIM implements those routine taking a DKIM_LIB argument; those taking a DKIM 20argument have been implemented in Mail::OpenDKIM::DKIM. 21 22When an error is encountered, an Error::Simple object is thrown. 23 24=head1 SUBROUTINES/METHODS 25 26=head2 new 27 28Create a new signing/verifying object. 29 30You probably don't want to call this method directly. 31Instead, call either Mail::DKIM->dkim_sign() or Mail::DKIM->dkim_verify() to instantiate an 32object. 33 34=cut 35 36sub new { 37 my ($class, $args) = @_; 38 39 foreach(qw(dkimlib_handle)) { 40 exists($$args{$_}) or throw Error::Simple("$class->new missing argument '$_'"); 41 defined($$args{$_}) or throw Error::Simple("$class->new undefined argument '$_'"); 42 } 43 44 my $self = { 45 _dkimlib_handle => $$args{dkimlib_handle}, # DKIM_LIB 46 _dkim_handle => undef, # DKIM 47 }; 48 49 bless $self, $class; 50 51 return $self; 52} 53 54=head2 dkim_sign 55 56You probably don't want to call this method directly. 57Instead, call Mail::DKIM->dkim_sign(). 58 59=cut 60 61sub dkim_sign 62{ 63 my ($self, $args) = @_; 64 65 if($self->{_dkim_handle}) { 66 throw Error::Simple('dkim_sign called twice'); 67 } 68 69 foreach(qw(id secretkey selector domain hdrcanon_alg bodycanon_alg sign_alg length)) { 70 exists($$args{$_}) or throw Error::Simple("dkim_sign missing argument '$_'"); 71 defined($$args{$_}) or throw Error::Simple("dkim_sign undefined argument '$_'"); 72 } 73 74 my $statp; 75 76 $self->{_dkim_handle} = Mail::OpenDKIM::_dkim_sign($self->{_dkimlib_handle}, 77 $$args{id}, $$args{secretkey}, $$args{selector}, $$args{domain}, 78 $$args{hdrcanon_alg}, $$args{bodycanon_alg}, $$args{sign_alg}, 79 $$args{length}, $statp); 80 81 return $statp; 82} 83 84=head2 dkim_verify 85 86You probably don't want to call this method directly. 87Instead, call Mail::DKIM->dkim_verify(). 88 89=cut 90 91sub dkim_verify 92{ 93 my ($self, $args) = @_; 94 95 if($self->{_dkim_handle}) { 96 throw Error::Simple('dkim_verify called twice'); 97 } 98 99 foreach(qw(id)) { 100 exists($$args{$_}) or throw Error::Simple("dkim_verify missing argument '$_'"); 101 defined($$args{$_}) or throw Error::Simple("dkim_verify undefined argument '$_'"); 102 } 103 104 my $statp; 105 106 $self->{_dkim_handle} = Mail::OpenDKIM::_dkim_verify($self->{_dkimlib_handle}, 107 $$args{id}, $statp); 108 109 return $statp; 110} 111 112=head2 dkim_header 113 114For further information, refer to http://www.opendkim.org/libopendkim/ 115 116=cut 117 118sub dkim_header 119{ 120 my ($self, $args) = @_; 121 122 unless($self->{_dkim_handle}) { 123 throw Error::Simple('dkim_header called before dkim_sign/dkim_verify'); 124 } 125 foreach(qw(header len)) { 126 exists($$args{$_}) or throw Error::Simple("dkim_header missing argument '$_'"); 127 defined($$args{$_}) or throw Error::Simple("dkim_header undefined argument '$_'"); 128 } 129 130 return Mail::OpenDKIM::_dkim_header($self->{_dkim_handle}, $$args{header}, $$args{len}); 131} 132 133=head2 dkim_body 134 135For further information, refer to http://www.opendkim.org/libopendkim/ 136 137=cut 138 139sub dkim_body 140{ 141 my ($self, $args) = @_; 142 143 unless($self->{_dkim_handle}) { 144 throw Error::Simple('dkim_body called before dkim_sign/dkim_verify'); 145 } 146 foreach(qw(bodyp len)) { 147 exists($$args{$_}) or throw Error::Simple("dkim_body missing argument '$_'"); 148 defined($$args{$_}) or throw Error::Simple("dkim_body undefined argument '$_'"); 149 } 150 151 return Mail::OpenDKIM::_dkim_body($self->{_dkim_handle}, $$args{bodyp}, $$args{len}); 152} 153 154=head2 dkim_eoh 155 156For further information, refer to http://www.opendkim.org/libopendkim/ 157 158=cut 159 160sub dkim_eoh 161{ 162 my $self = shift; 163 164 unless($self->{_dkim_handle}) { 165 throw Error::Simple('dkim_eoh called before dkim_sign/dkim_verify'); 166 } 167 168 return Mail::OpenDKIM::_dkim_eoh($self->{_dkim_handle}); 169} 170 171=head2 dkim_chunk 172 173For further information, refer to http://www.opendkim.org/libopendkim/ 174 175=cut 176 177sub dkim_chunk 178{ 179 my ($self, $args) = @_; 180 181 unless($self->{_dkim_handle}) { 182 throw Error::Simple('dkim_chunk called before dkim_sign/dkim_verify'); 183 } 184 foreach(qw(chunkp len)) { 185 exists($$args{$_}) or throw Error::Simple("dkim_chunk missing argument '$_'"); 186 defined($$args{$_}) or throw Error::Simple("dkim_chunk undefined argument '$_'"); 187 } 188 189 return Mail::OpenDKIM::_dkim_chunk($self->{_dkim_handle}, $$args{chunkp}, $$args{len}); 190} 191 192=head2 dkim_eom 193 194For further information, refer to http://www.opendkim.org/libopendkim/ 195 196=cut 197 198sub dkim_eom 199{ 200 my $self = shift; 201 202 unless($self->{_dkim_handle}) { 203 throw Error::Simple('dkim_eom called before dkim_sign/dkim_verify'); 204 } 205 206 return Mail::OpenDKIM::_dkim_eom($self->{_dkim_handle}); 207} 208 209=head2 dkim_getid 210 211For further information, refer to http://www.opendkim.org/libopendkim/ 212 213=cut 214 215sub dkim_getid 216{ 217 my $self = shift; 218 219 unless($self->{_dkim_handle}) { 220 throw Error::Simple('dkim_getid called before dkim_sign/dkim_verify'); 221 } 222 223 return Mail::OpenDKIM::_dkim_getid($self->{_dkim_handle}); 224} 225 226=head2 dkim_get_msgdate 227 228For further information, refer to http://www.opendkim.org/libopendkim/ 229 230=cut 231 232sub dkim_get_msgdate 233{ 234 my $self = shift; 235 236 if (Mail::OpenDKIM::dkim_libversion() >= 0x02070000) { 237 throw Error::Simple('dkim_get_msgdate not implemented in >= 2.7.0'); 238 } 239 240 unless($self->{_dkim_handle}) { 241 throw Error::Simple('dkim_get_msgdate called before dkim_sign/dkim_verify'); 242 } 243 244 return Mail::OpenDKIM::_dkim_get_msgdate($self->{_dkim_handle}); 245} 246 247=head2 dkim_get_sigsubstring 248 249For further information, refer to http://www.opendkim.org/libopendkim/ 250 251=cut 252 253sub dkim_get_sigsubstring 254{ 255 my ($self, $args) = @_; 256 257 unless($self->{_dkim_handle}) { 258 throw Error::Simple('dkim_get_sigsubstring called before dkim_sign/dkim_verify'); 259 } 260 foreach(qw(sig buf buflen)) { 261 exists($$args{$_}) or throw Error::Simple("dkim_get_sigsubstring missing argument '$_'"); 262 defined($$args{$_}) or throw Error::Simple("dkim_key_getsigsubstring undefined argument '$_'"); 263 } 264 265 my $buflen = $$args{buflen}; 266 267 my $rc = Mail::OpenDKIM::_dkim_get_sigsubstring($self->{_dkim_handle}, $$args{sig}, $$args{buf}, $buflen); 268 269 if($rc == DKIM_STAT_OK) { 270 $$args{buflen} = $buflen; 271 } 272 return $rc; 273} 274 275=head2 dkim_key_syntax 276 277For further information, refer to http://www.opendkim.org/libopendkim/ 278 279=cut 280 281sub dkim_key_syntax 282{ 283 my ($self, $args) = @_; 284 285 unless($self->{_dkim_handle}) { 286 throw Error::Simple('dkim_key_syntax called before dkim_sign/dkim_verify'); 287 } 288 289 foreach(qw(str len)) { 290 exists($$args{$_}) or throw Error::Simple("dkim_key_syntax missing argument '$_'"); 291 defined($$args{$_}) or throw Error::Simple("dkim_key_syntax undefined argument '$_'"); 292 } 293 294 return Mail::OpenDKIM::_dkim_key_syntax($self->{_dkim_handle}, $$args{str}, $$args{len}); 295} 296 297=head2 dkim_getsighdr 298 299For further information, refer to http://www.opendkim.org/libopendkim/ 300 301=cut 302 303sub dkim_getsighdr 304{ 305 my ($self, $args) = @_; 306 307 unless($self->{_dkim_handle}) { 308 throw Error::Simple('dkim_getsighdr called before dkim_sign'); 309 } 310 foreach(qw(initial buf len)) { 311 exists($$args{$_}) or throw Error::Simple("dkim_getsighdr missing argument '$_'"); 312 } 313 314 return Mail::OpenDKIM::_dkim_getsighdr($self->{_dkim_handle}, $$args{buf}, $$args{len}, $$args{initial}); 315} 316 317=head2 dkim_getsighdr_d 318 319For further information, refer to http://www.opendkim.org/libopendkim/ 320 321=cut 322 323sub dkim_getsighdr_d 324{ 325 my ($self, $args) = @_; 326 327 unless($self->{_dkim_handle}) { 328 throw Error::Simple('dkim_getsighdr_d called before dkim_sign'); 329 } 330 foreach(qw(initial buf len)) { 331 exists($$args{$_}) or throw Error::Simple("dkim_getsighdr_d missing argument '$_'"); 332 } 333 334 my $len; 335 336 my $rc = Mail::OpenDKIM::_dkim_getsighdr_d($self->{_dkim_handle}, $$args{initial}, $$args{buf}, $len); 337 338 if($rc == DKIM_STAT_OK) { 339 $$args{len} = $len; 340 } 341 342 return $rc; 343} 344 345=head2 dkim_getsignature 346 347For further information, refer to http://www.opendkim.org/libopendkim/ 348 349=cut 350 351sub dkim_getsignature 352{ 353 my $self = shift; 354 355 unless($self->{_dkim_handle}) { 356 throw Error::Simple('dkim_getsignature called before dkim_verify'); 357 } 358 359 return Mail::OpenDKIM::_dkim_getsignature($self->{_dkim_handle}); 360} 361 362=head2 dkim_getsiglist 363 364For further information, refer to http://www.opendkim.org/libopendkim/ 365 366=cut 367 368sub dkim_getsiglist 369{ 370 my ($self, $args) = @_; 371 372 unless($self->{_dkim_handle}) { 373 throw Error::Simple('dkim_getsiglist called before dkim_sign/dkim_verify'); 374 } 375 foreach(qw(sigs nsigs)) { 376 exists($$args{$_}) or throw Error::Simple("dkim_getsiglist missing argument '$_'"); 377 } 378 379 my($rc, $nsigs, @sigs) = Mail::OpenDKIM::_dkim_getsiglist($self->{_dkim_handle}); 380 381 if($rc == DKIM_STAT_OK) { 382 $$args{nsigs} = $nsigs; 383 $$args{sigs} = \@sigs; 384 } 385 else { 386 $$args{nsigs} = undef; 387 } 388 389 return $rc; 390} 391 392=head2 dkim_ohdrs 393 394For further information, refer to http://www.opendkim.org/libopendkim/ 395 396=cut 397 398sub dkim_ohdrs 399{ 400 my ($self, $args) = @_; 401 402 unless($self->{_dkim_handle}) { 403 throw Error::Simple('dkim_ohdrs called before dkim_verify'); 404 } 405 foreach(qw(sig ptrs cnt)) { 406 exists($$args{$_}) or throw Error::Simple("dkim_ohdrs missing argument '$_'"); 407 defined($$args{$_}) or throw Error::Simple("dkim_ohdrs missing argument '$_'"); 408 } 409 410 my $cnt = $$args{cnt}; 411 412 my $rc = Mail::OpenDKIM::_dkim_ohdrs($self->{_dkim_handle}, $$args{sig}, $$args{ptrs}, $cnt); 413 if($rc == DKIM_STAT_OK) { 414 $$args{cnt} = $cnt; 415 } 416 else { 417 $$args{cnt} = undef; 418 } 419 420 return $rc; 421} 422 423=head2 dkim_get_signer 424 425For further information, refer to http://www.opendkim.org/libopendkim/ 426 427=cut 428 429sub dkim_get_signer 430{ 431 my $self = shift; 432 433 unless($self->{_dkim_handle}) { 434 throw Error::Simple('dkim_get_signer called before dkim_sign'); 435 } 436 437 return Mail::OpenDKIM::_dkim_get_signer($self->{_dkim_handle}); 438} 439 440=head2 dkim_set_signer 441 442For further information, refer to http://www.opendkim.org/libopendkim/ 443 444=cut 445 446sub dkim_set_signer 447{ 448 my ($self, $args) = @_; 449 450 unless($self->{_dkim_handle}) { 451 throw Error::Simple('dkim_set_signer called before dkim_sign'); 452 } 453 foreach(qw(signer)) { 454 exists($$args{$_}) or throw Error::Simple("dkim_set_signer missing argument '$_'"); 455 defined($$args{$_}) or throw Error::Simple("dkim_set_signer undefined argument '$_'"); 456 } 457 458 return Mail::OpenDKIM::_dkim_set_signer($self->{_dkim_handle}, $$args{signer}); 459} 460 461=head2 dkim_set_margin 462 463For further information, refer to http://www.opendkim.org/libopendkim/ 464 465=cut 466 467sub dkim_set_margin 468{ 469 my ($self, $args) = @_; 470 471 unless($self->{_dkim_handle}) { 472 throw Error::Simple('dkim_set_margin called before dkim_sign'); 473 } 474 foreach(qw(margin)) { 475 exists($$args{$_}) or throw Error::Simple("dkim_set_margin missing argument '$_'"); 476 defined($$args{$_}) or throw Error::Simple("dkim_set_margin undefined argument '$_'"); 477 } 478 479 return Mail::OpenDKIM::_dkim_set_margin($self->{_dkim_handle}, $$args{margin}); 480} 481 482=head2 dkim_get_user_context 483 484For further information, refer to http://www.opendkim.org/libopendkim/ 485 486=cut 487 488sub dkim_get_user_context 489{ 490 my $self = shift; 491 492 unless($self->{_dkim_handle}) { 493 throw Error::Simple('dkim_get_user_context called before dkim_sign'); 494 } 495 496 return Mail::OpenDKIM::_dkim_get_user_context($self->{_dkim_handle}); 497} 498 499=head2 dkim_set_user_context 500 501For further information, refer to http://www.opendkim.org/libopendkim/ 502 503=cut 504 505sub dkim_set_user_context 506{ 507 my ($self, $args) = @_; 508 509 unless($self->{_dkim_handle}) { 510 throw Error::Simple('dkim_set_user_context called before dkim_sign'); 511 } 512 foreach(qw(context)) { 513 exists($$args{$_}) or throw Error::Simple("dkim_set_final missing argument '$_'"); 514 defined($$args{$_}) or throw Error::Simple("dkim_set_final undefined argument '$_'"); 515 } 516 517 return Mail::OpenDKIM::_dkim_set_user_context($self->{_dkim_handle}, $$args{context}); 518} 519 520=head2 dkim_atps_check 521 522For further information, refer to http://www.opendkim.org/libopendkim/ 523 524=cut 525 526sub dkim_atps_check 527{ 528 my ($self, $args) = @_; 529 530 unless($self->{_dkim_handle}) { 531 throw Error::Simple('dkim_atps_check called before dkim_verify'); 532 } 533 foreach(qw(sig)) { 534 exists($$args{$_}) or throw Error::Simple("dkim_set_final missing argument '$_'"); 535 defined($$args{$_}) or throw Error::Simple("dkim_set_final undefined argument '$_'"); 536 } 537 foreach(qw(res timeout)) { 538 exists($$args{$_}) or throw Error::Simple("dkim_set_final missing argument '$_'"); 539 } 540 541 my $res; 542 543 my $rc = Mail::OpenDKIM::_dkim_atps_check($self->{_dkim_handle}, $$args{sig}, $$args{timeout} ? $$args{timeout} : 0, $res); 544 545 if($rc == DKIM_STAT_OK) { 546 $$args{res} = $res; 547 } 548 else { 549 $$args{res} = undef; 550 } 551 552 return $rc; 553} 554 555=head2 dkim_diffheaders 556 557For further information, refer to http://www.opendkim.org/libopendkim/ 558 559=cut 560 561sub dkim_diffheaders 562{ 563 my ($self, $args) = @_; 564 565 unless($self->{_dkim_handle}) { 566 throw Error::Simple('dkim_diffheaders called before dkim_verify'); 567 } 568 foreach(qw(canon maxcost ohdrs nohdrs)) { 569 exists($$args{$_}) or throw Error::Simple("dkim_diffheaders missing argument '$_'"); 570 defined($$args{$_}) or throw Error::Simple("dkim_diffheaders undefined argument '$_'"); 571 } 572 573 my $nout; 574 my $out; 575 576 my $rc = Mail::OpenDKIM::_dkim_diffheaders($self->{_dkim_handle}, $$args{canon}, $$args{maxcost}, $$args{ohdrs}, $$args{hdrs}, $out, $nout); 577 578 if($rc == DKIM_STAT_OK) { 579 $$args{out} = $out; 580 $$args{nout} = $nout; 581 } 582 else { 583 $$args{out} = undef; 584 $$args{nout} = undef; 585 } 586 587 return $rc; 588} 589 590=head2 dkim_set_final 591 592For further information, refer to http://www.opendkim.org/libopendkim/ 593 594=cut 595 596sub dkim_set_final 597{ 598 my ($self, $args) = @_; 599 600 unless($self->{_dkimlib_handle}) { 601 throw Error::Simple('dkim_set_final called before dkim_sign'); 602 } 603 foreach(qw(func)) { 604 exists($$args{$_}) or throw Error::Simple("dkim_set_final missing argument '$_'"); 605 defined($$args{$_}) or throw Error::Simple("dkim_set_final undefined argument '$_'"); 606 } 607 608 return Mail::OpenDKIM::_dkim_set_final($self->{_dkimlib_handle}, $$args{func}); 609} 610 611=head2 dkim_set_prescreen 612 613For further information, refer to http://www.opendkim.org/libopendkim/ 614 615=cut 616 617sub dkim_set_prescreen 618{ 619 my ($self, $args) = @_; 620 621 unless($self->{_dkimlib_handle}) { 622 throw Error::Simple('dkim_set_prescreen called before dkim_sign'); 623 } 624 foreach(qw(func)) { 625 exists($$args{$_}) or throw Error::Simple("dkim_set_prescreen missing argument '$_'"); 626 defined($$args{$_}) or throw Error::Simple("dkim_set_prescreen undefined argument '$_'"); 627 } 628 629 return Mail::OpenDKIM::_dkim_set_prescreen($self->{_dkimlib_handle}, $$args{func}); 630} 631 632=head2 dkim_getpartial 633 634For further information, refer to http://www.opendkim.org/libopendkim/ 635 636=cut 637 638sub dkim_getpartial 639{ 640 my $self = shift; 641 642 unless($self->{_dkim_handle}) { 643 throw Error::Simple('dkim_getpartial called before dkim_sign'); 644 } 645 646 return Mail::OpenDKIM::_dkim_getpartial($self->{_dkim_handle}); 647} 648 649=head2 dkim_setpartial 650 651For further information, refer to http://www.opendkim.org/libopendkim/ 652 653=cut 654 655sub dkim_setpartial 656{ 657 my ($self, $args) = @_; 658 659 unless($self->{_dkim_handle}) { 660 throw Error::Simple('dkim_setpartial called before dkim_sign'); 661 } 662 foreach(qw(value)) { 663 exists($$args{$_}) or throw Error::Simple("dkim_setpartial missing argument '$_'"); 664 defined($$args{$_}) or throw Error::Simple("dkim_setpartial undefined argument '$_'"); 665 } 666 667 return Mail::OpenDKIM::_dkim_setpartial($self->{_dkim_handle}, $$args{value}); 668} 669 670=head2 dkim_getdomain 671 672For further information, refer to http://www.opendkim.org/libopendkim/ 673 674=cut 675 676sub dkim_getdomain 677{ 678 my $self = shift; 679 680 unless($self->{_dkim_handle}) { 681 throw Error::Simple('dkim_getdomain called before dkim_sign/dkim_verify'); 682 } 683 684 return Mail::OpenDKIM::_dkim_getdomain($self->{_dkim_handle}); 685} 686 687=head2 dkim_getuser 688 689For further information, refer to http://www.opendkim.org/libopendkim/ 690 691=cut 692 693sub dkim_getuser 694{ 695 my $self = shift; 696 697 unless($self->{_dkim_handle}) { 698 throw Error::Simple('dkim_getuser called before dkim_sign/dkim_verify'); 699 } 700 701 return Mail::OpenDKIM::_dkim_getuser($self->{_dkim_handle}); 702} 703 704=head2 dkim_minbody 705 706For further information, refer to http://www.opendkim.org/libopendkim/ 707 708=cut 709 710sub dkim_minbody 711{ 712 my $self = shift; 713 714 unless($self->{_dkim_handle}) { 715 throw Error::Simple('dkim_minbody called before dkim_sign/dkim_verify'); 716 } 717 718 return Mail::OpenDKIM::_dkim_minbody($self->{_dkim_handle}); 719} 720 721=head2 dkim_getmode 722 723For further information, refer to http://www.opendkim.org/libopendkim/ 724 725=cut 726 727sub dkim_getmode 728{ 729 my $self = shift; 730 731 unless($self->{_dkim_handle}) { 732 throw Error::Simple('dkim_getmode called before dkim_sign/dkim_verify'); 733 } 734 735 return Mail::OpenDKIM::_dkim_getmode($self->{_dkim_handle}); 736} 737 738=head2 dkim_sig_syntax 739 740For further information, refer to http://www.opendkim.org/libopendkim/ 741 742=cut 743 744sub dkim_sig_syntax 745{ 746 my ($self, $args) = @_; 747 748 unless($self->{_dkim_handle}) { 749 throw Error::Simple('dkim_sig_syntax called before dkim_verify'); 750 } 751 foreach(qw(str len)) { 752 exists($$args{$_}) or throw Error::Simple("dkim_sig_syntax missing argument '$_'"); 753 defined($$args{$_}) or throw Error::Simple("dkim_sig_syntax undefined argument '$_'"); 754 } 755 756 return Mail::OpenDKIM::_dkim_sig_syntax($self->{_dkim_handle}, $$args{str}, $$args{len}); 757} 758 759=head2 dkim_getpresult 760 761For further information, refer to http://www.opendkim.org/libopendkim/ 762 763=cut 764 765sub dkim_getpresult 766{ 767 my $self = shift; 768 769 unless($self->{_dkim_handle}) { 770 throw Error::Simple('dkim_getpresult called before dkim_verify'); 771 } 772 773 return Mail::OpenDKIM::_dkim_getpresult($self->{_dkim_handle}); 774} 775 776=head2 dkim_sig_getbh 777 778For further information, refer to http://www.opendkim.org/libopendkim/ 779 780=cut 781 782sub dkim_sig_getbh 783{ 784 my ($self, $args) = @_; 785 786 unless($self->{_dkim_handle}) { 787 throw Error::Simple('dkim_sig_getbh called before dkim_verify'); 788 } 789 foreach(qw(sig)) { 790 exists($$args{$_}) or throw Error::Simple("dkim_sig_getbh missing argument '$_'"); 791 defined($$args{$_}) or throw Error::Simple("dkim_sig_getbh undefined argument '$_'"); 792 } 793 794 return Mail::OpenDKIM::_dkim_sig_getbh($$args{sig}); 795} 796 797=head2 dkim_sig_getcanonlen 798 799For further information, refer to http://www.opendkim.org/libopendkim/ 800 801=cut 802 803sub dkim_sig_getcanonlen 804{ 805 my ($self, $args) = @_; 806 807 unless($self->{_dkim_handle}) { 808 throw Error::Simple('dkim_sig_getcanonlen called before dkim_verify'); 809 } 810 foreach(qw(sig)) { 811 exists($$args{$_}) or throw Error::Simple("dkim_sig_getcanonlen missing argument '$_'"); 812 defined($$args{$_}) or throw Error::Simple("dkim_sig_getcanonlen undefined argument '$_'"); 813 } 814 815 my $msglen = $$args{msglen}; 816 my $canonlen = $$args{canonlen}; 817 my $signlen = $$args{signlen}; 818 819 my $rc = Mail::OpenDKIM::_dkim_sig_getcanonlen($self->{_dkim_handle}, $$args{sig}, $msglen, $canonlen, $signlen); 820 821 if($rc == DKIM_STAT_OK) { 822 if(exists($$args{msglen})) { 823 $$args{msglen} = $msglen; 824 } 825 if(exists($$args{canonlen})) { 826 $$args{canonlen} = $canonlen; 827 } 828 if(exists($$args{signlen})) { 829 $$args{signlen} = $signlen; 830 } 831 } 832 833 return $rc; 834} 835 836=head2 dkim_sig_getcanons 837 838For further information, refer to http://www.opendkim.org/libopendkim/ 839 840=cut 841 842sub dkim_sig_getcanons 843{ 844 my ($self, $args) = @_; 845 846 unless($self->{_dkim_handle}) { 847 throw Error::Simple('dkim_sig_getcanons called before dkim_verify'); 848 } 849 850 my $hdr = $$args{hdr}; 851 my $body = $$args{body}; 852 853 my $rc = Mail::OpenDKIM::_dkim_sig_getcanons($$args{sig}, $hdr, $body); 854 855 if($rc == DKIM_STAT_OK) { 856 if(exists($$args{hdr})) { 857 $$args{hdr} = $hdr; 858 } 859 if(exists($$args{body})) { 860 $$args{body} = $body; 861 } 862 } 863 864 return $rc; 865} 866 867=head2 dkim_sig_getcontext 868 869For further information, refer to http://www.opendkim.org/libopendkim/ 870 871=cut 872 873sub dkim_sig_getcontext 874{ 875 my ($self, $args) = @_; 876 877 foreach(qw(sig)) { 878 exists($$args{$_}) or throw Error::Simple("dkim_sig_getcontext missing argument '$_'"); 879 defined($$args{$_}) or throw Error::Simple("dkim_sig_getcontext undefined argument '$_'"); 880 } 881 882 return Mail::OpenDKIM::_dkim_sig_getcontext($$args{sig}); 883} 884 885=head2 dkim_sig_getreportinfo 886 887For further information, refer to http://www.opendkim.org/libopendkim/ 888 889=cut 890 891sub dkim_sig_getreportinfo 892{ 893 my ($self, $args) = @_; 894 895 unless($self->{_dkim_handle}) { 896 throw Error::Simple('dkim_sig_getreportinfo called before dkim_verify'); 897 } 898 899 foreach(qw(sig)) { 900 exists($$args{$_}) or throw Error::Simple("dkim_sig_getreportinfo missing argument '$_'"); 901 defined($$args{$_}) or throw Error::Simple("dkim_sig_reportinfo undefined argument '$_'"); 902 } 903 my $interval = -1; 904 905 my $rc = Mail::OpenDKIM::_dkim_sig_getreportinfo($self->{_dkim_handle}, $$args{sig}, 906 $$args{hfd} ? $$args{hfd} : 0, 907 $$args{bfd} ? $$args{bfd} : 0, 908 $$args{addrbuf} ? $$args{addrbuf} : 0, $$args{addrlen}, 909 $$args{optsbuf} ? $$args{optsbuf} : 0, $$args{optslen}, 910 $$args{smtpbuf} ? $$args{smtpbuf} : 0, $$args{smtplen}, 911 $interval); 912 913 if($rc == DKIM_STAT_OK) { 914 $$args{interval} = $interval; 915 } 916 917 return $rc; 918} 919 920=head2 dkim_sig_getselector 921 922For further information, refer to http://www.opendkim.org/libopendkim/ 923 924=cut 925 926sub dkim_sig_getselector 927{ 928 my ($self, $args) = @_; 929 930 foreach(qw(sig)) { 931 exists($$args{$_}) or throw Error::Simple("dkim_sig_getselector missing argument '$_'"); 932 defined($$args{$_}) or throw Error::Simple("dkim_sig_selector undefined argument '$_'"); 933 } 934 935 return Mail::OpenDKIM::_dkim_sig_getselector($$args{sig}); 936} 937 938=head2 dkim_sig_getsignalg 939 940For further information, refer to http://www.opendkim.org/libopendkim/ 941 942=cut 943 944sub dkim_sig_getsignalg 945{ 946 my ($self, $args) = @_; 947 948 foreach(qw(sig)) { 949 exists($$args{$_}) or throw Error::Simple("dkim_sig_getsignalg missing argument '$_'"); 950 defined($$args{$_}) or throw Error::Simple("dkim_sig_getsignalg undefined argument '$_'"); 951 } 952 953 my $alg = -1; 954 955 my $rc = Mail::OpenDKIM::_dkim_sig_getsignalg($$args{sig}, $alg); 956 957 if($rc == DKIM_STAT_OK) { 958 $$args{alg} = $alg; 959 } 960 961 return $rc; 962} 963 964=head2 dkim_sig_getsignedhdrs 965 966For further information, refer to http://www.opendkim.org/libopendkim/ 967 968=cut 969 970sub dkim_sig_getsignedhdrs 971{ 972 my ($self, $args) = @_; 973 974 unless($self->{_dkim_handle}) { 975 throw Error::Simple('dkim_sig_getsignedhdrs called before dkim_verify'); 976 } 977 978 foreach(qw(sig hdrs hdrlen nhdrs)) { 979 exists($$args{$_}) or throw Error::Simple("dkim_sig_getsignedhdrs missing argument '$_'"); 980 defined($$args{$_}) or throw Error::Simple("dkim_sig_getsignedhdrs undefined argument '$_'"); 981 } 982 983 my $nhdrs = $$args{nhdrs}; 984 985 my $rc = Mail::OpenDKIM::_dkim_sig_getsignedhdrs($self->{_dkim_handle}, $$args{sig}, $$args{hdrs}, $$args{hdrlen}, $nhdrs); 986 987 if($rc == DKIM_STAT_OK) { 988 $$args{nhdrs} = $nhdrs; 989 } 990 else { 991 $$args{nhdrs} = undef; 992 } 993 994 return $rc; 995} 996 997=head2 dkim_sig_getsigntime 998 999For further information, refer to http://www.opendkim.org/libopendkim/ 1000 1001=cut 1002 1003sub dkim_sig_getsigntime 1004{ 1005 my ($self, $args) = @_; 1006 1007 foreach(qw(sig)) { 1008 exists($$args{$_}) or throw Error::Simple("dkim_sig_getsigntime missing argument '$_'"); 1009 defined($$args{$_}) or throw Error::Simple("dkim_sig_getsigntime undefined argument '$_'"); 1010 } 1011 1012 my $when = -1; 1013 1014 my $rc = Mail::OpenDKIM::_dkim_sig_getsigntime($$args{sig}, $when); 1015 1016 if($rc == DKIM_STAT_OK) { 1017 $$args{when} = $when; 1018 } 1019 1020 return $rc; 1021} 1022 1023=head2 dkim_sig_process 1024 1025For further information, refer to http://www.opendkim.org/libopendkim/ 1026 1027=cut 1028 1029sub dkim_sig_process 1030{ 1031 my ($self, $args) = @_; 1032 1033 unless($self->{_dkim_handle}) { 1034 throw Error::Simple('dkim_sig_process called before dkim_verify'); 1035 } 1036 1037 foreach(qw(sig)) { 1038 exists($$args{$_}) or throw Error::Simple("dkim_sig_process missing argument '$_'"); 1039 defined($$args{$_}) or throw Error::Simple("dkim_sig_process undefined argument '$_'"); 1040 } 1041 1042 return Mail::OpenDKIM::_dkim_sig_process($self->{_dkim_handle}, $$args{sig}); 1043} 1044 1045=head2 dkim_sig_gettagvalue 1046 1047For further information, refer to http://www.opendkim.org/libopendkim/ 1048 1049=cut 1050 1051sub dkim_sig_gettagvalue 1052{ 1053 my ($self, $args) = @_; 1054 1055 unless($self->{_dkim_handle}) { 1056 throw Error::Simple('dkim_sig_gettagvalue called before dkim_verify'); 1057 } 1058 1059 foreach(qw(sig keytag tag)) { 1060 exists($$args{$_}) or throw Error::Simple("dkim_sig_gettagvalue missing argument '$_'"); 1061 defined($$args{$_}) or throw Error::Simple("dkim_sig_gettagvalue undefined argument '$_'"); 1062 } 1063 1064 return Mail::OpenDKIM::_dkim_sig_gettagvalue($$args{sig}, $$args{keytag}, $$args{tag}); 1065} 1066 1067=head2 dkim_sig_hdrsigned 1068 1069For further information, refer to http://www.opendkim.org/libopendkim/ 1070 1071=cut 1072 1073sub dkim_sig_hdrsigned 1074{ 1075 my ($self, $args) = @_; 1076 1077 foreach(qw(sig hdr)) { 1078 exists($$args{$_}) or throw Error::Simple("dkim_sig_hdrsigned missing argument '$_'"); 1079 defined($$args{$_}) or throw Error::Simple("dkim_sig_hdrsigned undefined argument '$_'"); 1080 } 1081 1082 my $rc = Mail::OpenDKIM::_dkim_sig_hdrsigned($$args{sig}, $$args{hdr}); 1083} 1084 1085=head2 dkim_sig_getdnssec 1086 1087For further information, refer to http://www.opendkim.org/libopendkim/ 1088 1089=cut 1090 1091sub dkim_sig_getdnssec 1092{ 1093 my ($self, $args) = @_; 1094 1095 foreach(qw(sig)) { 1096 exists($$args{$_}) or throw Error::Simple("dkim_sig_getdnssec missing argument '$_'"); 1097 defined($$args{$_}) or throw Error::Simple("dkim_sig_getdnssec undefined argument '$_'"); 1098 } 1099 1100 return Mail::OpenDKIM::_dkim_sig_getdnssec($$args{sig}); 1101} 1102 1103=head2 dkim_sig_getdomain 1104 1105For further information, refer to http://www.opendkim.org/libopendkim/ 1106 1107=cut 1108 1109sub dkim_sig_getdomain 1110{ 1111 my ($self, $args) = @_; 1112 1113 foreach(qw(sig)) { 1114 exists($$args{$_}) or throw Error::Simple("dkim_sig_getdomain missing argument '$_'"); 1115 defined($$args{$_}) or throw Error::Simple("dkim_sig_getdomain undefined argument '$_'"); 1116 } 1117 1118 return Mail::OpenDKIM::_dkim_sig_getdomain($$args{sig}); 1119} 1120 1121=head2 dkim_sig_ignore 1122 1123For further information, refer to http://www.opendkim.org/libopendkim/ 1124 1125=cut 1126 1127sub dkim_sig_ignore 1128{ 1129 my ($self, $args) = @_; 1130 1131 foreach(qw(sig)) { 1132 exists($$args{$_}) or throw Error::Simple("dkim_sig_ignore missing argument '$_'"); 1133 defined($$args{$_}) or throw Error::Simple("dkim_sig_ignore undefined argument '$_'"); 1134 } 1135 1136 return Mail::OpenDKIM::_dkim_sig_ignore($$args{sig}); 1137} 1138 1139=head2 dkim_sig_getidentity 1140 1141For further information, refer to http://www.opendkim.org/libopendkim/ 1142 1143=cut 1144 1145sub dkim_sig_getidentity 1146{ 1147 my ($self, $args) = @_; 1148 1149 unless($self->{_dkim_handle}) { 1150 throw Error::Simple('dkim_sig_getidentity called before dkim_verify'); 1151 } 1152 1153 foreach(qw(sig val vallen)) { 1154 exists($$args{$_}) or throw Error::Simple("dkim_sig_getidentity missing argument '$_'"); 1155 defined($$args{$_}) or throw Error::Simple("dkim_sig_getidentity undefined argument '$_'"); 1156 } 1157 1158 return Mail::OpenDKIM::_dkim_sig_getidentity($self->{_dkim_handle}, $$args{sig}, $$args{val}, $$args{vallen}); 1159} 1160 1161=head2 dkim_sig_getflags 1162 1163For further information, refer to http://www.opendkim.org/libopendkim/ 1164 1165=cut 1166 1167sub dkim_sig_getflags 1168{ 1169 my ($self, $args) = @_; 1170 1171 foreach(qw(sig)) { 1172 exists($$args{$_}) or throw Error::Simple("dkim_sig_getflags missing argument '$_'"); 1173 defined($$args{$_}) or throw Error::Simple("dkim_sig_getflags undefined argument '$_'"); 1174 } 1175 1176 return Mail::OpenDKIM::_dkim_sig_getflags($$args{sig}); 1177} 1178 1179=head2 dkim_sig_getkeysize 1180 1181For further information, refer to http://www.opendkim.org/libopendkim/ 1182 1183=cut 1184 1185sub dkim_sig_getkeysize 1186{ 1187 my ($self, $args) = @_; 1188 1189 foreach(qw(sig)) { 1190 exists($$args{$_}) or throw Error::Simple("dkim_sig_getkeysize missing argument '$_'"); 1191 defined($$args{$_}) or throw Error::Simple("dkim_sig_getkeysize undefined argument '$_'"); 1192 } 1193 1194 my $bits; 1195 1196 my $rc = Mail::OpenDKIM::_dkim_sig_getkeysize($$args{sig}, $bits); 1197 1198 if($rc == DKIM_STAT_OK) { 1199 $$args{bits} = $bits; 1200 } 1201 1202 return $rc; 1203} 1204 1205=head2 dkim_sig_geterror 1206 1207For further information, refer to http://www.opendkim.org/libopendkim/ 1208 1209=cut 1210 1211sub dkim_sig_geterror 1212{ 1213 my ($self, $args) = @_; 1214 1215 foreach(qw(sig)) { 1216 exists($$args{$_}) or throw Error::Simple("dkim_sig_geterror missing argument '$_'"); 1217 defined($$args{$_}) or throw Error::Simple("dkim_sig_geterror undefined argument '$_'"); 1218 } 1219 1220 return Mail::OpenDKIM::_dkim_sig_geterror($$args{sig}); 1221} 1222 1223=head2 dkim_geterror 1224 1225For further information, refer to http://www.opendkim.org/libopendkim/ 1226 1227=cut 1228 1229sub dkim_geterror 1230{ 1231 my $self = shift; 1232 1233 unless($self->{_dkim_handle}) { 1234 throw Error::Simple('dkim_geterror called before dkim_sign/dkim_verify'); 1235 } 1236 1237 return Mail::OpenDKIM::_dkim_geterror($self->{_dkim_handle}); 1238} 1239 1240=head2 dkim_free 1241 1242For further information, refer to http://www.opendkim.org/libopendkim/ 1243 1244=cut 1245 1246sub dkim_free 1247{ 1248 my $self = shift; 1249 1250 unless($self->{_dkim_handle}) { 1251 throw Error::Simple('dkim_free called before dkim_sign'); 1252 } 1253 1254 my $rc = Mail::OpenDKIM::_dkim_free($self->{_dkim_handle}); 1255 1256 if($rc == DKIM_STAT_OK) { 1257 $self->{_dkim_handle} = undef; 1258 } 1259 1260 return $rc; 1261} 1262 1263sub DESTROY 1264{ 1265 my $self = shift; 1266 1267 if($self->{_dkim_handle}) { 1268 $self->dkim_free(); 1269 } 1270} 1271 1272=head2 EXPORT 1273 1274This module exports nothing. 1275 1276=head1 SEE ALSO 1277 1278Mail::DKIM 1279 1280http://www.opendkim.org/libopendkim/ 1281 1282RFC 4870, RFC 4871 1283 1284=head1 NOTES 1285 1286The sig routines would be better if they were in a separate class. 1287 1288The signature creation rountines have been tested more thoroughly than the signature 1289verification routines. 1290 1291Feedback will be greatfully received. 1292 1293=head1 AUTHOR 1294 1295Nigel Horne, C<< <nigel at mailermailer.com> >> 1296 1297=head1 SUPPORT 1298 1299You can find documentation for this module with the perldoc command. 1300 1301 perldoc Mail::OpenDKIM 1302 1303You can also look for information at: 1304 1305=over 4 1306 1307=item * RT: CPAN's request tracker 1308 1309L<http://rt.cpan.org/NoAuth/Bugs.html?Dist=Mail-OpenDKIM> 1310 1311=item * AnnoCPAN: Annotated CPAN documentation 1312 1313L<http://annocpan.org/dist/Mail-OpenDKIM> 1314 1315=item * CPAN Ratings 1316 1317L<http://cpanratings.perl.org/d/Mail-OpenDKIM> 1318 1319=item * Search CPAN 1320 1321L<http://search.cpan.org/dist/Mail-OpenDKIM/> 1322 1323=back 1324 1325 1326=head1 SPONSOR 1327 1328This code has been developed under sponsorship of MailerMailer LLC, 1329http://www.mailermailer.com/ 1330 1331=head1 COPYRIGHT AND LICENCE 1332 1333This module is Copyright 2013 Khera Communications, Inc. 1334It is licensed under the same terms as Perl itself. 1335 1336=cut 1337 13381; 1339