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