HRESULT Library_security_pkcs11_native_Microsoft_SPOT_Cryptoki_Encryptor::TransformBlockInternal___I4__SZARRAY_U1__I4__I4__SZARRAY_U1__I4( CLR_RT_StackFrame& stack ) { TINYCLR_HEADER(); CLR_RT_HeapBlock* pThis = stack.This(); CLR_RT_HeapBlock_Array* pData = stack.Arg1().DereferenceArray(); CLR_INT32 dataOffset = stack.Arg2().NumericByRef().s4; CLR_INT32 dataLen = stack.Arg3().NumericByRef().s4; CLR_RT_HeapBlock_Array* pOutput = stack.Arg4().DereferenceArray(); CLR_INT32 outOffset = stack.Arg5().NumericByRef().s4; CLR_RT_HeapBlock* pSession = pThis[Library_security_pkcs11_native_Microsoft_SPOT_Cryptoki_SessionContainer::FIELD__m_session].Dereference(); CK_SESSION_HANDLE hSession; CLR_INT32 encrSize; FAULT_ON_NULL_ARG(pData); FAULT_ON_NULL_ARG(pOutput); FAULT_ON_NULL_ARG(pSession); hSession = (CK_SESSION_HANDLE)pSession[Library_security_pkcs11_native_Microsoft_SPOT_Cryptoki_Session::FIELD__m_handle].NumericByRef().s4; if(hSession == CK_SESSION_HANDLE_INVALID) TINYCLR_SET_AND_LEAVE(CLR_E_OBJECT_DISPOSED); if((dataOffset + dataLen ) > (CLR_INT32)pData->m_numOfElements ) TINYCLR_SET_AND_LEAVE(CLR_E_OUT_OF_RANGE); if((outOffset ) > (CLR_INT32)pOutput->m_numOfElements) TINYCLR_SET_AND_LEAVE(CLR_E_OUT_OF_RANGE); encrSize = pOutput->m_numOfElements - outOffset; CRYPTOKI_CHECK_RESULT(stack, C_EncryptUpdate(hSession, pData->GetElement(dataOffset), dataLen, pOutput->GetElement(outOffset), (CK_ULONG_PTR)&encrSize)); stack.SetResult_I4(encrSize); TINYCLR_NOCLEANUP(); }
void SymmetricAlgorithmTests::des3EncryptDecrypt(CK_MECHANISM_TYPE mechanismType, CK_SESSION_HANDLE hSession, CK_OBJECT_HANDLE hKey) { CK_MECHANISM mechanism = { mechanismType, NULL_PTR, 0 }; CK_BYTE iv[8]; CK_BYTE plainText[256]; CK_BYTE cipherText[300]; CK_ULONG ulCipherTextLen; CK_BYTE cipherTextMulti[300]; CK_ULONG ulCipherTextMultiLen; CK_ULONG ulCipherTextMultiPartLen; CK_BYTE recoveredText[300]; CK_ULONG ulRecoveredTextLen; CK_RV rv; rv = C_GenerateRandom(hSession, plainText, sizeof(plainText)); CPPUNIT_ASSERT(rv==CKR_OK); if (mechanismType == CKM_DES3_CBC || mechanismType == CKM_DES3_CBC_PAD) { rv = C_GenerateRandom(hSession, iv, sizeof(iv)); CPPUNIT_ASSERT(rv==CKR_OK); mechanism.pParameter = iv; mechanism.ulParameterLen = sizeof(iv); } // Single-part encryption rv = C_EncryptInit(hSession,&mechanism,hKey); CPPUNIT_ASSERT(rv==CKR_OK); // Test invalid plain text size if (mechanismType == CKM_DES3_ECB || mechanismType == CKM_DES3_CBC) { ulCipherTextLen = sizeof(cipherText); rv = C_Encrypt(hSession,plainText,sizeof(plainText)-1,cipherText,&ulCipherTextLen); CPPUNIT_ASSERT(rv==CKR_DATA_LEN_RANGE); rv = C_EncryptInit(hSession,&mechanism,hKey); CPPUNIT_ASSERT(rv==CKR_OK); } ulCipherTextLen = sizeof(cipherText); rv = C_Encrypt(hSession,plainText,sizeof(plainText),cipherText,&ulCipherTextLen); CPPUNIT_ASSERT(rv==CKR_OK); if (mechanismType == CKM_DES3_CBC_PAD) { CPPUNIT_ASSERT(ulCipherTextLen==(sizeof(plainText)+8)); } else { CPPUNIT_ASSERT(ulCipherTextLen==sizeof(plainText)); } // Multi-part encryption rv = C_EncryptInit(hSession,&mechanism,hKey); CPPUNIT_ASSERT(rv==CKR_OK); // Test invalid plain text size if (mechanismType == CKM_DES3_ECB || mechanismType == CKM_DES3_CBC) { ulCipherTextMultiLen = sizeof(cipherTextMulti); rv = C_EncryptUpdate(hSession,plainText,sizeof(plainText)/2-1,cipherTextMulti,&ulCipherTextMultiLen); CPPUNIT_ASSERT(rv==CKR_DATA_LEN_RANGE); rv = C_EncryptInit(hSession,&mechanism,hKey); CPPUNIT_ASSERT(rv==CKR_OK); } ulCipherTextMultiLen = sizeof(cipherTextMulti); rv = C_EncryptUpdate(hSession,plainText,sizeof(plainText)/2,cipherTextMulti,&ulCipherTextMultiLen); CPPUNIT_ASSERT(rv==CKR_OK); ulCipherTextMultiPartLen = sizeof(cipherTextMulti) - ulCipherTextMultiLen; rv = C_EncryptUpdate(hSession,plainText+sizeof(plainText)/2,sizeof(plainText)/2,cipherTextMulti+ulCipherTextMultiLen,&ulCipherTextMultiPartLen); CPPUNIT_ASSERT(rv==CKR_OK); ulCipherTextMultiLen += ulCipherTextMultiPartLen; ulCipherTextMultiPartLen = sizeof(cipherTextMulti) - ulCipherTextMultiLen; rv = C_EncryptFinal(hSession,cipherTextMulti+ulCipherTextMultiLen,&ulCipherTextMultiPartLen); CPPUNIT_ASSERT(rv==CKR_OK); ulCipherTextMultiLen += ulCipherTextMultiPartLen; CPPUNIT_ASSERT(ulCipherTextLen==ulCipherTextMultiLen); CPPUNIT_ASSERT(memcmp(cipherText, cipherTextMulti, ulCipherTextLen) == 0); // Single-part decryption rv = C_DecryptInit(hSession,&mechanism,hKey); CPPUNIT_ASSERT(rv==CKR_OK); ulRecoveredTextLen = sizeof(recoveredText); rv = C_Decrypt(hSession,cipherText,ulCipherTextLen,recoveredText,&ulRecoveredTextLen); CPPUNIT_ASSERT(rv==CKR_OK); CPPUNIT_ASSERT(ulRecoveredTextLen==sizeof(plainText)); CPPUNIT_ASSERT(memcmp(plainText, recoveredText, sizeof(plainText)) == 0); }