-
Notifications
You must be signed in to change notification settings - Fork 30
/
sha1_ossl.cpp
140 lines (119 loc) · 2.81 KB
/
sha1_ossl.cpp
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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
#include "globals.h"
#include "sha1_ossl.h"
#ifdef __cplusplus
extern "C" {
#endif
void sha1_block_data_order (SHA_CTX *c, const void *p,size_t num);
#ifdef __cplusplus
}
#endif
#define HOST_c2l(c,l) (l =(((unsigned long)(*((c)++)))<<24), \
l|=(((unsigned long)(*((c)++)))<<16), \
l|=(((unsigned long)(*((c)++)))<< 8), \
l|=(((unsigned long)(*((c)++))) ), \
l)
#define HOST_l2c(l,c) (*((c)++)=(unsigned char)(((l)>>24)&0xff), \
*((c)++)=(unsigned char)(((l)>>16)&0xff), \
*((c)++)=(unsigned char)(((l)>> 8)&0xff), \
*((c)++)=(unsigned char)(((l) )&0xff), \
l)
#define HASH_MAKE_STRING(c,s) do { \
unsigned long ll; \
ll=(c)->h0; HOST_l2c(ll,(s)); \
ll=(c)->h1; HOST_l2c(ll,(s)); \
ll=(c)->h2; HOST_l2c(ll,(s)); \
ll=(c)->h3; HOST_l2c(ll,(s)); \
ll=(c)->h4; HOST_l2c(ll,(s)); \
} while (0)
int SHA1_Update(SHA_CTX *c, const BYTE *data, size_t len)
{
unsigned char *p;
SHA_LONG l;
size_t n;
if (len==0) return 1;
l=(c->Nl+(((SHA_LONG)len)<<3))&0xffffffffUL;
/* 95-05-24 eay Fixed a bug with the overflow handling, thanks to
* Wei Dai <[email protected]> for pointing it out. */
if (l < c->Nl) /* overflow */
c->Nh++;
c->Nh+=(SHA_LONG)(len>>29); /* might cause compiler warning on 16-bit */
c->Nl=l;
n = c->num;
if (n != 0)
{
p=(unsigned char *)c->data;
if (len >= SHA_CBLOCK || len+n >= SHA_CBLOCK)
{
memcpy (p+n,data,SHA_CBLOCK-n);
sha1_block_data_order (c,p,1);
n = SHA_CBLOCK-n;
data += n;
len -= n;
c->num = 0;
memset (p,0,SHA_CBLOCK); /* keep it zeroed */
}
else
{
memcpy (p+n,data,len);
c->num += (unsigned int)len;
return 1;
}
}
n = len/SHA_CBLOCK;
if (n > 0)
{
sha1_block_data_order (c,data,n);
n *= SHA_CBLOCK;
data += n;
len -= n;
}
if (len != 0)
{
p = (unsigned char *)c->data;
c->num = (unsigned int)len;
memcpy (p,data,len);
}
return 1;
}
void SHA1_Transform (SHA_CTX *c, const unsigned char *data)
{
sha1_block_data_order (c,data,1);
}
int SHA1_Final (unsigned char *md, SHA_CTX *c)
{
unsigned char *p = (unsigned char *)c->data;
size_t n = c->num;
p[n] = 0x80; /* there is always room for one */
n++;
if (n > (SHA_CBLOCK-8))
{
memset (p+n,0,SHA_CBLOCK-n);
n=0;
sha1_block_data_order (c,p,1);
}
memset (p+n,0,SHA_CBLOCK-8-n);
p += SHA_CBLOCK-8;
(void)HOST_l2c(c->Nh,p);
(void)HOST_l2c(c->Nl,p);
p -= SHA_CBLOCK;
sha1_block_data_order (c,p,1);
c->num=0;
memset (p,0,SHA_CBLOCK);
HASH_MAKE_STRING(c,md);
return 1;
}
#define INIT_DATA_h0 0x67452301UL
#define INIT_DATA_h1 0xefcdab89UL
#define INIT_DATA_h2 0x98badcfeUL
#define INIT_DATA_h3 0x10325476UL
#define INIT_DATA_h4 0xc3d2e1f0UL
int SHA1_Init (SHA_CTX *c)
{
memset (c,0,sizeof(*c));
c->h0=INIT_DATA_h0;
c->h1=INIT_DATA_h1;
c->h2=INIT_DATA_h2;
c->h3=INIT_DATA_h3;
c->h4=INIT_DATA_h4;
return 1;
}