ray 0.0.1 → 0.1.0.pre1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (188) hide show
  1. data/.gemtest +0 -0
  2. data/.yardopts +4 -0
  3. data/README.md +17 -21
  4. data/Rakefile +18 -139
  5. data/VERSION +1 -1
  6. data/ext/audio.cpp +723 -0
  7. data/ext/{color.c → color.cpp} +25 -13
  8. data/ext/drawable.cpp +91 -0
  9. data/ext/event.cpp +460 -0
  10. data/ext/extconf.rb +5 -104
  11. data/ext/font.cpp +190 -0
  12. data/ext/image.cpp +733 -0
  13. data/ext/input.cpp +74 -0
  14. data/ext/ray.cpp +168 -0
  15. data/ext/ray.hpp +356 -0
  16. data/ext/{rect.c → rect.cpp} +51 -37
  17. data/ext/shader.cpp +169 -0
  18. data/ext/shape.cpp +409 -0
  19. data/ext/sprite.cpp +306 -0
  20. data/ext/text.cpp +181 -0
  21. data/ext/vector.cpp +215 -0
  22. data/guide.md +619 -0
  23. data/lib/ray/audio.rb +0 -41
  24. data/lib/ray/color.rb +32 -10
  25. data/lib/ray/drawable.rb +16 -0
  26. data/lib/ray/dsl/event_listener.rb +25 -2
  27. data/lib/ray/dsl/event_runner.rb +33 -5
  28. data/lib/ray/dsl/event_translator.rb +66 -30
  29. data/lib/ray/dsl/handler.rb +3 -2
  30. data/lib/ray/dsl/matcher.rb +58 -14
  31. data/lib/ray/font.rb +38 -96
  32. data/lib/ray/font_set.rb +8 -8
  33. data/lib/ray/game.rb +87 -66
  34. data/lib/ray/helper.rb +105 -10
  35. data/lib/ray/image.rb +150 -24
  36. data/lib/ray/image_set.rb +3 -1
  37. data/lib/ray/input.rb +10 -0
  38. data/lib/ray/music_set.rb +5 -3
  39. data/lib/ray/ray.rb +21 -9
  40. data/lib/ray/rect.rb +48 -7
  41. data/lib/ray/rmagick.rb +41 -0
  42. data/lib/ray/scene.rb +99 -43
  43. data/lib/ray/scene_list.rb +67 -0
  44. data/lib/ray/shape.rb +132 -0
  45. data/lib/ray/sound_set.rb +4 -2
  46. data/lib/ray/sprite.rb +49 -111
  47. data/lib/ray/text.rb +101 -0
  48. data/lib/ray/text_helper.rb +37 -0
  49. data/lib/ray/turtle.rb +215 -0
  50. data/lib/ray/vector.rb +226 -0
  51. data/samples/audio/spacial.rb +44 -0
  52. data/samples/hello_world/hello.rb +9 -13
  53. data/samples/hello_world/hello_dsl.rb +8 -12
  54. data/samples/hello_world/text.rb +15 -0
  55. data/samples/opengl/binding.rb +38 -0
  56. data/samples/opengl/image.rb +32 -0
  57. data/samples/opengl/opengl.rb +34 -0
  58. data/samples/opengl/shader.rb +42 -0
  59. data/samples/pong/pong.rb +14 -10
  60. data/samples/run_scene.rb +53 -0
  61. data/samples/shaders/scene.rb +40 -0
  62. data/samples/shaders/shaders.rb +42 -0
  63. data/samples/shaders/shape.rb +34 -0
  64. data/samples/sokoban/sokoban.rb +18 -18
  65. data/samples/test/actual_scene.rb +41 -0
  66. data/samples/test/scene_riot.rb +39 -0
  67. data/samples/test/scene_spec.rb +32 -0
  68. data/samples/test/scene_test_unit.rb +25 -0
  69. data/samples/turtle/byzantium.rb +45 -0
  70. data/samples/turtle/hilbert.rb +48 -0
  71. data/samples/turtle/koch.rb +55 -0
  72. data/samples/turtle/mandala.rb +61 -0
  73. data/samples/turtle/tree.rb +57 -0
  74. data/test/audio_test.rb +69 -0
  75. data/test/color_test.rb +77 -0
  76. data/test/drawable_test.rb +19 -0
  77. data/test/dsl_test.rb +93 -0
  78. data/test/font_test.rb +57 -0
  79. data/test/helpers.rb +94 -0
  80. data/test/image_test.rb +82 -0
  81. data/test/ray_test.rb +25 -0
  82. data/test/rect_test.rb +121 -0
  83. data/{spec → test}/res/VeraMono.ttf +0 -0
  84. data/{spec → test}/res/aqua.bmp +0 -0
  85. data/{spec → test}/res/aqua.png +0 -0
  86. data/{spec → test}/res/aqua2.bmp +0 -0
  87. data/{spec → test}/res/not_a_jpeg.jpeg +0 -0
  88. data/{spec → test}/res/pop.wav +0 -0
  89. data/test/resource_set_test.rb +99 -0
  90. data/test/run_all.rb +7 -0
  91. data/test/shape_test.rb +101 -0
  92. data/test/sprite_test.rb +89 -0
  93. data/test/text_test.rb +78 -0
  94. data/test/turtle_test.rb +176 -0
  95. data/test/vector_test.rb +111 -0
  96. data/yard_ext.rb +0 -28
  97. metadata +95 -139
  98. data/.gitignore +0 -23
  99. data/.gitmodules +0 -3
  100. data/.rspec +0 -3
  101. data/ext/audio.c +0 -473
  102. data/ext/event.c +0 -557
  103. data/ext/font.c +0 -287
  104. data/ext/image.c +0 -933
  105. data/ext/joystick.c +0 -145
  106. data/ext/ray.c +0 -489
  107. data/ext/ray.h +0 -245
  108. data/ext/ray_osx.m +0 -161
  109. data/lib/ray/joystick.rb +0 -30
  110. data/psp/SDL_psp_main.c +0 -84
  111. data/psp/bigdecimal/README +0 -60
  112. data/psp/bigdecimal/bigdecimal.c +0 -4697
  113. data/psp/bigdecimal/bigdecimal.h +0 -216
  114. data/psp/bigdecimal/lib/bigdecimal/jacobian.rb +0 -85
  115. data/psp/bigdecimal/lib/bigdecimal/ludcmp.rb +0 -84
  116. data/psp/bigdecimal/lib/bigdecimal/math.rb +0 -235
  117. data/psp/bigdecimal/lib/bigdecimal/newton.rb +0 -77
  118. data/psp/bigdecimal/lib/bigdecimal/util.rb +0 -65
  119. data/psp/digest/bubblebabble/bubblebabble.c +0 -142
  120. data/psp/digest/defs.h +0 -20
  121. data/psp/digest/digest.c +0 -643
  122. data/psp/digest/digest.h +0 -32
  123. data/psp/digest/lib/digest.rb +0 -50
  124. data/psp/digest/lib/md5.rb +0 -27
  125. data/psp/digest/lib/sha1.rb +0 -27
  126. data/psp/digest/md5/md5.c +0 -420
  127. data/psp/digest/md5/md5.h +0 -80
  128. data/psp/digest/md5/md5init.c +0 -40
  129. data/psp/digest/rmd160/rmd160.c +0 -457
  130. data/psp/digest/rmd160/rmd160.h +0 -56
  131. data/psp/digest/rmd160/rmd160init.c +0 -40
  132. data/psp/digest/sha1/sha1.c +0 -269
  133. data/psp/digest/sha1/sha1.h +0 -39
  134. data/psp/digest/sha1/sha1init.c +0 -40
  135. data/psp/digest/sha2/lib/sha2.rb +0 -73
  136. data/psp/digest/sha2/sha2.c +0 -919
  137. data/psp/digest/sha2/sha2.h +0 -109
  138. data/psp/digest/sha2/sha2init.c +0 -52
  139. data/psp/enumerator/enumerator.c +0 -298
  140. data/psp/etc/etc.c +0 -559
  141. data/psp/ext.c +0 -289
  142. data/psp/fcntl/fcntl.c +0 -187
  143. data/psp/lib/rbconfig.rb +0 -178
  144. data/psp/nkf/lib/kconv.rb +0 -367
  145. data/psp/nkf/nkf-utf8/config.h +0 -88
  146. data/psp/nkf/nkf-utf8/nkf.c +0 -6040
  147. data/psp/nkf/nkf-utf8/utf8tbl.c +0 -8500
  148. data/psp/nkf/nkf-utf8/utf8tbl.h +0 -34
  149. data/psp/nkf/nkf.c +0 -654
  150. data/psp/socket/addrinfo.h +0 -173
  151. data/psp/socket/getaddrinfo.c +0 -676
  152. data/psp/socket/getnameinfo.c +0 -270
  153. data/psp/socket/pspsocket.c +0 -71
  154. data/psp/socket/pspsocket.h +0 -28
  155. data/psp/socket/socket.c +0 -4662
  156. data/psp/socket/sockport.h +0 -76
  157. data/psp/stringio/stringio.c +0 -1306
  158. data/psp/strscan/strscan.c +0 -1320
  159. data/psp/syck/bytecode.c +0 -1166
  160. data/psp/syck/emitter.c +0 -1242
  161. data/psp/syck/gram.c +0 -1894
  162. data/psp/syck/gram.h +0 -79
  163. data/psp/syck/handler.c +0 -174
  164. data/psp/syck/implicit.c +0 -2990
  165. data/psp/syck/node.c +0 -408
  166. data/psp/syck/rubyext.c +0 -2367
  167. data/psp/syck/syck.c +0 -504
  168. data/psp/syck/syck.h +0 -456
  169. data/psp/syck/token.c +0 -2725
  170. data/psp/syck/yaml2byte.c +0 -257
  171. data/psp/syck/yamlbyte.h +0 -170
  172. data/psp/thread/thread.c +0 -1175
  173. data/psp/zlib/zlib.c +0 -3547
  174. data/script.rb +0 -10
  175. data/spec/ray/audio_spec.rb +0 -146
  176. data/spec/ray/color_spec.rb +0 -57
  177. data/spec/ray/event_spec.rb +0 -80
  178. data/spec/ray/font_spec.rb +0 -93
  179. data/spec/ray/image_set_spec.rb +0 -48
  180. data/spec/ray/image_spec.rb +0 -162
  181. data/spec/ray/joystick_spec.rb +0 -21
  182. data/spec/ray/matcher_spec.rb +0 -50
  183. data/spec/ray/ray_spec.rb +0 -88
  184. data/spec/ray/rect_spec.rb +0 -154
  185. data/spec/ray/resource_set_spec.rb +0 -105
  186. data/spec/ray/sprite_spec.rb +0 -163
  187. data/spec/spec.opts +0 -4
  188. data/spec/spec_helper.rb +0 -8
@@ -1,919 +0,0 @@
1
- /*
2
- * sha2.c
3
- *
4
- * Version 1.0.0beta1
5
- *
6
- * Written by Aaron D. Gifford <me@aarongifford.com>
7
- *
8
- * Copyright 2000 Aaron D. Gifford. All rights reserved.
9
- *
10
- * Redistribution and use in source and binary forms, with or without
11
- * modification, are permitted provided that the following conditions
12
- * are met:
13
- * 1. Redistributions of source code must retain the above copyright
14
- * notice, this list of conditions and the following disclaimer.
15
- * 2. Redistributions in binary form must reproduce the above copyright
16
- * notice, this list of conditions and the following disclaimer in the
17
- * documentation and/or other materials provided with the distribution.
18
- * 3. Neither the name of the copyright holder nor the names of contributors
19
- * may be used to endorse or promote products derived from this software
20
- * without specific prior written permission.
21
- *
22
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) AND CONTRIBUTOR(S) ``AS IS'' AND
23
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR(S) OR CONTRIBUTOR(S) BE LIABLE
26
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32
- * SUCH DAMAGE.
33
- *
34
- */
35
-
36
- /* $RoughId: sha2.c,v 1.3 2002/02/26 22:03:36 knu Exp $ */
37
- /* $Id: sha2.c 11708 2007-02-12 23:01:19Z shyouhei $ */
38
-
39
- #include "sha2.h"
40
- #include <stdio.h>
41
- #include <string.h> /* memcpy()/memset() or bcopy()/bzero() */
42
- #include <assert.h> /* assert() */
43
-
44
- /*
45
- * ASSERT NOTE:
46
- * Some sanity checking code is included using assert(). On my FreeBSD
47
- * system, this additional code can be removed by compiling with NDEBUG
48
- * defined. Check your own systems manpage on assert() to see how to
49
- * compile WITHOUT the sanity checking code on your system.
50
- *
51
- * UNROLLED TRANSFORM LOOP NOTE:
52
- * You can define SHA2_UNROLL_TRANSFORM to use the unrolled transform
53
- * loop version for the hash transform rounds (defined using macros
54
- * later in this file). Either define on the command line, for example:
55
- *
56
- * cc -DSHA2_UNROLL_TRANSFORM -o sha2 sha2.c sha2prog.c
57
- *
58
- * or define below:
59
- *
60
- * #define SHA2_UNROLL_TRANSFORM
61
- *
62
- */
63
-
64
-
65
- /*** SHA-256/384/512 Machine Architecture Definitions *****************/
66
- typedef uint8_t sha2_byte; /* Exactly 1 byte */
67
- typedef uint32_t sha2_word32; /* Exactly 4 bytes */
68
- typedef uint64_t sha2_word64; /* Exactly 8 bytes */
69
-
70
- #if defined(__GNUC__) || defined(_HPUX_SOURCE) || defined(__IBMC__)
71
- #define ULL(number) number##ULL
72
- #else
73
- #define ULL(number) (uint64_t)(number)
74
- #endif
75
-
76
-
77
- /*** SHA-256/384/512 Various Length Definitions ***********************/
78
- /* NOTE: Most of these are in sha2.h */
79
- #define SHA256_SHORT_BLOCK_LENGTH (SHA256_BLOCK_LENGTH - 8)
80
- #define SHA384_SHORT_BLOCK_LENGTH (SHA384_BLOCK_LENGTH - 16)
81
- #define SHA512_SHORT_BLOCK_LENGTH (SHA512_BLOCK_LENGTH - 16)
82
-
83
-
84
- /*** ENDIAN REVERSAL MACROS *******************************************/
85
- #ifndef WORDS_BIGENDIAN
86
- #define REVERSE32(w,x) { \
87
- sha2_word32 tmp = (w); \
88
- tmp = (tmp >> 16) | (tmp << 16); \
89
- (x) = ((tmp & 0xff00ff00UL) >> 8) | ((tmp & 0x00ff00ffUL) << 8); \
90
- }
91
- #define REVERSE64(w,x) { \
92
- sha2_word64 tmp = (w); \
93
- tmp = (tmp >> 32) | (tmp << 32); \
94
- tmp = ((tmp & ULL(0xff00ff00ff00ff00)) >> 8) | \
95
- ((tmp & ULL(0x00ff00ff00ff00ff)) << 8); \
96
- (x) = ((tmp & ULL(0xffff0000ffff0000)) >> 16) | \
97
- ((tmp & ULL(0x0000ffff0000ffff)) << 16); \
98
- }
99
- #endif
100
-
101
- /*
102
- * Macro for incrementally adding the unsigned 64-bit integer n to the
103
- * unsigned 128-bit integer (represented using a two-element array of
104
- * 64-bit words):
105
- */
106
- #define ADDINC128(w,n) { \
107
- (w)[0] += (sha2_word64)(n); \
108
- if ((w)[0] < (n)) { \
109
- (w)[1]++; \
110
- } \
111
- }
112
-
113
- /*
114
- * Macros for copying blocks of memory and for zeroing out ranges
115
- * of memory. Using these macros makes it easy to switch from
116
- * using memset()/memcpy() and using bzero()/bcopy().
117
- *
118
- * Please define either SHA2_USE_MEMSET_MEMCPY or define
119
- * SHA2_USE_BZERO_BCOPY depending on which function set you
120
- * choose to use:
121
- */
122
- #if !defined(SHA2_USE_MEMSET_MEMCPY) && !defined(SHA2_USE_BZERO_BCOPY)
123
- /* Default to memset()/memcpy() if no option is specified */
124
- #define SHA2_USE_MEMSET_MEMCPY 1
125
- #endif
126
- #if defined(SHA2_USE_MEMSET_MEMCPY) && defined(SHA2_USE_BZERO_BCOPY)
127
- /* Abort with an error if BOTH options are defined */
128
- #error Define either SHA2_USE_MEMSET_MEMCPY or SHA2_USE_BZERO_BCOPY, not both!
129
- #endif
130
-
131
- #ifdef SHA2_USE_MEMSET_MEMCPY
132
- #define MEMSET_BZERO(p,l) memset((p), 0, (l))
133
- #define MEMCPY_BCOPY(d,s,l) memcpy((d), (s), (l))
134
- #endif
135
- #ifdef SHA2_USE_BZERO_BCOPY
136
- #define MEMSET_BZERO(p,l) bzero((p), (l))
137
- #define MEMCPY_BCOPY(d,s,l) bcopy((s), (d), (l))
138
- #endif
139
-
140
-
141
- /*** THE SIX LOGICAL FUNCTIONS ****************************************/
142
- /*
143
- * Bit shifting and rotation (used by the six SHA-XYZ logical functions:
144
- *
145
- * NOTE: The naming of R and S appears backwards here (R is a SHIFT and
146
- * S is a ROTATION) because the SHA-256/384/512 description document
147
- * (see http://csrc.nist.gov/cryptval/shs/sha256-384-512.pdf) uses this
148
- * same "backwards" definition.
149
- */
150
- /* Shift-right (used in SHA-256, SHA-384, and SHA-512): */
151
- #define R(b,x) ((x) >> (b))
152
- /* 32-bit Rotate-right (used in SHA-256): */
153
- #define S32(b,x) (((x) >> (b)) | ((x) << (32 - (b))))
154
- /* 64-bit Rotate-right (used in SHA-384 and SHA-512): */
155
- #define S64(b,x) (((x) >> (b)) | ((x) << (64 - (b))))
156
-
157
- /* Two of six logical functions used in SHA-256, SHA-384, and SHA-512: */
158
- #define Ch(x,y,z) (((x) & (y)) ^ ((~(x)) & (z)))
159
- #define Maj(x,y,z) (((x) & (y)) ^ ((x) & (z)) ^ ((y) & (z)))
160
-
161
- /* Four of six logical functions used in SHA-256: */
162
- #define Sigma0_256(x) (S32(2, (x)) ^ S32(13, (x)) ^ S32(22, (x)))
163
- #define Sigma1_256(x) (S32(6, (x)) ^ S32(11, (x)) ^ S32(25, (x)))
164
- #define sigma0_256(x) (S32(7, (x)) ^ S32(18, (x)) ^ R(3 , (x)))
165
- #define sigma1_256(x) (S32(17, (x)) ^ S32(19, (x)) ^ R(10, (x)))
166
-
167
- /* Four of six logical functions used in SHA-384 and SHA-512: */
168
- #define Sigma0_512(x) (S64(28, (x)) ^ S64(34, (x)) ^ S64(39, (x)))
169
- #define Sigma1_512(x) (S64(14, (x)) ^ S64(18, (x)) ^ S64(41, (x)))
170
- #define sigma0_512(x) (S64( 1, (x)) ^ S64( 8, (x)) ^ R( 7, (x)))
171
- #define sigma1_512(x) (S64(19, (x)) ^ S64(61, (x)) ^ R( 6, (x)))
172
-
173
- /*** INTERNAL FUNCTION PROTOTYPES *************************************/
174
- /* NOTE: These should not be accessed directly from outside this
175
- * library -- they are intended for private internal visibility/use
176
- * only.
177
- */
178
- void SHA512_Last(SHA512_CTX*);
179
- void SHA256_Transform(SHA256_CTX*, const sha2_word32*);
180
- void SHA512_Transform(SHA512_CTX*, const sha2_word64*);
181
-
182
-
183
- /*** SHA-XYZ INITIAL HASH VALUES AND CONSTANTS ************************/
184
- /* Hash constant words K for SHA-256: */
185
- const static sha2_word32 K256[64] = {
186
- 0x428a2f98UL, 0x71374491UL, 0xb5c0fbcfUL, 0xe9b5dba5UL,
187
- 0x3956c25bUL, 0x59f111f1UL, 0x923f82a4UL, 0xab1c5ed5UL,
188
- 0xd807aa98UL, 0x12835b01UL, 0x243185beUL, 0x550c7dc3UL,
189
- 0x72be5d74UL, 0x80deb1feUL, 0x9bdc06a7UL, 0xc19bf174UL,
190
- 0xe49b69c1UL, 0xefbe4786UL, 0x0fc19dc6UL, 0x240ca1ccUL,
191
- 0x2de92c6fUL, 0x4a7484aaUL, 0x5cb0a9dcUL, 0x76f988daUL,
192
- 0x983e5152UL, 0xa831c66dUL, 0xb00327c8UL, 0xbf597fc7UL,
193
- 0xc6e00bf3UL, 0xd5a79147UL, 0x06ca6351UL, 0x14292967UL,
194
- 0x27b70a85UL, 0x2e1b2138UL, 0x4d2c6dfcUL, 0x53380d13UL,
195
- 0x650a7354UL, 0x766a0abbUL, 0x81c2c92eUL, 0x92722c85UL,
196
- 0xa2bfe8a1UL, 0xa81a664bUL, 0xc24b8b70UL, 0xc76c51a3UL,
197
- 0xd192e819UL, 0xd6990624UL, 0xf40e3585UL, 0x106aa070UL,
198
- 0x19a4c116UL, 0x1e376c08UL, 0x2748774cUL, 0x34b0bcb5UL,
199
- 0x391c0cb3UL, 0x4ed8aa4aUL, 0x5b9cca4fUL, 0x682e6ff3UL,
200
- 0x748f82eeUL, 0x78a5636fUL, 0x84c87814UL, 0x8cc70208UL,
201
- 0x90befffaUL, 0xa4506cebUL, 0xbef9a3f7UL, 0xc67178f2UL
202
- };
203
-
204
- /* Initial hash value H for SHA-256: */
205
- const static sha2_word32 sha256_initial_hash_value[8] = {
206
- 0x6a09e667UL,
207
- 0xbb67ae85UL,
208
- 0x3c6ef372UL,
209
- 0xa54ff53aUL,
210
- 0x510e527fUL,
211
- 0x9b05688cUL,
212
- 0x1f83d9abUL,
213
- 0x5be0cd19UL
214
- };
215
-
216
- /* Hash constant words K for SHA-384 and SHA-512: */
217
- const static sha2_word64 K512[80] = {
218
- ULL(0x428a2f98d728ae22), ULL(0x7137449123ef65cd),
219
- ULL(0xb5c0fbcfec4d3b2f), ULL(0xe9b5dba58189dbbc),
220
- ULL(0x3956c25bf348b538), ULL(0x59f111f1b605d019),
221
- ULL(0x923f82a4af194f9b), ULL(0xab1c5ed5da6d8118),
222
- ULL(0xd807aa98a3030242), ULL(0x12835b0145706fbe),
223
- ULL(0x243185be4ee4b28c), ULL(0x550c7dc3d5ffb4e2),
224
- ULL(0x72be5d74f27b896f), ULL(0x80deb1fe3b1696b1),
225
- ULL(0x9bdc06a725c71235), ULL(0xc19bf174cf692694),
226
- ULL(0xe49b69c19ef14ad2), ULL(0xefbe4786384f25e3),
227
- ULL(0x0fc19dc68b8cd5b5), ULL(0x240ca1cc77ac9c65),
228
- ULL(0x2de92c6f592b0275), ULL(0x4a7484aa6ea6e483),
229
- ULL(0x5cb0a9dcbd41fbd4), ULL(0x76f988da831153b5),
230
- ULL(0x983e5152ee66dfab), ULL(0xa831c66d2db43210),
231
- ULL(0xb00327c898fb213f), ULL(0xbf597fc7beef0ee4),
232
- ULL(0xc6e00bf33da88fc2), ULL(0xd5a79147930aa725),
233
- ULL(0x06ca6351e003826f), ULL(0x142929670a0e6e70),
234
- ULL(0x27b70a8546d22ffc), ULL(0x2e1b21385c26c926),
235
- ULL(0x4d2c6dfc5ac42aed), ULL(0x53380d139d95b3df),
236
- ULL(0x650a73548baf63de), ULL(0x766a0abb3c77b2a8),
237
- ULL(0x81c2c92e47edaee6), ULL(0x92722c851482353b),
238
- ULL(0xa2bfe8a14cf10364), ULL(0xa81a664bbc423001),
239
- ULL(0xc24b8b70d0f89791), ULL(0xc76c51a30654be30),
240
- ULL(0xd192e819d6ef5218), ULL(0xd69906245565a910),
241
- ULL(0xf40e35855771202a), ULL(0x106aa07032bbd1b8),
242
- ULL(0x19a4c116b8d2d0c8), ULL(0x1e376c085141ab53),
243
- ULL(0x2748774cdf8eeb99), ULL(0x34b0bcb5e19b48a8),
244
- ULL(0x391c0cb3c5c95a63), ULL(0x4ed8aa4ae3418acb),
245
- ULL(0x5b9cca4f7763e373), ULL(0x682e6ff3d6b2b8a3),
246
- ULL(0x748f82ee5defb2fc), ULL(0x78a5636f43172f60),
247
- ULL(0x84c87814a1f0ab72), ULL(0x8cc702081a6439ec),
248
- ULL(0x90befffa23631e28), ULL(0xa4506cebde82bde9),
249
- ULL(0xbef9a3f7b2c67915), ULL(0xc67178f2e372532b),
250
- ULL(0xca273eceea26619c), ULL(0xd186b8c721c0c207),
251
- ULL(0xeada7dd6cde0eb1e), ULL(0xf57d4f7fee6ed178),
252
- ULL(0x06f067aa72176fba), ULL(0x0a637dc5a2c898a6),
253
- ULL(0x113f9804bef90dae), ULL(0x1b710b35131c471b),
254
- ULL(0x28db77f523047d84), ULL(0x32caab7b40c72493),
255
- ULL(0x3c9ebe0a15c9bebc), ULL(0x431d67c49c100d4c),
256
- ULL(0x4cc5d4becb3e42b6), ULL(0x597f299cfc657e2a),
257
- ULL(0x5fcb6fab3ad6faec), ULL(0x6c44198c4a475817)
258
- };
259
-
260
- /* Initial hash value H for SHA-384 */
261
- const static sha2_word64 sha384_initial_hash_value[8] = {
262
- ULL(0xcbbb9d5dc1059ed8),
263
- ULL(0x629a292a367cd507),
264
- ULL(0x9159015a3070dd17),
265
- ULL(0x152fecd8f70e5939),
266
- ULL(0x67332667ffc00b31),
267
- ULL(0x8eb44a8768581511),
268
- ULL(0xdb0c2e0d64f98fa7),
269
- ULL(0x47b5481dbefa4fa4)
270
- };
271
-
272
- /* Initial hash value H for SHA-512 */
273
- const static sha2_word64 sha512_initial_hash_value[8] = {
274
- ULL(0x6a09e667f3bcc908),
275
- ULL(0xbb67ae8584caa73b),
276
- ULL(0x3c6ef372fe94f82b),
277
- ULL(0xa54ff53a5f1d36f1),
278
- ULL(0x510e527fade682d1),
279
- ULL(0x9b05688c2b3e6c1f),
280
- ULL(0x1f83d9abfb41bd6b),
281
- ULL(0x5be0cd19137e2179)
282
- };
283
-
284
-
285
- /*** SHA-256: *********************************************************/
286
- void SHA256_Init(SHA256_CTX* context) {
287
- if (context == (SHA256_CTX*)0) {
288
- return;
289
- }
290
- MEMCPY_BCOPY(context->state, sha256_initial_hash_value, SHA256_DIGEST_LENGTH);
291
- MEMSET_BZERO(context->buffer, SHA256_BLOCK_LENGTH);
292
- context->bitcount = 0;
293
- }
294
-
295
- #ifdef SHA2_UNROLL_TRANSFORM
296
-
297
- /* Unrolled SHA-256 round macros: */
298
-
299
- #ifndef WORDS_BIGENDIAN
300
-
301
- #define ROUND256_0_TO_15(a,b,c,d,e,f,g,h) \
302
- REVERSE32(*data++, W256[j]); \
303
- T1 = (h) + Sigma1_256(e) + Ch((e), (f), (g)) + \
304
- K256[j] + W256[j]; \
305
- (d) += T1; \
306
- (h) = T1 + Sigma0_256(a) + Maj((a), (b), (c)); \
307
- j++
308
-
309
-
310
- #else
311
-
312
- #define ROUND256_0_TO_15(a,b,c,d,e,f,g,h) \
313
- T1 = (h) + Sigma1_256(e) + Ch((e), (f), (g)) + \
314
- K256[j] + (W256[j] = *data++); \
315
- (d) += T1; \
316
- (h) = T1 + Sigma0_256(a) + Maj((a), (b), (c)); \
317
- j++
318
-
319
- #endif
320
-
321
- #define ROUND256(a,b,c,d,e,f,g,h) \
322
- s0 = W256[(j+1)&0x0f]; \
323
- s0 = sigma0_256(s0); \
324
- s1 = W256[(j+14)&0x0f]; \
325
- s1 = sigma1_256(s1); \
326
- T1 = (h) + Sigma1_256(e) + Ch((e), (f), (g)) + K256[j] + \
327
- (W256[j&0x0f] += s1 + W256[(j+9)&0x0f] + s0); \
328
- (d) += T1; \
329
- (h) = T1 + Sigma0_256(a) + Maj((a), (b), (c)); \
330
- j++
331
-
332
- void SHA256_Transform(SHA256_CTX* context, const sha2_word32* data) {
333
- sha2_word32 a, b, c, d, e, f, g, h, s0, s1;
334
- sha2_word32 T1, *W256;
335
- int j;
336
-
337
- W256 = (sha2_word32*)context->buffer;
338
-
339
- /* Initialize registers with the prev. intermediate value */
340
- a = context->state[0];
341
- b = context->state[1];
342
- c = context->state[2];
343
- d = context->state[3];
344
- e = context->state[4];
345
- f = context->state[5];
346
- g = context->state[6];
347
- h = context->state[7];
348
-
349
- j = 0;
350
- do {
351
- /* Rounds 0 to 15 (unrolled): */
352
- ROUND256_0_TO_15(a,b,c,d,e,f,g,h);
353
- ROUND256_0_TO_15(h,a,b,c,d,e,f,g);
354
- ROUND256_0_TO_15(g,h,a,b,c,d,e,f);
355
- ROUND256_0_TO_15(f,g,h,a,b,c,d,e);
356
- ROUND256_0_TO_15(e,f,g,h,a,b,c,d);
357
- ROUND256_0_TO_15(d,e,f,g,h,a,b,c);
358
- ROUND256_0_TO_15(c,d,e,f,g,h,a,b);
359
- ROUND256_0_TO_15(b,c,d,e,f,g,h,a);
360
- } while (j < 16);
361
-
362
- /* Now for the remaining rounds to 64: */
363
- do {
364
- ROUND256(a,b,c,d,e,f,g,h);
365
- ROUND256(h,a,b,c,d,e,f,g);
366
- ROUND256(g,h,a,b,c,d,e,f);
367
- ROUND256(f,g,h,a,b,c,d,e);
368
- ROUND256(e,f,g,h,a,b,c,d);
369
- ROUND256(d,e,f,g,h,a,b,c);
370
- ROUND256(c,d,e,f,g,h,a,b);
371
- ROUND256(b,c,d,e,f,g,h,a);
372
- } while (j < 64);
373
-
374
- /* Compute the current intermediate hash value */
375
- context->state[0] += a;
376
- context->state[1] += b;
377
- context->state[2] += c;
378
- context->state[3] += d;
379
- context->state[4] += e;
380
- context->state[5] += f;
381
- context->state[6] += g;
382
- context->state[7] += h;
383
-
384
- /* Clean up */
385
- a = b = c = d = e = f = g = h = T1 = 0;
386
- }
387
-
388
- #else /* SHA2_UNROLL_TRANSFORM */
389
-
390
- void SHA256_Transform(SHA256_CTX* context, const sha2_word32* data) {
391
- sha2_word32 a, b, c, d, e, f, g, h, s0, s1;
392
- sha2_word32 T1, T2, *W256;
393
- int j;
394
-
395
- W256 = (sha2_word32*)context->buffer;
396
-
397
- /* Initialize registers with the prev. intermediate value */
398
- a = context->state[0];
399
- b = context->state[1];
400
- c = context->state[2];
401
- d = context->state[3];
402
- e = context->state[4];
403
- f = context->state[5];
404
- g = context->state[6];
405
- h = context->state[7];
406
-
407
- j = 0;
408
- do {
409
- #ifndef WORDS_BIGENDIAN
410
- /* Copy data while converting to host byte order */
411
- REVERSE32(*data++,W256[j]);
412
- /* Apply the SHA-256 compression function to update a..h */
413
- T1 = h + Sigma1_256(e) + Ch(e, f, g) + K256[j] + W256[j];
414
- #else
415
- /* Apply the SHA-256 compression function to update a..h with copy */
416
- T1 = h + Sigma1_256(e) + Ch(e, f, g) + K256[j] + (W256[j] = *data++);
417
- #endif
418
- T2 = Sigma0_256(a) + Maj(a, b, c);
419
- h = g;
420
- g = f;
421
- f = e;
422
- e = d + T1;
423
- d = c;
424
- c = b;
425
- b = a;
426
- a = T1 + T2;
427
-
428
- j++;
429
- } while (j < 16);
430
-
431
- do {
432
- /* Part of the message block expansion: */
433
- s0 = W256[(j+1)&0x0f];
434
- s0 = sigma0_256(s0);
435
- s1 = W256[(j+14)&0x0f];
436
- s1 = sigma1_256(s1);
437
-
438
- /* Apply the SHA-256 compression function to update a..h */
439
- T1 = h + Sigma1_256(e) + Ch(e, f, g) + K256[j] +
440
- (W256[j&0x0f] += s1 + W256[(j+9)&0x0f] + s0);
441
- T2 = Sigma0_256(a) + Maj(a, b, c);
442
- h = g;
443
- g = f;
444
- f = e;
445
- e = d + T1;
446
- d = c;
447
- c = b;
448
- b = a;
449
- a = T1 + T2;
450
-
451
- j++;
452
- } while (j < 64);
453
-
454
- /* Compute the current intermediate hash value */
455
- context->state[0] += a;
456
- context->state[1] += b;
457
- context->state[2] += c;
458
- context->state[3] += d;
459
- context->state[4] += e;
460
- context->state[5] += f;
461
- context->state[6] += g;
462
- context->state[7] += h;
463
-
464
- /* Clean up */
465
- a = b = c = d = e = f = g = h = T1 = T2 = 0;
466
- }
467
-
468
- #endif /* SHA2_UNROLL_TRANSFORM */
469
-
470
- void SHA256_Update(SHA256_CTX* context, const sha2_byte *data, size_t len) {
471
- unsigned int freespace, usedspace;
472
-
473
- if (len == 0) {
474
- /* Calling with no data is valid - we do nothing */
475
- return;
476
- }
477
-
478
- /* Sanity check: */
479
- assert(context != NULL && data != NULL);
480
-
481
- usedspace = (context->bitcount >> 3) % SHA256_BLOCK_LENGTH;
482
- if (usedspace > 0) {
483
- /* Calculate how much free space is available in the buffer */
484
- freespace = SHA256_BLOCK_LENGTH - usedspace;
485
-
486
- if (len >= freespace) {
487
- /* Fill the buffer completely and process it */
488
- MEMCPY_BCOPY(&context->buffer[usedspace], data, freespace);
489
- context->bitcount += freespace << 3;
490
- len -= freespace;
491
- data += freespace;
492
- SHA256_Transform(context, (sha2_word32*)context->buffer);
493
- } else {
494
- /* The buffer is not yet full */
495
- MEMCPY_BCOPY(&context->buffer[usedspace], data, len);
496
- context->bitcount += len << 3;
497
- /* Clean up: */
498
- usedspace = freespace = 0;
499
- return;
500
- }
501
- }
502
- while (len >= SHA256_BLOCK_LENGTH) {
503
- /* Process as many complete blocks as we can */
504
- SHA256_Transform(context, (const sha2_word32*)data);
505
- context->bitcount += SHA256_BLOCK_LENGTH << 3;
506
- len -= SHA256_BLOCK_LENGTH;
507
- data += SHA256_BLOCK_LENGTH;
508
- }
509
- if (len > 0) {
510
- /* There's left-overs, so save 'em */
511
- MEMCPY_BCOPY(context->buffer, data, len);
512
- context->bitcount += len << 3;
513
- }
514
- /* Clean up: */
515
- usedspace = freespace = 0;
516
- }
517
-
518
- void SHA256_Finish(SHA256_CTX* context, sha2_byte digest[]) {
519
- sha2_word32 *d = (sha2_word32*)digest;
520
- unsigned int usedspace;
521
-
522
- /* Sanity check: */
523
- assert(context != NULL);
524
-
525
- /* If no digest buffer is passed, we don't bother doing this: */
526
- if (digest != (sha2_byte*)0) {
527
- usedspace = (context->bitcount >> 3) % SHA256_BLOCK_LENGTH;
528
- #ifndef WORDS_BIGENDIAN
529
- /* Convert FROM host byte order */
530
- REVERSE64(context->bitcount,context->bitcount);
531
- #endif
532
- if (usedspace > 0) {
533
- /* Begin padding with a 1 bit: */
534
- context->buffer[usedspace++] = 0x80;
535
-
536
- if (usedspace <= SHA256_SHORT_BLOCK_LENGTH) {
537
- /* Set-up for the last transform: */
538
- MEMSET_BZERO(&context->buffer[usedspace], SHA256_SHORT_BLOCK_LENGTH - usedspace);
539
- } else {
540
- if (usedspace < SHA256_BLOCK_LENGTH) {
541
- MEMSET_BZERO(&context->buffer[usedspace], SHA256_BLOCK_LENGTH - usedspace);
542
- }
543
- /* Do second-to-last transform: */
544
- SHA256_Transform(context, (sha2_word32*)context->buffer);
545
-
546
- /* And set-up for the last transform: */
547
- MEMSET_BZERO(context->buffer, SHA256_SHORT_BLOCK_LENGTH);
548
- }
549
- } else {
550
- /* Set-up for the last transform: */
551
- MEMSET_BZERO(context->buffer, SHA256_SHORT_BLOCK_LENGTH);
552
-
553
- /* Begin padding with a 1 bit: */
554
- *context->buffer = 0x80;
555
- }
556
- /* Set the bit count: */
557
- *(sha2_word64*)&context->buffer[SHA256_SHORT_BLOCK_LENGTH] = context->bitcount;
558
-
559
- /* Final transform: */
560
- SHA256_Transform(context, (sha2_word32*)context->buffer);
561
-
562
- #ifndef WORDS_BIGENDIAN
563
- {
564
- /* Convert TO host byte order */
565
- int j;
566
- for (j = 0; j < 8; j++) {
567
- REVERSE32(context->state[j],context->state[j]);
568
- *d++ = context->state[j];
569
- }
570
- }
571
- #else
572
- MEMCPY_BCOPY(d, context->state, SHA256_DIGEST_LENGTH);
573
- #endif
574
- }
575
-
576
- /* Clean up state data: */
577
- MEMSET_BZERO(context, sizeof(SHA256_CTX));
578
- usedspace = 0;
579
- }
580
-
581
- /*** SHA-512: *********************************************************/
582
- void SHA512_Init(SHA512_CTX* context) {
583
- if (context == (SHA512_CTX*)0) {
584
- return;
585
- }
586
- MEMCPY_BCOPY(context->state, sha512_initial_hash_value, SHA512_DIGEST_LENGTH);
587
- MEMSET_BZERO(context->buffer, SHA512_BLOCK_LENGTH);
588
- context->bitcount[0] = context->bitcount[1] = 0;
589
- }
590
-
591
- #ifdef SHA2_UNROLL_TRANSFORM
592
-
593
- /* Unrolled SHA-512 round macros: */
594
- #ifndef WORDS_BIGENDIAN
595
-
596
- #define ROUND512_0_TO_15(a,b,c,d,e,f,g,h) \
597
- REVERSE64(*data++, W512[j]); \
598
- T1 = (h) + Sigma1_512(e) + Ch((e), (f), (g)) + \
599
- K512[j] + W512[j]; \
600
- (d) += T1, \
601
- (h) = T1 + Sigma0_512(a) + Maj((a), (b), (c)), \
602
- j++
603
-
604
-
605
- #else
606
-
607
- #define ROUND512_0_TO_15(a,b,c,d,e,f,g,h) \
608
- T1 = (h) + Sigma1_512(e) + Ch((e), (f), (g)) + \
609
- K512[j] + (W512[j] = *data++); \
610
- (d) += T1; \
611
- (h) = T1 + Sigma0_512(a) + Maj((a), (b), (c)); \
612
- j++
613
-
614
- #endif
615
-
616
- #define ROUND512(a,b,c,d,e,f,g,h) \
617
- s0 = W512[(j+1)&0x0f]; \
618
- s0 = sigma0_512(s0); \
619
- s1 = W512[(j+14)&0x0f]; \
620
- s1 = sigma1_512(s1); \
621
- T1 = (h) + Sigma1_512(e) + Ch((e), (f), (g)) + K512[j] + \
622
- (W512[j&0x0f] += s1 + W512[(j+9)&0x0f] + s0); \
623
- (d) += T1; \
624
- (h) = T1 + Sigma0_512(a) + Maj((a), (b), (c)); \
625
- j++
626
-
627
- void SHA512_Transform(SHA512_CTX* context, const sha2_word64* data) {
628
- sha2_word64 a, b, c, d, e, f, g, h, s0, s1;
629
- sha2_word64 T1, *W512 = (sha2_word64*)context->buffer;
630
- int j;
631
-
632
- /* Initialize registers with the prev. intermediate value */
633
- a = context->state[0];
634
- b = context->state[1];
635
- c = context->state[2];
636
- d = context->state[3];
637
- e = context->state[4];
638
- f = context->state[5];
639
- g = context->state[6];
640
- h = context->state[7];
641
-
642
- j = 0;
643
- do {
644
- ROUND512_0_TO_15(a,b,c,d,e,f,g,h);
645
- ROUND512_0_TO_15(h,a,b,c,d,e,f,g);
646
- ROUND512_0_TO_15(g,h,a,b,c,d,e,f);
647
- ROUND512_0_TO_15(f,g,h,a,b,c,d,e);
648
- ROUND512_0_TO_15(e,f,g,h,a,b,c,d);
649
- ROUND512_0_TO_15(d,e,f,g,h,a,b,c);
650
- ROUND512_0_TO_15(c,d,e,f,g,h,a,b);
651
- ROUND512_0_TO_15(b,c,d,e,f,g,h,a);
652
- } while (j < 16);
653
-
654
- /* Now for the remaining rounds up to 79: */
655
- do {
656
- ROUND512(a,b,c,d,e,f,g,h);
657
- ROUND512(h,a,b,c,d,e,f,g);
658
- ROUND512(g,h,a,b,c,d,e,f);
659
- ROUND512(f,g,h,a,b,c,d,e);
660
- ROUND512(e,f,g,h,a,b,c,d);
661
- ROUND512(d,e,f,g,h,a,b,c);
662
- ROUND512(c,d,e,f,g,h,a,b);
663
- ROUND512(b,c,d,e,f,g,h,a);
664
- } while (j < 80);
665
-
666
- /* Compute the current intermediate hash value */
667
- context->state[0] += a;
668
- context->state[1] += b;
669
- context->state[2] += c;
670
- context->state[3] += d;
671
- context->state[4] += e;
672
- context->state[5] += f;
673
- context->state[6] += g;
674
- context->state[7] += h;
675
-
676
- /* Clean up */
677
- a = b = c = d = e = f = g = h = T1 = 0;
678
- }
679
-
680
- #else /* SHA2_UNROLL_TRANSFORM */
681
-
682
- void SHA512_Transform(SHA512_CTX* context, const sha2_word64* data) {
683
- sha2_word64 a, b, c, d, e, f, g, h, s0, s1;
684
- sha2_word64 T1, T2, *W512 = (sha2_word64*)context->buffer;
685
- int j;
686
-
687
- /* Initialize registers with the prev. intermediate value */
688
- a = context->state[0];
689
- b = context->state[1];
690
- c = context->state[2];
691
- d = context->state[3];
692
- e = context->state[4];
693
- f = context->state[5];
694
- g = context->state[6];
695
- h = context->state[7];
696
-
697
- j = 0;
698
- do {
699
- #ifndef WORDS_BIGENDIAN
700
- /* Convert TO host byte order */
701
- REVERSE64(*data++, W512[j]);
702
- /* Apply the SHA-512 compression function to update a..h */
703
- T1 = h + Sigma1_512(e) + Ch(e, f, g) + K512[j] + W512[j];
704
- #else
705
- /* Apply the SHA-512 compression function to update a..h with copy */
706
- T1 = h + Sigma1_512(e) + Ch(e, f, g) + K512[j] + (W512[j] = *data++);
707
- #endif
708
- T2 = Sigma0_512(a) + Maj(a, b, c);
709
- h = g;
710
- g = f;
711
- f = e;
712
- e = d + T1;
713
- d = c;
714
- c = b;
715
- b = a;
716
- a = T1 + T2;
717
-
718
- j++;
719
- } while (j < 16);
720
-
721
- do {
722
- /* Part of the message block expansion: */
723
- s0 = W512[(j+1)&0x0f];
724
- s0 = sigma0_512(s0);
725
- s1 = W512[(j+14)&0x0f];
726
- s1 = sigma1_512(s1);
727
-
728
- /* Apply the SHA-512 compression function to update a..h */
729
- T1 = h + Sigma1_512(e) + Ch(e, f, g) + K512[j] +
730
- (W512[j&0x0f] += s1 + W512[(j+9)&0x0f] + s0);
731
- T2 = Sigma0_512(a) + Maj(a, b, c);
732
- h = g;
733
- g = f;
734
- f = e;
735
- e = d + T1;
736
- d = c;
737
- c = b;
738
- b = a;
739
- a = T1 + T2;
740
-
741
- j++;
742
- } while (j < 80);
743
-
744
- /* Compute the current intermediate hash value */
745
- context->state[0] += a;
746
- context->state[1] += b;
747
- context->state[2] += c;
748
- context->state[3] += d;
749
- context->state[4] += e;
750
- context->state[5] += f;
751
- context->state[6] += g;
752
- context->state[7] += h;
753
-
754
- /* Clean up */
755
- a = b = c = d = e = f = g = h = T1 = T2 = 0;
756
- }
757
-
758
- #endif /* SHA2_UNROLL_TRANSFORM */
759
-
760
- void SHA512_Update(SHA512_CTX* context, const sha2_byte *data, size_t len) {
761
- unsigned int freespace, usedspace;
762
-
763
- if (len == 0) {
764
- /* Calling with no data is valid - we do nothing */
765
- return;
766
- }
767
-
768
- /* Sanity check: */
769
- assert(context != NULL && data != NULL);
770
-
771
- usedspace = (context->bitcount[0] >> 3) % SHA512_BLOCK_LENGTH;
772
- if (usedspace > 0) {
773
- /* Calculate how much free space is available in the buffer */
774
- freespace = SHA512_BLOCK_LENGTH - usedspace;
775
-
776
- if (len >= freespace) {
777
- /* Fill the buffer completely and process it */
778
- MEMCPY_BCOPY(&context->buffer[usedspace], data, freespace);
779
- ADDINC128(context->bitcount, freespace << 3);
780
- len -= freespace;
781
- data += freespace;
782
- SHA512_Transform(context, (const sha2_word64*)context->buffer);
783
- } else {
784
- /* The buffer is not yet full */
785
- MEMCPY_BCOPY(&context->buffer[usedspace], data, len);
786
- ADDINC128(context->bitcount, len << 3);
787
- /* Clean up: */
788
- usedspace = freespace = 0;
789
- return;
790
- }
791
- }
792
- while (len >= SHA512_BLOCK_LENGTH) {
793
- /* Process as many complete blocks as we can */
794
- SHA512_Transform(context, (const sha2_word64*)data);
795
- ADDINC128(context->bitcount, SHA512_BLOCK_LENGTH << 3);
796
- len -= SHA512_BLOCK_LENGTH;
797
- data += SHA512_BLOCK_LENGTH;
798
- }
799
- if (len > 0) {
800
- /* There's left-overs, so save 'em */
801
- MEMCPY_BCOPY(context->buffer, data, len);
802
- ADDINC128(context->bitcount, len << 3);
803
- }
804
- /* Clean up: */
805
- usedspace = freespace = 0;
806
- }
807
-
808
- void SHA512_Last(SHA512_CTX* context) {
809
- unsigned int usedspace;
810
-
811
- usedspace = (context->bitcount[0] >> 3) % SHA512_BLOCK_LENGTH;
812
- #ifndef WORDS_BIGENDIAN
813
- /* Convert FROM host byte order */
814
- REVERSE64(context->bitcount[0],context->bitcount[0]);
815
- REVERSE64(context->bitcount[1],context->bitcount[1]);
816
- #endif
817
- if (usedspace > 0) {
818
- /* Begin padding with a 1 bit: */
819
- context->buffer[usedspace++] = 0x80;
820
-
821
- if (usedspace <= SHA512_SHORT_BLOCK_LENGTH) {
822
- /* Set-up for the last transform: */
823
- MEMSET_BZERO(&context->buffer[usedspace], SHA512_SHORT_BLOCK_LENGTH - usedspace);
824
- } else {
825
- if (usedspace < SHA512_BLOCK_LENGTH) {
826
- MEMSET_BZERO(&context->buffer[usedspace], SHA512_BLOCK_LENGTH - usedspace);
827
- }
828
- /* Do second-to-last transform: */
829
- SHA512_Transform(context, (const sha2_word64*)context->buffer);
830
-
831
- /* And set-up for the last transform: */
832
- MEMSET_BZERO(context->buffer, SHA512_BLOCK_LENGTH - 2);
833
- }
834
- } else {
835
- /* Prepare for final transform: */
836
- MEMSET_BZERO(context->buffer, SHA512_SHORT_BLOCK_LENGTH);
837
-
838
- /* Begin padding with a 1 bit: */
839
- *context->buffer = 0x80;
840
- }
841
- /* Store the length of input data (in bits): */
842
- *(sha2_word64*)&context->buffer[SHA512_SHORT_BLOCK_LENGTH] = context->bitcount[1];
843
- *(sha2_word64*)&context->buffer[SHA512_SHORT_BLOCK_LENGTH+8] = context->bitcount[0];
844
-
845
- /* Final transform: */
846
- SHA512_Transform(context, (const sha2_word64*)context->buffer);
847
- }
848
-
849
- void SHA512_Finish(SHA512_CTX* context, sha2_byte digest[]) {
850
- sha2_word64 *d = (sha2_word64*)digest;
851
-
852
- /* Sanity check: */
853
- assert(context != NULL);
854
-
855
- /* If no digest buffer is passed, we don't bother doing this: */
856
- if (digest != (sha2_byte*)0) {
857
- SHA512_Last(context);
858
-
859
- /* Save the hash data for output: */
860
- #ifndef WORDS_BIGENDIAN
861
- {
862
- /* Convert TO host byte order */
863
- int j;
864
- for (j = 0; j < 8; j++) {
865
- REVERSE64(context->state[j],context->state[j]);
866
- *d++ = context->state[j];
867
- }
868
- }
869
- #else
870
- MEMCPY_BCOPY(d, context->state, SHA512_DIGEST_LENGTH);
871
- #endif
872
- }
873
-
874
- /* Zero out state data */
875
- MEMSET_BZERO(context, sizeof(SHA512_CTX));
876
- }
877
-
878
- /*** SHA-384: *********************************************************/
879
- void SHA384_Init(SHA384_CTX* context) {
880
- if (context == (SHA384_CTX*)0) {
881
- return;
882
- }
883
- MEMCPY_BCOPY(context->state, sha384_initial_hash_value, SHA512_DIGEST_LENGTH);
884
- MEMSET_BZERO(context->buffer, SHA384_BLOCK_LENGTH);
885
- context->bitcount[0] = context->bitcount[1] = 0;
886
- }
887
-
888
- void SHA384_Update(SHA384_CTX* context, const sha2_byte* data, size_t len) {
889
- SHA512_Update((SHA512_CTX*)context, data, len);
890
- }
891
-
892
- void SHA384_Finish(SHA384_CTX* context, sha2_byte digest[]) {
893
- sha2_word64 *d = (sha2_word64*)digest;
894
-
895
- /* Sanity check: */
896
- assert(context != NULL);
897
-
898
- /* If no digest buffer is passed, we don't bother doing this: */
899
- if (digest != (sha2_byte*)0) {
900
- SHA512_Last((SHA512_CTX*)context);
901
-
902
- /* Save the hash data for output: */
903
- #ifndef WORDS_BIGENDIAN
904
- {
905
- /* Convert TO host byte order */
906
- int j;
907
- for (j = 0; j < 6; j++) {
908
- REVERSE64(context->state[j],context->state[j]);
909
- *d++ = context->state[j];
910
- }
911
- }
912
- #else
913
- MEMCPY_BCOPY(d, context->state, SHA384_DIGEST_LENGTH);
914
- #endif
915
- }
916
-
917
- /* Zero out state data */
918
- MEMSET_BZERO(context, sizeof(SHA384_CTX));
919
- }