2 ** Copyright 2001 Double Precision, Inc.
3 ** See COPYING for distribution information.
18 #define K20(x) x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x
20 static SHA1_WORD K
[80] = { K20(K0
), K20(K1
), K20(K2
), K20(K3
) };
22 void sha1_context_init(struct SHA1_CONTEXT
*c
)
24 if (sizeof(SHA1_WORD
) != 4)
35 void sha1_context_hash(struct SHA1_CONTEXT
*c
,
36 const unsigned char blk
[SHA1_BLOCK_SIZE
])
43 #define f(t,B,C,D) ( \
44 (t) < 20 ? ( (B) & (C) ) | ( (~(B)) & (D) ) : \
45 (t) >= 40 && (t) < 60 ? ( (B) & (C) ) | ( (B) & (D) ) | ( (C) & (D) ):\
48 #define S(a,b) ( ((SHA1_WORD)(a) << (b)) | ((SHA1_WORD)(a) >> (32 - (b))))
50 for (i
=t
=0; t
<16; t
++)
53 W
[t
] = (W
[t
] << 8) | blk
[i
]; i
++;
54 W
[t
] = (W
[t
] << 8) | blk
[i
]; i
++;
55 W
[t
] = (W
[t
] << 8) | blk
[i
]; i
++;
60 TEMP
= W
[t
-3] ^ W
[t
-8] ^ W
[t
-14] ^ W
[t
-16];
73 TEMP
+= f(t
, B
, C
, D
);
92 void sha1_context_hashstream(struct SHA1_CONTEXT
*c
, const void *p
, unsigned l
)
94 const unsigned char *cp
=(const unsigned char *)p
;
99 if (c
->blk_ptr
== 0 && l
>= SHA1_BLOCK_SIZE
)
101 sha1_context_hash(c
, cp
);
102 cp
+= SHA1_BLOCK_SIZE
;
103 l
-= SHA1_BLOCK_SIZE
;
108 if (ll
> SHA1_BLOCK_SIZE
- c
->blk_ptr
)
109 ll
=SHA1_BLOCK_SIZE
- c
->blk_ptr
;
110 memcpy(c
->blk
+ c
->blk_ptr
, cp
, ll
);
114 if (c
->blk_ptr
>= SHA1_BLOCK_SIZE
)
116 sha1_context_hash(c
, c
->blk
);
122 void sha1_context_endstream(struct SHA1_CONTEXT
*c
, unsigned long l
)
124 unsigned char buf
[8];
125 static const unsigned char zero
[SHA1_BLOCK_SIZE
-8];
128 sha1_context_hashstream(c
, &buf
, 1);
129 while (c
->blk_ptr
!= SHA1_BLOCK_SIZE
-8)
131 if (c
->blk_ptr
> SHA1_BLOCK_SIZE
-8)
133 sha1_context_hashstream(c
, zero
,
134 SHA1_BLOCK_SIZE
- c
->blk_ptr
);
137 sha1_context_hashstream(c
, zero
,
138 SHA1_BLOCK_SIZE
-8-c
->blk_ptr
);
146 buf
[3]=buf
[2]=buf
[1]=buf
[0]=0;
148 sha1_context_hashstream(c
, buf
, 8);
151 void sha1_context_digest(struct SHA1_CONTEXT
*c
, SHA1_DIGEST d
)
153 unsigned char *dp
=d
+ SHA1_DIGEST_SIZE
;
158 SHA1_WORD w
=c
->H
[--i
];
167 void sha1_context_restore(struct SHA1_CONTEXT
*c
, const SHA1_DIGEST d
)
169 const unsigned char *dp
=d
;
184 void sha1_digest(const void *msg
, unsigned len
, SHA1_DIGEST d
)
186 struct SHA1_CONTEXT c
;
188 sha1_context_init( &c
);
189 sha1_context_hashstream(&c
, msg
, len
);
190 sha1_context_endstream(&c
, len
);
191 sha1_context_digest( &c
, d
);