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,225 @@
1
+ /*
2
+ * FILE: sha2.h
3
+ * AUTHOR: Aaron D. Gifford - http://www.aarongifford.com/
4
+ *
5
+ * Copyright (c) 2000-2001, Aaron D. Gifford
6
+ * All rights reserved.
7
+ *
8
+ * Redistribution and use in source and binary forms, with or without
9
+ * modification, are permitted provided that the following conditions
10
+ * are met:
11
+ * 1. Redistributions of source code must retain the above copyright
12
+ * notice, this list of conditions and the following disclaimer.
13
+ * 2. Redistributions in binary form must reproduce the above copyright
14
+ * notice, this list of conditions and the following disclaimer in the
15
+ * documentation and/or other materials provided with the distribution.
16
+ * 3. Neither the name of the copyright holder nor the names of contributors
17
+ * may be used to endorse or promote products derived from this software
18
+ * without specific prior written permission.
19
+ *
20
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTOR(S) ``AS IS'' AND
21
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTOR(S) BE LIABLE
24
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30
+ * SUCH DAMAGE.
31
+ *
32
+ * $OrigId: sha2.h,v 1.1 2001/11/08 00:02:01 adg Exp adg $
33
+ * $RoughId: sha2.h,v 1.3 2002/02/24 08:14:32 knu Exp $
34
+ * $Id$
35
+ */
36
+
37
+ #ifndef __SHA2_H__
38
+ #define __SHA2_H__
39
+
40
+ #ifdef __cplusplus
41
+ extern "C" {
42
+ #endif
43
+
44
+
45
+ /*
46
+ * Import u_intXX_t size_t type definitions from system headers. You
47
+ * may need to change this, or define these things yourself in this
48
+ * file.
49
+ */
50
+ #include <sys/types.h>
51
+
52
+ #ifdef RUBY
53
+ # ifdef HAVE_PROTOTYPES
54
+ # undef NOPROTO
55
+ # else
56
+ # define NOPROTO
57
+ # endif /* HAVE_PROTOTYPES */
58
+ # ifndef BYTE_ORDER
59
+ # define LITTLE_ENDIAN 1234
60
+ # define BIG_ENDIAN 4321
61
+ # ifdef WORDS_BIGENDIAN
62
+ # define BYTE_ORDER BIG_ENDIAN
63
+ # else
64
+ # define BYTE_ORDER LITTLE_ENDIAN
65
+ # endif
66
+ # endif /* BYTE_ORDER */
67
+ # define SHA2_USE_INTTYPES_H
68
+ #else /* RUBY */
69
+ #ifdef SHA2_USE_INTTYPES_H
70
+
71
+ #include <inttypes.h>
72
+
73
+ #endif /* SHA2_USE_INTTYPES_H */
74
+ #endif /* RUBY */
75
+
76
+
77
+ /*** SHA-256/384/512 Various Length Definitions ***********************/
78
+ #define SHA256_BLOCK_LENGTH 64
79
+ #define SHA256_DIGEST_LENGTH 32
80
+ #define SHA256_DIGEST_STRING_LENGTH (SHA256_DIGEST_LENGTH * 2 + 1)
81
+ #define SHA384_BLOCK_LENGTH 128
82
+ #define SHA384_DIGEST_LENGTH 48
83
+ #define SHA384_DIGEST_STRING_LENGTH (SHA384_DIGEST_LENGTH * 2 + 1)
84
+ #define SHA512_BLOCK_LENGTH 128
85
+ #define SHA512_DIGEST_LENGTH 64
86
+ #define SHA512_DIGEST_STRING_LENGTH (SHA512_DIGEST_LENGTH * 2 + 1)
87
+
88
+
89
+ /*** SHA-256/384/512 Context Structures *******************************/
90
+ /* NOTE: If your architecture does not define either u_intXX_t types or
91
+ * uintXX_t (from inttypes.h), you may need to define things by hand
92
+ * for your system:
93
+ */
94
+ #ifndef SHA2_USE_INTTYPES_H
95
+ # ifdef HAVE_U_INT8_T
96
+ typedef u_int8_t uint8_t; /* 1-byte (8-bits) */
97
+ typedef u_int32_t uint32_t; /* 4-bytes (32-bits) */
98
+ typedef u_int64_t uint64_t; /* 8-bytes (64-bits) */
99
+ # else
100
+ typedef unsigned char uint8_t; /* 1-byte (8-bits) */
101
+ typedef unsigned int uint32_t; /* 4-bytes (32-bits) */
102
+ typedef unsigned long long uint64_t; /* 8-bytes (64-bits) */
103
+ # endif
104
+ #endif
105
+
106
+ /*
107
+ * Most BSD systems already define u_intXX_t types, as does Linux.
108
+ * Some systems, however, like Compaq's Tru64 Unix instead can use
109
+ * uintXX_t types defined by very recent ANSI C standards and included
110
+ * in the file:
111
+ *
112
+ * #include <inttypes.h>
113
+ *
114
+ * If you choose to use <inttypes.h> then please define:
115
+ *
116
+ * #define SHA2_USE_INTTYPES_H
117
+ *
118
+ * Or on the command line during compile:
119
+ *
120
+ * cc -DSHA2_USE_INTTYPES_H ...
121
+ */
122
+ typedef struct _SHA256_CTX {
123
+ uint32_t state[8];
124
+ uint64_t bitcount;
125
+ uint8_t buffer[SHA256_BLOCK_LENGTH];
126
+ } SHA256_CTX;
127
+ typedef struct _SHA512_CTX {
128
+ uint64_t state[8];
129
+ uint64_t bitcount[2];
130
+ uint8_t buffer[SHA512_BLOCK_LENGTH];
131
+ } SHA512_CTX;
132
+
133
+ typedef SHA512_CTX SHA384_CTX;
134
+
135
+
136
+ /*** SHA-256/384/512 Function Prototypes ******************************/
137
+ #ifdef RUBY
138
+ #define SHA256_Init rb_Digest_SHA256_Init
139
+ #define SHA256_Update rb_Digest_SHA256_Update
140
+ #define SHA256_Finish rb_Digest_SHA256_Finish
141
+ #define SHA256_Data rb_Digest_SHA256_Data
142
+ #define SHA256_End rb_Digest_SHA256_End
143
+ #define SHA256_Last rb_Digest_SHA256_Last
144
+ #define SHA256_Transform rb_Digest_SHA256_Transform
145
+ #define SHA256_Final(d, c) SHA256_Finish(c, d)
146
+
147
+ #define SHA384_Init rb_Digest_SHA384_Init
148
+ #define SHA384_Update rb_Digest_SHA384_Update
149
+ #define SHA384_Finish rb_Digest_SHA384_Finish
150
+ #define SHA384_Data rb_Digest_SHA384_Data
151
+ #define SHA384_End rb_Digest_SHA384_End
152
+ #define SHA384_Last rb_Digest_SHA384_Last
153
+ #define SHA384_Transform rb_Digest_SHA384_Transform
154
+ #define SHA384_Final(d, c) SHA384_Finish(c, d)
155
+
156
+ #define SHA512_Init rb_Digest_SHA512_Init
157
+ #define SHA512_Update rb_Digest_SHA512_Update
158
+ #define SHA512_Finish rb_Digest_SHA512_Finish
159
+ #define SHA512_Data rb_Digest_SHA512_Data
160
+ #define SHA512_End rb_Digest_SHA512_End
161
+ #define SHA512_Last rb_Digest_SHA512_Last
162
+ #define SHA512_Transform rb_Digest_SHA512_Transform
163
+ #define SHA512_Final(d, c) SHA512_Finish(c, d)
164
+ #endif /* RUBY */
165
+
166
+ #ifndef NOPROTO
167
+
168
+ int SHA256_Init(SHA256_CTX *);
169
+ void SHA256_Update(SHA256_CTX*, const uint8_t*, size_t);
170
+ int SHA256_Final(uint8_t[SHA256_DIGEST_LENGTH], SHA256_CTX*);
171
+ char* SHA256_End(SHA256_CTX*, char[SHA256_DIGEST_STRING_LENGTH]);
172
+ char* SHA256_Data(const uint8_t*, size_t, char[SHA256_DIGEST_STRING_LENGTH]);
173
+
174
+ int SHA384_Init(SHA384_CTX*);
175
+ void SHA384_Update(SHA384_CTX*, const uint8_t*, size_t);
176
+ int SHA384_Final(uint8_t[SHA384_DIGEST_LENGTH], SHA384_CTX*);
177
+ char* SHA384_End(SHA384_CTX*, char[SHA384_DIGEST_STRING_LENGTH]);
178
+ char* SHA384_Data(const uint8_t*, size_t, char[SHA384_DIGEST_STRING_LENGTH]);
179
+
180
+ int SHA512_Init(SHA512_CTX*);
181
+ void SHA512_Update(SHA512_CTX*, const uint8_t*, size_t);
182
+ int SHA512_Final(uint8_t[SHA512_DIGEST_LENGTH], SHA512_CTX*);
183
+ char* SHA512_End(SHA512_CTX*, char[SHA512_DIGEST_STRING_LENGTH]);
184
+ char* SHA512_Data(const uint8_t*, size_t, char[SHA512_DIGEST_STRING_LENGTH]);
185
+
186
+ #else /* NOPROTO */
187
+
188
+ int SHA256_Init();
189
+ void SHA256_Update();
190
+ #ifdef RUBY
191
+ int SHA256_Finish();
192
+ #else
193
+ int SHA256_Final();
194
+ #endif /* RUBY */
195
+ char* SHA256_End();
196
+ char* SHA256_Data();
197
+
198
+ int SHA384_Init();
199
+ void SHA384_Update();
200
+ #ifdef RUBY
201
+ int SHA384_Finish();
202
+ #else
203
+ int SHA384_Final();
204
+ #endif /* RUBY */
205
+ char* SHA384_End();
206
+ char* SHA384_Data();
207
+
208
+ int SHA512_Init();
209
+ void SHA512_Update();
210
+ #ifdef RUBY
211
+ int SHA512_Finish();
212
+ #else
213
+ int SHA512_Final();
214
+ #endif /* RUBY */
215
+ char* SHA512_End();
216
+ char* SHA512_Data();
217
+
218
+ #endif /* NOPROTO */
219
+
220
+ #ifdef __cplusplus
221
+ }
222
+ #endif /* __cplusplus */
223
+
224
+ #endif /* __SHA2_H__ */
225
+
@@ -0,0 +1,31 @@
1
+ #define COMMON_DIGEST_FOR_OPENSSL 1
2
+ #include <CommonCrypto/CommonDigest.h>
3
+
4
+ #define SHA256_BLOCK_LENGTH CC_SHA256_BLOCK_BYTES
5
+ #define SHA384_BLOCK_LENGTH CC_SHA384_BLOCK_BYTES
6
+ #define SHA512_BLOCK_LENGTH CC_SHA512_BLOCK_BYTES
7
+
8
+ #define SHA384_CTX CC_SHA512_CTX
9
+
10
+ static DEFINE_UPDATE_FUNC_FOR_UINT(SHA256)
11
+ static DEFINE_FINISH_FUNC_FROM_FINAL(SHA256)
12
+ static DEFINE_UPDATE_FUNC_FOR_UINT(SHA384)
13
+ static DEFINE_FINISH_FUNC_FROM_FINAL(SHA384)
14
+ static DEFINE_UPDATE_FUNC_FOR_UINT(SHA512)
15
+ static DEFINE_FINISH_FUNC_FROM_FINAL(SHA512)
16
+
17
+
18
+ #undef SHA256_Update
19
+ #undef SHA256_Finish
20
+ #define SHA256_Update rb_digest_SHA256_update
21
+ #define SHA256_Finish rb_digest_SHA256_finish
22
+
23
+ #undef SHA384_Update
24
+ #undef SHA384_Finish
25
+ #define SHA384_Update rb_digest_SHA384_update
26
+ #define SHA384_Finish rb_digest_SHA384_finish
27
+
28
+ #undef SHA512_Update
29
+ #undef SHA512_Finish
30
+ #define SHA512_Update rb_digest_SHA512_update
31
+ #define SHA512_Finish rb_digest_SHA512_finish
@@ -0,0 +1,55 @@
1
+ /* $RoughId: sha2init.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
+ #if defined(SHA2_USE_COMMONDIGEST)
7
+ #include "sha2cc.h"
8
+ #else
9
+ #include "sha2.h"
10
+ #endif
11
+
12
+ #define FOREACH_BITLEN(func) func(256) func(384) func(512)
13
+
14
+ #define DEFINE_ALGO_METADATA(bitlen) \
15
+ static const rb_digest_metadata_t sha##bitlen = { \
16
+ RUBY_DIGEST_API_VERSION, \
17
+ SHA##bitlen##_DIGEST_LENGTH, \
18
+ SHA##bitlen##_BLOCK_LENGTH, \
19
+ sizeof(SHA##bitlen##_CTX), \
20
+ (rb_digest_hash_init_func_t)SHA##bitlen##_Init, \
21
+ (rb_digest_hash_update_func_t)SHA##bitlen##_Update, \
22
+ (rb_digest_hash_finish_func_t)SHA##bitlen##_Finish, \
23
+ };
24
+
25
+ FOREACH_BITLEN(DEFINE_ALGO_METADATA)
26
+
27
+ /*
28
+ * Classes for calculating message digests using the SHA-256/384/512
29
+ * Secure Hash Algorithm(s) by NIST (the US' National Institute of
30
+ * Standards and Technology), described in FIPS PUB 180-2.
31
+ */
32
+ void
33
+ Init_sha2(void)
34
+ {
35
+ VALUE mDigest, cDigest_Base;
36
+ ID id_metadata = rb_id_metadata();
37
+
38
+ #define DECLARE_ALGO_CLASS(bitlen) \
39
+ VALUE cDigest_SHA##bitlen;
40
+
41
+ FOREACH_BITLEN(DECLARE_ALGO_CLASS)
42
+
43
+ mDigest = rb_digest_namespace();
44
+ cDigest_Base = rb_path2class("Digest::Base");
45
+
46
+ #define DEFINE_ALGO_CLASS(bitlen) \
47
+ cDigest_SHA##bitlen = rb_define_class_under(mDigest, "SHA" #bitlen, cDigest_Base); \
48
+ \
49
+ rb_ivar_set(cDigest_SHA##bitlen, id_metadata, \
50
+ Data_Wrap_Struct(0, 0, 0, (void *)&sha##bitlen));
51
+
52
+ #undef RUBY_UNTYPED_DATA_WARNING
53
+ #define RUBY_UNTYPED_DATA_WARNING 0
54
+ FOREACH_BITLEN(DEFINE_ALGO_CLASS)
55
+ }
@@ -0,0 +1,30 @@
1
+ #!/bin/sh
2
+ #
3
+ # $RoughId: test.sh,v 1.5 2001/07/13 15:38:27 knu Exp $
4
+ # $Id$
5
+
6
+ RUBY=${RUBY:=ruby}
7
+ MAKE=${MAKE:=make}
8
+ CFLAGS=${CFLAGS:=-Wall}
9
+
10
+ ${RUBY} extconf.rb --with-cflags="${CFLAGS}"
11
+ ${MAKE} clean
12
+ ${MAKE}
13
+
14
+ for algo in md5 rmd160 sha1 sha2; do
15
+ args=--with-cflags="${CFLAGS}"
16
+
17
+ if [ $WITH_BUNDLED_ENGINES ]; then
18
+ args="$args --with-bundled-$algo"
19
+ fi
20
+
21
+ (cd $algo &&
22
+ ${RUBY} extconf.rb $args;
23
+ ${MAKE} clean;
24
+ ${MAKE})
25
+ ln -sf ../../$algo/$algo.so lib/digest/
26
+ done
27
+
28
+ ${RUBY} -I. -I./lib ../../test/digest/test_digest.rb
29
+
30
+ rm lib/digest/*.so
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: false
2
+ module OpenSSL
3
+ def self.deprecated_warning_flag
4
+ unless flag = (@deprecated_warning_flag ||= nil)
5
+ if try_compile("", flag = "-Werror=deprecated-declarations")
6
+ $warnflags << " #{flag}"
7
+ else
8
+ flag = ""
9
+ end
10
+ @deprecated_warning_flag = flag
11
+ end
12
+ flag
13
+ end
14
+
15
+ def self.check_func(func, header)
16
+ have_func(func, header, deprecated_warning_flag)
17
+ end
18
+
19
+ def self.check_func_or_macro(func, header)
20
+ check_func(func, header) or
21
+ have_macro(func, header) && $defs.push("-DHAVE_#{func.upcase}")
22
+ end
23
+ end
@@ -0,0 +1,109 @@
1
+ # frozen_string_literal: false
2
+ require 'digest.so'
3
+
4
+ module Digest
5
+ # A mutex for Digest().
6
+ REQUIRE_MUTEX = Thread::Mutex.new
7
+
8
+ def self.const_missing(name) # :nodoc:
9
+ case name
10
+ when :SHA256, :SHA384, :SHA512
11
+ lib = 'digest/sha2.so'
12
+ else
13
+ lib = File.join('digest', name.to_s.downcase)
14
+ end
15
+
16
+ begin
17
+ require lib
18
+ rescue LoadError
19
+ raise LoadError, "library not found for class Digest::#{name} -- #{lib}", caller(1)
20
+ end
21
+ unless Digest.const_defined?(name)
22
+ raise NameError, "uninitialized constant Digest::#{name}", caller(1)
23
+ end
24
+ Digest.const_get(name)
25
+ end
26
+
27
+ class ::Digest::Class
28
+ # Creates a digest object and reads a given file, _name_.
29
+ # Optional arguments are passed to the constructor of the digest
30
+ # class.
31
+ #
32
+ # p Digest::SHA256.file("X11R6.8.2-src.tar.bz2").hexdigest
33
+ # # => "f02e3c85572dc9ad7cb77c2a638e3be24cc1b5bea9fdbb0b0299c9668475c534"
34
+ def self.file(name, *args)
35
+ new(*args).file(name)
36
+ end
37
+
38
+ # Returns the base64 encoded hash value of a given _string_. The
39
+ # return value is properly padded with '=' and contains no line
40
+ # feeds.
41
+ def self.base64digest(str, *args)
42
+ [digest(str, *args)].pack('m0')
43
+ end
44
+ end
45
+
46
+ module Instance
47
+ # Updates the digest with the contents of a given file _name_ and
48
+ # returns self.
49
+ def file(name)
50
+ File.open(name, "rb") {|f|
51
+ buf = ""
52
+ while f.read(16384, buf)
53
+ update buf
54
+ end
55
+ }
56
+ self
57
+ end
58
+
59
+ # If none is given, returns the resulting hash value of the digest
60
+ # in a base64 encoded form, keeping the digest's state.
61
+ #
62
+ # If a +string+ is given, returns the hash value for the given
63
+ # +string+ in a base64 encoded form, resetting the digest to the
64
+ # initial state before and after the process.
65
+ #
66
+ # In either case, the return value is properly padded with '=' and
67
+ # contains no line feeds.
68
+ def base64digest(str = nil)
69
+ [str ? digest(str) : digest].pack('m0')
70
+ end
71
+
72
+ # Returns the resulting hash value and resets the digest to the
73
+ # initial state.
74
+ def base64digest!
75
+ [digest!].pack('m0')
76
+ end
77
+ end
78
+ end
79
+
80
+ # call-seq:
81
+ # Digest(name) -> digest_subclass
82
+ #
83
+ # Returns a Digest subclass by +name+ in a thread-safe manner even
84
+ # when on-demand loading is involved.
85
+ #
86
+ # require 'digest'
87
+ #
88
+ # Digest("MD5")
89
+ # # => Digest::MD5
90
+ #
91
+ # Digest(:SHA256)
92
+ # # => Digest::SHA256
93
+ #
94
+ # Digest(:Foo)
95
+ # # => LoadError: library not found for class Digest::Foo -- digest/foo
96
+ def Digest(name)
97
+ const = name.to_sym
98
+ Digest::REQUIRE_MUTEX.synchronize {
99
+ # Ignore autoload's because it is void when we have #const_missing
100
+ Digest.const_missing(const)
101
+ }
102
+ rescue LoadError
103
+ # Constants do not necessarily rely on digest/*.
104
+ if Digest.const_defined?(const)
105
+ Digest.const_get(const)
106
+ else
107
+ raise
108
+ end
109
+ end