19 return SYMCRYPT_INVALID_ARGUMENT;
22 pSession->replayState.messageNumber = 0;
25 pSession->pMutex =
NULL;
27 return SYMCRYPT_NO_ERROR;
42 return SYMCRYPT_INVALID_ARGUMENT;
51 return SYMCRYPT_MEMORY_ALLOCATION_FAILURE;
54#elif SYMCRYPT_CPU_ARM64
59 return SYMCRYPT_MEMORY_ALLOCATION_FAILURE;
65 pSession->replayState.replayMask = 0;
66 pSession->replayState.messageNumber = 64;
71 return SYMCRYPT_NO_ERROR;
78 if ( pSession->pMutex !=
NULL )
104 return SYMCRYPT_INVALID_ARGUMENT;
107 messageNumber = SYMCRYPT_ATOMIC_ADD64_POST_RELAXED(&pSession->replayState.messageNumber, 1);
114 SYMCRYPT_ATOMIC_ADD64_POST_RELAXED(&pSession->replayState.messageNumber, -1ll);
115 return SYMCRYPT_INVALID_ARGUMENT;
133 if( pu64MessageNumber !=
NULL )
138 return SYMCRYPT_NO_ERROR;
166 if( shiftAmount < 64 )
168 shiftedMask = observedState->replayMask << shiftAmount;
171 desiredState->replayMask = shiftedMask | 1;
174 else if ( messageNumber <= observedState->
messageNumber - 64 )
178 scError = SYMCRYPT_SESSION_REPLAY_FAILURE;
185 messageMask = 1ull << (observedState->messageNumber -
messageNumber);
186 if ((messageMask & observedState->replayMask) == messageMask)
188 scError = SYMCRYPT_SESSION_REPLAY_FAILURE;
192 desiredState->replayMask = observedState->replayMask | messageMask;
193 desiredState->messageNumber = observedState->messageNumber;
200#if SYMCRYPT_USE_CAS128
204SymCryptSessionDecryptUpdateStateCAS128(
215 expectedState = pSession->replayState;
224 expectedState.messageNumber = 0;
227 while( scError == SYMCRYPT_NO_ERROR )
229 if ( SymCryptAtomicCas128Relaxed((
PUINT64)&pSession->replayState, (
PUINT64)&expectedState, (
PUINT64)&desiredState) )
254 if ( pSession->pMutex ==
NULL )
256 return SYMCRYPT_INVALID_ARGUMENT;
262 if (
messageNumber <= (
UINT64) SYMCRYPT_ATOMIC_LOAD64_RELAXED(&pSession->replayState.messageNumber) - 64 )
264 return SYMCRYPT_SESSION_REPLAY_FAILURE;
273 if ( scError == SYMCRYPT_NO_ERROR )
275 pSession->replayState = desiredState;
291#if SYMCRYPT_CPU_AMD64
294 scError = SymCryptSessionDecryptUpdateStateCAS128( pSession,
messageNumber );
300#elif SYMCRYPT_CPU_ARM64
301 scError = SymCryptSessionDecryptUpdateStateCAS128( pSession,
messageNumber );
328 scError = SYMCRYPT_INVALID_ARGUMENT;
335 scError = SYMCRYPT_INVALID_ARGUMENT;
342 if (
messageNumber <= (
UINT64) SYMCRYPT_ATOMIC_LOAD64_RELAXED(&pSession->replayState.messageNumber) - 64 )
344 scError = SYMCRYPT_SESSION_REPLAY_FAILURE;
363 if ( scError != SYMCRYPT_NO_ERROR )
371 if ( scError != SYMCRYPT_NO_ERROR )
COMPILER_DEPENDENT_UINT64 UINT64
unsigned __int64 * PUINT64
static void cleanup(void)
#define _In_reads_opt_(s)
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptSessionGcmDecrypt(_Inout_ PSYMCRYPT_SESSION pSession, UINT64 messageNumber, _In_ PCSYMCRYPT_GCM_EXPANDED_KEY pExpandedKey, _In_reads_opt_(cbAuthData) PCBYTE pbAuthData, SIZE_T cbAuthData, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData, _In_reads_(cbTag) PCBYTE pbTag, SIZE_T cbTag)
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptSessionDecryptUpdateStateLock(_Inout_ PSYMCRYPT_SESSION pSession, UINT64 messageNumber)
FORCEINLINE SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptSessionDecryptComputeDesiredReplayState(_In_ PCSYMCRYPT_SESSION_REPLAY_STATE observedState, _Out_ PSYMCRYPT_SESSION_REPLAY_STATE desiredState, UINT64 messageNumber)
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptSessionReceiverInit(_Inout_ PSYMCRYPT_SESSION pSession, UINT32 senderId, UINT32 flags)
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptSessionDecryptUpdateState(_Inout_ PSYMCRYPT_SESSION pSession, UINT64 messageNumber)
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptSessionGcmEncrypt(_Inout_ PSYMCRYPT_SESSION pSession, _In_ PCSYMCRYPT_GCM_EXPANDED_KEY pExpandedKey, _In_reads_opt_(cbAuthData) PCBYTE pbAuthData, SIZE_T cbAuthData, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData, _Out_writes_(cbTag) PBYTE pbTag, SIZE_T cbTag, _Out_opt_ PUINT64 pu64MessageNumber)
VOID SYMCRYPT_CALL SymCryptSessionDestroy(_Inout_ PSYMCRYPT_SESSION pSession)
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptSessionSenderInit(_Inout_ PSYMCRYPT_SESSION pSession, UINT32 senderId, UINT32 flags)
VOID SYMCRYPT_CALL SymCryptCallbackFreeMutexFastInproc(_Inout_ PVOID pMutex)
FORCEINLINE VOID SYMCRYPT_CALL SymCryptWipeKnownSize(_Out_writes_bytes_(cbData) PVOID pbData, SIZE_T cbData)
VOID SYMCRYPT_CALL SymCryptCallbackAcquireMutexFastInproc(_Inout_ PVOID pMutex)
VOID SYMCRYPT_CALL SymCryptWipe(_Out_writes_bytes_(cbData) PVOID pbData, SIZE_T cbData)
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptGcmDecrypt(_In_ PCSYMCRYPT_GCM_EXPANDED_KEY pExpandedKey, _In_reads_(cbNonce) PCBYTE pbNonce, SIZE_T cbNonce, _In_reads_opt_(cbAuthData) PCBYTE pbAuthData, SIZE_T cbAuthData, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData, _In_reads_(cbTag) PCBYTE pbTag, SIZE_T cbTag)
PVOID SYMCRYPT_CALL SymCryptCallbackAllocateMutexFastInproc(void)
VOID SYMCRYPT_CALL SymCryptCallbackReleaseMutexFastInproc(_Inout_ PVOID pMutex)
VOID SYMCRYPT_CALL SymCryptGcmEncrypt(_In_ PCSYMCRYPT_GCM_EXPANDED_KEY pExpandedKey, _In_reads_(cbNonce) PCBYTE pbNonce, SIZE_T cbNonce, _In_reads_opt_(cbAuthData) PCBYTE pbAuthData, SIZE_T cbAuthData, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData, _Out_writes_(cbTag) PBYTE pbTag, SIZE_T cbTag)
#define SYMCRYPT_STORE_MSBFIRST32(p, v)
#define SYMCRYPT_STORE_MSBFIRST64(p, v)
SYMCRYPT_SESSION_REPLAY_STATE
#define SYMCRYPT_SESSION_MAX_MESSAGE_NUMBER
#define SYMCRYPT_FLAG_SESSION_ENCRYPT
const SYMCRYPT_SESSION_REPLAY_STATE * PCSYMCRYPT_SESSION_REPLAY_STATE
#define SYMCRYPT_CPU_FEATURES_PRESENT(x)
PCBYTE PBYTE SIZE_T cbData
* PSYMCRYPT_SESSION_REPLAY_STATE
const SYMCRYPT_GCM_EXPANDED_KEY * PCSYMCRYPT_GCM_EXPANDED_KEY