Skip to content

Commit 93a8271

Browse files
committed
Merged PR 7979179: Add SHA-3 implementations
This update adds C implementations of SHA-3-256, SHA-3-384, and SHA-3-512 hash functions per FIPS 202. Related work items: #41559779
1 parent 455c408 commit 93a8271

28 files changed

+2667
-11
lines changed

cmake-configs/SymCrypt-Platforms.cmake

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,5 +155,10 @@ else() # Windows
155155
add_compile_options(/GF)
156156
add_compile_options(/Gy)
157157
add_compile_options(/Gw)
158+
else()
159+
if(SYMCRYPT_TARGET_ARCH MATCHES "AMD64")
160+
# Prevent error C1128 for AMD64/Debug builds: number of sections exceeded object file format limit
161+
add_compile_options(/bigobj)
162+
endif()
158163
endif()
159164
endif()

inc/symcrypt.h

Lines changed: 187 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1100,7 +1100,7 @@ extern const PCSYMCRYPT_HASH SymCryptSha1Algorithm;
11001100
// SHA-256
11011101
//
11021102
//
1103-
// Tha SHA-256 hash algorithm per FIPS 180-4.
1103+
// The SHA-256 hash algorithm per FIPS 180-4.
11041104
// This implementation is limited to data strings that are in whole bytes.
11051105
// Odd bit length are not supported.
11061106
//
@@ -1165,7 +1165,7 @@ extern const PCSYMCRYPT_HASH SymCryptSha256Algorithm;
11651165
// SHA-384
11661166
//
11671167
//
1168-
// Tha SHA-384 hash algorithm per FIPS 180-4.
1168+
// The SHA-384 hash algorithm per FIPS 180-4.
11691169
// This implementation is limited to data strings that are in whole bytes.
11701170
// Odd bit length are not supported.
11711171
//
@@ -1230,7 +1230,7 @@ extern const PCSYMCRYPT_HASH SymCryptSha384Algorithm;
12301230
// SHA-512
12311231
//
12321232
//
1233-
// Tha SHA-512 hash algorithm per FIPS 180-4.
1233+
// The SHA-512 hash algorithm per FIPS 180-4.
12341234
// This implementation is limited to data strings that are in whole bytes.
12351235
// Odd bit length are not supported.
12361236
//
@@ -1291,6 +1291,181 @@ SymCryptSha512Selftest();
12911291

12921292
extern const PCSYMCRYPT_HASH SymCryptSha512Algorithm;
12931293

1294+
1295+
////////////////////////////////////////////////////////////////////////////
1296+
// SHA-3
1297+
//
1298+
// The SHA-3 family of hash algorithms per FIPS 202.
1299+
// This implementation is limited to data strings that are in whole bytes.
1300+
// Odd bit length are not supported.
1301+
//
1302+
//
1303+
// For details on this API see the description above about the generic hash function API.
1304+
//
1305+
1306+
1307+
//
1308+
// SHA-3-256
1309+
//
1310+
1311+
#define SYMCRYPT_SHA3_256_RESULT_SIZE (32)
1312+
#define SYMCRYPT_SHA3_256_INPUT_BLOCK_SIZE (136)
1313+
1314+
VOID
1315+
SYMCRYPT_CALL
1316+
SymCryptSha3_256(
1317+
_In_reads_(cbData) PCBYTE pbData,
1318+
SIZE_T cbData,
1319+
_Out_writes_(SYMCRYPT_SHA3_256_RESULT_SIZE) PBYTE pbResult);
1320+
1321+
VOID
1322+
SYMCRYPT_CALL
1323+
SymCryptSha3_256Init(_Out_ PSYMCRYPT_SHA3_256_STATE pState);
1324+
1325+
VOID
1326+
SYMCRYPT_CALL
1327+
SymCryptSha3_256Append(
1328+
_Inout_ PSYMCRYPT_SHA3_256_STATE pState,
1329+
_In_reads_(cbData) PCBYTE pbData,
1330+
SIZE_T cbData);
1331+
1332+
VOID
1333+
SYMCRYPT_CALL
1334+
SymCryptSha3_256Result(
1335+
_Inout_ PSYMCRYPT_SHA3_256_STATE pState,
1336+
_Out_writes_(SYMCRYPT_SHA3_256_RESULT_SIZE) PBYTE pbResult);
1337+
1338+
VOID
1339+
SYMCRYPT_CALL
1340+
SymCryptSha3_256StateCopy(_In_ PCSYMCRYPT_SHA3_256_STATE pSrc, _Out_ PSYMCRYPT_SHA3_256_STATE pDst);
1341+
1342+
VOID
1343+
SYMCRYPT_CALL
1344+
SymCryptSha3_256StateExport(
1345+
_In_ PCSYMCRYPT_SHA3_256_STATE pState,
1346+
_Out_writes_bytes_(SYMCRYPT_SHA3_256_STATE_EXPORT_SIZE) PBYTE pbBlob);
1347+
1348+
SYMCRYPT_ERROR
1349+
SYMCRYPT_CALL
1350+
SymCryptSha3_256StateImport(
1351+
_Out_ PSYMCRYPT_SHA3_256_STATE pState,
1352+
_In_reads_bytes_(SYMCRYPT_SHA3_256_STATE_EXPORT_SIZE) PCBYTE pbBlob);
1353+
1354+
VOID
1355+
SYMCRYPT_CALL
1356+
SymCryptSha3_256Selftest();
1357+
1358+
extern const PCSYMCRYPT_HASH SymCryptSha3_256Algorithm;
1359+
1360+
1361+
//
1362+
// SHA-3-384
1363+
//
1364+
1365+
#define SYMCRYPT_SHA3_384_RESULT_SIZE (48)
1366+
#define SYMCRYPT_SHA3_384_INPUT_BLOCK_SIZE (104)
1367+
1368+
VOID
1369+
SYMCRYPT_CALL
1370+
SymCryptSha3_384(
1371+
_In_reads_(cbData) PCBYTE pbData,
1372+
SIZE_T cbData,
1373+
_Out_writes_(SYMCRYPT_SHA3_384_RESULT_SIZE) PBYTE pbResult);
1374+
1375+
VOID
1376+
SYMCRYPT_CALL
1377+
SymCryptSha3_384Init(_Out_ PSYMCRYPT_SHA3_384_STATE pState);
1378+
1379+
VOID
1380+
SYMCRYPT_CALL
1381+
SymCryptSha3_384Append(
1382+
_Inout_ PSYMCRYPT_SHA3_384_STATE pState,
1383+
_In_reads_(cbData) PCBYTE pbData,
1384+
SIZE_T cbData);
1385+
1386+
VOID
1387+
SYMCRYPT_CALL
1388+
SymCryptSha3_384Result(
1389+
_Inout_ PSYMCRYPT_SHA3_384_STATE pState,
1390+
_Out_writes_(SYMCRYPT_SHA3_384_RESULT_SIZE) PBYTE pbResult);
1391+
1392+
VOID
1393+
SYMCRYPT_CALL
1394+
SymCryptSha3_384StateCopy(_In_ PCSYMCRYPT_SHA3_384_STATE pSrc, _Out_ PSYMCRYPT_SHA3_384_STATE pDst);
1395+
1396+
VOID
1397+
SYMCRYPT_CALL
1398+
SymCryptSha3_384StateExport(
1399+
_In_ PCSYMCRYPT_SHA3_384_STATE pState,
1400+
_Out_writes_bytes_(SYMCRYPT_SHA3_384_STATE_EXPORT_SIZE) PBYTE pbBlob);
1401+
1402+
SYMCRYPT_ERROR
1403+
SYMCRYPT_CALL
1404+
SymCryptSha3_384StateImport(
1405+
_Out_ PSYMCRYPT_SHA3_384_STATE pState,
1406+
_In_reads_bytes_(SYMCRYPT_SHA3_384_STATE_EXPORT_SIZE) PCBYTE pbBlob);
1407+
1408+
VOID
1409+
SYMCRYPT_CALL
1410+
SymCryptSha3_384Selftest();
1411+
1412+
extern const PCSYMCRYPT_HASH SymCryptSha3_384Algorithm;
1413+
1414+
1415+
//
1416+
// SHA-3-512
1417+
//
1418+
1419+
#define SYMCRYPT_SHA3_512_RESULT_SIZE (64)
1420+
#define SYMCRYPT_SHA3_512_INPUT_BLOCK_SIZE (72)
1421+
1422+
VOID
1423+
SYMCRYPT_CALL
1424+
SymCryptSha3_512(
1425+
_In_reads_( cbData ) PCBYTE pbData,
1426+
SIZE_T cbData,
1427+
_Out_writes_( SYMCRYPT_SHA3_512_RESULT_SIZE ) PBYTE pbResult );
1428+
1429+
VOID
1430+
SYMCRYPT_CALL
1431+
SymCryptSha3_512Init( _Out_ PSYMCRYPT_SHA3_512_STATE pState );
1432+
1433+
VOID
1434+
SYMCRYPT_CALL
1435+
SymCryptSha3_512Append(
1436+
_Inout_ PSYMCRYPT_SHA3_512_STATE pState,
1437+
_In_reads_( cbData ) PCBYTE pbData,
1438+
SIZE_T cbData );
1439+
1440+
VOID
1441+
SYMCRYPT_CALL
1442+
SymCryptSha3_512Result(
1443+
_Inout_ PSYMCRYPT_SHA3_512_STATE pState,
1444+
_Out_writes_( SYMCRYPT_SHA3_512_RESULT_SIZE ) PBYTE pbResult );
1445+
1446+
VOID
1447+
SYMCRYPT_CALL
1448+
SymCryptSha3_512StateCopy( _In_ PCSYMCRYPT_SHA3_512_STATE pSrc, _Out_ PSYMCRYPT_SHA3_512_STATE pDst );
1449+
1450+
VOID
1451+
SYMCRYPT_CALL
1452+
SymCryptSha3_512StateExport(
1453+
_In_ PCSYMCRYPT_SHA3_512_STATE pState,
1454+
_Out_writes_bytes_( SYMCRYPT_SHA3_512_STATE_EXPORT_SIZE ) PBYTE pbBlob );
1455+
1456+
SYMCRYPT_ERROR
1457+
SYMCRYPT_CALL
1458+
SymCryptSha3_512StateImport(
1459+
_Out_ PSYMCRYPT_SHA3_512_STATE pState,
1460+
_In_reads_bytes_( SYMCRYPT_SHA3_512_STATE_EXPORT_SIZE) PCBYTE pbBlob );
1461+
1462+
VOID
1463+
SYMCRYPT_CALL
1464+
SymCryptSha3_512Selftest();
1465+
1466+
extern const PCSYMCRYPT_HASH SymCryptSha3_512Algorithm;
1467+
1468+
12941469
//==========================================================================
12951470
// PARALLELISED HASH FUNCTIONS
12961471
//==========================================================================
@@ -6419,6 +6594,15 @@ extern const SYMCRYPT_OID SymCryptSha384OidList[SYMCRYPT_SHA384_OID_COUNT];
64196594
#define SYMCRYPT_SHA512_OID_COUNT (2)
64206595
extern const SYMCRYPT_OID SymCryptSha512OidList[SYMCRYPT_SHA512_OID_COUNT];
64216596

6597+
#define SYMCRYPT_SHA3_256_OID_COUNT (2)
6598+
extern const SYMCRYPT_OID SymCryptSha3_256OidList[SYMCRYPT_SHA3_256_OID_COUNT];
6599+
6600+
#define SYMCRYPT_SHA3_384_OID_COUNT (2)
6601+
extern const SYMCRYPT_OID SymCryptSha3_384OidList[SYMCRYPT_SHA3_384_OID_COUNT];
6602+
6603+
#define SYMCRYPT_SHA3_512_OID_COUNT (2)
6604+
extern const SYMCRYPT_OID SymCryptSha3_512OidList[SYMCRYPT_SHA3_512_OID_COUNT];
6605+
64226606
//
64236607
// SYMCRYPT_FLAG_RSA_PKCS1_NO_ASN1: For RSA PKCS1 to not use the OID on signing or verifying.
64246608
//

inc/symcrypt_internal.h

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -822,6 +822,34 @@ typedef SYMCRYPT_ALIGN_STRUCT _SYMCRYPT_SHA384_STATE
822822
} SYMCRYPT_SHA384_STATE, *PSYMCRYPT_SHA384_STATE;
823823
typedef const SYMCRYPT_SHA384_STATE *PCSYMCRYPT_SHA384_STATE;
824824

825+
//
826+
// SYMCRYPT_SHA3_STATE
827+
//
828+
// Data structure that stores the state of an ongoing SHA-3 computation.
829+
//
830+
831+
typedef SYMCRYPT_ALIGN_STRUCT _SYMCRYPT_KECCAK_STATE
832+
{
833+
UINT64 resultSize;
834+
SYMCRYPT_MAGIC_FIELD
835+
UINT32 inputBlockSize;
836+
UINT32 mergedBytes; // number of message bytes merged into the state for current block
837+
SYMCRYPT_ALIGN UINT64 state[25]; // state for Keccak-f[1600] permutation
838+
} SYMCRYPT_KECCAK_STATE, *PSYMCRYPT_KECCAK_STATE;
839+
typedef const SYMCRYPT_KECCAK_STATE *PCSYMCRYPT_KECCAK_STATE;
840+
841+
typedef SYMCRYPT_KECCAK_STATE SYMCRYPT_SHA3_STATE, * PSYMCRYPT_SHA3_STATE;
842+
typedef const SYMCRYPT_SHA3_STATE* PCSYMCRYPT_SHA3_STATE;
843+
844+
typedef SYMCRYPT_KECCAK_STATE SYMCRYPT_SHA3_256_STATE, * PSYMCRYPT_SHA3_256_STATE;
845+
typedef const SYMCRYPT_SHA3_256_STATE* PCSYMCRYPT_SHA3_256_STATE;
846+
847+
typedef SYMCRYPT_KECCAK_STATE SYMCRYPT_SHA3_384_STATE, * PSYMCRYPT_SHA3_384_STATE;
848+
typedef const SYMCRYPT_SHA3_384_STATE* PCSYMCRYPT_SHA3_384_STATE;
849+
850+
typedef SYMCRYPT_KECCAK_STATE SYMCRYPT_SHA3_512_STATE, *PSYMCRYPT_SHA3_512_STATE;
851+
typedef const SYMCRYPT_SHA3_512_STATE* PCSYMCRYPT_SHA3_512_STATE;
852+
825853

826854
//
827855
// Generic hashing
@@ -835,6 +863,9 @@ typedef union _SYMCRYPT_HASH_STATE
835863
SYMCRYPT_SHA256_STATE sha256State;
836864
SYMCRYPT_SHA384_STATE sha384State;
837865
SYMCRYPT_SHA512_STATE sha512State;
866+
SYMCRYPT_SHA3_256_STATE sha3_256State;
867+
SYMCRYPT_SHA3_384_STATE sha3_384State;
868+
SYMCRYPT_SHA3_512_STATE sha3_512State;
838869
} SYMCRYPT_HASH_STATE, *PSYMCRYPT_HASH_STATE;
839870
typedef const SYMCRYPT_HASH_STATE *PCSYMCRYPT_HASH_STATE;
840871

@@ -1622,6 +1653,11 @@ typedef const SYMCRYPT_MARVIN32_STATE *PCSYMCRYPT_MARVIN32_STATE;
16221653
#define SYMCRYPT_SHA384_STATE_EXPORT_SIZE (236)
16231654
#define SYMCRYPT_SHA512_STATE_EXPORT_SIZE (236)
16241655

1656+
#define SYMCRYPT_SHA3_STATE_EXPORT_SIZE (232)
1657+
#define SYMCRYPT_SHA3_256_STATE_EXPORT_SIZE (232)
1658+
#define SYMCRYPT_SHA3_384_STATE_EXPORT_SIZE (232)
1659+
#define SYMCRYPT_SHA3_512_STATE_EXPORT_SIZE (232)
1660+
16251661

16261662
//
16271663
// KDF algorithms

lib/CMakeLists.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,10 @@ set(SOURCES_COMMON
9292
sha512Par.c
9393
sha512Par-ymm.c
9494
sha512-ymm.c
95+
sha3.c
96+
sha3_256.c
97+
sha3_384.c
98+
sha3_512.c
9599
sp800_108_hmacsha1.c
96100
sp800_108_hmacsha256.c
97101
sp800_108_hmacsha512.c

lib/rsa_padding.c

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,24 @@ const SYMCRYPT_OID SymCryptSha512OidList[] =
4646
{11, (BYTE *)"\x06\x09\x60\x86\x48\x01\x65\x03\x04\x02\x03"}
4747
};
4848

49+
const SYMCRYPT_OID SymCryptSha3_256OidList[] =
50+
{
51+
{13, (BYTE *)"\x06\x09\x60\x86\x48\x01\x65\x03\x04\x02\x08\x05\x00"},
52+
{11, (BYTE *)"\x06\x09\x60\x86\x48\x01\x65\x03\x04\x02\x08"}
53+
};
54+
55+
const SYMCRYPT_OID SymCryptSha3_384OidList[] =
56+
{
57+
{13, (BYTE *)"\x06\x09\x60\x86\x48\x01\x65\x03\x04\x02\x09\x05\x00"},
58+
{11, (BYTE *)"\x06\x09\x60\x86\x48\x01\x65\x03\x04\x02\x09"}
59+
};
60+
61+
const SYMCRYPT_OID SymCryptSha3_512OidList[] =
62+
{
63+
{13, (BYTE *)"\x06\x09\x60\x86\x48\x01\x65\x03\x04\x02\x0a\x05\x00"},
64+
{11, (BYTE *)"\x06\x09\x60\x86\x48\x01\x65\x03\x04\x02\x0a"}
65+
};
66+
4967

5068
VOID
5169
SYMCRYPT_CALL

0 commit comments

Comments
 (0)