- Sync SHA3 parameters and regtests with new FIPS202 draft.
- Move regular hash api to 'usual/crypto/sha3' module.
- Drop regular hash api from keccak module, use exteded
sponge API used in spongeshaker Python module.
usual/crypto/sha1.h usual/crypto/sha1.c \
usual/crypto/sha256.h usual/crypto/sha256.c \
usual/crypto/sha512.h usual/crypto/sha512.c \
+ usual/crypto/sha3.h usual/crypto/sha3.c \
usual/ctype.h \
usual/cxalloc.h usual/cxalloc.c \
usual/cxextra.h usual/cxextra.c \
#define str_check(a, b) tt_str_op(a, ==, b)
+#define tt_stri_op(a,op,b) \
+ tt_assert_test_type(a,b,#a" "#op" "#b,const char *, \
+ (strcasecmp(_val1,_val2) op 0),"<%s>")
+
+#define stri_check(a, b) tt_stri_op(a, ==, b)
+
#include <usual/crypto/hmac.h>
#include <usual/crypto/md5.h>
#include <usual/crypto/sha1.h>
#include <usual/crypto/sha256.h>
#include <usual/crypto/sha512.h>
-#include <usual/crypto/keccak.h>
+#include <usual/crypto/sha3.h>
#include <usual/crypto/digest.h>
#include <usual/cxalloc.h>
}
/*
- * Keccak-224
+ * SHA3-224
*/
-static const char *run_keccak224(const char *hex)
+static const char *run_sha3_224(const char *hex)
{
- return run_hash(NULL, hex, digest_KECCAK224());
+ return run_hash(NULL, hex, digest_SHA3_224());
}
-static void test_keccak224(void *ptr)
+static void test_sha3_224(void *ptr)
{
- str_check(run_keccak224(""), "f71837502ba8e10837bdd8d365adb85591895602fc552b48b7390abd");
- str_check(run_keccak224("CC"), "a9cab59eb40a10b246290f2d6086e32e3689faf1d26b470c899f2802");
- str_check(run_keccak224("41FB"), "615ba367afdc35aac397bc7eb5d58d106a734b24986d5d978fefd62c");
- str_check(run_keccak224("1F877C"), "6f9d2898efd096baaaaab2e97482ddb6389b8e6caa964b7a0e347e13");
- str_check(run_keccak224("C1ECFDFC"), "e405869da1464a705700a3cbce131aabeeba9c8d2fe6576b21bcbe16");
- str_check(run_keccak224("21F134AC57"), "5573da2b02216a860389a581f6e9fb8d805e9e02f6fa911701eee298");
- str_check(run_keccak224("C6F50BB74E29"), "163c9060163aa66b8b7c0cfaa65d934bff219bcbc267187caba0042f");
- str_check(run_keccak224("119713CC83EEEF"), "cfc04c6f8463ddab24cdf8b8652bd11df23dd1b95f118328dd01580e");
- str_check(run_keccak224("4A4F202484512526"), "7a5c2cb3f999dd00eff7399963314ca647dd0e5ae1bddec611f8338d");
- str_check(run_keccak224("B32D95B0B9AAD2A8816DE6D06D1F86008505BD8C14124F6E9A163B5A2ADE55F835D0EC3880EF50700D3B25E42CC0AF050CCD1BE5E555B23087E04D7BF9813622780C7313A1954F8740B6EE2D3F71F768DD417F520482BD3A08D4F222B4EE9DBD015447B33507DD50F3AB4247C5DE9A8ABD62A8DECEA01E3B87C8B927F5B08BEB37674C6F8E380C04"),
- "42275c296937745758ff2b7bee9a897191ae87e42bd10198d9466c19");
- str_check(run_keccak224("04410E31082A47584B406F051398A6ABE74E4DA59BB6F85E6B49E8A1F7F2CA00DFBA5462C2CD2BFDE8B64FB21D70C083F11318B56A52D03B81CAC5EEC29EB31BD0078B6156786DA3D6D8C33098C5C47BB67AC64DB14165AF65B44544D806DDE5F487D5373C7F9792C299E9686B7E5821E7C8E2458315B996B5677D926DAC57B3F22DA873C601016A0D"),
- "143f9055eb1f736729c77721fb65ed5ee142f6e969132fb22989c11f");
- str_check(run_keccak224("3A3A819C48EFDE2AD914FBF00E18AB6BC4F14513AB27D0C178A188B61431E7F5623CB66B23346775D386B50E982C493ADBBFC54B9A3CD383382336A1A0B2150A15358F336D03AE18F666C7573D55C4FD181C29E6CCFDE63EA35F0ADF5885CFC0A3D84A2B2E4DD24496DB789E663170CEF74798AA1BBCD4574EA0BBA40489D764B2F83AADC66B148B4A0CD95246C127D5871C4F11418690A5DDF01246A0C80A43C70088B6183639DCFDA4125BD113A8F49EE23ED306FAAC576C3FB0C1E256671D817FC2534A52F5B439F72E424DE376F4C565CCA82307DD9EF76DA5B7C4EB7E085172E328807C02D011FFBF33785378D79DC266F6A5BE6BB0E4A92ECEEBAEB1"),
- "5af56987ea9cf11fcd0eac5ebc14b037365e9b1123e31cb2dfc7929a");
+ /* KeccakCodePackage: ShortMsgKAT_SHA3-224.txt */
+ stri_check(run_sha3_224(""), "6B4E03423667DBB73B6E15454F0EB1ABD4597F9A1B078E3F5B5A6BC7");
+ stri_check(run_sha3_224("CC"), "DF70ADC49B2E76EEE3A6931B93FA41841C3AF2CDF5B32A18B5478C39");
+ stri_check(run_sha3_224("41FB"), "BFF295861DAEDF33E70519B1E2BCB4C2E9FE3364D789BC3B17301C15");
+ stri_check(run_sha3_224("1F877C"), "14889DF49C076A9AF2F4BCB16339BCC45A24EBF9CE4DCDCE7EC17217");
+ stri_check(run_sha3_224("C1ECFDFC"), "A33C58DF8A8026F0F9591966BD6D00EED3B1E829580AB9BE268CAF39");
+ stri_check(run_sha3_224("21F134AC57"), "10E580A32199596169331AD43CFCF10264F81565037040028A06B458");
+ stri_check(run_sha3_224("C6F50BB74E29"), "FE52C30C95C1E5193207E97D355FDE09453482708C0876AA961508F0");
+ stri_check(run_sha3_224("119713CC83EEEF"), "8B449849CB7C4776C593DE58FD5C2E322CB5316BE08A75057A01ED6A");
+ stri_check(run_sha3_224("4A4F202484512526"), "01386CDD70589B3B34941EFE16B85071E9BA948179922044F640868E");
+ /* 1088 */
+ stri_check(run_sha3_224("B32D95B0B9AAD2A8816DE6D06D1F86008505BD8C14124F6E9A163B5A2ADE55F835D0EC3880EF50700D3B25E42CC0AF050CCD1BE5E555B23087E04D7BF9813622780C7313A1954F8740B6EE2D3F71F768DD417F520482BD3A08D4F222B4EE9DBD015447B33507DD50F3AB4247C5DE9A8ABD62A8DECEA01E3B87C8B927F5B08BEB37674C6F8E380C04"),
+ "64D78817714FE05272D3805E6E19056B1649036CDCD5094FD1CC890A");
+ /* 1096 */
+ stri_check(run_sha3_224("04410E31082A47584B406F051398A6ABE74E4DA59BB6F85E6B49E8A1F7F2CA00DFBA5462C2CD2BFDE8B64FB21D70C083F11318B56A52D03B81CAC5EEC29EB31BD0078B6156786DA3D6D8C33098C5C47BB67AC64DB14165AF65B44544D806DDE5F487D5373C7F9792C299E9686B7E5821E7C8E2458315B996B5677D926DAC57B3F22DA873C601016A0D"),
+ "2C4E7C537D0E2AF2261A669BC24BD0DF16D2C72A7F98D7A5EF6A8150");
+ /* 2040 */
+ stri_check(run_sha3_224("3A3A819C48EFDE2AD914FBF00E18AB6BC4F14513AB27D0C178A188B61431E7F5623CB66B23346775D386B50E982C493ADBBFC54B9A3CD383382336A1A0B2150A15358F336D03AE18F666C7573D55C4FD181C29E6CCFDE63EA35F0ADF5885CFC0A3D84A2B2E4DD24496DB789E663170CEF74798AA1BBCD4574EA0BBA40489D764B2F83AADC66B148B4A0CD95246C127D5871C4F11418690A5DDF01246A0C80A43C70088B6183639DCFDA4125BD113A8F49EE23ED306FAAC576C3FB0C1E256671D817FC2534A52F5B439F72E424DE376F4C565CCA82307DD9EF76DA5B7C4EB7E085172E328807C02D011FFBF33785378D79DC266F6A5BE6BB0E4A92ECEEBAEB1"),
+ "94689EA9F347DDA8DD798A858605868743C6BD03A6A65C6085D52BED");
end:;
}
/*
- * Keccak-256
+ * SHA3-256
*/
-static const char *run_keccak256(const char *hex)
+static const char *run_sha3_256(const char *hex)
{
- return run_hash(NULL, hex, digest_KECCAK256());
+ return run_hash(NULL, hex, digest_SHA3_256());
}
-static void test_keccak256(void *ptr)
+static void test_sha3_256(void *ptr)
{
- str_check(run_keccak256(""), "c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470");
- str_check(run_keccak256("CC"), "eead6dbfc7340a56caedc044696a168870549a6a7f6f56961e84a54bd9970b8a");
- str_check(run_keccak256("41FB"), "a8eaceda4d47b3281a795ad9e1ea2122b407baf9aabcb9e18b5717b7873537d2");
- str_check(run_keccak256("1F877C"), "627d7bc1491b2ab127282827b8de2d276b13d7d70fb4c5957fdf20655bc7ac30");
- str_check(run_keccak256("C1ECFDFC"), "b149e766d7612eaf7d55f74e1a4fdd63709a8115b14f61fcd22aa4abc8b8e122");
- str_check(run_keccak256("21F134AC57"), "67f05544dbe97d5d6417c1b1ea9bc0e3a99a541381d1cd9b08a9765687eb5bb4");
- str_check(run_keccak256("C6F50BB74E29"), "923062c4e6f057597220d182dbb10e81cd25f60b54005b2a75dd33d6dac518d0");
- str_check(run_keccak256("119713CC83EEEF"), "feb8405dcd315d48c6cbf7a3504996de8e25cc22566efec67433712eda99894f");
- str_check(run_keccak256("4A4F202484512526"), "e620d8f2982b24fedaaa3baa9b46c3f9ce204ee356666553ecb35e15c3ff9bf9");
- str_check(run_keccak256("B32D95B0B9AAD2A8816DE6D06D1F86008505BD8C14124F6E9A163B5A2ADE55F835D0EC3880EF50700D3B25E42CC0AF050CCD1BE5E555B23087E04D7BF9813622780C7313A1954F8740B6EE2D3F71F768DD417F520482BD3A08D4F222B4EE9DBD015447B33507DD50F3AB4247C5DE9A8ABD62A8DECEA01E3B87C8B927F5B08BEB37674C6F8E380C04"),
- "e717a7769448abbe5fef8187954a88ac56ded1d22e63940ab80d029585a21921");
- str_check(run_keccak256("04410E31082A47584B406F051398A6ABE74E4DA59BB6F85E6B49E8A1F7F2CA00DFBA5462C2CD2BFDE8B64FB21D70C083F11318B56A52D03B81CAC5EEC29EB31BD0078B6156786DA3D6D8C33098C5C47BB67AC64DB14165AF65B44544D806DDE5F487D5373C7F9792C299E9686B7E5821E7C8E2458315B996B5677D926DAC57B3F22DA873C601016A0D"),
- "a95d50b50b4545f0947441df74a1e9d74622eb3baa49c1bbfc3a0cce6619c1aa");
- str_check(run_keccak256("3A3A819C48EFDE2AD914FBF00E18AB6BC4F14513AB27D0C178A188B61431E7F5623CB66B23346775D386B50E982C493ADBBFC54B9A3CD383382336A1A0B2150A15358F336D03AE18F666C7573D55C4FD181C29E6CCFDE63EA35F0ADF5885CFC0A3D84A2B2E4DD24496DB789E663170CEF74798AA1BBCD4574EA0BBA40489D764B2F83AADC66B148B4A0CD95246C127D5871C4F11418690A5DDF01246A0C80A43C70088B6183639DCFDA4125BD113A8F49EE23ED306FAAC576C3FB0C1E256671D817FC2534A52F5B439F72E424DE376F4C565CCA82307DD9EF76DA5B7C4EB7E085172E328807C02D011FFBF33785378D79DC266F6A5BE6BB0E4A92ECEEBAEB1"),
- "348fb774adc970a16b1105669442625e6adaa8257a89effdb5a802f161b862ea");
+ /* KeccakCodePackage: ShortMsgKAT_SHA3-256.txt */
+ stri_check(run_sha3_256(""), "A7FFC6F8BF1ED76651C14756A061D662F580FF4DE43B49FA82D80A4B80F8434A");
+ stri_check(run_sha3_256("CC"), "677035391CD3701293D385F037BA32796252BB7CE180B00B582DD9B20AAAD7F0");
+ stri_check(run_sha3_256("41FB"), "39F31B6E653DFCD9CAED2602FD87F61B6254F581312FB6EEEC4D7148FA2E72AA");
+ stri_check(run_sha3_256("1F877C"), "BC22345E4BD3F792A341CF18AC0789F1C9C966712A501B19D1B6632CCD408EC5");
+ stri_check(run_sha3_256("C1ECFDFC"), "C5859BE82560CC8789133F7C834A6EE628E351E504E601E8059A0667FF62C124");
+ stri_check(run_sha3_256("21F134AC57"), "55BD9224AF4EED0D121149E37FF4D7DD5BE24BD9FBE56E0171E87DB7A6F4E06D");
+ stri_check(run_sha3_256("C6F50BB74E29"), "AE0CBC757D4AB088E172ABFD8746289950F92D38A25295658DBF744B5635AF04");
+ stri_check(run_sha3_256("119713CC83EEEF"), "E340C9A44373EFCC212F3CB66A047AC34C87FF1C58C4A14B16A2BFC34698BB1D");
+ stri_check(run_sha3_256("4A4F202484512526"), "BA4FB009D57A5CEB85FC64D54E5C55A55854B41CC47AD15294BC41F32165DFBA");
+ /* 1088 */
+ stri_check(run_sha3_256("B32D95B0B9AAD2A8816DE6D06D1F86008505BD8C14124F6E9A163B5A2ADE55F835D0EC3880EF50700D3B25E42CC0AF050CCD1BE5E555B23087E04D7BF9813622780C7313A1954F8740B6EE2D3F71F768DD417F520482BD3A08D4F222B4EE9DBD015447B33507DD50F3AB4247C5DE9A8ABD62A8DECEA01E3B87C8B927F5B08BEB37674C6F8E380C04"),
+ "DF673F4105379FF6B755EEAB20CEB0DC77B5286364FE16C59CC8A907AFF07732");
+ /* 1096 */
+ stri_check(run_sha3_256("04410E31082A47584B406F051398A6ABE74E4DA59BB6F85E6B49E8A1F7F2CA00DFBA5462C2CD2BFDE8B64FB21D70C083F11318B56A52D03B81CAC5EEC29EB31BD0078B6156786DA3D6D8C33098C5C47BB67AC64DB14165AF65B44544D806DDE5F487D5373C7F9792C299E9686B7E5821E7C8E2458315B996B5677D926DAC57B3F22DA873C601016A0D"),
+ "D52432CF3B6B4B949AA848E058DCD62D735E0177279222E7AC0AF8504762FAA0");
+ /* 2040 */
+ stri_check(run_sha3_256("3A3A819C48EFDE2AD914FBF00E18AB6BC4F14513AB27D0C178A188B61431E7F5623CB66B23346775D386B50E982C493ADBBFC54B9A3CD383382336A1A0B2150A15358F336D03AE18F666C7573D55C4FD181C29E6CCFDE63EA35F0ADF5885CFC0A3D84A2B2E4DD24496DB789E663170CEF74798AA1BBCD4574EA0BBA40489D764B2F83AADC66B148B4A0CD95246C127D5871C4F11418690A5DDF01246A0C80A43C70088B6183639DCFDA4125BD113A8F49EE23ED306FAAC576C3FB0C1E256671D817FC2534A52F5B439F72E424DE376F4C565CCA82307DD9EF76DA5B7C4EB7E085172E328807C02D011FFBF33785378D79DC266F6A5BE6BB0E4A92ECEEBAEB1"),
+ "C11F3522A8FB7B3532D80B6D40023A92B489ADDAD93BF5D64B23F35E9663521C");
end:;
}
/*
- * Keccak-384
+ * SHA3-384
*/
-static const char *run_keccak384(const char *hex)
+static const char *run_sha3_384(const char *hex)
{
- return run_hash(NULL, hex, digest_KECCAK384());
+ return run_hash(NULL, hex, digest_SHA3_384());
}
-static void test_keccak384(void *ptr)
+static void test_sha3_384(void *ptr)
{
- str_check(run_keccak384(""), "2c23146a63a29acf99e73b88f8c24eaa7dc60aa771780ccc006afbfa8fe2479b2dd2b21362337441ac12b515911957ff");
- str_check(run_keccak384("CC"), "1b84e62a46e5a201861754af5dc95c4a1a69caf4a796ae405680161e29572641f5fa1e8641d7958336ee7b11c58f73e9");
- str_check(run_keccak384("41FB"), "495cce2714cd72c8c53c3363d22c58b55960fe26be0bf3bbc7a3316dd563ad1db8410e75eefea655e39d4670ec0b1792");
- str_check(run_keccak384("1F877C"), "b0665c345f45e6de145b0190335ef5d5aa59e0b49fc1425d5eae7355ea442284cb8a2152d565ebdf2810eccab15af04f");
- str_check(run_keccak384("C1ECFDFC"), "f1850b2abb24f3fd683c701582789d9e92b6a45f9c345f9dae7f7997c8c910e88003e592e59281cf92c92d6b51a1afd1");
- str_check(run_keccak384("21F134AC57"), "68d437327f158287c304bbaf36f782f497da2c480a1fbb268682362218641f9070a014919ad7331c49beefccb437fe9a");
- str_check(run_keccak384("C6F50BB74E29"), "03566ec003ff55184f0c85beebc6d1ecf5e5d082d8d40137246f8fd42bce097c09418845ef60286fdd894a00fd2d6589");
- str_check(run_keccak384("119713CC83EEEF"), "790d700fa34d6a835be311b639474780148a2f087ac2fa86e8a1a433ec7a04fcbfc5284a3e188b7d91c6d094eafbeecb");
- str_check(run_keccak384("4A4F202484512526"), "638e65758a297cb09ded1ac5b9e8f779802000ab791f67f33c60be36443793adcc8a4a58e98688157a41784f02a4bcb2");
- str_check(run_keccak384("B32D95B0B9AAD2A8816DE6D06D1F86008505BD8C14124F6E9A163B5A2ADE55F835D0EC3880EF50700D3B25E42CC0AF050CCD1BE5E555B23087E04D7BF9813622780C7313A1954F8740B6EE2D3F71F768DD417F520482BD3A08D4F222B4EE9DBD015447B33507DD50F3AB4247C5DE9A8ABD62A8DECEA01E3B87C8B927F5B08BEB37674C6F8E380C04"),
- "278e83cff1ff6cc4b3ac41f3879da87ae63b535b43815e273687a4cc519855b452cb6af0198bb9fd0f3e43739bc0cdd7");
- str_check(run_keccak384("04410E31082A47584B406F051398A6ABE74E4DA59BB6F85E6B49E8A1F7F2CA00DFBA5462C2CD2BFDE8B64FB21D70C083F11318B56A52D03B81CAC5EEC29EB31BD0078B6156786DA3D6D8C33098C5C47BB67AC64DB14165AF65B44544D806DDE5F487D5373C7F9792C299E9686B7E5821E7C8E2458315B996B5677D926DAC57B3F22DA873C601016A0D"),
- "aa4b5a5fb94fe19578f33323ba1eefc5b6ed70b34bc70193f386c99f73863611af20581b4b1b3ed776df9e235d3d4e45");
- str_check(run_keccak384("3A3A819C48EFDE2AD914FBF00E18AB6BC4F14513AB27D0C178A188B61431E7F5623CB66B23346775D386B50E982C493ADBBFC54B9A3CD383382336A1A0B2150A15358F336D03AE18F666C7573D55C4FD181C29E6CCFDE63EA35F0ADF5885CFC0A3D84A2B2E4DD24496DB789E663170CEF74798AA1BBCD4574EA0BBA40489D764B2F83AADC66B148B4A0CD95246C127D5871C4F11418690A5DDF01246A0C80A43C70088B6183639DCFDA4125BD113A8F49EE23ED306FAAC576C3FB0C1E256671D817FC2534A52F5B439F72E424DE376F4C565CCA82307DD9EF76DA5B7C4EB7E085172E328807C02D011FFBF33785378D79DC266F6A5BE6BB0E4A92ECEEBAEB1"),
- "6bff1c8405a3fe594e360e3bccea1ebcd509310dc79b9e45c263783d7a5dd662c6789b18bd567dbdda1554f5bee6a860");
+ /* KeccakCodePackage: ShortMsgKAT_SHA3-384.txt */
+ stri_check(run_sha3_384(""), "0C63A75B845E4F7D01107D852E4C2485C51A50AAAA94FC61995E71BBEE983A2AC3713831264ADB47FB6BD1E058D5F004");
+ stri_check(run_sha3_384("CC"), "5EE7F374973CD4BB3DC41E3081346798497FF6E36CB9352281DFE07D07FC530CA9AD8EF7AAD56EF5D41BE83D5E543807");
+ stri_check(run_sha3_384("41FB"), "1DD81609DCC290EFFD7AC0A95D4A20821580E56BD50DBD843920650BE7A80A1719577DA337CFDF86E51C764CAA2E10BD");
+ stri_check(run_sha3_384("1F877C"), "14F6F486FB98ED46A4A198040DA8079E79E448DAACEBE905FB4CF0DF86EF2A7151F62FE095BF8516EB0677FE607734E2");
+ stri_check(run_sha3_384("C1ECFDFC"), "D92BBD604BDD24B9889508F8558B13E96595AC90BC8A441DAF9B51D6ABC14FFD0835FB9366E3912504264CE87E421CB8");
+ stri_check(run_sha3_384("21F134AC57"), "E248D6FF342D35A30EC230BA51CDB161025D6F1C251ACA6AE3531F0682C164A1FC0725B1BEFF808A200C131557A22809");
+ stri_check(run_sha3_384("C6F50BB74E29"), "D6DD2ED08C1F644857A15DAFAF80538BEE597278C9ABE047BFBABFB8B1FCB7543E80AE9F7143D00F4DAAF39B138AB3FF");
+ stri_check(run_sha3_384("119713CC83EEEF"), "49CA1EB8D71D1FDC7A72DAA320C8F9CA543671C2CB8FE9B2638A8416DF50A790A50D0BB6B88741D7816D6061F46AEA89");
+ stri_check(run_sha3_384("4A4F202484512526"), "89DBF4C39B8FB46FDF0A6926CEC0355A4BDBF9C6A446E140B7C8BD08FF6F489F205DAF8EFFE160F437F67491EF897C23");
+ /* 1088 */
+ stri_check(run_sha3_384("B32D95B0B9AAD2A8816DE6D06D1F86008505BD8C14124F6E9A163B5A2ADE55F835D0EC3880EF50700D3B25E42CC0AF050CCD1BE5E555B23087E04D7BF9813622780C7313A1954F8740B6EE2D3F71F768DD417F520482BD3A08D4F222B4EE9DBD015447B33507DD50F3AB4247C5DE9A8ABD62A8DECEA01E3B87C8B927F5B08BEB37674C6F8E380C04"),
+ "CAD2D28FBDCC3A5D71FB3ADCEEC52313AD41D4FF1F915CAA34EE127839DBF2E9A7B06E1C4ECD6255926C16C06E51EFD0");
+ /* 1096 */
+ stri_check(run_sha3_384("04410E31082A47584B406F051398A6ABE74E4DA59BB6F85E6B49E8A1F7F2CA00DFBA5462C2CD2BFDE8B64FB21D70C083F11318B56A52D03B81CAC5EEC29EB31BD0078B6156786DA3D6D8C33098C5C47BB67AC64DB14165AF65B44544D806DDE5F487D5373C7F9792C299E9686B7E5821E7C8E2458315B996B5677D926DAC57B3F22DA873C601016A0D"),
+ "5B192EBAB47215A8E9FB8E4D561B220B1DC36707A3F085F7BB0175335C393251E3467F945570420C743365D0F09B9E09");
+ /* 2040 */
+ stri_check(run_sha3_384("3A3A819C48EFDE2AD914FBF00E18AB6BC4F14513AB27D0C178A188B61431E7F5623CB66B23346775D386B50E982C493ADBBFC54B9A3CD383382336A1A0B2150A15358F336D03AE18F666C7573D55C4FD181C29E6CCFDE63EA35F0ADF5885CFC0A3D84A2B2E4DD24496DB789E663170CEF74798AA1BBCD4574EA0BBA40489D764B2F83AADC66B148B4A0CD95246C127D5871C4F11418690A5DDF01246A0C80A43C70088B6183639DCFDA4125BD113A8F49EE23ED306FAAC576C3FB0C1E256671D817FC2534A52F5B439F72E424DE376F4C565CCA82307DD9EF76DA5B7C4EB7E085172E328807C02D011FFBF33785378D79DC266F6A5BE6BB0E4A92ECEEBAEB1"),
+ "128DC611762BE9B135B3739484CFAADCA7481D68514F3DFD6F5D78BB1863AE68130835CDC7061A7ED964B32F1DB75EE1");
end:;
}
/*
- * Keccak-512
+ * SHA3-512
*/
-static const char *run_keccak512(const char *hex)
+static const char *run_sha3_512(const char *hex)
{
- return run_hash(NULL, hex, digest_KECCAK512());
+ return run_hash(NULL, hex, digest_SHA3_512());
}
-static void test_keccak512(void *ptr)
+static void test_sha3_512(void *ptr)
{
- str_check(run_keccak512(""), "0eab42de4c3ceb9235fc91acffe746b29c29a8c366b7c60e4e67c466f36a4304c00fa9caf9d87976ba469bcbe06713b435f091ef2769fb160cdab33d3670680e");
- str_check(run_keccak512("CC"), "8630c13cbd066ea74bbe7fe468fec1dee10edc1254fb4c1b7c5fd69b646e44160b8ce01d05a0908ca790dfb080f4b513bc3b6225ece7a810371441a5ac666eb9");
- str_check(run_keccak512("41FB"), "551da6236f8b96fce9f97f1190e901324f0b45e06dbbb5cdb8355d6ed1dc34b3f0eae7dcb68622ff232fa3cece0d4616cdeb3931f93803662a28df1cd535b731");
- str_check(run_keccak512("1F877C"), "eb7f2a98e00af37d964f7d8c44c1fb6e114d8ee21a7b976ae736539efdc1e3fe43becef5015171e6da30168cae99a82c53fa99042774ef982c01626a540f08c0");
- str_check(run_keccak512("C1ECFDFC"), "952d4c0a6f0ef5ce438c52e3edd345ea00f91cf5da8097c1168a16069e958fc05bad90a0c5fb4dd9ec28e84b226b94a847d6bb89235692ef4c9712f0c7030fae");
- str_check(run_keccak512("21F134AC57"), "2e76d93affd62b92fc4f29cb83efbe4ba21d88426aa7f075bfc20960ea258787898172e17045af43ab1fe445532be0185fbea84d9be788b05f14dbf4856a5254");
- str_check(run_keccak512("C6F50BB74E29"), "40fa8074e1e509b206448fbe757d9494b9b51e8d6e674a67f53c11ef92e96c3ea08b95ebd4172b020010cd6cf29539a34d6bfa002a2042787aa8d879a0f5b54c");
- str_check(run_keccak512("119713CC83EEEF"), "d1116786a3c1ea46a8f22d82abb4c5d06dc0691b2e747ac9726d0b290e6959f7b23428519a656b237695e56403855ec4c98db0cf87f31b6ceabf2b9b8589b713");
- str_check(run_keccak512("4A4F202484512526"), "f326c7c126ddc277922760feef77c9bab6fb5d3430f652593703d7c5e30135cd0b0575257509a624184330d6ab1f508a666391b5d4690426b4e05301891df897");
- str_check(run_keccak512("B32D95B0B9AAD2A8816DE6D06D1F86008505BD8C14124F6E9A163B5A2ADE55F835D0EC3880EF50700D3B25E42CC0AF050CCD1BE5E555B23087E04D7BF9813622780C7313A1954F8740B6EE2D3F71F768DD417F520482BD3A08D4F222B4EE9DBD015447B33507DD50F3AB4247C5DE9A8ABD62A8DECEA01E3B87C8B927F5B08BEB37674C6F8E380C04"),
- "a6054ffc3d81591be964c4b004a3a21142365b59ee98b2873d488293f93a8d7154bf72100012c60d3c9418f6af8ea66372cb4703f5f6381de6d4b9b98cff1e90");
- str_check(run_keccak512("04410E31082A47584B406F051398A6ABE74E4DA59BB6F85E6B49E8A1F7F2CA00DFBA5462C2CD2BFDE8B64FB21D70C083F11318B56A52D03B81CAC5EEC29EB31BD0078B6156786DA3D6D8C33098C5C47BB67AC64DB14165AF65B44544D806DDE5F487D5373C7F9792C299E9686B7E5821E7C8E2458315B996B5677D926DAC57B3F22DA873C601016A0D"),
- "b0e54a12fdba0738898f1bbf0ba81f81de77648d8d14c20bdd5d90f300d382e069f5dba7eec6b23168b008b9f39c2b93fd742a5902a5e02728f57712d6a61d4e");
- str_check(run_keccak512("3A3A819C48EFDE2AD914FBF00E18AB6BC4F14513AB27D0C178A188B61431E7F5623CB66B23346775D386B50E982C493ADBBFC54B9A3CD383382336A1A0B2150A15358F336D03AE18F666C7573D55C4FD181C29E6CCFDE63EA35F0ADF5885CFC0A3D84A2B2E4DD24496DB789E663170CEF74798AA1BBCD4574EA0BBA40489D764B2F83AADC66B148B4A0CD95246C127D5871C4F11418690A5DDF01246A0C80A43C70088B6183639DCFDA4125BD113A8F49EE23ED306FAAC576C3FB0C1E256671D817FC2534A52F5B439F72E424DE376F4C565CCA82307DD9EF76DA5B7C4EB7E085172E328807C02D011FFBF33785378D79DC266F6A5BE6BB0E4A92ECEEBAEB1"),
- "81950e7096d31d4f22e3db71cac725bf59e81af54c7ca9e6aeee71c010fc5467466312a01aa5c137cfb140646941556796f612c9351268737c7e9a2b9631d1fa");
+ /* KeccakCodePackage: ShortMsgKAT_SHA3-512.txt */
+ stri_check(run_sha3_512(""), "A69F73CCA23A9AC5C8B567DC185A756E97C982164FE25859E0D1DCC1475C80A615B2123AF1F5F94C11E3E9402C3AC558F500199D95B6D3E301758586281DCD26");
+ stri_check(run_sha3_512("CC"), "3939FCC8B57B63612542DA31A834E5DCC36E2EE0F652AC72E02624FA2E5ADEECC7DD6BB3580224B4D6138706FC6E80597B528051230B00621CC2B22999EAA205");
+ stri_check(run_sha3_512("41FB"), "AA092865A40694D91754DBC767B5202C546E226877147A95CB8B4C8F8709FE8CD6905256B089DA37896EA5CA19D2CD9AB94C7192FC39F7CD4D598975A3013C69");
+ stri_check(run_sha3_512("1F877C"), "CB20DCF54955F8091111688BECCEF48C1A2F0D0608C3A575163751F002DB30F40F2F671834B22D208591CFAF1F5ECFE43C49863A53B3225BDFD7C6591BA7658B");
+ stri_check(run_sha3_512("C1ECFDFC"), "D4B4BDFEF56B821D36F4F70AB0D231B8D0C9134638FD54C46309D14FADA92A2840186EED5415AD7CF3969BDFBF2DAF8CCA76ABFE549BE6578C6F4143617A4F1A");
+ stri_check(run_sha3_512("21F134AC57"), "584219A84E8796076BF1178B14B9D1E2F96A4B4EF11F10CC516FBE1A29639D6BA74FB92815F9E3C5192ED4DCA20AEA5B109D52237C9956401FD44B221F82AB37");
+ stri_check(run_sha3_512("C6F50BB74E29"), "4345B92A2AB7EADB6A24EE1D175AC258CCF2F694AC09EC9D47399E4D96F61F30B322C5438C51BACD0D597D00471A41ED8E9C9F146BBC807E6BC385F850FBABFE");
+ stri_check(run_sha3_512("119713CC83EEEF"), "50081C93BF73ECC54A5FFE43FC14F8BAEEDBE7DA0302AC984C9E668389886BD064BAB26DDCB616EB4E0E726042B19F3FD50BDD0D2C5B34892E00E6F399DE254F");
+ stri_check(run_sha3_512("4A4F202484512526"), "150D787D6EB49670C2A4CCD17E6CCE7A04C1FE30FCE03D1EF2501752D92AE04CB345FD42E51038C83B2B4F8FD438D1B4B55CC588C6B913132F1A658FB122CB52");
+ /* 1088 */
+ stri_check(run_sha3_512("B32D95B0B9AAD2A8816DE6D06D1F86008505BD8C14124F6E9A163B5A2ADE55F835D0EC3880EF50700D3B25E42CC0AF050CCD1BE5E555B23087E04D7BF9813622780C7313A1954F8740B6EE2D3F71F768DD417F520482BD3A08D4F222B4EE9DBD015447B33507DD50F3AB4247C5DE9A8ABD62A8DECEA01E3B87C8B927F5B08BEB37674C6F8E380C04"),
+ "2E293765022D48996CE8EFF0BE54E87EFB94A14C72DE5ACD10D0EB5ECE029CADFA3BA17A40B2FFA2163991B17786E51CABA79E5E0FFD34CF085E2A098BE8BACB");
+ /* 1096 */
+ stri_check(run_sha3_512("04410E31082A47584B406F051398A6ABE74E4DA59BB6F85E6B49E8A1F7F2CA00DFBA5462C2CD2BFDE8B64FB21D70C083F11318B56A52D03B81CAC5EEC29EB31BD0078B6156786DA3D6D8C33098C5C47BB67AC64DB14165AF65B44544D806DDE5F487D5373C7F9792C299E9686B7E5821E7C8E2458315B996B5677D926DAC57B3F22DA873C601016A0D"),
+ "BE8E14B6757FFE53C9B75F6DDE9A7B6C40474041DE83D4A60645A826D7AF1ABE1EEFCB7B74B62CA6A514E5F2697D585BFECECE12931BBE1D4ED7EBF7B0BE660E");
+ /* 2040 */
+ stri_check(run_sha3_512("3A3A819C48EFDE2AD914FBF00E18AB6BC4F14513AB27D0C178A188B61431E7F5623CB66B23346775D386B50E982C493ADBBFC54B9A3CD383382336A1A0B2150A15358F336D03AE18F666C7573D55C4FD181C29E6CCFDE63EA35F0ADF5885CFC0A3D84A2B2E4DD24496DB789E663170CEF74798AA1BBCD4574EA0BBA40489D764B2F83AADC66B148B4A0CD95246C127D5871C4F11418690A5DDF01246A0C80A43C70088B6183639DCFDA4125BD113A8F49EE23ED306FAAC576C3FB0C1E256671D817FC2534A52F5B439F72E424DE376F4C565CCA82307DD9EF76DA5B7C4EB7E085172E328807C02D011FFBF33785378D79DC266F6A5BE6BB0E4A92ECEEBAEB1"),
+ "6E8B8BD195BDD560689AF2348BDC74AB7CD05ED8B9A57711E9BE71E9726FDA4591FEE12205EDACAF82FFBBAF16DFF9E702A708862080166C2FF6BA379BC7FFC2");
end:;
}
/*
- * Keccak-Stream
+ * SHAKE128
*/
-static const char *run_keccakS(const char *hex)
+static const char *run_variable(const char *hex, const struct DigestInfo *mdinfo)
{
struct DigestContext *ctx;
uint8_t res[512];
len = strlen(hex) / 2;
buf = fromhex(hex, len);
- ctx = digest_new(digest_KECCAK_STREAM(), USUAL_ALLOC);
+ ctx = digest_new(mdinfo, USUAL_ALLOC);
if (!ctx)
return "NOMEM";
digest_update(ctx, buf, len);
return mkhex(res, reslen);
}
-static void test_keccak_stream(void *ptr)
-{
- str_check(run_keccakS(""),
- "6753e3380c09e385d0339eb6b050a68f66cfd60a73476e6fd6adeb72f5edd7c6f04a5d017a19cbe291935855b4860f69df04c98aa78b407a9ba9826f7266ef14ba6d3f90c4fe154d27c2858ea6db8c117411a1bc5c499410c391b298f37bf636b0f5c31dbd6487a7d3d8cf2a97b619697e66d894299b8b4d80e0498538e18544c3a2fa33f0bfb1cfef8da7875c4967f332c7fc93c050e81fb404f9a91503d6010ee16f50b4ed0bc563ba8431668b003d7e2e6f226cb7fa93bb2e132c861fdc2141457589a63ecf05481126a7c2de941a2fdec71cb70de81887b9014223865e79c4ffe82dae83c1fc484b9a07a7e52b135f4ae3a0e09247ea4e2625e9349b0ac73f24cb418df6dcb49ca37860298ada18aa23595b5096ef789de3edf3826817fff4f71102a01e1d2599f2958d5c186f5b11f5feedb61bb732dbb42d18b1e77258a8f211bf95c9f47f19603ec419ff879aea41a4811344d016bbc4f9496741c469cca425c5be73543219af40796c0b9ff14aeaa70c5e22e4bb1346a3ddfedd8a559104e4704f1227d42918ae3f7404fbf3c6340a486e776aabcc34190f87da4bd954b83386255a0e34df05ca2e781faf6fe66475852481fce20798a56629abfac408760ce64606008a3b568c88aba1c6df3381e0765567ea84b2ce4b441cf1eefaa32125d5139361a632b3008566a2e8af1055cb06ae462b6bf87b34a9770618e6");
- str_check(run_keccakS("CC"),
- "56b97029b479ff5dd15f17d12983e3b835bb0531d9b8d49b103b025ca53f991741298e961d1fad00fc365c7761bfb278ae473980d612c1629e075a3fdbae7f82b0f0af54df187f358852e19ea4347cf5ceea676a1dce3a47447e237fd74204f9a4b7f7c9cc7cc8b865b1d554e2f5f4a8ee17dbdde7267894558a20972c9eb6cf5f62ce9151437718ed4aff08fa76d803806e6ce47d229aae839369e31888b26429e27bc3756021cb51498bcf2527d4bb04838bc1ceed9985a2a66ff8cb8c2d58b7099304e7f9622c583b093024a5fcde2be781474c159df24d77d328c298f5766a8a0dbf7ae790a509ccf59e0cacd0abf21492e0095a87ecdb55990093917aaa96d7f68b7b859b8094aec0ddb6fb352a6cc1f007fa988ed764f5d6f21f9d8ade9ce7aca4de6570da39d9acceb46d2582fa4c4231de0b736fb341041d24cfae6c0761f43a2cf7383f38742579218afcab53d2e6816640de05644d877558e965b1a28406999f31ccc43ac0b02bc5448b66ad3b6f8de04c0e25845c8671b6f0594909a057f17fd06031707c8b4599889c994a35c193dbf84a7a0919cd054f67ceb7965f420d02da3477efc8b55413c241adcf71cb10fe7e3e720b8c1736837b06e4b27461b71c6cac892437530bbfe05cf426272f80f11709b9db964f5dedab9e757c2f7a972b6a4c2443b03ad787ab1e243660bced739157a434800696841acea4");
- str_check(run_keccakS("41FB"),
- "cbe96338dd8f04c0694299637aab223b6d60560c6bed7f69923aebb24fc61b84702403d39e7d081f7f7b714e3ba6e6221fe840f57a1e9bd775b90d59c9853695c2b11cd06f1054210d7d8155b908ff4ee14fdf859b6d5aa6bf76903be0af4a2ffd52b2b149da32c8e372f51826d4ca7dcd6516d167a0621aa88986d19a524dd352b9ca08f341d2267671f45e05892e1a5c604bb721bc8952dac20d559dc183656501cc34bc91e2aea930716b20539131ac5f9ae0a630e3691abe6e76935d21f99e3f2e531526360405004bd730388236a1197fe3715315e8ca40b4e5e6a07cab434264515c26451a7c1387d776bc225b851e9f7807c24a23f42fb47eb29697f6cd80cdbfb79a39675092ab582c5a6bb3284cd72a889601dc2745153fac80ff81c6648cb99facfe51862edc8b03c2c3ba5b83eb1d40d3937caf3d8e511485051d3e5431a19c1571b52e796cf032162292ecf2b490cd97c3e2fc2ca339021533cd1aa1c5e8b3f803767ae7585999a2b7d70c7b34324b36399a87c3c73866741cbef9355c1570309544697df9a82da28b6c5ce35556c5bef4e0a24e62f95e543cd3fad6d2ddeea3950e72867d67a8dcd4b338fd8341583fe0e04fff2d6ecdfcd4b41eb8434ee0e31f812b220494202fab9fcba09a9dd26b36637df5607c6d7cbede04868a2d512d11a16c24c4b8d566ce63932b85e7e1a8648f58857629bdc2ee92");
- str_check(run_keccakS("C1ECFDFC"),
- "968a76720a2fff1ac9629cac7752c0958b6e19bc79fa31f210244d486645798b55f52581855da53a14139dd78e15f54c66bde1bcc5674f46de6164a86933b2cc99682f7118af25b9034cddac018e6d02f3890fa581c79cad5c6c2380a890ea470876e7bede8e8b78aa6f0cb271f54252dd018c7c9d393a06d60a78be8a5014b89eaa282dfec4e737e43a61cfaade58f9bdde9c6125daf34350b2b4e320f35b62dd0675c0515b943630e3f63880423864dbd70814cc9373c521e8f29bb4138388c92c4b6437a65469902e706ccce3777991a47c0ee9701217fb44cb02e674c7539e473d20352a7a875d6cf3a038e655d3d1a75852fc1859835cc181ef0c58b888a6673bb8275cfb9797f5e146a962d8deb535fc7b166af4fc95209a2dd4c515a0c04ddadfb77ba6b8da76c9ae9cce13538608603ed3550c685bacdc0a059f92dad364f8a72dfaf52faf43011c33b6a6235d9ac6611f346d955e1701f37713bb6f98a05337b1943556d497a4a686645fc359375408702ec45617c949d1209824e4627741cf2760e6ae84e0e1d395da4da5748d042bff19351ff20092df201aeab4d6c603693e6ab01dabaf009a1c8a93e713dacd4a0d93695a2f6ef4e59ab9a140a100766b25b86cbb3632aa73fb16f47b9839e4d0e8736a0b81cdd923f0be79c4c7ab1f7e1be0ed5f079f6e04b979a567e81bc0c1a236e3daa2754f195ff76261");
- str_check(run_keccakS("2B6DB7CED8665EBE9DEB080295218426BDAA7C6DA9ADD2088932CDFFBAA1C14129BCCDD70F369EFB149285858D2B1D155D14DE2FDB680A8B027284055182A0CAE275234CC9C92863C1B4AB66F304CF0621CD54565F5BFF461D3B461BD40DF28198E3732501B4860EADD503D26D6E69338F4E0456E9E9BAF3D827AE685FB1D817"),
- "dcac84568f15cac076854ea692de95e473768a99df9ac2328ee423d02eeb8ee8e1d1706213c4415dc7aafa66476d8ebdddd8bf39e1de05ca76c36e7e975629331f3a33c3ca4091c82004e5891b7e276d4642ea61bde021871c9b5c8cfa82144b7a4144b44ebe6093e95c59305fd36a8741c4f2df65cb0b59f803cfdcf2ce4b8b54857a7f8ad8477a22cffc07f4a5ef76996837c9b3f8ff25375e669e68faebed8ac79673860f45fd6e7ee7ed630cb8582785eed432af1f4ca22f4fd4488dc3882de5268ee4c47be4eaa2e77692880d218a69578fb090ed8426c29217b72070be2a4bf0d7bcb480ff262d2dc3bfa9c9d88ff6f5284d240e988e4f9b956aaa36e804bb38ce1f5aa65e73624940c28cf816f4c4f00751bcc6cdc79131e96294d95d6bc98f58a2a687ea7b0769a6dd4f4988b2381631ec1967ef4fcc9efb7a7519783a33787850a8c752f36a4b3abf7e460d5689009a232bef1c33fb3d99069b0157764e4477e2ad68b3a99a05bd2d38288ddd416ee784bdc99e157dfdec61ecb0c49763f187e947c54a4ecbf5eeb76af5feeb222b0844cc1bb9f69cf3b291671bbe98c89ef5d656dfc77375c39cbc2a7ff6413b3ca99834d1845499a09bc111c8582f567d187147c5bbade2194871126dda67daf170079a618a77b8f06193e06f87d441687d1de6e5cda9c791728f837c945f2eb20327802b37fc6d9c2b125f4067");
- str_check(run_keccakS("3A3A819C48EFDE2AD914FBF00E18AB6BC4F14513AB27D0C178A188B61431E7F5623CB66B23346775D386B50E982C493ADBBFC54B9A3CD383382336A1A0B2150A15358F336D03AE18F666C7573D55C4FD181C29E6CCFDE63EA35F0ADF5885CFC0A3D84A2B2E4DD24496DB789E663170CEF74798AA1BBCD4574EA0BBA40489D764B2F83AADC66B148B4A0CD95246C127D5871C4F11418690A5DDF01246A0C80A43C70088B6183639DCFDA4125BD113A8F49EE23ED306FAAC576C3FB0C1E256671D817FC2534A52F5B439F72E424DE376F4C565CCA82307DD9EF76DA5B7C4EB7E085172E328807C02D011FFBF33785378D79DC266F6A5BE6BB0E4A92ECEEBAEB1"),
- "9435fc671dfcfcdac149277e2caaa80ed3d4a2359300db892b8093dffa9442bb5c08f242f2fc2cb5f8388032299f1df47a57489a4fc0d66d88e483092320a471897fb6ade67897e5138c45f19174a4b1ae0e510fa390825d17568989c3659fc57b9345d7d93ee588cb2629c5770808195257bbf42b069576d94011989dc6ebc43cfc7cd27b6f9853904f3eb3842bbb37d2bd807f05468f5057f78373b6f34462095a1205c1fca0d15fbcf890ee78ab6f94cb778b5d6f3620e6e6d6ee688eecc619e22e25e0bb5e143a53472e4f1d1f91a8e625087b0f608770c4b9909749ab50ddcdac59bb3c975aba4dceb2b3a2c436ed103ed6d9c62cd63a69a0bdd2baabfbfd63eef34507637f5e8a16a4fcb33d66141781e10bc6262833ec6e2953cedd5f652b76fa042ec0d34ba20f5657e28c08b6b61dfa8da78cf997127e17a35d75ab35542fe6bb9ce5bd06119da6b497ac1ae12947b0c214de28ed5dda7815fb6d5def81025934c877cb91e923191581b508bbabdfe4bb2dd5af6af414bfa28830e4380355bdf2483cabd01b046956b85d5a34f46849ba1cc869f5babd1b41ec775fcb4b5fbad79661daf47dbe7bc6380bc5034bfe626526f3305abe270bbbf29280e58b71db269cf7962d9dc1731bd10d5633b1b10e76791c0fcfddf1c8263f17f8b68b1a0589fe5c9403d272fa133442980588bc1f385c3af240d8f195ab1a3400");
+static const char *run_shake128(const char *hex)
+{
+ return run_variable(hex, digest_SHAKE128());
+}
+
+static void test_shake128(void *ptr)
+{
+ /* KeccakCodePackage: ShortMsgKAT_SHAKE128.txt */
+ stri_check(run_shake128(""),
+ "7F9C2BA4E88F827D616045507605853ED73B8093F6EFBC88EB1A6EACFA66EF263CB1EEA988004B93103CFB0AEEFD2A686E01FA4A58E8A3639CA8A1E3F9AE57E235B8CC873C23DC62B8D260169AFA2F75AB916A58D974918835D25E6A435085B2BADFD6DFAAC359A5EFBB7BCC4B59D538DF9A04302E10C8BC1CBF1A0B3A5120EA17CDA7CFAD765F5623474D368CCCA8AF0007CD9F5E4C849F167A580B14AABDEFAEE7EEF47CB0FCA9767BE1FDA69419DFB927E9DF07348B196691ABAEB580B32DEF58538B8D23F87732EA63B02B4FA0F4873360E2841928CD60DD4CEE8CC0D4C922A96188D032675C8AC850933C7AFF1533B94C834ADBB69C6115BAD4692D8619F90B0CDF8A7B9C264029AC185B70B83F2801F2F4B3F70C593EA3AEEB613A7F1B1DE33FD75081F592305F2E4526EDC09631B10958F464D889F31BA010250FDA7F1368EC2967FC84EF2AE9AFF268E0B1700AFFC6820B523A3D917135F2DFF2EE06BFE72B3124721D4A26C04E53A75E30E73A7A9C4A95D91C55D495E9F51DD0B5E9D83C6D5E8CE803AA62B8D654DB53D09B8DCFF273CDFEB573FAD8BCD45578BEC2E770D01EFDE86E721A3F7C6CCE275DABE6E2143F1AF18DA7EFDDC4C7B70B5E345DB93CC936BEA323491CCB38A388F546A9FF00DD4E1300B9B2153D2041D205B443E41B45A653F2A5C4492C1ADD544512DDA2529833462B71A41A45BE97290B6F");
+ stri_check(run_shake128("CC"),
+ "4DD4B0004A7D9E613A0F488B4846F804015F0F8CCDBA5F7C16810BBC5A1C6FB254EFC81969C5EB49E682BABAE02238A31FD2708E418D7B754E21E4B75B65E7D39B5B42D739066E7C63595DAF26C3A6A2F7001EE636C7CB2A6C69B1EC7314A21FF24833EAB61258327517B684928C7444380A6EACD60A6E9400DA37A61050E4CD1FBDD05DDE0901EA2F3F67567F7C9BF7AA53590F29C94CB4226E77C68E1600E4765BEA40B3644B4D1E93EDA6FB0380377C12D5BB9DF4728099E88B55D820C7F827034D809E756831A334C078FC28ACB76B5ADB3BFF6DD659CAA49CC34F726880F293BD3FC132027AE7602242064EFEC4D9D656E069D4DFAE0B40C1D6B6CDB21D89D00E168B0B74D72EBB3B672B57AF3E99C85DA2F41CE70672CD0E0521678FC56EAB6314A0B3AF8B724376C01433D84943A73AF703D293634BC24322992756EE261FFF0D71BFFB8AEBF1026A6A345F2EAED505BC7E02498A3225FC91499DD5F5E30E386557C5FE0A88BC2337C80D7EA42B60622960230577CE800CB63594F619B7DE31E026429B7648C5835AFC00559FA4C7695D6DD9F7B2537A265E9AF7A2C986F8B60E7DC6EB3C4D805A6EEFB6FBB5BFDE21ED7E41CFDBEB02B0BAB76F9998BA1E52815A246B084EFAE7960AFFC2BA5C647E7CC05EF8120568432DFDE1D7246473304808985600A1AFC20B99185AF25E89DC2EC6F4880DC79BAD50DFFCC9EA");
+ stri_check(run_shake128("41FB"),
+ "09C9652BB968996A35E4814E27587131F53FD01AB9FE83758ACEB8134FCECA24C84F592CEE43A4476E8853FCAB7DAFEF7B60ECFEBFD70DFCF587B3AF358A286FE3713BF4735A84975BB65E3586C81EA716BFB999626DC973A495A6E0024061387D628E9E59DFD2B39C68C8CEAD665AB43F6D2625A10630761DFB60276EA97B280442462246C6D74A1960A8419A76A37B68449A9E427D6A7EC1FBDF4760847AD6F6F5A08CEFB767CAEB6C2382F4F3D0E49DE4428CD4240635C9136911A82FF0B9C74569A1B7C8AF72AB1EA5F2F6F6A45E3BB08229ADDFA916B18A74F7939C5130152AC8343A10694154FDC6E1570EC7ECABBB01EDDC92EF0BB1B3DB914C74CCE399ACC9B766FD7494B2EF27AC57B80D52535942D55E2DBFAA61CDF3F48759AA612DED11421855AD15FFAB91462A56F873BBAF4FE88457A47B6C0594818D0A9189895239C1429ED8754EEE5498F4D0FB6C9D0DF0EB5316289E72C6AAEB8C61317B409156D4221CE6CFC7C5F39272D87C2D884F88F1B8B3C05CA9E235ED92C7DD7806CDADA7166CC1B9107DA5E6536D4FF111BF9199D6B72AC17D874323D68D76AEC4650F1A4B067C50215362201A7F71116BF6633AF08D712804B83F08A5DC7CCD4315963106D50453D44EFF59C9C652F4A924BE93C0B958EA286B0A4B597899A28C9BD5419C042668AA7B0CFCAC4CDF9260F2824ABF3EE79FEF53EBE3C36DF831");
+ stri_check(run_shake128("C1ECFDFC"),
+ "B5EB987E7CBFC7C9D140AFD20B500E30F2F71188BCE885951F22FBC35DE40E7411311BC8479F895A069600483751295F5C3855474D65436B347608583125A6BD41CA30DC99CB342B72A96F8A2213E98A16BBB9E38A141B4FBA68C1A723D1D578A91B4A1BAFD03B25BD3CFB6D4E1E044637889C6D7AF0209DBB5E10837D5C5991D2766012E7E86A82838B455B96D882B7E25C9072A66DA22B0ACB992FD3CCF5FBC28625B896BDF8D4B7358901D12698FD823FE09AFB4F238631EE1277752F2900E38C7FC163381A01601DBDE8CD30A9A8EE8353DEF6C610B50962D0EC1F4F3EEC2AFD7FCD5296E299C23005960C1AABF3408EDE96DE18E10FDE99774B5BD33092639D8BE9D872130C96311EB6DCA82CC28A62C01E3F9C454251D87FA890284C06187F904CF23CCC62690628C590BC8B84EEE68371D3412DCB5648A634F2359951CD011028E61C28A33EC4E31550C1C0E4123D1091E22D56BD587E73B7DD43C1B431D9547398C5E7EB6C682EA2FD758C86C1222C0D6AB236B8106DAC19338E86CB8F6EC0FB607D70C938CAC172C80079B018BB62939546505B8B6E146A3AD7A35F20D7F9A353F1E6535C23AE93CE8F78C045402E707A664F5918E6836D343240E6112EFA29DFC4D18778C91E2B8530E4FF6E4947623D31DAFAC9B0D194E36C44E10B1A846935684F89ADB44782E8FFF2E3E62B65D18140F10D36CD817F835EB0C0");
+ /* 1024 */
+ stri_check(run_shake128("2B6DB7CED8665EBE9DEB080295218426BDAA7C6DA9ADD2088932CDFFBAA1C14129BCCDD70F369EFB149285858D2B1D155D14DE2FDB680A8B027284055182A0CAE275234CC9C92863C1B4AB66F304CF0621CD54565F5BFF461D3B461BD40DF28198E3732501B4860EADD503D26D6E69338F4E0456E9E9BAF3D827AE685FB1D817"),
+ "5E0693E64DBE678055A31D80DA85A81A1BA5EB1CB6394B7B1AA2ADC2B8C1FEE4F41DFF3623502FCC349D4B2BEBBC1311EF291EF47F490C6FC1323075B519C87DBD77CB94C213EB548278A6C11B0C321C941FBEB9742B690A9777875D8A1FD0627B5CE3679A6DBCC8B53D775E73AC9F951749FC353EEE7220CAB40F4F7C2EEA311CD0B50974AF188EA9742509C4121FC07A70FC28F0633B56BABB451554BDF86396594B57B1F88DFA07DD4F8C47AB5FFBAD03DA1DA642EF4A6E75A952E8ACB3989136B8A792E6F33B24DA2CC4E422192EEBAF121561BD33A6D79DF6517B3F001E674F39BB98D9AA0E15226389B17655E7B2796D75EDE0430A0E7D07039B8E35642570F6457F8344A59DBDD5128F74F9AB83CD152DB17987019AA0B27B6E7951CEF67B574D05535CEB5EB023A39B5731B6AFE6CBB8BFEE0F71819D791C288BFE9EBE6706778FE62A80AEF22CB9C0920938502F30A20FB4A4822D0C0D42D50D67FA6A76EF919C985C6306FEA73A3BF41006F0FE60C0D92B80106D8C715B97E35E39FA8ECA59220B86C2C46B9C61EEBCE07DA4B64CAD247A67112F6548AA693BFC4BFC9AE78144571CBE7B81B83C8832938A71FD3AC6B8E4AECF17FD2848FD9558DC5DDB261CCAAF083AFFA341EA295C7264F35734F5179038AB70C90E03BF53E3FF438A9C0655EC38F5B9DAB7A4C3BA852A2A0593C80999818B460015C79093B1D6");
+ /* 2040 */
+ stri_check(run_shake128("3A3A819C48EFDE2AD914FBF00E18AB6BC4F14513AB27D0C178A188B61431E7F5623CB66B23346775D386B50E982C493ADBBFC54B9A3CD383382336A1A0B2150A15358F336D03AE18F666C7573D55C4FD181C29E6CCFDE63EA35F0ADF5885CFC0A3D84A2B2E4DD24496DB789E663170CEF74798AA1BBCD4574EA0BBA40489D764B2F83AADC66B148B4A0CD95246C127D5871C4F11418690A5DDF01246A0C80A43C70088B6183639DCFDA4125BD113A8F49EE23ED306FAAC576C3FB0C1E256671D817FC2534A52F5B439F72E424DE376F4C565CCA82307DD9EF76DA5B7C4EB7E085172E328807C02D011FFBF33785378D79DC266F6A5BE6BB0E4A92ECEEBAEB1"),
+ "14236E75B9784DF4F57935F945356CBE383FE513ED30286F91060759BCB0EF4BAAC858ECAE7C6E7EDD498F01A082B63FA57D22540231E2E25C83EFB3B3F2953A5F674502AB635226446B84937643DCD5789EE73F1D734BC8FE5F7F0883AB10961B9A31FF60DEE16159BC6982EFB08545984BF71FED1C4CD81C0914B4C19FCFEEF54AF4BBE372F18CFCD3A18657F5B9450F99A78F0FA2C3CDCA7461C4ED7569536883B66CD87E9C200962902EAA16A54DB6A0A5CC26D889038C0760810B5BB4F33F1E5D639B6F9BC7CA62BA6F8C9F8DE770260AFE47F4E0F82F102198EBA27F543252AC8DDD83E1B8DB0A91AC65633FD12A550EBE96F93AA6704ED5905C234FA6D9203910CBD02DE166C4C3348FB81EF7B84AE1455FE318B5FD170883F49BA2F24289C479A2C7531406BA989BEAEF3A79F659028642E9B033F7DEB9ECEC3A7A9F1DBD2451FCB47C81E21E91D20B924C6BD04C1F0B2710D2E570CD24BAD5B5DE4E49AA80B6ADD5507B4D2E510370C7AFA814D7E1A7E278E53D7CCF49A0A866CA3A7B5BB71EF3425E460FEEB29149F217066613695F85506A0946CF68979F04AE073AF8028976BF0C5BDC2212E8C364583DE9FBD03B34DDEE5EC4CFA8ED8CE592971D0108FAF76C8940E25E6C5F865584C34A233C14F00532673FDBE388CC7E98A5B867B1C591307A9015112B567FF6B4F318114111FC95E5BD7C9C60B74C1F8725");
+end:;
+}
+
+/*
+ * SHAKE256
+ */
+
+static const char *run_shake256(const char *hex)
+{
+ return run_variable(hex, digest_SHAKE256());
+}
+
+static void test_shake256(void *ptr)
+{
+ /* KeccakCodePackage: ShortMsgKAT_SHAKE256.txt */
+ stri_check(run_shake256(""),
+ "46B9DD2B0BA88D13233B3FEB743EEB243FCD52EA62B81B82B50C27646ED5762FD75DC4DDD8C0F200CB05019D67B592F6FC821C49479AB48640292EACB3B7C4BE141E96616FB13957692CC7EDD0B45AE3DC07223C8E92937BEF84BC0EAB862853349EC75546F58FB7C2775C38462C5010D846C185C15111E595522A6BCD16CF86F3D122109E3B1FDD943B6AEC468A2D621A7C06C6A957C62B54DAFC3BE87567D677231395F6147293B68CEAB7A9E0C58D864E8EFDE4E1B9A46CBE854713672F5CAAAE314ED9083DAB4B099F8E300F01B8650F1F4B1D8FCF3F3CB53FB8E9EB2EA203BDC970F50AE55428A91F7F53AC266B28419C3778A15FD248D339EDE785FB7F5A1AAA96D313EACC890936C173CDCD0FAB882C45755FEB3AED96D477FF96390BF9A66D1368B208E21F7C10D04A3DBD4E360633E5DB4B602601C14CEA737DB3DCF722632CC77851CBDDE2AAF0A33A07B373445DF490CC8FC1E4160FF118378F11F0477DE055A81A9EDA57A4A2CFB0C83929D310912F729EC6CFA36C6AC6A75837143045D791CC85EFF5B21932F23861BCF23A52B5DA67EAF7BAAE0F5FB1369DB78F3AC45F8C4AC5671D85735CDDDB09D2B1E34A1FC066FF4A162CB263D6541274AE2FCC865F618ABE27C124CD8B074CCD516301B91875824D09958F341EF274BDAB0BAE316339894304E35877B0C28A9B1FD166C796B9CC258A064A8F57E27F2A");
+ stri_check(run_shake256("CC"),
+ "DDBF55DBF65977E3E2A3674D33E479F78163D592666BC576FEB5E4C404EA5E5329C3A416BE758687DE1A55E23D9E48A7D3F3CE6D8F0B2006A935800ECA9C9FC903D86F065367221067658B4D7473ED54800D196FBE1089811DD9B47F21E3698B1573653ADAD231C39F145B586D6C0133378416138E4423F7AF7DACFFE965706A3C49024002B53BA05871E3F066694B163630B0053BE41FA45D4317EAA84214254038A37A9C83D62EB9EA6E6ACAFA6BBFE5AF9F389690D5A9E27BF97C1B93D93ECF36DF6DA212E12B2448154156E94687336B6DA91E368512B9F34C616166542923F3618640D930F922A3DDDD2F87920378541446F2223F593931BD1BA02E2907CE3404621F26B900D05A1119A9E4934A7CD818DD9237445BF50475A011EA0078788801D21DFECB7A2BB294E4956DFA71D8CC472405342BF80120FE18A551D88D6ABC24D83F077BFB25EBDE5F4B03678D677EE646DCE3496D5138BE108782CA5A00AAFF3CB4BB873EC0F2E932DD74847033EC5F07254E3027B0AC12DB7D6D3F90B53D8A5BD63B99C3BF5CD38B453D7CB12D0AE2BF1CFD3EE88AF71BB6606B0B791DEFC2D762C8641BB8319FE17321EBA407EB744699D92B35ABD79F5B9A85408C93D61233FECE638023875AA02B9EDBACC84003A28CCA2D55A0742D635FDA888905986CA01C1E6420D49EC25224D84E915DFD1638A492282F1FD053770168953C");
+ stri_check(run_shake256("41FB"),
+ "B64ECACD5F7499ACC085C908D35DCC1FC0131816F28D360592E1265079F92A5F844C4BF6AA50D98D52720797E8C992F43C76A73FD95F9BC4CD272157842ADA2518190FCA342DC20D0C57CDDF01B3DDF77977EDED63445E40BE82DF8D26DB629A2D307EE9FE28D2FE557E3971858C6D67C42BE2CF44DD7570521CE06474467425B7AAAE39DB90945BAD388009ED5715C684BB4E4981EEA324ECF66584AD08D9F27C6A4DCF615591857BC7364E8A7C136661AE5FFE828C734DD5EA5A071276E8477B8525E02B7B445D91CC6E37D58740DC2B069BE6D92E7DF95C1AB52B76F7761AE34328962EAC7156E460B3C04FFECAEC8722A56E7373285E42D4CAC5498F8D7DD5ECDA9F9973A32F8D425171E1390BFC812C9EE4D4AB8FA9A0D93AA90A4C258FC64D77BBCF49977E87C3810C80C4585168996A31F446F9391A193B888CD321E22E9368F4F11495FE124141C04015532345D7CB0A13A4DD9007D737B3A176A88E5FC153D4AC2E8CD641C40C4261BBA70E1B87114030FF67CB22ACEC90AC288D6B59D25B00038468B4780254FAC4EF158EC2CD52C0AB9217EED1ED0A5E7B4C4B3A64B1824E2B27AA53398765D5352BD1ED0E9C7B3FB264D141741659F7D8FD0EEEC9F9163C42AFDB540D5F2C87833880A0C942AE4CCEA7FFF2F4C798B8AAF24C33BE8054A09459A3AF7200D555334241709A18ECF88CE93C99234D6AB0285916AE");
+ stri_check(run_shake256("C1ECFDFC"),
+ "CE7FBC15503986E3B84530D84A16EF64332A6EA57E354E9F2054BFC2AA8891F94B4FDD42FD227C94B33F9AD45CF3982239F81FBC2CBAC7809F01E1C294073AD6D2821C1283C5C427F41FD46455EF7B4EA0D6D5E249AF95FAC80A8678C1A5318443E63122DDFED2591FC690527F97A09920941B02439AF3BA36B17FD588E187FCBC1FF109AB4A9ECFC671926EF0CC9C82EE06EC6759E2758A8859B8FA9DDF46D6C049621FF589F3FF56C9419D6F48A68B68FEFD068ABEC24824D7FC150277C2439BF78D15D59DBAA2CB17E5282E6E9ED744841F4A4BBB778CFEAB0471CE850B2A2F948DB3926F733EF7B3AA9AB8EA84278DCA62B0691F5DD13EA11660A8E2FB5CD8BA74A352C044E7219E750F29B62F94ED268A68029B94B64F3D4F2193A7FC69ED34A59657471F04C4961084EBB581ABCC9D50E3674A7DEBB285FC7215BF6606DB1392A7F1619B347A4D07D230DA07811FDE2AEBE45A70178CF841C619F712EF26BEEECC4183A1040076E73FCF6FABE5C25A4B71D564A97CF3C88F1856D9C8B42E94F746CE4605D2AAEB56D1DA5527598E17E5680D309788E09910BEB74DF7D3C3CD4EC680083F5845F4A1C15070E57979C01B89DF7BE64435EA4817BC0AD23ACCA6CB878F7131F02F9215E2D5C12CF3B4D24B29620C891A54AC8BE6E3DEC08397887DE0EA86B81A5459B968FBAE18B4B0324DE7E7C1AEEFC7598644CE1FF8F9");
+ /* 1024 */
+ stri_check(run_shake256("2B6DB7CED8665EBE9DEB080295218426BDAA7C6DA9ADD2088932CDFFBAA1C14129BCCDD70F369EFB149285858D2B1D155D14DE2FDB680A8B027284055182A0CAE275234CC9C92863C1B4AB66F304CF0621CD54565F5BFF461D3B461BD40DF28198E3732501B4860EADD503D26D6E69338F4E0456E9E9BAF3D827AE685FB1D817"),
+ "E38785ED93686FA741FBB6E5BE64933963C3C872F7A4E8C8D540EC3F82284605625D32A24BCE8B40264EB51B164DD86F318ACFD9867F3BF23998275042AAF23BDA01F602622448957B81E51475F15CDB31A9297EE390F681E460EC01A024F183110C728BB09A12DDE89E6F5DE2B4F8C17D981E3E9C531E6D4C19448A4A6BE28853AFA2FBA216F7C8E2CE4E4DE31F6B0E129CB5DA118B4A59569A439C1095EB50C51CD83105B1A12B3F7086947EA7381969A78308F8FDDAC8B2D87F4540A8E7CAC8932CA76201F86561ADD09D833361851CEB9759AD1EEED4E00ED19C642BC6D0AED034276B66D818E8791A7C1F42F8604E8B026D4635E3BDB27CA0FB28E7517BF662BB99AE3A3C698AD0AA2F02408E76A5F93ABFC933B1691A89EE3EBCA2885EA633D0FEA4DBCD03B05B68E0F4D267144FDC0898DE46011832ADC872F4A7F0D8933CDD482CA54FFA81774BA083D3D9FE07DE94F8E03FF66D9F1BFE7504E8A497591BA8F52758F92E0A4CA6A93979CD1F55EE9DBA17BAC6C69E83DDED4CE2DBFFB0B48C0C6AED657405DE18E7891B3C854127459E89FE5442CA6D5C223B046147BFDEE435CF4EFAEFD705373DC87E20B7D31C7D37907D30B8B32054BB9ECA80D0AFABB5EC5053D94D517F158EA958C7458CF71FCA85B607A352A9A3B8F4F161E3B8853F6BB61864BAD12DD9B57ECDA507A3CAA63A1DEC726B518CB4FDDEED6A34");
+ /* 2040 */
+ stri_check(run_shake256("3A3A819C48EFDE2AD914FBF00E18AB6BC4F14513AB27D0C178A188B61431E7F5623CB66B23346775D386B50E982C493ADBBFC54B9A3CD383382336A1A0B2150A15358F336D03AE18F666C7573D55C4FD181C29E6CCFDE63EA35F0ADF5885CFC0A3D84A2B2E4DD24496DB789E663170CEF74798AA1BBCD4574EA0BBA40489D764B2F83AADC66B148B4A0CD95246C127D5871C4F11418690A5DDF01246A0C80A43C70088B6183639DCFDA4125BD113A8F49EE23ED306FAAC576C3FB0C1E256671D817FC2534A52F5B439F72E424DE376F4C565CCA82307DD9EF76DA5B7C4EB7E085172E328807C02D011FFBF33785378D79DC266F6A5BE6BB0E4A92ECEEBAEB1"),
+ "8A5199B4A7E133E264A86202720655894D48CFF344A928CF8347F48379CEF347DFC5BCFFAB99B27B1F89AA2735E23D30088FFA03B9EDB02B9635470AB9F1038985D55F9CA774572DD006470EA65145469609F9FA0831BF1FFD842DC24ACADE27BD9816E3B5BF2876CB112232A0EB4475F1DFF9F5C713D9FFD4CCB89AE5607FE35731DF06317949EEF646E9591CF3BE53ADD6B7DD2B6096E2B3FB06E662EC8B2D77422DAAD9463CD155204ACDBD38E319613F39F99B6DFB35CA9365160066DB19835888C2241FF9A731A4ACBB5663727AAC34A401247FBAA7499E7D5EE5B69D31025E63D04C35C798BCA1262D5673A9CF0930B5AD89BD485599DC184528DA4790F088EBD170B635D9581632D2FF90DB79665CED430089AF13C9F21F6D443A818064F17AEC9E9C5457001FA8DC6AFBADBE3138F388D89D0E6F22F66671255B210754ED63D81DCE75CE8F189B534E6D6B3539AA51E837C42DF9DF59C71E6171CD4902FE1BDC73FB1775B5C754A1ED4EA7F3105FC543EE0418DAD256F3F6118EA77114A16C15355B42877A1DB2A7DF0E155AE1D8670ABCEC3450F4E2EEC9838F895423EF63D261138BAAF5D9F104CB5A957AEA06C0B9B8C78B0D441796DC0350DDEABB78A33B6F1F9E68EDE3D1805C7B7E2CFD54E0FAD62F0D8CA67A775DC4546AF9096F2EDB221DB42843D65327861282DC946A0BA01A11863AB2D1DFD16E3973D4");
end:;
}
{ "sha256", test_sha256 },
{ "sha384", test_sha384 },
{ "sha512", test_sha512 },
- { "keccak224", test_keccak224 },
- { "keccak256", test_keccak256 },
- { "keccak384", test_keccak384 },
- { "keccak512", test_keccak512 },
- { "keccakStream", test_keccak_stream },
+ { "sha3-224", test_sha3_224 },
+ { "ska3-256", test_sha3_256 },
+ { "sha3-384", test_sha3_384 },
+ { "sha3-512", test_sha3_512 },
+ { "shake128", test_shake128 },
+ { "shake256", test_shake256 },
{ "hmac", test_hmac },
END_OF_TESTCASES
};
/** SHA512 message digest */
const struct DigestInfo *digest_SHA512(void);
-/** Keccak-224 message digest */
-const struct DigestInfo *digest_KECCAK224(void);
+/** SHA3-224 message digest */
+const struct DigestInfo *digest_SHA3_224(void);
-/** Keccak-256 message digest */
-const struct DigestInfo *digest_KECCAK256(void);
+/** SHA3-256 message digest */
+const struct DigestInfo *digest_SHA3_256(void);
-/** Keccak-384 message digest */
-const struct DigestInfo *digest_KECCAK384(void);
+/** SHA3-384 message digest */
+const struct DigestInfo *digest_SHA3_384(void);
-/** Keccak-512 message digest */
-const struct DigestInfo *digest_KECCAK512(void);
+/** SHA3-512 message digest */
+const struct DigestInfo *digest_SHA3_512(void);
-/** Keccak in arbitrary output length mode */
-const struct DigestInfo *digest_KECCAK_STREAM(void);
+/** SHAKE128 in regular digest mode */
+const struct DigestInfo *digest_SHAKE128(void);
+
+/** SHAKE256 in regular digest mode */
+const struct DigestInfo *digest_SHAKE256(void);
#endif
*/
#include <usual/crypto/keccak.h>
-#include <usual/crypto/digest.h>
#include <usual/bits.h>
#include <usual/endian.h>
+
#include <limits.h>
#include <string.h>
+/* For SHA3 variant of Keccak */
+#define KECCAK_ROUNDS 24
+
+/*
+ * Enforce minimal code size. If this is not defined, use
+ * faster unrolled implementation.
+ */
+/* #define KECCAK_SMALL */
+
+#ifdef KECCAK_SMALL
+#define KECCAK_64BIT
+#endif
+
/*
* Decide whether to use 64- or 32-bit implementation.
*/
+
#if !defined(KECCAK_64BIT) && !defined(KECCAK_32BIT)
+#if !defined(LONG_MAX) && !defined(UINTPTR_MAX)
+#error "Need LONG_MAX & UINTPTR_MAX"
+#endif
/* If neither is defined, try to autodetect */
#if (LONG_MAX > 0xFFFFFFFF) || (UINTPTR_MAX > 0xFFFFFFFF)
/* use 64-bit implementation if 'long' or 'uintptr_t' is 64-bit */
#endif
#endif
-/* For SHA3 variant of Keccak */
-#define KECCAK_ROUNDS 24
-
-
#ifdef KECCAK_64BIT
/*
UINT64_C(0x0000000080000001), UINT64_C(0x8000000080008008),
};
+#ifdef KECCAK_SMALL
+
+/*
+ * Minimal code implementation
+ */
+
+static const uint8_t RhoRot[24] = {
+ 1, 3, 6, 10, 15, 21, 28, 36, 45, 55, 2, 14, 27, 41, 56, 8, 25, 43, 62, 18, 39, 61, 20, 44
+};
+
+static const uint8_t PiLane[24] = {
+ 10, 7, 11, 17, 18, 3, 5, 16, 8, 21, 24, 4, 15, 23, 19, 13, 12, 2, 20, 14, 22, 9, 6, 1
+};
+
+static void keccak_f(struct KeccakContext *ctx)
+{
+ int i, j;
+ uint64_t *A = ctx->u.state64;
+ uint64_t tmpbuf[5 + 2], *tmp = tmpbuf + 1;
+ uint64_t d, c1, c2;
+
+ for (j = 0; j < KECCAK_ROUNDS; j++) {
+ /* Theta step */
+ for (i = 0; i < 5; i++)
+ tmp[i] = A[0*5 + i] ^ A[1*5 + i] ^ A[2*5 + i] ^ A[3*5 + i] ^ A[4*5 + i];
+ tmpbuf[0] = tmp[4];
+ tmpbuf[6] = tmp[0];
+ for (i = 0; i < 5; i++) {
+ d = tmp[i-1] ^ rol64(tmp[i+1], 1);
+ A[0 + i] ^= d;
+ A[5 + i] ^= d;
+ A[10 + i] ^= d;
+ A[15 + i] ^= d;
+ A[20 + i] ^= d;
+ }
+
+ /* Rho + Pi step */
+ c1 = A[PiLane[23]];
+ for (i = 0; i < 24; i++) {
+ c2 = A[PiLane[i]];
+ A[PiLane[i]] = rol64(c1, RhoRot[i]);
+ c1 = c2;
+ }
+
+ /* Chi step */
+ for (i = 0; i < 25; ) {
+ tmp[0] = A[i+0];
+ tmp[1] = A[i+1];
+
+ A[i] ^= ~A[i+1] & A[i+2]; i++;
+ A[i] ^= ~A[i+1] & A[i+2]; i++;
+ A[i] ^= ~A[i+1] & A[i+2]; i++;
+ A[i] ^= ~A[i+1] & tmp[0]; i++;
+ A[i] ^= ~tmp[0] & tmp[1]; i++;
+ }
+
+ /* Iota step */
+ A[0] ^= RoundConstants64[j];
+ }
+}
+
+#else /* !KECCAK_SMALL - fast 64-bit */
+
static void keccak_f(struct KeccakContext *ctx)
{
uint64_t *state = ctx->u.state64;
}
}
+#endif /* !KECCAK_SMALL */
+
static inline void xor_lane(struct KeccakContext *ctx, int lane, uint64_t val)
{
ctx->u.state64[lane] ^= val;
}
-static void extract(uint8_t *dst, const struct KeccakContext *ctx, int laneCount)
+static void extract(uint8_t *dst, const struct KeccakContext *ctx, int startLane, int laneCount)
{
- const uint64_t *src = ctx->u.state64;
+ const uint64_t *src = ctx->u.state64 + startLane;
while (laneCount--) {
le64enc(dst, *src++);
dst[1] ^= (x0 >> 16) | (x1 & 0xFFFF0000);
}
-static void extract(uint8_t *dst, const struct KeccakContext *ctx, int laneCount)
+static void extract(uint8_t *dst, const struct KeccakContext *ctx, int startLane, int laneCount)
{
- const uint32_t *src = ctx->u.state32;
+ const uint32_t *src = ctx->u.state32 + startLane * 2;
uint32_t t, x0, x1;
while (laneCount--) {
xor_lane(ctx, o, (uint64_t)(val) << s);
}
-static void add_bytes(struct KeccakContext *ctx, const uint8_t *p, unsigned int len)
+static void add_bytes(struct KeccakContext *ctx, const uint8_t *p, unsigned int ofs, unsigned int len)
{
uint64_t w;
- unsigned int m = ctx->bytes % 8;
+ unsigned int m = ofs % 8;
/* partial word */
if (m) {
if (m > len)
m = len;
while (m--) {
- xor_byte(ctx, ctx->bytes++, *p++);
+ xor_byte(ctx, ofs++, *p++);
len--;
}
}
/* full words */
while (len >= 8) {
w = le64dec(p);
- xor_lane(ctx, ctx->bytes / 8, w);
- ctx->bytes += 8;
+ xor_lane(ctx, ofs / 8, w);
+ ofs += 8;
p += 8;
len -= 8;
}
/* partial word */
while (len--)
- xor_byte(ctx, ctx->bytes++, *p++);
+ xor_byte(ctx, ofs++, *p++);
}
-static void reset(struct KeccakContext *ctx, int rbytes, int obytes)
+static void extract_bytes(struct KeccakContext *ctx, uint8_t *dst, unsigned int ofs, unsigned int count)
{
- memset(ctx, 0, sizeof(struct KeccakContext));
- ctx->rbytes = rbytes;
- ctx->obytes = obytes;
+ uint8_t lanebuf[8];
+ unsigned int n, avail;
+
+ if (ofs % 8 != 0 || count < 8) {
+ avail = 8 - ofs % 8;
+ n = (avail > count) ? count : avail;
+ extract(lanebuf, ctx, ofs/8, 1);
+ memcpy(dst, lanebuf + ofs%8, n);
+ dst += n;
+ ofs += n;
+ count -= n;
+ }
+
+ if (count > 8) {
+ n = count / 8;
+ extract(dst, ctx, ofs/8, n);
+ dst += n*8;
+ ofs += n*8;
+ count -= n*8;
+ }
+
+ if (count > 0) {
+ extract(lanebuf, ctx, ofs/8, 1);
+ memcpy(dst, lanebuf, count);
+ }
+
+ memset(lanebuf, 0, sizeof(lanebuf));
+}
+
+static inline void permute_if_needed(struct KeccakContext *ctx)
+{
+ if (ctx->pos == ctx->rbytes) {
+ keccak_f(ctx);
+ ctx->pos = 0;
+ }
}
/*
* Public API
*/
-void keccak224_init(struct KeccakContext *ctx)
+int keccak_init(struct KeccakContext *ctx, unsigned int capacity)
{
- reset(ctx, KECCAK224_BLOCK_SIZE, KECCAK224_DIGEST_LENGTH);
+ if (capacity % 8 != 0 || capacity < 8 || capacity > (1600 - 8))
+ return 0;
+ memset(ctx, 0, sizeof(struct KeccakContext));
+ ctx->rbytes = (1600 - capacity) / 8;
+ return 1;
}
-void keccak256_init(struct KeccakContext *ctx)
+void keccak_absorb(struct KeccakContext *ctx, const void *data, size_t len)
{
- reset(ctx, KECCAK256_BLOCK_SIZE, KECCAK256_DIGEST_LENGTH);
-}
+ unsigned int n, avail;
+ const uint8_t *src = data;
-void keccak384_init(struct KeccakContext *ctx)
-{
- reset(ctx, KECCAK384_BLOCK_SIZE, KECCAK384_DIGEST_LENGTH);
-}
+ while (len > 0) {
+ avail = ctx->rbytes - ctx->pos;
+ n = (len > avail) ? avail : len;
-void keccak512_init(struct KeccakContext *ctx)
-{
- reset(ctx, KECCAK512_BLOCK_SIZE, KECCAK512_DIGEST_LENGTH);
-}
+ add_bytes(ctx, src, ctx->pos, n);
-void keccak_stream_init(struct KeccakContext *ctx)
-{
- reset(ctx, KECCAK_STREAM_BLOCK_SIZE, KECCAK_STREAM_DIGEST_LENGTH);
+ src += n;
+ len -= n;
+ ctx->pos += n;
+
+ permute_if_needed(ctx);
+ }
}
-void keccak_update(struct KeccakContext *ctx, const void *data, unsigned int len)
+void keccak_squeeze(struct KeccakContext *ctx, uint8_t *dst, size_t len)
{
- unsigned int n;
- const uint8_t *ptr = data;
+ unsigned int avail, n;
while (len > 0) {
- n = ctx->rbytes - ctx->bytes;
- if (n > len)
- n = len;
- add_bytes(ctx, ptr, n);
- ptr += n;
+ avail = ctx->rbytes - ctx->pos;
+ n = (len > avail) ? avail : len;
+
+ extract_bytes(ctx, dst, ctx->pos, n);
+
+ ctx->pos += n;
+ dst += n;
len -= n;
- if (ctx->bytes == ctx->rbytes) {
- keccak_f(ctx);
- ctx->bytes = 0;
- }
+ permute_if_needed(ctx);
}
}
-void keccak_final(struct KeccakContext *ctx, uint8_t *dst)
+void keccak_squeeze_xor(struct KeccakContext *ctx, uint8_t *dst, const void *data, size_t len)
{
- if (!ctx->padded) {
- /* 2-bit padding, assumes bytes < rbytes */
- xor_byte(ctx, ctx->bytes, 0x01);
- xor_byte(ctx, ctx->rbytes - 1, 0x80);
- ctx->padded = 1;
- }
+ const uint8_t *src = data;
+ unsigned int n, avail, i;
- keccak_f(ctx);
+ while (len > 0) {
+ avail = ctx->rbytes - ctx->pos;
+ n = (len > avail) ? avail : len;
- if (ctx->obytes == KECCAK224_DIGEST_LENGTH) {
- /* 224-bit result uses partial words */
- uint8_t buf[KECCAK256_DIGEST_LENGTH];
- extract(buf, ctx, KECCAK256_DIGEST_LENGTH / 8);
- memcpy(dst, buf, KECCAK224_DIGEST_LENGTH);
- memset(buf, 0, sizeof(buf));
- } else {
- extract(dst, ctx, ctx->obytes / 8);
+ extract_bytes(ctx, dst, ctx->pos, n);
+ for (i = 0; i < n; i++)
+ dst[i] ^= src[i];
+
+ ctx->pos += n;
+ src += n;
+ dst += n;
+ len -= n;
+
+ permute_if_needed(ctx);
}
}
-/*
- * DigestInfo
- */
-
-const struct DigestInfo *digest_KECCAK224(void)
+void keccak_encrypt(struct KeccakContext *ctx, uint8_t *dst, const void *data, size_t len)
{
- static const struct DigestInfo info = {
- (DigestInitFunc *)keccak224_init,
- (DigestUpdateFunc *)keccak_update,
- (DigestFinalFunc *)keccak_final,
- sizeof(struct KeccakContext),
- KECCAK224_DIGEST_LENGTH,
- KECCAK224_BLOCK_SIZE
- };
- return &info;
+ const uint8_t *src = data;
+ unsigned int n, avail;
+
+ while (len > 0) {
+ avail = ctx->rbytes - ctx->pos;
+ n = (len > avail) ? avail : len;
+
+ add_bytes(ctx, src, ctx->pos, n);
+ extract_bytes(ctx, dst, ctx->pos, n);
+
+ ctx->pos += n;
+ src += n;
+ dst += n;
+ len -= n;
+
+ permute_if_needed(ctx);
+ }
}
-const struct DigestInfo *digest_KECCAK256(void)
+void keccak_decrypt(struct KeccakContext *ctx, uint8_t *dst, const void *data, size_t len)
{
- static const struct DigestInfo info = {
- (DigestInitFunc *)keccak256_init,
- (DigestUpdateFunc *)keccak_update,
- (DigestFinalFunc *)keccak_final,
- sizeof(struct KeccakContext),
- KECCAK256_DIGEST_LENGTH,
- KECCAK256_BLOCK_SIZE
- };
- return &info;
+ const uint8_t *src = data;
+ unsigned int n, avail, i;
+
+ while (len > 0) {
+ avail = ctx->rbytes - ctx->pos;
+ n = (len > avail) ? avail : len;
+
+ extract_bytes(ctx, dst, ctx->pos, n);
+ for (i = 0; i < n; i++)
+ dst[i] ^= src[i];
+ add_bytes(ctx, dst, ctx->pos, n);
+
+ ctx->pos += n;
+ src += n;
+ dst += n;
+ len -= n;
+
+ permute_if_needed(ctx);
+ }
}
-const struct DigestInfo *digest_KECCAK384(void)
+void keccak_pad(struct KeccakContext *ctx, const void *pad, size_t len)
{
- static const struct DigestInfo info = {
- (DigestInitFunc *)keccak384_init,
- (DigestUpdateFunc *)keccak_update,
- (DigestFinalFunc *)keccak_final,
- sizeof(struct KeccakContext),
- KECCAK384_DIGEST_LENGTH,
- KECCAK384_BLOCK_SIZE
- };
- return &info;
+ const uint8_t *src = pad;
+
+ if (len > 0) {
+ if (len > 1) {
+ keccak_absorb(ctx, src, len - 1);
+ src += len - 1;
+ }
+ xor_byte(ctx, ctx->pos, src[0]);
+ xor_byte(ctx, ctx->rbytes - 1, 0x80);
+ }
+ keccak_f(ctx);
+ ctx->pos = 0;
}
-const struct DigestInfo *digest_KECCAK512(void)
+void keccak_rewind(struct KeccakContext *ctx)
{
- static const struct DigestInfo info = {
- (DigestInitFunc *)keccak512_init,
- (DigestUpdateFunc *)keccak_update,
- (DigestFinalFunc *)keccak_final,
- sizeof(struct KeccakContext),
- KECCAK512_DIGEST_LENGTH,
- KECCAK512_BLOCK_SIZE
- };
- return &info;
+ ctx->pos = 0;
}
-const struct DigestInfo *digest_KECCAK_STREAM(void)
+void keccak_forget(struct KeccakContext *ctx)
{
- static const struct DigestInfo info = {
- (DigestInitFunc *)keccak_stream_init,
- (DigestUpdateFunc *)keccak_update,
- (DigestFinalFunc *)keccak_final,
- sizeof(struct KeccakContext),
- KECCAK_STREAM_DIGEST_LENGTH,
- KECCAK_STREAM_BLOCK_SIZE
- };
- return &info;
+ unsigned int rem = ctx->rbytes % 8;
+ uint8_t buf[8];
+
+ memset(ctx->u.state32, 0, ctx->rbytes - rem);
+ if (rem) {
+ extract_bytes(ctx, buf, ctx->rbytes - rem, rem);
+ add_bytes(ctx, buf, ctx->rbytes - rem, rem);
+ memset(buf, 0, sizeof(buf));
+ }
+ ctx->pos = 0;
}
/*
- * Keccak implementation for SHA3 parameters.
+ * Keccak implementation.
*
* Copyright (c) 2012 Marko Kreen
*
*/
/** @file
- * Keccak with SHA3 parameters.
+ * Simple API to Keccak1600 permutation + sponge.
*/
#ifndef _USUAL_CRYPTO_KECCAK_H_
#include <usual/base.h>
-/*
- * SHA3 fixed-length output modes.
- */
-
-/** Output length for 224-bit mode (in bytes) */
-#define KECCAK224_DIGEST_LENGTH (224/8)
-/** Output length for 256-bit mode (in bytes) */
-#define KECCAK256_DIGEST_LENGTH (256/8)
-/** Output length for 384-bit mode (in bytes) */
-#define KECCAK384_DIGEST_LENGTH (384/8)
-/** Output length for 512-bit mode (in bytes) */
-#define KECCAK512_DIGEST_LENGTH (512/8)
-
-/** Number of data bytes processed in one loop. */
-#define KECCAK224_BLOCK_SIZE (1152/8)
-/** Number of data bytes processed in one loop. */
-#define KECCAK256_BLOCK_SIZE (1088/8)
-/** Number of data bytes processed in one loop. */
-#define KECCAK384_BLOCK_SIZE (832/8)
-/** Number of data bytes processed in one loop. */
-#define KECCAK512_BLOCK_SIZE (576/8)
-
-/** Number of data bytes processed in one go. */
-#define KECCAK_STREAM_BLOCK_SIZE (1024/8)
-
-/**
- * Output length for stream mode (in bytes).
- *
- * This means output from single call to keccak_final().
- * It can be called repeatedly to get more output.
- */
-#define KECCAK_STREAM_DIGEST_LENGTH KECCAK_STREAM_BLOCK_SIZE
-
/**
* Keccak state structure for all modes.
*/
uint64_t state64[25];
uint32_t state32[2*25];
} u;
- uint16_t bytes; /* current number of bytes in buffer */
- uint16_t rbytes; /* number of bytes in one step */
- uint16_t obytes; /* output bytes */
- uint16_t padded; /* is padding added? */
+ uint32_t pos; /* current byte position in buffer */
+ uint32_t rbytes; /* rate (= block size) in bytes */
};
-/** SHA3 fixed length output mode. */
-void keccak224_init(struct KeccakContext *ctx);
+/**
+ * Set up state with specified capacity.
+ *
+ * Returns 1 if successful, 0 if invalid capacity.
+ */
+int keccak_init(struct KeccakContext *ctx, unsigned int capacity);
-/** SHA3 fixed length output mode. */
-void keccak256_init(struct KeccakContext *ctx);
+/**
+ * Hash additional data.
+ */
+void keccak_absorb(struct KeccakContext *ctx, const void *data, size_t len);
-/** SHA3 fixed length output mode. */
-void keccak384_init(struct KeccakContext *ctx);
+/**
+ * Extract bytes from state.
+ */
+void keccak_squeeze(struct KeccakContext *ctx, uint8_t *dst, size_t len);
-/** SHA3 fixed length output mode. */
-void keccak512_init(struct KeccakContext *ctx);
+/**
+ * Extract bytes from state, XOR into data.
+ */
+void keccak_squeeze_xor(struct KeccakContext *ctx, uint8_t *dst, const void *src, size_t len);
/**
- * SHA3 stream mode for Keccak.
- *
- * In stream mode, keccak_final() can be called repeatedly
- * to get output stream of unlimited length.
- *
- * On each call it outputs next 128 bytes (1024 bits).
+ * XOR data into state and return it.
*/
-void keccak_stream_init(struct KeccakContext *ctx);
+void keccak_encrypt(struct KeccakContext *ctx, uint8_t *dst, const void *src, size_t len);
/**
- * Hash additional data.
+ * XOR state with data and return it.
*/
-void keccak_update(struct KeccakContext *ctx, const void *data, unsigned int len);
+void keccak_decrypt(struct KeccakContext *ctx, uint8_t *dst, const void *src, size_t len);
/**
- * Return final result.
- *
- * Output length depends on mode. See KECCAK*_DIGEST_LENGTH
- * constants to get length for particular mode.
+ * Hash pad suffix.
+ */
+void keccak_pad(struct KeccakContext *ctx, const void *data, size_t len);
+
+/**
+ * Move internal position to start of buffer.
*
- * In stream mode, this can be called repeatedly.
+ * Useful for PRNG/duplex modes.
*/
-void keccak_final(struct KeccakContext *ctx, uint8_t *dst);
+void keccak_rewind(struct KeccakContext *ctx);
+
+/**
+ * Clear rate bits.
+ */
+void keccak_forget(struct KeccakContext *ctx);
+
#endif
--- /dev/null
+/*
+ * SHA3 implementation.
+ *
+ * Copyright (c) 2014 Marko Kreen
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include <usual/crypto/sha3.h>
+#include <usual/crypto/digest.h>
+
+#define PAD_SHA3 0x06
+#define PAD_SHAKE 0x1f
+
+void sha3_224_reset(struct SHA3Context *ctx)
+{
+ keccak_init(&ctx->kctx, SHA3_224_CAPACITY);
+ ctx->padded = 0;
+ ctx->obytes = SHA3_224_DIGEST_LENGTH;
+ ctx->pad = PAD_SHA3;
+}
+
+void sha3_256_reset(struct SHA3Context *ctx)
+{
+ keccak_init(&ctx->kctx, SHA3_256_CAPACITY);
+ ctx->padded = 0;
+ ctx->obytes = SHA3_256_DIGEST_LENGTH;
+ ctx->pad = PAD_SHA3;
+}
+
+void sha3_384_reset(struct SHA3Context *ctx)
+{
+ keccak_init(&ctx->kctx, SHA3_384_CAPACITY);
+ ctx->padded = 0;
+ ctx->obytes = SHA3_384_DIGEST_LENGTH;
+ ctx->pad = PAD_SHA3;
+}
+
+void sha3_512_reset(struct SHA3Context *ctx)
+{
+ keccak_init(&ctx->kctx, SHA3_512_CAPACITY);
+ ctx->padded = 0;
+ ctx->obytes = SHA3_512_DIGEST_LENGTH;
+ ctx->pad = PAD_SHA3;
+}
+
+void shake128_reset(struct SHA3Context *ctx)
+{
+ keccak_init(&ctx->kctx, SHAKE128_CAPACITY);
+ ctx->padded = 0;
+ ctx->obytes = SHAKE128_DIGEST_LENGTH;
+ ctx->pad = PAD_SHAKE;
+}
+
+void shake256_reset(struct SHA3Context *ctx)
+{
+ keccak_init(&ctx->kctx, SHAKE256_CAPACITY);
+ ctx->padded = 0;
+ ctx->obytes = SHAKE256_DIGEST_LENGTH;
+ ctx->pad = PAD_SHAKE;
+}
+
+void sha3_update(struct SHA3Context *ctx, const void *ptr, unsigned len)
+{
+ keccak_absorb(&ctx->kctx, ptr, len);
+}
+
+void sha3_final(struct SHA3Context *ctx, void *dst)
+{
+ if (!ctx->padded) {
+ keccak_pad(&ctx->kctx, &ctx->pad, 1);
+ ctx->padded = 1;
+ }
+ keccak_squeeze(&ctx->kctx, dst, ctx->obytes);
+}
+
+void shake_update(struct SHA3Context *ctx, const void *ptr, unsigned len)
+{
+ keccak_absorb(&ctx->kctx, ptr, len);
+}
+
+void shake_extract(struct SHA3Context *ctx, void *dst, unsigned count)
+{
+ if (!ctx->padded) {
+ keccak_pad(&ctx->kctx, &ctx->pad, 1);
+ ctx->padded = 1;
+ }
+ keccak_squeeze(&ctx->kctx, dst, count);
+}
+
+/*
+ * DigestInfo
+ */
+
+static const struct DigestInfo sha3_224_info = {
+ (DigestInitFunc *)sha3_224_reset,
+ (DigestUpdateFunc *)sha3_update,
+ (DigestFinalFunc *)sha3_final,
+ sizeof(struct SHA3Context),
+ SHA3_224_DIGEST_LENGTH,
+ SHA3_224_BLOCK_SIZE
+};
+
+static const struct DigestInfo sha3_256_info = {
+ (DigestInitFunc *)sha3_256_reset,
+ (DigestUpdateFunc *)sha3_update,
+ (DigestFinalFunc *)sha3_final,
+ sizeof(struct SHA3Context),
+ SHA3_256_DIGEST_LENGTH,
+ SHA3_256_BLOCK_SIZE
+};
+
+static const struct DigestInfo sha3_384_info = {
+ (DigestInitFunc *)sha3_384_reset,
+ (DigestUpdateFunc *)sha3_update,
+ (DigestFinalFunc *)sha3_final,
+ sizeof(struct SHA3Context),
+ SHA3_384_DIGEST_LENGTH,
+ SHA3_384_BLOCK_SIZE
+};
+
+static const struct DigestInfo sha3_512_info = {
+ (DigestInitFunc *)sha3_512_reset,
+ (DigestUpdateFunc *)sha3_update,
+ (DigestFinalFunc *)sha3_final,
+ sizeof(struct SHA3Context),
+ SHA3_512_DIGEST_LENGTH,
+ SHA3_512_BLOCK_SIZE
+};
+
+static const struct DigestInfo shake128_info = {
+ (DigestInitFunc *)shake128_reset,
+ (DigestUpdateFunc *)sha3_update,
+ (DigestFinalFunc *)sha3_final,
+ sizeof(struct SHA3Context),
+ SHAKE128_DIGEST_LENGTH,
+ SHAKE128_BLOCK_SIZE
+};
+
+static const struct DigestInfo shake256_info = {
+ (DigestInitFunc *)shake256_reset,
+ (DigestUpdateFunc *)sha3_update,
+ (DigestFinalFunc *)sha3_final,
+ sizeof(struct SHA3Context),
+ SHAKE256_DIGEST_LENGTH,
+ SHAKE256_BLOCK_SIZE
+};
+
+const struct DigestInfo *digest_SHA3_224(void)
+{
+ return &sha3_224_info;
+}
+
+const struct DigestInfo *digest_SHA3_256(void)
+{
+ return &sha3_256_info;
+}
+
+const struct DigestInfo *digest_SHA3_384(void)
+{
+ return &sha3_384_info;
+}
+
+const struct DigestInfo *digest_SHA3_512(void)
+{
+ return &sha3_512_info;
+}
+
+const struct DigestInfo *digest_SHAKE128(void)
+{
+ return &shake128_info;
+}
+
+const struct DigestInfo *digest_SHAKE256(void)
+{
+ return &shake256_info;
+}
+
--- /dev/null
+/*
+ * SHA3 implementation.
+ *
+ * Copyright (c) 2014 Marko Kreen
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#ifndef _USUAL_CRYPTO_SHA3_H_
+#define _USUAL_CRYPTO_SHA3_H_
+
+#include <usual/crypto/keccak.h>
+
+#define SHA3_224_CAPACITY 448
+#define SHA3_256_CAPACITY 512
+#define SHA3_384_CAPACITY 768
+#define SHA3_512_CAPACITY 1024
+#define SHAKE128_CAPACITY 256
+#define SHAKE256_CAPACITY 512
+
+#define SHA3_224_DIGEST_LENGTH (224/8)
+#define SHA3_256_DIGEST_LENGTH (256/8)
+#define SHA3_384_DIGEST_LENGTH (384/8)
+#define SHA3_512_DIGEST_LENGTH (512/8)
+#define SHAKE128_DIGEST_LENGTH (256/8)
+#define SHAKE256_DIGEST_LENGTH (512/8)
+
+#define SHA3_224_BLOCK_SIZE ((1600 - SHA3_224_CAPACITY) / 8)
+#define SHA3_256_BLOCK_SIZE ((1600 - SHA3_256_CAPACITY) / 8)
+#define SHA3_384_BLOCK_SIZE ((1600 - SHA3_384_CAPACITY) / 8)
+#define SHA3_512_BLOCK_SIZE ((1600 - SHA3_512_CAPACITY) / 8)
+#define SHAKE128_BLOCK_SIZE ((1600 - SHAKE128_CAPACITY) / 8)
+#define SHAKE256_BLOCK_SIZE ((1600 - SHAKE256_CAPACITY) / 8)
+
+struct SHA3Context {
+ struct KeccakContext kctx;
+ bool padded;
+ uint8_t pad;
+ unsigned int obytes;
+};
+
+void sha3_224_reset(struct SHA3Context *ctx);
+void sha3_256_reset(struct SHA3Context *ctx);
+void sha3_384_reset(struct SHA3Context *ctx);
+void sha3_512_reset(struct SHA3Context *ctx);
+void sha3_update(struct SHA3Context *ctx, const void *ptr, unsigned len);
+void sha3_final(struct SHA3Context *ctx, void *dst);
+
+void shake128_reset(struct SHA3Context *ctx);
+void shake256_reset(struct SHA3Context *ctx);
+void shake_update(struct SHA3Context *ctx, const void *ptr, unsigned len);
+void shake_extract(struct SHA3Context *ctx, void *dst, unsigned count);
+
+#endif
+