sha3-ruby 0.0.1

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.
Files changed (186) hide show
  1. data/.gitignore +17 -0
  2. data/Gemfile +4 -0
  3. data/LICENSE.txt +22 -0
  4. data/README.md +29 -0
  5. data/Rakefile +7 -0
  6. data/ext/sha3/KeccakReferenceAndOptimized/KeccakCompact.vcproj +207 -0
  7. data/ext/sha3/KeccakReferenceAndOptimized/KeccakCompact8.vcproj +207 -0
  8. data/ext/sha3/KeccakReferenceAndOptimized/KeccakInplace.vcproj +203 -0
  9. data/ext/sha3/KeccakReferenceAndOptimized/KeccakInplace32BI.vcproj +201 -0
  10. data/ext/sha3/KeccakReferenceAndOptimized/KeccakOptimized32.vcproj +267 -0
  11. data/ext/sha3/KeccakReferenceAndOptimized/KeccakOptimized64.vcproj +267 -0
  12. data/ext/sha3/KeccakReferenceAndOptimized/KeccakReference.vcproj +243 -0
  13. data/ext/sha3/KeccakReferenceAndOptimized/KeccakReference32BI.vcproj +243 -0
  14. data/ext/sha3/KeccakReferenceAndOptimized/KeccakReferenceAndOptimized.sln +62 -0
  15. data/ext/sha3/KeccakReferenceAndOptimized/KeccakSimple.vcproj +203 -0
  16. data/ext/sha3/KeccakReferenceAndOptimized/KeccakSimple32BI.vcproj +201 -0
  17. data/ext/sha3/KeccakReferenceAndOptimized/Sources/AVR8-rotate64.h +27 -0
  18. data/ext/sha3/KeccakReferenceAndOptimized/Sources/AVR8-rotate64.s +285 -0
  19. data/ext/sha3/KeccakReferenceAndOptimized/Sources/Keccak-avr8-settings.h +2 -0
  20. data/ext/sha3/KeccakReferenceAndOptimized/Sources/Keccak-avr8-test.c +142 -0
  21. data/ext/sha3/KeccakReferenceAndOptimized/Sources/Keccak-avr8-util.h +15 -0
  22. data/ext/sha3/KeccakReferenceAndOptimized/Sources/Keccak-avr8-util.s +119 -0
  23. data/ext/sha3/KeccakReferenceAndOptimized/Sources/Keccak-avr8.c +184 -0
  24. data/ext/sha3/KeccakReferenceAndOptimized/Sources/Keccak-avr8.h +25 -0
  25. data/ext/sha3/KeccakReferenceAndOptimized/Sources/Keccak-compact-settings.h +3 -0
  26. data/ext/sha3/KeccakReferenceAndOptimized/Sources/Keccak-compact-test.c +317 -0
  27. data/ext/sha3/KeccakReferenceAndOptimized/Sources/Keccak-compact.c +341 -0
  28. data/ext/sha3/KeccakReferenceAndOptimized/Sources/Keccak-compact.h +50 -0
  29. data/ext/sha3/KeccakReferenceAndOptimized/Sources/Keccak-compact8-settings.h +2 -0
  30. data/ext/sha3/KeccakReferenceAndOptimized/Sources/Keccak-compact8-test.c +192 -0
  31. data/ext/sha3/KeccakReferenceAndOptimized/Sources/Keccak-compact8.c +375 -0
  32. data/ext/sha3/KeccakReferenceAndOptimized/Sources/Keccak-compact8.h +47 -0
  33. data/ext/sha3/KeccakReferenceAndOptimized/Sources/Keccak-crypto_hash-inplace-armgcc-ARMv7A-NEON.s +406 -0
  34. data/ext/sha3/KeccakReferenceAndOptimized/Sources/Keccak-inplace-minimal-test.c +231 -0
  35. data/ext/sha3/KeccakReferenceAndOptimized/Sources/Keccak-inplace-settings.h +3 -0
  36. data/ext/sha3/KeccakReferenceAndOptimized/Sources/Keccak-inplace-test.c +221 -0
  37. data/ext/sha3/KeccakReferenceAndOptimized/Sources/Keccak-inplace.c +445 -0
  38. data/ext/sha3/KeccakReferenceAndOptimized/Sources/Keccak-inplace32BI-armgcc-ARMv6M.s +844 -0
  39. data/ext/sha3/KeccakReferenceAndOptimized/Sources/Keccak-inplace32BI-armgcc-ARMv7A.s +687 -0
  40. data/ext/sha3/KeccakReferenceAndOptimized/Sources/Keccak-inplace32BI-armgcc-ARMv7M.s +687 -0
  41. data/ext/sha3/KeccakReferenceAndOptimized/Sources/Keccak-inplace32BI.c +849 -0
  42. data/ext/sha3/KeccakReferenceAndOptimized/Sources/Keccak-simple-settings.h +3 -0
  43. data/ext/sha3/KeccakReferenceAndOptimized/Sources/Keccak-simple-test.c +221 -0
  44. data/ext/sha3/KeccakReferenceAndOptimized/Sources/Keccak-simple.c +403 -0
  45. data/ext/sha3/KeccakReferenceAndOptimized/Sources/Keccak-simple32BI.c +673 -0
  46. data/ext/sha3/KeccakReferenceAndOptimized/Sources/KeccakDuplex.c +68 -0
  47. data/ext/sha3/KeccakReferenceAndOptimized/Sources/KeccakDuplex.h +59 -0
  48. data/ext/sha3/KeccakReferenceAndOptimized/Sources/KeccakF-1600-32-rvk.macros +555 -0
  49. data/ext/sha3/KeccakReferenceAndOptimized/Sources/KeccakF-1600-32-s1.macros +1187 -0
  50. data/ext/sha3/KeccakReferenceAndOptimized/Sources/KeccakF-1600-32-s2.macros +1187 -0
  51. data/ext/sha3/KeccakReferenceAndOptimized/Sources/KeccakF-1600-32.macros +26 -0
  52. data/ext/sha3/KeccakReferenceAndOptimized/Sources/KeccakF-1600-64.macros +728 -0
  53. data/ext/sha3/KeccakReferenceAndOptimized/Sources/KeccakF-1600-arm.c +123 -0
  54. data/ext/sha3/KeccakReferenceAndOptimized/Sources/KeccakF-1600-armcc.s +653 -0
  55. data/ext/sha3/KeccakReferenceAndOptimized/Sources/KeccakF-1600-armgcc.s +686 -0
  56. data/ext/sha3/KeccakReferenceAndOptimized/Sources/KeccakF-1600-avr8.c +163 -0
  57. data/ext/sha3/KeccakReferenceAndOptimized/Sources/KeccakF-1600-avr8asm-compact.s +647 -0
  58. data/ext/sha3/KeccakReferenceAndOptimized/Sources/KeccakF-1600-avr8asm-fast.s +934 -0
  59. data/ext/sha3/KeccakReferenceAndOptimized/Sources/KeccakF-1600-inplace-armgcc-ARMv7A-NEON.s +446 -0
  60. data/ext/sha3/KeccakReferenceAndOptimized/Sources/KeccakF-1600-int-set.h +6 -0
  61. data/ext/sha3/KeccakReferenceAndOptimized/Sources/KeccakF-1600-interface.h +46 -0
  62. data/ext/sha3/KeccakReferenceAndOptimized/Sources/KeccakF-1600-opt32-settings.h +4 -0
  63. data/ext/sha3/KeccakReferenceAndOptimized/Sources/KeccakF-1600-opt32.c +524 -0
  64. data/ext/sha3/KeccakReferenceAndOptimized/Sources/KeccakF-1600-opt64-settings.h +7 -0
  65. data/ext/sha3/KeccakReferenceAndOptimized/Sources/KeccakF-1600-opt64.c +504 -0
  66. data/ext/sha3/KeccakReferenceAndOptimized/Sources/KeccakF-1600-reference.c +300 -0
  67. data/ext/sha3/KeccakReferenceAndOptimized/Sources/KeccakF-1600-reference.h +20 -0
  68. data/ext/sha3/KeccakReferenceAndOptimized/Sources/KeccakF-1600-reference.o +0 -0
  69. data/ext/sha3/KeccakReferenceAndOptimized/Sources/KeccakF-1600-reference32BI.c +371 -0
  70. data/ext/sha3/KeccakReferenceAndOptimized/Sources/KeccakF-1600-simd128.macros +651 -0
  71. data/ext/sha3/KeccakReferenceAndOptimized/Sources/KeccakF-1600-simd64.macros +517 -0
  72. data/ext/sha3/KeccakReferenceAndOptimized/Sources/KeccakF-1600-unrolling.macros +124 -0
  73. data/ext/sha3/KeccakReferenceAndOptimized/Sources/KeccakF-1600-x86-64-asm.c +62 -0
  74. data/ext/sha3/KeccakReferenceAndOptimized/Sources/KeccakF-1600-x86-64-gas.s +766 -0
  75. data/ext/sha3/KeccakReferenceAndOptimized/Sources/KeccakF-1600-x86-64-shld-gas.s +766 -0
  76. data/ext/sha3/KeccakReferenceAndOptimized/Sources/KeccakF-1600-xop.macros +573 -0
  77. data/ext/sha3/KeccakReferenceAndOptimized/Sources/KeccakNISTInterface.c +81 -0
  78. data/ext/sha3/KeccakReferenceAndOptimized/Sources/KeccakNISTInterface.h +70 -0
  79. data/ext/sha3/KeccakReferenceAndOptimized/Sources/KeccakNISTInterface.o +0 -0
  80. data/ext/sha3/KeccakReferenceAndOptimized/Sources/KeccakSponge.c +266 -0
  81. data/ext/sha3/KeccakReferenceAndOptimized/Sources/KeccakSponge.h +76 -0
  82. data/ext/sha3/KeccakReferenceAndOptimized/Sources/KeccakSponge.o +0 -0
  83. data/ext/sha3/KeccakReferenceAndOptimized/Sources/Keccakc1024-crypto_hash-inplace-armgcc-ARMv7A-NEON.s +296 -0
  84. data/ext/sha3/KeccakReferenceAndOptimized/Sources/Keccakc512-crypto_hash-inplace-armgcc-ARMv7A-NEON.s +429 -0
  85. data/ext/sha3/KeccakReferenceAndOptimized/Sources/brg_endian.h +142 -0
  86. data/ext/sha3/KeccakReferenceAndOptimized/Sources/crypto_hash.h +0 -0
  87. data/ext/sha3/KeccakReferenceAndOptimized/Sources/displayIntermediateValues.c +117 -0
  88. data/ext/sha3/KeccakReferenceAndOptimized/Sources/displayIntermediateValues.h +29 -0
  89. data/ext/sha3/KeccakReferenceAndOptimized/Sources/displayIntermediateValues.o +0 -0
  90. data/ext/sha3/KeccakReferenceAndOptimized/Sources/genKAT.c +692 -0
  91. data/ext/sha3/KeccakReferenceAndOptimized/Sources/mainARM.c +88 -0
  92. data/ext/sha3/KeccakReferenceAndOptimized/Sources/mainOptimized.c +23 -0
  93. data/ext/sha3/KeccakReferenceAndOptimized/Sources/mainReference.c +381 -0
  94. data/ext/sha3/KeccakReferenceAndOptimized/Sources/timing.c +436 -0
  95. data/ext/sha3/KeccakReferenceAndOptimized/Sources/timing.h +13 -0
  96. data/ext/sha3/KeccakReferenceAndOptimized/TreeHashing/Sources/DoublePermutation-config.h +2 -0
  97. data/ext/sha3/KeccakReferenceAndOptimized/TreeHashing/Sources/DoublePermutation.c +572 -0
  98. data/ext/sha3/KeccakReferenceAndOptimized/TreeHashing/Sources/DoublePermutation.h +38 -0
  99. data/ext/sha3/KeccakReferenceAndOptimized/TreeHashing/Sources/KeccakF-1600-unrolling.macros +124 -0
  100. data/ext/sha3/KeccakReferenceAndOptimized/TreeHashing/Sources/Keccakc256TreeD2.c +81 -0
  101. data/ext/sha3/KeccakReferenceAndOptimized/TreeHashing/Sources/Keccakc256TreeD2.h +18 -0
  102. data/ext/sha3/KeccakReferenceAndOptimized/TreeHashing/Sources/Keccakc512TreeD2.c +81 -0
  103. data/ext/sha3/KeccakReferenceAndOptimized/TreeHashing/Sources/Keccakc512TreeD2.h +18 -0
  104. data/ext/sha3/KeccakReferenceAndOptimized/TreeHashing/Sources/crypto_hash.h +0 -0
  105. data/ext/sha3/KeccakReferenceAndOptimized/TreeHashing/Sources/mainOptimized.c +112 -0
  106. data/ext/sha3/KeccakReferenceAndOptimized/TreeHashing/Sources/timing-Double.c +225 -0
  107. data/ext/sha3/KeccakReferenceAndOptimized/TreeHashing/Sources/timing-Double.h +20 -0
  108. data/ext/sha3/KeccakReferenceAndOptimized/TreeHashing/makefile +68 -0
  109. data/ext/sha3/KeccakReferenceAndOptimized/bin/KeccakCompact +0 -0
  110. data/ext/sha3/KeccakReferenceAndOptimized/bin/KeccakOptimized32 +0 -0
  111. data/ext/sha3/KeccakReferenceAndOptimized/bin/KeccakOptimized64 +0 -0
  112. data/ext/sha3/KeccakReferenceAndOptimized/bin/KeccakReference +0 -0
  113. data/ext/sha3/KeccakReferenceAndOptimized/bin/KeccakReference32BI +0 -0
  114. data/ext/sha3/KeccakReferenceAndOptimized/bin/KeccakSimple +0 -0
  115. data/ext/sha3/KeccakReferenceAndOptimized/bin/KeccakSimple32BI +0 -0
  116. data/ext/sha3/KeccakReferenceAndOptimized/bin/compact/Keccak-compact-test.o +0 -0
  117. data/ext/sha3/KeccakReferenceAndOptimized/bin/compact/Keccak-compact.o +0 -0
  118. data/ext/sha3/KeccakReferenceAndOptimized/bin/optimized32/KeccakDuplex.o +0 -0
  119. data/ext/sha3/KeccakReferenceAndOptimized/bin/optimized32/KeccakF-1600-opt32.o +0 -0
  120. data/ext/sha3/KeccakReferenceAndOptimized/bin/optimized32/KeccakNISTInterface.o +0 -0
  121. data/ext/sha3/KeccakReferenceAndOptimized/bin/optimized32/KeccakSponge.o +0 -0
  122. data/ext/sha3/KeccakReferenceAndOptimized/bin/optimized32/genKAT.o +0 -0
  123. data/ext/sha3/KeccakReferenceAndOptimized/bin/optimized32/mainOptimized.o +0 -0
  124. data/ext/sha3/KeccakReferenceAndOptimized/bin/optimized32/timing.o +0 -0
  125. data/ext/sha3/KeccakReferenceAndOptimized/bin/optimized64/KeccakDuplex.o +0 -0
  126. data/ext/sha3/KeccakReferenceAndOptimized/bin/optimized64/KeccakF-1600-opt64.o +0 -0
  127. data/ext/sha3/KeccakReferenceAndOptimized/bin/optimized64/KeccakNISTInterface.o +0 -0
  128. data/ext/sha3/KeccakReferenceAndOptimized/bin/optimized64/KeccakSponge.o +0 -0
  129. data/ext/sha3/KeccakReferenceAndOptimized/bin/optimized64/genKAT.o +0 -0
  130. data/ext/sha3/KeccakReferenceAndOptimized/bin/optimized64/mainOptimized.o +0 -0
  131. data/ext/sha3/KeccakReferenceAndOptimized/bin/optimized64/timing.o +0 -0
  132. data/ext/sha3/KeccakReferenceAndOptimized/bin/reference/KeccakDuplex.o +0 -0
  133. data/ext/sha3/KeccakReferenceAndOptimized/bin/reference/KeccakF-1600-reference.o +0 -0
  134. data/ext/sha3/KeccakReferenceAndOptimized/bin/reference/KeccakNISTInterface.o +0 -0
  135. data/ext/sha3/KeccakReferenceAndOptimized/bin/reference/KeccakSponge.o +0 -0
  136. data/ext/sha3/KeccakReferenceAndOptimized/bin/reference/displayIntermediateValues.o +0 -0
  137. data/ext/sha3/KeccakReferenceAndOptimized/bin/reference/genKAT.o +0 -0
  138. data/ext/sha3/KeccakReferenceAndOptimized/bin/reference/mainReference.o +0 -0
  139. data/ext/sha3/KeccakReferenceAndOptimized/bin/reference32bi/KeccakDuplex.o +0 -0
  140. data/ext/sha3/KeccakReferenceAndOptimized/bin/reference32bi/KeccakF-1600-reference32BI.o +0 -0
  141. data/ext/sha3/KeccakReferenceAndOptimized/bin/reference32bi/KeccakNISTInterface.o +0 -0
  142. data/ext/sha3/KeccakReferenceAndOptimized/bin/reference32bi/KeccakSponge.o +0 -0
  143. data/ext/sha3/KeccakReferenceAndOptimized/bin/reference32bi/displayIntermediateValues.o +0 -0
  144. data/ext/sha3/KeccakReferenceAndOptimized/bin/reference32bi/genKAT.o +0 -0
  145. data/ext/sha3/KeccakReferenceAndOptimized/bin/reference32bi/mainReference.o +0 -0
  146. data/ext/sha3/KeccakReferenceAndOptimized/bin/simple/Keccak-simple-test.o +0 -0
  147. data/ext/sha3/KeccakReferenceAndOptimized/bin/simple/Keccak-simple.o +0 -0
  148. data/ext/sha3/KeccakReferenceAndOptimized/bin/simple32BI/Keccak-simple-test.o +0 -0
  149. data/ext/sha3/KeccakReferenceAndOptimized/bin/simple32BI/Keccak-simple32BI.o +0 -0
  150. data/ext/sha3/KeccakReferenceAndOptimized/compile64.bat +1 -0
  151. data/ext/sha3/KeccakReferenceAndOptimized/eBASH/checksum-keccak +1 -0
  152. data/ext/sha3/KeccakReferenceAndOptimized/eBASH/checksum-keccakc1024 +1 -0
  153. data/ext/sha3/KeccakReferenceAndOptimized/eBASH/checksum-keccakc256 +1 -0
  154. data/ext/sha3/KeccakReferenceAndOptimized/eBASH/checksum-keccakc256treed2 +1 -0
  155. data/ext/sha3/KeccakReferenceAndOptimized/eBASH/checksum-keccakc448 +1 -0
  156. data/ext/sha3/KeccakReferenceAndOptimized/eBASH/checksum-keccakc512 +1 -0
  157. data/ext/sha3/KeccakReferenceAndOptimized/eBASH/checksum-keccakc512treed2 +1 -0
  158. data/ext/sha3/KeccakReferenceAndOptimized/eBASH/checksum-keccakc768 +1 -0
  159. data/ext/sha3/KeccakReferenceAndOptimized/eBASH/hash-keccak.c +11 -0
  160. data/ext/sha3/KeccakReferenceAndOptimized/eBASH/hash-keccakc1024.c +11 -0
  161. data/ext/sha3/KeccakReferenceAndOptimized/eBASH/hash-keccakc256.c +11 -0
  162. data/ext/sha3/KeccakReferenceAndOptimized/eBASH/hash-keccakc448.c +11 -0
  163. data/ext/sha3/KeccakReferenceAndOptimized/eBASH/hash-keccakc512.c +11 -0
  164. data/ext/sha3/KeccakReferenceAndOptimized/eBASH/hash-keccakc768.c +11 -0
  165. data/ext/sha3/KeccakReferenceAndOptimized/eBASH/int-set-keccak.h +1 -0
  166. data/ext/sha3/KeccakReferenceAndOptimized/eBASH/int-set-keccakc1024.h +1 -0
  167. data/ext/sha3/KeccakReferenceAndOptimized/eBASH/int-set-keccakc256.h +1 -0
  168. data/ext/sha3/KeccakReferenceAndOptimized/eBASH/int-set-keccakc448.h +1 -0
  169. data/ext/sha3/KeccakReferenceAndOptimized/eBASH/int-set-keccakc512.h +1 -0
  170. data/ext/sha3/KeccakReferenceAndOptimized/eBASH/int-set-keccakc768.h +1 -0
  171. data/ext/sha3/KeccakReferenceAndOptimized/eBASH/populate.py +506 -0
  172. data/ext/sha3/KeccakReferenceAndOptimized/eBASH/simple-keccak.h +2 -0
  173. data/ext/sha3/KeccakReferenceAndOptimized/eBASH/simple-keccakc1024.h +2 -0
  174. data/ext/sha3/KeccakReferenceAndOptimized/eBASH/simple-keccakc256.h +2 -0
  175. data/ext/sha3/KeccakReferenceAndOptimized/eBASH/simple-keccakc448.h +2 -0
  176. data/ext/sha3/KeccakReferenceAndOptimized/eBASH/simple-keccakc512.h +2 -0
  177. data/ext/sha3/KeccakReferenceAndOptimized/eBASH/simple-keccakc768.h +2 -0
  178. data/ext/sha3/KeccakReferenceAndOptimized/makefile +327 -0
  179. data/ext/sha3/Makefile +240 -0
  180. data/ext/sha3/depend +28 -0
  181. data/ext/sha3/extconf.rb +21 -0
  182. data/ext/sha3/sha3.c +95 -0
  183. data/lib/sha3-ruby.rb +27 -0
  184. data/lib/sha3-ruby/version.rb +5 -0
  185. data/sha3-ruby.gemspec +21 -0
  186. metadata +233 -0
@@ -0,0 +1,445 @@
1
+ /*
2
+ The Keccak sponge function, designed by Guido Bertoni, Joan Daemen,
3
+ Michaël Peeters and Gilles Van Assche. For more information, feedback or
4
+ questions, please refer to our website: http://keccak.noekeon.org/
5
+
6
+ Implementation by Ronny Van Keer and the designers,
7
+ hereby denoted as "the implementer".
8
+
9
+ To the extent possible under law, the implementer has waived all copyright
10
+ and related or neighboring rights to the source code in this file.
11
+ http://creativecommons.org/publicdomain/zero/1.0/
12
+ */
13
+
14
+ // WARNING: This implementation assumes a little-endian platform. Support for big-endinanness is not yet implemented.
15
+
16
+ #include <string.h>
17
+ #include "Keccak-inplace-settings.h"
18
+ #define cKeccakR_SizeInBytes (cKeccakR / 8)
19
+ #include "crypto_hash.h"
20
+ #ifndef crypto_hash_BYTES
21
+ #ifdef cKeccakFixedOutputLengthInBytes
22
+ #define crypto_hash_BYTES cKeccakFixedOutputLengthInBytes
23
+ #else
24
+ #define crypto_hash_BYTES cKeccakR_SizeInBytes
25
+ #endif
26
+ #endif
27
+ #if (crypto_hash_BYTES > cKeccakR_SizeInBytes)
28
+ #error "Full squeezing not yet implemented"
29
+ #endif
30
+
31
+ #if (cKeccakB == 1600)
32
+ typedef unsigned long long UINT64;
33
+ typedef UINT64 tKeccakLane;
34
+ #define cKeccakNumberOfRounds 24
35
+ #else
36
+ #error "Unsupported Keccak-f width"
37
+ #endif
38
+
39
+ #define cKeccakLaneSizeInBits (sizeof(tKeccakLane) * 8)
40
+
41
+ #define ROL64(a, offset) ((((tKeccakLane)a) << ((offset) % cKeccakLaneSizeInBits)) ^ (((tKeccakLane)a) >> (cKeccakLaneSizeInBits-((offset) % cKeccakLaneSizeInBits))))
42
+ void KeccakF( tKeccakLane * state, const tKeccakLane *in, int laneCount );
43
+
44
+ int crypto_hash( unsigned char *out, const unsigned char *in, unsigned long long inlen )
45
+ {
46
+ tKeccakLane state[5 * 5];
47
+ #if (crypto_hash_BYTES >= cKeccakR_SizeInBytes)
48
+ #define temp out
49
+ #else
50
+ unsigned char temp[cKeccakR_SizeInBytes];
51
+ #endif
52
+
53
+ memset( state, 0, sizeof(state) );
54
+
55
+ for ( /* empty */; inlen >= cKeccakR_SizeInBytes; inlen -= cKeccakR_SizeInBytes, in += cKeccakR_SizeInBytes )
56
+ {
57
+ KeccakF( state, (const tKeccakLane*)in, cKeccakR_SizeInBytes / sizeof(tKeccakLane) );
58
+ }
59
+
60
+ // padding
61
+ memcpy( temp, in, (size_t)inlen );
62
+ temp[inlen++] = 1;
63
+ memset( temp+inlen, 0, cKeccakR_SizeInBytes - (size_t)inlen );
64
+ temp[cKeccakR_SizeInBytes-1] |= 0x80;
65
+ KeccakF( state, (const tKeccakLane*)temp, cKeccakR_SizeInBytes / sizeof(tKeccakLane) );
66
+ memcpy( out, state, crypto_hash_BYTES );
67
+ #if (crypto_hash_BYTES >= cKeccakR_SizeInBytes)
68
+ #undef temp
69
+ #endif
70
+
71
+ return ( 0 );
72
+ }
73
+
74
+
75
+ const tKeccakLane KeccakF1600RoundConstants[cKeccakNumberOfRounds] =
76
+ {
77
+ (tKeccakLane)0x0000000000000001ULL,
78
+ (tKeccakLane)0x0000000000008082ULL,
79
+ (tKeccakLane)0x800000000000808aULL,
80
+ (tKeccakLane)0x8000000080008000ULL,
81
+ (tKeccakLane)0x000000000000808bULL,
82
+ (tKeccakLane)0x0000000080000001ULL,
83
+ (tKeccakLane)0x8000000080008081ULL,
84
+ (tKeccakLane)0x8000000000008009ULL,
85
+ (tKeccakLane)0x000000000000008aULL,
86
+ (tKeccakLane)0x0000000000000088ULL,
87
+ (tKeccakLane)0x0000000080008009ULL,
88
+ (tKeccakLane)0x000000008000000aULL,
89
+ (tKeccakLane)0x000000008000808bULL,
90
+ (tKeccakLane)0x800000000000008bULL,
91
+ (tKeccakLane)0x8000000000008089ULL,
92
+ (tKeccakLane)0x8000000000008003ULL,
93
+ (tKeccakLane)0x8000000000008002ULL,
94
+ (tKeccakLane)0x8000000000000080ULL,
95
+ (tKeccakLane)0x000000000000800aULL,
96
+ (tKeccakLane)0x800000008000000aULL,
97
+ (tKeccakLane)0x8000000080008081ULL,
98
+ (tKeccakLane)0x8000000000008080ULL,
99
+ (tKeccakLane)0x0000000080000001ULL,
100
+ (tKeccakLane)0x8000000080008008ULL
101
+ };
102
+
103
+ void KeccakF( tKeccakLane * state, const tKeccakLane *in, int laneCount )
104
+ {
105
+
106
+ {
107
+ while ( --laneCount >= 0 )
108
+ {
109
+ state[laneCount] ^= in[laneCount];
110
+ }
111
+ }
112
+
113
+ {
114
+ tKeccakLane Ba, Be, Bi, Bo, Bu;
115
+ tKeccakLane Ca, Ce, Ci, Co, Cu;
116
+ tKeccakLane Da, De, Di, Do, Du;
117
+ #define i laneCount
118
+
119
+ #define Aba state[ 0]
120
+ #define Abe state[ 1]
121
+ #define Abi state[ 2]
122
+ #define Abo state[ 3]
123
+ #define Abu state[ 4]
124
+ #define Aga state[ 5]
125
+ #define Age state[ 6]
126
+ #define Agi state[ 7]
127
+ #define Ago state[ 8]
128
+ #define Agu state[ 9]
129
+ #define Aka state[10]
130
+ #define Ake state[11]
131
+ #define Aki state[12]
132
+ #define Ako state[13]
133
+ #define Aku state[14]
134
+ #define Ama state[15]
135
+ #define Ame state[16]
136
+ #define Ami state[17]
137
+ #define Amo state[18]
138
+ #define Amu state[19]
139
+ #define Asa state[20]
140
+ #define Ase state[21]
141
+ #define Asi state[22]
142
+ #define Aso state[23]
143
+ #define Asu state[24]
144
+
145
+ for( i = 0; i < cKeccakNumberOfRounds; i += 4 )
146
+ {
147
+ // --- Code for 4 rounds
148
+ // --- 64-bit lanes mapped to 64-bit words
149
+ Ca = Aba^Aga^Aka^Ama^Asa;
150
+ Ce = Abe^Age^Ake^Ame^Ase;
151
+ Ci = Abi^Agi^Aki^Ami^Asi;
152
+ Co = Abo^Ago^Ako^Amo^Aso;
153
+ Cu = Abu^Agu^Aku^Amu^Asu;
154
+ Da = Cu^ROL64(Ce, 1);
155
+ De = Ca^ROL64(Ci, 1);
156
+ Di = Ce^ROL64(Co, 1);
157
+ Do = Ci^ROL64(Cu, 1);
158
+ Du = Co^ROL64(Ca, 1);
159
+
160
+ Ba = (Aba^Da);
161
+ Be = ROL64((Age^De), 44);
162
+ Bi = ROL64((Aki^Di), 43);
163
+ Bo = ROL64((Amo^Do), 21);
164
+ Bu = ROL64((Asu^Du), 14);
165
+ Aba = Ba ^((~Be)& Bi );
166
+ Aba ^= KeccakF1600RoundConstants[i+0];
167
+ Age = Be ^((~Bi)& Bo );
168
+ Aki = Bi ^((~Bo)& Bu );
169
+ Amo = Bo ^((~Bu)& Ba );
170
+ Asu = Bu ^((~Ba)& Be );
171
+
172
+ Bi = ROL64((Aka^Da), 3);
173
+ Bo = ROL64((Ame^De), 45);
174
+ Bu = ROL64((Asi^Di), 61);
175
+ Ba = ROL64((Abo^Do), 28);
176
+ Be = ROL64((Agu^Du), 20);
177
+ Aka = Ba ^((~Be)& Bi );
178
+ Ame = Be ^((~Bi)& Bo );
179
+ Asi = Bi ^((~Bo)& Bu );
180
+ Abo = Bo ^((~Bu)& Ba );
181
+ Agu = Bu ^((~Ba)& Be );
182
+
183
+ Bu = ROL64((Asa^Da), 18);
184
+ Ba = ROL64((Abe^De), 1);
185
+ Be = ROL64((Agi^Di), 6);
186
+ Bi = ROL64((Ako^Do), 25);
187
+ Bo = ROL64((Amu^Du), 8);
188
+ Asa = Ba ^((~Be)& Bi );
189
+ Abe = Be ^((~Bi)& Bo );
190
+ Agi = Bi ^((~Bo)& Bu );
191
+ Ako = Bo ^((~Bu)& Ba );
192
+ Amu = Bu ^((~Ba)& Be );
193
+
194
+ Be = ROL64((Aga^Da), 36);
195
+ Bi = ROL64((Ake^De), 10);
196
+ Bo = ROL64((Ami^Di), 15);
197
+ Bu = ROL64((Aso^Do), 56);
198
+ Ba = ROL64((Abu^Du), 27);
199
+ Aga = Ba ^((~Be)& Bi );
200
+ Ake = Be ^((~Bi)& Bo );
201
+ Ami = Bi ^((~Bo)& Bu );
202
+ Aso = Bo ^((~Bu)& Ba );
203
+ Abu = Bu ^((~Ba)& Be );
204
+
205
+ Bo = ROL64((Ama^Da), 41);
206
+ Bu = ROL64((Ase^De), 2);
207
+ Ba = ROL64((Abi^Di), 62);
208
+ Be = ROL64((Ago^Do), 55);
209
+ Bi = ROL64((Aku^Du), 39);
210
+ Ama = Ba ^((~Be)& Bi );
211
+ Ase = Be ^((~Bi)& Bo );
212
+ Abi = Bi ^((~Bo)& Bu );
213
+ Ago = Bo ^((~Bu)& Ba );
214
+ Aku = Bu ^((~Ba)& Be );
215
+
216
+ Ca = Aba^Aka^Asa^Aga^Ama;
217
+ Ce = Age^Ame^Abe^Ake^Ase;
218
+ Ci = Aki^Asi^Agi^Ami^Abi;
219
+ Co = Amo^Abo^Ako^Aso^Ago;
220
+ Cu = Asu^Agu^Amu^Abu^Aku;
221
+ Da = Cu^ROL64(Ce, 1);
222
+ De = Ca^ROL64(Ci, 1);
223
+ Di = Ce^ROL64(Co, 1);
224
+ Do = Ci^ROL64(Cu, 1);
225
+ Du = Co^ROL64(Ca, 1);
226
+
227
+ Ba = (Aba^Da);
228
+ Be = ROL64((Ame^De), 44);
229
+ Bi = ROL64((Agi^Di), 43);
230
+ Bo = ROL64((Aso^Do), 21);
231
+ Bu = ROL64((Aku^Du), 14);
232
+ Aba = Ba ^((~Be)& Bi );
233
+ Aba ^= KeccakF1600RoundConstants[i+1];
234
+ Ame = Be ^((~Bi)& Bo );
235
+ Agi = Bi ^((~Bo)& Bu );
236
+ Aso = Bo ^((~Bu)& Ba );
237
+ Aku = Bu ^((~Ba)& Be );
238
+
239
+ Bi = ROL64((Asa^Da), 3);
240
+ Bo = ROL64((Ake^De), 45);
241
+ Bu = ROL64((Abi^Di), 61);
242
+ Ba = ROL64((Amo^Do), 28);
243
+ Be = ROL64((Agu^Du), 20);
244
+ Asa = Ba ^((~Be)& Bi );
245
+ Ake = Be ^((~Bi)& Bo );
246
+ Abi = Bi ^((~Bo)& Bu );
247
+ Amo = Bo ^((~Bu)& Ba );
248
+ Agu = Bu ^((~Ba)& Be );
249
+
250
+ Bu = ROL64((Ama^Da), 18);
251
+ Ba = ROL64((Age^De), 1);
252
+ Be = ROL64((Asi^Di), 6);
253
+ Bi = ROL64((Ako^Do), 25);
254
+ Bo = ROL64((Abu^Du), 8);
255
+ Ama = Ba ^((~Be)& Bi );
256
+ Age = Be ^((~Bi)& Bo );
257
+ Asi = Bi ^((~Bo)& Bu );
258
+ Ako = Bo ^((~Bu)& Ba );
259
+ Abu = Bu ^((~Ba)& Be );
260
+
261
+ Be = ROL64((Aka^Da), 36);
262
+ Bi = ROL64((Abe^De), 10);
263
+ Bo = ROL64((Ami^Di), 15);
264
+ Bu = ROL64((Ago^Do), 56);
265
+ Ba = ROL64((Asu^Du), 27);
266
+ Aka = Ba ^((~Be)& Bi );
267
+ Abe = Be ^((~Bi)& Bo );
268
+ Ami = Bi ^((~Bo)& Bu );
269
+ Ago = Bo ^((~Bu)& Ba );
270
+ Asu = Bu ^((~Ba)& Be );
271
+
272
+ Bo = ROL64((Aga^Da), 41);
273
+ Bu = ROL64((Ase^De), 2);
274
+ Ba = ROL64((Aki^Di), 62);
275
+ Be = ROL64((Abo^Do), 55);
276
+ Bi = ROL64((Amu^Du), 39);
277
+ Aga = Ba ^((~Be)& Bi );
278
+ Ase = Be ^((~Bi)& Bo );
279
+ Aki = Bi ^((~Bo)& Bu );
280
+ Abo = Bo ^((~Bu)& Ba );
281
+ Amu = Bu ^((~Ba)& Be );
282
+
283
+ Ca = Aba^Asa^Ama^Aka^Aga;
284
+ Ce = Ame^Ake^Age^Abe^Ase;
285
+ Ci = Agi^Abi^Asi^Ami^Aki;
286
+ Co = Aso^Amo^Ako^Ago^Abo;
287
+ Cu = Aku^Agu^Abu^Asu^Amu;
288
+ Da = Cu^ROL64(Ce, 1);
289
+ De = Ca^ROL64(Ci, 1);
290
+ Di = Ce^ROL64(Co, 1);
291
+ Do = Ci^ROL64(Cu, 1);
292
+ Du = Co^ROL64(Ca, 1);
293
+
294
+ Ba = (Aba^Da);
295
+ Be = ROL64((Ake^De), 44);
296
+ Bi = ROL64((Asi^Di), 43);
297
+ Bo = ROL64((Ago^Do), 21);
298
+ Bu = ROL64((Amu^Du), 14);
299
+ Aba = Ba ^((~Be)& Bi );
300
+ Aba ^= KeccakF1600RoundConstants[i+2];
301
+ Ake = Be ^((~Bi)& Bo );
302
+ Asi = Bi ^((~Bo)& Bu );
303
+ Ago = Bo ^((~Bu)& Ba );
304
+ Amu = Bu ^((~Ba)& Be );
305
+
306
+ Bi = ROL64((Ama^Da), 3);
307
+ Bo = ROL64((Abe^De), 45);
308
+ Bu = ROL64((Aki^Di), 61);
309
+ Ba = ROL64((Aso^Do), 28);
310
+ Be = ROL64((Agu^Du), 20);
311
+ Ama = Ba ^((~Be)& Bi );
312
+ Abe = Be ^((~Bi)& Bo );
313
+ Aki = Bi ^((~Bo)& Bu );
314
+ Aso = Bo ^((~Bu)& Ba );
315
+ Agu = Bu ^((~Ba)& Be );
316
+
317
+ Bu = ROL64((Aga^Da), 18);
318
+ Ba = ROL64((Ame^De), 1);
319
+ Be = ROL64((Abi^Di), 6);
320
+ Bi = ROL64((Ako^Do), 25);
321
+ Bo = ROL64((Asu^Du), 8);
322
+ Aga = Ba ^((~Be)& Bi );
323
+ Ame = Be ^((~Bi)& Bo );
324
+ Abi = Bi ^((~Bo)& Bu );
325
+ Ako = Bo ^((~Bu)& Ba );
326
+ Asu = Bu ^((~Ba)& Be );
327
+
328
+ Be = ROL64((Asa^Da), 36);
329
+ Bi = ROL64((Age^De), 10);
330
+ Bo = ROL64((Ami^Di), 15);
331
+ Bu = ROL64((Abo^Do), 56);
332
+ Ba = ROL64((Aku^Du), 27);
333
+ Asa = Ba ^((~Be)& Bi );
334
+ Age = Be ^((~Bi)& Bo );
335
+ Ami = Bi ^((~Bo)& Bu );
336
+ Abo = Bo ^((~Bu)& Ba );
337
+ Aku = Bu ^((~Ba)& Be );
338
+
339
+ Bo = ROL64((Aka^Da), 41);
340
+ Bu = ROL64((Ase^De), 2);
341
+ Ba = ROL64((Agi^Di), 62);
342
+ Be = ROL64((Amo^Do), 55);
343
+ Bi = ROL64((Abu^Du), 39);
344
+ Aka = Ba ^((~Be)& Bi );
345
+ Ase = Be ^((~Bi)& Bo );
346
+ Agi = Bi ^((~Bo)& Bu );
347
+ Amo = Bo ^((~Bu)& Ba );
348
+ Abu = Bu ^((~Ba)& Be );
349
+
350
+ Ca = Aba^Ama^Aga^Asa^Aka;
351
+ Ce = Ake^Abe^Ame^Age^Ase;
352
+ Ci = Asi^Aki^Abi^Ami^Agi;
353
+ Co = Ago^Aso^Ako^Abo^Amo;
354
+ Cu = Amu^Agu^Asu^Aku^Abu;
355
+ Da = Cu^ROL64(Ce, 1);
356
+ De = Ca^ROL64(Ci, 1);
357
+ Di = Ce^ROL64(Co, 1);
358
+ Do = Ci^ROL64(Cu, 1);
359
+ Du = Co^ROL64(Ca, 1);
360
+
361
+ Ba = (Aba^Da);
362
+ Be = ROL64((Abe^De), 44);
363
+ Bi = ROL64((Abi^Di), 43);
364
+ Bo = ROL64((Abo^Do), 21);
365
+ Bu = ROL64((Abu^Du), 14);
366
+ Aba = Ba ^((~Be)& Bi );
367
+ Aba ^= KeccakF1600RoundConstants[i+3];
368
+ Abe = Be ^((~Bi)& Bo );
369
+ Abi = Bi ^((~Bo)& Bu );
370
+ Abo = Bo ^((~Bu)& Ba );
371
+ Abu = Bu ^((~Ba)& Be );
372
+
373
+ Bi = ROL64((Aga^Da), 3);
374
+ Bo = ROL64((Age^De), 45);
375
+ Bu = ROL64((Agi^Di), 61);
376
+ Ba = ROL64((Ago^Do), 28);
377
+ Be = ROL64((Agu^Du), 20);
378
+ Aga = Ba ^((~Be)& Bi );
379
+ Age = Be ^((~Bi)& Bo );
380
+ Agi = Bi ^((~Bo)& Bu );
381
+ Ago = Bo ^((~Bu)& Ba );
382
+ Agu = Bu ^((~Ba)& Be );
383
+
384
+ Bu = ROL64((Aka^Da), 18);
385
+ Ba = ROL64((Ake^De), 1);
386
+ Be = ROL64((Aki^Di), 6);
387
+ Bi = ROL64((Ako^Do), 25);
388
+ Bo = ROL64((Aku^Du), 8);
389
+ Aka = Ba ^((~Be)& Bi );
390
+ Ake = Be ^((~Bi)& Bo );
391
+ Aki = Bi ^((~Bo)& Bu );
392
+ Ako = Bo ^((~Bu)& Ba );
393
+ Aku = Bu ^((~Ba)& Be );
394
+
395
+ Be = ROL64((Ama^Da), 36);
396
+ Bi = ROL64((Ame^De), 10);
397
+ Bo = ROL64((Ami^Di), 15);
398
+ Bu = ROL64((Amo^Do), 56);
399
+ Ba = ROL64((Amu^Du), 27);
400
+ Ama = Ba ^((~Be)& Bi );
401
+ Ame = Be ^((~Bi)& Bo );
402
+ Ami = Bi ^((~Bo)& Bu );
403
+ Amo = Bo ^((~Bu)& Ba );
404
+ Amu = Bu ^((~Ba)& Be );
405
+
406
+ Bo = ROL64((Asa^Da), 41);
407
+ Bu = ROL64((Ase^De), 2);
408
+ Ba = ROL64((Asi^Di), 62);
409
+ Be = ROL64((Aso^Do), 55);
410
+ Bi = ROL64((Asu^Du), 39);
411
+ Asa = Ba ^((~Be)& Bi );
412
+ Ase = Be ^((~Bi)& Bo );
413
+ Asi = Bi ^((~Bo)& Bu );
414
+ Aso = Bo ^((~Bu)& Ba );
415
+ Asu = Bu ^((~Ba)& Be );
416
+ }
417
+ #undef i
418
+ #undef Aba
419
+ #undef Abe
420
+ #undef Abi
421
+ #undef Abo
422
+ #undef Abu
423
+ #undef Aga
424
+ #undef Age
425
+ #undef Agi
426
+ #undef Ago
427
+ #undef Agu
428
+ #undef Aka
429
+ #undef Ake
430
+ #undef Aki
431
+ #undef Ako
432
+ #undef Aku
433
+ #undef Ama
434
+ #undef Ame
435
+ #undef Ami
436
+ #undef Amo
437
+ #undef Amu
438
+ #undef Asa
439
+ #undef Ase
440
+ #undef Asi
441
+ #undef Aso
442
+ #undef Asu
443
+ }
444
+
445
+ }
@@ -0,0 +1,844 @@
1
+ @ The Keccak sponge function, designed by Guido Bertoni, Joan Daemen,
2
+ @ Michaël Peeters and Gilles Van Assche. For more information, feedback or
3
+ @ questions, please refer to our website: http://keccak.noekeon.org/
4
+ @
5
+ @ Implementation by Ronny Van Keer,
6
+ @ hereby denoted as "the implementer".
7
+ @
8
+ @ To the extent possible under law, the implementer has waived all copyright
9
+ @ and related or neighboring rights to the source code in this file.
10
+ @ http://creativecommons.org/publicdomain/zero/1.0/
11
+
12
+ @ This file was created from a .asm file
13
+ @ using the ads2gas.pl script.
14
+ .equ DO1STROUNDING, 0
15
+
16
+ @ PRESERVE8
17
+ @ THUMB
18
+ .syntax unified
19
+ .cpu cortex-m1
20
+ .thumb
21
+
22
+ @// --- defines
23
+ .equ cKeccakLaneSizeInBytes , 8
24
+ .equ cKeccakR_SizeInBytes , 1024/8 @576/8 1024/8 1088/8 // populate.py, please set cKeccakR_SizeInBytes
25
+ .equ crypto_hash_BYTES , cKeccakR_SizeInBytes @// populate.py, please set crypto_hash_BYTES
26
+
27
+
28
+ @// --- offsets in state
29
+ .equ Aba0 , 0*4
30
+ .equ Aba1 , 1*4
31
+ .equ Abe0 , 2*4
32
+ .equ Abe1 , 3*4
33
+ .equ Abi0 , 4*4
34
+ .equ Abi1 , 5*4
35
+ .equ Abo0 , 6*4
36
+ .equ Abo1 , 7*4
37
+ .equ Abu0 , 8*4
38
+ .equ Abu1 , 9*4
39
+ .equ Aga0 , 10*4
40
+ .equ Aga1 , 11*4
41
+ .equ Age0 , 12*4
42
+ .equ Age1 , 13*4
43
+ .equ Agi0 , 14*4
44
+ .equ Agi1 , 15*4
45
+ .equ Ago0 , 16*4
46
+ .equ Ago1 , 17*4
47
+ .equ Agu0 , 18*4
48
+ .equ Agu1 , 19*4
49
+ .equ Aka0 , 20*4
50
+ .equ Aka1 , 21*4
51
+ .equ Ake0 , 22*4
52
+ .equ Ake1 , 23*4
53
+ .equ Aki0 , 24*4
54
+ .equ Aki1 , 25*4
55
+ .equ Ako0 , 26*4
56
+ .equ Ako1 , 27*4
57
+ .equ Aku0 , 28*4
58
+ .equ Aku1 , 29*4
59
+ .equ Ama0 , 30*4
60
+ .equ Ama1 , 31*4
61
+ .equ Ame0 , 32*4
62
+ .equ Ame1 , 33*4
63
+ .equ Ami0 , 34*4
64
+ .equ Ami1 , 35*4
65
+ .equ Amo0 , 36*4
66
+ .equ Amo1 , 37*4
67
+ .equ Amu0 , 38*4
68
+ .equ Amu1 , 39*4
69
+ .equ Asa0 , 40*4
70
+ .equ Asa1 , 41*4
71
+ .equ Ase0 , 42*4
72
+ .equ Ase1 , 43*4
73
+ .equ Asi0 , 44*4
74
+ .equ Asi1 , 45*4
75
+ .equ Aso0 , 46*4
76
+ .equ Aso1 , 47*4
77
+ .equ Asu0 , 48*4
78
+ .equ Asu1 , 49*4
79
+
80
+ @// --- offsets on stack
81
+ .equ mDo0 , 50*4
82
+ .equ mDo1 , 51*4
83
+ .equ mDi0 , 52*4
84
+ .equ mRC , 53*4
85
+ .equ mRet , 54*4
86
+ .equ mIn , 55*4
87
+ .equ mOut , 56*4
88
+ .equ mLen , 57*4
89
+
90
+ @// --- macros
91
+
92
+ @// Credit: Henry S. Warren, Hacker's Delight, Addison-Wesley, 2002
93
+ .macro interleaveLane in0,in1,out0,out1,t,tt,pMask
94
+
95
+ mov \out0, \in0
96
+ ldr \t, [\pMask, #0]
97
+ ands \out0, \out0, \t
98
+ lsrs \t, \out0, #1
99
+ orrs \out0, \out0, \t
100
+ ldr \t, [\pMask, #4]
101
+ ands \out0, \out0, \t
102
+ lsrs \t, \out0, #2
103
+ orrs \out0, \out0, \t
104
+ ldr \t, [\pMask, #8]
105
+ ands \out0, \out0, \t
106
+ lsrs \t, \out0, #4
107
+ orrs \out0, \out0, \t
108
+ ldr \t, [\pMask, #12]
109
+ ands \out0, \out0, \t
110
+ lsrs \t, \out0, #8
111
+ orrs \out0, \out0, \t
112
+
113
+ mov \out1, \in1
114
+ ldr \t, [\pMask, #0]
115
+ ands \out1, \out1, \t
116
+ lsrs \t, \out1, #1
117
+ orrs \out1, \out1, \t
118
+ ldr \t, [\pMask, #4]
119
+ ands \out1, \out1, \t
120
+ lsrs \t, \out1, #2
121
+ orrs \out1, \out1, \t
122
+ ldr \t, [\pMask, #8]
123
+ ands \out1, \out1, \t
124
+ lsrs \t, \out1, #4
125
+ orrs \out1, \out1, \t
126
+ ldr \t, [\pMask, #12]
127
+ ands \out1, \out1, \t
128
+ lsrs \t, \out1, #8
129
+ orrs \out1, \out1, \t
130
+
131
+ lsls \out0, \out0, #16
132
+ lsrs \out0, \out0, #16
133
+ lsls \out1, \out1, #16
134
+ orrs \out0, \out0, \out1
135
+
136
+ mov \out1, \in0
137
+ ldr \t, [\pMask, #16]
138
+ ands \out1, \out1, \t
139
+ lsls \t, \out1, #1
140
+ orrs \out1, \out1, \t
141
+ ldr \t, [\pMask, #20]
142
+ ands \out1, \out1, \t
143
+ lsls \t, \out1, #2
144
+ orrs \out1, \out1, \t
145
+ ldr \t, [\pMask, #24]
146
+ ands \out1, \out1, \t
147
+ lsls \t, \out1, #4
148
+ orrs \out1, \out1, \t
149
+ ldr \t, [\pMask, #28]
150
+ ands \out1, \out1, \t
151
+ lsls \t, \out1, #8
152
+ orrs \out1, \out1, \t
153
+
154
+ mov \tt, \in1
155
+ ldr \t, [\pMask, #16]
156
+ ands \tt, \tt, \t
157
+ lsls \t, \tt, #1
158
+ orrs \tt, \tt, \t
159
+ ldr \t, [\pMask, #20]
160
+ ands \tt, \tt, \t
161
+ lsls \t, \tt, #2
162
+ orrs \tt, \tt, \t
163
+ ldr \t, [\pMask, #24]
164
+ ands \tt, \tt, \t
165
+ lsls \t, \tt, #4
166
+ orrs \tt, \tt, \t
167
+ ldr \t, [\pMask, #28]
168
+ ands \tt, \tt, \t
169
+ lsls \t, \tt, #8
170
+ orrs \tt, \tt, \t
171
+
172
+ lsrs \out1,\out1, #16
173
+ lsrs \tt, \tt, #16
174
+ lsls \tt, \tt, #16
175
+ orrs \out1,\out1,\tt
176
+ .endm
177
+
178
+ @// Credit: Henry S. Warren, Hacker's Delight, Addison-Wesley, 2002
179
+ .macro uninterleaveStep x, t, tt, pMask, maskofs, shift
180
+
181
+ @// t = (x ^ (x >> shift)) & mask@ x = x ^ t ^ (t << shift)@
182
+ lsrs \t, \x, #\shift
183
+ eors \t, \t, \x
184
+ ldr \tt, [\pMask, #\maskofs]
185
+ ands \t, \t, \tt
186
+ eors \x, \x, \t
187
+ lsls \t, \t, #\shift
188
+ eors \x, \x, \t
189
+ .endm
190
+
191
+
192
+ .macro uninterleaveLane x0, x1, t, tt, pMask
193
+
194
+ movs \t, \x0 @// t = x0
195
+ lsls \x0, \x0, #16 @// x0 = (x0 & 0x0000FFFF) | (x1 << 16)@
196
+ lsrs \x0, \x0, #16
197
+ lsls \tt, \x1, #16
198
+ orrs \x0, \x0, \tt
199
+
200
+ lsrs \x1, \x1, #16 @// x1 = (t >> 16) | (x1 & 0xFFFF0000)@
201
+ lsls \x1, \x1, #16
202
+ lsrs \t, \t, #16
203
+ orrs \x1, \x1, \t
204
+
205
+ uninterleaveStep \x0, \t, \tt, \pMask, 0, 8
206
+ uninterleaveStep \x0, \t, \tt, \pMask, 4, 4
207
+ uninterleaveStep \x0, \t, \tt, \pMask, 8, 2
208
+ uninterleaveStep \x0, \t, \tt, \pMask, 12, 1
209
+
210
+ uninterleaveStep \x1, \t, \tt, \pMask, 0, 8
211
+ uninterleaveStep \x1, \t, \tt, \pMask, 4, 4
212
+ uninterleaveStep \x1, \t, \tt, \pMask, 8, 2
213
+ uninterleaveStep \x1, \t, \tt, \pMask, 12, 1
214
+ .endm
215
+
216
+ .macro xor5 result,b,g,k,m,s
217
+
218
+ ldr \result, [sp, #\b]
219
+ ldr r1, [sp, #\g]
220
+ eors \result, \result, r1
221
+ ldr r1, [sp, #\k]
222
+ eors \result, \result, r1
223
+ ldr r1, [sp, #\m]
224
+ eors \result, \result, r1
225
+ ldr r1, [sp, #\s]
226
+ eors \result, \result, r1
227
+ .endm
228
+
229
+ .macro xorrol result, aa, bb
230
+ movs \result, \bb
231
+ rors \result, r2
232
+ eors \result, \result, \aa
233
+ .endm
234
+
235
+ .macro xorrolR2 aa, bb
236
+ rors \bb, r2
237
+ eors \bb, \bb, \aa
238
+ .endm
239
+
240
+ .macro xorh result, aa, bb
241
+ mov r1, \bb
242
+ eors r1, r1, \aa
243
+ mov \result, r1
244
+ .endm
245
+
246
+
247
+ .macro xandnot resofs, aa, bb, cc
248
+
249
+ movs r1, \cc
250
+ bics r1, r1, \bb
251
+ eors r1, r1, \aa
252
+ str r1, [sp, #\resofs]
253
+ .endm
254
+
255
+ .macro xandnotR4 resofs, aa, bb, cc
256
+
257
+ bics \cc, \cc, \bb
258
+ eors \cc, \cc, \aa
259
+ str \cc, [sp, #\resofs]
260
+ .endm
261
+
262
+ .macro KeccakThetaRhoPiChiIota aA1, aDax, aA2, aDex, rot2, aA3, aDix, rot3, aA4, aDox, rot4, aA5, aDux, rot5, offset, last
263
+ ldr r3, [sp, #\aA1]
264
+ ldr r4, [sp, #\aA2]
265
+ ldr r5, [sp, #\aA3]
266
+ ldr r6, [sp, #\aA4]
267
+ ldr r7, [sp, #\aA5]
268
+ mov r1, \aDax
269
+ eors r3, r3, r1
270
+ eors r5, r5, \aDix
271
+ mov r1, \aDex
272
+ eors r4, r4, r1
273
+ eors r6, r6, \aDox
274
+ mov r1, \aDux
275
+ eors r7, r7, r1
276
+ movs r1, #32-\rot2
277
+ rors r4, r1
278
+ movs r1, #32-\rot3
279
+ rors r5, r1
280
+ movs r1, #32-\rot4
281
+ rors r6, r1
282
+ movs r1, #32-\rot5
283
+ rors r7, r1
284
+ xandnot \aA2, r4, r5, r6
285
+ xandnot \aA3, r5, r6, r7
286
+ xandnot \aA4, r6, r7, r3
287
+ xandnot \aA5, r7, r3, r4
288
+ ldr r1, [sp, #mRC]
289
+ bics r5, r5, r4
290
+ ldr r4, [r1, #\offset]
291
+ eors r3, r3, r5
292
+ eors r3, r3, r4
293
+ .if \last == 1
294
+ adds r1, #32
295
+ ldr r2, [r1]
296
+ str r1, [sp, #mRC]
297
+ cmp r2, #0xFF
298
+ .endif
299
+ str r3, [sp, #\aA1]
300
+ .endm
301
+
302
+ .macro KeccakThetaRhoPiChi aB1, aA1, aDax, rot1, aB2, aA2, aDex, rot2, aB3, aA3, aDix, rot3, aB4, aA4, aDox, rot4, aB5, aA5, aDux, rot5
303
+ ldr \aB1, [sp, #\aA1]
304
+ ldr \aB2, [sp, #\aA2]
305
+ ldr \aB3, [sp, #\aA3]
306
+ ldr \aB4, [sp, #\aA4]
307
+ ldr \aB5, [sp, #\aA5]
308
+ mov r1, \aDax
309
+ eors \aB1, \aB1, r1
310
+ eors \aB3, \aB3, \aDix
311
+ mov r1, \aDex
312
+ eors \aB2, \aB2, r1
313
+ eors \aB4, \aB4, \aDox
314
+ mov r1, \aDux
315
+ eors \aB5, \aB5, r1
316
+ movs r1, #32-\rot1
317
+ rors \aB1, r1
318
+ .if \rot2 > 0
319
+ movs r1, #32-\rot2
320
+ rors \aB2, r1
321
+ .endif
322
+ movs r1, #32-\rot3
323
+ rors \aB3, r1
324
+ movs r1, #32-\rot4
325
+ rors \aB4, r1
326
+ movs r1, #32-\rot5
327
+ rors \aB5, r1
328
+ xandnot \aA1, r3, r4, r5
329
+ xandnot \aA2, r4, r5, r6
330
+ xandnotR4 \aA5, r7, r3, r4
331
+ xandnotR4 \aA4, r6, r7, r3
332
+ xandnotR4 \aA3, r5, r6, r7
333
+ .endm
334
+
335
+ .macro KeccakRound0
336
+
337
+ movs r2, #31
338
+ xor5 r3, Abu0, Agu0, Aku0, Amu0, Asu0
339
+ xor5 r7, Abe1, Age1, Ake1, Ame1, Ase1
340
+ xorrol r6, r3, r7
341
+ mov r8, r6
342
+ xor5 r6, Abu1, Agu1, Aku1, Amu1, Asu1
343
+ xor5 r0, Abe0, Age0, Ake0, Ame0, Ase0
344
+ xorh r9, r6, r0
345
+
346
+ xor5 r5, Abi0, Agi0, Aki0, Ami0, Asi0
347
+ xorrolR2 r5, r6
348
+ str r6, [sp, #mDo0]
349
+ xor5 r4, Abi1, Agi1, Aki1, Ami1, Asi1
350
+ eors r3, r3, r4
351
+ str r3, [sp, #mDo1]
352
+
353
+ xor5 r3, Aba0, Aga0, Aka0, Ama0, Asa0
354
+ xorrolR2 r3, r4
355
+ mov r10, r4
356
+ xor5 r6, Aba1, Aga1, Aka1, Ama1, Asa1
357
+ xorh r11, r6, r5
358
+
359
+ xor5 r4, Abo1, Ago1, Ako1, Amo1, Aso1
360
+ xorrol r5, r0, r4
361
+ str r5, [sp, #mDi0]
362
+ xor5 r5, Abo0, Ago0, Ako0, Amo0, Aso0
363
+ eors r7, r7, r5
364
+
365
+ xorrolR2 r5, r6
366
+ mov r12, r6
367
+ eors r4, r4, r3
368
+ mov lr, r4
369
+ movs r2, r7
370
+
371
+ ldr r0, [sp, #mDo0]
372
+ KeccakThetaRhoPiChi r5, Aka1, r9, 2, r6, Ame1, r11, 23, r7, Asi1, r2, 31, r3, Abo0, r0, 14, r4, Agu0, r12, 10
373
+ KeccakThetaRhoPiChi r7, Asa1, r9, 9, r3, Abe0, r10, 0, r4, Agi1, r2, 3, r5, Ako0, r0, 12, r6, Amu1, lr, 4
374
+ KeccakThetaRhoPiChi r4, Aga0, r8, 18, r5, Ake0, r10, 5, r6, Ami1, r2, 8, r7, Aso0, r0, 28, r3, Abu1, lr, 14
375
+ KeccakThetaRhoPiChi r6, Ama0, r8, 20, r7, Ase1, r11, 1, r3, Abi1, r2, 31, r4, Ago0, r0, 27, r5, Aku0, r12, 19
376
+ ldr r0, [sp, #mDo1]
377
+ KeccakThetaRhoPiChiIota Aba0, r8, Age0, r10, 22, Aki1, r2, 22, Amo1, r0, 11, Asu0, r12, 7, 0, 0
378
+
379
+ ldr r2, [sp, #mDi0]
380
+ KeccakThetaRhoPiChi r5, Aka0, r8, 1, r6, Ame0, r10, 22, r7, Asi0, r2, 30, r3, Abo1, r0, 14, r4, Agu1, lr, 10
381
+ KeccakThetaRhoPiChi r7, Asa0, r8, 9, r3, Abe1, r11, 1, r4, Agi0, r2, 3, r5, Ako1, r0, 13, r6, Amu0, r12, 4
382
+ KeccakThetaRhoPiChi r4, Aga1, r9, 18, r5, Ake1, r11, 5, r6, Ami0, r2, 7, r7, Aso1, r0, 28, r3, Abu0, r12, 13
383
+ KeccakThetaRhoPiChi r6, Ama1, r9, 21, r7, Ase0, r10, 1, r3, Abi0, r2, 31, r4, Ago1, r0, 28, r5, Aku1, lr, 20
384
+ ldr r0, [sp, #mDo0]
385
+ KeccakThetaRhoPiChiIota Aba1, r9, Age1, r11, 22, Aki0, r2, 21, Amo0, r0, 10, Asu1, lr, 7, 4, 0
386
+ .endm
387
+
388
+ .macro KeccakRound1
389
+
390
+ movs r2, #31
391
+ xor5 r3, Asu0, Agu0, Amu0, Abu1, Aku1
392
+ xor5 r7, Age1, Ame0, Abe0, Ake1, Ase1
393
+ xorrol r6, r3, r7
394
+ mov r8, r6
395
+ xor5 r6, Asu1, Agu1, Amu1, Abu0, Aku0
396
+ xor5 r0, Age0, Ame1, Abe1, Ake0, Ase0
397
+ xorh r9, r6, r0
398
+
399
+ xor5 r5, Aki1, Asi1, Agi0, Ami1, Abi0
400
+ xorrolR2 r5, r6
401
+ str r6, [sp, #mDo0]
402
+ xor5 r4, Aki0, Asi0, Agi1, Ami0, Abi1
403
+ eors r3, r3, r4
404
+ str r3, [sp, #mDo1]
405
+
406
+ xor5 r3, Aba0, Aka1, Asa0, Aga0, Ama1
407
+ xorrolR2 r3, r4
408
+ mov r10, r4
409
+ xor5 r6, Aba1, Aka0, Asa1, Aga1, Ama0
410
+ xorh r11, r6, r5
411
+
412
+ xor5 r4, Amo0, Abo1, Ako0, Aso1, Ago0
413
+ xorrol r5, r0, r4
414
+ str r5, [sp, #mDi0]
415
+ xor5 r5, Amo1, Abo0, Ako1, Aso0, Ago1
416
+ eors r7, r7, r5
417
+
418
+ xorrolR2 r5, r6
419
+ mov r12, r6
420
+ eors r4, r4, r3
421
+ mov lr, r4
422
+ movs r2, r7
423
+
424
+ ldr r0, [sp, #mDo0]
425
+ KeccakThetaRhoPiChi r5, Asa1, r9, 2, r6, Ake1, r11, 23, r7, Abi1, r2, 31, r3, Amo1, r0, 14, r4, Agu0, r12, 10
426
+ KeccakThetaRhoPiChi r7, Ama0, r9, 9, r3, Age0, r10, 0, r4, Asi0, r2, 3, r5, Ako1, r0, 12, r6, Abu0, lr, 4
427
+ KeccakThetaRhoPiChi r4, Aka1, r8, 18, r5, Abe1, r10, 5, r6, Ami0, r2, 8, r7, Ago1, r0, 28, r3, Asu1, lr, 14
428
+ KeccakThetaRhoPiChi r6, Aga0, r8, 20, r7, Ase1, r11, 1, r3, Aki0, r2, 31, r4, Abo0, r0, 27, r5, Amu0, r12, 19
429
+ ldr r0, [sp, #mDo1]
430
+ KeccakThetaRhoPiChiIota Aba0, r8, Ame1, r10, 22, Agi1, r2, 22, Aso1, r0, 11, Aku1, r12, 7, 8, 0
431
+
432
+ ldr r2, [sp, #mDi0]
433
+ KeccakThetaRhoPiChi r5, Asa0, r8, 1, r6, Ake0, r10, 22, r7, Abi0, r2, 30, r3, Amo0, r0, 14, r4, Agu1, lr, 10
434
+ KeccakThetaRhoPiChi r7, Ama1, r8, 9, r3, Age1, r11, 1, r4, Asi1, r2, 3, r5, Ako0, r0, 13, r6, Abu1, r12, 4
435
+ KeccakThetaRhoPiChi r4, Aka0, r9, 18, r5, Abe0, r11, 5, r6, Ami1, r2, 7, r7, Ago0, r0, 28, r3, Asu0, r12, 13
436
+ KeccakThetaRhoPiChi r6, Aga1, r9, 21, r7, Ase0, r10, 1, r3, Aki1, r2, 31, r4, Abo1, r0, 28, r5, Amu1, lr, 20
437
+ ldr r0, [sp, #mDo0]
438
+ KeccakThetaRhoPiChiIota Aba1, r9, Ame0, r11, 22, Agi0, r2, 21, Aso0, r0, 10, Aku0, lr, 7, 12, 0
439
+ .endm
440
+
441
+ .macro KeccakRound2
442
+
443
+ movs r2, #31
444
+ xor5 r3, Aku1, Agu0, Abu1, Asu1, Amu1
445
+ xor5 r7, Ame0, Ake0, Age0, Abe0, Ase1
446
+ xorrol r6, r3, r7
447
+ mov r8, r6
448
+ xor5 r6, Aku0, Agu1, Abu0, Asu0, Amu0
449
+ xor5 r0, Ame1, Ake1, Age1, Abe1, Ase0
450
+ xorh r9, r6, r0
451
+
452
+ xor5 r5, Agi1, Abi1, Asi1, Ami0, Aki1
453
+ xorrolR2 r5, r6
454
+ str r6, [sp, #mDo0]
455
+ xor5 r4, Agi0, Abi0, Asi0, Ami1, Aki0
456
+ eors r3, r3, r4
457
+ str r3, [sp, #mDo1]
458
+
459
+ xor5 r3, Aba0, Asa1, Ama1, Aka1, Aga1
460
+ xorrolR2 r3, r4
461
+ mov r10, r4
462
+ xor5 r6, Aba1, Asa0, Ama0, Aka0, Aga0
463
+ xorh r11, r6, r5
464
+
465
+ xor5 r4, Aso0, Amo0, Ako1, Ago0, Abo0
466
+ xorrol r5, r0, r4
467
+ str r5, [sp, #mDi0]
468
+ xor5 r5, Aso1, Amo1, Ako0, Ago1, Abo1
469
+ eors r7, r7, r5
470
+
471
+ xorrolR2 r5, r6
472
+ mov r12, r6
473
+ eors r4, r4, r3
474
+ mov lr, r4
475
+ movs r2, r7
476
+
477
+ ldr r0, [sp, #mDo0]
478
+ KeccakThetaRhoPiChi r5, Ama0, r9, 2, r6, Abe0, r11, 23, r7, Aki0, r2, 31, r3, Aso1, r0, 14, r4, Agu0, r12, 10
479
+ KeccakThetaRhoPiChi r7, Aga0, r9, 9, r3, Ame1, r10, 0, r4, Abi0, r2, 3, r5, Ako0, r0, 12, r6, Asu0, lr, 4
480
+ KeccakThetaRhoPiChi r4, Asa1, r8, 18, r5, Age1, r10, 5, r6, Ami1, r2, 8, r7, Abo1, r0, 28, r3, Aku0, lr, 14
481
+ KeccakThetaRhoPiChi r6, Aka1, r8, 20, r7, Ase1, r11, 1, r3, Agi0, r2, 31, r4, Amo1, r0, 27, r5, Abu1, r12, 19
482
+ ldr r0, [sp, #mDo1]
483
+ KeccakThetaRhoPiChiIota Aba0, r8, Ake1, r10, 22, Asi0, r2, 22, Ago0, r0, 11, Amu1, r12, 7, 16, 0
484
+
485
+ ldr r2, [sp, #mDi0]
486
+ KeccakThetaRhoPiChi r5, Ama1, r8, 1, r6, Abe1, r10, 22, r7, Aki1, r2, 30, r3, Aso0, r0, 14, r4, Agu1, lr, 10
487
+ KeccakThetaRhoPiChi r7, Aga1, r8, 9, r3, Ame0, r11, 1, r4, Abi1, r2, 3, r5, Ako1, r0, 13, r6, Asu1, r12, 4
488
+ KeccakThetaRhoPiChi r4, Asa0, r9, 18, r5, Age0, r11, 5, r6, Ami0, r2, 7, r7, Abo0, r0, 28, r3, Aku1, r12, 13
489
+ KeccakThetaRhoPiChi r6, Aka0, r9, 21, r7, Ase0, r10, 1, r3, Agi1, r2, 31, r4, Amo0, r0, 28, r5, Abu0, lr, 20
490
+ ldr r0, [sp, #mDo0]
491
+ KeccakThetaRhoPiChiIota Aba1, r9, Ake0, r11, 22, Asi1, r2, 21, Ago1, r0, 10, Amu0, lr, 7, 20, 0
492
+ .endm
493
+
494
+ .macro KeccakRound3
495
+
496
+ movs r2, #31
497
+ xor5 r3, Amu1, Agu0, Asu1, Aku0, Abu0
498
+ xor5 r7, Ake0, Abe1, Ame1, Age0, Ase1
499
+ xorrol r6, r3, r7
500
+ mov r8, r6
501
+ xor5 r6, Amu0, Agu1, Asu0, Aku1, Abu1
502
+ xor5 r0, Ake1, Abe0, Ame0, Age1, Ase0
503
+ xorh r9, r6, r0
504
+
505
+ xor5 r5, Asi0, Aki0, Abi1, Ami1, Agi1
506
+ xorrolR2 r5, r6
507
+ str r6, [sp, #mDo0]
508
+ xor5 r4, Asi1, Aki1, Abi0, Ami0, Agi0
509
+ eors r3, r3, r4
510
+ str r3, [sp, #mDo1]
511
+
512
+ xor5 r3, Aba0, Ama0, Aga1, Asa1, Aka0
513
+ xorrolR2 r3, r4
514
+ mov r10, r4
515
+ xor5 r6, Aba1, Ama1, Aga0, Asa0, Aka1
516
+ xorh r11, r6, r5
517
+
518
+ xor5 r4, Ago1, Aso0, Ako0, Abo0, Amo1
519
+ xorrol r5, r0, r4
520
+ str r5, [sp, #mDi0]
521
+ xor5 r5, Ago0, Aso1, Ako1, Abo1, Amo0
522
+ eors r7, r7, r5
523
+
524
+ xorrolR2 r5, r6
525
+ mov r12, r6
526
+ eors r4, r4, r3
527
+ mov lr, r4
528
+ movs r2, r7
529
+
530
+ ldr r0, [sp, #mDo0]
531
+ KeccakThetaRhoPiChi r5, Aga0, r9, 2, r6, Age0, r11, 23, r7, Agi0, r2, 31, r3, Ago0, r0, 14, r4, Agu0, r12, 10
532
+ KeccakThetaRhoPiChi r7, Aka1, r9, 9, r3, Ake1, r10, 0, r4, Aki1, r2, 3, r5, Ako1, r0, 12, r6, Aku1, lr, 4
533
+ KeccakThetaRhoPiChi r4, Ama0, r8, 18, r5, Ame0, r10, 5, r6, Ami0, r2, 8, r7, Amo0, r0, 28, r3, Amu0, lr, 14
534
+ KeccakThetaRhoPiChi r6, Asa1, r8, 20, r7, Ase1, r11, 1, r3, Asi1, r2, 31, r4, Aso1, r0, 27, r5, Asu1, r12, 19
535
+ ldr r0, [sp, #mDo1]
536
+ KeccakThetaRhoPiChiIota Aba0, r8, Abe0, r10, 22, Abi0, r2, 22, Abo0, r0, 11, Abu0, r12, 7, 24, 0
537
+
538
+ ldr r2, [sp, #mDi0]
539
+ KeccakThetaRhoPiChi r5, Aga1, r8, 1, r6, Age1, r10, 22, r7, Agi1, r2, 30, r3, Ago1, r0, 14, r4, Agu1, lr, 10
540
+ KeccakThetaRhoPiChi r7, Aka0, r8, 9, r3, Ake0, r11, 1, r4, Aki0, r2, 3, r5, Ako0, r0, 13, r6, Aku0, r12, 4
541
+ KeccakThetaRhoPiChi r4, Ama1, r9, 18, r5, Ame1, r11, 5, r6, Ami1, r2, 7, r7, Amo1, r0, 28, r3, Amu1, r12, 13
542
+ KeccakThetaRhoPiChi r6, Asa0, r9, 21, r7, Ase0, r10, 1, r3, Asi0, r2, 31, r4, Aso0, r0, 28, r5, Asu0, lr, 20
543
+ ldr r0, [sp, #mDo0]
544
+ KeccakThetaRhoPiChiIota Aba1, r9, Abe1, r11, 22, Abi1, r2, 21, Abo1, r0, 10, Abu1, lr, 7, 28, 1
545
+ .endm
546
+
547
+ @// --- code and constants
548
+
549
+ @//int crypto_hash( unsigned char *out, const unsigned char *in, unsigned long long inlen )
550
+ @// .size ???
551
+ .align 2
552
+ .global crypto_hash @// populate.py, please update crypto_hash
553
+ .thumb
554
+ .thumb_func
555
+ .type crypto_hash, %function @// populate.py, please update crypto_hash
556
+ crypto_hash: @ @// populate.py, please update crypto_hash
557
+
558
+ push {r4-r7,lr}
559
+ mov r3, r8
560
+ mov r4, r9
561
+ mov r5, r10
562
+ mov r6, r11
563
+ mov r7, r12
564
+ push {r3-r7}
565
+ sub sp, sp, #8*4
566
+
567
+ @//allocate and clear state
568
+ movs r3, #0
569
+ movs r4, r3
570
+ movs r5, r3
571
+ movs r6, r3
572
+ movs r7, r3
573
+ push {r3-r7}
574
+ push {r3-r7}
575
+ push {r3-r7}
576
+ push {r3-r7}
577
+ push {r3-r7}
578
+ push {r3-r7}
579
+ push {r3-r7}
580
+ push {r3-r7}
581
+ push {r3-r7}
582
+ push {r3-r7}
583
+
584
+ str r0, [sp, #mOut] @// save out pointer
585
+ str r1, [sp, #mIn] @// save in pointer
586
+
587
+ @// Complete rate loop
588
+ subs r2, r2, #cKeccakR_SizeInBytes
589
+ bcc crypto_hash_LoopEnd
590
+
591
+ ldr r0, =crypto_hash_LoopRet+1
592
+ str r0, [sp, #mRet] @// save return address
593
+ crypto_hash_Loop:
594
+ ldr r0, =KeccakF1600RoundConstantsWithTerminator
595
+ str r2, [sp, #mLen] @// save inlen (ignore upper 32-bit word, since CPU address space is only 32-bit wide)
596
+ str r0, [sp, #mRC] @// save Round Constants pointer
597
+ movs r2, #cKeccakR_SizeInBytes/cKeccakLaneSizeInBytes
598
+ ldr r4, =KeccakInterleaveConstants
599
+ b KeccakF_FullRate
600
+ crypto_hash_LoopRet:
601
+ ldr r2, [sp, #mLen] @// save inlen (ignore upper 32-bit word, since CPU address space is only 32-bit wide)
602
+ subs r2, r2, #cKeccakR_SizeInBytes
603
+ bcs crypto_hash_Loop
604
+ crypto_hash_LoopEnd:
605
+ adds r2, r2, #cKeccakR_SizeInBytes
606
+
607
+ @// Last incomplete lane and padding
608
+ movs r4, r2 @// r4 nbrFullLanes = len >> 3@
609
+ lsrs r4, #3
610
+ movs r6, #7 @// r6 len &= 7@ length last incomplete lane
611
+ ands r6, r6, r2
612
+
613
+ movs r0, #1 @// XOR first padding bit into state: state[nbrFullLanes << 1] ^= 1 << (len * 4)@
614
+ lsls r1, r6, #2
615
+ lsls r0, r0, r1
616
+ lsls r1, r4, #3
617
+ mov r2, sp
618
+ adds r2, r1
619
+ ldr r1, [r2]
620
+ eors r1, r1, r0
621
+ str r1, [r2]
622
+
623
+ @// XOR last incomplete lane if needed
624
+ ldr r3, [sp, #mIn] @// get in pointer
625
+ lsls r1, r4, #3 @// p = in + nbrFullLanes << 3@
626
+ adds r3, r3, r1
627
+ lsls r1, r6, #1
628
+ add pc, pc, r1
629
+ movs r0, r1 @// dummy, not executed
630
+ crypto_hash_leftBranchTab:
631
+ b crypto_hash_IncompleteDone @// 0 bytes left
632
+ b crypto_hash_1left
633
+ b crypto_hash_2left
634
+ b crypto_hash_3left
635
+ b crypto_hash_4left
636
+ b crypto_hash_5left
637
+ b crypto_hash_6left
638
+ crypto_hash_7left:
639
+ ldrh r1, [r3, #4]
640
+ ldrb r0, [r3, #6]
641
+ lsls r0, r0, #16
642
+ orrs r1, r1, r0
643
+ ldr r0, [r3]
644
+ b crypto_hash_Interleave
645
+
646
+ crypto_hash_1left:
647
+ ldrb r0, [r3]
648
+ movs r1, #0 @// x1 = 0
649
+ b crypto_hash_Interleave
650
+ crypto_hash_2left:
651
+ ldrh r0, [r3]
652
+ movs r1, #0 @// x1 = 0
653
+ b crypto_hash_Interleave
654
+ crypto_hash_3left:
655
+ ldrh r0, [r3]
656
+ ldrb r1, [r3, #2]
657
+ lsls r1, r1, #16
658
+ orrs r0, r0, r1
659
+ movs r1, #0 @// x1 = 0
660
+ b crypto_hash_Interleave
661
+ crypto_hash_4left:
662
+ ldr r0, [r3]
663
+ movs r1, #0 @// x1 = 0
664
+ b crypto_hash_Interleave
665
+ crypto_hash_5left:
666
+ ldr r0, [r3]
667
+ ldrb r1, [r3, #4]
668
+ b crypto_hash_Interleave
669
+ crypto_hash_6left:
670
+ ldr r0, [r3]
671
+ ldrh r1, [r3, #4]
672
+
673
+ crypto_hash_Interleave:
674
+ mov r8, r0
675
+ mov r9, r1
676
+ ldr r0, =KeccakInterleaveConstants
677
+ interleaveLane r8, r9, r2, r3, r6, r1, r0
678
+ lsls r7, r4, #3
679
+ add r7, r7, sp
680
+ ldr r6, [r7]
681
+ eors r6, r6, r2
682
+ str r6, [r7]
683
+ ldr r6, [r7, #4]
684
+ eors r6, r6, r3
685
+ str r6, [r7, #4]
686
+ crypto_hash_IncompleteDone:
687
+ ldr r0, [sp, #cKeccakR_SizeInBytes-4] @// XOR second padding bit into state
688
+ movs r2, #1
689
+ lsls r2, r2, #31
690
+ eors r0, r2
691
+ str r0, [sp, #cKeccakR_SizeInBytes-4]
692
+
693
+ ldr r0, =crypto_hash_SqueezeRet+1
694
+ str r0, [sp, #mRet] @// save return address
695
+ ldr r0, =KeccakF1600RoundConstantsWithTerminator
696
+ str r0, [sp, #mRC] @// save Round Constants pointer
697
+ movs r2, r4
698
+ ldr r4, =KeccakInterleaveConstants
699
+ b KeccakF
700
+ crypto_hash_SqueezeRet:
701
+
702
+ ldr r7, [sp, #mOut] @// save return address
703
+ movs r4, #crypto_hash_BYTES/cKeccakLaneSizeInBytes @len = crypto_hash_BYTES / cKeccakLaneSizeInBytes@
704
+ mov r3, sp
705
+ ldr r6, =KeccakUninterleaveConstants
706
+ crypto_hash_OutputLoop:
707
+ ldr r0, [r3]
708
+ ldr r1, [r3, #4]
709
+ adds r3, r3, #8
710
+ uninterleaveLane r0, r1, r2, r5, r6
711
+ str r0, [r7]
712
+ str r1, [r7, #4]
713
+ adds r7, r7, #8
714
+ subs r4, r4, #1
715
+ bne crypto_hash_OutputLoop
716
+
717
+ add sp, sp, #5*5*2*4+8*4
718
+ movs r0, #0
719
+ pop {r3-r7}
720
+ mov r8, r3
721
+ mov r9, r4
722
+ mov r10, r5
723
+ mov r11, r6
724
+ mov r12, r7
725
+ pop {r4-r7,pc}
726
+
727
+ @ nop @// pad for alignment
728
+
729
+ @ ALIGN
730
+ .ltorg
731
+ KeccakInterleaveConstants:
732
+ .word 0x55555555
733
+ .word 0x33333333
734
+ .word 0x0F0F0F0F
735
+ .word 0x00FF00FF
736
+
737
+ .word 0xAAAAAAAA
738
+ .word 0xCCCCCCCC
739
+ .word 0xF0F0F0F0
740
+ .word 0xFF00FF00
741
+
742
+ KeccakUninterleaveConstants:
743
+ .word 0x0000FF00
744
+ .word 0x00F000F0
745
+ .word 0x0C0C0C0C
746
+ .word 0x22222222
747
+
748
+
749
+ KeccakF1600RoundConstantsWithTerminator:
750
+ .word 0x00000001
751
+ .word 0x00000000
752
+ .word 0x00000000
753
+ .word 0x00000089
754
+ .word 0x00000000
755
+ .word 0x8000008b
756
+ .word 0x00000000
757
+ .word 0x80008080
758
+
759
+ .word 0x00000001
760
+ .word 0x0000008b
761
+ .word 0x00000001
762
+ .word 0x00008000
763
+ .word 0x00000001
764
+ .word 0x80008088
765
+ .word 0x00000001
766
+ .word 0x80000082
767
+
768
+ .word 0x00000000
769
+ .word 0x0000000b
770
+ .word 0x00000000
771
+ .word 0x0000000a
772
+ .word 0x00000001
773
+ .word 0x00008082
774
+ .word 0x00000000
775
+ .word 0x00008003
776
+
777
+ .word 0x00000001
778
+ .word 0x0000808b
779
+ .word 0x00000001
780
+ .word 0x8000000b
781
+ .word 0x00000001
782
+ .word 0x8000008a
783
+ .word 0x00000001
784
+ .word 0x80000081
785
+
786
+ .word 0x00000000
787
+ .word 0x80000081
788
+ .word 0x00000000
789
+ .word 0x80000008
790
+ .word 0x00000000
791
+ .word 0x00000083
792
+ .word 0x00000000
793
+ .word 0x80008003
794
+
795
+ .word 0x00000001
796
+ .word 0x80008088
797
+ .word 0x00000000
798
+ .word 0x80000088
799
+ .word 0x00000001
800
+ .word 0x00008000
801
+ .word 0x00000000
802
+ .word 0x80008082
803
+
804
+ .word 0xFFFFFFFF @//terminator
805
+
806
+ KeccakF:
807
+ cmp r2, #0
808
+ beq roundLoop
809
+ KeccakF_FullRate:
810
+ mov r0, sp
811
+ ldr r1, [sp, #mIn]
812
+ interleaveLoop:
813
+ ldr r5, [r1]
814
+ mov r8, r5
815
+ ldr r5, [r1, #4]
816
+ mov r9, r5
817
+ adds r1, #8
818
+ interleaveLane r8, r9, r6, r7, r3, r5, r4
819
+ ldr r5, [r0]
820
+ eors r6, r6, r5
821
+ str r6, [r0]
822
+ ldr r5, [r0, #4]
823
+ eors r7, r7, r5
824
+ str r7, [r0, #4]
825
+ adds r0, #8
826
+ subs r2, r2, #1
827
+ bne interleaveLoop
828
+ str r1, [sp, #mIn]
829
+
830
+ roundLoop:
831
+ KeccakRound0
832
+ KeccakRound1
833
+ KeccakRound2
834
+ KeccakRound3
835
+ beq KeccakF_Done
836
+ ldr r1, =roundLoop
837
+ bx r1
838
+ KeccakF_Done:
839
+ ldr r7, [sp, #mRet]
840
+ bx r7
841
+
842
+ @
843
+ @ ALIGN
844
+