md5.pm revision 1.8
1# ex:ts=8 sw=4:
2# $OpenBSD: md5.pm,v 1.8 2009/12/31 11:31:03 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 write
32{
33	my ($self, $fh) = @_;
34	print $fh "\@", $self->keyword, " ", $self->stringize, "\n";
35}
36
37sub digest_file
38{
39	my ($self, $fname) = @_;
40	open(my $file, '<', $fname) or die "can't open $fname: $!";
41	my $digest = $self->digest_fh($file);
42	close($file) or die "problem closing $fname: $!";
43	return $digest;
44}
45
46
47sub digest_fh
48{
49	my ($self, $file) = @_;
50
51	my $d = $self->algo;
52
53	$d->addfile($file);
54	return $d->digest;
55}
56
57sub fromstring
58{
59	my ($class, $arg) = @_;
60	$class = ref($class) || $class;
61	my $d = $class->unstringize($arg);
62	bless \$d, $class;
63}
64
65sub equals
66{
67	my ($a, $b) = @_;
68	return ref($a) eq ref($b) && $$a eq $$b;
69}
70
71package OpenBSD::md5;
72our @ISA=(qw(OpenBSD::digest));
73
74sub fromfile
75{
76	my $fname = shift;
77	return OpenBSD::md5->digest_file($fname);
78}
79
80sub fromfh
81{
82	my $file = shift;
83	return OpenBSD::md5->digest_fh($file);
84}
85
86sub algo
87{
88	my $self = shift;
89	require Digest::MD5;
90
91	return Digest::MD5->new;
92}
93
94sub stringize
95{
96	my $self = shift;
97	return unpack('H*', $$self);
98}
99
100sub unstringize
101{
102	my ($class, $arg) = @_;
103	return pack('H*', $arg);
104}
105
106sub keyword
107{
108	return "md5";
109}
110
111package OpenBSD::sha;
112our @ISA=(qw(OpenBSD::digest));
113
114use Digest::SHA;
115use MIME::Base64;
116
117sub algo
118{
119	my $self = shift;
120
121	return Digest::SHA->new(256);
122}
123
124sub stringize
125{
126	my $self = shift;
127
128	return encode_base64($$self, '');
129}
130
131sub unstringize
132{
133	my ($class, $arg) = @_;
134
135	return decode_base64($arg);
136}
137
138sub keyword
139{
140	return "sha";
141}
142
1431;
144