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.
- checksums.yaml +7 -0
- data/.gitignore +12 -0
- data/.travis.yml +8 -0
- data/Gemfile +6 -0
- data/LICENSE.txt +22 -0
- data/README.md +97 -0
- data/Rakefile +15 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/digest.gemspec +45 -0
- data/ext/digest/bubblebabble/bubblebabble.c +147 -0
- data/ext/digest/bubblebabble/extconf.rb +6 -0
- data/ext/digest/defs.h +19 -0
- data/ext/digest/digest.c +821 -0
- data/ext/digest/digest.h +64 -0
- data/ext/digest/digest_conf.rb +17 -0
- data/ext/digest/extconf.rb +11 -0
- data/ext/digest/md5/extconf.rb +19 -0
- data/ext/digest/md5/md5.c +424 -0
- data/ext/digest/md5/md5.h +80 -0
- data/ext/digest/md5/md5cc.h +19 -0
- data/ext/digest/md5/md5init.c +64 -0
- data/ext/digest/rmd160/extconf.rb +19 -0
- data/ext/digest/rmd160/rmd160.c +463 -0
- data/ext/digest/rmd160/rmd160.h +56 -0
- data/ext/digest/rmd160/rmd160init.c +60 -0
- data/ext/digest/sha1/extconf.rb +19 -0
- data/ext/digest/sha1/sha1.c +271 -0
- data/ext/digest/sha1/sha1.h +39 -0
- data/ext/digest/sha1/sha1cc.h +14 -0
- data/ext/digest/sha1/sha1init.c +66 -0
- data/ext/digest/sha2/extconf.rb +21 -0
- data/ext/digest/sha2/lib/sha2.rb +142 -0
- data/ext/digest/sha2/sha2.c +1081 -0
- data/ext/digest/sha2/sha2.h +225 -0
- data/ext/digest/sha2/sha2cc.h +31 -0
- data/ext/digest/sha2/sha2init.c +55 -0
- data/ext/digest/test.sh +30 -0
- data/ext/openssl/deprecation.rb +23 -0
- data/lib/digest.rb +109 -0
- metadata +132 -0
@@ -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_ */
|