digest-kangarootwelve 0.2.0 → 0.3.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 +4 -4
- data/README.md +51 -11
- data/Rakefile +2 -2
- data/digest-kangarootwelve.gemspec +322 -42
- data/ext/digest/kangarootwelve/ext.c +1 -1
- data/ext/digest/kangarootwelve/extconf.rb +13 -1
- data/ext/digest/kangarootwelve/keccak/armv6m/KangarooTwelve.link.c +1 -0
- data/ext/digest/kangarootwelve/keccak/armv6m/KeccakDuplexWidth1600.link.c +1 -0
- data/ext/digest/kangarootwelve/keccak/armv6m/KeccakP-1600-SnP.h +36 -0
- data/ext/digest/kangarootwelve/{KeccakP-1600-times2-SnP.h → keccak/armv6m/KeccakP-1600-times2-SnP.h} +10 -10
- data/ext/digest/kangarootwelve/{KeccakP-1600-times2-on1.c → keccak/armv6m/KeccakP-1600-times2-on1.c} +13 -7
- data/ext/digest/kangarootwelve/{KeccakP-1600-times4-SnP.h → keccak/armv6m/KeccakP-1600-times4-SnP.h} +10 -10
- data/ext/digest/kangarootwelve/{KeccakP-1600-times4-on1.c → keccak/armv6m/KeccakP-1600-times4-on1.c} +13 -7
- data/ext/digest/kangarootwelve/{KeccakP-1600-times8-SnP.h → keccak/armv6m/KeccakP-1600-times8-SnP.h} +10 -10
- data/ext/digest/kangarootwelve/{KeccakP-1600-times8-on1.c → keccak/armv6m/KeccakP-1600-times8-on1.c} +13 -7
- data/ext/digest/kangarootwelve/keccak/armv6m/KeccakP-1600-u2-32bi-armv6m-le-gcc.s +1334 -0
- data/ext/digest/kangarootwelve/keccak/armv6m/KeccakSpongeWidth1600.link.c +1 -0
- data/ext/digest/kangarootwelve/{PlSnP-Fallback.inc → keccak/armv6m/PlSnP-Fallback.inc} +11 -7
- data/ext/digest/kangarootwelve/keccak/armv6m/ext.link.c +1 -0
- data/ext/digest/kangarootwelve/keccak/armv7a/KangarooTwelve.link.c +1 -0
- data/ext/digest/kangarootwelve/keccak/armv7a/KeccakDuplexWidth1600.link.c +1 -0
- data/ext/digest/kangarootwelve/keccak/armv7a/KeccakP-1600-SnP.h +37 -0
- data/ext/digest/kangarootwelve/keccak/armv7a/KeccakP-1600-armv7a-le-neon-gcc.s +826 -0
- data/ext/digest/kangarootwelve/keccak/armv7a/KeccakP-1600-inplace-pl2-armv7a-neon-le-gcc.s +1245 -0
- data/ext/digest/kangarootwelve/keccak/armv7a/KeccakP-1600-times2-SnP.h +38 -0
- data/ext/digest/kangarootwelve/keccak/armv7a/KeccakP-1600-times4-SnP.h +45 -0
- data/ext/digest/kangarootwelve/keccak/armv7a/KeccakP-1600-times4-on2.c +38 -0
- data/ext/digest/kangarootwelve/keccak/armv7a/KeccakP-1600-times8-SnP.h +45 -0
- data/ext/digest/kangarootwelve/keccak/armv7a/KeccakP-1600-times8-on2.c +38 -0
- data/ext/digest/kangarootwelve/keccak/armv7a/KeccakSpongeWidth1600.link.c +1 -0
- data/ext/digest/kangarootwelve/keccak/armv7a/PlSnP-Fallback.inc +287 -0
- data/ext/digest/kangarootwelve/keccak/armv7a/ext.link.c +1 -0
- data/ext/digest/kangarootwelve/keccak/armv7m/KangarooTwelve.link.c +1 -0
- data/ext/digest/kangarootwelve/keccak/armv7m/KeccakDuplexWidth1600.link.c +1 -0
- data/ext/digest/kangarootwelve/keccak/armv7m/KeccakP-1600-SnP.h +36 -0
- data/ext/digest/kangarootwelve/keccak/armv7m/KeccakP-1600-inplace-32bi-armv7m-le-gcc.s +1170 -0
- data/ext/digest/kangarootwelve/keccak/armv7m/KeccakP-1600-times2-SnP.h +45 -0
- data/ext/digest/kangarootwelve/keccak/armv7m/KeccakP-1600-times2-on1.c +37 -0
- data/ext/digest/kangarootwelve/keccak/armv7m/KeccakP-1600-times4-SnP.h +45 -0
- data/ext/digest/kangarootwelve/keccak/armv7m/KeccakP-1600-times4-on1.c +37 -0
- data/ext/digest/kangarootwelve/keccak/armv7m/KeccakP-1600-times8-SnP.h +45 -0
- data/ext/digest/kangarootwelve/keccak/armv7m/KeccakP-1600-times8-on1.c +37 -0
- data/ext/digest/kangarootwelve/keccak/armv7m/KeccakSpongeWidth1600.link.c +1 -0
- data/ext/digest/kangarootwelve/keccak/armv7m/PlSnP-Fallback.inc +287 -0
- data/ext/digest/kangarootwelve/keccak/armv7m/ext.link.c +1 -0
- data/ext/digest/kangarootwelve/keccak/armv8a/KangarooTwelve.link.c +1 -0
- data/ext/digest/kangarootwelve/keccak/armv8a/KeccakDuplexWidth1600.link.c +1 -0
- data/ext/digest/kangarootwelve/keccak/armv8a/KeccakP-1600-SnP.h +28 -0
- data/ext/digest/kangarootwelve/keccak/armv8a/KeccakP-1600-armv8a-neon.s +537 -0
- data/ext/digest/kangarootwelve/keccak/armv8a/KeccakP-1600-times2-SnP.h +45 -0
- data/ext/digest/kangarootwelve/keccak/armv8a/KeccakP-1600-times2-on1.c +37 -0
- data/ext/digest/kangarootwelve/keccak/armv8a/KeccakP-1600-times4-SnP.h +45 -0
- data/ext/digest/kangarootwelve/keccak/armv8a/KeccakP-1600-times4-on1.c +37 -0
- data/ext/digest/kangarootwelve/keccak/armv8a/KeccakP-1600-times8-SnP.h +45 -0
- data/ext/digest/kangarootwelve/keccak/armv8a/KeccakP-1600-times8-on1.c +37 -0
- data/ext/digest/kangarootwelve/keccak/armv8a/KeccakSpongeWidth1600.link.c +1 -0
- data/ext/digest/kangarootwelve/keccak/armv8a/PlSnP-Fallback.inc +287 -0
- data/ext/digest/kangarootwelve/keccak/armv8a/ext.link.c +1 -0
- data/ext/digest/kangarootwelve/keccak/asmx86-64/KangarooTwelve.link.c +1 -0
- data/ext/digest/kangarootwelve/keccak/asmx86-64/KeccakDuplexWidth1600.link.c +1 -0
- data/ext/digest/kangarootwelve/keccak/asmx86-64/KeccakP-1600-SnP.h +37 -0
- data/ext/digest/kangarootwelve/keccak/asmx86-64/KeccakP-1600-times2-SnP.h +45 -0
- data/ext/digest/kangarootwelve/keccak/asmx86-64/KeccakP-1600-times2-on1.c +37 -0
- data/ext/digest/kangarootwelve/keccak/asmx86-64/KeccakP-1600-times4-SnP.h +45 -0
- data/ext/digest/kangarootwelve/keccak/asmx86-64/KeccakP-1600-times4-on1.c +37 -0
- data/ext/digest/kangarootwelve/keccak/asmx86-64/KeccakP-1600-times8-SnP.h +45 -0
- data/ext/digest/kangarootwelve/keccak/asmx86-64/KeccakP-1600-times8-on1.c +37 -0
- data/ext/digest/kangarootwelve/keccak/asmx86-64/KeccakP-1600-x86-64-gas.s +1190 -0
- data/ext/digest/kangarootwelve/keccak/asmx86-64/KeccakSpongeWidth1600.link.c +1 -0
- data/ext/digest/kangarootwelve/keccak/asmx86-64/PlSnP-Fallback.inc +287 -0
- data/ext/digest/kangarootwelve/keccak/asmx86-64/ext.link.c +1 -0
- data/ext/digest/kangarootwelve/keccak/asmx86-64shld/KangarooTwelve.link.c +1 -0
- data/ext/digest/kangarootwelve/keccak/asmx86-64shld/KeccakDuplexWidth1600.link.c +1 -0
- data/ext/digest/kangarootwelve/keccak/asmx86-64shld/KeccakP-1600-SnP.h +37 -0
- data/ext/digest/kangarootwelve/keccak/asmx86-64shld/KeccakP-1600-times2-SnP.h +45 -0
- data/ext/digest/kangarootwelve/keccak/asmx86-64shld/KeccakP-1600-times2-on1.c +37 -0
- data/ext/digest/kangarootwelve/keccak/asmx86-64shld/KeccakP-1600-times4-SnP.h +45 -0
- data/ext/digest/kangarootwelve/keccak/asmx86-64shld/KeccakP-1600-times4-on1.c +37 -0
- data/ext/digest/kangarootwelve/keccak/asmx86-64shld/KeccakP-1600-times8-SnP.h +45 -0
- data/ext/digest/kangarootwelve/keccak/asmx86-64shld/KeccakP-1600-times8-on1.c +37 -0
- data/ext/digest/kangarootwelve/keccak/asmx86-64shld/KeccakP-1600-x86-64-shld-gas.s +1190 -0
- data/ext/digest/kangarootwelve/keccak/asmx86-64shld/KeccakSpongeWidth1600.link.c +1 -0
- data/ext/digest/kangarootwelve/keccak/asmx86-64shld/PlSnP-Fallback.inc +287 -0
- data/ext/digest/kangarootwelve/keccak/asmx86-64shld/ext.link.c +1 -0
- data/ext/digest/kangarootwelve/keccak/avr8/KangarooTwelve.link.c +1 -0
- data/ext/digest/kangarootwelve/keccak/avr8/KeccakDuplexWidth1600.link.c +1 -0
- data/ext/digest/kangarootwelve/keccak/avr8/KeccakP-1600-SnP.h +37 -0
- data/ext/digest/kangarootwelve/keccak/avr8/KeccakP-1600-avr8-fast.s +1116 -0
- data/ext/digest/kangarootwelve/keccak/avr8/KeccakP-1600-times2-SnP.h +45 -0
- data/ext/digest/kangarootwelve/keccak/avr8/KeccakP-1600-times2-on1.c +37 -0
- data/ext/digest/kangarootwelve/keccak/avr8/KeccakP-1600-times4-SnP.h +45 -0
- data/ext/digest/kangarootwelve/keccak/avr8/KeccakP-1600-times4-on1.c +37 -0
- data/ext/digest/kangarootwelve/keccak/avr8/KeccakP-1600-times8-SnP.h +45 -0
- data/ext/digest/kangarootwelve/keccak/avr8/KeccakP-1600-times8-on1.c +37 -0
- data/ext/digest/kangarootwelve/keccak/avr8/KeccakSpongeWidth1600.link.c +1 -0
- data/ext/digest/kangarootwelve/keccak/avr8/PlSnP-Fallback.inc +287 -0
- data/ext/digest/kangarootwelve/keccak/avr8/ext.link.c +1 -0
- data/ext/digest/kangarootwelve/keccak/bulldozer/KangarooTwelve.link.c +1 -0
- data/ext/digest/kangarootwelve/keccak/bulldozer/KeccakDuplexWidth1600.link.c +1 -0
- data/ext/digest/kangarootwelve/keccak/bulldozer/KeccakP-1600-SnP.h +39 -0
- data/ext/digest/kangarootwelve/keccak/bulldozer/KeccakP-1600-XOP-config.h +6 -0
- data/ext/digest/kangarootwelve/keccak/bulldozer/KeccakP-1600-XOP.c +473 -0
- data/ext/digest/kangarootwelve/keccak/bulldozer/KeccakP-1600-times2-SIMD128.c +954 -0
- data/ext/digest/kangarootwelve/keccak/bulldozer/KeccakP-1600-times2-SnP.h +47 -0
- data/ext/digest/kangarootwelve/keccak/bulldozer/KeccakP-1600-times4-SnP.h +45 -0
- data/ext/digest/kangarootwelve/keccak/bulldozer/KeccakP-1600-times4-on2.c +38 -0
- data/ext/digest/kangarootwelve/keccak/bulldozer/KeccakP-1600-times8-SnP.h +45 -0
- data/ext/digest/kangarootwelve/keccak/bulldozer/KeccakP-1600-times8-on2.c +38 -0
- data/ext/digest/kangarootwelve/keccak/bulldozer/KeccakP-1600-unrolling.macros +302 -0
- data/ext/digest/kangarootwelve/keccak/bulldozer/KeccakSpongeWidth1600.link.c +1 -0
- data/ext/digest/kangarootwelve/keccak/bulldozer/PlSnP-Fallback.inc +287 -0
- data/ext/digest/kangarootwelve/keccak/bulldozer/SIMD128-config.h +9 -0
- data/ext/digest/kangarootwelve/{SnP-Relaned.h → keccak/bulldozer/SnP-Relaned.h} +13 -7
- data/ext/digest/kangarootwelve/keccak/bulldozer/ext.link.c +1 -0
- data/ext/digest/kangarootwelve/{KangarooTwelve.c → keccak/common/KangarooTwelve.c} +6 -10
- data/ext/digest/kangarootwelve/{KangarooTwelve.h → keccak/common/KangarooTwelve.h} +3 -7
- data/ext/digest/kangarootwelve/keccak/common/KeccakDuplex-common.h +37 -0
- data/ext/digest/kangarootwelve/keccak/common/KeccakDuplex.inc +192 -0
- data/ext/digest/kangarootwelve/keccak/common/KeccakDuplexWidth1600.c +34 -0
- data/ext/digest/kangarootwelve/keccak/common/KeccakDuplexWidth1600.h +25 -0
- data/ext/digest/kangarootwelve/{KeccakSponge-common.h → keccak/common/KeccakSponge-common.h} +5 -7
- data/ext/digest/kangarootwelve/{KeccakSponge.inc → keccak/common/KeccakSponge.inc} +6 -8
- data/ext/digest/kangarootwelve/{KeccakSpongeWidth1600.c → keccak/common/KeccakSpongeWidth1600.c} +6 -8
- data/ext/digest/kangarootwelve/{KeccakSpongeWidth1600.h → keccak/common/KeccakSpongeWidth1600.h} +5 -7
- data/ext/digest/kangarootwelve/{Phases.h → keccak/common/Phases.h} +3 -7
- data/ext/digest/kangarootwelve/{align.h → keccak/common/align.h} +5 -7
- data/ext/digest/kangarootwelve/{brg_endian.h → keccak/common/brg_endian.h} +0 -0
- data/ext/digest/kangarootwelve/keccak/compact/KangarooTwelve.link.c +1 -0
- data/ext/digest/kangarootwelve/keccak/compact/KeccakDuplexWidth1600.link.c +1 -0
- data/ext/digest/kangarootwelve/{KeccakP-1600-SnP.h → keccak/compact/KeccakP-1600-SnP.h} +7 -10
- data/ext/digest/kangarootwelve/{KeccakP-1600-compact64.c → keccak/compact/KeccakP-1600-compact64.c} +11 -7
- data/ext/digest/kangarootwelve/keccak/compact/KeccakP-1600-times2-SnP.h +45 -0
- data/ext/digest/kangarootwelve/keccak/compact/KeccakP-1600-times2-on1.c +37 -0
- data/ext/digest/kangarootwelve/keccak/compact/KeccakP-1600-times4-SnP.h +45 -0
- data/ext/digest/kangarootwelve/keccak/compact/KeccakP-1600-times4-on1.c +37 -0
- data/ext/digest/kangarootwelve/keccak/compact/KeccakP-1600-times8-SnP.h +45 -0
- data/ext/digest/kangarootwelve/keccak/compact/KeccakP-1600-times8-on1.c +37 -0
- data/ext/digest/kangarootwelve/keccak/compact/KeccakSpongeWidth1600.link.c +1 -0
- data/ext/digest/kangarootwelve/keccak/compact/PlSnP-Fallback.inc +287 -0
- data/ext/digest/kangarootwelve/keccak/compact/SnP-Relaned.h +140 -0
- data/ext/digest/kangarootwelve/keccak/compact/ext.link.c +1 -0
- data/ext/digest/kangarootwelve/keccak/generic32/KangarooTwelve.link.c +1 -0
- data/ext/digest/kangarootwelve/keccak/generic32/KeccakDuplexWidth1600.link.c +1 -0
- data/ext/digest/kangarootwelve/keccak/generic32/KeccakP-1600-SnP.h +38 -0
- data/ext/digest/kangarootwelve/keccak/generic32/KeccakP-1600-inplace32BI.c +1162 -0
- data/ext/digest/kangarootwelve/keccak/generic32/KeccakP-1600-times2-SnP.h +45 -0
- data/ext/digest/kangarootwelve/keccak/generic32/KeccakP-1600-times2-on1.c +37 -0
- data/ext/digest/kangarootwelve/keccak/generic32/KeccakP-1600-times4-SnP.h +45 -0
- data/ext/digest/kangarootwelve/keccak/generic32/KeccakP-1600-times4-on1.c +37 -0
- data/ext/digest/kangarootwelve/keccak/generic32/KeccakP-1600-times8-SnP.h +45 -0
- data/ext/digest/kangarootwelve/keccak/generic32/KeccakP-1600-times8-on1.c +37 -0
- data/ext/digest/kangarootwelve/keccak/generic32/KeccakSpongeWidth1600.link.c +1 -0
- data/ext/digest/kangarootwelve/keccak/generic32/PlSnP-Fallback.inc +287 -0
- data/ext/digest/kangarootwelve/keccak/generic32/SnP-Relaned.h +140 -0
- data/ext/digest/kangarootwelve/keccak/generic32/ext.link.c +1 -0
- data/ext/digest/kangarootwelve/keccak/generic32lc/KangarooTwelve.link.c +1 -0
- data/ext/digest/kangarootwelve/keccak/generic32lc/KeccakDuplexWidth1600.link.c +1 -0
- data/ext/digest/kangarootwelve/keccak/generic32lc/KeccakP-1600-SnP.h +38 -0
- data/ext/digest/kangarootwelve/keccak/generic32lc/KeccakP-1600-inplace32BI.c +1162 -0
- data/ext/digest/kangarootwelve/keccak/generic32lc/KeccakP-1600-times2-SnP.h +45 -0
- data/ext/digest/kangarootwelve/keccak/generic32lc/KeccakP-1600-times2-on1.c +37 -0
- data/ext/digest/kangarootwelve/keccak/generic32lc/KeccakP-1600-times4-SnP.h +45 -0
- data/ext/digest/kangarootwelve/keccak/generic32lc/KeccakP-1600-times4-on1.c +37 -0
- data/ext/digest/kangarootwelve/keccak/generic32lc/KeccakP-1600-times8-SnP.h +45 -0
- data/ext/digest/kangarootwelve/keccak/generic32lc/KeccakP-1600-times8-on1.c +37 -0
- data/ext/digest/kangarootwelve/keccak/generic32lc/KeccakSpongeWidth1600.link.c +1 -0
- data/ext/digest/kangarootwelve/keccak/generic32lc/PlSnP-Fallback.inc +287 -0
- data/ext/digest/kangarootwelve/keccak/generic32lc/SnP-Relaned.h +140 -0
- data/ext/digest/kangarootwelve/keccak/generic32lc/ext.link.c +1 -0
- data/ext/digest/kangarootwelve/keccak/generic64/KangarooTwelve.link.c +1 -0
- data/ext/digest/kangarootwelve/keccak/generic64/KeccakDuplexWidth1600.link.c +1 -0
- data/ext/digest/kangarootwelve/keccak/generic64/KeccakP-1600-64.macros +2195 -0
- data/ext/digest/kangarootwelve/keccak/generic64/KeccakP-1600-SnP.h +49 -0
- data/ext/digest/kangarootwelve/keccak/generic64/KeccakP-1600-opt64-config.h +6 -0
- data/ext/digest/kangarootwelve/keccak/generic64/KeccakP-1600-opt64.c +541 -0
- data/ext/digest/kangarootwelve/keccak/generic64/KeccakP-1600-times2-SnP.h +45 -0
- data/ext/digest/kangarootwelve/keccak/generic64/KeccakP-1600-times2-on1.c +37 -0
- data/ext/digest/kangarootwelve/keccak/generic64/KeccakP-1600-times4-SnP.h +45 -0
- data/ext/digest/kangarootwelve/keccak/generic64/KeccakP-1600-times4-on1.c +37 -0
- data/ext/digest/kangarootwelve/keccak/generic64/KeccakP-1600-times8-SnP.h +45 -0
- data/ext/digest/kangarootwelve/keccak/generic64/KeccakP-1600-times8-on1.c +37 -0
- data/ext/digest/kangarootwelve/keccak/generic64/KeccakP-1600-unrolling.macros +302 -0
- data/ext/digest/kangarootwelve/keccak/generic64/KeccakSpongeWidth1600.link.c +1 -0
- data/ext/digest/kangarootwelve/keccak/generic64/PlSnP-Fallback.inc +287 -0
- data/ext/digest/kangarootwelve/keccak/generic64/SnP-Relaned.h +140 -0
- data/ext/digest/kangarootwelve/keccak/generic64/ext.link.c +1 -0
- data/ext/digest/kangarootwelve/keccak/generic64lc/KangarooTwelve.link.c +1 -0
- data/ext/digest/kangarootwelve/keccak/generic64lc/KeccakDuplexWidth1600.link.c +1 -0
- data/ext/digest/kangarootwelve/keccak/generic64lc/KeccakP-1600-64.macros +2195 -0
- data/ext/digest/kangarootwelve/keccak/generic64lc/KeccakP-1600-SnP.h +49 -0
- data/ext/digest/kangarootwelve/keccak/generic64lc/KeccakP-1600-opt64-config.h +7 -0
- data/ext/digest/kangarootwelve/keccak/generic64lc/KeccakP-1600-opt64.c +541 -0
- data/ext/digest/kangarootwelve/keccak/generic64lc/KeccakP-1600-times2-SnP.h +45 -0
- data/ext/digest/kangarootwelve/keccak/generic64lc/KeccakP-1600-times2-on1.c +37 -0
- data/ext/digest/kangarootwelve/keccak/generic64lc/KeccakP-1600-times4-SnP.h +45 -0
- data/ext/digest/kangarootwelve/keccak/generic64lc/KeccakP-1600-times4-on1.c +37 -0
- data/ext/digest/kangarootwelve/keccak/generic64lc/KeccakP-1600-times8-SnP.h +45 -0
- data/ext/digest/kangarootwelve/keccak/generic64lc/KeccakP-1600-times8-on1.c +37 -0
- data/ext/digest/kangarootwelve/keccak/generic64lc/KeccakP-1600-unrolling.macros +302 -0
- data/ext/digest/kangarootwelve/keccak/generic64lc/KeccakSpongeWidth1600.link.c +1 -0
- data/ext/digest/kangarootwelve/keccak/generic64lc/PlSnP-Fallback.inc +287 -0
- data/ext/digest/kangarootwelve/keccak/generic64lc/SnP-Relaned.h +140 -0
- data/ext/digest/kangarootwelve/keccak/generic64lc/ext.link.c +1 -0
- data/ext/digest/kangarootwelve/keccak/haswell/KangarooTwelve.link.c +1 -0
- data/ext/digest/kangarootwelve/keccak/haswell/KeccakDuplexWidth1600.link.c +1 -0
- data/ext/digest/kangarootwelve/keccak/haswell/KeccakP-1600-AVX2.s +993 -0
- data/ext/digest/kangarootwelve/keccak/haswell/KeccakP-1600-SnP.h +41 -0
- data/ext/digest/kangarootwelve/keccak/haswell/KeccakP-1600-times2-SIMD128.c +954 -0
- data/ext/digest/kangarootwelve/keccak/haswell/KeccakP-1600-times2-SnP.h +47 -0
- data/ext/digest/kangarootwelve/keccak/haswell/KeccakP-1600-times4-SIMD256.c +1303 -0
- data/ext/digest/kangarootwelve/keccak/haswell/KeccakP-1600-times4-SnP.h +53 -0
- data/ext/digest/kangarootwelve/keccak/haswell/KeccakP-1600-times8-SnP.h +45 -0
- data/ext/digest/kangarootwelve/keccak/haswell/KeccakP-1600-times8-on4.c +38 -0
- data/ext/digest/kangarootwelve/keccak/haswell/KeccakP-1600-unrolling.macros +302 -0
- data/ext/digest/kangarootwelve/keccak/haswell/KeccakSpongeWidth1600.link.c +1 -0
- data/ext/digest/kangarootwelve/keccak/haswell/PlSnP-Fallback.inc +287 -0
- data/ext/digest/kangarootwelve/keccak/haswell/SIMD128-config.h +8 -0
- data/ext/digest/kangarootwelve/keccak/haswell/SIMD256-config.h +7 -0
- data/ext/digest/kangarootwelve/keccak/haswell/ext.link.c +1 -0
- data/ext/digest/kangarootwelve/keccak/nehalem/KangarooTwelve.link.c +1 -0
- data/ext/digest/kangarootwelve/keccak/nehalem/KeccakDuplexWidth1600.link.c +1 -0
- data/ext/digest/kangarootwelve/keccak/nehalem/KeccakP-1600-64.macros +2195 -0
- data/ext/digest/kangarootwelve/keccak/nehalem/KeccakP-1600-SnP.h +49 -0
- data/ext/digest/kangarootwelve/keccak/nehalem/KeccakP-1600-opt64-config.h +7 -0
- data/ext/digest/kangarootwelve/keccak/nehalem/KeccakP-1600-opt64.c +541 -0
- data/ext/digest/kangarootwelve/keccak/nehalem/KeccakP-1600-times2-SIMD128.c +954 -0
- data/ext/digest/kangarootwelve/keccak/nehalem/KeccakP-1600-times2-SnP.h +47 -0
- data/ext/digest/kangarootwelve/keccak/nehalem/KeccakP-1600-times4-SnP.h +45 -0
- data/ext/digest/kangarootwelve/keccak/nehalem/KeccakP-1600-times4-on2.c +38 -0
- data/ext/digest/kangarootwelve/keccak/nehalem/KeccakP-1600-times8-SnP.h +45 -0
- data/ext/digest/kangarootwelve/keccak/nehalem/KeccakP-1600-times8-on2.c +38 -0
- data/ext/digest/kangarootwelve/keccak/nehalem/KeccakP-1600-unrolling.macros +302 -0
- data/ext/digest/kangarootwelve/keccak/nehalem/KeccakSpongeWidth1600.link.c +1 -0
- data/ext/digest/kangarootwelve/keccak/nehalem/PlSnP-Fallback.inc +287 -0
- data/ext/digest/kangarootwelve/keccak/nehalem/SIMD128-config.h +8 -0
- data/ext/digest/kangarootwelve/keccak/nehalem/SnP-Relaned.h +140 -0
- data/ext/digest/kangarootwelve/keccak/nehalem/ext.link.c +1 -0
- data/ext/digest/kangarootwelve/keccak/reference/KangarooTwelve.link.c +1 -0
- data/ext/digest/kangarootwelve/keccak/reference/KeccakDuplexWidth1600.link.c +1 -0
- data/ext/digest/kangarootwelve/keccak/reference/KeccakP-1600-SnP.h +41 -0
- data/ext/digest/kangarootwelve/keccak/reference/KeccakP-1600-reference.c +424 -0
- data/ext/digest/kangarootwelve/keccak/reference/KeccakP-1600-reference.h +20 -0
- data/ext/digest/kangarootwelve/keccak/reference/KeccakP-1600-times2-SnP.h +45 -0
- data/ext/digest/kangarootwelve/keccak/reference/KeccakP-1600-times2-on1.c +37 -0
- data/ext/digest/kangarootwelve/keccak/reference/KeccakP-1600-times4-SnP.h +45 -0
- data/ext/digest/kangarootwelve/keccak/reference/KeccakP-1600-times4-on1.c +37 -0
- data/ext/digest/kangarootwelve/keccak/reference/KeccakP-1600-times8-SnP.h +45 -0
- data/ext/digest/kangarootwelve/keccak/reference/KeccakP-1600-times8-on1.c +37 -0
- data/ext/digest/kangarootwelve/keccak/reference/KeccakSpongeWidth1600.link.c +1 -0
- data/ext/digest/kangarootwelve/keccak/reference/PlSnP-Fallback.inc +287 -0
- data/ext/digest/kangarootwelve/keccak/reference/displayIntermediateValues.c +176 -0
- data/ext/digest/kangarootwelve/keccak/reference/displayIntermediateValues.h +29 -0
- data/ext/digest/kangarootwelve/keccak/reference/ext.link.c +1 -0
- data/ext/digest/kangarootwelve/keccak/reference32bits/KangarooTwelve.link.c +1 -0
- data/ext/digest/kangarootwelve/keccak/reference32bits/KeccakDuplexWidth1600.link.c +1 -0
- data/ext/digest/kangarootwelve/keccak/reference32bits/KeccakP-1600-SnP.h +41 -0
- data/ext/digest/kangarootwelve/keccak/reference32bits/KeccakP-1600-reference.h +20 -0
- data/ext/digest/kangarootwelve/keccak/reference32bits/KeccakP-1600-reference32BI.c +612 -0
- data/ext/digest/kangarootwelve/keccak/reference32bits/KeccakP-1600-times2-SnP.h +45 -0
- data/ext/digest/kangarootwelve/keccak/reference32bits/KeccakP-1600-times2-on1.c +37 -0
- data/ext/digest/kangarootwelve/keccak/reference32bits/KeccakP-1600-times4-SnP.h +45 -0
- data/ext/digest/kangarootwelve/keccak/reference32bits/KeccakP-1600-times4-on1.c +37 -0
- data/ext/digest/kangarootwelve/keccak/reference32bits/KeccakP-1600-times8-SnP.h +45 -0
- data/ext/digest/kangarootwelve/keccak/reference32bits/KeccakP-1600-times8-on1.c +37 -0
- data/ext/digest/kangarootwelve/keccak/reference32bits/KeccakSpongeWidth1600.link.c +1 -0
- data/ext/digest/kangarootwelve/keccak/reference32bits/PlSnP-Fallback.inc +287 -0
- data/ext/digest/kangarootwelve/keccak/reference32bits/displayIntermediateValues.c +176 -0
- data/ext/digest/kangarootwelve/keccak/reference32bits/displayIntermediateValues.h +29 -0
- data/ext/digest/kangarootwelve/keccak/reference32bits/ext.link.c +1 -0
- data/ext/digest/kangarootwelve/keccak/sandybridge/KangarooTwelve.link.c +1 -0
- data/ext/digest/kangarootwelve/keccak/sandybridge/KeccakDuplexWidth1600.link.c +1 -0
- data/ext/digest/kangarootwelve/keccak/sandybridge/KeccakP-1600-64.macros +2195 -0
- data/ext/digest/kangarootwelve/keccak/sandybridge/KeccakP-1600-SnP.h +49 -0
- data/ext/digest/kangarootwelve/keccak/sandybridge/KeccakP-1600-opt64-config.h +8 -0
- data/ext/digest/kangarootwelve/keccak/sandybridge/KeccakP-1600-opt64.c +541 -0
- data/ext/digest/kangarootwelve/keccak/sandybridge/KeccakP-1600-times2-SIMD128.c +954 -0
- data/ext/digest/kangarootwelve/keccak/sandybridge/KeccakP-1600-times2-SnP.h +47 -0
- data/ext/digest/kangarootwelve/keccak/sandybridge/KeccakP-1600-times4-SnP.h +45 -0
- data/ext/digest/kangarootwelve/keccak/sandybridge/KeccakP-1600-times4-on2.c +38 -0
- data/ext/digest/kangarootwelve/keccak/sandybridge/KeccakP-1600-times8-SnP.h +45 -0
- data/ext/digest/kangarootwelve/keccak/sandybridge/KeccakP-1600-times8-on2.c +38 -0
- data/ext/digest/kangarootwelve/keccak/sandybridge/KeccakP-1600-unrolling.macros +302 -0
- data/ext/digest/kangarootwelve/keccak/sandybridge/KeccakSpongeWidth1600.link.c +1 -0
- data/ext/digest/kangarootwelve/keccak/sandybridge/PlSnP-Fallback.inc +287 -0
- data/ext/digest/kangarootwelve/keccak/sandybridge/SIMD128-config.h +8 -0
- data/ext/digest/kangarootwelve/keccak/sandybridge/SnP-Relaned.h +140 -0
- data/ext/digest/kangarootwelve/keccak/sandybridge/ext.link.c +1 -0
- data/ext/digest/kangarootwelve/keccak/skylakex/KangarooTwelve.link.c +1 -0
- data/ext/digest/kangarootwelve/keccak/skylakex/KeccakDuplexWidth1600.link.c +1 -0
- data/ext/digest/kangarootwelve/keccak/skylakex/KeccakP-1600-AVX512-config.h +6 -0
- data/ext/digest/kangarootwelve/keccak/skylakex/KeccakP-1600-AVX512.c +621 -0
- data/ext/digest/kangarootwelve/keccak/skylakex/KeccakP-1600-SnP.h +42 -0
- data/ext/digest/kangarootwelve/keccak/skylakex/KeccakP-1600-times2-SIMD512.c +852 -0
- data/ext/digest/kangarootwelve/keccak/skylakex/KeccakP-1600-times2-SnP.h +49 -0
- data/ext/digest/kangarootwelve/keccak/skylakex/KeccakP-1600-times4-SIMD512.c +883 -0
- data/ext/digest/kangarootwelve/keccak/skylakex/KeccakP-1600-times4-SnP.h +49 -0
- data/ext/digest/kangarootwelve/keccak/skylakex/KeccakP-1600-times8-SIMD512.c +1473 -0
- data/ext/digest/kangarootwelve/keccak/skylakex/KeccakP-1600-times8-SnP.h +53 -0
- data/ext/digest/kangarootwelve/keccak/skylakex/KeccakSpongeWidth1600.link.c +1 -0
- data/ext/digest/kangarootwelve/keccak/skylakex/SIMD512-2-config.h +7 -0
- data/ext/digest/kangarootwelve/keccak/skylakex/SIMD512-4-config.h +7 -0
- data/ext/digest/kangarootwelve/keccak/skylakex/SIMD512-config.h +7 -0
- data/ext/digest/kangarootwelve/keccak/skylakex/ext.link.c +1 -0
- data/lib/digest/kangarootwelve/version.rb +1 -1
- metadata +299 -21
@@ -0,0 +1,176 @@
|
|
1
|
+
/*
|
2
|
+
Implementation by the Keccak Team, namely, Guido Bertoni, Joan Daemen,
|
3
|
+
Michaël Peeters, Gilles Van Assche and Ronny Van Keer,
|
4
|
+
hereby denoted as "the implementer".
|
5
|
+
|
6
|
+
For more information, feedback or questions, please refer to our website:
|
7
|
+
https://keccak.team/
|
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
|
+
#include <stdio.h>
|
15
|
+
#include "displayIntermediateValues.h"
|
16
|
+
|
17
|
+
FILE *intermediateValueFile = 0;
|
18
|
+
int displayLevel = 0;
|
19
|
+
|
20
|
+
void displaySetIntermediateValueFile(FILE *f)
|
21
|
+
{
|
22
|
+
intermediateValueFile = f;
|
23
|
+
}
|
24
|
+
|
25
|
+
void displaySetLevel(int level)
|
26
|
+
{
|
27
|
+
displayLevel = level;
|
28
|
+
}
|
29
|
+
|
30
|
+
void displayBytes(int level, const char *text, const unsigned char *bytes, unsigned int size)
|
31
|
+
{
|
32
|
+
unsigned int i;
|
33
|
+
|
34
|
+
if ((intermediateValueFile) && (level <= displayLevel)) {
|
35
|
+
fprintf(intermediateValueFile, "%s:\n", text);
|
36
|
+
for(i=0; i<size; i++)
|
37
|
+
fprintf(intermediateValueFile, "%02X ", bytes[i]);
|
38
|
+
fprintf(intermediateValueFile, "\n");
|
39
|
+
fprintf(intermediateValueFile, "\n");
|
40
|
+
}
|
41
|
+
}
|
42
|
+
|
43
|
+
void displayBits(int level, const char *text, const unsigned char *data, unsigned int size, int MSBfirst)
|
44
|
+
{
|
45
|
+
unsigned int i, iByte, iBit;
|
46
|
+
|
47
|
+
if ((intermediateValueFile) && (level <= displayLevel)) {
|
48
|
+
fprintf(intermediateValueFile, "%s:\n", text);
|
49
|
+
for(i=0; i<size; i++) {
|
50
|
+
iByte = i/8;
|
51
|
+
iBit = i%8;
|
52
|
+
if (MSBfirst)
|
53
|
+
fprintf(intermediateValueFile, "%d ", ((data[iByte] << iBit) & 0x80) != 0);
|
54
|
+
else
|
55
|
+
fprintf(intermediateValueFile, "%d ", ((data[iByte] >> iBit) & 0x01) != 0);
|
56
|
+
}
|
57
|
+
fprintf(intermediateValueFile, "\n");
|
58
|
+
fprintf(intermediateValueFile, "\n");
|
59
|
+
}
|
60
|
+
}
|
61
|
+
|
62
|
+
void displayStateAsBytes(int level, const char *text, const unsigned char *state, unsigned int width)
|
63
|
+
{
|
64
|
+
displayBytes(level, text, state, width/8);
|
65
|
+
}
|
66
|
+
|
67
|
+
void displayStateAs32bitWords(int level, const char *text, const unsigned int *state)
|
68
|
+
{
|
69
|
+
unsigned int i;
|
70
|
+
|
71
|
+
if ((intermediateValueFile) && (level <= displayLevel)) {
|
72
|
+
fprintf(intermediateValueFile, "%s:\n", text);
|
73
|
+
for(i=0; i<25; i++) {
|
74
|
+
fprintf(intermediateValueFile, "%08X:%08X", (unsigned int)state[2*i+0], (unsigned int)state[2*i+1]);
|
75
|
+
if ((i%5) == 4)
|
76
|
+
fprintf(intermediateValueFile, "\n");
|
77
|
+
else
|
78
|
+
fprintf(intermediateValueFile, " ");
|
79
|
+
}
|
80
|
+
}
|
81
|
+
}
|
82
|
+
|
83
|
+
void displayStateAs64bitLanes(int level, const char *text, void *statePointer)
|
84
|
+
{
|
85
|
+
unsigned int i;
|
86
|
+
unsigned long long int *state = statePointer;
|
87
|
+
|
88
|
+
if ((intermediateValueFile) && (level <= displayLevel)) {
|
89
|
+
fprintf(intermediateValueFile, "%s:\n", text);
|
90
|
+
for(i=0; i<25; i++) {
|
91
|
+
fprintf(intermediateValueFile, "%08X", (unsigned int)(state[i] >> 32));
|
92
|
+
fprintf(intermediateValueFile, "%08X", (unsigned int)(state[i] & 0xFFFFFFFFULL));
|
93
|
+
if ((i%5) == 4)
|
94
|
+
fprintf(intermediateValueFile, "\n");
|
95
|
+
else
|
96
|
+
fprintf(intermediateValueFile, " ");
|
97
|
+
}
|
98
|
+
}
|
99
|
+
}
|
100
|
+
|
101
|
+
void displayStateAs32bitLanes(int level, const char *text, void *statePointer)
|
102
|
+
{
|
103
|
+
unsigned int i;
|
104
|
+
unsigned int *state = statePointer;
|
105
|
+
|
106
|
+
if ((intermediateValueFile) && (level <= displayLevel)) {
|
107
|
+
fprintf(intermediateValueFile, "%s:\n", text);
|
108
|
+
for(i=0; i<25; i++) {
|
109
|
+
fprintf(intermediateValueFile, "%08X", state[i]);
|
110
|
+
if ((i%5) == 4)
|
111
|
+
fprintf(intermediateValueFile, "\n");
|
112
|
+
else
|
113
|
+
fprintf(intermediateValueFile, " ");
|
114
|
+
}
|
115
|
+
}
|
116
|
+
}
|
117
|
+
|
118
|
+
void displayStateAs16bitLanes(int level, const char *text, void *statePointer)
|
119
|
+
{
|
120
|
+
unsigned int i;
|
121
|
+
unsigned short *state = statePointer;
|
122
|
+
|
123
|
+
if ((intermediateValueFile) && (level <= displayLevel)) {
|
124
|
+
fprintf(intermediateValueFile, "%s:\n", text);
|
125
|
+
for(i=0; i<25; i++) {
|
126
|
+
fprintf(intermediateValueFile, "%04X ", state[i]);
|
127
|
+
if ((i%5) == 4)
|
128
|
+
fprintf(intermediateValueFile, "\n");
|
129
|
+
}
|
130
|
+
}
|
131
|
+
}
|
132
|
+
|
133
|
+
void displayStateAs8bitLanes(int level, const char *text, void *statePointer)
|
134
|
+
{
|
135
|
+
unsigned int i;
|
136
|
+
unsigned char *state = statePointer;
|
137
|
+
|
138
|
+
if ((intermediateValueFile) && (level <= displayLevel)) {
|
139
|
+
fprintf(intermediateValueFile, "%s:\n", text);
|
140
|
+
for(i=0; i<25; i++) {
|
141
|
+
fprintf(intermediateValueFile, "%02X ", state[i]);
|
142
|
+
if ((i%5) == 4)
|
143
|
+
fprintf(intermediateValueFile, "\n");
|
144
|
+
}
|
145
|
+
}
|
146
|
+
}
|
147
|
+
|
148
|
+
void displayStateAsLanes(int level, const char *text, void *statePointer, unsigned int width)
|
149
|
+
{
|
150
|
+
if (width == 1600)
|
151
|
+
displayStateAs64bitLanes(level, text, statePointer);
|
152
|
+
if (width == 800)
|
153
|
+
displayStateAs32bitLanes(level, text, statePointer);
|
154
|
+
if (width == 400)
|
155
|
+
displayStateAs16bitLanes(level, text, statePointer);
|
156
|
+
if (width == 200)
|
157
|
+
displayStateAs8bitLanes(level, text, statePointer);
|
158
|
+
}
|
159
|
+
|
160
|
+
void displayRoundNumber(int level, unsigned int i)
|
161
|
+
{
|
162
|
+
if ((intermediateValueFile) && (level <= displayLevel)) {
|
163
|
+
fprintf(intermediateValueFile, "\n");
|
164
|
+
fprintf(intermediateValueFile, "--- Round %d ---\n", i);
|
165
|
+
fprintf(intermediateValueFile, "\n");
|
166
|
+
}
|
167
|
+
}
|
168
|
+
|
169
|
+
void displayText(int level, const char *text)
|
170
|
+
{
|
171
|
+
if ((intermediateValueFile) && (level <= displayLevel)) {
|
172
|
+
fprintf(intermediateValueFile, "%s", text);
|
173
|
+
fprintf(intermediateValueFile, "\n");
|
174
|
+
fprintf(intermediateValueFile, "\n");
|
175
|
+
}
|
176
|
+
}
|
@@ -0,0 +1,29 @@
|
|
1
|
+
/*
|
2
|
+
Implementation by the Keccak Team, namely, Guido Bertoni, Joan Daemen,
|
3
|
+
Michaël Peeters, Gilles Van Assche and Ronny Van Keer,
|
4
|
+
hereby denoted as "the implementer".
|
5
|
+
|
6
|
+
For more information, feedback or questions, please refer to our website:
|
7
|
+
https://keccak.team/
|
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
|
+
#ifndef _displayIntermediateValues_h_
|
15
|
+
#define _displayIntermediateValues_h_
|
16
|
+
|
17
|
+
#include <stdio.h>
|
18
|
+
|
19
|
+
void displaySetIntermediateValueFile(FILE *f);
|
20
|
+
void displaySetLevel(int level);
|
21
|
+
void displayBytes(int level, const char *text, const unsigned char *bytes, unsigned int size);
|
22
|
+
void displayBits(int level, const char *text, const unsigned char *data, unsigned int size, int MSBfirst);
|
23
|
+
void displayStateAsBytes(int level, const char *text, const unsigned char *state, unsigned int width);
|
24
|
+
void displayStateAs32bitWords(int level, const char *text, const unsigned int *state);
|
25
|
+
void displayStateAsLanes(int level, const char *text, void *statePointer, unsigned int width);
|
26
|
+
void displayRoundNumber(int level, unsigned int i);
|
27
|
+
void displayText(int level, const char *text);
|
28
|
+
|
29
|
+
#endif
|
@@ -0,0 +1 @@
|
|
1
|
+
#include "../../ext.c"
|
@@ -0,0 +1 @@
|
|
1
|
+
#include "../common/KangarooTwelve.c"
|
@@ -0,0 +1 @@
|
|
1
|
+
#include "../common/KeccakDuplexWidth1600.c"
|
@@ -0,0 +1,41 @@
|
|
1
|
+
/*
|
2
|
+
Implementation by the Keccak Team, namely, Guido Bertoni, Joan Daemen,
|
3
|
+
Michaël Peeters, Gilles Van Assche and Ronny Van Keer,
|
4
|
+
hereby denoted as "the implementer".
|
5
|
+
|
6
|
+
For more information, feedback or questions, please refer to our website:
|
7
|
+
https://keccak.team/
|
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
|
+
|
15
|
+
Please refer to SnP-documentation.h for more details.
|
16
|
+
*/
|
17
|
+
|
18
|
+
#ifndef _KeccakP_1600_SnP_h_
|
19
|
+
#define _KeccakP_1600_SnP_h_
|
20
|
+
|
21
|
+
#define KeccakP1600_implementation "32-bit bit-interleaved reference implementation"
|
22
|
+
#define KeccakP1600_stateSizeInBytes 200
|
23
|
+
#define KeccakP1600_stateAlignment 4
|
24
|
+
|
25
|
+
#ifdef KeccakReference
|
26
|
+
void KeccakP1600_StaticInitialize( void );
|
27
|
+
#else
|
28
|
+
#define KeccakP1600_StaticInitialize()
|
29
|
+
#endif
|
30
|
+
void KeccakP1600_Initialize(void *state);
|
31
|
+
void KeccakP1600_AddByte(void *state, unsigned char data, unsigned int offset);
|
32
|
+
void KeccakP1600_AddBytes(void *state, const unsigned char *data, unsigned int offset, unsigned int length);
|
33
|
+
void KeccakP1600_OverwriteBytes(void *state, const unsigned char *data, unsigned int offset, unsigned int length);
|
34
|
+
void KeccakP1600_OverwriteWithZeroes(void *state, unsigned int byteCount);
|
35
|
+
void KeccakP1600_Permute_Nrounds(void *state, unsigned int nrounds);
|
36
|
+
void KeccakP1600_Permute_12rounds(void *state);
|
37
|
+
void KeccakP1600_Permute_24rounds(void *state);
|
38
|
+
void KeccakP1600_ExtractBytes(const void *state, unsigned char *data, unsigned int offset, unsigned int length);
|
39
|
+
void KeccakP1600_ExtractAndAddBytes(const void *state, const unsigned char *input, unsigned char *output, unsigned int offset, unsigned int length);
|
40
|
+
|
41
|
+
#endif
|
@@ -0,0 +1,20 @@
|
|
1
|
+
/*
|
2
|
+
Implementation by the Keccak Team, namely, Guido Bertoni, Joan Daemen,
|
3
|
+
Michaël Peeters, Gilles Van Assche and Ronny Van Keer,
|
4
|
+
hereby denoted as "the implementer".
|
5
|
+
|
6
|
+
For more information, feedback or questions, please refer to our website:
|
7
|
+
https://keccak.team/
|
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
|
+
#ifndef _KeccakP_1600_reference_h_
|
15
|
+
#define _KeccakP_1600_reference_h_
|
16
|
+
|
17
|
+
void KeccakP1600_DisplayRoundConstants(FILE *f);
|
18
|
+
void KeccakP1600_DisplayRhoOffsets(FILE *f);
|
19
|
+
|
20
|
+
#endif
|
@@ -0,0 +1,612 @@
|
|
1
|
+
/*
|
2
|
+
Implementation by the Keccak Team, namely, Guido Bertoni, Joan Daemen,
|
3
|
+
Michaël Peeters, Gilles Van Assche and Ronny Van Keer,
|
4
|
+
hereby denoted as "the implementer".
|
5
|
+
|
6
|
+
For more information, feedback or questions, please refer to our website:
|
7
|
+
https://keccak.team/
|
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
|
+
|
15
|
+
This file implements Keccak-p[1600] in a SnP-compatible way.
|
16
|
+
Please refer to SnP-documentation.h for more details.
|
17
|
+
|
18
|
+
This implementation comes with KeccakP-1600-SnP.h in the same folder.
|
19
|
+
Please refer to LowLevel.build for the exact list of other files it must be combined with.
|
20
|
+
*/
|
21
|
+
|
22
|
+
#include <assert.h>
|
23
|
+
#include <stdio.h>
|
24
|
+
#include <string.h>
|
25
|
+
#include "brg_endian.h"
|
26
|
+
#ifdef KeccakReference
|
27
|
+
#include "displayIntermediateValues.h"
|
28
|
+
#endif
|
29
|
+
|
30
|
+
typedef unsigned char UINT8;
|
31
|
+
typedef unsigned int UINT32;
|
32
|
+
/* WARNING: on 8-bit and 16-bit platforms, this should be replaced by: */
|
33
|
+
/* typedef unsigned long UINT32; */
|
34
|
+
|
35
|
+
#define maxNrRounds 24
|
36
|
+
#define nrLanes 25
|
37
|
+
|
38
|
+
#ifdef KeccakReference
|
39
|
+
|
40
|
+
static UINT32 KeccakRoundConstants[maxNrRounds][2];
|
41
|
+
static unsigned int KeccakRhoOffsets[nrLanes];
|
42
|
+
|
43
|
+
#endif
|
44
|
+
|
45
|
+
/* ---------------------------------------------------------------- */
|
46
|
+
|
47
|
+
void toBitInterleaving(UINT32 low, UINT32 high, UINT32 *even, UINT32 *odd);
|
48
|
+
void fromBitInterleaving(UINT32 even, UINT32 odd, UINT32 *low, UINT32 *high);
|
49
|
+
|
50
|
+
void toBitInterleaving(UINT32 low, UINT32 high, UINT32 *even, UINT32 *odd)
|
51
|
+
{
|
52
|
+
unsigned int i;
|
53
|
+
|
54
|
+
*even = 0;
|
55
|
+
*odd = 0;
|
56
|
+
for(i=0; i<64; i++) {
|
57
|
+
unsigned int inBit;
|
58
|
+
if (i < 32)
|
59
|
+
inBit = (low >> i) & 1;
|
60
|
+
else
|
61
|
+
inBit = (high >> (i-32)) & 1;
|
62
|
+
if ((i % 2) == 0)
|
63
|
+
*even |= inBit << (i/2);
|
64
|
+
else
|
65
|
+
*odd |= inBit << ((i-1)/2);
|
66
|
+
}
|
67
|
+
}
|
68
|
+
|
69
|
+
void fromBitInterleaving(UINT32 even, UINT32 odd, UINT32 *low, UINT32 *high)
|
70
|
+
{
|
71
|
+
unsigned int i;
|
72
|
+
|
73
|
+
*low = 0;
|
74
|
+
*high = 0;
|
75
|
+
for(i=0; i<64; i++) {
|
76
|
+
unsigned int inBit;
|
77
|
+
if ((i % 2) == 0)
|
78
|
+
inBit = (even >> (i/2)) & 1;
|
79
|
+
else
|
80
|
+
inBit = (odd >> ((i-1)/2)) & 1;
|
81
|
+
if (i < 32)
|
82
|
+
*low |= inBit << i;
|
83
|
+
else
|
84
|
+
*high |= inBit << (i-32);
|
85
|
+
}
|
86
|
+
}
|
87
|
+
|
88
|
+
#ifdef KeccakReference
|
89
|
+
|
90
|
+
/* ---------------------------------------------------------------- */
|
91
|
+
|
92
|
+
void KeccakP1600_InitializeRoundConstants(void);
|
93
|
+
void KeccakP1600_InitializeRhoOffsets(void);
|
94
|
+
static int LFSR86540(UINT8 *LFSR);
|
95
|
+
|
96
|
+
void KeccakP1600_StaticInitialize(void)
|
97
|
+
{
|
98
|
+
KeccakP1600_InitializeRoundConstants();
|
99
|
+
KeccakP1600_InitializeRhoOffsets();
|
100
|
+
}
|
101
|
+
|
102
|
+
void KeccakP1600_InitializeRoundConstants(void)
|
103
|
+
{
|
104
|
+
UINT8 LFSRstate = 0x01;
|
105
|
+
unsigned int i, j, bitPosition;
|
106
|
+
UINT32 low, high;
|
107
|
+
|
108
|
+
for(i=0; i<maxNrRounds; i++) {
|
109
|
+
low = high = 0;
|
110
|
+
for(j=0; j<7; j++) {
|
111
|
+
bitPosition = (1<<j)-1; /* 2^j-1 */
|
112
|
+
if (LFSR86540(&LFSRstate)) {
|
113
|
+
if (bitPosition < 32)
|
114
|
+
low ^= (UINT32)1 << bitPosition;
|
115
|
+
else
|
116
|
+
high ^= (UINT32)1 << (bitPosition-32);
|
117
|
+
}
|
118
|
+
}
|
119
|
+
toBitInterleaving(low, high, &(KeccakRoundConstants[i][0]), &(KeccakRoundConstants[i][1]));
|
120
|
+
}
|
121
|
+
}
|
122
|
+
|
123
|
+
void KeccakP1600_InitializeRhoOffsets(void)
|
124
|
+
{
|
125
|
+
unsigned int x, y, t, newX, newY;
|
126
|
+
|
127
|
+
KeccakRhoOffsets[0] = 0;
|
128
|
+
x = 1;
|
129
|
+
y = 0;
|
130
|
+
for(t=0; t<24; t++) {
|
131
|
+
KeccakRhoOffsets[5*y+x] = ((t+1)*(t+2)/2) % 64;
|
132
|
+
newX = (0*x+1*y) % 5;
|
133
|
+
newY = (2*x+3*y) % 5;
|
134
|
+
x = newX;
|
135
|
+
y = newY;
|
136
|
+
}
|
137
|
+
}
|
138
|
+
|
139
|
+
static int LFSR86540(UINT8 *LFSR)
|
140
|
+
{
|
141
|
+
int result = ((*LFSR) & 0x01) != 0;
|
142
|
+
if (((*LFSR) & 0x80) != 0)
|
143
|
+
/* Primitive polynomial over GF(2): x^8+x^6+x^5+x^4+1 */
|
144
|
+
(*LFSR) = ((*LFSR) << 1) ^ 0x71;
|
145
|
+
else
|
146
|
+
(*LFSR) <<= 1;
|
147
|
+
return result;
|
148
|
+
}
|
149
|
+
|
150
|
+
#else
|
151
|
+
|
152
|
+
static const UINT32 KeccakRoundConstants[maxNrRounds][2] =
|
153
|
+
{
|
154
|
+
0x00000001, 0x00000000,
|
155
|
+
0x00000000, 0x00000089,
|
156
|
+
0x00000000, 0x8000008B,
|
157
|
+
0x00000000, 0x80008080,
|
158
|
+
0x00000001, 0x0000008B,
|
159
|
+
0x00000001, 0x00008000,
|
160
|
+
0x00000001, 0x80008088,
|
161
|
+
0x00000001, 0x80000082,
|
162
|
+
0x00000000, 0x0000000B,
|
163
|
+
0x00000000, 0x0000000A,
|
164
|
+
0x00000001, 0x00008082,
|
165
|
+
0x00000000, 0x00008003,
|
166
|
+
0x00000001, 0x0000808B,
|
167
|
+
0x00000001, 0x8000000B,
|
168
|
+
0x00000001, 0x8000008A,
|
169
|
+
0x00000001, 0x80000081,
|
170
|
+
0x00000000, 0x80000081,
|
171
|
+
0x00000000, 0x80000008,
|
172
|
+
0x00000000, 0x00000083,
|
173
|
+
0x00000000, 0x80008003,
|
174
|
+
0x00000001, 0x80008088,
|
175
|
+
0x00000000, 0x80000088,
|
176
|
+
0x00000001, 0x00008000,
|
177
|
+
0x00000000, 0x80008082
|
178
|
+
};
|
179
|
+
|
180
|
+
static const unsigned int KeccakRhoOffsets[nrLanes] =
|
181
|
+
{
|
182
|
+
0, 1, 62, 28, 27, 36, 44, 6, 55, 20, 3, 10, 43, 25, 39, 41, 45, 15, 21, 8, 18, 2, 61, 56, 14
|
183
|
+
};
|
184
|
+
|
185
|
+
#endif
|
186
|
+
|
187
|
+
/* ---------------------------------------------------------------- */
|
188
|
+
|
189
|
+
void KeccakP1600_Initialize(void *state)
|
190
|
+
{
|
191
|
+
memset(state, 0, 1600/8);
|
192
|
+
}
|
193
|
+
|
194
|
+
/* ---------------------------------------------------------------- */
|
195
|
+
|
196
|
+
void KeccakP1600_AddBytes(void *state, const unsigned char *data, unsigned int offset, unsigned int length);
|
197
|
+
|
198
|
+
void KeccakP1600_AddByte(void *state, unsigned char byte, unsigned int offset)
|
199
|
+
{
|
200
|
+
unsigned char data[1];
|
201
|
+
|
202
|
+
assert(offset < 200);
|
203
|
+
data[0] = byte;
|
204
|
+
KeccakP1600_AddBytes(state, data, offset, 1);
|
205
|
+
}
|
206
|
+
|
207
|
+
/* ---------------------------------------------------------------- */
|
208
|
+
|
209
|
+
void KeccakP1600_AddBytesInLane(void *state, unsigned int lanePosition, const unsigned char *data, unsigned int offset, unsigned int length)
|
210
|
+
{
|
211
|
+
if ((lanePosition < 25) && (offset < 8) && (offset+length <= 8)) {
|
212
|
+
UINT8 laneAsBytes[8];
|
213
|
+
UINT32 low, high;
|
214
|
+
UINT32 lane[2];
|
215
|
+
UINT32 *stateAsHalfLanes;
|
216
|
+
|
217
|
+
memset(laneAsBytes, 0, 8);
|
218
|
+
memcpy(laneAsBytes+offset, data, length);
|
219
|
+
low = laneAsBytes[0]
|
220
|
+
| ((UINT32)(laneAsBytes[1]) << 8)
|
221
|
+
| ((UINT32)(laneAsBytes[2]) << 16)
|
222
|
+
| ((UINT32)(laneAsBytes[3]) << 24);
|
223
|
+
high = laneAsBytes[4]
|
224
|
+
| ((UINT32)(laneAsBytes[5]) << 8)
|
225
|
+
| ((UINT32)(laneAsBytes[6]) << 16)
|
226
|
+
| ((UINT32)(laneAsBytes[7]) << 24);
|
227
|
+
toBitInterleaving(low, high, lane, lane+1);
|
228
|
+
stateAsHalfLanes = (UINT32*)state;
|
229
|
+
stateAsHalfLanes[lanePosition*2+0] ^= lane[0];
|
230
|
+
stateAsHalfLanes[lanePosition*2+1] ^= lane[1];
|
231
|
+
}
|
232
|
+
}
|
233
|
+
|
234
|
+
void KeccakP1600_AddBytes(void *state, const unsigned char *data, unsigned int offset, unsigned int length)
|
235
|
+
{
|
236
|
+
unsigned int lanePosition = offset/8;
|
237
|
+
unsigned int offsetInLane = offset%8;
|
238
|
+
|
239
|
+
assert(offset < 200);
|
240
|
+
assert(offset+length <= 200);
|
241
|
+
while(length > 0) {
|
242
|
+
unsigned int bytesInLane = 8 - offsetInLane;
|
243
|
+
if (bytesInLane > length)
|
244
|
+
bytesInLane = length;
|
245
|
+
KeccakP1600_AddBytesInLane(state, lanePosition, data, offsetInLane, bytesInLane);
|
246
|
+
length -= bytesInLane;
|
247
|
+
lanePosition++;
|
248
|
+
offsetInLane = 0;
|
249
|
+
data += bytesInLane;
|
250
|
+
}
|
251
|
+
}
|
252
|
+
|
253
|
+
/* ---------------------------------------------------------------- */
|
254
|
+
|
255
|
+
void KeccakP1600_ExtractBytesInLane(const void *state, unsigned int lanePosition, unsigned char *data, unsigned int offset, unsigned int length);
|
256
|
+
|
257
|
+
void KeccakP1600_OverwriteBytesInLane(void *state, unsigned int lanePosition, const unsigned char *data, unsigned int offset, unsigned int length)
|
258
|
+
{
|
259
|
+
if ((lanePosition < 25) && (offset < 8) && (offset+length <= 8)) {
|
260
|
+
UINT8 laneAsBytes[8];
|
261
|
+
UINT32 low, high;
|
262
|
+
UINT32 lane[2];
|
263
|
+
UINT32 *stateAsHalfLanes;
|
264
|
+
|
265
|
+
KeccakP1600_ExtractBytesInLane(state, lanePosition, laneAsBytes, 0, 8);
|
266
|
+
memcpy(laneAsBytes+offset, data, length);
|
267
|
+
low = laneAsBytes[0]
|
268
|
+
| ((UINT32)(laneAsBytes[1]) << 8)
|
269
|
+
| ((UINT32)(laneAsBytes[2]) << 16)
|
270
|
+
| ((UINT32)(laneAsBytes[3]) << 24);
|
271
|
+
high = laneAsBytes[4]
|
272
|
+
| ((UINT32)(laneAsBytes[5]) << 8)
|
273
|
+
| ((UINT32)(laneAsBytes[6]) << 16)
|
274
|
+
| ((UINT32)(laneAsBytes[7]) << 24);
|
275
|
+
toBitInterleaving(low, high, lane, lane+1);
|
276
|
+
stateAsHalfLanes = (UINT32*)state;
|
277
|
+
stateAsHalfLanes[lanePosition*2+0] = lane[0];
|
278
|
+
stateAsHalfLanes[lanePosition*2+1] = lane[1];
|
279
|
+
}
|
280
|
+
}
|
281
|
+
|
282
|
+
void KeccakP1600_OverwriteBytes(void *state, const unsigned char *data, unsigned int offset, unsigned int length)
|
283
|
+
{
|
284
|
+
unsigned int lanePosition = offset/8;
|
285
|
+
unsigned int offsetInLane = offset%8;
|
286
|
+
|
287
|
+
assert(offset < 200);
|
288
|
+
assert(offset+length <= 200);
|
289
|
+
while(length > 0) {
|
290
|
+
unsigned int bytesInLane = 8 - offsetInLane;
|
291
|
+
if (bytesInLane > length)
|
292
|
+
bytesInLane = length;
|
293
|
+
KeccakP1600_OverwriteBytesInLane(state, lanePosition, data, offsetInLane, bytesInLane);
|
294
|
+
length -= bytesInLane;
|
295
|
+
lanePosition++;
|
296
|
+
offsetInLane = 0;
|
297
|
+
data += bytesInLane;
|
298
|
+
}
|
299
|
+
}
|
300
|
+
|
301
|
+
/* ---------------------------------------------------------------- */
|
302
|
+
|
303
|
+
void KeccakP1600_OverwriteWithZeroes(void *state, unsigned int byteCount)
|
304
|
+
{
|
305
|
+
UINT8 laneAsBytes[8];
|
306
|
+
unsigned int lanePosition = 0;
|
307
|
+
|
308
|
+
assert(byteCount <= 200);
|
309
|
+
memset(laneAsBytes, 0, 8);
|
310
|
+
while(byteCount > 0) {
|
311
|
+
if (byteCount < 8) {
|
312
|
+
KeccakP1600_OverwriteBytesInLane(state, lanePosition, laneAsBytes, 0, byteCount);
|
313
|
+
byteCount = 0;
|
314
|
+
}
|
315
|
+
else {
|
316
|
+
UINT32 *stateAsHalfLanes = (UINT32*)state;
|
317
|
+
stateAsHalfLanes[lanePosition*2+0] = 0;
|
318
|
+
stateAsHalfLanes[lanePosition*2+1] = 0;
|
319
|
+
byteCount -= 8;
|
320
|
+
lanePosition++;
|
321
|
+
}
|
322
|
+
}
|
323
|
+
}
|
324
|
+
|
325
|
+
/* ---------------------------------------------------------------- */
|
326
|
+
|
327
|
+
void KeccakP1600_PermutationOnWords(UINT32 *state, unsigned int nrRounds);
|
328
|
+
static void theta(UINT32 *A);
|
329
|
+
static void rho(UINT32 *A);
|
330
|
+
static void pi(UINT32 *A);
|
331
|
+
static void chi(UINT32 *A);
|
332
|
+
static void iota(UINT32 *A, unsigned int indexRound);
|
333
|
+
void KeccakP1600_ExtractBytes(const void *state, unsigned char *data, unsigned int offset, unsigned int length);
|
334
|
+
|
335
|
+
void KeccakP1600_Permute_Nrounds(void *state, unsigned int nrounds)
|
336
|
+
{
|
337
|
+
UINT32 *stateAsHalfLanes = (UINT32*)state;
|
338
|
+
{
|
339
|
+
UINT8 stateAsBytes[1600/8];
|
340
|
+
KeccakP1600_ExtractBytes(state, stateAsBytes, 0, 1600/8);
|
341
|
+
#ifdef KeccakReference
|
342
|
+
displayStateAsBytes(1, "Input of permutation", stateAsBytes, 1600);
|
343
|
+
#endif
|
344
|
+
}
|
345
|
+
KeccakP1600_PermutationOnWords(stateAsHalfLanes, nrounds);
|
346
|
+
{
|
347
|
+
UINT8 stateAsBytes[1600/8];
|
348
|
+
KeccakP1600_ExtractBytes(state, stateAsBytes, 0, 1600/8);
|
349
|
+
#ifdef KeccakReference
|
350
|
+
displayStateAsBytes(1, "State after permutation", stateAsBytes, 1600);
|
351
|
+
#endif
|
352
|
+
}
|
353
|
+
}
|
354
|
+
|
355
|
+
|
356
|
+
void KeccakP1600_Permute_12rounds(void *state)
|
357
|
+
{
|
358
|
+
UINT32 *stateAsHalfLanes = (UINT32*)state;
|
359
|
+
{
|
360
|
+
UINT8 stateAsBytes[1600/8];
|
361
|
+
KeccakP1600_ExtractBytes(state, stateAsBytes, 0, 1600/8);
|
362
|
+
#ifdef KeccakReference
|
363
|
+
displayStateAsBytes(1, "Input of permutation", stateAsBytes, 1600);
|
364
|
+
#endif
|
365
|
+
}
|
366
|
+
KeccakP1600_PermutationOnWords(stateAsHalfLanes, 12);
|
367
|
+
{
|
368
|
+
UINT8 stateAsBytes[1600/8];
|
369
|
+
KeccakP1600_ExtractBytes(state, stateAsBytes, 0, 1600/8);
|
370
|
+
#ifdef KeccakReference
|
371
|
+
displayStateAsBytes(1, "State after permutation", stateAsBytes, 1600);
|
372
|
+
#endif
|
373
|
+
}
|
374
|
+
}
|
375
|
+
|
376
|
+
void KeccakP1600_Permute_24rounds(void *state)
|
377
|
+
{
|
378
|
+
UINT32 *stateAsHalfLanes = (UINT32*)state;
|
379
|
+
{
|
380
|
+
UINT8 stateAsBytes[1600/8];
|
381
|
+
KeccakP1600_ExtractBytes(state, stateAsBytes, 0, 1600/8);
|
382
|
+
#ifdef KeccakReference
|
383
|
+
displayStateAsBytes(1, "Input of permutation", stateAsBytes, 1600);
|
384
|
+
#endif
|
385
|
+
}
|
386
|
+
KeccakP1600_PermutationOnWords(stateAsHalfLanes, 24);
|
387
|
+
{
|
388
|
+
UINT8 stateAsBytes[1600/8];
|
389
|
+
KeccakP1600_ExtractBytes(state, stateAsBytes, 0, 1600/8);
|
390
|
+
#ifdef KeccakReference
|
391
|
+
displayStateAsBytes(1, "State after permutation", stateAsBytes, 1600);
|
392
|
+
#endif
|
393
|
+
}
|
394
|
+
}
|
395
|
+
|
396
|
+
void KeccakP1600_PermutationOnWords(UINT32 *state, unsigned int nrRounds)
|
397
|
+
{
|
398
|
+
unsigned int i;
|
399
|
+
|
400
|
+
#ifdef KeccakReference
|
401
|
+
displayStateAs32bitWords(3, "Same, with lanes as pairs of 32-bit words (bit interleaving)", state);
|
402
|
+
#endif
|
403
|
+
|
404
|
+
for(i=(maxNrRounds-nrRounds); i<maxNrRounds; i++) {
|
405
|
+
#ifdef KeccakReference
|
406
|
+
displayRoundNumber(3, i);
|
407
|
+
#endif
|
408
|
+
|
409
|
+
theta(state);
|
410
|
+
#ifdef KeccakReference
|
411
|
+
displayStateAs32bitWords(3, "After theta", state);
|
412
|
+
#endif
|
413
|
+
|
414
|
+
rho(state);
|
415
|
+
#ifdef KeccakReference
|
416
|
+
displayStateAs32bitWords(3, "After rho", state);
|
417
|
+
#endif
|
418
|
+
|
419
|
+
pi(state);
|
420
|
+
#ifdef KeccakReference
|
421
|
+
displayStateAs32bitWords(3, "After pi", state);
|
422
|
+
#endif
|
423
|
+
|
424
|
+
chi(state);
|
425
|
+
#ifdef KeccakReference
|
426
|
+
displayStateAs32bitWords(3, "After chi", state);
|
427
|
+
#endif
|
428
|
+
|
429
|
+
iota(state, i);
|
430
|
+
#ifdef KeccakReference
|
431
|
+
displayStateAs32bitWords(3, "After iota", state);
|
432
|
+
#endif
|
433
|
+
}
|
434
|
+
}
|
435
|
+
|
436
|
+
#define index(x, y,z) ((((x)%5)+5*((y)%5))*2 + z)
|
437
|
+
#define ROL32(a, offset) ((offset != 0) ? ((((UINT32)a) << offset) ^ (((UINT32)a) >> (32-offset))) : a)
|
438
|
+
|
439
|
+
void ROL64(UINT32 inEven, UINT32 inOdd, UINT32 *outEven, UINT32 *outOdd, unsigned int offset)
|
440
|
+
{
|
441
|
+
if ((offset % 2) == 0) {
|
442
|
+
*outEven = ROL32(inEven, offset/2);
|
443
|
+
*outOdd = ROL32(inOdd, offset/2);
|
444
|
+
}
|
445
|
+
else {
|
446
|
+
*outEven = ROL32(inOdd, (offset+1)/2);
|
447
|
+
*outOdd = ROL32(inEven, (offset-1)/2);
|
448
|
+
}
|
449
|
+
}
|
450
|
+
|
451
|
+
static void theta(UINT32 *A)
|
452
|
+
{
|
453
|
+
unsigned int x, y, z;
|
454
|
+
UINT32 C[5][2], D[5][2];
|
455
|
+
|
456
|
+
for(x=0; x<5; x++) {
|
457
|
+
for(z=0; z<2; z++) {
|
458
|
+
C[x][z] = 0;
|
459
|
+
for(y=0; y<5; y++)
|
460
|
+
C[x][z] ^= A[index(x, y, z)];
|
461
|
+
}
|
462
|
+
}
|
463
|
+
for(x=0; x<5; x++) {
|
464
|
+
ROL64(C[(x+1)%5][0], C[(x+1)%5][1], &(D[x][0]), &(D[x][1]), 1);
|
465
|
+
for(z=0; z<2; z++)
|
466
|
+
D[x][z] ^= C[(x+4)%5][z];
|
467
|
+
}
|
468
|
+
for(x=0; x<5; x++)
|
469
|
+
for(y=0; y<5; y++)
|
470
|
+
for(z=0; z<2; z++)
|
471
|
+
A[index(x, y, z)] ^= D[x][z];
|
472
|
+
}
|
473
|
+
|
474
|
+
static void rho(UINT32 *A)
|
475
|
+
{
|
476
|
+
unsigned int x, y;
|
477
|
+
|
478
|
+
for(x=0; x<5; x++) for(y=0; y<5; y++)
|
479
|
+
ROL64(A[index(x, y, 0)], A[index(x, y, 1)], &(A[index(x, y, 0)]), &(A[index(x, y, 1)]), KeccakRhoOffsets[5*y+x]);
|
480
|
+
}
|
481
|
+
|
482
|
+
static void pi(UINT32 *A)
|
483
|
+
{
|
484
|
+
unsigned int x, y, z;
|
485
|
+
UINT32 tempA[50];
|
486
|
+
|
487
|
+
for(x=0; x<5; x++) for(y=0; y<5; y++) for(z=0; z<2; z++)
|
488
|
+
tempA[index(x, y, z)] = A[index(x, y, z)];
|
489
|
+
for(x=0; x<5; x++) for(y=0; y<5; y++) for(z=0; z<2; z++)
|
490
|
+
A[index(0*x+1*y, 2*x+3*y, z)] = tempA[index(x, y, z)];
|
491
|
+
}
|
492
|
+
|
493
|
+
static void chi(UINT32 *A)
|
494
|
+
{
|
495
|
+
unsigned int x, y, z;
|
496
|
+
UINT32 C[5][2];
|
497
|
+
|
498
|
+
for(y=0; y<5; y++) {
|
499
|
+
for(x=0; x<5; x++)
|
500
|
+
for(z=0; z<2; z++)
|
501
|
+
C[x][z] = A[index(x, y, z)] ^ ((~A[index(x+1, y, z)]) & A[index(x+2, y, z)]);
|
502
|
+
for(x=0; x<5; x++)
|
503
|
+
for(z=0; z<2; z++)
|
504
|
+
A[index(x, y, z)] = C[x][z];
|
505
|
+
}
|
506
|
+
}
|
507
|
+
|
508
|
+
static void iota(UINT32 *A, unsigned int indexRound)
|
509
|
+
{
|
510
|
+
A[index(0, 0, 0)] ^= KeccakRoundConstants[indexRound][0];
|
511
|
+
A[index(0, 0, 1)] ^= KeccakRoundConstants[indexRound][1];
|
512
|
+
}
|
513
|
+
|
514
|
+
/* ---------------------------------------------------------------- */
|
515
|
+
|
516
|
+
void KeccakP1600_ExtractBytesInLane(const void *state, unsigned int lanePosition, unsigned char *data, unsigned int offset, unsigned int length)
|
517
|
+
{
|
518
|
+
if ((lanePosition < 25) && (offset < 8) && (offset+length <= 8)) {
|
519
|
+
UINT32 *stateAsHalfLanes = (UINT32*)state;
|
520
|
+
UINT32 lane[2];
|
521
|
+
UINT8 laneAsBytes[8];
|
522
|
+
fromBitInterleaving(stateAsHalfLanes[lanePosition*2], stateAsHalfLanes[lanePosition*2+1], lane, lane+1);
|
523
|
+
laneAsBytes[0] = lane[0] & 0xFF;
|
524
|
+
laneAsBytes[1] = (lane[0] >> 8) & 0xFF;
|
525
|
+
laneAsBytes[2] = (lane[0] >> 16) & 0xFF;
|
526
|
+
laneAsBytes[3] = (lane[0] >> 24) & 0xFF;
|
527
|
+
laneAsBytes[4] = lane[1] & 0xFF;
|
528
|
+
laneAsBytes[5] = (lane[1] >> 8) & 0xFF;
|
529
|
+
laneAsBytes[6] = (lane[1] >> 16) & 0xFF;
|
530
|
+
laneAsBytes[7] = (lane[1] >> 24) & 0xFF;
|
531
|
+
memcpy(data, laneAsBytes+offset, length);
|
532
|
+
}
|
533
|
+
}
|
534
|
+
|
535
|
+
void KeccakP1600_ExtractBytes(const void *state, unsigned char *data, unsigned int offset, unsigned int length)
|
536
|
+
{
|
537
|
+
unsigned int lanePosition = offset/8;
|
538
|
+
unsigned int offsetInLane = offset%8;
|
539
|
+
|
540
|
+
assert(offset < 200);
|
541
|
+
assert(offset+length <= 200);
|
542
|
+
while(length > 0) {
|
543
|
+
unsigned int bytesInLane = 8 - offsetInLane;
|
544
|
+
if (bytesInLane > length)
|
545
|
+
bytesInLane = length;
|
546
|
+
KeccakP1600_ExtractBytesInLane(state, lanePosition, data, offsetInLane, bytesInLane);
|
547
|
+
length -= bytesInLane;
|
548
|
+
lanePosition++;
|
549
|
+
offsetInLane = 0;
|
550
|
+
data += bytesInLane;
|
551
|
+
}
|
552
|
+
}
|
553
|
+
|
554
|
+
/* ---------------------------------------------------------------- */
|
555
|
+
|
556
|
+
void KeccakP1600_ExtractAndAddBytesInLane(const void *state, unsigned int lanePosition, const unsigned char *input, unsigned char *output, unsigned int offset, unsigned int length)
|
557
|
+
{
|
558
|
+
if ((lanePosition < 25) && (offset < 8) && (offset+length <= 8)) {
|
559
|
+
UINT8 laneAsBytes[8];
|
560
|
+
unsigned int i;
|
561
|
+
|
562
|
+
KeccakP1600_ExtractBytesInLane(state, lanePosition, laneAsBytes, offset, length);
|
563
|
+
for(i=0; i<length; i++)
|
564
|
+
output[i] = input[i] ^ laneAsBytes[i];
|
565
|
+
}
|
566
|
+
}
|
567
|
+
|
568
|
+
void KeccakP1600_ExtractAndAddBytes(const void *state, const unsigned char *input, unsigned char *output, unsigned int offset, unsigned int length)
|
569
|
+
{
|
570
|
+
unsigned int lanePosition = offset/8;
|
571
|
+
unsigned int offsetInLane = offset%8;
|
572
|
+
|
573
|
+
assert(offset < 200);
|
574
|
+
assert(offset+length <= 200);
|
575
|
+
while(length > 0) {
|
576
|
+
unsigned int bytesInLane = 8 - offsetInLane;
|
577
|
+
if (bytesInLane > length)
|
578
|
+
bytesInLane = length;
|
579
|
+
KeccakP1600_ExtractAndAddBytesInLane(state, lanePosition, input, output, offsetInLane, bytesInLane);
|
580
|
+
length -= bytesInLane;
|
581
|
+
lanePosition++;
|
582
|
+
offsetInLane = 0;
|
583
|
+
input += bytesInLane;
|
584
|
+
output += bytesInLane;
|
585
|
+
}
|
586
|
+
}
|
587
|
+
|
588
|
+
/* ---------------------------------------------------------------- */
|
589
|
+
|
590
|
+
void KeccakP1600_DisplayRoundConstants(FILE *f)
|
591
|
+
{
|
592
|
+
unsigned int i;
|
593
|
+
|
594
|
+
for(i=0; i<maxNrRounds; i++) {
|
595
|
+
fprintf(f, "RC[%02i][0][0] = ", i);
|
596
|
+
fprintf(f, "%08X:%08X", (unsigned int)(KeccakRoundConstants[i][0]), (unsigned int)(KeccakRoundConstants[i][1]));
|
597
|
+
fprintf(f, "\n");
|
598
|
+
}
|
599
|
+
fprintf(f, "\n");
|
600
|
+
}
|
601
|
+
|
602
|
+
void KeccakP1600_DisplayRhoOffsets(FILE *f)
|
603
|
+
{
|
604
|
+
unsigned int x, y;
|
605
|
+
|
606
|
+
for(y=0; y<5; y++) for(x=0; x<5; x++) {
|
607
|
+
fprintf(f, "RhoOffset[%i][%i] = ", x, y);
|
608
|
+
fprintf(f, "%2i", KeccakRhoOffsets[5*y+x]);
|
609
|
+
fprintf(f, "\n");
|
610
|
+
}
|
611
|
+
fprintf(f, "\n");
|
612
|
+
}
|