-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathParseExop.pm
78 lines (60 loc) · 1.39 KB
/
ParseExop.pm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
# -*- Mode: perl; indent-tabs-mode: nil -*-
#
# Copyright (C) 2008 - 2009 Nano-opt
# Licence: GPL
package ParseExop;
use strict;
use base qw(Exporter);
use MIME::Base64;
use Digest::SHA qw(sha1 sha1_base64);
%ParseExop::EXPORT = qw(
ParseSSHA
ParseHashed
GetRandomSalt
ExecSSHA
ExecHash
);
sub ParseSSHA {
my ($text) = @_;
my $hash = {};
if (length($text) == 32) {
my $raw = MIME::Base64::decode_base64($text);
$hash->{'salt'} = substr($raw, -4);
$hash->{'sha1'} = substr($raw, 0, length($raw) - 4);
}
return $hash;
}
sub ParseHashed {
my ($text) = @_;
my $raw = MIME::Base64::decode_base64($text);
my $hash = {};
if ($raw =~ /^\{([A-Za-z]+)\}(.*)$/) {
$hash->{'type'} = $1;
$hash->{'data'} = $2;
}
return $hash;
}
sub GetRandomSalt {
my ($len) = @_;
if (! defined($len)) {$len = 4; }
my $base = './0123456789';
my $alpha = 'abcdefghijklmnopqrstuvwxyz';
$base .= $alpha . uc($alpha);
my $salt;
for (1 .. $len) {
$salt .= substr($base, int(rand(length($base))), 1);
}
return $salt;
}
sub ExecSSHA {
my ($text, $salt) = @_;
my $raw = $text . $salt;
return sha1($raw) . $salt;
}
sub ExecHash {
my ($type, $data) = @_;
return '{' . uc($type) . '}' . MIME::Base64::encode_base64($data, '');
}
# --------------- private -------------
1;
__END__