2 ** Copyright 2001 Double Precision, Inc.
3 ** See COPYING for distribution information.
12 static const char rcsid
[]="$Id: sha1.c,v 1.3 2008/12/18 12:08:26 mrsam Exp $";
19 #define K20(x) x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x
21 static SHA1_WORD K
[80] = { K20(K0
), K20(K1
), K20(K2
), K20(K3
) };
23 void sha1_context_init(struct SHA1_CONTEXT
*c
)
25 if (sizeof(SHA1_WORD
) != 4)
36 void sha1_context_hash(struct SHA1_CONTEXT
*c
,
37 const unsigned char blk
[SHA1_BLOCK_SIZE
])
44 #define f(t,B,C,D) ( \
45 (t) < 20 ? ( (B) & (C) ) | ( (~(B)) & (D) ) : \
46 (t) >= 40 && (t) < 60 ? ( (B) & (C) ) | ( (B) & (D) ) | ( (C) & (D) ):\
49 #define S(a,b) ( ((SHA1_WORD)(a) << (b)) | ((SHA1_WORD)(a) >> (32 - (b))))
51 for (i
=t
=0; t
<16; t
++)
54 W
[t
] = (W
[t
] << 8) | blk
[i
]; i
++;
55 W
[t
] = (W
[t
] << 8) | blk
[i
]; i
++;
56 W
[t
] = (W
[t
] << 8) | blk
[i
]; i
++;
61 TEMP
= W
[t
-3] ^ W
[t
-8] ^ W
[t
-14] ^ W
[t
-16];
74 TEMP
+= f(t
, B
, C
, D
);
93 void sha1_context_hashstream(struct SHA1_CONTEXT
*c
, const void *p
, unsigned l
)
95 const unsigned char *cp
=(const unsigned char *)p
;
100 if (c
->blk_ptr
== 0 && l
>= SHA1_BLOCK_SIZE
)
102 sha1_context_hash(c
, cp
);
103 cp
+= SHA1_BLOCK_SIZE
;
104 l
-= SHA1_BLOCK_SIZE
;
109 if (ll
> SHA1_BLOCK_SIZE
- c
->blk_ptr
)
110 ll
=SHA1_BLOCK_SIZE
- c
->blk_ptr
;
111 memcpy(c
->blk
+ c
->blk_ptr
, cp
, ll
);
115 if (c
->blk_ptr
>= SHA1_BLOCK_SIZE
)
117 sha1_context_hash(c
, c
->blk
);
123 void sha1_context_endstream(struct SHA1_CONTEXT
*c
, unsigned long l
)
125 unsigned char buf
[8];
126 static const unsigned char zero
[SHA1_BLOCK_SIZE
-8];
129 sha1_context_hashstream(c
, &buf
, 1);
130 while (c
->blk_ptr
!= SHA1_BLOCK_SIZE
-8)
132 if (c
->blk_ptr
> SHA1_BLOCK_SIZE
-8)
134 sha1_context_hashstream(c
, zero
,
135 SHA1_BLOCK_SIZE
- c
->blk_ptr
);
138 sha1_context_hashstream(c
, zero
,
139 SHA1_BLOCK_SIZE
-8-c
->blk_ptr
);
147 buf
[3]=buf
[2]=buf
[1]=buf
[0]=0;
149 sha1_context_hashstream(c
, buf
, 8);
152 void sha1_context_digest(struct SHA1_CONTEXT
*c
, SHA1_DIGEST d
)
154 unsigned char *dp
=d
+ SHA1_DIGEST_SIZE
;
159 SHA1_WORD w
=c
->H
[--i
];
168 void sha1_context_restore(struct SHA1_CONTEXT
*c
, const SHA1_DIGEST d
)
170 const unsigned char *dp
=d
;
185 void sha1_digest(const void *msg
, unsigned len
, SHA1_DIGEST d
)
187 struct SHA1_CONTEXT c
;
189 sha1_context_init( &c
);
190 sha1_context_hashstream(&c
, msg
, len
);
191 sha1_context_endstream(&c
, len
);
192 sha1_context_digest( &c
, d
);