md5.pm revision 1.15
1# ex:ts=8 sw=4:
2# $OpenBSD: md5.pm,v 1.15 2011/06/27 12:14:25 espie Exp $
3#
4# Copyright (c) 2003-2007 Marc Espie <espie@openbsd.org>
5#
6# Permission to use, copy, modify, and distribute this software for any
7# purpose with or without fee is hereby granted, provided that the above
8# copyright notice and this permission notice appear in all copies.
9#
10# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17
18use strict;
19use warnings;
20
21package OpenBSD::digest;
22
23sub new
24{
25	my ($class, $filename) = @_;
26	$class = ref($class) || $class;
27	my $digest = $class->digest_file($filename);
28	bless \$digest, $class;
29}
30
31sub key
32{
33	my $self = shift;
34	return $$self;
35}
36
37sub write
38{
39	my ($self, $fh) = @_;
40	print $fh "\@", $self->keyword, " ", $self->stringize, "\n";
41}
42
43sub digest_file
44{
45	my ($self, $fname) = @_;
46	open(my $file, '<', $fname) or die "can't open $fname: $!";
47	my $digest = $self->digest_fh($file);
48	close($file) or die "problem closing $fname: $!";
49	return $digest;
50}
51
52
53sub digest_fh
54{
55	my ($self, $file) = @_;
56
57	my $d = $self->algo;
58
59	$d->addfile($file);
60	return $d->digest;
61}
62
63sub fromstring
64{
65	my ($class, $arg) = @_;
66	$class = ref($class) || $class;
67	my $d = $class->unstringize($arg);
68	bless \$d, $class;
69}
70
71sub equals
72{
73	my ($a, $b) = @_;
74	return ref($a) eq ref($b) && $$a eq $$b;
75}
76
77package OpenBSD::md5;
78our @ISA=(qw(OpenBSD::digest));
79
80sub fromfile
81{
82	my $fname = shift;
83	return OpenBSD::md5->digest_file($fname);
84}
85
86sub fromfh
87{
88	my $file = shift;
89	return OpenBSD::md5->digest_fh($file);
90}
91
92sub algo
93{
94	my $self = shift;
95	require Digest::MD5;
96
97	return Digest::MD5->new;
98}
99
100sub stringize
101{
102	my $self = shift;
103	return unpack('H*', $$self);
104}
105
106sub unstringize
107{
108	my ($class, $arg) = @_;
109	return pack('H*', $arg);
110}
111
112sub keyword
113{
114	return "md5";
115}
116
117package OpenBSD::sha;
118our @ISA=(qw(OpenBSD::digest));
119
120use Digest::SHA;
121use MIME::Base64;
122
123sub algo
124{
125	my $self = shift;
126
127	return Digest::SHA->new(256);
128}
129
130sub stringize
131{
132	my $self = shift;
133
134	return encode_base64($$self, '');
135}
136
137sub unstringize
138{
139	my ($class, $arg) = @_;
140	if ($arg =~ /^[0-9a-f]{64}$/i) {
141		return pack('H*', $arg);
142	}
143	return decode_base64($arg);
144}
145
146sub keyword
147{
148	return "sha";
149}
150
1511;
152