sleeping_kangaroo12 0.0.1 → 0.0.5
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/LICENSE.md +27 -0
- data/README.md +48 -53
- data/ext/Rakefile +12 -37
- data/ext/binding/sleeping_kangaroo12.c +1 -16
- data/ext/{xkcp → k12}/Makefile +0 -0
- data/ext/k12/Makefile.build +118 -0
- data/ext/k12/README.markdown +86 -0
- data/ext/k12/lib/ARMv8Asha3/KeccakP-1600-ARMv8Asha3.S +623 -0
- data/ext/k12/lib/ARMv8Asha3/KeccakP-1600-SnP.h +65 -0
- data/ext/k12/lib/ARMv8Asha3/KeccakP-1600-opt64.c +227 -0
- data/ext/{xkcp/lib/low/KeccakP-1600/compact → k12/lib/Inplace32BI}/KeccakP-1600-SnP.h +4 -9
- data/ext/{xkcp/lib/low/KeccakP-1600/plain-32bits-inplace → k12/lib/Inplace32BI}/KeccakP-1600-inplace32BI.c +65 -160
- data/ext/k12/lib/KangarooTwelve.c +332 -0
- data/ext/{xkcp/lib/high/KangarooTwelve → k12/lib}/KangarooTwelve.h +53 -16
- data/ext/{xkcp/lib/low/KeccakP-1600/AVX2 → k12/lib/Optimized64}/KeccakP-1600-AVX2.s +122 -558
- data/ext/k12/lib/Optimized64/KeccakP-1600-AVX512-plainC.c +241 -0
- data/ext/k12/lib/Optimized64/KeccakP-1600-AVX512.s +551 -0
- data/ext/k12/lib/Optimized64/KeccakP-1600-SnP.h +74 -0
- data/ext/{xkcp/lib/low/KeccakP-1600/common/KeccakP-1600-64.macros → k12/lib/Optimized64/KeccakP-1600-opt64.c} +447 -169
- data/ext/k12/lib/Optimized64/KeccakP-1600-runtimeDispatch.c +406 -0
- data/ext/k12/lib/Optimized64/KeccakP-1600-timesN-AVX2.c +419 -0
- data/ext/k12/lib/Optimized64/KeccakP-1600-timesN-AVX512.c +458 -0
- data/ext/k12/lib/Optimized64/KeccakP-1600-timesN-SSSE3.c +438 -0
- data/ext/{xkcp/lib/low/KeccakP-1600/plain-64bits → k12/lib/Plain64}/KeccakP-1600-SnP.h +14 -20
- data/ext/{xkcp/lib/low/KeccakP-1600/ref-64bits/KeccakP-1600-reference.h → k12/lib/Plain64/KeccakP-1600-plain64.c} +9 -8
- data/ext/{xkcp/lib/common → k12/lib}/align.h +3 -2
- data/ext/{xkcp/lib/common → k12/lib}/brg_endian.h +0 -0
- data/ext/{xkcp → k12}/support/Build/ExpandProducts.xsl +0 -0
- data/ext/{xkcp → k12}/support/Build/ToGlobalMakefile.xsl +0 -0
- data/ext/{xkcp → k12}/support/Build/ToOneTarget.xsl +0 -0
- data/ext/{xkcp → k12}/support/Build/ToTargetConfigFile.xsl +0 -0
- data/ext/{xkcp → k12}/support/Build/ToTargetMakefile.xsl +10 -16
- data/ext/{xkcp → k12}/support/Build/ToVCXProj.xsl +0 -0
- data/lib/sleeping_kangaroo12/binding.rb +2 -1
- data/lib/sleeping_kangaroo12/build/loader.rb +1 -0
- data/lib/sleeping_kangaroo12/build/platform.rb +1 -0
- data/lib/sleeping_kangaroo12/digest.rb +38 -4
- data/lib/sleeping_kangaroo12/version.rb +1 -1
- metadata +48 -288
- data/ext/config/xkcp.build +0 -17
- data/ext/xkcp/LICENSE +0 -1
- data/ext/xkcp/Makefile.build +0 -200
- data/ext/xkcp/README.markdown +0 -296
- data/ext/xkcp/lib/HighLevel.build +0 -143
- data/ext/xkcp/lib/LowLevel.build +0 -757
- data/ext/xkcp/lib/high/KangarooTwelve/KangarooTwelve.c +0 -301
- data/ext/xkcp/lib/high/Keccak/FIPS202/KeccakHash.c +0 -81
- data/ext/xkcp/lib/high/Keccak/FIPS202/KeccakHash.h +0 -125
- data/ext/xkcp/lib/high/Keccak/FIPS202/SimpleFIPS202.c +0 -48
- data/ext/xkcp/lib/high/Keccak/FIPS202/SimpleFIPS202.h +0 -79
- data/ext/xkcp/lib/high/Keccak/KeccakDuplex.c +0 -81
- data/ext/xkcp/lib/high/Keccak/KeccakDuplex.h +0 -73
- data/ext/xkcp/lib/high/Keccak/KeccakDuplex.inc +0 -195
- data/ext/xkcp/lib/high/Keccak/KeccakSponge.c +0 -111
- data/ext/xkcp/lib/high/Keccak/KeccakSponge.h +0 -76
- data/ext/xkcp/lib/high/Keccak/KeccakSponge.inc +0 -314
- data/ext/xkcp/lib/high/Keccak/PRG/KeccakPRG.c +0 -61
- data/ext/xkcp/lib/high/Keccak/PRG/KeccakPRG.h +0 -67
- data/ext/xkcp/lib/high/Keccak/PRG/KeccakPRG.inc +0 -128
- data/ext/xkcp/lib/high/Keccak/SP800-185/SP800-185.c +0 -93
- data/ext/xkcp/lib/high/Keccak/SP800-185/SP800-185.h +0 -599
- data/ext/xkcp/lib/high/Keccak/SP800-185/SP800-185.inc +0 -573
- data/ext/xkcp/lib/high/Ketje/Ketjev2.c +0 -87
- data/ext/xkcp/lib/high/Ketje/Ketjev2.h +0 -88
- data/ext/xkcp/lib/high/Ketje/Ketjev2.inc +0 -274
- data/ext/xkcp/lib/high/Keyak/Keyakv2.c +0 -132
- data/ext/xkcp/lib/high/Keyak/Keyakv2.h +0 -217
- data/ext/xkcp/lib/high/Keyak/Keyakv2.inc +0 -81
- data/ext/xkcp/lib/high/Keyak/Motorist.inc +0 -953
- data/ext/xkcp/lib/high/Kravatte/Kravatte.c +0 -533
- data/ext/xkcp/lib/high/Kravatte/Kravatte.h +0 -115
- data/ext/xkcp/lib/high/Kravatte/KravatteModes.c +0 -557
- data/ext/xkcp/lib/high/Kravatte/KravatteModes.h +0 -247
- data/ext/xkcp/lib/high/Xoodyak/Cyclist.h +0 -66
- data/ext/xkcp/lib/high/Xoodyak/Cyclist.inc +0 -336
- data/ext/xkcp/lib/high/Xoodyak/Xoodyak-parameters.h +0 -26
- data/ext/xkcp/lib/high/Xoodyak/Xoodyak.c +0 -55
- data/ext/xkcp/lib/high/Xoodyak/Xoodyak.h +0 -35
- data/ext/xkcp/lib/high/Xoofff/Xoofff.c +0 -634
- data/ext/xkcp/lib/high/Xoofff/Xoofff.h +0 -147
- data/ext/xkcp/lib/high/Xoofff/XoofffModes.c +0 -483
- data/ext/xkcp/lib/high/Xoofff/XoofffModes.h +0 -241
- data/ext/xkcp/lib/high/common/Phases.h +0 -25
- data/ext/xkcp/lib/low/KeccakP-1600/ARM/KeccakP-1600-SnP.h +0 -41
- data/ext/xkcp/lib/low/KeccakP-1600/ARM/KeccakP-1600-inplace-32bi-armv6m-le-armcc.s +0 -1666
- data/ext/xkcp/lib/low/KeccakP-1600/ARM/KeccakP-1600-inplace-32bi-armv6m-le-gcc.s +0 -1655
- data/ext/xkcp/lib/low/KeccakP-1600/ARM/KeccakP-1600-inplace-32bi-armv7a-le-armcc.s +0 -1268
- data/ext/xkcp/lib/low/KeccakP-1600/ARM/KeccakP-1600-inplace-32bi-armv7a-le-gcc.s +0 -1264
- data/ext/xkcp/lib/low/KeccakP-1600/ARM/KeccakP-1600-inplace-32bi-armv7m-le-armcc.s +0 -1178
- data/ext/xkcp/lib/low/KeccakP-1600/ARM/KeccakP-1600-inplace-32bi-armv7m-le-gcc.s +0 -1175
- data/ext/xkcp/lib/low/KeccakP-1600/ARM/KeccakP-1600-u1-32bi-armv6m-le-armcc.s +0 -1338
- data/ext/xkcp/lib/low/KeccakP-1600/ARM/KeccakP-1600-u1-32bi-armv6m-le-gcc.s +0 -1336
- data/ext/xkcp/lib/low/KeccakP-1600/ARM/KeccakP-1600-u2-32bi-armv6m-le-armcc.s +0 -1343
- data/ext/xkcp/lib/low/KeccakP-1600/ARM/KeccakP-1600-u2-32bi-armv6m-le-gcc.s +0 -1339
- data/ext/xkcp/lib/low/KeccakP-1600/ARMv7A-NEON/KeccakP-1600-SnP.h +0 -42
- data/ext/xkcp/lib/low/KeccakP-1600/ARMv7A-NEON/KeccakP-1600-armv7a-le-neon-armcc.s +0 -823
- data/ext/xkcp/lib/low/KeccakP-1600/ARMv7A-NEON/KeccakP-1600-armv7a-le-neon-gcc.s +0 -831
- data/ext/xkcp/lib/low/KeccakP-1600/ARMv8A/KeccakP-1600-SnP.h +0 -31
- data/ext/xkcp/lib/low/KeccakP-1600/ARMv8A/KeccakP-1600-armv8a-neon.s +0 -540
- data/ext/xkcp/lib/low/KeccakP-1600/AVR8/KeccakP-1600-SnP.h +0 -42
- data/ext/xkcp/lib/low/KeccakP-1600/AVR8/KeccakP-1600-avr8-compact.s +0 -733
- data/ext/xkcp/lib/low/KeccakP-1600/AVR8/KeccakP-1600-avr8-fast.s +0 -1121
- data/ext/xkcp/lib/low/KeccakP-1600/AVX2/KeccakP-1600-SnP.h +0 -52
- data/ext/xkcp/lib/low/KeccakP-1600/AVX512/C/KeccakP-1600-AVX512.c +0 -623
- data/ext/xkcp/lib/low/KeccakP-1600/AVX512/C/KeccakP-1600-SnP.h +0 -47
- data/ext/xkcp/lib/low/KeccakP-1600/AVX512/C/u12/KeccakP-1600-AVX512-config.h +0 -6
- data/ext/xkcp/lib/low/KeccakP-1600/AVX512/C/u6/KeccakP-1600-AVX512-config.h +0 -6
- data/ext/xkcp/lib/low/KeccakP-1600/AVX512/C/ua/KeccakP-1600-AVX512-config.h +0 -6
- data/ext/xkcp/lib/low/KeccakP-1600/AVX512/KeccakP-1600-AVX512.s +0 -1031
- data/ext/xkcp/lib/low/KeccakP-1600/AVX512/KeccakP-1600-SnP.h +0 -53
- data/ext/xkcp/lib/low/KeccakP-1600/XOP/KeccakP-1600-SnP.h +0 -44
- data/ext/xkcp/lib/low/KeccakP-1600/XOP/KeccakP-1600-XOP.c +0 -476
- data/ext/xkcp/lib/low/KeccakP-1600/XOP/u6/KeccakP-1600-XOP-config.h +0 -6
- data/ext/xkcp/lib/low/KeccakP-1600/XOP/ua/KeccakP-1600-XOP-config.h +0 -6
- data/ext/xkcp/lib/low/KeccakP-1600/common/KeccakP-1600-unrolling.macros +0 -305
- data/ext/xkcp/lib/low/KeccakP-1600/compact/KeccakP-1600-compact64.c +0 -420
- data/ext/xkcp/lib/low/KeccakP-1600/plain-32bits-inplace/KeccakP-1600-SnP.h +0 -43
- data/ext/xkcp/lib/low/KeccakP-1600/plain-64bits/KeccakP-1600-opt64.c +0 -565
- data/ext/xkcp/lib/low/KeccakP-1600/plain-64bits/lcu6/KeccakP-1600-opt64-config.h +0 -7
- data/ext/xkcp/lib/low/KeccakP-1600/plain-64bits/lcua/KeccakP-1600-opt64-config.h +0 -7
- data/ext/xkcp/lib/low/KeccakP-1600/plain-64bits/lcua-shld/KeccakP-1600-opt64-config.h +0 -8
- data/ext/xkcp/lib/low/KeccakP-1600/plain-64bits/u6/KeccakP-1600-opt64-config.h +0 -6
- data/ext/xkcp/lib/low/KeccakP-1600/plain-64bits/ua/KeccakP-1600-opt64-config.h +0 -6
- data/ext/xkcp/lib/low/KeccakP-1600/ref-32bits/KeccakP-1600-SnP.h +0 -44
- data/ext/xkcp/lib/low/KeccakP-1600/ref-32bits/KeccakP-1600-reference.h +0 -23
- data/ext/xkcp/lib/low/KeccakP-1600/ref-32bits/KeccakP-1600-reference32BI.c +0 -625
- data/ext/xkcp/lib/low/KeccakP-1600/ref-64bits/KeccakP-1600-SnP.h +0 -44
- data/ext/xkcp/lib/low/KeccakP-1600/ref-64bits/KeccakP-1600-reference.c +0 -440
- data/ext/xkcp/lib/low/KeccakP-1600/x86-64/KeccakP-1600-SnP.h +0 -42
- data/ext/xkcp/lib/low/KeccakP-1600/x86-64/KeccakP-1600-x86-64-gas.s +0 -1196
- data/ext/xkcp/lib/low/KeccakP-1600/x86-64/KeccakP-1600-x86-64-gas_Apple.s +0 -1124
- data/ext/xkcp/lib/low/KeccakP-1600/x86-64/KeccakP-1600-x86-64-shld-gas.s +0 -1196
- data/ext/xkcp/lib/low/KeccakP-1600-times2/ARMv7A-NEON/KeccakP-1600-inplace-pl2-armv7a-neon-le-armcc.s +0 -1392
- data/ext/xkcp/lib/low/KeccakP-1600-times2/ARMv7A-NEON/KeccakP-1600-inplace-pl2-armv7a-neon-le-gcc.s +0 -1394
- data/ext/xkcp/lib/low/KeccakP-1600-times2/ARMv7A-NEON/KeccakP-1600-times2-SnP.h +0 -42
- data/ext/xkcp/lib/low/KeccakP-1600-times2/AVX512/AVX512u12/SIMD512-2-config.h +0 -7
- data/ext/xkcp/lib/low/KeccakP-1600-times2/AVX512/AVX512u4/SIMD512-2-config.h +0 -7
- data/ext/xkcp/lib/low/KeccakP-1600-times2/AVX512/AVX512ufull/SIMD512-2-config.h +0 -7
- data/ext/xkcp/lib/low/KeccakP-1600-times2/AVX512/KeccakP-1600-times2-SIMD512.c +0 -850
- data/ext/xkcp/lib/low/KeccakP-1600-times2/AVX512/KeccakP-1600-times2-SnP.h +0 -51
- data/ext/xkcp/lib/low/KeccakP-1600-times2/SIMD128/KeccakP-1600-times2-SIMD128.c +0 -957
- data/ext/xkcp/lib/low/KeccakP-1600-times2/SIMD128/KeccakP-1600-times2-SnP.h +0 -49
- data/ext/xkcp/lib/low/KeccakP-1600-times2/SIMD128/SSSE3-u2/SIMD128-config.h +0 -8
- data/ext/xkcp/lib/low/KeccakP-1600-times2/SIMD128/SSSE3-ua/SIMD128-config.h +0 -8
- data/ext/xkcp/lib/low/KeccakP-1600-times2/SIMD128/XOP-u2/SIMD128-config.h +0 -9
- data/ext/xkcp/lib/low/KeccakP-1600-times2/SIMD128/XOP-ua/SIMD128-config.h +0 -9
- data/ext/xkcp/lib/low/KeccakP-1600-times2/fallback-on1/KeccakP-1600-times2-SnP.h +0 -45
- data/ext/xkcp/lib/low/KeccakP-1600-times2/fallback-on1/KeccakP-1600-times2-on1.c +0 -37
- data/ext/xkcp/lib/low/KeccakP-1600-times4/AVX2/KeccakP-1600-times4-SIMD256.c +0 -1321
- data/ext/xkcp/lib/low/KeccakP-1600-times4/AVX2/KeccakP-1600-times4-SnP.h +0 -55
- data/ext/xkcp/lib/low/KeccakP-1600-times4/AVX2/u12/SIMD256-config.h +0 -7
- data/ext/xkcp/lib/low/KeccakP-1600-times4/AVX2/u6/SIMD256-config.h +0 -7
- data/ext/xkcp/lib/low/KeccakP-1600-times4/AVX2/ua/SIMD256-config.h +0 -7
- data/ext/xkcp/lib/low/KeccakP-1600-times4/AVX512/AVX512u12/SIMD512-4-config.h +0 -7
- data/ext/xkcp/lib/low/KeccakP-1600-times4/AVX512/AVX512u4/SIMD512-4-config.h +0 -7
- data/ext/xkcp/lib/low/KeccakP-1600-times4/AVX512/AVX512ufull/SIMD512-4-config.h +0 -7
- data/ext/xkcp/lib/low/KeccakP-1600-times4/AVX512/KeccakP-1600-times4-SIMD512.c +0 -881
- data/ext/xkcp/lib/low/KeccakP-1600-times4/AVX512/KeccakP-1600-times4-SnP.h +0 -51
- data/ext/xkcp/lib/low/KeccakP-1600-times4/fallback-on1/KeccakP-1600-times4-SnP.h +0 -45
- data/ext/xkcp/lib/low/KeccakP-1600-times4/fallback-on1/KeccakP-1600-times4-on1.c +0 -37
- data/ext/xkcp/lib/low/KeccakP-1600-times4/fallback-on2/KeccakP-1600-times4-SnP.h +0 -45
- data/ext/xkcp/lib/low/KeccakP-1600-times4/fallback-on2/KeccakP-1600-times4-on2.c +0 -38
- data/ext/xkcp/lib/low/KeccakP-1600-times8/AVX512/KeccakP-1600-times8-SIMD512.c +0 -1615
- data/ext/xkcp/lib/low/KeccakP-1600-times8/AVX512/KeccakP-1600-times8-SnP.h +0 -57
- data/ext/xkcp/lib/low/KeccakP-1600-times8/AVX512/u12/SIMD512-config.h +0 -7
- data/ext/xkcp/lib/low/KeccakP-1600-times8/AVX512/u4/SIMD512-config.h +0 -7
- data/ext/xkcp/lib/low/KeccakP-1600-times8/AVX512/ua/SIMD512-config.h +0 -7
- data/ext/xkcp/lib/low/KeccakP-1600-times8/fallback-on1/KeccakP-1600-times8-SnP.h +0 -45
- data/ext/xkcp/lib/low/KeccakP-1600-times8/fallback-on1/KeccakP-1600-times8-on1.c +0 -37
- data/ext/xkcp/lib/low/KeccakP-1600-times8/fallback-on2/KeccakP-1600-times8-SnP.h +0 -45
- data/ext/xkcp/lib/low/KeccakP-1600-times8/fallback-on2/KeccakP-1600-times8-on2.c +0 -38
- data/ext/xkcp/lib/low/KeccakP-1600-times8/fallback-on4/KeccakP-1600-times8-SnP.h +0 -45
- data/ext/xkcp/lib/low/KeccakP-1600-times8/fallback-on4/KeccakP-1600-times8-on4.c +0 -38
- data/ext/xkcp/lib/low/KeccakP-200/ARM/KeccakP-200-SnP.h +0 -41
- data/ext/xkcp/lib/low/KeccakP-200/ARM/KeccakP-200-armv6m-le-armcc.s +0 -442
- data/ext/xkcp/lib/low/KeccakP-200/ARM/KeccakP-200-armv6m-le-gcc.s +0 -446
- data/ext/xkcp/lib/low/KeccakP-200/ARM/KeccakP-200-armv7m-le-armcc.s +0 -419
- data/ext/xkcp/lib/low/KeccakP-200/ARM/KeccakP-200-armv7m-le-gcc.s +0 -427
- data/ext/xkcp/lib/low/KeccakP-200/AVR8/KeccakP-200-SnP.h +0 -41
- data/ext/xkcp/lib/low/KeccakP-200/AVR8/KeccakP-200-avr8-fast.s +0 -647
- data/ext/xkcp/lib/low/KeccakP-200/compact/KeccakP-200-SnP.h +0 -39
- data/ext/xkcp/lib/low/KeccakP-200/compact/KeccakP-200-compact.c +0 -190
- data/ext/xkcp/lib/low/KeccakP-200/ref/KeccakP-200-SnP.h +0 -43
- data/ext/xkcp/lib/low/KeccakP-200/ref/KeccakP-200-reference.c +0 -412
- data/ext/xkcp/lib/low/KeccakP-200/ref/KeccakP-200-reference.h +0 -23
- data/ext/xkcp/lib/low/KeccakP-400/ARM/KeccakP-400-SnP.h +0 -41
- data/ext/xkcp/lib/low/KeccakP-400/ARM/KeccakP-400-armv6m-le-armcc.s +0 -454
- data/ext/xkcp/lib/low/KeccakP-400/ARM/KeccakP-400-armv6m-le-gcc.s +0 -458
- data/ext/xkcp/lib/low/KeccakP-400/ARM/KeccakP-400-armv7m-le-armcc.s +0 -455
- data/ext/xkcp/lib/low/KeccakP-400/ARM/KeccakP-400-armv7m-le-gcc.s +0 -458
- data/ext/xkcp/lib/low/KeccakP-400/AVR8/KeccakP-400-SnP.h +0 -41
- data/ext/xkcp/lib/low/KeccakP-400/AVR8/KeccakP-400-avr8-fast.s +0 -728
- data/ext/xkcp/lib/low/KeccakP-400/ref/KeccakP-400-SnP.h +0 -43
- data/ext/xkcp/lib/low/KeccakP-400/ref/KeccakP-400-reference.c +0 -414
- data/ext/xkcp/lib/low/KeccakP-400/ref/KeccakP-400-reference.h +0 -23
- data/ext/xkcp/lib/low/KeccakP-800/ARM/KeccakP-800-SnP.h +0 -42
- data/ext/xkcp/lib/low/KeccakP-800/ARM/KeccakP-800-u1-armv6m-le-armcc.s +0 -527
- data/ext/xkcp/lib/low/KeccakP-800/ARM/KeccakP-800-u1-armv6m-le-gcc.s +0 -533
- data/ext/xkcp/lib/low/KeccakP-800/ARM/KeccakP-800-u2-armv6m-le-armcc.s +0 -528
- data/ext/xkcp/lib/low/KeccakP-800/ARM/KeccakP-800-u2-armv6m-le-gcc.s +0 -534
- data/ext/xkcp/lib/low/KeccakP-800/ARM/KeccakP-800-u2-armv7a-le-armcc.s +0 -521
- data/ext/xkcp/lib/low/KeccakP-800/ARM/KeccakP-800-u2-armv7a-le-gcc.s +0 -527
- data/ext/xkcp/lib/low/KeccakP-800/ARM/KeccakP-800-u2-armv7m-le-armcc.s +0 -517
- data/ext/xkcp/lib/low/KeccakP-800/ARM/KeccakP-800-u2-armv7m-le-gcc.s +0 -523
- data/ext/xkcp/lib/low/KeccakP-800/ARM/KeccakP-800-uf-armv7m-le-armcc.s +0 -550
- data/ext/xkcp/lib/low/KeccakP-800/ARM/KeccakP-800-uf-armv7m-le-gcc.s +0 -556
- data/ext/xkcp/lib/low/KeccakP-800/ARMv8A/KeccakP-800-SnP.h +0 -32
- data/ext/xkcp/lib/low/KeccakP-800/ARMv8A/KeccakP-800-armv8a-neon.s +0 -432
- data/ext/xkcp/lib/low/KeccakP-800/AVR8/KeccakP-800-SnP.h +0 -42
- data/ext/xkcp/lib/low/KeccakP-800/AVR8/KeccakP-800-avr8-fast.s +0 -929
- data/ext/xkcp/lib/low/KeccakP-800/compact/KeccakP-800-SnP.h +0 -40
- data/ext/xkcp/lib/low/KeccakP-800/compact/KeccakP-800-compact.c +0 -244
- data/ext/xkcp/lib/low/KeccakP-800/plain/KeccakP-800-SnP.h +0 -46
- data/ext/xkcp/lib/low/KeccakP-800/plain/KeccakP-800-opt32-bis.macros +0 -184
- data/ext/xkcp/lib/low/KeccakP-800/plain/KeccakP-800-opt32.c +0 -454
- data/ext/xkcp/lib/low/KeccakP-800/plain/KeccakP-800-opt32.macros +0 -459
- data/ext/xkcp/lib/low/KeccakP-800/plain/KeccakP-800-unrolling-bis.macros +0 -83
- data/ext/xkcp/lib/low/KeccakP-800/plain/KeccakP-800-unrolling.macros +0 -88
- data/ext/xkcp/lib/low/KeccakP-800/plain/lcu2/KeccakP-800-opt32-config.h +0 -7
- data/ext/xkcp/lib/low/KeccakP-800/plain/lcua/KeccakP-800-opt32-config.h +0 -7
- data/ext/xkcp/lib/low/KeccakP-800/plain/u2/KeccakP-800-opt32-config.h +0 -7
- data/ext/xkcp/lib/low/KeccakP-800/plain/ua/KeccakP-800-opt32-config.h +0 -7
- data/ext/xkcp/lib/low/KeccakP-800/ref/KeccakP-800-SnP.h +0 -44
- data/ext/xkcp/lib/low/KeccakP-800/ref/KeccakP-800-reference.c +0 -437
- data/ext/xkcp/lib/low/KeccakP-800/ref/KeccakP-800-reference.h +0 -23
- data/ext/xkcp/lib/low/Ketje/OptimizedAsmARM/Ket.h +0 -57
- data/ext/xkcp/lib/low/Ketje/OptimizedAsmARM/KetjeJr-armv7m-le-armcc.s +0 -475
- data/ext/xkcp/lib/low/Ketje/OptimizedAsmARM/KetjeJr-armv7m-le-gcc.s +0 -480
- data/ext/xkcp/lib/low/Ketje/OptimizedAsmARM/KetjeSr-armv7m-le-armcc.s +0 -590
- data/ext/xkcp/lib/low/Ketje/OptimizedAsmARM/KetjeSr-armv7m-le-gcc.s +0 -590
- data/ext/xkcp/lib/low/Ketje/OptimizedLE/Ket.c +0 -126
- data/ext/xkcp/lib/low/Ketje/OptimizedLE/Ket.h +0 -68
- data/ext/xkcp/lib/low/Ketje/OptimizedLE/Ket.inc +0 -174
- data/ext/xkcp/lib/low/Ketje/SnP-compliant/Ket.c +0 -80
- data/ext/xkcp/lib/low/Ketje/SnP-compliant/Ket.h +0 -68
- data/ext/xkcp/lib/low/Ketje/SnP-compliant/Ket.inc +0 -142
- data/ext/xkcp/lib/low/Xoodoo/ARM/Xoodoo-SnP.h +0 -55
- data/ext/xkcp/lib/low/Xoodoo/ARM/Xoodoo-u1-armv6m-le-armcc.s +0 -1086
- data/ext/xkcp/lib/low/Xoodoo/ARM/Xoodoo-u1-armv6m-le-gcc.s +0 -1092
- data/ext/xkcp/lib/low/Xoodoo/ARM/Xoodoo-uf-armv6-le-armcc.s +0 -721
- data/ext/xkcp/lib/low/Xoodoo/ARM/Xoodoo-uf-armv6-le-gcc.s +0 -726
- data/ext/xkcp/lib/low/Xoodoo/ARM/Xoodoo-uf-armv7m-le-armcc.s +0 -723
- data/ext/xkcp/lib/low/Xoodoo/ARM/Xoodoo-uf-armv7m-le-gcc.s +0 -729
- data/ext/xkcp/lib/low/Xoodoo/ARM/Xoodyak-u1-armv6m-le-armcc.s +0 -1164
- data/ext/xkcp/lib/low/Xoodoo/ARM/Xoodyak-u1-armv6m-le-gcc.s +0 -1165
- data/ext/xkcp/lib/low/Xoodoo/ARM/Xoodyak-uf-armv6-le-armcc.s +0 -562
- data/ext/xkcp/lib/low/Xoodoo/ARM/Xoodyak-uf-armv6-le-gcc.s +0 -563
- data/ext/xkcp/lib/low/Xoodoo/ARM/Xoodyak-uf-armv7m-le-armcc.s +0 -563
- data/ext/xkcp/lib/low/Xoodoo/ARM/Xoodyak-uf-armv7m-le-gcc.s +0 -565
- data/ext/xkcp/lib/low/Xoodoo/ARMv7A-NEON/Xoodoo-SnP.h +0 -55
- data/ext/xkcp/lib/low/Xoodoo/ARMv7A-NEON/Xoodoo-uf-armv7a-neon-le-armcc.s +0 -476
- data/ext/xkcp/lib/low/Xoodoo/ARMv7A-NEON/Xoodoo-uf-armv7a-neon-le-gcc.s +0 -485
- data/ext/xkcp/lib/low/Xoodoo/ARMv7A-NEON/Xoodyak-uf-armv7a-neon-le-armcc.s +0 -362
- data/ext/xkcp/lib/low/Xoodoo/ARMv7A-NEON/Xoodyak-uf-armv7a-neon-le-gcc.s +0 -367
- data/ext/xkcp/lib/low/Xoodoo/AVR8/Xoodoo-SnP.h +0 -43
- data/ext/xkcp/lib/low/Xoodoo/AVR8/Xoodoo-avr8-u1.s +0 -1341
- data/ext/xkcp/lib/low/Xoodoo/AVX512/Xoodoo-SIMD512.c +0 -581
- data/ext/xkcp/lib/low/Xoodoo/AVX512/Xoodoo-SnP.h +0 -58
- data/ext/xkcp/lib/low/Xoodoo/AVX512/Xoodyak-full-block-SIMD512.c +0 -332
- data/ext/xkcp/lib/low/Xoodoo/SSE2/Xoodoo-SIMD128.c +0 -329
- data/ext/xkcp/lib/low/Xoodoo/SSE2/Xoodoo-SnP.h +0 -53
- data/ext/xkcp/lib/low/Xoodoo/SSE2/Xoodyak-full-block-SIMD128.c +0 -355
- data/ext/xkcp/lib/low/Xoodoo/Xoodoo.h +0 -79
- data/ext/xkcp/lib/low/Xoodoo/plain/Xoodoo-SnP.h +0 -56
- data/ext/xkcp/lib/low/Xoodoo/plain/Xoodoo-optimized.c +0 -399
- data/ext/xkcp/lib/low/Xoodoo/plain/Xoodyak-full-blocks.c +0 -127
- data/ext/xkcp/lib/low/Xoodoo/ref/Xoodoo-SnP.h +0 -43
- data/ext/xkcp/lib/low/Xoodoo/ref/Xoodoo-reference.c +0 -253
- data/ext/xkcp/lib/low/Xoodoo-times16/AVX512/Xoodoo-times16-SIMD512.c +0 -1044
- data/ext/xkcp/lib/low/Xoodoo-times16/AVX512/Xoodoo-times16-SnP.h +0 -49
- data/ext/xkcp/lib/low/Xoodoo-times16/fallback-on1/Xoodoo-times16-SnP.h +0 -45
- data/ext/xkcp/lib/low/Xoodoo-times16/fallback-on1/Xoodoo-times16-on1.c +0 -37
- data/ext/xkcp/lib/low/Xoodoo-times4/ARMv7A-NEON/Xoodoo-times4-ARMv7A.s +0 -1587
- data/ext/xkcp/lib/low/Xoodoo-times4/ARMv7A-NEON/Xoodoo-times4-SnP.h +0 -48
- data/ext/xkcp/lib/low/Xoodoo-times4/AVX512/Xoodoo-times4-SIMD512.c +0 -1202
- data/ext/xkcp/lib/low/Xoodoo-times4/AVX512/Xoodoo-times4-SnP.h +0 -48
- data/ext/xkcp/lib/low/Xoodoo-times4/SSSE3/Xoodoo-times4-SIMD128.c +0 -484
- data/ext/xkcp/lib/low/Xoodoo-times4/SSSE3/Xoodoo-times4-SnP.h +0 -44
- data/ext/xkcp/lib/low/Xoodoo-times4/fallback-on1/Xoodoo-times4-SnP.h +0 -45
- data/ext/xkcp/lib/low/Xoodoo-times4/fallback-on1/Xoodoo-times4-on1.c +0 -37
- data/ext/xkcp/lib/low/Xoodoo-times8/AVX2/Xoodoo-times8-SIMD256.c +0 -939
- data/ext/xkcp/lib/low/Xoodoo-times8/AVX2/Xoodoo-times8-SnP.h +0 -49
- data/ext/xkcp/lib/low/Xoodoo-times8/AVX512/Xoodoo-times8-SIMD512.c +0 -1216
- data/ext/xkcp/lib/low/Xoodoo-times8/AVX512/Xoodoo-times8-SnP.h +0 -48
- data/ext/xkcp/lib/low/Xoodoo-times8/fallback-on1/Xoodoo-times8-SnP.h +0 -45
- data/ext/xkcp/lib/low/Xoodoo-times8/fallback-on1/Xoodoo-times8-on1.c +0 -37
- data/ext/xkcp/lib/low/common/PlSnP-Fallback.inc +0 -290
- data/ext/xkcp/lib/low/common/SnP-Relaned.h +0 -141
- data/ext/xkcp/support/Kernel-PMU/Kernel-pmu.md +0 -133
- data/ext/xkcp/support/Kernel-PMU/Makefile +0 -8
- data/ext/xkcp/support/Kernel-PMU/enable_arm_pmu.c +0 -129
- data/ext/xkcp/support/Kernel-PMU/load-module +0 -1
- data/ext/xkcp/util/KeccakSum/KeccakSum.c +0 -394
- data/ext/xkcp/util/KeccakSum/base64.c +0 -86
- data/ext/xkcp/util/KeccakSum/base64.h +0 -12
|
@@ -0,0 +1,406 @@
|
|
|
1
|
+
/*
|
|
2
|
+
K12 based on the eXtended Keccak Code Package (XKCP)
|
|
3
|
+
https://github.com/XKCP/XKCP
|
|
4
|
+
|
|
5
|
+
The Keccak-p permutations, designed by Guido Bertoni, Joan Daemen, Michaël Peeters and Gilles Van Assche.
|
|
6
|
+
|
|
7
|
+
Implementation by Gilles Van Assche and 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
|
+
|
|
18
|
+
Please refer to the XKCP for more details.
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
#include <stdint.h>
|
|
22
|
+
#include <stdlib.h>
|
|
23
|
+
#include <string.h>
|
|
24
|
+
#include "brg_endian.h"
|
|
25
|
+
#include "KeccakP-1600-SnP.h"
|
|
26
|
+
|
|
27
|
+
#ifdef KeccakP1600_disableParallelism
|
|
28
|
+
#undef KeccakP1600_enable_simd_options
|
|
29
|
+
#else
|
|
30
|
+
|
|
31
|
+
// Forward declaration
|
|
32
|
+
void KangarooTwelve_SetProcessorCapabilities();
|
|
33
|
+
#ifdef KeccakP1600_enable_simd_options
|
|
34
|
+
int K12_SSSE3_requested_disabled = 0;
|
|
35
|
+
int K12_AVX2_requested_disabled = 0;
|
|
36
|
+
int K12_AVX512_requested_disabled = 0;
|
|
37
|
+
#endif // KeccakP1600_enable_simd_options
|
|
38
|
+
int K12_enableSSSE3 = 0;
|
|
39
|
+
int K12_enableAVX2 = 0;
|
|
40
|
+
int K12_enableAVX512 = 0;
|
|
41
|
+
|
|
42
|
+
/* ---------------------------------------------------------------- */
|
|
43
|
+
|
|
44
|
+
void KangarooTwelve_SSSE3_Process2Leaves(const unsigned char *input, unsigned char *output);
|
|
45
|
+
void KangarooTwelve_AVX512_Process2Leaves(const unsigned char *input, unsigned char *output);
|
|
46
|
+
|
|
47
|
+
int KeccakP1600times2_IsAvailable()
|
|
48
|
+
{
|
|
49
|
+
int result = 0;
|
|
50
|
+
result |= K12_enableAVX512;
|
|
51
|
+
result |= K12_enableSSSE3;
|
|
52
|
+
return result;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
const char * KeccakP1600times2_GetImplementation()
|
|
56
|
+
{
|
|
57
|
+
if (K12_enableAVX512) {
|
|
58
|
+
return "AVX-512 implementation";
|
|
59
|
+
} else if (K12_enableSSSE3) {
|
|
60
|
+
return "SSSE3 implementation";
|
|
61
|
+
} else {
|
|
62
|
+
return "";
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
void KangarooTwelve_Process2Leaves(const unsigned char *input, unsigned char *output)
|
|
67
|
+
{
|
|
68
|
+
if (K12_enableAVX512) {
|
|
69
|
+
KangarooTwelve_AVX512_Process2Leaves(input, output);
|
|
70
|
+
} else if (K12_enableSSSE3) {
|
|
71
|
+
KangarooTwelve_SSSE3_Process2Leaves(input, output);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
void KangarooTwelve_AVX2_Process4Leaves(const unsigned char *input, unsigned char *output);
|
|
77
|
+
void KangarooTwelve_AVX512_Process4Leaves(const unsigned char *input, unsigned char *output);
|
|
78
|
+
|
|
79
|
+
int KeccakP1600times4_IsAvailable()
|
|
80
|
+
{
|
|
81
|
+
int result = 0;
|
|
82
|
+
result |= K12_enableAVX512;
|
|
83
|
+
result |= K12_enableAVX2;
|
|
84
|
+
return result;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
const char * KeccakP1600times4_GetImplementation()
|
|
88
|
+
{
|
|
89
|
+
if (K12_enableAVX512) {
|
|
90
|
+
return "AVX-512 implementation";
|
|
91
|
+
} else if (K12_enableAVX2) {
|
|
92
|
+
return "AVX2 implementation";
|
|
93
|
+
} else {
|
|
94
|
+
return "";
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
void KangarooTwelve_Process4Leaves(const unsigned char *input, unsigned char *output)
|
|
99
|
+
{
|
|
100
|
+
if (K12_enableAVX512) {
|
|
101
|
+
KangarooTwelve_AVX512_Process4Leaves(input, output);
|
|
102
|
+
} else if (K12_enableAVX2) {
|
|
103
|
+
KangarooTwelve_AVX2_Process4Leaves(input, output);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
void KangarooTwelve_AVX512_Process8Leaves(const unsigned char *input, unsigned char *output);
|
|
109
|
+
|
|
110
|
+
int KeccakP1600times8_IsAvailable()
|
|
111
|
+
{
|
|
112
|
+
int result = 0;
|
|
113
|
+
result |= K12_enableAVX512;
|
|
114
|
+
return result;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
const char * KeccakP1600times8_GetImplementation()
|
|
118
|
+
{
|
|
119
|
+
if (K12_enableAVX512) {
|
|
120
|
+
return "AVX-512 implementation";
|
|
121
|
+
} else {
|
|
122
|
+
return "";
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
void KangarooTwelve_Process8Leaves(const unsigned char *input, unsigned char *output)
|
|
127
|
+
{
|
|
128
|
+
if (K12_enableAVX512)
|
|
129
|
+
KangarooTwelve_AVX512_Process8Leaves(input, output);
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
#endif // KeccakP1600_disableParallelism
|
|
133
|
+
|
|
134
|
+
const char * KeccakP1600_GetImplementation()
|
|
135
|
+
{
|
|
136
|
+
if (K12_enableAVX512)
|
|
137
|
+
return "AVX-512 implementation";
|
|
138
|
+
else
|
|
139
|
+
#ifndef KeccakP1600_noAssembly
|
|
140
|
+
if (K12_enableAVX2)
|
|
141
|
+
return "AVX2 implementation";
|
|
142
|
+
else
|
|
143
|
+
#endif
|
|
144
|
+
return "generic 64-bit implementation";
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
void KeccakP1600_Initialize(void *state)
|
|
148
|
+
{
|
|
149
|
+
KangarooTwelve_SetProcessorCapabilities();
|
|
150
|
+
if (K12_enableAVX512)
|
|
151
|
+
KeccakP1600_AVX512_Initialize(state);
|
|
152
|
+
else
|
|
153
|
+
#ifndef KeccakP1600_noAssembly
|
|
154
|
+
if (K12_enableAVX2)
|
|
155
|
+
KeccakP1600_AVX2_Initialize(state);
|
|
156
|
+
else
|
|
157
|
+
#endif
|
|
158
|
+
KeccakP1600_opt64_Initialize(state);
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
void KeccakP1600_AddByte(void *state, unsigned char data, unsigned int offset)
|
|
162
|
+
{
|
|
163
|
+
if (K12_enableAVX512)
|
|
164
|
+
((unsigned char*)(state))[offset] ^= data;
|
|
165
|
+
else
|
|
166
|
+
#ifndef KeccakP1600_noAssembly
|
|
167
|
+
if (K12_enableAVX2)
|
|
168
|
+
KeccakP1600_AVX2_AddByte(state, data, offset);
|
|
169
|
+
else
|
|
170
|
+
#endif
|
|
171
|
+
KeccakP1600_opt64_AddByte(state, data, offset);
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
void KeccakP1600_AddBytes(void *state, const unsigned char *data, unsigned int offset, unsigned int length)
|
|
175
|
+
{
|
|
176
|
+
if (K12_enableAVX512)
|
|
177
|
+
KeccakP1600_AVX512_AddBytes(state, data, offset, length);
|
|
178
|
+
else
|
|
179
|
+
#ifndef KeccakP1600_noAssembly
|
|
180
|
+
if (K12_enableAVX2)
|
|
181
|
+
KeccakP1600_AVX2_AddBytes(state, data, offset, length);
|
|
182
|
+
else
|
|
183
|
+
#endif
|
|
184
|
+
KeccakP1600_opt64_AddBytes(state, data, offset, length);
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
void KeccakP1600_Permute_12rounds(void *state)
|
|
188
|
+
{
|
|
189
|
+
if (K12_enableAVX512)
|
|
190
|
+
KeccakP1600_AVX512_Permute_12rounds(state);
|
|
191
|
+
else
|
|
192
|
+
#ifndef KeccakP1600_noAssembly
|
|
193
|
+
if (K12_enableAVX2)
|
|
194
|
+
KeccakP1600_AVX2_Permute_12rounds(state);
|
|
195
|
+
else
|
|
196
|
+
#endif
|
|
197
|
+
KeccakP1600_opt64_Permute_12rounds(state);
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
void KeccakP1600_ExtractBytes(const void *state, unsigned char *data, unsigned int offset, unsigned int length)
|
|
201
|
+
{
|
|
202
|
+
if (K12_enableAVX512)
|
|
203
|
+
KeccakP1600_AVX512_ExtractBytes(state, data, offset, length);
|
|
204
|
+
else
|
|
205
|
+
#ifndef KeccakP1600_noAssembly
|
|
206
|
+
if (K12_enableAVX2)
|
|
207
|
+
KeccakP1600_AVX2_ExtractBytes(state, data, offset, length);
|
|
208
|
+
else
|
|
209
|
+
#endif
|
|
210
|
+
KeccakP1600_opt64_ExtractBytes(state, data, offset, length);
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
size_t KeccakP1600_12rounds_FastLoop_Absorb(void *state, unsigned int laneCount, const unsigned char *data, size_t dataByteLen)
|
|
214
|
+
{
|
|
215
|
+
if (K12_enableAVX512)
|
|
216
|
+
return KeccakP1600_AVX512_12rounds_FastLoop_Absorb(state, laneCount, data, dataByteLen);
|
|
217
|
+
else
|
|
218
|
+
#ifndef KeccakP1600_noAssembly
|
|
219
|
+
if (K12_enableAVX2)
|
|
220
|
+
return KeccakP1600_AVX2_12rounds_FastLoop_Absorb(state, laneCount, data, dataByteLen);
|
|
221
|
+
else
|
|
222
|
+
#endif
|
|
223
|
+
return KeccakP1600_opt64_12rounds_FastLoop_Absorb(state, laneCount, data, dataByteLen);
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
/* ---------------------------------------------------------------- */
|
|
227
|
+
|
|
228
|
+
/* Processor capability detection code by Samuel Neves and Jack O'Connor, see
|
|
229
|
+
* https://github.com/BLAKE3-team/BLAKE3/blob/master/c/blake3_dispatch.c
|
|
230
|
+
*/
|
|
231
|
+
|
|
232
|
+
#if defined(__x86_64__) || defined(_M_X64)
|
|
233
|
+
#define IS_X86
|
|
234
|
+
#define IS_X86_64
|
|
235
|
+
#endif
|
|
236
|
+
|
|
237
|
+
#if defined(__i386__) || defined(_M_IX86)
|
|
238
|
+
#define IS_X86
|
|
239
|
+
#define IS_X86_32
|
|
240
|
+
#endif
|
|
241
|
+
|
|
242
|
+
#if defined(IS_X86)
|
|
243
|
+
static uint64_t xgetbv() {
|
|
244
|
+
#if defined(_MSC_VER)
|
|
245
|
+
return _xgetbv(0);
|
|
246
|
+
#else
|
|
247
|
+
uint32_t eax = 0, edx = 0;
|
|
248
|
+
__asm__ __volatile__("xgetbv\n" : "=a"(eax), "=d"(edx) : "c"(0));
|
|
249
|
+
return ((uint64_t)edx << 32) | eax;
|
|
250
|
+
#endif
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
static void cpuid(uint32_t out[4], uint32_t id) {
|
|
254
|
+
#if defined(_MSC_VER)
|
|
255
|
+
__cpuid((int *)out, id);
|
|
256
|
+
#elif defined(__i386__) || defined(_M_IX86)
|
|
257
|
+
__asm__ __volatile__("movl %%ebx, %1\n"
|
|
258
|
+
"cpuid\n"
|
|
259
|
+
"xchgl %1, %%ebx\n"
|
|
260
|
+
: "=a"(out[0]), "=r"(out[1]), "=c"(out[2]), "=d"(out[3])
|
|
261
|
+
: "a"(id));
|
|
262
|
+
#else
|
|
263
|
+
__asm__ __volatile__("cpuid\n"
|
|
264
|
+
: "=a"(out[0]), "=b"(out[1]), "=c"(out[2]), "=d"(out[3])
|
|
265
|
+
: "a"(id));
|
|
266
|
+
#endif
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
static void cpuidex(uint32_t out[4], uint32_t id, uint32_t sid) {
|
|
270
|
+
#if defined(_MSC_VER)
|
|
271
|
+
__cpuidex((int *)out, id, sid);
|
|
272
|
+
#elif defined(__i386__) || defined(_M_IX86)
|
|
273
|
+
__asm__ __volatile__("movl %%ebx, %1\n"
|
|
274
|
+
"cpuid\n"
|
|
275
|
+
"xchgl %1, %%ebx\n"
|
|
276
|
+
: "=a"(out[0]), "=r"(out[1]), "=c"(out[2]), "=d"(out[3])
|
|
277
|
+
: "a"(id), "c"(sid));
|
|
278
|
+
#else
|
|
279
|
+
__asm__ __volatile__("cpuid\n"
|
|
280
|
+
: "=a"(out[0]), "=b"(out[1]), "=c"(out[2]), "=d"(out[3])
|
|
281
|
+
: "a"(id), "c"(sid));
|
|
282
|
+
#endif
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
#endif
|
|
286
|
+
|
|
287
|
+
enum cpu_feature {
|
|
288
|
+
SSE2 = 1 << 0,
|
|
289
|
+
SSSE3 = 1 << 1,
|
|
290
|
+
SSE41 = 1 << 2,
|
|
291
|
+
AVX = 1 << 3,
|
|
292
|
+
AVX2 = 1 << 4,
|
|
293
|
+
AVX512F = 1 << 5,
|
|
294
|
+
AVX512VL = 1 << 6,
|
|
295
|
+
/* ... */
|
|
296
|
+
UNDEFINED = 1 << 30
|
|
297
|
+
};
|
|
298
|
+
|
|
299
|
+
static enum cpu_feature g_cpu_features = UNDEFINED;
|
|
300
|
+
|
|
301
|
+
static enum cpu_feature
|
|
302
|
+
get_cpu_features(void) {
|
|
303
|
+
|
|
304
|
+
if (g_cpu_features != UNDEFINED) {
|
|
305
|
+
return g_cpu_features;
|
|
306
|
+
} else {
|
|
307
|
+
#if defined(IS_X86)
|
|
308
|
+
uint32_t regs[4] = {0};
|
|
309
|
+
uint32_t *eax = ®s[0], *ebx = ®s[1], *ecx = ®s[2], *edx = ®s[3];
|
|
310
|
+
(void)edx;
|
|
311
|
+
enum cpu_feature features = 0;
|
|
312
|
+
cpuid(regs, 0);
|
|
313
|
+
const int max_id = *eax;
|
|
314
|
+
cpuid(regs, 1);
|
|
315
|
+
#if defined(__amd64__) || defined(_M_X64)
|
|
316
|
+
features |= SSE2;
|
|
317
|
+
#else
|
|
318
|
+
if (*edx & (1UL << 26))
|
|
319
|
+
features |= SSE2;
|
|
320
|
+
#endif
|
|
321
|
+
if (*ecx & (1UL << 0))
|
|
322
|
+
features |= SSSE3;
|
|
323
|
+
if (*ecx & (1UL << 19))
|
|
324
|
+
features |= SSE41;
|
|
325
|
+
|
|
326
|
+
if (*ecx & (1UL << 27)) { // OSXSAVE
|
|
327
|
+
const uint64_t mask = xgetbv();
|
|
328
|
+
if ((mask & 6) == 6) { // SSE and AVX states
|
|
329
|
+
if (*ecx & (1UL << 28))
|
|
330
|
+
features |= AVX;
|
|
331
|
+
if (max_id >= 7) {
|
|
332
|
+
cpuidex(regs, 7, 0);
|
|
333
|
+
if (*ebx & (1UL << 5))
|
|
334
|
+
features |= AVX2;
|
|
335
|
+
if ((mask & 224) == 224) { // Opmask, ZMM_Hi256, Hi16_Zmm
|
|
336
|
+
if (*ebx & (1UL << 31))
|
|
337
|
+
features |= AVX512VL;
|
|
338
|
+
if (*ebx & (1UL << 16))
|
|
339
|
+
features |= AVX512F;
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
g_cpu_features = features;
|
|
345
|
+
return features;
|
|
346
|
+
#else
|
|
347
|
+
/* How to detect NEON? */
|
|
348
|
+
return 0;
|
|
349
|
+
#endif
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
void KangarooTwelve_SetProcessorCapabilities()
|
|
354
|
+
{
|
|
355
|
+
enum cpu_feature features = get_cpu_features();
|
|
356
|
+
K12_enableSSSE3 = (features & SSSE3);
|
|
357
|
+
K12_enableAVX2 = (features & AVX2);
|
|
358
|
+
K12_enableAVX512 = (features & AVX512F) && (features & AVX512VL);
|
|
359
|
+
#ifdef KeccakP1600_enable_simd_options
|
|
360
|
+
K12_enableSSSE3 = K12_enableSSSE3 && !K12_SSSE3_requested_disabled;
|
|
361
|
+
K12_enableAVX2 = K12_enableAVX2 && !K12_AVX2_requested_disabled;
|
|
362
|
+
K12_enableAVX512 = K12_enableAVX512 && !K12_AVX512_requested_disabled;
|
|
363
|
+
#endif // KeccakP1600_enable_simd_options
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
#ifdef KeccakP1600_enable_simd_options
|
|
367
|
+
int KangarooTwelve_DisableSSSE3(void) {
|
|
368
|
+
KangarooTwelve_SetProcessorCapabilities();
|
|
369
|
+
K12_SSSE3_requested_disabled = 1;
|
|
370
|
+
if (K12_enableSSSE3) {
|
|
371
|
+
KangarooTwelve_SetProcessorCapabilities();
|
|
372
|
+
return 1; // SSSE3 was disabled on this call.
|
|
373
|
+
} else {
|
|
374
|
+
return 0; // Nothing changed.
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
int KangarooTwelve_DisableAVX2(void) {
|
|
379
|
+
KangarooTwelve_SetProcessorCapabilities();
|
|
380
|
+
K12_AVX2_requested_disabled = 1;
|
|
381
|
+
if (K12_enableAVX2) {
|
|
382
|
+
KangarooTwelve_SetProcessorCapabilities();
|
|
383
|
+
return 1; // AVX2 was disabled on this call.
|
|
384
|
+
} else {
|
|
385
|
+
return 0; // Nothing changed.
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
int KangarooTwelve_DisableAVX512(void) {
|
|
390
|
+
KangarooTwelve_SetProcessorCapabilities();
|
|
391
|
+
K12_AVX512_requested_disabled = 1;
|
|
392
|
+
if (K12_enableAVX512) {
|
|
393
|
+
KangarooTwelve_SetProcessorCapabilities();
|
|
394
|
+
return 1; // AVX512 was disabled on this call.
|
|
395
|
+
} else {
|
|
396
|
+
return 0; // Nothing changed.
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
void KangarooTwelve_EnableAllCpuFeatures(void) {
|
|
401
|
+
K12_SSSE3_requested_disabled = 0;
|
|
402
|
+
K12_AVX2_requested_disabled = 0;
|
|
403
|
+
K12_AVX512_requested_disabled = 0;
|
|
404
|
+
KangarooTwelve_SetProcessorCapabilities();
|
|
405
|
+
}
|
|
406
|
+
#endif // KeccakP1600_enable_simd_options
|