2 ** Copyright 2001-2008 Double Precision, Inc.
3 ** See COPYING for distribution information.
10 static const char base64tab
[]=
11 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
13 const char *sha1_hash(const char *passw
)
16 static char hash_buffer
[1+(sizeof(sha1buf
)+2)/3*4];
21 sha1_digest(passw
, strlen(passw
), sha1buf
);
25 for (i
=0; i
<sizeof(sha1buf
); i
+= 3)
28 b
= i
+1 < sizeof(sha1buf
) ? sha1buf
[i
+1]:0;
29 c
= i
+2 < sizeof(sha1buf
) ? sha1buf
[i
+2]:0;
31 d
=base64tab
[ a
>> 2 ];
32 e
=base64tab
[ ((a
& 3 ) << 4) | (b
>> 4)];
33 f
=base64tab
[ ((b
& 15) << 2) | (c
>> 6)];
34 g
=base64tab
[ c
& 63 ];
35 if (i
+ 1 >= sizeof(sha1buf
)) f
='=';
36 if (i
+ 2 >= sizeof(sha1buf
)) g
='=';
47 const char *ssha_hash(const char *passw
, SSHA_RAND seed
)
49 unsigned char sha1buf
[sizeof(SHA1_DIGEST
)+sizeof(SSHA_RAND
)];
51 static char hash_buffer
[1+(sizeof(sha1buf
)+2)/3*4];
55 struct SHA1_CONTEXT ctx
;
57 sha1_context_init( &ctx
);
58 sha1_context_hashstream(&ctx
, passw
, strlen(passw
));
59 sha1_context_hashstream(&ctx
, seed
, sizeof(SSHA_RAND
));
60 sha1_context_endstream(&ctx
, strlen(passw
)+sizeof(SSHA_RAND
));
61 sha1_context_digest( &ctx
, sha1buf
);
63 for(i
=0; i
<sizeof(SSHA_RAND
); i
++)
65 sha1buf
[sizeof(SHA1_DIGEST
)+i
] = seed
[i
];
70 for (i
=0; i
<sizeof(sha1buf
); i
+= 3)
73 b
= i
+1 < sizeof(sha1buf
) ? sha1buf
[i
+1]:0;
74 c
= i
+2 < sizeof(sha1buf
) ? sha1buf
[i
+2]:0;
76 d
=base64tab
[ a
>> 2 ];
77 e
=base64tab
[ ((a
& 3 ) << 4) | (b
>> 4)];
78 f
=base64tab
[ ((b
& 15) << 2) | (c
>> 6)];
79 g
=base64tab
[ c
& 63 ];
80 if (i
+ 1 >= sizeof(sha1buf
)) f
='=';
81 if (i
+ 2 >= sizeof(sha1buf
)) g
='=';