sleeping_kangaroo12 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.
- checksums.yaml +7 -0
- data/README.md +127 -0
- data/ext/Rakefile +73 -0
- data/ext/binding/sleeping_kangaroo12.c +39 -0
- data/ext/config/xkcp.build +17 -0
- data/ext/xkcp/LICENSE +1 -0
- data/ext/xkcp/Makefile +15 -0
- data/ext/xkcp/Makefile.build +200 -0
- data/ext/xkcp/README.markdown +296 -0
- data/ext/xkcp/lib/HighLevel.build +143 -0
- data/ext/xkcp/lib/LowLevel.build +757 -0
- data/ext/xkcp/lib/common/align.h +33 -0
- data/ext/xkcp/lib/common/brg_endian.h +143 -0
- data/ext/xkcp/lib/high/KangarooTwelve/KangarooTwelve.c +301 -0
- data/ext/xkcp/lib/high/KangarooTwelve/KangarooTwelve.h +97 -0
- data/ext/xkcp/lib/high/Keccak/FIPS202/KeccakHash.c +81 -0
- data/ext/xkcp/lib/high/Keccak/FIPS202/KeccakHash.h +125 -0
- data/ext/xkcp/lib/high/Keccak/FIPS202/SimpleFIPS202.c +48 -0
- data/ext/xkcp/lib/high/Keccak/FIPS202/SimpleFIPS202.h +79 -0
- data/ext/xkcp/lib/high/Keccak/KeccakDuplex.c +81 -0
- data/ext/xkcp/lib/high/Keccak/KeccakDuplex.h +73 -0
- data/ext/xkcp/lib/high/Keccak/KeccakDuplex.inc +195 -0
- data/ext/xkcp/lib/high/Keccak/KeccakSponge.c +111 -0
- data/ext/xkcp/lib/high/Keccak/KeccakSponge.h +76 -0
- data/ext/xkcp/lib/high/Keccak/KeccakSponge.inc +314 -0
- data/ext/xkcp/lib/high/Keccak/PRG/KeccakPRG.c +61 -0
- data/ext/xkcp/lib/high/Keccak/PRG/KeccakPRG.h +67 -0
- data/ext/xkcp/lib/high/Keccak/PRG/KeccakPRG.inc +128 -0
- data/ext/xkcp/lib/high/Keccak/SP800-185/SP800-185.c +93 -0
- data/ext/xkcp/lib/high/Keccak/SP800-185/SP800-185.h +599 -0
- data/ext/xkcp/lib/high/Keccak/SP800-185/SP800-185.inc +573 -0
- data/ext/xkcp/lib/high/Ketje/Ketjev2.c +87 -0
- data/ext/xkcp/lib/high/Ketje/Ketjev2.h +88 -0
- data/ext/xkcp/lib/high/Ketje/Ketjev2.inc +274 -0
- data/ext/xkcp/lib/high/Keyak/Keyakv2.c +132 -0
- data/ext/xkcp/lib/high/Keyak/Keyakv2.h +217 -0
- data/ext/xkcp/lib/high/Keyak/Keyakv2.inc +81 -0
- data/ext/xkcp/lib/high/Keyak/Motorist.inc +953 -0
- data/ext/xkcp/lib/high/Kravatte/Kravatte.c +533 -0
- data/ext/xkcp/lib/high/Kravatte/Kravatte.h +115 -0
- data/ext/xkcp/lib/high/Kravatte/KravatteModes.c +557 -0
- data/ext/xkcp/lib/high/Kravatte/KravatteModes.h +247 -0
- data/ext/xkcp/lib/high/Xoodyak/Cyclist.h +66 -0
- data/ext/xkcp/lib/high/Xoodyak/Cyclist.inc +336 -0
- data/ext/xkcp/lib/high/Xoodyak/Xoodyak-parameters.h +26 -0
- data/ext/xkcp/lib/high/Xoodyak/Xoodyak.c +55 -0
- data/ext/xkcp/lib/high/Xoodyak/Xoodyak.h +35 -0
- data/ext/xkcp/lib/high/Xoofff/Xoofff.c +634 -0
- data/ext/xkcp/lib/high/Xoofff/Xoofff.h +147 -0
- data/ext/xkcp/lib/high/Xoofff/XoofffModes.c +483 -0
- data/ext/xkcp/lib/high/Xoofff/XoofffModes.h +241 -0
- data/ext/xkcp/lib/high/common/Phases.h +25 -0
- data/ext/xkcp/lib/low/KeccakP-1600/ARM/KeccakP-1600-SnP.h +41 -0
- data/ext/xkcp/lib/low/KeccakP-1600/ARM/KeccakP-1600-inplace-32bi-armv6m-le-armcc.s +1666 -0
- data/ext/xkcp/lib/low/KeccakP-1600/ARM/KeccakP-1600-inplace-32bi-armv6m-le-gcc.s +1655 -0
- data/ext/xkcp/lib/low/KeccakP-1600/ARM/KeccakP-1600-inplace-32bi-armv7a-le-armcc.s +1268 -0
- data/ext/xkcp/lib/low/KeccakP-1600/ARM/KeccakP-1600-inplace-32bi-armv7a-le-gcc.s +1264 -0
- data/ext/xkcp/lib/low/KeccakP-1600/ARM/KeccakP-1600-inplace-32bi-armv7m-le-armcc.s +1178 -0
- data/ext/xkcp/lib/low/KeccakP-1600/ARM/KeccakP-1600-inplace-32bi-armv7m-le-gcc.s +1175 -0
- data/ext/xkcp/lib/low/KeccakP-1600/ARM/KeccakP-1600-u1-32bi-armv6m-le-armcc.s +1338 -0
- data/ext/xkcp/lib/low/KeccakP-1600/ARM/KeccakP-1600-u1-32bi-armv6m-le-gcc.s +1336 -0
- data/ext/xkcp/lib/low/KeccakP-1600/ARM/KeccakP-1600-u2-32bi-armv6m-le-armcc.s +1343 -0
- data/ext/xkcp/lib/low/KeccakP-1600/ARM/KeccakP-1600-u2-32bi-armv6m-le-gcc.s +1339 -0
- data/ext/xkcp/lib/low/KeccakP-1600/ARMv7A-NEON/KeccakP-1600-SnP.h +42 -0
- data/ext/xkcp/lib/low/KeccakP-1600/ARMv7A-NEON/KeccakP-1600-armv7a-le-neon-armcc.s +823 -0
- data/ext/xkcp/lib/low/KeccakP-1600/ARMv7A-NEON/KeccakP-1600-armv7a-le-neon-gcc.s +831 -0
- data/ext/xkcp/lib/low/KeccakP-1600/ARMv8A/KeccakP-1600-SnP.h +31 -0
- data/ext/xkcp/lib/low/KeccakP-1600/ARMv8A/KeccakP-1600-armv8a-neon.s +540 -0
- data/ext/xkcp/lib/low/KeccakP-1600/AVR8/KeccakP-1600-SnP.h +42 -0
- data/ext/xkcp/lib/low/KeccakP-1600/AVR8/KeccakP-1600-avr8-compact.s +733 -0
- data/ext/xkcp/lib/low/KeccakP-1600/AVR8/KeccakP-1600-avr8-fast.s +1121 -0
- data/ext/xkcp/lib/low/KeccakP-1600/AVX2/KeccakP-1600-AVX2.s +1100 -0
- data/ext/xkcp/lib/low/KeccakP-1600/AVX2/KeccakP-1600-SnP.h +52 -0
- data/ext/xkcp/lib/low/KeccakP-1600/AVX512/C/KeccakP-1600-AVX512.c +623 -0
- data/ext/xkcp/lib/low/KeccakP-1600/AVX512/C/KeccakP-1600-SnP.h +47 -0
- data/ext/xkcp/lib/low/KeccakP-1600/AVX512/C/u12/KeccakP-1600-AVX512-config.h +6 -0
- data/ext/xkcp/lib/low/KeccakP-1600/AVX512/C/u6/KeccakP-1600-AVX512-config.h +6 -0
- data/ext/xkcp/lib/low/KeccakP-1600/AVX512/C/ua/KeccakP-1600-AVX512-config.h +6 -0
- data/ext/xkcp/lib/low/KeccakP-1600/AVX512/KeccakP-1600-AVX512.s +1031 -0
- data/ext/xkcp/lib/low/KeccakP-1600/AVX512/KeccakP-1600-SnP.h +53 -0
- data/ext/xkcp/lib/low/KeccakP-1600/XOP/KeccakP-1600-SnP.h +44 -0
- data/ext/xkcp/lib/low/KeccakP-1600/XOP/KeccakP-1600-XOP.c +476 -0
- data/ext/xkcp/lib/low/KeccakP-1600/XOP/u6/KeccakP-1600-XOP-config.h +6 -0
- data/ext/xkcp/lib/low/KeccakP-1600/XOP/ua/KeccakP-1600-XOP-config.h +6 -0
- data/ext/xkcp/lib/low/KeccakP-1600/common/KeccakP-1600-64.macros +748 -0
- data/ext/xkcp/lib/low/KeccakP-1600/common/KeccakP-1600-unrolling.macros +305 -0
- data/ext/xkcp/lib/low/KeccakP-1600/compact/KeccakP-1600-SnP.h +40 -0
- data/ext/xkcp/lib/low/KeccakP-1600/compact/KeccakP-1600-compact64.c +420 -0
- data/ext/xkcp/lib/low/KeccakP-1600/plain-32bits-inplace/KeccakP-1600-SnP.h +43 -0
- data/ext/xkcp/lib/low/KeccakP-1600/plain-32bits-inplace/KeccakP-1600-inplace32BI.c +1163 -0
- data/ext/xkcp/lib/low/KeccakP-1600/plain-64bits/KeccakP-1600-SnP.h +54 -0
- data/ext/xkcp/lib/low/KeccakP-1600/plain-64bits/KeccakP-1600-opt64.c +565 -0
- data/ext/xkcp/lib/low/KeccakP-1600/plain-64bits/lcu6/KeccakP-1600-opt64-config.h +7 -0
- data/ext/xkcp/lib/low/KeccakP-1600/plain-64bits/lcua/KeccakP-1600-opt64-config.h +7 -0
- data/ext/xkcp/lib/low/KeccakP-1600/plain-64bits/lcua-shld/KeccakP-1600-opt64-config.h +8 -0
- data/ext/xkcp/lib/low/KeccakP-1600/plain-64bits/u6/KeccakP-1600-opt64-config.h +6 -0
- data/ext/xkcp/lib/low/KeccakP-1600/plain-64bits/ua/KeccakP-1600-opt64-config.h +6 -0
- data/ext/xkcp/lib/low/KeccakP-1600/ref-32bits/KeccakP-1600-SnP.h +44 -0
- data/ext/xkcp/lib/low/KeccakP-1600/ref-32bits/KeccakP-1600-reference.h +23 -0
- data/ext/xkcp/lib/low/KeccakP-1600/ref-32bits/KeccakP-1600-reference32BI.c +625 -0
- data/ext/xkcp/lib/low/KeccakP-1600/ref-64bits/KeccakP-1600-SnP.h +44 -0
- data/ext/xkcp/lib/low/KeccakP-1600/ref-64bits/KeccakP-1600-reference.c +440 -0
- data/ext/xkcp/lib/low/KeccakP-1600/ref-64bits/KeccakP-1600-reference.h +23 -0
- data/ext/xkcp/lib/low/KeccakP-1600/x86-64/KeccakP-1600-SnP.h +42 -0
- data/ext/xkcp/lib/low/KeccakP-1600/x86-64/KeccakP-1600-x86-64-gas.s +1196 -0
- data/ext/xkcp/lib/low/KeccakP-1600/x86-64/KeccakP-1600-x86-64-gas_Apple.s +1124 -0
- data/ext/xkcp/lib/low/KeccakP-1600/x86-64/KeccakP-1600-x86-64-shld-gas.s +1196 -0
- data/ext/xkcp/lib/low/KeccakP-1600-times2/ARMv7A-NEON/KeccakP-1600-inplace-pl2-armv7a-neon-le-armcc.s +1392 -0
- data/ext/xkcp/lib/low/KeccakP-1600-times2/ARMv7A-NEON/KeccakP-1600-inplace-pl2-armv7a-neon-le-gcc.s +1394 -0
- data/ext/xkcp/lib/low/KeccakP-1600-times2/ARMv7A-NEON/KeccakP-1600-times2-SnP.h +42 -0
- data/ext/xkcp/lib/low/KeccakP-1600-times2/AVX512/AVX512u12/SIMD512-2-config.h +7 -0
- data/ext/xkcp/lib/low/KeccakP-1600-times2/AVX512/AVX512u4/SIMD512-2-config.h +7 -0
- data/ext/xkcp/lib/low/KeccakP-1600-times2/AVX512/AVX512ufull/SIMD512-2-config.h +7 -0
- data/ext/xkcp/lib/low/KeccakP-1600-times2/AVX512/KeccakP-1600-times2-SIMD512.c +850 -0
- data/ext/xkcp/lib/low/KeccakP-1600-times2/AVX512/KeccakP-1600-times2-SnP.h +51 -0
- data/ext/xkcp/lib/low/KeccakP-1600-times2/SIMD128/KeccakP-1600-times2-SIMD128.c +957 -0
- data/ext/xkcp/lib/low/KeccakP-1600-times2/SIMD128/KeccakP-1600-times2-SnP.h +49 -0
- data/ext/xkcp/lib/low/KeccakP-1600-times2/SIMD128/SSSE3-u2/SIMD128-config.h +8 -0
- data/ext/xkcp/lib/low/KeccakP-1600-times2/SIMD128/SSSE3-ua/SIMD128-config.h +8 -0
- data/ext/xkcp/lib/low/KeccakP-1600-times2/SIMD128/XOP-u2/SIMD128-config.h +9 -0
- data/ext/xkcp/lib/low/KeccakP-1600-times2/SIMD128/XOP-ua/SIMD128-config.h +9 -0
- data/ext/xkcp/lib/low/KeccakP-1600-times2/fallback-on1/KeccakP-1600-times2-SnP.h +45 -0
- data/ext/xkcp/lib/low/KeccakP-1600-times2/fallback-on1/KeccakP-1600-times2-on1.c +37 -0
- data/ext/xkcp/lib/low/KeccakP-1600-times4/AVX2/KeccakP-1600-times4-SIMD256.c +1321 -0
- data/ext/xkcp/lib/low/KeccakP-1600-times4/AVX2/KeccakP-1600-times4-SnP.h +55 -0
- data/ext/xkcp/lib/low/KeccakP-1600-times4/AVX2/u12/SIMD256-config.h +7 -0
- data/ext/xkcp/lib/low/KeccakP-1600-times4/AVX2/u6/SIMD256-config.h +7 -0
- data/ext/xkcp/lib/low/KeccakP-1600-times4/AVX2/ua/SIMD256-config.h +7 -0
- data/ext/xkcp/lib/low/KeccakP-1600-times4/AVX512/AVX512u12/SIMD512-4-config.h +7 -0
- data/ext/xkcp/lib/low/KeccakP-1600-times4/AVX512/AVX512u4/SIMD512-4-config.h +7 -0
- data/ext/xkcp/lib/low/KeccakP-1600-times4/AVX512/AVX512ufull/SIMD512-4-config.h +7 -0
- data/ext/xkcp/lib/low/KeccakP-1600-times4/AVX512/KeccakP-1600-times4-SIMD512.c +881 -0
- data/ext/xkcp/lib/low/KeccakP-1600-times4/AVX512/KeccakP-1600-times4-SnP.h +51 -0
- data/ext/xkcp/lib/low/KeccakP-1600-times4/fallback-on1/KeccakP-1600-times4-SnP.h +45 -0
- data/ext/xkcp/lib/low/KeccakP-1600-times4/fallback-on1/KeccakP-1600-times4-on1.c +37 -0
- data/ext/xkcp/lib/low/KeccakP-1600-times4/fallback-on2/KeccakP-1600-times4-SnP.h +45 -0
- data/ext/xkcp/lib/low/KeccakP-1600-times4/fallback-on2/KeccakP-1600-times4-on2.c +38 -0
- data/ext/xkcp/lib/low/KeccakP-1600-times8/AVX512/KeccakP-1600-times8-SIMD512.c +1615 -0
- data/ext/xkcp/lib/low/KeccakP-1600-times8/AVX512/KeccakP-1600-times8-SnP.h +57 -0
- data/ext/xkcp/lib/low/KeccakP-1600-times8/AVX512/u12/SIMD512-config.h +7 -0
- data/ext/xkcp/lib/low/KeccakP-1600-times8/AVX512/u4/SIMD512-config.h +7 -0
- data/ext/xkcp/lib/low/KeccakP-1600-times8/AVX512/ua/SIMD512-config.h +7 -0
- data/ext/xkcp/lib/low/KeccakP-1600-times8/fallback-on1/KeccakP-1600-times8-SnP.h +45 -0
- data/ext/xkcp/lib/low/KeccakP-1600-times8/fallback-on1/KeccakP-1600-times8-on1.c +37 -0
- data/ext/xkcp/lib/low/KeccakP-1600-times8/fallback-on2/KeccakP-1600-times8-SnP.h +45 -0
- data/ext/xkcp/lib/low/KeccakP-1600-times8/fallback-on2/KeccakP-1600-times8-on2.c +38 -0
- data/ext/xkcp/lib/low/KeccakP-1600-times8/fallback-on4/KeccakP-1600-times8-SnP.h +45 -0
- data/ext/xkcp/lib/low/KeccakP-1600-times8/fallback-on4/KeccakP-1600-times8-on4.c +38 -0
- data/ext/xkcp/lib/low/KeccakP-200/ARM/KeccakP-200-SnP.h +41 -0
- data/ext/xkcp/lib/low/KeccakP-200/ARM/KeccakP-200-armv6m-le-armcc.s +442 -0
- data/ext/xkcp/lib/low/KeccakP-200/ARM/KeccakP-200-armv6m-le-gcc.s +446 -0
- data/ext/xkcp/lib/low/KeccakP-200/ARM/KeccakP-200-armv7m-le-armcc.s +419 -0
- data/ext/xkcp/lib/low/KeccakP-200/ARM/KeccakP-200-armv7m-le-gcc.s +427 -0
- data/ext/xkcp/lib/low/KeccakP-200/AVR8/KeccakP-200-SnP.h +41 -0
- data/ext/xkcp/lib/low/KeccakP-200/AVR8/KeccakP-200-avr8-fast.s +647 -0
- data/ext/xkcp/lib/low/KeccakP-200/compact/KeccakP-200-SnP.h +39 -0
- data/ext/xkcp/lib/low/KeccakP-200/compact/KeccakP-200-compact.c +190 -0
- data/ext/xkcp/lib/low/KeccakP-200/ref/KeccakP-200-SnP.h +43 -0
- data/ext/xkcp/lib/low/KeccakP-200/ref/KeccakP-200-reference.c +412 -0
- data/ext/xkcp/lib/low/KeccakP-200/ref/KeccakP-200-reference.h +23 -0
- data/ext/xkcp/lib/low/KeccakP-400/ARM/KeccakP-400-SnP.h +41 -0
- data/ext/xkcp/lib/low/KeccakP-400/ARM/KeccakP-400-armv6m-le-armcc.s +454 -0
- data/ext/xkcp/lib/low/KeccakP-400/ARM/KeccakP-400-armv6m-le-gcc.s +458 -0
- data/ext/xkcp/lib/low/KeccakP-400/ARM/KeccakP-400-armv7m-le-armcc.s +455 -0
- data/ext/xkcp/lib/low/KeccakP-400/ARM/KeccakP-400-armv7m-le-gcc.s +458 -0
- data/ext/xkcp/lib/low/KeccakP-400/AVR8/KeccakP-400-SnP.h +41 -0
- data/ext/xkcp/lib/low/KeccakP-400/AVR8/KeccakP-400-avr8-fast.s +728 -0
- data/ext/xkcp/lib/low/KeccakP-400/ref/KeccakP-400-SnP.h +43 -0
- data/ext/xkcp/lib/low/KeccakP-400/ref/KeccakP-400-reference.c +414 -0
- data/ext/xkcp/lib/low/KeccakP-400/ref/KeccakP-400-reference.h +23 -0
- data/ext/xkcp/lib/low/KeccakP-800/ARM/KeccakP-800-SnP.h +42 -0
- data/ext/xkcp/lib/low/KeccakP-800/ARM/KeccakP-800-u1-armv6m-le-armcc.s +527 -0
- data/ext/xkcp/lib/low/KeccakP-800/ARM/KeccakP-800-u1-armv6m-le-gcc.s +533 -0
- data/ext/xkcp/lib/low/KeccakP-800/ARM/KeccakP-800-u2-armv6m-le-armcc.s +528 -0
- data/ext/xkcp/lib/low/KeccakP-800/ARM/KeccakP-800-u2-armv6m-le-gcc.s +534 -0
- data/ext/xkcp/lib/low/KeccakP-800/ARM/KeccakP-800-u2-armv7a-le-armcc.s +521 -0
- data/ext/xkcp/lib/low/KeccakP-800/ARM/KeccakP-800-u2-armv7a-le-gcc.s +527 -0
- data/ext/xkcp/lib/low/KeccakP-800/ARM/KeccakP-800-u2-armv7m-le-armcc.s +517 -0
- data/ext/xkcp/lib/low/KeccakP-800/ARM/KeccakP-800-u2-armv7m-le-gcc.s +523 -0
- data/ext/xkcp/lib/low/KeccakP-800/ARM/KeccakP-800-uf-armv7m-le-armcc.s +550 -0
- data/ext/xkcp/lib/low/KeccakP-800/ARM/KeccakP-800-uf-armv7m-le-gcc.s +556 -0
- data/ext/xkcp/lib/low/KeccakP-800/ARMv8A/KeccakP-800-SnP.h +32 -0
- data/ext/xkcp/lib/low/KeccakP-800/ARMv8A/KeccakP-800-armv8a-neon.s +432 -0
- data/ext/xkcp/lib/low/KeccakP-800/AVR8/KeccakP-800-SnP.h +42 -0
- data/ext/xkcp/lib/low/KeccakP-800/AVR8/KeccakP-800-avr8-fast.s +929 -0
- data/ext/xkcp/lib/low/KeccakP-800/compact/KeccakP-800-SnP.h +40 -0
- data/ext/xkcp/lib/low/KeccakP-800/compact/KeccakP-800-compact.c +244 -0
- data/ext/xkcp/lib/low/KeccakP-800/plain/KeccakP-800-SnP.h +46 -0
- data/ext/xkcp/lib/low/KeccakP-800/plain/KeccakP-800-opt32-bis.macros +184 -0
- data/ext/xkcp/lib/low/KeccakP-800/plain/KeccakP-800-opt32.c +454 -0
- data/ext/xkcp/lib/low/KeccakP-800/plain/KeccakP-800-opt32.macros +459 -0
- data/ext/xkcp/lib/low/KeccakP-800/plain/KeccakP-800-unrolling-bis.macros +83 -0
- data/ext/xkcp/lib/low/KeccakP-800/plain/KeccakP-800-unrolling.macros +88 -0
- data/ext/xkcp/lib/low/KeccakP-800/plain/lcu2/KeccakP-800-opt32-config.h +7 -0
- data/ext/xkcp/lib/low/KeccakP-800/plain/lcua/KeccakP-800-opt32-config.h +7 -0
- data/ext/xkcp/lib/low/KeccakP-800/plain/u2/KeccakP-800-opt32-config.h +7 -0
- data/ext/xkcp/lib/low/KeccakP-800/plain/ua/KeccakP-800-opt32-config.h +7 -0
- data/ext/xkcp/lib/low/KeccakP-800/ref/KeccakP-800-SnP.h +44 -0
- data/ext/xkcp/lib/low/KeccakP-800/ref/KeccakP-800-reference.c +437 -0
- data/ext/xkcp/lib/low/KeccakP-800/ref/KeccakP-800-reference.h +23 -0
- data/ext/xkcp/lib/low/Ketje/OptimizedAsmARM/Ket.h +57 -0
- data/ext/xkcp/lib/low/Ketje/OptimizedAsmARM/KetjeJr-armv7m-le-armcc.s +475 -0
- data/ext/xkcp/lib/low/Ketje/OptimizedAsmARM/KetjeJr-armv7m-le-gcc.s +480 -0
- data/ext/xkcp/lib/low/Ketje/OptimizedAsmARM/KetjeSr-armv7m-le-armcc.s +590 -0
- data/ext/xkcp/lib/low/Ketje/OptimizedAsmARM/KetjeSr-armv7m-le-gcc.s +590 -0
- data/ext/xkcp/lib/low/Ketje/OptimizedLE/Ket.c +126 -0
- data/ext/xkcp/lib/low/Ketje/OptimizedLE/Ket.h +68 -0
- data/ext/xkcp/lib/low/Ketje/OptimizedLE/Ket.inc +174 -0
- data/ext/xkcp/lib/low/Ketje/SnP-compliant/Ket.c +80 -0
- data/ext/xkcp/lib/low/Ketje/SnP-compliant/Ket.h +68 -0
- data/ext/xkcp/lib/low/Ketje/SnP-compliant/Ket.inc +142 -0
- data/ext/xkcp/lib/low/Xoodoo/ARM/Xoodoo-SnP.h +55 -0
- data/ext/xkcp/lib/low/Xoodoo/ARM/Xoodoo-u1-armv6m-le-armcc.s +1086 -0
- data/ext/xkcp/lib/low/Xoodoo/ARM/Xoodoo-u1-armv6m-le-gcc.s +1092 -0
- data/ext/xkcp/lib/low/Xoodoo/ARM/Xoodoo-uf-armv6-le-armcc.s +721 -0
- data/ext/xkcp/lib/low/Xoodoo/ARM/Xoodoo-uf-armv6-le-gcc.s +726 -0
- data/ext/xkcp/lib/low/Xoodoo/ARM/Xoodoo-uf-armv7m-le-armcc.s +723 -0
- data/ext/xkcp/lib/low/Xoodoo/ARM/Xoodoo-uf-armv7m-le-gcc.s +729 -0
- data/ext/xkcp/lib/low/Xoodoo/ARM/Xoodyak-u1-armv6m-le-armcc.s +1164 -0
- data/ext/xkcp/lib/low/Xoodoo/ARM/Xoodyak-u1-armv6m-le-gcc.s +1165 -0
- data/ext/xkcp/lib/low/Xoodoo/ARM/Xoodyak-uf-armv6-le-armcc.s +562 -0
- data/ext/xkcp/lib/low/Xoodoo/ARM/Xoodyak-uf-armv6-le-gcc.s +563 -0
- data/ext/xkcp/lib/low/Xoodoo/ARM/Xoodyak-uf-armv7m-le-armcc.s +563 -0
- data/ext/xkcp/lib/low/Xoodoo/ARM/Xoodyak-uf-armv7m-le-gcc.s +565 -0
- data/ext/xkcp/lib/low/Xoodoo/ARMv7A-NEON/Xoodoo-SnP.h +55 -0
- data/ext/xkcp/lib/low/Xoodoo/ARMv7A-NEON/Xoodoo-uf-armv7a-neon-le-armcc.s +476 -0
- data/ext/xkcp/lib/low/Xoodoo/ARMv7A-NEON/Xoodoo-uf-armv7a-neon-le-gcc.s +485 -0
- data/ext/xkcp/lib/low/Xoodoo/ARMv7A-NEON/Xoodyak-uf-armv7a-neon-le-armcc.s +362 -0
- data/ext/xkcp/lib/low/Xoodoo/ARMv7A-NEON/Xoodyak-uf-armv7a-neon-le-gcc.s +367 -0
- data/ext/xkcp/lib/low/Xoodoo/AVR8/Xoodoo-SnP.h +43 -0
- data/ext/xkcp/lib/low/Xoodoo/AVR8/Xoodoo-avr8-u1.s +1341 -0
- data/ext/xkcp/lib/low/Xoodoo/AVX512/Xoodoo-SIMD512.c +581 -0
- data/ext/xkcp/lib/low/Xoodoo/AVX512/Xoodoo-SnP.h +58 -0
- data/ext/xkcp/lib/low/Xoodoo/AVX512/Xoodyak-full-block-SIMD512.c +332 -0
- data/ext/xkcp/lib/low/Xoodoo/SSE2/Xoodoo-SIMD128.c +329 -0
- data/ext/xkcp/lib/low/Xoodoo/SSE2/Xoodoo-SnP.h +53 -0
- data/ext/xkcp/lib/low/Xoodoo/SSE2/Xoodyak-full-block-SIMD128.c +355 -0
- data/ext/xkcp/lib/low/Xoodoo/Xoodoo.h +79 -0
- data/ext/xkcp/lib/low/Xoodoo/plain/Xoodoo-SnP.h +56 -0
- data/ext/xkcp/lib/low/Xoodoo/plain/Xoodoo-optimized.c +399 -0
- data/ext/xkcp/lib/low/Xoodoo/plain/Xoodyak-full-blocks.c +127 -0
- data/ext/xkcp/lib/low/Xoodoo/ref/Xoodoo-SnP.h +43 -0
- data/ext/xkcp/lib/low/Xoodoo/ref/Xoodoo-reference.c +253 -0
- data/ext/xkcp/lib/low/Xoodoo-times16/AVX512/Xoodoo-times16-SIMD512.c +1044 -0
- data/ext/xkcp/lib/low/Xoodoo-times16/AVX512/Xoodoo-times16-SnP.h +49 -0
- data/ext/xkcp/lib/low/Xoodoo-times16/fallback-on1/Xoodoo-times16-SnP.h +45 -0
- data/ext/xkcp/lib/low/Xoodoo-times16/fallback-on1/Xoodoo-times16-on1.c +37 -0
- data/ext/xkcp/lib/low/Xoodoo-times4/ARMv7A-NEON/Xoodoo-times4-ARMv7A.s +1587 -0
- data/ext/xkcp/lib/low/Xoodoo-times4/ARMv7A-NEON/Xoodoo-times4-SnP.h +48 -0
- data/ext/xkcp/lib/low/Xoodoo-times4/AVX512/Xoodoo-times4-SIMD512.c +1202 -0
- data/ext/xkcp/lib/low/Xoodoo-times4/AVX512/Xoodoo-times4-SnP.h +48 -0
- data/ext/xkcp/lib/low/Xoodoo-times4/SSSE3/Xoodoo-times4-SIMD128.c +484 -0
- data/ext/xkcp/lib/low/Xoodoo-times4/SSSE3/Xoodoo-times4-SnP.h +44 -0
- data/ext/xkcp/lib/low/Xoodoo-times4/fallback-on1/Xoodoo-times4-SnP.h +45 -0
- data/ext/xkcp/lib/low/Xoodoo-times4/fallback-on1/Xoodoo-times4-on1.c +37 -0
- data/ext/xkcp/lib/low/Xoodoo-times8/AVX2/Xoodoo-times8-SIMD256.c +939 -0
- data/ext/xkcp/lib/low/Xoodoo-times8/AVX2/Xoodoo-times8-SnP.h +49 -0
- data/ext/xkcp/lib/low/Xoodoo-times8/AVX512/Xoodoo-times8-SIMD512.c +1216 -0
- data/ext/xkcp/lib/low/Xoodoo-times8/AVX512/Xoodoo-times8-SnP.h +48 -0
- data/ext/xkcp/lib/low/Xoodoo-times8/fallback-on1/Xoodoo-times8-SnP.h +45 -0
- data/ext/xkcp/lib/low/Xoodoo-times8/fallback-on1/Xoodoo-times8-on1.c +37 -0
- data/ext/xkcp/lib/low/common/PlSnP-Fallback.inc +290 -0
- data/ext/xkcp/lib/low/common/SnP-Relaned.h +141 -0
- data/ext/xkcp/support/Build/ExpandProducts.xsl +79 -0
- data/ext/xkcp/support/Build/ToGlobalMakefile.xsl +206 -0
- data/ext/xkcp/support/Build/ToOneTarget.xsl +89 -0
- data/ext/xkcp/support/Build/ToTargetConfigFile.xsl +37 -0
- data/ext/xkcp/support/Build/ToTargetMakefile.xsl +298 -0
- data/ext/xkcp/support/Build/ToVCXProj.xsl +198 -0
- data/ext/xkcp/support/Kernel-PMU/Kernel-pmu.md +133 -0
- data/ext/xkcp/support/Kernel-PMU/Makefile +8 -0
- data/ext/xkcp/support/Kernel-PMU/enable_arm_pmu.c +129 -0
- data/ext/xkcp/support/Kernel-PMU/load-module +1 -0
- data/ext/xkcp/util/KeccakSum/KeccakSum.c +394 -0
- data/ext/xkcp/util/KeccakSum/base64.c +86 -0
- data/ext/xkcp/util/KeccakSum/base64.h +12 -0
- data/lib/sleeping_kangaroo12/binding.rb +15 -0
- data/lib/sleeping_kangaroo12/build/loader.rb +40 -0
- data/lib/sleeping_kangaroo12/build/platform.rb +37 -0
- data/lib/sleeping_kangaroo12/build.rb +4 -0
- data/lib/sleeping_kangaroo12/digest.rb +103 -0
- data/lib/sleeping_kangaroo12/version.rb +5 -0
- data/lib/sleeping_kangaroo12.rb +7 -0
- metadata +372 -0
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/*
|
|
2
|
+
The eXtended Keccak Code Package (XKCP)
|
|
3
|
+
https://github.com/XKCP/XKCP
|
|
4
|
+
|
|
5
|
+
Implementation by Gilles Van Assche and Ronny Van Keer, hereby denoted as "the implementer".
|
|
6
|
+
|
|
7
|
+
For more information, feedback or questions, please refer to the Keccak Team website:
|
|
8
|
+
https://keccak.team/
|
|
9
|
+
|
|
10
|
+
To the extent possible under law, the implementer has waived all copyright
|
|
11
|
+
and related or neighboring rights to the source code in this file.
|
|
12
|
+
http://creativecommons.org/publicdomain/zero/1.0/
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
#ifndef _align_h_
|
|
16
|
+
#define _align_h_
|
|
17
|
+
|
|
18
|
+
/* on Mac OS-X and possibly others, ALIGN(x) is defined in param.h, and -Werror chokes on the redef. */
|
|
19
|
+
#ifdef ALIGN
|
|
20
|
+
#undef ALIGN
|
|
21
|
+
#endif
|
|
22
|
+
|
|
23
|
+
#if defined(__GNUC__)
|
|
24
|
+
#define ALIGN(x) __attribute__ ((aligned(x)))
|
|
25
|
+
#elif defined(_MSC_VER)
|
|
26
|
+
#define ALIGN(x) __declspec(align(x))
|
|
27
|
+
#elif defined(__ARMCC_VERSION)
|
|
28
|
+
#define ALIGN(x) __align(x)
|
|
29
|
+
#else
|
|
30
|
+
#define ALIGN(x)
|
|
31
|
+
#endif
|
|
32
|
+
|
|
33
|
+
#endif
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
/*
|
|
2
|
+
---------------------------------------------------------------------------
|
|
3
|
+
Copyright (c) 1998-2008, Brian Gladman, Worcester, UK. All rights reserved.
|
|
4
|
+
|
|
5
|
+
LICENSE TERMS
|
|
6
|
+
|
|
7
|
+
The redistribution and use of this software (with or without changes)
|
|
8
|
+
is allowed without the payment of fees or royalties provided that:
|
|
9
|
+
|
|
10
|
+
1. source code distributions include the above copyright notice, this
|
|
11
|
+
list of conditions and the following disclaimer;
|
|
12
|
+
|
|
13
|
+
2. binary distributions include the above copyright notice, this list
|
|
14
|
+
of conditions and the following disclaimer in their documentation;
|
|
15
|
+
|
|
16
|
+
3. the name of the copyright holder is not used to endorse products
|
|
17
|
+
built using this software without specific written permission.
|
|
18
|
+
|
|
19
|
+
DISCLAIMER
|
|
20
|
+
|
|
21
|
+
This software is provided 'as is' with no explicit or implied warranties
|
|
22
|
+
in respect of its properties, including, but not limited to, correctness
|
|
23
|
+
and/or fitness for purpose.
|
|
24
|
+
---------------------------------------------------------------------------
|
|
25
|
+
Issue Date: 20/12/2007
|
|
26
|
+
Changes for ARM 9/9/2010
|
|
27
|
+
*/
|
|
28
|
+
|
|
29
|
+
#ifndef _BRG_ENDIAN_H
|
|
30
|
+
#define _BRG_ENDIAN_H
|
|
31
|
+
|
|
32
|
+
#define IS_BIG_ENDIAN 4321 /* byte 0 is most significant (mc68k) */
|
|
33
|
+
#define IS_LITTLE_ENDIAN 1234 /* byte 0 is least significant (i386) */
|
|
34
|
+
|
|
35
|
+
#if 0
|
|
36
|
+
/* Include files where endian defines and byteswap functions may reside */
|
|
37
|
+
#if defined( __sun )
|
|
38
|
+
# include <sys/isa_defs.h>
|
|
39
|
+
#elif defined( __FreeBSD__ ) || defined( __OpenBSD__ ) || defined( __NetBSD__ )
|
|
40
|
+
# include <sys/endian.h>
|
|
41
|
+
#elif defined( BSD ) && ( BSD >= 199103 ) || defined( __APPLE__ ) || \
|
|
42
|
+
defined( __CYGWIN32__ ) || defined( __DJGPP__ ) || defined( __osf__ )
|
|
43
|
+
# include <machine/endian.h>
|
|
44
|
+
#elif defined( __linux__ ) || defined( __GNUC__ ) || defined( __GNU_LIBRARY__ )
|
|
45
|
+
# if !defined( __MINGW32__ ) && !defined( _AIX )
|
|
46
|
+
# include <endian.h>
|
|
47
|
+
# if !defined( __BEOS__ )
|
|
48
|
+
# include <byteswap.h>
|
|
49
|
+
# endif
|
|
50
|
+
# endif
|
|
51
|
+
#endif
|
|
52
|
+
#endif
|
|
53
|
+
|
|
54
|
+
/* Now attempt to set the define for platform byte order using any */
|
|
55
|
+
/* of the four forms SYMBOL, _SYMBOL, __SYMBOL & __SYMBOL__, which */
|
|
56
|
+
/* seem to encompass most endian symbol definitions */
|
|
57
|
+
|
|
58
|
+
#if defined( BIG_ENDIAN ) && defined( LITTLE_ENDIAN )
|
|
59
|
+
# if defined( BYTE_ORDER ) && BYTE_ORDER == BIG_ENDIAN
|
|
60
|
+
# define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN
|
|
61
|
+
# elif defined( BYTE_ORDER ) && BYTE_ORDER == LITTLE_ENDIAN
|
|
62
|
+
# define PLATFORM_BYTE_ORDER IS_LITTLE_ENDIAN
|
|
63
|
+
# endif
|
|
64
|
+
#elif defined( BIG_ENDIAN )
|
|
65
|
+
# define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN
|
|
66
|
+
#elif defined( LITTLE_ENDIAN )
|
|
67
|
+
# define PLATFORM_BYTE_ORDER IS_LITTLE_ENDIAN
|
|
68
|
+
#endif
|
|
69
|
+
|
|
70
|
+
#if defined( _BIG_ENDIAN ) && defined( _LITTLE_ENDIAN )
|
|
71
|
+
# if defined( _BYTE_ORDER ) && _BYTE_ORDER == _BIG_ENDIAN
|
|
72
|
+
# define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN
|
|
73
|
+
# elif defined( _BYTE_ORDER ) && _BYTE_ORDER == _LITTLE_ENDIAN
|
|
74
|
+
# define PLATFORM_BYTE_ORDER IS_LITTLE_ENDIAN
|
|
75
|
+
# endif
|
|
76
|
+
#elif defined( _BIG_ENDIAN )
|
|
77
|
+
# define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN
|
|
78
|
+
#elif defined( _LITTLE_ENDIAN )
|
|
79
|
+
# define PLATFORM_BYTE_ORDER IS_LITTLE_ENDIAN
|
|
80
|
+
#endif
|
|
81
|
+
|
|
82
|
+
#if defined( __BIG_ENDIAN ) && defined( __LITTLE_ENDIAN )
|
|
83
|
+
# if defined( __BYTE_ORDER ) && __BYTE_ORDER == __BIG_ENDIAN
|
|
84
|
+
# define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN
|
|
85
|
+
# elif defined( __BYTE_ORDER ) && __BYTE_ORDER == __LITTLE_ENDIAN
|
|
86
|
+
# define PLATFORM_BYTE_ORDER IS_LITTLE_ENDIAN
|
|
87
|
+
# endif
|
|
88
|
+
#elif defined( __BIG_ENDIAN )
|
|
89
|
+
# define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN
|
|
90
|
+
#elif defined( __LITTLE_ENDIAN )
|
|
91
|
+
# define PLATFORM_BYTE_ORDER IS_LITTLE_ENDIAN
|
|
92
|
+
#endif
|
|
93
|
+
|
|
94
|
+
#if defined( __BIG_ENDIAN__ ) && defined( __LITTLE_ENDIAN__ )
|
|
95
|
+
# if defined( __BYTE_ORDER__ ) && __BYTE_ORDER__ == __BIG_ENDIAN__
|
|
96
|
+
# define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN
|
|
97
|
+
# elif defined( __BYTE_ORDER__ ) && __BYTE_ORDER__ == __LITTLE_ENDIAN__
|
|
98
|
+
# define PLATFORM_BYTE_ORDER IS_LITTLE_ENDIAN
|
|
99
|
+
# endif
|
|
100
|
+
#elif defined( __BIG_ENDIAN__ )
|
|
101
|
+
# define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN
|
|
102
|
+
#elif defined( __LITTLE_ENDIAN__ )
|
|
103
|
+
# define PLATFORM_BYTE_ORDER IS_LITTLE_ENDIAN
|
|
104
|
+
#endif
|
|
105
|
+
|
|
106
|
+
/* if the platform byte order could not be determined, then try to */
|
|
107
|
+
/* set this define using common machine defines */
|
|
108
|
+
#if !defined(PLATFORM_BYTE_ORDER)
|
|
109
|
+
|
|
110
|
+
#if defined( __alpha__ ) || defined( __alpha ) || defined( i386 ) || \
|
|
111
|
+
defined( __i386__ ) || defined( _M_I86 ) || defined( _M_IX86 ) || \
|
|
112
|
+
defined( __OS2__ ) || defined( sun386 ) || defined( __TURBOC__ ) || \
|
|
113
|
+
defined( vax ) || defined( vms ) || defined( VMS ) || \
|
|
114
|
+
defined( __VMS ) || defined( _M_X64 )
|
|
115
|
+
# define PLATFORM_BYTE_ORDER IS_LITTLE_ENDIAN
|
|
116
|
+
|
|
117
|
+
#elif defined( AMIGA ) || defined( applec ) || defined( __AS400__ ) || \
|
|
118
|
+
defined( _CRAY ) || defined( __hppa ) || defined( __hp9000 ) || \
|
|
119
|
+
defined( ibm370 ) || defined( mc68000 ) || defined( m68k ) || \
|
|
120
|
+
defined( __MRC__ ) || defined( __MVS__ ) || defined( __MWERKS__ ) || \
|
|
121
|
+
defined( sparc ) || defined( __sparc) || defined( SYMANTEC_C ) || \
|
|
122
|
+
defined( __VOS__ ) || defined( __TIGCC__ ) || defined( __TANDEM ) || \
|
|
123
|
+
defined( THINK_C ) || defined( __VMCMS__ ) || defined( _AIX ) || \
|
|
124
|
+
defined( __s390__ ) || defined( __s390x__ ) || defined( __zarch__ )
|
|
125
|
+
# define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN
|
|
126
|
+
|
|
127
|
+
#elif defined(__arm__)
|
|
128
|
+
# ifdef __BIG_ENDIAN
|
|
129
|
+
# define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN
|
|
130
|
+
# else
|
|
131
|
+
# define PLATFORM_BYTE_ORDER IS_LITTLE_ENDIAN
|
|
132
|
+
# endif
|
|
133
|
+
#elif 1 /* **** EDIT HERE IF NECESSARY **** */
|
|
134
|
+
# define PLATFORM_BYTE_ORDER IS_LITTLE_ENDIAN
|
|
135
|
+
#elif 0 /* **** EDIT HERE IF NECESSARY **** */
|
|
136
|
+
# define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN
|
|
137
|
+
#else
|
|
138
|
+
# error Please edit lines 132 or 134 in brg_endian.h to set the platform byte order
|
|
139
|
+
#endif
|
|
140
|
+
|
|
141
|
+
#endif
|
|
142
|
+
|
|
143
|
+
#endif
|
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
/*
|
|
2
|
+
The eXtended Keccak Code Package (XKCP)
|
|
3
|
+
https://github.com/XKCP/XKCP
|
|
4
|
+
|
|
5
|
+
KangarooTwelve, designed by Guido Bertoni, Joan Daemen, Michaël Peeters, Gilles Van Assche, Ronny Van Keer and Benoît Viguier.
|
|
6
|
+
|
|
7
|
+
Implementation by Ronny Van Keer, hereby denoted as "the implementer".
|
|
8
|
+
|
|
9
|
+
For more information, feedback or questions, please refer to the Keccak Team website:
|
|
10
|
+
https://keccak.team/
|
|
11
|
+
|
|
12
|
+
To the extent possible under law, the implementer has waived all copyright
|
|
13
|
+
and related or neighboring rights to the source code in this file.
|
|
14
|
+
http://creativecommons.org/publicdomain/zero/1.0/
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
#include <string.h>
|
|
18
|
+
#include <stdint.h>
|
|
19
|
+
#include "KangarooTwelve.h"
|
|
20
|
+
|
|
21
|
+
#ifdef XKCP_has_KeccakP1600times2
|
|
22
|
+
#include "KeccakP-1600-times2-SnP.h"
|
|
23
|
+
#endif
|
|
24
|
+
|
|
25
|
+
#ifdef XKCP_has_KeccakP1600times4
|
|
26
|
+
#include "KeccakP-1600-times4-SnP.h"
|
|
27
|
+
#endif
|
|
28
|
+
|
|
29
|
+
#ifdef XKCP_has_KeccakP1600times8
|
|
30
|
+
#include "KeccakP-1600-times8-SnP.h"
|
|
31
|
+
#endif
|
|
32
|
+
|
|
33
|
+
#define chunkSize 8192
|
|
34
|
+
#define laneSize 8
|
|
35
|
+
#define suffixLeaf 0x0B /* '110': message hop, simple padding, inner node */
|
|
36
|
+
|
|
37
|
+
#define security 128
|
|
38
|
+
#define capacity (2*security)
|
|
39
|
+
#define capacityInBytes (capacity/8)
|
|
40
|
+
#define capacityInLanes (capacityInBytes/laneSize)
|
|
41
|
+
#define rate (1600-capacity)
|
|
42
|
+
#define rateInBytes (rate/8)
|
|
43
|
+
#define rateInLanes (rateInBytes/laneSize)
|
|
44
|
+
|
|
45
|
+
#define ParallelSpongeFastLoop( Parallellism ) \
|
|
46
|
+
while ( inLen >= Parallellism * chunkSize ) { \
|
|
47
|
+
ALIGN(KeccakP1600times##Parallellism##_statesAlignment) unsigned char states[KeccakP1600times##Parallellism##_statesSizeInBytes]; \
|
|
48
|
+
unsigned char intermediate[Parallellism*capacityInBytes]; \
|
|
49
|
+
unsigned int localBlockLen = chunkSize; \
|
|
50
|
+
const unsigned char * localInput = input; \
|
|
51
|
+
unsigned int i; \
|
|
52
|
+
unsigned int fastLoopOffset; \
|
|
53
|
+
\
|
|
54
|
+
KeccakP1600times##Parallellism##_StaticInitialize(); \
|
|
55
|
+
KeccakP1600times##Parallellism##_InitializeAll(states); \
|
|
56
|
+
fastLoopOffset = (unsigned int)KeccakP1600times##Parallellism##_12rounds_FastLoop_Absorb(states, rateInLanes, chunkSize / laneSize, rateInLanes, localInput, Parallellism * chunkSize); \
|
|
57
|
+
localBlockLen -= fastLoopOffset; \
|
|
58
|
+
localInput += fastLoopOffset; \
|
|
59
|
+
for ( i = 0; i < Parallellism; ++i, localInput += chunkSize ) { \
|
|
60
|
+
KeccakP1600times##Parallellism##_AddBytes(states, i, localInput, 0, localBlockLen); \
|
|
61
|
+
KeccakP1600times##Parallellism##_AddByte(states, i, suffixLeaf, localBlockLen); \
|
|
62
|
+
KeccakP1600times##Parallellism##_AddByte(states, i, 0x80, rateInBytes-1); \
|
|
63
|
+
} \
|
|
64
|
+
KeccakP1600times##Parallellism##_PermuteAll_12rounds(states); \
|
|
65
|
+
input += Parallellism * chunkSize; \
|
|
66
|
+
inLen -= Parallellism * chunkSize; \
|
|
67
|
+
ktInstance->blockNumber += Parallellism; \
|
|
68
|
+
KeccakP1600times##Parallellism##_ExtractLanesAll(states, intermediate, capacityInLanes, capacityInLanes ); \
|
|
69
|
+
if (KeccakWidth1600_12rounds_SpongeAbsorb(&ktInstance->finalNode, intermediate, Parallellism * capacityInBytes) != 0) return 1; \
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
#define ParallelSpongeLoop( Parallellism ) \
|
|
73
|
+
while ( inLen >= Parallellism * chunkSize ) { \
|
|
74
|
+
ALIGN(KeccakP1600times##Parallellism##_statesAlignment) unsigned char states[KeccakP1600times##Parallellism##_statesSizeInBytes]; \
|
|
75
|
+
unsigned char intermediate[Parallellism*capacityInBytes]; \
|
|
76
|
+
unsigned int localBlockLen = chunkSize; \
|
|
77
|
+
const unsigned char * localInput = input; \
|
|
78
|
+
unsigned int i; \
|
|
79
|
+
\
|
|
80
|
+
KeccakP1600times##Parallellism##_StaticInitialize(); \
|
|
81
|
+
KeccakP1600times##Parallellism##_InitializeAll(states); \
|
|
82
|
+
while(localBlockLen >= rateInBytes) { \
|
|
83
|
+
KeccakP1600times##Parallellism##_AddLanesAll(states, localInput, rateInLanes, chunkSize / laneSize); \
|
|
84
|
+
KeccakP1600times##Parallellism##_PermuteAll_12rounds(states); \
|
|
85
|
+
localBlockLen -= rateInBytes; \
|
|
86
|
+
localInput += rateInBytes; \
|
|
87
|
+
} \
|
|
88
|
+
for ( i = 0; i < Parallellism; ++i, localInput += chunkSize ) { \
|
|
89
|
+
KeccakP1600times##Parallellism##_AddBytes(states, i, localInput, 0, localBlockLen); \
|
|
90
|
+
KeccakP1600times##Parallellism##_AddByte(states, i, suffixLeaf, localBlockLen); \
|
|
91
|
+
KeccakP1600times##Parallellism##_AddByte(states, i, 0x80, rateInBytes-1); \
|
|
92
|
+
} \
|
|
93
|
+
KeccakP1600times##Parallellism##_PermuteAll_12rounds(states); \
|
|
94
|
+
input += Parallellism * chunkSize; \
|
|
95
|
+
inLen -= Parallellism * chunkSize; \
|
|
96
|
+
ktInstance->blockNumber += Parallellism; \
|
|
97
|
+
KeccakP1600times##Parallellism##_ExtractLanesAll(states, intermediate, capacityInLanes, capacityInLanes ); \
|
|
98
|
+
if (KeccakWidth1600_12rounds_SpongeAbsorb(&ktInstance->finalNode, intermediate, Parallellism * capacityInBytes) != 0) return 1; \
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
#define ProcessLeaves( Parallellism ) \
|
|
102
|
+
while ( inLen >= Parallellism * chunkSize ) { \
|
|
103
|
+
unsigned char intermediate[Parallellism*capacityInBytes]; \
|
|
104
|
+
\
|
|
105
|
+
KeccakP1600times##Parallellism##_K12ProcessLeaves(input, intermediate); \
|
|
106
|
+
input += Parallellism * chunkSize; \
|
|
107
|
+
inLen -= Parallellism * chunkSize; \
|
|
108
|
+
ktInstance->blockNumber += Parallellism; \
|
|
109
|
+
if (KeccakWidth1600_12rounds_SpongeAbsorb(&ktInstance->finalNode, intermediate, Parallellism * capacityInBytes) != 0) return 1; \
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
static unsigned int right_encode( unsigned char * encbuf, size_t value )
|
|
113
|
+
{
|
|
114
|
+
unsigned int n, i;
|
|
115
|
+
size_t v;
|
|
116
|
+
|
|
117
|
+
for ( v = value, n = 0; v && (n < sizeof(size_t)); ++n, v >>= 8 )
|
|
118
|
+
; /* empty */
|
|
119
|
+
for ( i = 1; i <= n; ++i )
|
|
120
|
+
encbuf[i-1] = (unsigned char)(value >> (8 * (n-i)));
|
|
121
|
+
encbuf[n] = (unsigned char)n;
|
|
122
|
+
return n + 1;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
int KangarooTwelve_Initialize(KangarooTwelve_Instance *ktInstance, size_t outputLen)
|
|
126
|
+
{
|
|
127
|
+
ktInstance->fixedOutputLength = outputLen;
|
|
128
|
+
ktInstance->queueAbsorbedLen = 0;
|
|
129
|
+
ktInstance->blockNumber = 0;
|
|
130
|
+
ktInstance->phase = ABSORBING;
|
|
131
|
+
return KeccakWidth1600_12rounds_SpongeInitialize(&ktInstance->finalNode, rate, capacity);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
int KangarooTwelve_Update(KangarooTwelve_Instance *ktInstance, const unsigned char *input, size_t inLen)
|
|
135
|
+
{
|
|
136
|
+
if (ktInstance->phase != ABSORBING)
|
|
137
|
+
return 1;
|
|
138
|
+
|
|
139
|
+
if ( ktInstance->blockNumber == 0 ) {
|
|
140
|
+
/* First block, absorb in final node */
|
|
141
|
+
unsigned int len = (inLen < (chunkSize - ktInstance->queueAbsorbedLen)) ? (unsigned int)inLen : (chunkSize - ktInstance->queueAbsorbedLen);
|
|
142
|
+
if (KeccakWidth1600_12rounds_SpongeAbsorb(&ktInstance->finalNode, input, len) != 0)
|
|
143
|
+
return 1;
|
|
144
|
+
input += len;
|
|
145
|
+
inLen -= len;
|
|
146
|
+
ktInstance->queueAbsorbedLen += len;
|
|
147
|
+
if ( (ktInstance->queueAbsorbedLen == chunkSize) && (inLen != 0) ) {
|
|
148
|
+
/* First block complete and more input data available, finalize it */
|
|
149
|
+
const unsigned char padding = 0x03; /* '110^6': message hop, simple padding */
|
|
150
|
+
ktInstance->queueAbsorbedLen = 0;
|
|
151
|
+
ktInstance->blockNumber = 1;
|
|
152
|
+
if (KeccakWidth1600_12rounds_SpongeAbsorb(&ktInstance->finalNode, &padding, 1) != 0)
|
|
153
|
+
return 1;
|
|
154
|
+
ktInstance->finalNode.byteIOIndex = (ktInstance->finalNode.byteIOIndex + 7) & ~7; /* Zero padding up to 64 bits */
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
else if ( ktInstance->queueAbsorbedLen != 0 ) {
|
|
158
|
+
/* There is data in the queue, absorb further in queue until block complete */
|
|
159
|
+
unsigned int len = (inLen < (chunkSize - ktInstance->queueAbsorbedLen)) ? (unsigned int)inLen : (chunkSize - ktInstance->queueAbsorbedLen);
|
|
160
|
+
if (KeccakWidth1600_12rounds_SpongeAbsorb(&ktInstance->queueNode, input, len) != 0)
|
|
161
|
+
return 1;
|
|
162
|
+
input += len;
|
|
163
|
+
inLen -= len;
|
|
164
|
+
ktInstance->queueAbsorbedLen += len;
|
|
165
|
+
if ( ktInstance->queueAbsorbedLen == chunkSize ) {
|
|
166
|
+
unsigned char intermediate[capacityInBytes];
|
|
167
|
+
ktInstance->queueAbsorbedLen = 0;
|
|
168
|
+
++ktInstance->blockNumber;
|
|
169
|
+
if (KeccakWidth1600_12rounds_SpongeAbsorbLastFewBits(&ktInstance->queueNode, suffixLeaf) != 0)
|
|
170
|
+
return 1;
|
|
171
|
+
if (KeccakWidth1600_12rounds_SpongeSqueeze(&ktInstance->queueNode, intermediate, capacityInBytes) != 0)
|
|
172
|
+
return 1;
|
|
173
|
+
if (KeccakWidth1600_12rounds_SpongeAbsorb(&ktInstance->finalNode, intermediate, capacityInBytes) != 0)
|
|
174
|
+
return 1;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
#if defined(KeccakP1600times8_implementation) && !defined(KeccakP1600times8_isFallback)
|
|
179
|
+
#if defined(KeccakP1600times8_K12ProcessLeaves_supported)
|
|
180
|
+
ProcessLeaves( 8 )
|
|
181
|
+
#elif defined(KeccakP1600times8_12rounds_FastLoop_supported)
|
|
182
|
+
ParallelSpongeFastLoop( 8 )
|
|
183
|
+
#else
|
|
184
|
+
ParallelSpongeLoop( 8 )
|
|
185
|
+
#endif
|
|
186
|
+
#endif
|
|
187
|
+
|
|
188
|
+
#if defined(KeccakP1600times4_implementation) && !defined(KeccakP1600times4_isFallback)
|
|
189
|
+
#if defined(KeccakP1600times4_K12ProcessLeaves_supported)
|
|
190
|
+
ProcessLeaves( 4 )
|
|
191
|
+
#elif defined(KeccakP1600times4_12rounds_FastLoop_supported)
|
|
192
|
+
ParallelSpongeFastLoop( 4 )
|
|
193
|
+
#else
|
|
194
|
+
ParallelSpongeLoop( 4 )
|
|
195
|
+
#endif
|
|
196
|
+
#endif
|
|
197
|
+
|
|
198
|
+
#if defined(KeccakP1600times2_implementation) && !defined(KeccakP1600times2_isFallback)
|
|
199
|
+
#if defined(KeccakP1600times2_K12ProcessLeaves_supported)
|
|
200
|
+
ProcessLeaves( 2 )
|
|
201
|
+
#elif defined(KeccakP1600times2_12rounds_FastLoop_supported)
|
|
202
|
+
ParallelSpongeFastLoop( 2 )
|
|
203
|
+
#else
|
|
204
|
+
ParallelSpongeLoop( 2 )
|
|
205
|
+
#endif
|
|
206
|
+
#endif
|
|
207
|
+
|
|
208
|
+
while ( inLen > 0 ) {
|
|
209
|
+
unsigned int len = (inLen < chunkSize) ? (unsigned int)inLen : chunkSize;
|
|
210
|
+
if (KeccakWidth1600_12rounds_SpongeInitialize(&ktInstance->queueNode, rate, capacity) != 0)
|
|
211
|
+
return 1;
|
|
212
|
+
if (KeccakWidth1600_12rounds_SpongeAbsorb(&ktInstance->queueNode, input, len) != 0)
|
|
213
|
+
return 1;
|
|
214
|
+
input += len;
|
|
215
|
+
inLen -= len;
|
|
216
|
+
if ( len == chunkSize ) {
|
|
217
|
+
unsigned char intermediate[capacityInBytes];
|
|
218
|
+
++ktInstance->blockNumber;
|
|
219
|
+
if (KeccakWidth1600_12rounds_SpongeAbsorbLastFewBits(&ktInstance->queueNode, suffixLeaf) != 0)
|
|
220
|
+
return 1;
|
|
221
|
+
if (KeccakWidth1600_12rounds_SpongeSqueeze(&ktInstance->queueNode, intermediate, capacityInBytes) != 0)
|
|
222
|
+
return 1;
|
|
223
|
+
if (KeccakWidth1600_12rounds_SpongeAbsorb(&ktInstance->finalNode, intermediate, capacityInBytes) != 0)
|
|
224
|
+
return 1;
|
|
225
|
+
}
|
|
226
|
+
else
|
|
227
|
+
ktInstance->queueAbsorbedLen = len;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
return 0;
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
int KangarooTwelve_Final(KangarooTwelve_Instance *ktInstance, unsigned char * output, const unsigned char * customization, size_t customLen)
|
|
234
|
+
{
|
|
235
|
+
unsigned char encbuf[sizeof(size_t)+1+2];
|
|
236
|
+
unsigned char padding;
|
|
237
|
+
|
|
238
|
+
if (ktInstance->phase != ABSORBING)
|
|
239
|
+
return 1;
|
|
240
|
+
|
|
241
|
+
/* Absorb customization | right_encode(customLen) */
|
|
242
|
+
if ((customLen != 0) && (KangarooTwelve_Update(ktInstance, customization, customLen) != 0))
|
|
243
|
+
return 1;
|
|
244
|
+
if (KangarooTwelve_Update(ktInstance, encbuf, right_encode(encbuf, customLen)) != 0)
|
|
245
|
+
return 1;
|
|
246
|
+
|
|
247
|
+
if ( ktInstance->blockNumber == 0 ) {
|
|
248
|
+
/* Non complete first block in final node, pad it */
|
|
249
|
+
padding = 0x07; /* '11': message hop, final node */
|
|
250
|
+
}
|
|
251
|
+
else {
|
|
252
|
+
unsigned int n;
|
|
253
|
+
|
|
254
|
+
if ( ktInstance->queueAbsorbedLen != 0 ) {
|
|
255
|
+
/* There is data in the queue node */
|
|
256
|
+
unsigned char intermediate[capacityInBytes];
|
|
257
|
+
++ktInstance->blockNumber;
|
|
258
|
+
if (KeccakWidth1600_12rounds_SpongeAbsorbLastFewBits(&ktInstance->queueNode, suffixLeaf) != 0)
|
|
259
|
+
return 1;
|
|
260
|
+
if (KeccakWidth1600_12rounds_SpongeSqueeze(&ktInstance->queueNode, intermediate, capacityInBytes) != 0)
|
|
261
|
+
return 1;
|
|
262
|
+
if (KeccakWidth1600_12rounds_SpongeAbsorb(&ktInstance->finalNode, intermediate, capacityInBytes) != 0)
|
|
263
|
+
return 1;
|
|
264
|
+
}
|
|
265
|
+
--ktInstance->blockNumber; /* Absorb right_encode(number of Chaining Values) || 0xFF || 0xFF */
|
|
266
|
+
n = right_encode(encbuf, ktInstance->blockNumber);
|
|
267
|
+
encbuf[n++] = 0xFF;
|
|
268
|
+
encbuf[n++] = 0xFF;
|
|
269
|
+
if (KeccakWidth1600_12rounds_SpongeAbsorb(&ktInstance->finalNode, encbuf, n) != 0)
|
|
270
|
+
return 1;
|
|
271
|
+
padding = 0x06; /* '01': chaining hop, final node */
|
|
272
|
+
}
|
|
273
|
+
if (KeccakWidth1600_12rounds_SpongeAbsorbLastFewBits(&ktInstance->finalNode, padding) != 0)
|
|
274
|
+
return 1;
|
|
275
|
+
if ( ktInstance->fixedOutputLength != 0 ) {
|
|
276
|
+
ktInstance->phase = FINAL;
|
|
277
|
+
return KeccakWidth1600_12rounds_SpongeSqueeze(&ktInstance->finalNode, output, ktInstance->fixedOutputLength);
|
|
278
|
+
}
|
|
279
|
+
ktInstance->phase = SQUEEZING;
|
|
280
|
+
return 0;
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
int KangarooTwelve_Squeeze(KangarooTwelve_Instance *ktInstance, unsigned char * output, size_t outputLen)
|
|
284
|
+
{
|
|
285
|
+
if (ktInstance->phase != SQUEEZING)
|
|
286
|
+
return 1;
|
|
287
|
+
return KeccakWidth1600_12rounds_SpongeSqueeze(&ktInstance->finalNode, output, outputLen);
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
int KangarooTwelve( const unsigned char * input, size_t inLen, unsigned char * output, size_t outLen, const unsigned char * customization, size_t customLen )
|
|
291
|
+
{
|
|
292
|
+
KangarooTwelve_Instance ktInstance;
|
|
293
|
+
|
|
294
|
+
if (outLen == 0)
|
|
295
|
+
return 1;
|
|
296
|
+
if (KangarooTwelve_Initialize(&ktInstance, outLen) != 0)
|
|
297
|
+
return 1;
|
|
298
|
+
if (KangarooTwelve_Update(&ktInstance, input, inLen) != 0)
|
|
299
|
+
return 1;
|
|
300
|
+
return KangarooTwelve_Final(&ktInstance, output, customization, customLen);
|
|
301
|
+
}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/*
|
|
2
|
+
The eXtended Keccak Code Package (XKCP)
|
|
3
|
+
https://github.com/XKCP/XKCP
|
|
4
|
+
|
|
5
|
+
KangarooTwelve, designed by Guido Bertoni, Joan Daemen, Michaël Peeters, Gilles Van Assche, Ronny Van Keer and Benoît Viguier.
|
|
6
|
+
|
|
7
|
+
Implementation by Ronny Van Keer, hereby denoted as "the implementer".
|
|
8
|
+
|
|
9
|
+
For more information, feedback or questions, please refer to the Keccak Team website:
|
|
10
|
+
https://keccak.team/
|
|
11
|
+
|
|
12
|
+
To the extent possible under law, the implementer has waived all copyright
|
|
13
|
+
and related or neighboring rights to the source code in this file.
|
|
14
|
+
http://creativecommons.org/publicdomain/zero/1.0/
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
#ifndef _KangarooTwelve_h_
|
|
18
|
+
#define _KangarooTwelve_h_
|
|
19
|
+
|
|
20
|
+
#include "config.h"
|
|
21
|
+
#ifdef XKCP_has_KeccakP1600
|
|
22
|
+
|
|
23
|
+
#include <stddef.h>
|
|
24
|
+
#include "align.h"
|
|
25
|
+
#include "KeccakSponge.h"
|
|
26
|
+
#include "Phases.h"
|
|
27
|
+
|
|
28
|
+
typedef KCP_Phases KangarooTwelve_Phases;
|
|
29
|
+
|
|
30
|
+
typedef struct {
|
|
31
|
+
KeccakWidth1600_12rounds_SpongeInstance queueNode;
|
|
32
|
+
KeccakWidth1600_12rounds_SpongeInstance finalNode;
|
|
33
|
+
size_t fixedOutputLength;
|
|
34
|
+
size_t blockNumber;
|
|
35
|
+
unsigned int queueAbsorbedLen;
|
|
36
|
+
KangarooTwelve_Phases phase;
|
|
37
|
+
} KangarooTwelve_Instance;
|
|
38
|
+
|
|
39
|
+
/** Extendable ouput function KangarooTwelve.
|
|
40
|
+
* @param input Pointer to the input message (M).
|
|
41
|
+
* @param inputByteLen The length of the input message in bytes.
|
|
42
|
+
* @param output Pointer to the output buffer.
|
|
43
|
+
* @param outputByteLen The desired number of output bytes.
|
|
44
|
+
* @param customization Pointer to the customization string (C).
|
|
45
|
+
* @param customByteLen The length of the customization string in bytes.
|
|
46
|
+
* @return 0 if successful, 1 otherwise.
|
|
47
|
+
*/
|
|
48
|
+
int KangarooTwelve(const unsigned char *input, size_t inputByteLen, unsigned char *output, size_t outputByteLen, const unsigned char *customization, size_t customByteLen );
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Function to initialize a KangarooTwelve instance.
|
|
52
|
+
* @param ktInstance Pointer to the instance to be initialized.
|
|
53
|
+
* @param outputByteLen The desired number of output bytes,
|
|
54
|
+
* or 0 for an arbitrarily-long output.
|
|
55
|
+
* @return 0 if successful, 1 otherwise.
|
|
56
|
+
*/
|
|
57
|
+
int KangarooTwelve_Initialize(KangarooTwelve_Instance *ktInstance, size_t outputByteLen);
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Function to give input data to be absorbed.
|
|
61
|
+
* @param ktInstance Pointer to the instance initialized by KangarooTwelve_Initialize().
|
|
62
|
+
* @param input Pointer to the input message data (M).
|
|
63
|
+
* @param inputByteLen The number of bytes provided in the input message data.
|
|
64
|
+
* @return 0 if successful, 1 otherwise.
|
|
65
|
+
*/
|
|
66
|
+
int KangarooTwelve_Update(KangarooTwelve_Instance *ktInstance, const unsigned char *input, size_t inputByteLen);
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Function to call after all the input message has been input, and to get
|
|
70
|
+
* output bytes if the length was specified when calling KangarooTwelve_Initialize().
|
|
71
|
+
* @param ktInstance Pointer to the hash instance initialized by KangarooTwelve_Initialize().
|
|
72
|
+
* If @a outputByteLen was not 0 in the call to KangarooTwelve_Initialize(), the number of
|
|
73
|
+
* output bytes is equal to @a outputByteLen.
|
|
74
|
+
* If @a outputByteLen was 0 in the call to KangarooTwelve_Initialize(), the output bytes
|
|
75
|
+
* must be extracted using the KangarooTwelve_Squeeze() function.
|
|
76
|
+
* @param output Pointer to the buffer where to store the output data.
|
|
77
|
+
* @param customization Pointer to the customization string (C).
|
|
78
|
+
* @param customByteLen The length of the customization string in bytes.
|
|
79
|
+
* @return 0 if successful, 1 otherwise.
|
|
80
|
+
*/
|
|
81
|
+
int KangarooTwelve_Final(KangarooTwelve_Instance *ktInstance, unsigned char *output, const unsigned char *customization, size_t customByteLen);
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Function to squeeze output data.
|
|
85
|
+
* @param ktInstance Pointer to the hash instance initialized by KangarooTwelve_Initialize().
|
|
86
|
+
* @param data Pointer to the buffer where to store the output data.
|
|
87
|
+
* @param outputByteLen The number of output bytes desired.
|
|
88
|
+
* @pre KangarooTwelve_Final() must have been already called.
|
|
89
|
+
* @return 0 if successful, 1 otherwise.
|
|
90
|
+
*/
|
|
91
|
+
int KangarooTwelve_Squeeze(KangarooTwelve_Instance *ktInstance, unsigned char *output, size_t outputByteLen);
|
|
92
|
+
|
|
93
|
+
#else
|
|
94
|
+
#error This requires an implementation of Keccak-p[1600]
|
|
95
|
+
#endif
|
|
96
|
+
|
|
97
|
+
#endif
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/*
|
|
2
|
+
The eXtended Keccak Code Package (XKCP)
|
|
3
|
+
https://github.com/XKCP/XKCP
|
|
4
|
+
|
|
5
|
+
Keccak, designed by Guido Bertoni, Joan Daemen, Michaël Peeters and Gilles Van Assche.
|
|
6
|
+
|
|
7
|
+
Implementation by the designers, hereby denoted as "the implementer".
|
|
8
|
+
|
|
9
|
+
For more information, feedback or questions, please refer to the Keccak Team website:
|
|
10
|
+
https://keccak.team/
|
|
11
|
+
|
|
12
|
+
To the extent possible under law, the implementer has waived all copyright
|
|
13
|
+
and related or neighboring rights to the source code in this file.
|
|
14
|
+
http://creativecommons.org/publicdomain/zero/1.0/
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
#include <string.h>
|
|
18
|
+
#include "KeccakHash.h"
|
|
19
|
+
|
|
20
|
+
/* ---------------------------------------------------------------- */
|
|
21
|
+
|
|
22
|
+
HashReturn Keccak_HashInitialize(Keccak_HashInstance *instance, unsigned int rate, unsigned int capacity, unsigned int hashbitlen, unsigned char delimitedSuffix)
|
|
23
|
+
{
|
|
24
|
+
HashReturn result;
|
|
25
|
+
|
|
26
|
+
if (delimitedSuffix == 0)
|
|
27
|
+
return KECCAK_FAIL;
|
|
28
|
+
result = (HashReturn)KeccakWidth1600_SpongeInitialize(&instance->sponge, rate, capacity);
|
|
29
|
+
if (result != KECCAK_SUCCESS)
|
|
30
|
+
return result;
|
|
31
|
+
instance->fixedOutputLength = hashbitlen;
|
|
32
|
+
instance->delimitedSuffix = delimitedSuffix;
|
|
33
|
+
return KECCAK_SUCCESS;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/* ---------------------------------------------------------------- */
|
|
37
|
+
|
|
38
|
+
HashReturn Keccak_HashUpdate(Keccak_HashInstance *instance, const BitSequence *data, BitLength databitlen)
|
|
39
|
+
{
|
|
40
|
+
if ((databitlen % 8) == 0)
|
|
41
|
+
return (HashReturn)KeccakWidth1600_SpongeAbsorb(&instance->sponge, data, databitlen/8);
|
|
42
|
+
else {
|
|
43
|
+
HashReturn ret = (HashReturn)KeccakWidth1600_SpongeAbsorb(&instance->sponge, data, databitlen/8);
|
|
44
|
+
if (ret == KECCAK_SUCCESS) {
|
|
45
|
+
/* The last partial byte is assumed to be aligned on the least significant bits */
|
|
46
|
+
unsigned char lastByte = data[databitlen/8];
|
|
47
|
+
/* Concatenate the last few bits provided here with those of the suffix */
|
|
48
|
+
unsigned short delimitedLastBytes = (unsigned short)((unsigned short)(lastByte & ((1 << (databitlen % 8)) - 1)) | ((unsigned short)instance->delimitedSuffix << (databitlen % 8)));
|
|
49
|
+
if ((delimitedLastBytes & 0xFF00) == 0x0000) {
|
|
50
|
+
instance->delimitedSuffix = delimitedLastBytes & 0xFF;
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
unsigned char oneByte[1];
|
|
54
|
+
oneByte[0] = delimitedLastBytes & 0xFF;
|
|
55
|
+
ret = (HashReturn)KeccakWidth1600_SpongeAbsorb(&instance->sponge, oneByte, 1);
|
|
56
|
+
instance->delimitedSuffix = (delimitedLastBytes >> 8) & 0xFF;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return ret;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/* ---------------------------------------------------------------- */
|
|
64
|
+
|
|
65
|
+
HashReturn Keccak_HashFinal(Keccak_HashInstance *instance, BitSequence *hashval)
|
|
66
|
+
{
|
|
67
|
+
HashReturn ret = (HashReturn)KeccakWidth1600_SpongeAbsorbLastFewBits(&instance->sponge, instance->delimitedSuffix);
|
|
68
|
+
if (ret == KECCAK_SUCCESS)
|
|
69
|
+
return (HashReturn)KeccakWidth1600_SpongeSqueeze(&instance->sponge, hashval, instance->fixedOutputLength/8);
|
|
70
|
+
else
|
|
71
|
+
return ret;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/* ---------------------------------------------------------------- */
|
|
75
|
+
|
|
76
|
+
HashReturn Keccak_HashSqueeze(Keccak_HashInstance *instance, BitSequence *data, BitLength databitlen)
|
|
77
|
+
{
|
|
78
|
+
if ((databitlen % 8) != 0)
|
|
79
|
+
return KECCAK_FAIL;
|
|
80
|
+
return (HashReturn)KeccakWidth1600_SpongeSqueeze(&instance->sponge, data, databitlen/8);
|
|
81
|
+
}
|