File: //usr/share/doc/perl-Mail-DKIM/arcsign.pl
#!/usr/bin/perl -I../lib
#
# Copyright (c) 2005-2007 Messiah College. This program is free software.
# Copyright (c) 2017 Standcore LLC. This program is free software.
# You can redistribute it and/or modify it under the terms of the
# GNU Public License as found at http://www.fsf.org/copyleft/gpl.html.
#
# Written by Jason Long, jlong@messiah.edu.
use strict;
use warnings;
use Mail::DKIM::ARC::Signer;
use Getopt::Long;
use Pod::Usage;
my $selector = "selector1";
my $algorithm = "rsa-sha256";
my $chain = "ar";
my $domain; # undef => auto-select domain
my $srvid;
my $key_file = "private.key";
my $timestamp = 12345;
my @extra_tag;
my $debug_canonicalization;
my $binary;
my $help;
my $wrap;
GetOptions(
		"selector=s" => \$selector,
		"domain=s" => \$domain,
		"srvid=s" => \$srvid,
		"chain=s" => \$chain,
		"key=s" => \$key_file,
		"debug-canonicalization=s" => \$debug_canonicalization,
	        "timestamp=i" => \$timestamp,
		"extra-tag=s" => \@extra_tag,
		"binary" => \$binary,
	        "wrap" => \$wrap,
		"help|?" => \$help,
		)
	or pod2usage(2);
pod2usage(1) if $help;
pod2usage("Error: unrecognized argument(s)")
	unless (@ARGV == 0);
eval "use Mail::DKIM::TextWrap;" if($wrap);
my $debugfh;
if (defined $debug_canonicalization)
{
	open $debugfh, ">", $debug_canonicalization
		or die "Error: cannot write $debug_canonicalization: $!\n";
}
if ($binary)
{
	binmode STDIN;
}
my $arc = new Mail::DKIM::ARC::Signer(
		Domain => $domain,
		SrvId => $srvid,
		Chain => $chain,
		Algorithm => $algorithm,
		Selector => $selector,
		KeyFile => $key_file,
		Debug_Canonicalization => $debugfh,
		Timestamp => $timestamp
		);
while (<STDIN>)
{
	unless ($binary)
	{
		chomp $_;
		s/\015?$/\015\012/s;
	}
	$arc->PRINT($_);
}
$arc->CLOSE;
if ($debugfh)
{
	close $debugfh;
	print STDERR "wrote canonicalized message to $debug_canonicalization\n";
}
print "RESULT IS " . $arc->result() . "\n";
if( $arc->result eq "sealed") {
	print join("\n",$arc->as_strings) . "\n";
} else {
	print "REASON IS " . $arc->{details} . "\n";
}
__END__
=head1 NAME
arcsign.pl - computes ARC signatures for an email message
=head1 SYNOPSIS
  arcsign.pl [options] < original_email.txt
    options:
      --chain=pass|fail|none|ar
      --domain=DOMAIN
      --srvid=DOMAIN
      --selector=SELECTOR
      --key=FILE
      --debug-canonicalization=FILE
      --timestamp=INTEGER
      --wrap
  arcsign.pl --help
    to see a full description of the various options
=head1 OPTIONS
=over
=item B<--chain>
Chain value.  "ar" means pick it up from Authentication-Results header.
 
=item B<--key>
 
File containing private key, without BEGIN or END lines.
=item B<--domain>
Signing domain
=item B<--srvid>
Authentication-Results server domain, defaults to signing domain.
=item B<--debug-canonicalization>
Outputs the canonicalized message to the specified file, in addition
to computing the DKIM signature. This is helpful for debugging
canonicalization methods.
=back
=head1 AUTHORS
Jason Long, E<lt>jlong@messiah.eduE<gt>
John Levine, E<lt>john.levine@standcore.comE<gt>
 
=head1 COPYRIGHT AND LICENSE
Copyright (C) 2006-2007 by Messiah College
Copyright 2017 by Standcore LLC
This program is free software; you can redistribute it and/or modify
it under the same terms as Perl itself, either Perl version 5.8.6 or,
at your option, any later version of Perl 5 you may have available.
=cut