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();
}
コード例 #2
0
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);
}