digest 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,56 @@
1
+ /* $NetBSD: rmd160.h,v 1.2 2000/07/07 10:47:06 ad Exp $ */
2
+ /* $RoughId: rmd160.h,v 1.3 2002/02/24 08:14:31 knu Exp $ */
3
+ /* $Id$ */
4
+
5
+ /********************************************************************\
6
+ *
7
+ * FILE: rmd160.h
8
+ *
9
+ * CONTENTS: Header file for a sample C-implementation of the
10
+ * RIPEMD-160 hash-function.
11
+ * TARGET: any computer with an ANSI C compiler
12
+ *
13
+ * AUTHOR: Antoon Bosselaers, ESAT-COSIC
14
+ * DATE: 1 March 1996
15
+ * VERSION: 1.0
16
+ *
17
+ * Copyright (c) Katholieke Universiteit Leuven
18
+ * 1996, All Rights Reserved
19
+ *
20
+ \********************************************************************/
21
+
22
+ /*
23
+ * from OpenBSD: rmd160.h,v 1.4 1999/08/16 09:59:04 millert Exp
24
+ */
25
+
26
+ #ifndef _RMD160_H_
27
+ #define _RMD160_H_
28
+
29
+ #include "../defs.h"
30
+
31
+ typedef struct {
32
+ uint32_t state[5]; /* state (ABCDE) */
33
+ uint32_t length[2]; /* number of bits */
34
+ uint8_t bbuffer[64]; /* overflow buffer */
35
+ uint32_t buflen; /* number of chars in bbuffer */
36
+ } RMD160_CTX;
37
+
38
+ #ifdef RUBY
39
+ #define RMD160_Init rb_Digest_RMD160_Init
40
+ #define RMD160_Transform rb_Digest_RMD160_Transform
41
+ #define RMD160_Update rb_Digest_RMD160_Update
42
+ #define RMD160_Finish rb_Digest_RMD160_Finish
43
+ #endif
44
+
45
+ __BEGIN_DECLS
46
+ int RMD160_Init _((RMD160_CTX *));
47
+ void RMD160_Transform _((uint32_t[5], const uint32_t[16]));
48
+ void RMD160_Update _((RMD160_CTX *, const uint8_t *, size_t));
49
+ int RMD160_Finish _((RMD160_CTX *, uint8_t[20]));
50
+ __END_DECLS
51
+
52
+ #define RMD160_BLOCK_LENGTH 64
53
+ #define RMD160_DIGEST_LENGTH 20
54
+ #define RMD160_DIGEST_STRING_LENGTH (RMD160_DIGEST_LENGTH * 2 + 1)
55
+
56
+ #endif /* !_RMD160_H_ */
@@ -0,0 +1,60 @@
1
+ /* $RoughId: rmd160init.c,v 1.3 2001/07/13 20:00:43 knu Exp $ */
2
+ /* $Id$ */
3
+
4
+ #include <ruby/ruby.h>
5
+ #include "../digest.h"
6
+ #include "rmd160.h"
7
+
8
+ static const rb_digest_metadata_t rmd160 = {
9
+ RUBY_DIGEST_API_VERSION,
10
+ RMD160_DIGEST_LENGTH,
11
+ RMD160_BLOCK_LENGTH,
12
+ sizeof(RMD160_CTX),
13
+ (rb_digest_hash_init_func_t)RMD160_Init,
14
+ (rb_digest_hash_update_func_t)RMD160_Update,
15
+ (rb_digest_hash_finish_func_t)RMD160_Finish,
16
+ };
17
+
18
+ /*
19
+ * Document-class: Digest::RMD160 < Digest::Base
20
+ * A class for calculating message digests using RIPEMD-160
21
+ * cryptographic hash function, designed by Hans Dobbertin, Antoon
22
+ * Bosselaers, and Bart Preneel.
23
+ *
24
+ * RMD160 calculates a digest of 160 bits (20 bytes).
25
+ *
26
+ * == Examples
27
+ * require 'digest'
28
+ *
29
+ * # Compute a complete digest
30
+ * Digest::RMD160.hexdigest 'abc' #=> "8eb208f7..."
31
+ *
32
+ * # Compute digest by chunks
33
+ * rmd160 = Digest::RMD160.new # =>#<Digest::RMD160>
34
+ * rmd160.update "ab"
35
+ * rmd160 << "c" # alias for #update
36
+ * rmd160.hexdigest # => "8eb208f7..."
37
+ *
38
+ * # Use the same object to compute another digest
39
+ * rmd160.reset
40
+ * rmd160 << "message"
41
+ * rmd160.hexdigest # => "1dddbe1b..."
42
+ */
43
+ void
44
+ Init_rmd160(void)
45
+ {
46
+ VALUE mDigest, cDigest_Base, cDigest_RMD160;
47
+
48
+ #if 0
49
+ mDigest = rb_define_module("Digest"); /* let rdoc know */
50
+ #endif
51
+ mDigest = rb_digest_namespace();
52
+ cDigest_Base = rb_path2class("Digest::Base");
53
+
54
+ cDigest_RMD160 = rb_define_class_under(mDigest, "RMD160", cDigest_Base);
55
+
56
+ #undef RUBY_UNTYPED_DATA_WARNING
57
+ #define RUBY_UNTYPED_DATA_WARNING 0
58
+ rb_iv_set(cDigest_RMD160, "metadata",
59
+ Data_Wrap_Struct(0, 0, 0, (void *)&rmd160));
60
+ }
@@ -0,0 +1,19 @@
1
+ # -*- coding: us-ascii -*-
2
+ # frozen_string_literal: false
3
+ # $RoughId: extconf.rb,v 1.3 2001/08/14 19:54:51 knu Exp $
4
+ # $Id$
5
+
6
+ require "mkmf"
7
+ require File.expand_path("../../digest_conf", __FILE__)
8
+
9
+ $defs << "-DHAVE_CONFIG_H"
10
+
11
+ $objs = [ "sha1init.#{$OBJEXT}" ]
12
+
13
+ digest_conf("sha1")
14
+
15
+ have_header("sys/cdefs.h")
16
+
17
+ $preload = %w[digest]
18
+
19
+ create_makefile("digest/sha1")
@@ -0,0 +1,271 @@
1
+ /* $NetBSD: sha1.c,v 1.2 2001/03/22 09:51:48 agc Exp $ */
2
+ /* $OpenBSD: sha1.c,v 1.9 1997/07/23 21:12:32 kstailey Exp $ */
3
+ /* $RoughId: sha1.c,v 1.2 2001/07/13 19:49:10 knu Exp $ */
4
+ /* $Id$ */
5
+
6
+ /*
7
+ * SHA-1 in C
8
+ * By Steve Reid <steve@edmweb.com>
9
+ * 100% Public Domain
10
+ *
11
+ * Test Vectors (from FIPS PUB 180-1)
12
+ * "abc"
13
+ * A9993E36 4706816A BA3E2571 7850C26C 9CD0D89D
14
+ * "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"
15
+ * 84983E44 1C3BD26E BAAE4AA1 F95129E5 E54670F1
16
+ * A million repetitions of "a"
17
+ * 34AA973C D4C4DAA4 F61EEB2B DBAD2731 6534016F
18
+ */
19
+
20
+ #include "sha1.h"
21
+
22
+ #define SHA1HANDSOFF /* Copies data before messing with it. */
23
+
24
+ #if defined(_KERNEL) || defined(_STANDALONE)
25
+ #include <sys/param.h>
26
+ #include <sys/systm.h>
27
+ #define _DIAGASSERT(x) (void)0
28
+ #else
29
+ /* #include "namespace.h" */
30
+ #include <assert.h>
31
+ #include <string.h>
32
+ #endif
33
+
34
+ #ifndef _DIAGASSERT
35
+ #define _DIAGASSERT(cond) assert(cond)
36
+ #endif
37
+
38
+ /*
39
+ * XXX Kludge until there is resolution regarding mem*() functions
40
+ * XXX in the kernel.
41
+ */
42
+ #if defined(_KERNEL) || defined(_STANDALONE)
43
+ #define memcpy(s, d, l) bcopy((d), (s), (l))
44
+ #endif
45
+
46
+ #define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
47
+
48
+ /*
49
+ * blk0() and blk() perform the initial expand.
50
+ * I got the idea of expanding during the round function from SSLeay
51
+ */
52
+ #ifndef WORDS_BIGENDIAN
53
+ # define blk0(i) (block->l[i] = (rol(block->l[i],24)&0xFF00FF00) \
54
+ |(rol(block->l[i],8)&0x00FF00FF))
55
+ #else
56
+ # define blk0(i) block->l[i]
57
+ #endif
58
+ #define blk(i) (block->l[i&15] = rol(block->l[(i+13)&15]^block->l[(i+8)&15] \
59
+ ^block->l[(i+2)&15]^block->l[i&15],1))
60
+
61
+ /*
62
+ * (R0+R1), R2, R3, R4 are the different operations (rounds) used in SHA1
63
+ */
64
+ #define R0(v,w,x,y,z,i) z+=((w&(x^y))^y)+blk0(i)+0x5A827999+rol(v,5);w=rol(w,30);
65
+ #define R1(v,w,x,y,z,i) z+=((w&(x^y))^y)+blk(i)+0x5A827999+rol(v,5);w=rol(w,30);
66
+ #define R2(v,w,x,y,z,i) z+=(w^x^y)+blk(i)+0x6ED9EBA1+rol(v,5);w=rol(w,30);
67
+ #define R3(v,w,x,y,z,i) z+=(((w|x)&y)|(w&x))+blk(i)+0x8F1BBCDC+rol(v,5);w=rol(w,30);
68
+ #define R4(v,w,x,y,z,i) z+=(w^x^y)+blk(i)+0xCA62C1D6+rol(v,5);w=rol(w,30);
69
+
70
+
71
+ typedef union {
72
+ uint8_t c[64];
73
+ uint32_t l[16];
74
+ } CHAR64LONG16;
75
+
76
+ #ifdef __sparc_v9__
77
+ void do_R01(uint32_t *a, uint32_t *b, uint32_t *c, uint32_t *d, uint32_t *e, CHAR64LONG16 *);
78
+ void do_R2(uint32_t *a, uint32_t *b, uint32_t *c, uint32_t *d, uint32_t *e, CHAR64LONG16 *);
79
+ void do_R3(uint32_t *a, uint32_t *b, uint32_t *c, uint32_t *d, uint32_t *e, CHAR64LONG16 *);
80
+ void do_R4(uint32_t *a, uint32_t *b, uint32_t *c, uint32_t *d, uint32_t *e, CHAR64LONG16 *);
81
+
82
+ #define nR0(v,w,x,y,z,i) R0(*v,*w,*x,*y,*z,i)
83
+ #define nR1(v,w,x,y,z,i) R1(*v,*w,*x,*y,*z,i)
84
+ #define nR2(v,w,x,y,z,i) R2(*v,*w,*x,*y,*z,i)
85
+ #define nR3(v,w,x,y,z,i) R3(*v,*w,*x,*y,*z,i)
86
+ #define nR4(v,w,x,y,z,i) R4(*v,*w,*x,*y,*z,i)
87
+
88
+ void
89
+ do_R01(uint32_t *a, uint32_t *b, uint32_t *c, uint32_t *d, uint32_t *e, CHAR64LONG16 *block)
90
+ {
91
+ nR0(a,b,c,d,e, 0); nR0(e,a,b,c,d, 1); nR0(d,e,a,b,c, 2); nR0(c,d,e,a,b, 3);
92
+ nR0(b,c,d,e,a, 4); nR0(a,b,c,d,e, 5); nR0(e,a,b,c,d, 6); nR0(d,e,a,b,c, 7);
93
+ nR0(c,d,e,a,b, 8); nR0(b,c,d,e,a, 9); nR0(a,b,c,d,e,10); nR0(e,a,b,c,d,11);
94
+ nR0(d,e,a,b,c,12); nR0(c,d,e,a,b,13); nR0(b,c,d,e,a,14); nR0(a,b,c,d,e,15);
95
+ nR1(e,a,b,c,d,16); nR1(d,e,a,b,c,17); nR1(c,d,e,a,b,18); nR1(b,c,d,e,a,19);
96
+ }
97
+
98
+ void
99
+ do_R2(uint32_t *a, uint32_t *b, uint32_t *c, uint32_t *d, uint32_t *e, CHAR64LONG16 *block)
100
+ {
101
+ nR2(a,b,c,d,e,20); nR2(e,a,b,c,d,21); nR2(d,e,a,b,c,22); nR2(c,d,e,a,b,23);
102
+ nR2(b,c,d,e,a,24); nR2(a,b,c,d,e,25); nR2(e,a,b,c,d,26); nR2(d,e,a,b,c,27);
103
+ nR2(c,d,e,a,b,28); nR2(b,c,d,e,a,29); nR2(a,b,c,d,e,30); nR2(e,a,b,c,d,31);
104
+ nR2(d,e,a,b,c,32); nR2(c,d,e,a,b,33); nR2(b,c,d,e,a,34); nR2(a,b,c,d,e,35);
105
+ nR2(e,a,b,c,d,36); nR2(d,e,a,b,c,37); nR2(c,d,e,a,b,38); nR2(b,c,d,e,a,39);
106
+ }
107
+
108
+ void
109
+ do_R3(uint32_t *a, uint32_t *b, uint32_t *c, uint32_t *d, uint32_t *e, CHAR64LONG16 *block)
110
+ {
111
+ nR3(a,b,c,d,e,40); nR3(e,a,b,c,d,41); nR3(d,e,a,b,c,42); nR3(c,d,e,a,b,43);
112
+ nR3(b,c,d,e,a,44); nR3(a,b,c,d,e,45); nR3(e,a,b,c,d,46); nR3(d,e,a,b,c,47);
113
+ nR3(c,d,e,a,b,48); nR3(b,c,d,e,a,49); nR3(a,b,c,d,e,50); nR3(e,a,b,c,d,51);
114
+ nR3(d,e,a,b,c,52); nR3(c,d,e,a,b,53); nR3(b,c,d,e,a,54); nR3(a,b,c,d,e,55);
115
+ nR3(e,a,b,c,d,56); nR3(d,e,a,b,c,57); nR3(c,d,e,a,b,58); nR3(b,c,d,e,a,59);
116
+ }
117
+
118
+ void
119
+ do_R4(uint32_t *a, uint32_t *b, uint32_t *c, uint32_t *d, uint32_t *e, CHAR64LONG16 *block)
120
+ {
121
+ nR4(a,b,c,d,e,60); nR4(e,a,b,c,d,61); nR4(d,e,a,b,c,62); nR4(c,d,e,a,b,63);
122
+ nR4(b,c,d,e,a,64); nR4(a,b,c,d,e,65); nR4(e,a,b,c,d,66); nR4(d,e,a,b,c,67);
123
+ nR4(c,d,e,a,b,68); nR4(b,c,d,e,a,69); nR4(a,b,c,d,e,70); nR4(e,a,b,c,d,71);
124
+ nR4(d,e,a,b,c,72); nR4(c,d,e,a,b,73); nR4(b,c,d,e,a,74); nR4(a,b,c,d,e,75);
125
+ nR4(e,a,b,c,d,76); nR4(d,e,a,b,c,77); nR4(c,d,e,a,b,78); nR4(b,c,d,e,a,79);
126
+ }
127
+ #endif
128
+
129
+ /*
130
+ * Hash a single 512-bit block. This is the core of the algorithm.
131
+ */
132
+ void SHA1_Transform(uint32_t state[5], const uint8_t buffer[64])
133
+ {
134
+ uint32_t a, b, c, d, e;
135
+ CHAR64LONG16 *block;
136
+
137
+ #ifdef SHA1HANDSOFF
138
+ CHAR64LONG16 workspace;
139
+ #endif
140
+
141
+ _DIAGASSERT(buffer != 0);
142
+ _DIAGASSERT(state != 0);
143
+
144
+ #ifdef SHA1HANDSOFF
145
+ block = &workspace;
146
+ (void)memcpy(block, buffer, 64);
147
+ #else
148
+ block = (CHAR64LONG16 *)(void *)buffer;
149
+ #endif
150
+
151
+ /* Copy context->state[] to working vars */
152
+ a = state[0];
153
+ b = state[1];
154
+ c = state[2];
155
+ d = state[3];
156
+ e = state[4];
157
+
158
+ #ifdef __sparc_v9__
159
+ do_R01(&a, &b, &c, &d, &e, block);
160
+ do_R2(&a, &b, &c, &d, &e, block);
161
+ do_R3(&a, &b, &c, &d, &e, block);
162
+ do_R4(&a, &b, &c, &d, &e, block);
163
+ #else
164
+ /* 4 rounds of 20 operations each. Loop unrolled. */
165
+ R0(a,b,c,d,e, 0); R0(e,a,b,c,d, 1); R0(d,e,a,b,c, 2); R0(c,d,e,a,b, 3);
166
+ R0(b,c,d,e,a, 4); R0(a,b,c,d,e, 5); R0(e,a,b,c,d, 6); R0(d,e,a,b,c, 7);
167
+ R0(c,d,e,a,b, 8); R0(b,c,d,e,a, 9); R0(a,b,c,d,e,10); R0(e,a,b,c,d,11);
168
+ R0(d,e,a,b,c,12); R0(c,d,e,a,b,13); R0(b,c,d,e,a,14); R0(a,b,c,d,e,15);
169
+ R1(e,a,b,c,d,16); R1(d,e,a,b,c,17); R1(c,d,e,a,b,18); R1(b,c,d,e,a,19);
170
+ R2(a,b,c,d,e,20); R2(e,a,b,c,d,21); R2(d,e,a,b,c,22); R2(c,d,e,a,b,23);
171
+ R2(b,c,d,e,a,24); R2(a,b,c,d,e,25); R2(e,a,b,c,d,26); R2(d,e,a,b,c,27);
172
+ R2(c,d,e,a,b,28); R2(b,c,d,e,a,29); R2(a,b,c,d,e,30); R2(e,a,b,c,d,31);
173
+ R2(d,e,a,b,c,32); R2(c,d,e,a,b,33); R2(b,c,d,e,a,34); R2(a,b,c,d,e,35);
174
+ R2(e,a,b,c,d,36); R2(d,e,a,b,c,37); R2(c,d,e,a,b,38); R2(b,c,d,e,a,39);
175
+ R3(a,b,c,d,e,40); R3(e,a,b,c,d,41); R3(d,e,a,b,c,42); R3(c,d,e,a,b,43);
176
+ R3(b,c,d,e,a,44); R3(a,b,c,d,e,45); R3(e,a,b,c,d,46); R3(d,e,a,b,c,47);
177
+ R3(c,d,e,a,b,48); R3(b,c,d,e,a,49); R3(a,b,c,d,e,50); R3(e,a,b,c,d,51);
178
+ R3(d,e,a,b,c,52); R3(c,d,e,a,b,53); R3(b,c,d,e,a,54); R3(a,b,c,d,e,55);
179
+ R3(e,a,b,c,d,56); R3(d,e,a,b,c,57); R3(c,d,e,a,b,58); R3(b,c,d,e,a,59);
180
+ R4(a,b,c,d,e,60); R4(e,a,b,c,d,61); R4(d,e,a,b,c,62); R4(c,d,e,a,b,63);
181
+ R4(b,c,d,e,a,64); R4(a,b,c,d,e,65); R4(e,a,b,c,d,66); R4(d,e,a,b,c,67);
182
+ R4(c,d,e,a,b,68); R4(b,c,d,e,a,69); R4(a,b,c,d,e,70); R4(e,a,b,c,d,71);
183
+ R4(d,e,a,b,c,72); R4(c,d,e,a,b,73); R4(b,c,d,e,a,74); R4(a,b,c,d,e,75);
184
+ R4(e,a,b,c,d,76); R4(d,e,a,b,c,77); R4(c,d,e,a,b,78); R4(b,c,d,e,a,79);
185
+ #endif
186
+
187
+ /* Add the working vars back into context.state[] */
188
+ state[0] += a;
189
+ state[1] += b;
190
+ state[2] += c;
191
+ state[3] += d;
192
+ state[4] += e;
193
+
194
+ /* Wipe variables */
195
+ a = b = c = d = e = 0;
196
+ }
197
+
198
+
199
+ /*
200
+ * SHA1_Init - Initialize new context
201
+ */
202
+ int SHA1_Init(SHA1_CTX *context)
203
+ {
204
+
205
+ _DIAGASSERT(context != 0);
206
+
207
+ /* SHA1 initialization constants */
208
+ context->state[0] = 0x67452301;
209
+ context->state[1] = 0xEFCDAB89;
210
+ context->state[2] = 0x98BADCFE;
211
+ context->state[3] = 0x10325476;
212
+ context->state[4] = 0xC3D2E1F0;
213
+ context->count[0] = context->count[1] = 0;
214
+ return 1;
215
+ }
216
+
217
+
218
+ /*
219
+ * Run your data through this.
220
+ */
221
+ void SHA1_Update(SHA1_CTX *context, const uint8_t *data, size_t len)
222
+ {
223
+ uint32_t i, j;
224
+
225
+ _DIAGASSERT(context != 0);
226
+ _DIAGASSERT(data != 0);
227
+
228
+ j = context->count[0];
229
+ if ((context->count[0] += len << 3) < j)
230
+ context->count[1] += (len>>29)+1;
231
+ j = (j >> 3) & 63;
232
+ if ((j + len) > 63) {
233
+ (void)memcpy(&context->buffer[j], data, (i = 64-j));
234
+ SHA1_Transform(context->state, context->buffer);
235
+ for ( ; i + 63 < len; i += 64)
236
+ SHA1_Transform(context->state, &data[i]);
237
+ j = 0;
238
+ } else {
239
+ i = 0;
240
+ }
241
+ (void)memcpy(&context->buffer[j], &data[i], len - i);
242
+ }
243
+
244
+
245
+ /*
246
+ * Add padding and return the message digest.
247
+ */
248
+ int SHA1_Finish(SHA1_CTX* context, uint8_t digest[20])
249
+ {
250
+ size_t i;
251
+ uint8_t finalcount[8];
252
+
253
+ _DIAGASSERT(digest != 0);
254
+ _DIAGASSERT(context != 0);
255
+
256
+ for (i = 0; i < 8; i++) {
257
+ finalcount[i] = (uint8_t)((context->count[(i >= 4 ? 0 : 1)]
258
+ >> ((3-(i & 3)) * 8) ) & 255); /* Endian independent */
259
+ }
260
+ SHA1_Update(context, (const uint8_t *)"\200", 1);
261
+ while ((context->count[0] & 504) != 448)
262
+ SHA1_Update(context, (const uint8_t *)"\0", 1);
263
+ SHA1_Update(context, finalcount, 8); /* Should cause a SHA1_Transform() */
264
+
265
+ if (digest) {
266
+ for (i = 0; i < 20; i++)
267
+ digest[i] = (uint8_t)
268
+ ((context->state[i>>2] >> ((3-(i & 3)) * 8) ) & 255);
269
+ }
270
+ return 1;
271
+ }
@@ -0,0 +1,39 @@
1
+ /* $NetBSD: sha1.h,v 1.2 1998/05/29 22:55:44 thorpej Exp $ */
2
+ /* $RoughId: sha1.h,v 1.3 2002/02/24 08:14:32 knu Exp $ */
3
+ /* $Id$ */
4
+
5
+ /*
6
+ * SHA-1 in C
7
+ * By Steve Reid <steve@edmweb.com>
8
+ * 100% Public Domain
9
+ */
10
+
11
+ #ifndef _SYS_SHA1_H_
12
+ #define _SYS_SHA1_H_
13
+
14
+ #include "../defs.h"
15
+
16
+ typedef struct {
17
+ uint32_t state[5];
18
+ uint32_t count[2];
19
+ uint8_t buffer[64];
20
+ } SHA1_CTX;
21
+
22
+ #ifdef RUBY
23
+ /* avoid name clash */
24
+ #define SHA1_Transform rb_Digest_SHA1_Transform
25
+ #define SHA1_Init rb_Digest_SHA1_Init
26
+ #define SHA1_Update rb_Digest_SHA1_Update
27
+ #define SHA1_Finish rb_Digest_SHA1_Finish
28
+ #endif
29
+
30
+ void SHA1_Transform _((uint32_t state[5], const uint8_t buffer[64]));
31
+ int SHA1_Init _((SHA1_CTX *context));
32
+ void SHA1_Update _((SHA1_CTX *context, const uint8_t *data, size_t len));
33
+ int SHA1_Finish _((SHA1_CTX *context, uint8_t digest[20]));
34
+
35
+ #define SHA1_BLOCK_LENGTH 64
36
+ #define SHA1_DIGEST_LENGTH 20
37
+ #define SHA1_DIGEST_STRING_LENGTH (SHA1_DIGEST_LENGTH * 2 + 1)
38
+
39
+ #endif /* _SYS_SHA1_H_ */