diff --git a/doc/crypt.tex b/doc/crypt.tex
index fc879fa9a..622e7ee12 100644
--- a/doc/crypt.tex
+++ b/doc/crypt.tex
@@ -2998,6 +2998,7 @@ \subsection{Hash Registration}
\hline RIPEMD-256 & rmd160\_desc & 32 & 13 \\
\hline BLAKE2S-256 & blake2s\_256\_desc & 32 & 24 \\
\hline BLAKE2B-256 & blake2b\_256\_desc & 32 & 26 \\
+ \hline SM3 & sm3\_desc & 32 & 34 \\
\hline SHA-512/224 & sha512\_224\_desc & 28 & 15 \\
\hline Keccak224 & keccak\_224\_desc & 28 & 29 \\
\hline SHA3-224 & sha3\_224\_desc & 28 & 17 \\
@@ -3224,7 +3225,7 @@ \subsection{KangarooTwelve}
These hashes are provided for completeness and they still can be used for the purposes of password hashing or one-way accumulators
(e.g. Yarrow).
-The other hashes such as the SHA-2 (that includes SHA-512, SHA-512/384, SHA-384, SHA-512/256, SHA-256 and SHA-224), TIGER-192 and TIGER2-192 are still
+The other hashes such as the SHA-2 (that includes SHA-512, SHA-512/384, SHA-384, SHA-512/256, SHA-256 and SHA-224), SM3, TIGER-192 and TIGER2-192 are still
considered secure for all purposes you would normally use a hash for.
\chapter{Checksum Functions}
diff --git a/libtomcrypt_VS2008.vcproj b/libtomcrypt_VS2008.vcproj
index 987f3a33e..27868ef6f 100644
--- a/libtomcrypt_VS2008.vcproj
+++ b/libtomcrypt_VS2008.vcproj
@@ -903,6 +903,10 @@
RelativePath="src\hashes\sha3_test.c"
>
+
+
diff --git a/makefile.mingw b/makefile.mingw
index 1d3135eec..1f9c3e013 100644
--- a/makefile.mingw
+++ b/makefile.mingw
@@ -73,7 +73,7 @@ src/hashes/sha1_desc.o src/hashes/sha1_x86.o src/hashes/sha2/sha224.o src/hashes
src/hashes/sha2/sha224_x86.o src/hashes/sha2/sha256.o src/hashes/sha2/sha256_desc.o \
src/hashes/sha2/sha256_x86.o src/hashes/sha2/sha384.o src/hashes/sha2/sha512.o \
src/hashes/sha2/sha512_224.o src/hashes/sha2/sha512_256.o src/hashes/sha3.o src/hashes/sha3_test.o \
-src/hashes/tiger.o src/hashes/whirl/whirl.o src/mac/blake2/blake2bmac.o \
+src/hashes/sm3.o src/hashes/tiger.o src/hashes/whirl/whirl.o src/mac/blake2/blake2bmac.o \
src/mac/blake2/blake2bmac_file.o src/mac/blake2/blake2bmac_memory.o \
src/mac/blake2/blake2bmac_memory_multi.o src/mac/blake2/blake2bmac_test.o src/mac/blake2/blake2smac.o \
src/mac/blake2/blake2smac_file.o src/mac/blake2/blake2smac_memory.o \
diff --git a/makefile.msvc b/makefile.msvc
index 5770c4682..5d92f6e4b 100644
--- a/makefile.msvc
+++ b/makefile.msvc
@@ -66,7 +66,7 @@ src/hashes/sha1_desc.obj src/hashes/sha1_x86.obj src/hashes/sha2/sha224.obj src/
src/hashes/sha2/sha224_x86.obj src/hashes/sha2/sha256.obj src/hashes/sha2/sha256_desc.obj \
src/hashes/sha2/sha256_x86.obj src/hashes/sha2/sha384.obj src/hashes/sha2/sha512.obj \
src/hashes/sha2/sha512_224.obj src/hashes/sha2/sha512_256.obj src/hashes/sha3.obj src/hashes/sha3_test.obj \
-src/hashes/tiger.obj src/hashes/whirl/whirl.obj src/mac/blake2/blake2bmac.obj \
+src/hashes/sm3.obj src/hashes/tiger.obj src/hashes/whirl/whirl.obj src/mac/blake2/blake2bmac.obj \
src/mac/blake2/blake2bmac_file.obj src/mac/blake2/blake2bmac_memory.obj \
src/mac/blake2/blake2bmac_memory_multi.obj src/mac/blake2/blake2bmac_test.obj src/mac/blake2/blake2smac.obj \
src/mac/blake2/blake2smac_file.obj src/mac/blake2/blake2smac_memory.obj \
diff --git a/makefile.unix b/makefile.unix
index 5130bef3b..349610ef0 100644
--- a/makefile.unix
+++ b/makefile.unix
@@ -87,7 +87,7 @@ src/hashes/sha1_desc.o src/hashes/sha1_x86.o src/hashes/sha2/sha224.o src/hashes
src/hashes/sha2/sha224_x86.o src/hashes/sha2/sha256.o src/hashes/sha2/sha256_desc.o \
src/hashes/sha2/sha256_x86.o src/hashes/sha2/sha384.o src/hashes/sha2/sha512.o \
src/hashes/sha2/sha512_224.o src/hashes/sha2/sha512_256.o src/hashes/sha3.o src/hashes/sha3_test.o \
-src/hashes/tiger.o src/hashes/whirl/whirl.o src/mac/blake2/blake2bmac.o \
+src/hashes/sm3.o src/hashes/tiger.o src/hashes/whirl/whirl.o src/mac/blake2/blake2bmac.o \
src/mac/blake2/blake2bmac_file.o src/mac/blake2/blake2bmac_memory.o \
src/mac/blake2/blake2bmac_memory_multi.o src/mac/blake2/blake2bmac_test.o src/mac/blake2/blake2smac.o \
src/mac/blake2/blake2smac_file.o src/mac/blake2/blake2smac_memory.o \
diff --git a/makefile_include.mk b/makefile_include.mk
index b849f810d..702ff5a1d 100644
--- a/makefile_include.mk
+++ b/makefile_include.mk
@@ -258,7 +258,7 @@ src/hashes/sha1_desc.o src/hashes/sha1_x86.o src/hashes/sha2/sha224.o src/hashes
src/hashes/sha2/sha224_x86.o src/hashes/sha2/sha256.o src/hashes/sha2/sha256_desc.o \
src/hashes/sha2/sha256_x86.o src/hashes/sha2/sha384.o src/hashes/sha2/sha512.o \
src/hashes/sha2/sha512_224.o src/hashes/sha2/sha512_256.o src/hashes/sha3.o src/hashes/sha3_test.o \
-src/hashes/tiger.o src/hashes/whirl/whirl.o src/mac/blake2/blake2bmac.o \
+src/hashes/sm3.o src/hashes/tiger.o src/hashes/whirl/whirl.o src/mac/blake2/blake2bmac.o \
src/mac/blake2/blake2bmac_file.o src/mac/blake2/blake2bmac_memory.o \
src/mac/blake2/blake2bmac_memory_multi.o src/mac/blake2/blake2bmac_test.o src/mac/blake2/blake2smac.o \
src/mac/blake2/blake2smac_file.o src/mac/blake2/blake2smac_memory.o \
diff --git a/notes/hash_tv.txt b/notes/hash_tv.txt
index c9f8e72a7..21c01fd5a 100644
--- a/notes/hash_tv.txt
+++ b/notes/hash_tv.txt
@@ -6053,6 +6053,137 @@ Hash: md4
127: 2067886DA4BDE10A94B971CD740B0AAB
128: E1275970EB67D2D996E6E658270AA149
+Hash: sm3
+ 0: 1AB21D8355CFA17F8E61194831E81A8F22BEC8C728FEFB747ED035EB5082AA2B
+ 1: 2DAEF60E7A0B8F5E024C81CD2AB3109F2B4F155CF83ADEB2AE5532F74A157FDF
+ 2: D8AABBEF65E6196AE1106FDDF48CDD0FD6EEE7FF54CD678F209B4914426B0221
+ 3: D18C17EF9F985BA361F06B599A1EC3CAE9BD5DE6967CAC33944E5F8B67B6DCC2
+ 4: 4B41BC3558731767A4B19187A64F8D171878EF5A45BFD73670815C2C66387D75
+ 5: 96EDA336EB22EE830F1D1354CE363872497171A3EAC3CDF1D251C88BD4D28D2F
+ 6: 728ED1FF1C9FF55249889985CB21187D6E4F9516CC5CDBA5F7CCE79F5FF12DF9
+ 7: F4AFC6E2843C2B00DE925B36259E386659BB727CFC528016F434E2D79AE46E7B
+ 8: 6C79B88EE30D03CB22B842BFCC15A18F839F70EAADBD3BDA953C6AA31092F83B
+ 9: D9260EB16F78E835EAD5B02FCA32321439FAFFC1763507DF21B3848EEAD70E73
+ 10: 24C898BDB4D258F9BEBB2E820D4ED478A7C013B37BD9E5006515730C18A70416
+ 11: 25982ABCAF86A30979CFBD4F86C76F2A3160F916CA0301A55C1B48DB89C8D7C5
+ 12: B1A7B180FFD9147FA043ACFE6C794E902656C502B4F241B01F9DE1229562205B
+ 13: 65721525FCA963BFB01D5250A032AD3FC15F5D3B1E591906E892F8ABD4499A5E
+ 14: 386D2B4DCB208DB57B938C345338BDBEC61547EED302ECD273992A64876155D7
+ 15: C706E492B6994B610A4B62ABA68E797772AB5DC2764EC35980DBA24734CA2EB1
+ 16: F65C16E869F79670DEE45F4B56FE2B3E0308D8FEFC3214E16C64B7F5D3741E89
+ 17: 431F00611D6EDCBAEB4C53C8F94148478A894E34383984F6D3BC45D144EF1B1C
+ 18: FE4C9FF5DEF43DD8A6E1EED798AE1515871BAF70FDE50A7F9AA3391C53604FF3
+ 19: 674ED992C21A2842673AF768EB51374790252097CA545F426AF6F898865BA903
+ 20: 54001A49B4CD4275A032A257405FF7CB0CB8B396DD9D8D4D387F4A5840EE0C13
+ 21: 6C9206FB7D349AC74D44352A4F5203F800AF34C1AEA8F1CF8C6AC491317DD1B5
+ 22: 6A4C8E752F5D4B4774FC5CE600260B727DEF2850A2D4BC470E63E6E728DE9D7B
+ 23: A4F9221FF5E44E68CFA1576CF37A57BC7EAA1FC365BEAC7D369C414770DC3FBE
+ 24: D5CD0C791215BB022B7A07FE60A947AB436A4EC1CBC29CA60824A57CC6074CE1
+ 25: 52BE7FD40C801C55380473D80AE191B273BB90F4750180F12C84B92F0378E102
+ 26: 1B3F4246B2AD89AF381FAD9D993BAB24CCAC205576594D292489836F45E7038D
+ 27: 41903C7B3EA1F3F63FE734F54998682C97723336AF661DC988919FF7C0D8ECF0
+ 28: B268AF3A3971754C8DF859C6A91BFDE7929CAE0C4F4CB08826990F02574D7E95
+ 29: 137E134DCAF4348C629347DB5626DC85FEC2A9312B6B379CD2ACEF43D073983B
+ 30: 65333197B21CDE07F4A452656CE2EF447CAC4EB56AE0F25FA9AB1551A52A2E58
+ 31: 182C11FF061A611473BB2357FB422EDEC582C80837CB0A838B43761E81E528CF
+ 32: FA34635F1D3AC2729AC5987EB59E01928457F325B4B51CA85A177813C5C5DDF7
+ 33: D2D8FE4545DA9CD3AFD31D31425FA2B3CDE043C6B40DB542B81683C20303CD21
+ 34: 09276AF3F77A8F06F9A3F84DD05DEFE5704F4B4A51FA27CB9EC162085037AE33
+ 35: 36D1655C6F37FF56626234E8934B8922A66B978C78ADCAD8234D6A66C201F29D
+ 36: 3CE6E59BCB3B3EE8581E34EA5A92CD5C5D03C877A54ED9C8CEFF188125FC765D
+ 37: 2FF022CEC2F8D6C474C86237E747983D0833EB65A435925FCE17E780E4D83404
+ 38: CF021C2A028F8101AB8173E35DEE507F5BE2FB2F133BEBF4AC6F1A3C420986F9
+ 39: 51C501B8F6F85B3C36B630171F857E58622DAD1CAFE296D2371187F24D307A7E
+ 40: 9D96C19358BBC611B74B1844A69E12931884879CC2267245FE940B11662F905E
+ 41: 42248EEAA80C20C2181D982E2C612C422A483866BE662766B754D4090D19BBAD
+ 42: C1EFBEDE74C4FF558DD39C550AD0C078CD42D10B5183CA4CF626B1C8A7504802
+ 43: 5474CD859A1CE6B80B04F40ADE7E010BD26AEED4BE01978DCED46445FEE8F93D
+ 44: 7E20B15A795D8278C911C8E8FEFC2A4DCF57BDE011DD9AD9F32A0FE758A829F3
+ 45: E36DCBAC4C65F93D23F83FFA5F9FA8F6F542F96DC957A2952FF50C1836C7E1D7
+ 46: 791E088D7D0A769E47CA3CFBC99723C549078E389D687D0E9A4F13EC6BA5457C
+ 47: E14485A2627415801FEDBCC1C34A6C3312940126EF62A90D94BBBE5E694CA89D
+ 48: 7EC11F122FA8D8858B6D4296B25E941D2C2FBD1E583D47B7EA24CFC9E4035A9A
+ 49: 8E13771E93C4181F1970BD92B9F8E349EB9C69F780D8E1BB0409B092F0122937
+ 50: F24CEF726525070D3B44EA309A6A03396B22F6C48F0DDDD99539AC4DC62CE4EC
+ 51: 9731C326383BDD50E2AC8BE14E8B04418CECB904502F888658EC3AB27C44D926
+ 52: 4BFEF43CD2AA9BD40275DE4DD7E6E41CFC9090D2C5EBE1C96D00F336E287A925
+ 53: 2A5FD61773794FD7C959FFB29256C1C9A9C028CA1E4F1F2F5224C002B766989A
+ 54: 1BB1B592239447B5DE0395D94159996EA7CC4FCC7B9F66CCC5F0CFDC89586782
+ 55: A79CF9DCEE3404ABF7F769698201647FD9D3FF61D629D0F58BB4B5579A427DB8
+ 56: 62F7363B15F4DE76DD925C493B9D6D00D4BA0EF2A1F334C1D0F13B293AEB40D1
+ 57: 441F67CC31781DD2986FC612B92DFADE871D81357F2487F5C86D94A8C6778D82
+ 58: B4242D2BDE6758049D6BF3AC979CFBFA8590C8F9A964BAA53F4DE3529E958CE8
+ 59: FE83EBD916FA2EFE514556D3F3410D5C571D26B97722517D182626D1E8D67D65
+ 60: F886E1C50D032C1B893A53200F5D2C0DBC9B486CB0EEA56FBBB63A35BEAD01B0
+ 61: CF232D81E9C18D7CABD90EEBD871C81A69BDF378AC06E49C2E8EFF969B75B670
+ 62: 84932BAEBBA0FF9E1506788E6CFEFE7E6FA6B2E7132242B91417E1C5DB4F7706
+ 63: 6165E4CBB15CDE01C6226E0015A47F710F8F8E1F2C296700033BB34D9212109C
+ 64: 93566F236D157AAE078D1DDB5CEBDBBA1520B5142E22A8915564345BA2AE1D63
+ 65: C886E6814BE748285A10B28AE62DDACD85DB830CD2CF3A2BFA2F729C15F63618
+ 66: E844F6E566C8E40CA5E650B938C4EA3C1EBB3F16A714F51F3303A089C09F9E62
+ 67: CFD56A9CD3AB872B2E3893011341330B921513790C938BF09603F6DA2EC0520C
+ 68: 879E8707EB2F72C8FAE188F026486B3F0864B5EC43B7968FC516D3DB91AD72E5
+ 69: DA5887C018000EDCF53D3E1E0B300FDB6619130A9D99EB5B80170D3308BF1036
+ 70: 5EA935C5BC7A7D1F0A05865D059F9DE99D9C21CACAEE6335D896C386F2380F1A
+ 71: C4424CF106704451159FBF8AB1B69C0DCA84FBFF9D186702FDA7A99D1FD2DC77
+ 72: C10B8C332565AB5A91C09BBB6E6E0187824CC5AEE0A2F9C607DA3B6DE15F9456
+ 73: 807624E5CB1BC14F514C9F7C4FF1235D02B4FB9C8CEECE3458B20DACADD9BE0E
+ 74: C2B0AEEB41EEDFB383D1137F6C84D0331254ECAA1E1108E7D6C3F19BC28AA90C
+ 75: B5C1A6629434D8E47F192C10B79562D390CB91754755AFFF4DD6824AA9ECDA63
+ 76: C6D12158451A0C2B14DDF34D2A512065F338D8B57EA821591B67C6A7D1F9BC5E
+ 77: 0311B0CE52BC5DBE8C837EA76D6D6259C2F4FCDC6C7BD2E16D78B67AB4149B8F
+ 78: 470739A11C5C5EB5860A0450AEB696AFC7EBF24DD95DC555E99B279FDD88B06F
+ 79: 7F57AD909EF4F62D7E762BBE1C9C3F18C4CCAF37805995CE86FABB7C762D1FF6
+ 80: 9A1198BAD957F2E411297E1D17B627AFB6C842437C0ADE5879EA249021D1F0CD
+ 81: 7FC44253FA19DDE0A9FE8B116A0D01BF95A3077440C1A5D11B9614B6429DF505
+ 82: F056FFB3833ACD0379144757E9816953AB097191533DC8A57AFFD1D127B38C4A
+ 83: CCD3FA40CC2D2114A5E9B3325F6584A4DF488E1B34BA3E2D1528327A36F352A9
+ 84: 04203C3B8F1FFD61FF3D0134C6172D39C97B94B962B2ED7BE70070F0996DA57A
+ 85: 157CA56DB5039FB8BF536DADEA456EED976AE7DB54372EF71750852A1BF0542C
+ 86: 910BA7725F46EE646C270C7E82C5CFD2C9066FC0D88FB2820BA963C26DF1F465
+ 87: 867441F91E3CA3E5EA5DB6269B8E30BAF5F6FD2BD56FB3FB715D4A8C7810CC71
+ 88: 6701746ADDF00166C676CBA3F6CEC7BE379119C00F11011537ACD99BDB3CE0C7
+ 89: 6D6E112EEC5B237AF3927A9A2ABFE7E4669FC15C5AD379D072D32B1D255BDCFB
+ 90: 986F414001210C8F32AA79DBE9EF3D7375E75C51271B7A04B366C67AAE1E4C87
+ 91: 4AE6B2E1F2461A55CF44D92390BAA0492333A9F25645CBE1352CFBC5B42AFA2B
+ 92: 6A529A8E765E6988300F495E9B73A651C28E39892F0B31B4D5C43FAEB06F3870
+ 93: 2228C5374B0B93CBBA4D4012362C6207AD2FF0CFA0DA0C5FE5622772B1885976
+ 94: 2DAD3FA1D4856E95B67B261A5EBF6C5AFF149C5A7BCA25130940CA9E70CB6251
+ 95: 6529643CE86E9FAF589409403F6DE23908FB91499C8AD09805AAD6C7F3EC5751
+ 96: 2EDBD8866011F112124F30774E9CE85E3BEA3C2CCF98FD8757046A2943DA59B6
+ 97: 2B987812D4479D2F095A5A22AAE0B8A77A1BDECDEBDA16DCB987CF3974003E81
+ 98: 95BE171D4DC68DC32DA1DD5A1A31808C0A324A8FEAA4044F0CBE7304F4B3603E
+ 99: 7D4EAC94A68E328B800BE8D9BB1772C268450B7A3C9959D0729F036CDB8B8BB6
+100: 4B2833C158DD41614B76E37F18889243BD6B4A744E36DE60920A2F89E409C64E
+101: B0992CB78BE5CDA48BF503DE1D3B4EF88AEFFF54EE6CF8A2BE14CA48BC400D55
+102: 0CD08EAA77E6A6F48E1E4A9371C17EC66B5D3B27A28A00E93D633CB68097CC4E
+103: 30821BF5C6770CB2071A04BC764FFC859EE9FD51149A0FBF6F45FCACE6523D44
+104: 67916A4F629B6CCC733EDDE300D316EB405BC04E7D381738456E2AF39601DC70
+105: AAC90FA00921904EF66D6BDF92DC29F478E1D394CC4E8ECC68F71882062380FA
+106: DBF54DC0B588C2DE7DD9FF941868873D60222E77990C16CA2892B32B326EFFC6
+107: FE698FFCFAA632E75EA1B943889ED4D090E91E846AFC78053C8B72D8019C56F8
+108: 3FAACA4E09E7667DEAAB83ECB6D430E9DF80C0D1F69B05981DA052D6A0BCD977
+109: 32302DB834A491D160AAF5C0A66AD90CFAFEEA5855E6D0283BA331B66777DA46
+110: F3214C9CCA8FA3682D22660A541625D55F2B3B7D7B56362A861D4A1C75056E36
+111: 46EA8FF040518238FB6E34B688209BDCD18B31672C4BA28271045F8C8C312733
+112: 1C7B0125F4F56AA3E7104B10B25CE1C98E7668720F9A9E2EB21B6DE36BBC62E7
+113: 2C828958C3F34A2587DF239F258F52B3ECB599F67E96A4064DA2D4FA1A955F2C
+114: CFDD1BEF2646546BC6FEE51B84AE9A056A1F3D3FF404F719C5EA889AAD00594A
+115: A02A9AFC0B47E0F4E79924CD3FD2A9E242664360172B61298486D0CC6A9583CA
+116: 7708158049314AFDEB7C9B23B18E27F556D480057AAE126114167688B2D5EE0F
+117: 8990E02F7553F6077D6DA698CA76688E64F52FFC93A975085D2FD36D9541A2F9
+118: 28470FFDEC4F1C82E0A09F1D2A771DFB0D785F7119E401B6E5A42029DFC88C32
+119: 8F3EA392A89A7119982D6634660DB1A95F35D68267A2235E3255998A857F4FBF
+120: 6BABEE35E6A1515AF9D6255109C24F3C08897829422C6225D235FD4C8527E9EC
+121: 501BF851D9377E2F02E6DC2DA58795B5A7337D94EFBEA64BCBAF0B3DF11E240C
+122: 00825B1AB35F89279C4869826C159F5910CFFDE3AE20AAB7BCA13EC8263E12E5
+123: 722D468220D61A129D766E589968B196E4136B39C4E83B5CA215050C4CC7107A
+124: 76ABE4F014C7CAF037FC6B87529F8031DBA51F55BA3C00C61C8AAAD666C43098
+125: 60434971512E75B7325472797C7B11BC4932EC6561050EBF8A38698BDDC84B76
+126: 07F7BA45D5551D5DBD3C3926619235A7EE880396D67A63398053DA8E3376BCDB
+127: BCA3436D828517A6A6893A9E309E06E7B7B29C6E3F78B4814B23EFE149962980
+128: A9E7985473CA09DF1510D83B572F72375430756C4A661B00724AFEB8B75DD0A5
+
Hash: chc_hash
0: 4047929F1F572643B55F829EB3291D11
1: 8898FD04F810507740E7A8DBF44C18E8
diff --git a/notes/hashsum_tv.txt b/notes/hashsum_tv.txt
index 2bf53d300..4f9654147 100644
--- a/notes/hashsum_tv.txt
+++ b/notes/hashsum_tv.txt
@@ -29,6 +29,7 @@ sha384: 7cc080c662524617e56d5a49f1c185909e9b1858a86684161ddd97fc5426f693b53f59d7
sha512: f90afe4d254716a9770fd2c4f29ca544f2975f961cbd7fa207117383e4e48f7a2e1ade4aac333a2cb8c227dd6af2fff4d87c31c2a3916ae24d507c7c94c21818 *tests/test.key
sha512-224: 64ec566b5c2de736eab1b4e8542dc110f736819ea7f8f48e3712fbad *tests/test.key
sha512-256: db880bce4beb7246510febb961c7595aab57a15de6f90cd079f145e476b5d773 *tests/test.key
+sm3: e03629750a6e6be2b1be1dde48b83be44a7ff19f1cbe3d9bcab540aa2b7e4d6c *tests/test.key
tiger: 97d713850e7affac30a642572c1ee7b18793d5b9e0ef5932 *tests/test.key
tiger2: b2dfd53b3edba5b54e1f21a82cbf6a3475efbce33a8cae03 *tests/test.key
whirlpool: d7d41c755e0f28313f254cb198e0bfa42f56670595d97b80dceec754825d69938a9c11e5bf16e9a3809a62a09bddf021f3dbff4302ceec7ba46c88b41772b711 *tests/test.key
diff --git a/notes/hmac_tv.txt b/notes/hmac_tv.txt
index 17270fe3f..5cd0cea25 100644
--- a/notes/hmac_tv.txt
+++ b/notes/hmac_tv.txt
@@ -6053,6 +6053,137 @@ HMAC-md4
127: F7DEAF52378FF735B2D171B17EF573D8
128: B4FA8DFD3AD4C88EABC8505D4901B057
+HMAC-sm3
+ 0: FDA7C78D15984D8771F59F20A69D195C6E237070D37EC962E167326E517433DB
+ 1: 617D49CB0D2E65E6D40338631AA35620A150669B14D3B36BECFA3B4A04610EA9
+ 2: F0F69EBA9D1F9F0A76F9C7B2E690BDE43DDC49009B820D8E0126C2ECFAE426AB
+ 3: 43D562376EBACD17A91696FEA0FD06D7AB5B88A8845208B7405797469AF4E9C0
+ 4: 6F9776F31DAEA542D1FE17D9E8F03B22F420C71506E048C97E11C61270B092E8
+ 5: 1C99064F49994C32ADAAAB111B0F537EB892449065B47E10B6B4B4CE8D58051E
+ 6: 321DC2AF96E4B6C90FD2924E9436CAAFB13FF98FD7C00F32D66F6A99E256F7C7
+ 7: 21AB9DC39C31DDFD06D8A6A4120A022BEC1B9FF85C7BA5982A12C540558D7843
+ 8: 2220C299409746CE30B3BB1E15022ABB72B1519D5F20B7AB3FF3D861E0503BCD
+ 9: 8EDEA1BD3178A5B23013A603F518EF883C9E3F3C8B427B0DA59865072841557B
+ 10: F0F23D78EB6D6052EA520D40BF8634EB3F4CE9AE505D0B61232B97DF61264CAC
+ 11: 352E0D68D3D30E799BE200EA8B2DAF47278292C45D1787BCFCA1BEDEF8986DF4
+ 12: 7A0C0AD88D42EFF62A705D52EAE0967DD1FCCC12D97F1D7F7B4F024E90847E38
+ 13: D6B74CEAF3A49AB888C874352051DC9B84020DF8EFBC8C16C2AB3410C5DF17E2
+ 14: B8CFEC6CBDD7C6E40EEFABADFC535B2AC371D80FB7EAAC58A6AD1A741A5F94FA
+ 15: B4D0E042DBFEAED267D122A725D9AD0AE1C0811F27941854CC24FE87F8BB3122
+ 16: 87FA1B3991FDCDDBAE670776DD787424923047CCA18F5908F0DBC11A8032DDF5
+ 17: DC56D1C961A832B23691D0017FD0F25E9239643AFE9F168483EB3750FEDD2268
+ 18: E232D251E702732F4AB7D698A157E398078835E8E5FD30D14A54E5BC46E8F292
+ 19: 4D7F888B9E635C1189AF264004D442FDA65A4C40E461AEE8E5ABD4DFE6EC0B9F
+ 20: 55CBB73B388DC86C1831A37093967FF15D986D8DDD0CA61189D80D6D8A87A667
+ 21: 04FD2A4221EE565012A39216A66DCBC50FA259BFA470C89388EDFD3B8F6C21EA
+ 22: 7662B2B11A159E3C453D1A96C3EB60BC92CFC9F34E08BF5EE017A2517BB9CC02
+ 23: 0F954E8B243AED1DCEC72E563B02CBFFC032F91C613010332CD7BAC1D1E3D24E
+ 24: 4030CA3461619B9D8A5F38B20CD2D29458A3F036FD274056027B3645DF858F63
+ 25: 2123F1819732FA2A6785DA76D304764AEBC15CE5C1C4F4FBE441EDE7F23D821B
+ 26: 7CA7D551BDFDE5CC42A4BA2EDEAA493753AEECE03730364B1B977CB2654B9C67
+ 27: 27A57C09732E9B727848CD085098BE3E4AC6B8C94EF424384B4CB1E8DAE3EC41
+ 28: 7AA2574C5CEA298E2F62D1E555B3995AD94A33C0D6B4ED1E0A5F4491C4BB8D9B
+ 29: 96204A4D5C49A08E6DF8C586837A5FBE84C524145DF28461158CF8ED16DC49D0
+ 30: 797F92BA0573B7B50D79B74A5918927DA02A13E45B8BF2C40824852417743503
+ 31: 95A1E1510DD9F71E9CC5D9E98A5605B106C0B2E700E4DF30C753F2C01C702191
+ 32: 627D1EC821E89223D52ED8160606118712F9ED8157348726625F6395AA35346F
+ 33: A77D4DDC40FF552F6DB39B8907AF3C548ACF9D32D6A809E34E9A554802D0D15C
+ 34: 2AB412A14044430F4680FD090881CDAF0DE6FD2D3D60A925A8C3DD0662D8E30C
+ 35: FDEC326A6197D103C445940DB1FB7AA2BC7D6F92B2685139BBDB4B915FF141F5
+ 36: C026D1871252E156F29689F10586BFC3E0EE3F93FFEE580010BC4A4AE1880961
+ 37: 708E875DF37FE36144A46C623A36FD24018078F6585ABF4F09C0326C8B18C253
+ 38: DEB6B61641523D57335E5F66B5B324F6649B86119A7D7C5E6603DE55D5D6BB30
+ 39: 70F97D866A1183ED59E38D866B28BC570B9AD2A40A2EDF39464A32B10D474F40
+ 40: B790F4A66BED45EA332BD096F68FE8F63B5B0ECD2FAA247B0636A7F62574D7D1
+ 41: 2D938A0D7F1E9309AB1A519BCD57AC206063738CD4EED18332505D8849CFC356
+ 42: 366C9828FA31E8B4F5691ADAA1E72AC80B8463A3E374A5087EB29ECE18761EF8
+ 43: 0B95346AD2C489A79BF7275CA27E57A59CCF925B8D7D6455C00725A6A091E5BB
+ 44: 84A7E62264AA7750E3C01D737015493A00090DE9EAA1100BD23B70586FE89BF5
+ 45: 2382C631C93761326B36061BA2320AAE3AE86DF1C6971D5CA0346BBCAA133DA8
+ 46: 2A1174BD21D53783B778F74BCDD9F7E23D3756C0ABC04A82510C9FBAEA2C972C
+ 47: 8FEF6E55EC97B90C32E369C6C3BE9FBB67BA161D586AD22C91A59EF37B53D33C
+ 48: 8196E30D810E3B8572DC442176983E91F2FCAF6B30EF7DE43509709C699CA901
+ 49: 6CE3EEA9753B3494ECE17A04C2078F87172A6630DA80C50E3927BCE9754523B6
+ 50: 38483A4449FDA7DED6CCE12AA646189805EA24789512653A1D6A6C9B0519F9A8
+ 51: 34F239065041B4A0D8C0B322761D9B10AEE2564C34D4873B0E679EB4A6CF6461
+ 52: 67DE337F86BC9F19D0EC034188932CDCFDB9A558130D5FE6DB4043725A8D3EDA
+ 53: 7127E9B9B4B72B7DB676D89584EBE27D7393F3FCAB96E52FBFF7ACF0E1B638A2
+ 54: 1F595D3EC2CBB70548146D06B23094247D5FD21A85ABC61368321D9656481E3F
+ 55: 8747F4684BF950AF1C6C9C91927108E7F28D6A0CF85E6B9CF7A579356C89C10E
+ 56: 75F5648852677892870B21D7CFCD1F99F6C3DB24EFA44D5B9271525D8BF6A2AF
+ 57: 1827E88B3FD984B7C527A6E38CB775BD088478BF89B76C6C4670E24D550500A5
+ 58: FDC378293FF9CD28E26409E228F8E2FEDCD2FE103B2664F66698438B90E24344
+ 59: A5919F1DC6D328B7E91F57EEF4AE1806EDC2EC39980642C32B5DBB7FED341A13
+ 60: FB5CAB3098A9C9464A86C529F83FC55029478AEFFCB2747E81071DBDCBD8CB07
+ 61: BBB3D6EFCD7024C4B5EBC8E6E1462888CCD05C6A5D54FDA480E3E4DC70E697F7
+ 62: 45024D25E0B4BE45704B0BB0FA75DF3D35912F9E9851D8F4EC6152C8B7329AE6
+ 63: 77A369C752335EE25F1CEFB5CCFEA5338832059E9C973868EABA30B238A49138
+ 64: E29DD2084287275FED87809068165B3BCA7DC3C40E74BD77E862079AA7134426
+ 65: 82CAAD784EB51C22E1275B653E88C4A0E54CC32B071553612718C5897D5F5BC7
+ 66: F5B374CF37D8880594F6B6193D0732309E55E68EAD7A1526BD275FD2B705CBE1
+ 67: EFF15666D4E39457C611B2BBF569F74056594778E4F812D51F9E8E74439F35BF
+ 68: 66E16B57F8279454B3F7DD44970E8DDCF6560F3066117E13CD1C2A1D771F1E87
+ 69: 4B9D7831322C1238BA57B6774359A22D2C69F646CFC5BE66E8943EFFF2287889
+ 70: 6CAA665C55B0D237AA647A499A82C7334F551B456F5841884CFFBCAF60F3A036
+ 71: EF5CE22D8AB45A933631EDAA542D568D83780169808C954E052D810FB3E33330
+ 72: 9B64571987EDC852F762B0B7D182F5F0253B3B52BC639C16B6121E96FD578E67
+ 73: 076B0DF0333BB5EC7AE694EF1B803700A27A1B59DBDB9A429E91EFB4EBB0DE1F
+ 74: 8C9CAA85D262C2BD03126B60161EE34B7DF152314ACAE843EB50D85870DAFE9F
+ 75: 81C4B1DB61FECE8691E6C7C7C8EAF540BB96589D90DFE1AC1553F7C70F0127DC
+ 76: F0CBC76277EF1E2A80A30081F5B96EE1E671986B52FD8E0A7EDB6059E210D7A0
+ 77: 2815C4A53030ED946006FA06C1E2B8111D434BFF9ABFD18B8C76DBE51511A3C1
+ 78: A87B8819CDC21A993C1D456878F7A402BF8FC517F0C8784CB882C4E6E2245413
+ 79: B014D6565ED29088B5AEB1323DD08BDA6776695B1800878C91FAEAEB05EB2A1A
+ 80: 7F472FA85204CF5F484DF4D5C52CC391BD4DBA24DA07BFC82C3F870796C2B795
+ 81: 8DE428F49F03F0F6BACF0EBCA947FAF916B2466061D6EC1898316E0AD2716D40
+ 82: F1F807A356C9209CF2649E5DEB6A4C357841548AD82B239617A11D94EF6261F3
+ 83: FC1FC2303153AC696E88FEEDA6879C4DD104DE2E7174599A21BE594896F30714
+ 84: 197F79D306A358927A78F0D71C85B9295071385B7CDD96A8034BF4FEDED9DE25
+ 85: 99DB23774C0D04F81F2E9188DCE28628BF3BC5B04610AC56CC6B116042DD0794
+ 86: 158A3B8B4C3EF4E80971CCD6BD2F013042C263407691A2BAC357158797466F00
+ 87: 77DF54967B43EDEE572BFE345CD9257A525D81F27AC15F0D7821E8FE7A9A30E9
+ 88: 4D699FA49D84CC0C4B99052108575AFCA5E392D120CFE3703C39436EAED5A171
+ 89: 90E4507A00187A72752E87ACD68665A90EBD1D1B6B01DEC924A25270EEB7C39D
+ 90: ADB4298548F9F99CCCFB2ECB31A6A843A74361FF48B1C60D2733EDB8B7962B21
+ 91: A6AF395014B32E38E8412C242FDF2F680C5CDA058750027B23F52492615E54C7
+ 92: E4A454D0A5AC0003D5EF4FC924890AF27DFBE5B882ADD8AD0F8CEB1422EED0EE
+ 93: BC79E235F3176A7DE9A1D7CF7363FCF8C92F42B520F613F4E8E613F914B90CCC
+ 94: 7CFEF638B210C64DB3D4AF304BE75699236E4706933A17B33EB19B74AB071638
+ 95: 9B1B80D29662A927AA6E18C29CB7C4C344C252D9BA5C524B1E8801F8F3BD7E27
+ 96: DABDF3450AC41C3FF33B2F8673372C06F52FBB5DF164B96C5A32F8C06EF14158
+ 97: A2BAD8C4A44D1731C9DC610518628BA43EBE49540C5F72D74C0FBA3B534486C7
+ 98: FFBF8FB40057112AA05D84FBACF2105A92F9CDCA5AA39E8CB91F68936F8B9292
+ 99: AA92083B20D9DC114CFB154384926BAF36BF435AFA037C5687AE4B26589E57BF
+100: D9F588A127C332A147B24A7D4A207ACE3C7B2BB01F136ACE869525803404F8E1
+101: 1EDC2C83147428DB0C0C226B0A92901DAD66B8D1C1E995C7AFE16CD328BE1D50
+102: 91C72518543373893805E3B9974315D0728476C5E5D551FC909BD2A32F96F9E5
+103: 73DA6EB942A9146992F089BBA9167D9D175E6A7E9705FD40841F23BEBA923E37
+104: 7F477EF5C2CCDBDE7257EB670BE18B943FBB8CDEC0C681C02575FD9477566862
+105: 4ACB9C29DEEF8B5058582CAC99C8106686DC8B14D3DD4D8CD057B5CDE3182416
+106: 6806370A302599727B3B2C93EDEAE06155568F82FDAA6A768776B382887ADDBA
+107: 35B38613156EF52C643A4CCD427DA0415563C481ED1933F6A08D19B9F3E4965F
+108: D7EF3FFBB64D1EDA0E052505C88340D5488D60EE8F877A1ED65C01C3FFF88838
+109: 3D486B2407C38F60D40866C6FE2BC6FFAA2778297BD2442488F9FFC323051E1E
+110: 3777FDD5F2F2E9A8B0053AF2573AE885ACEBAE28F24F3A56777FF877716AD7DF
+111: EF076FD597E88ECB8A6E535D3DFABF2B4D13B34AF0DDA28AD89EFDD1618B9D66
+112: 19D6FFFAE75E20781CA08F3E5351C77826C6DC298AAC96D4124C3A488565E4B5
+113: F10FDDF2236CF7CD9E32FBC3C4E44664AC855CE42D5676D46BCF21507C7FD7A4
+114: D5873662FDF61D85D14D7E74B6B7779EDC9236DD774EA8FE60561944F593E48E
+115: 3ED1A43C031FF6A991FF1FB3F5196C41D131B0387D70789DC4B5ED32956CB258
+116: 7E4DEF340CFC9BC59FDD03D8AE55EAC078726CAE561403CED0227C184E6667F7
+117: 3E72B9A2835309A6556D275F4E9AB6F3C35657B451FB9670D10CB7288F55BB89
+118: 6242C423C03C058C5294ADCB959F0FF62FC0819696EF7F2AEE0A93A57FA934D8
+119: 1B6C1DAB2B50E92A74D016CD136CE4B2B8BA6EC0DA8AB97CA7F16FAFA914F8D0
+120: E511EA25C6C73696889E5480BEFBAA2401DECBEDDC1F87BED9EC48808C8AC003
+121: FD59BDB6357F877EB28500E09AD721B65ADEEC4854522E7A1288E90D95DB146E
+122: A772599D4F1EBE527D80C1132589F0E9C1B8649C60CB551B126DD7772B537E8B
+123: 28D3590C54883B8D8ED6707486D209AB1A2A25411E30D128FC1A43F6119C54DF
+124: C9838385D4E9DAC898798E08F96367E0190FAF240EB3AAA8E1989A06FD55229D
+125: 10B281D771D85DC89B766FBE9AF19B1584F6A2214E5A5B8D682299648C53F7D3
+126: DAF8137A6A6EF0827838570D4A48A75C02246C9BCA6E94B19CB5737BBC7B0367
+127: CD2986F99AEC715AA580BE75AD1735C985506247A57C5FC51C03E60B3631D4C9
+128: 2762E9366F3C017AE2AC0ED01ECEDCFD6907A3BCEE9B00A8458FB5833225FCCA
+
HMAC-chc_hash
0: 0607F24D43AA98A86FCC45B53DA04F9D
1: BE4FB5E0BC4BD8132DB14BCBD7E4CD10
diff --git a/sources.cmake b/sources.cmake
index 38c5d9b25..82383087d 100644
--- a/sources.cmake
+++ b/sources.cmake
@@ -115,6 +115,7 @@ src/hashes/sha2/sha512_224.c
src/hashes/sha2/sha512_256.c
src/hashes/sha3.c
src/hashes/sha3_test.c
+src/hashes/sm3.c
src/hashes/tiger.c
src/hashes/whirl/whirl.c
src/hashes/whirl/whirltab.c
diff --git a/src/hashes/sm3.c b/src/hashes/sm3.c
new file mode 100644
index 000000000..acc73aee6
--- /dev/null
+++ b/src/hashes/sm3.c
@@ -0,0 +1,423 @@
+/* LibTomCrypt, modular cryptographic library -- Tom St Denis */
+/* SPDX-License-Identifier: Unlicense */
+#include "tomcrypt_private.h"
+
+/**
+ @file sm3.c
+ SM3 hash function (GM/T 0004-2012)
+
+ Based on the Crypto++ implementation by Jeffrey Walton and Han Lulu,
+ which was placed in the public domain.
+ Also see https://tools.ietf.org/html/draft-shen-sm3-hash
+*/
+
+#ifdef LTC_SM3
+
+const struct ltc_hash_descriptor sm3_desc =
+{
+ "sm3", /* name of hash */
+ 34, /* internal ID */
+ 32, /* Size of digest in octets */
+ 64, /* Input block size in octets */
+ {1,2,156,10197,1,401}, /* ASN.1 OID 1.2.156.10197.1.401 */
+ 6, /* Length OID */
+ &sm3_init,
+ &sm3_process,
+ &sm3_done,
+ &sm3_test,
+ NULL
+};
+
+/* Permutation functions */
+static LTC_INLINE ulong32 s_sm3_P0(ulong32 X)
+{
+ return X ^ ROLc(X, 9) ^ ROLc(X, 17);
+}
+
+static LTC_INLINE ulong32 s_sm3_P1(ulong32 X)
+{
+ return X ^ ROLc(X, 15) ^ ROLc(X, 23);
+}
+
+/* Message expansion */
+static LTC_INLINE ulong32 s_sm3_EE(ulong32 W0, ulong32 W7, ulong32 W13, ulong32 W3, ulong32 W10)
+{
+ return s_sm3_P1(W0 ^ W7 ^ ROLc(W13, 15)) ^ ROLc(W3, 7) ^ W10;
+}
+
+/* Boolean functions for rounds 0-15 */
+#define FF0(X, Y, Z) ((X) ^ (Y) ^ (Z))
+#define GG0(X, Y, Z) ((X) ^ (Y) ^ (Z))
+
+/* Boolean functions for rounds 16-63 */
+#define FF1(X, Y, Z) (((X) & (Y)) | (((X) | (Y)) & (Z)))
+#define GG1(X, Y, Z) ((Z) ^ ((X) & ((Y) ^ (Z))))
+
+/* Round function for rounds 0-15 */
+#define R1(A, B, C, D, E, F, G, H, TJ, Wi, Wj) do { \
+ const ulong32 A12 = ROLc((A), 12); \
+ const ulong32 TT0 = ROLc(A12 + (E) + (TJ), 7); \
+ const ulong32 TT1 = FF0((A), (B), (C)) + (D) + (TT0 ^ A12) + (Wj); \
+ const ulong32 TT2 = GG0((E), (F), (G)) + (H) + TT0 + (Wi); \
+ (B) = ROLc((B), 9); \
+ (D) = TT1; \
+ (F) = ROLc((F), 19); \
+ (H) = s_sm3_P0(TT2); \
+} while(0)
+
+/* Round function for rounds 16-63 */
+#define R2(A, B, C, D, E, F, G, H, TJ, Wi, Wj) do { \
+ const ulong32 A12 = ROLc((A), 12); \
+ const ulong32 TT0 = ROLc(A12 + (E) + (TJ), 7); \
+ const ulong32 TT1 = FF1((A), (B), (C)) + (D) + (TT0 ^ A12) + (Wj); \
+ const ulong32 TT2 = GG1((E), (F), (G)) + (H) + TT0 + (Wi); \
+ (B) = ROLc((B), 9); \
+ (D) = TT1; \
+ (F) = ROLc((F), 19); \
+ (H) = s_sm3_P0(TT2); \
+} while(0)
+
+static int s_sm3_compress(hash_state *md, const unsigned char *buf)
+{
+ ulong32 A, B, C, D, E, F, G, H;
+ ulong32 W00, W01, W02, W03, W04, W05, W06, W07;
+ ulong32 W08, W09, W10, W11, W12, W13, W14, W15;
+
+ /* load state */
+ A = md->sm3.state[0];
+ B = md->sm3.state[1];
+ C = md->sm3.state[2];
+ D = md->sm3.state[3];
+ E = md->sm3.state[4];
+ F = md->sm3.state[5];
+ G = md->sm3.state[6];
+ H = md->sm3.state[7];
+
+ /* load message block (big-endian) */
+ LOAD32H(W00, buf + 0); LOAD32H(W01, buf + 4);
+ LOAD32H(W02, buf + 8); LOAD32H(W03, buf + 12);
+ LOAD32H(W04, buf + 16); LOAD32H(W05, buf + 20);
+ LOAD32H(W06, buf + 24); LOAD32H(W07, buf + 28);
+ LOAD32H(W08, buf + 32); LOAD32H(W09, buf + 36);
+ LOAD32H(W10, buf + 40); LOAD32H(W11, buf + 44);
+ LOAD32H(W12, buf + 48); LOAD32H(W13, buf + 52);
+ LOAD32H(W14, buf + 56); LOAD32H(W15, buf + 60);
+
+ /* rounds 0-15 (R1) */
+ R1(A, B, C, D, E, F, G, H, 0x79CC4519UL, W00, W00 ^ W04);
+ W00 = s_sm3_EE(W00, W07, W13, W03, W10);
+ R1(D, A, B, C, H, E, F, G, 0xF3988A32UL, W01, W01 ^ W05);
+ W01 = s_sm3_EE(W01, W08, W14, W04, W11);
+ R1(C, D, A, B, G, H, E, F, 0xE7311465UL, W02, W02 ^ W06);
+ W02 = s_sm3_EE(W02, W09, W15, W05, W12);
+ R1(B, C, D, A, F, G, H, E, 0xCE6228CBUL, W03, W03 ^ W07);
+ W03 = s_sm3_EE(W03, W10, W00, W06, W13);
+ R1(A, B, C, D, E, F, G, H, 0x9CC45197UL, W04, W04 ^ W08);
+ W04 = s_sm3_EE(W04, W11, W01, W07, W14);
+ R1(D, A, B, C, H, E, F, G, 0x3988A32FUL, W05, W05 ^ W09);
+ W05 = s_sm3_EE(W05, W12, W02, W08, W15);
+ R1(C, D, A, B, G, H, E, F, 0x7311465EUL, W06, W06 ^ W10);
+ W06 = s_sm3_EE(W06, W13, W03, W09, W00);
+ R1(B, C, D, A, F, G, H, E, 0xE6228CBCUL, W07, W07 ^ W11);
+ W07 = s_sm3_EE(W07, W14, W04, W10, W01);
+ R1(A, B, C, D, E, F, G, H, 0xCC451979UL, W08, W08 ^ W12);
+ W08 = s_sm3_EE(W08, W15, W05, W11, W02);
+ R1(D, A, B, C, H, E, F, G, 0x988A32F3UL, W09, W09 ^ W13);
+ W09 = s_sm3_EE(W09, W00, W06, W12, W03);
+ R1(C, D, A, B, G, H, E, F, 0x311465E7UL, W10, W10 ^ W14);
+ W10 = s_sm3_EE(W10, W01, W07, W13, W04);
+ R1(B, C, D, A, F, G, H, E, 0x6228CBCEUL, W11, W11 ^ W15);
+ W11 = s_sm3_EE(W11, W02, W08, W14, W05);
+ R1(A, B, C, D, E, F, G, H, 0xC451979CUL, W12, W12 ^ W00);
+ W12 = s_sm3_EE(W12, W03, W09, W15, W06);
+ R1(D, A, B, C, H, E, F, G, 0x88A32F39UL, W13, W13 ^ W01);
+ W13 = s_sm3_EE(W13, W04, W10, W00, W07);
+ R1(C, D, A, B, G, H, E, F, 0x11465E73UL, W14, W14 ^ W02);
+ W14 = s_sm3_EE(W14, W05, W11, W01, W08);
+ R1(B, C, D, A, F, G, H, E, 0x228CBCE6UL, W15, W15 ^ W03);
+ W15 = s_sm3_EE(W15, W06, W12, W02, W09);
+
+ /* rounds 16-63 (R2) */
+ R2(A, B, C, D, E, F, G, H, 0x9D8A7A87UL, W00, W00 ^ W04);
+ W00 = s_sm3_EE(W00, W07, W13, W03, W10);
+ R2(D, A, B, C, H, E, F, G, 0x3B14F50FUL, W01, W01 ^ W05);
+ W01 = s_sm3_EE(W01, W08, W14, W04, W11);
+ R2(C, D, A, B, G, H, E, F, 0x7629EA1EUL, W02, W02 ^ W06);
+ W02 = s_sm3_EE(W02, W09, W15, W05, W12);
+ R2(B, C, D, A, F, G, H, E, 0xEC53D43CUL, W03, W03 ^ W07);
+ W03 = s_sm3_EE(W03, W10, W00, W06, W13);
+ R2(A, B, C, D, E, F, G, H, 0xD8A7A879UL, W04, W04 ^ W08);
+ W04 = s_sm3_EE(W04, W11, W01, W07, W14);
+ R2(D, A, B, C, H, E, F, G, 0xB14F50F3UL, W05, W05 ^ W09);
+ W05 = s_sm3_EE(W05, W12, W02, W08, W15);
+ R2(C, D, A, B, G, H, E, F, 0x629EA1E7UL, W06, W06 ^ W10);
+ W06 = s_sm3_EE(W06, W13, W03, W09, W00);
+ R2(B, C, D, A, F, G, H, E, 0xC53D43CEUL, W07, W07 ^ W11);
+ W07 = s_sm3_EE(W07, W14, W04, W10, W01);
+ R2(A, B, C, D, E, F, G, H, 0x8A7A879DUL, W08, W08 ^ W12);
+ W08 = s_sm3_EE(W08, W15, W05, W11, W02);
+ R2(D, A, B, C, H, E, F, G, 0x14F50F3BUL, W09, W09 ^ W13);
+ W09 = s_sm3_EE(W09, W00, W06, W12, W03);
+ R2(C, D, A, B, G, H, E, F, 0x29EA1E76UL, W10, W10 ^ W14);
+ W10 = s_sm3_EE(W10, W01, W07, W13, W04);
+ R2(B, C, D, A, F, G, H, E, 0x53D43CECUL, W11, W11 ^ W15);
+ W11 = s_sm3_EE(W11, W02, W08, W14, W05);
+ R2(A, B, C, D, E, F, G, H, 0xA7A879D8UL, W12, W12 ^ W00);
+ W12 = s_sm3_EE(W12, W03, W09, W15, W06);
+ R2(D, A, B, C, H, E, F, G, 0x4F50F3B1UL, W13, W13 ^ W01);
+ W13 = s_sm3_EE(W13, W04, W10, W00, W07);
+ R2(C, D, A, B, G, H, E, F, 0x9EA1E762UL, W14, W14 ^ W02);
+ W14 = s_sm3_EE(W14, W05, W11, W01, W08);
+ R2(B, C, D, A, F, G, H, E, 0x3D43CEC5UL, W15, W15 ^ W03);
+ W15 = s_sm3_EE(W15, W06, W12, W02, W09);
+
+ R2(A, B, C, D, E, F, G, H, 0x7A879D8AUL, W00, W00 ^ W04);
+ W00 = s_sm3_EE(W00, W07, W13, W03, W10);
+ R2(D, A, B, C, H, E, F, G, 0xF50F3B14UL, W01, W01 ^ W05);
+ W01 = s_sm3_EE(W01, W08, W14, W04, W11);
+ R2(C, D, A, B, G, H, E, F, 0xEA1E7629UL, W02, W02 ^ W06);
+ W02 = s_sm3_EE(W02, W09, W15, W05, W12);
+ R2(B, C, D, A, F, G, H, E, 0xD43CEC53UL, W03, W03 ^ W07);
+ W03 = s_sm3_EE(W03, W10, W00, W06, W13);
+ R2(A, B, C, D, E, F, G, H, 0xA879D8A7UL, W04, W04 ^ W08);
+ W04 = s_sm3_EE(W04, W11, W01, W07, W14);
+ R2(D, A, B, C, H, E, F, G, 0x50F3B14FUL, W05, W05 ^ W09);
+ W05 = s_sm3_EE(W05, W12, W02, W08, W15);
+ R2(C, D, A, B, G, H, E, F, 0xA1E7629EUL, W06, W06 ^ W10);
+ W06 = s_sm3_EE(W06, W13, W03, W09, W00);
+ R2(B, C, D, A, F, G, H, E, 0x43CEC53DUL, W07, W07 ^ W11);
+ W07 = s_sm3_EE(W07, W14, W04, W10, W01);
+ R2(A, B, C, D, E, F, G, H, 0x879D8A7AUL, W08, W08 ^ W12);
+ W08 = s_sm3_EE(W08, W15, W05, W11, W02);
+ R2(D, A, B, C, H, E, F, G, 0x0F3B14F5UL, W09, W09 ^ W13);
+ W09 = s_sm3_EE(W09, W00, W06, W12, W03);
+ R2(C, D, A, B, G, H, E, F, 0x1E7629EAUL, W10, W10 ^ W14);
+ W10 = s_sm3_EE(W10, W01, W07, W13, W04);
+ R2(B, C, D, A, F, G, H, E, 0x3CEC53D4UL, W11, W11 ^ W15);
+ W11 = s_sm3_EE(W11, W02, W08, W14, W05);
+ R2(A, B, C, D, E, F, G, H, 0x79D8A7A8UL, W12, W12 ^ W00);
+ W12 = s_sm3_EE(W12, W03, W09, W15, W06);
+ R2(D, A, B, C, H, E, F, G, 0xF3B14F50UL, W13, W13 ^ W01);
+ W13 = s_sm3_EE(W13, W04, W10, W00, W07);
+ R2(C, D, A, B, G, H, E, F, 0xE7629EA1UL, W14, W14 ^ W02);
+ W14 = s_sm3_EE(W14, W05, W11, W01, W08);
+ R2(B, C, D, A, F, G, H, E, 0xCEC53D43UL, W15, W15 ^ W03);
+ W15 = s_sm3_EE(W15, W06, W12, W02, W09);
+
+ R2(A, B, C, D, E, F, G, H, 0x9D8A7A87UL, W00, W00 ^ W04);
+ W00 = s_sm3_EE(W00, W07, W13, W03, W10);
+ R2(D, A, B, C, H, E, F, G, 0x3B14F50FUL, W01, W01 ^ W05);
+ W01 = s_sm3_EE(W01, W08, W14, W04, W11);
+ R2(C, D, A, B, G, H, E, F, 0x7629EA1EUL, W02, W02 ^ W06);
+ W02 = s_sm3_EE(W02, W09, W15, W05, W12);
+ R2(B, C, D, A, F, G, H, E, 0xEC53D43CUL, W03, W03 ^ W07);
+ W03 = s_sm3_EE(W03, W10, W00, W06, W13);
+ R2(A, B, C, D, E, F, G, H, 0xD8A7A879UL, W04, W04 ^ W08);
+ R2(D, A, B, C, H, E, F, G, 0xB14F50F3UL, W05, W05 ^ W09);
+ R2(C, D, A, B, G, H, E, F, 0x629EA1E7UL, W06, W06 ^ W10);
+ R2(B, C, D, A, F, G, H, E, 0xC53D43CEUL, W07, W07 ^ W11);
+ R2(A, B, C, D, E, F, G, H, 0x8A7A879DUL, W08, W08 ^ W12);
+ R2(D, A, B, C, H, E, F, G, 0x14F50F3BUL, W09, W09 ^ W13);
+ R2(C, D, A, B, G, H, E, F, 0x29EA1E76UL, W10, W10 ^ W14);
+ R2(B, C, D, A, F, G, H, E, 0x53D43CECUL, W11, W11 ^ W15);
+ R2(A, B, C, D, E, F, G, H, 0xA7A879D8UL, W12, W12 ^ W00);
+ R2(D, A, B, C, H, E, F, G, 0x4F50F3B1UL, W13, W13 ^ W01);
+ R2(C, D, A, B, G, H, E, F, 0x9EA1E762UL, W14, W14 ^ W02);
+ R2(B, C, D, A, F, G, H, E, 0x3D43CEC5UL, W15, W15 ^ W03);
+
+ /* feedback */
+ md->sm3.state[0] ^= A;
+ md->sm3.state[1] ^= B;
+ md->sm3.state[2] ^= C;
+ md->sm3.state[3] ^= D;
+ md->sm3.state[4] ^= E;
+ md->sm3.state[5] ^= F;
+ md->sm3.state[6] ^= G;
+ md->sm3.state[7] ^= H;
+
+ return CRYPT_OK;
+}
+
+/**
+ Initialize the hash state
+ @param md The hash state you wish to initialize
+ @return CRYPT_OK if successful
+*/
+int sm3_init(hash_state * md)
+{
+ LTC_ARGCHK(md != NULL);
+ md->sm3.state[0] = 0x7380166FUL;
+ md->sm3.state[1] = 0x4914B2B9UL;
+ md->sm3.state[2] = 0x172442D7UL;
+ md->sm3.state[3] = 0xDA8A0600UL;
+ md->sm3.state[4] = 0xA96F30BCUL;
+ md->sm3.state[5] = 0x163138AAUL;
+ md->sm3.state[6] = 0xE38DEE4DUL;
+ md->sm3.state[7] = 0xB0FB0E4EUL;
+ md->sm3.curlen = 0;
+ md->sm3.length = 0;
+ return CRYPT_OK;
+}
+
+/**
+ Process a block of memory though the hash
+ @param md The hash state
+ @param in The data to hash
+ @param inlen The length of the data (octets)
+ @return CRYPT_OK if successful
+*/
+HASH_PROCESS(sm3_process, s_sm3_compress, sm3, 64)
+
+/**
+ Terminate the hash to get the digest
+ @param md The hash state
+ @param out [out] The destination of the hash (32 bytes)
+ @return CRYPT_OK if successful
+*/
+int sm3_done(hash_state * md, unsigned char *out)
+{
+ int i;
+
+ LTC_ARGCHK(md != NULL);
+ LTC_ARGCHK(out != NULL);
+
+ if (md->sm3.curlen >= sizeof(md->sm3.buf)) {
+ return CRYPT_INVALID_ARG;
+ }
+
+ /* increase the length of the message */
+ md->sm3.length += md->sm3.curlen * 8;
+
+ /* append the '1' bit */
+ md->sm3.buf[md->sm3.curlen++] = (unsigned char)0x80;
+
+ /* if the length is currently above 56 bytes we append zeros
+ * then compress. Then we can fall back to padding zeros and length
+ * encoding like normal.
+ */
+ if (md->sm3.curlen > 56) {
+ while (md->sm3.curlen < 64) {
+ md->sm3.buf[md->sm3.curlen++] = (unsigned char)0;
+ }
+ s_sm3_compress(md, md->sm3.buf);
+ md->sm3.curlen = 0;
+ }
+
+ /* pad upto 56 bytes of zeroes */
+ while (md->sm3.curlen < 56) {
+ md->sm3.buf[md->sm3.curlen++] = (unsigned char)0;
+ }
+
+ /* store length (big-endian) */
+ STORE64H(md->sm3.length, md->sm3.buf+56);
+ s_sm3_compress(md, md->sm3.buf);
+
+ /* copy output (big-endian) */
+ for (i = 0; i < 8; i++) {
+ STORE32H(md->sm3.state[i], out+(4*i));
+ }
+ return CRYPT_OK;
+}
+
+/**
+ Self-test the hash
+ @return CRYPT_OK if successful, CRYPT_NOP if self-tests have been disabled
+*/
+int sm3_test(void)
+{
+#ifndef LTC_TEST
+ return CRYPT_NOP;
+#else
+ static const struct {
+ const char *msg;
+ unsigned char hash[32];
+ } tests[] = {
+ /* Example 1 from the SM3 specification (GM/T 0004-2012) */
+ { "abc",
+ { 0x66, 0xc7, 0xf0, 0xf4, 0x62, 0xee, 0xed, 0xd9,
+ 0xd1, 0xf2, 0xd4, 0x6b, 0xdc, 0x10, 0xe4, 0xe2,
+ 0x41, 0x67, 0xc4, 0x87, 0x5c, 0xf2, 0xf7, 0xa2,
+ 0x29, 0x7d, 0xa0, 0x2b, 0x8f, 0x4b, 0xa8, 0xe0 }
+ },
+ /* Example 2 from the SM3 specification (GM/T 0004-2012) */
+ { "abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcd",
+ { 0xde, 0xbe, 0x9f, 0xf9, 0x22, 0x75, 0xb8, 0xa1,
+ 0x38, 0x60, 0x48, 0x89, 0xc1, 0x8e, 0x5a, 0x4d,
+ 0x6f, 0xdb, 0x70, 0xe5, 0x38, 0x7e, 0x57, 0x65,
+ 0x29, 0x3d, 0xcb, 0xa3, 0x9c, 0x0c, 0x57, 0x32 }
+ },
+ /* Additional test vectors generated by `openssl dgst -sm3` (OpenSSL 3.0.13) */
+ { "",
+ { 0x1a, 0xb2, 0x1d, 0x83, 0x55, 0xcf, 0xa1, 0x7f,
+ 0x8e, 0x61, 0x19, 0x48, 0x31, 0xe8, 0x1a, 0x8f,
+ 0x22, 0xbe, 0xc8, 0xc7, 0x28, 0xfe, 0xfb, 0x74,
+ 0x7e, 0xd0, 0x35, 0xeb, 0x50, 0x82, 0xaa, 0x2b }
+ },
+ { "a",
+ { 0x62, 0x34, 0x76, 0xac, 0x18, 0xf6, 0x5a, 0x29,
+ 0x09, 0xe4, 0x3c, 0x7f, 0xec, 0x61, 0xb4, 0x9c,
+ 0x7e, 0x76, 0x4a, 0x91, 0xa1, 0x8c, 0xcb, 0x82,
+ 0xf1, 0x91, 0x7a, 0x29, 0xc8, 0x6c, 0x5e, 0x88 }
+ },
+ { "abcdefghijklmnopqrstuvwxyz",
+ { 0xb8, 0x0f, 0xe9, 0x7a, 0x4d, 0xa2, 0x4a, 0xfc,
+ 0x27, 0x75, 0x64, 0xf6, 0x6a, 0x35, 0x9e, 0xf4,
+ 0x40, 0x46, 0x2a, 0xd2, 0x8d, 0xcc, 0x6d, 0x63,
+ 0xad, 0xb2, 0x4d, 0x5c, 0x20, 0xa6, 0x15, 0x95 }
+ },
+ { "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",
+ { 0x29, 0x71, 0xd1, 0x0c, 0x88, 0x42, 0xb7, 0x0c,
+ 0x97, 0x9e, 0x55, 0x06, 0x34, 0x80, 0xc5, 0x0b,
+ 0xac, 0xff, 0xd9, 0x0e, 0x98, 0xe2, 0xe6, 0x0d,
+ 0x25, 0x12, 0xab, 0x8a, 0xbf, 0xdf, 0xce, 0xc5 }
+ },
+ { "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
+ { 0x28, 0x83, 0x37, 0xee, 0xf5, 0x1e, 0xec, 0x62,
+ 0xe7, 0x54, 0x4d, 0x72, 0x70, 0x42, 0x4c, 0x8d,
+ 0xbe, 0x65, 0x62, 0x54, 0xc9, 0x98, 0x52, 0x87,
+ 0x0a, 0x73, 0xb2, 0x45, 0x3a, 0x6a, 0x7f, 0xb1 }
+ },
+ { "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
+ { 0xba, 0x00, 0xeb, 0xed, 0xaa, 0xb5, 0x40, 0x65,
+ 0xa5, 0xfd, 0x4f, 0x9f, 0x56, 0x32, 0x60, 0x16,
+ 0x20, 0x31, 0x66, 0xbc, 0xee, 0x3e, 0xed, 0x44,
+ 0xea, 0x86, 0x8d, 0x59, 0xd6, 0x7a, 0xa3, 0xc8 }
+ },
+ { "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
+ { 0x58, 0x73, 0x08, 0x54, 0x35, 0x51, 0x88, 0x1e,
+ 0xbd, 0x70, 0xd2, 0x7a, 0xd3, 0x58, 0xff, 0x5d,
+ 0xcd, 0xf2, 0x4a, 0xc5, 0x48, 0x22, 0xe2, 0xf7,
+ 0xb7, 0xc3, 0xed, 0xce, 0x09, 0x85, 0xd2, 0x1b }
+ },
+ { "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
+ { 0x61, 0x6e, 0xc4, 0x33, 0xc3, 0x59, 0xe7, 0xc2,
+ 0xb1, 0x9f, 0x36, 0x0e, 0x2b, 0x8f, 0x2a, 0x1b,
+ 0x6e, 0x9e, 0xd7, 0x6b, 0x8d, 0xc1, 0xa7, 0xd2,
+ 0x07, 0xb3, 0x1a, 0x53, 0x41, 0xc6, 0x11, 0xe9 }
+ }
+ };
+
+ int i;
+ unsigned char tmp[32];
+ hash_state md;
+
+ for (i = 0; i < (int)LTC_ARRAY_SIZE(tests); i++) {
+ sm3_init(&md);
+ sm3_process(&md, (const unsigned char *)tests[i].msg, XSTRLEN(tests[i].msg));
+ sm3_done(&md, tmp);
+ if (ltc_compare_testvector(tmp, sizeof(tmp), tests[i].hash, sizeof(tests[i].hash), "SM3", i)) {
+ return CRYPT_FAIL_TESTVECTOR;
+ }
+ }
+ return CRYPT_OK;
+#endif
+}
+
+#undef FF0
+#undef GG0
+#undef FF1
+#undef GG1
+#undef R1
+#undef R2
+
+#endif
diff --git a/src/headers/tomcrypt_custom.h b/src/headers/tomcrypt_custom.h
index ed1440082..b34af696a 100644
--- a/src/headers/tomcrypt_custom.h
+++ b/src/headers/tomcrypt_custom.h
@@ -280,6 +280,7 @@
#define LTC_RIPEMD320
#define LTC_BLAKE2S
#define LTC_BLAKE2B
+#define LTC_SM3
#define LTC_HASH_HELPERS
diff --git a/src/headers/tomcrypt_hash.h b/src/headers/tomcrypt_hash.h
index a6bd75028..34dd4e9ab 100644
--- a/src/headers/tomcrypt_hash.h
+++ b/src/headers/tomcrypt_hash.h
@@ -131,6 +131,14 @@ struct chc_state {
};
#endif
+#ifdef LTC_SM3
+struct sm3_state {
+ ulong64 length;
+ ulong32 state[8], curlen;
+ unsigned char buf[64];
+};
+#endif
+
#ifdef LTC_BLAKE2S
struct blake2s_state {
ulong32 h[8];
@@ -208,6 +216,9 @@ typedef union Hash_state {
#ifdef LTC_BLAKE2B
struct blake2b_state blake2b;
#endif
+#ifdef LTC_SM3
+ struct sm3_state sm3;
+#endif
void *data;
} hash_state;
@@ -488,6 +499,14 @@ int blake2b_process(hash_state * md, const unsigned char *in, unsigned long inle
int blake2b_done(hash_state * md, unsigned char *out);
#endif
+#ifdef LTC_SM3
+int sm3_init(hash_state * md);
+int sm3_process(hash_state * md, const unsigned char *in, unsigned long inlen);
+int sm3_done(hash_state * md, unsigned char *out);
+int sm3_test(void);
+extern const struct ltc_hash_descriptor sm3_desc;
+#endif
+
#ifdef LTC_MD5
int md5_init(hash_state * md);
int md5_process(hash_state * md, const unsigned char *in, unsigned long inlen);
diff --git a/src/mac/hmac/hmac_test.c b/src/mac/hmac/hmac_test.c
index f22a37096..762e9bf1a 100644
--- a/src/mac/hmac/hmac_test.c
+++ b/src/mac/hmac/hmac_test.c
@@ -582,6 +582,40 @@ int hmac_test(void)
0x65, 0xc9, 0x74, 0x40, 0xfa, 0x8c, 0x6a, 0x58} },
#endif /* LTC_TEST_EXT */
+ { "sm3 1", "sm3",
+ hmac_test_case_keys[0], 20,
+ hmac_test_case_data[0], 8,
+ {0x51, 0xb0, 0x0d, 0x1f, 0xb4, 0x98, 0x32, 0xbf,
+ 0xb0, 0x1c, 0x3c, 0xe2, 0x78, 0x48, 0xe5, 0x9f,
+ 0x87, 0x1d, 0x9b, 0xa9, 0x38, 0xdc, 0x56, 0x3b,
+ 0x33, 0x8c, 0xa9, 0x64, 0x75, 0x5c, 0xce, 0x70} },
+
+#ifdef LTC_TEST_EXT
+ { "sm3 2", "sm3",
+ hmac_test_case_keys[1], 4,
+ hmac_test_case_data[1], 28,
+ {0x2e, 0x87, 0xf1, 0xd1, 0x68, 0x62, 0xe6, 0xd9,
+ 0x64, 0xb5, 0x0a, 0x52, 0x00, 0xbf, 0x2b, 0x10,
+ 0xb7, 0x64, 0xfa, 0xa9, 0x68, 0x0a, 0x29, 0x6a,
+ 0x24, 0x05, 0xf2, 0x4b, 0xec, 0x39, 0xf8, 0x82} },
+
+ { "sm3 3", "sm3",
+ hmac_test_case_keys[4], 131,
+ hmac_test_case_data[5], 54,
+ {0x73, 0x6f, 0x6a, 0xbd, 0x55, 0x72, 0xf0, 0xd5,
+ 0x96, 0xc9, 0x57, 0xb9, 0x30, 0x6b, 0x3c, 0x5c,
+ 0xe8, 0x13, 0xb2, 0xc4, 0x5c, 0xd7, 0x44, 0x52,
+ 0xbc, 0x6f, 0xbb, 0x37, 0xd1, 0xed, 0x25, 0xfa} },
+
+ { "sm3 4", "sm3",
+ hmac_test_case_keys[4], 131,
+ hmac_test_case_data[7], 152,
+ {0x8d, 0x1c, 0xa1, 0xb7, 0x22, 0x53, 0xe7, 0xe9,
+ 0xc8, 0x22, 0x68, 0x4d, 0x2e, 0x75, 0xfb, 0x6c,
+ 0x6e, 0x04, 0x42, 0x86, 0x6e, 0x66, 0x1b, 0xb9,
+ 0xa3, 0x66, 0x8c, 0xd9, 0xc6, 0xa3, 0x2f, 0xb7} },
+#endif /* LTC_TEST_EXT */
+
};
unsigned long outlen;
diff --git a/src/misc/crypt/crypt.c b/src/misc/crypt/crypt.c
index ccef4a0c7..d9ebf16b4 100644
--- a/src/misc/crypt/crypt.c
+++ b/src/misc/crypt/crypt.c
@@ -220,6 +220,9 @@ const char *crypt_build_settings =
#if defined(LTC_BLAKE2B)
" BLAKE2B\n"
#endif
+#if defined(LTC_SM3)
+ " SM3\n"
+#endif
#if defined(LTC_CHC_HASH)
" CHC_HASH\n"
#endif
diff --git a/src/misc/crypt/crypt_register_all_hashes.c b/src/misc/crypt/crypt_register_all_hashes.c
index 91f1cadb1..620331a84 100644
--- a/src/misc/crypt/crypt_register_all_hashes.c
+++ b/src/misc/crypt/crypt_register_all_hashes.c
@@ -97,6 +97,9 @@ int register_all_hashes(void)
#ifdef LTC_MD4
REGISTER_HASH(&md4_desc);
#endif
+#ifdef LTC_SM3
+ REGISTER_HASH(&sm3_desc);
+#endif
#ifdef LTC_CHC_HASH
{
int aes_index = find_cipher_any("aes", 8, 16);
diff --git a/tests/test.c b/tests/test.c
index 8eb7d7d0b..a88ef0910 100644
--- a/tests/test.c
+++ b/tests/test.c
@@ -200,6 +200,9 @@ static void s_unregister_all(void)
#ifdef LTC_MD4
unregister_hash(&md4_desc);
#endif
+#ifdef LTC_SM3
+ unregister_hash(&sm3_desc);
+#endif
#ifdef LTC_MD5
unregister_hash(&md5_desc);
#endif