forked from soutade/libgourou
		
	Make Encryption/Decryption method of DRMProcessorClient generic
This commit is contained in:
		@@ -35,7 +35,7 @@ namespace gourou
 | 
			
		||||
    {
 | 
			
		||||
    public:
 | 
			
		||||
	/**
 | 
			
		||||
	 * @brief Create a digest handler (for now only SHA1 is used)
 | 
			
		||||
	 * @brief Create a digest handler
 | 
			
		||||
	 *
 | 
			
		||||
	 * @param digestName      Digest name to instanciate
 | 
			
		||||
	 */
 | 
			
		||||
@@ -212,14 +212,20 @@ namespace gourou
 | 
			
		||||
    class CryptoInterface
 | 
			
		||||
    {
 | 
			
		||||
    public:
 | 
			
		||||
	enum CRYPTO_ALGO {
 | 
			
		||||
	    ALGO_AES=0,
 | 
			
		||||
	    ALGO_RC4
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
	enum CHAINING_MODE {
 | 
			
		||||
	    CHAIN_ECB=0,
 | 
			
		||||
	    CHAIN_CBC
 | 
			
		||||
	};
 | 
			
		||||
	
 | 
			
		||||
	/**
 | 
			
		||||
	 * @brief Do AES encryption. If length of data is not multiple of 16, PKCS#5 padding is done
 | 
			
		||||
	 * @brief Do encryption. If length of data is not multiple of block size, PKCS#5 padding is done
 | 
			
		||||
	 *
 | 
			
		||||
	 * @param algo           Algorithm to use
 | 
			
		||||
	 * @param chaining       Chaining mode
 | 
			
		||||
	 * @param key            AES key
 | 
			
		||||
	 * @param keyLength      AES key length
 | 
			
		||||
@@ -230,52 +236,53 @@ namespace gourou
 | 
			
		||||
	 * @param dataOut        Encrypted data
 | 
			
		||||
	 * @param dataOutLength  Length of encrypted data
 | 
			
		||||
	 */
 | 
			
		||||
	virtual void AESEncrypt(CHAINING_MODE chaining,
 | 
			
		||||
				const unsigned char* key, unsigned int keyLength,
 | 
			
		||||
				const unsigned char* iv, unsigned int ivLength,
 | 
			
		||||
				const unsigned char* dataIn, unsigned int dataInLength,
 | 
			
		||||
				unsigned char* dataOut, unsigned int* dataOutLength) = 0;
 | 
			
		||||
	virtual void Encrypt(CRYPTO_ALGO algo, CHAINING_MODE chaining,
 | 
			
		||||
			     const unsigned char* key, unsigned int keyLength,
 | 
			
		||||
			     const unsigned char* iv, unsigned int ivLength,
 | 
			
		||||
			     const unsigned char* dataIn, unsigned int dataInLength,
 | 
			
		||||
			     unsigned char* dataOut, unsigned int* dataOutLength) = 0;
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * @brief Init AES CBC encryption
 | 
			
		||||
	 * @brief Init encryption
 | 
			
		||||
	 *
 | 
			
		||||
	 * @param chaining       Chaining mode
 | 
			
		||||
	 * @param key            AES key
 | 
			
		||||
	 * @param keyLength      AES key length
 | 
			
		||||
	 * @param iv             IV key
 | 
			
		||||
	 * @param ivLength       IV key length
 | 
			
		||||
	 * @param key            Key
 | 
			
		||||
	 * @param keyLength      Key length
 | 
			
		||||
	 * @param iv             Optional IV key
 | 
			
		||||
	 * @param ivLength       Optional IV key length
 | 
			
		||||
	 *
 | 
			
		||||
	 * @return AES handler
 | 
			
		||||
	 */
 | 
			
		||||
	virtual void* AESEncryptInit(CHAINING_MODE chaining,
 | 
			
		||||
				     const unsigned char* key, unsigned int keyLength,
 | 
			
		||||
				     const unsigned char* iv=0, unsigned int ivLength=0) = 0;
 | 
			
		||||
	virtual void* EncryptInit(CRYPTO_ALGO algo, CHAINING_MODE chaining,
 | 
			
		||||
				  const unsigned char* key, unsigned int keyLength,
 | 
			
		||||
				  const unsigned char* iv=0, unsigned int ivLength=0) = 0;
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * @brief Encrypt data
 | 
			
		||||
	 *
 | 
			
		||||
	 * @param handler        AES handler
 | 
			
		||||
	 * @param handler        Crypto handler
 | 
			
		||||
	 * @param dataIn         Data to encrypt
 | 
			
		||||
	 * @param dataInLength   Data length
 | 
			
		||||
	 * @param dataOut        Encrypted data
 | 
			
		||||
	 * @param dataOutLength  Length of encrypted data
 | 
			
		||||
	 */
 | 
			
		||||
	virtual void AESEncryptUpdate(void* handler, const unsigned char* dataIn, unsigned int dataInLength,
 | 
			
		||||
			 unsigned char* dataOut, unsigned int* dataOutLength) = 0;
 | 
			
		||||
	virtual void EncryptUpdate(void* handler, const unsigned char* dataIn, unsigned int dataInLength,
 | 
			
		||||
				   unsigned char* dataOut, unsigned int* dataOutLength) = 0;
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * @brief Finalize AES encryption (pad and encrypt last block if needed)
 | 
			
		||||
	 * @brief Finalizeencryption (pad and encrypt last block if needed)
 | 
			
		||||
	 * Destroy handler at the end
 | 
			
		||||
	 *
 | 
			
		||||
	 * @param handler        AES handler
 | 
			
		||||
	 * @param handler        Crypto handler
 | 
			
		||||
	 * @param dataOut        Last block of encrypted data
 | 
			
		||||
	 * @param dataOutLength  Length of encrypted data
 | 
			
		||||
	 */
 | 
			
		||||
	virtual void AESEncryptFinalize(void* handler, unsigned char* dataOut, unsigned int* dataOutLength) = 0;
 | 
			
		||||
	virtual void EncryptFinalize(void* handler, unsigned char* dataOut, unsigned int* dataOutLength) = 0;
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * @brief Do AES decryption. If length of data is not multiple of 16, PKCS#5 padding is done
 | 
			
		||||
	 * @brief Do decryption. If length of data is not multiple of block size, PKCS#5 padding is done
 | 
			
		||||
	 *
 | 
			
		||||
	 * @param algo           Algorithm to use
 | 
			
		||||
	 * @param chaining       Chaining mode
 | 
			
		||||
	 * @param key            AES key
 | 
			
		||||
	 * @param keyLength      AES key length
 | 
			
		||||
@@ -286,47 +293,47 @@ namespace gourou
 | 
			
		||||
	 * @param dataOut        Encrypted data
 | 
			
		||||
	 * @param dataOutLength  Length of encrypted data
 | 
			
		||||
	 */
 | 
			
		||||
	virtual void AESDecrypt(CHAINING_MODE chaining,
 | 
			
		||||
				const unsigned char* key, unsigned int keyLength,
 | 
			
		||||
				const unsigned char* iv, unsigned int ivLength,
 | 
			
		||||
				const unsigned char* dataIn, unsigned int dataInLength,
 | 
			
		||||
				unsigned char* dataOut, unsigned int* dataOutLength) = 0;
 | 
			
		||||
	virtual void Decrypt(CRYPTO_ALGO algo, CHAINING_MODE chaining,
 | 
			
		||||
			     const unsigned char* key, unsigned int keyLength,
 | 
			
		||||
			     const unsigned char* iv, unsigned int ivLength,
 | 
			
		||||
			     const unsigned char* dataIn, unsigned int dataInLength,
 | 
			
		||||
			     unsigned char* dataOut, unsigned int* dataOutLength) = 0;
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * @brief Init AES decryption
 | 
			
		||||
	 * @brief Init decryption
 | 
			
		||||
	 *
 | 
			
		||||
	 * @param chaining       Chaining mode
 | 
			
		||||
	 * @param key            AES key
 | 
			
		||||
	 * @param keyLength      AES key length
 | 
			
		||||
	 * @param key            Key
 | 
			
		||||
	 * @param keyLength      Key length
 | 
			
		||||
	 * @param iv             IV key
 | 
			
		||||
	 * @param ivLength       IV key length
 | 
			
		||||
	 *
 | 
			
		||||
	 * @return AES handler
 | 
			
		||||
	 */
 | 
			
		||||
	virtual void* AESDecryptInit(CHAINING_MODE chaining,
 | 
			
		||||
				     const unsigned char* key, unsigned int keyLength,
 | 
			
		||||
				     const unsigned char* iv=0, unsigned int ivLength=0) = 0;
 | 
			
		||||
	virtual void* DecryptInit(CRYPTO_ALGO algo, CHAINING_MODE chaining,
 | 
			
		||||
				  const unsigned char* key, unsigned int keyLength,
 | 
			
		||||
				  const unsigned char* iv=0, unsigned int ivLength=0) = 0;
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * @brief Decrypt data
 | 
			
		||||
	 *
 | 
			
		||||
	 * @param handler        AES handler
 | 
			
		||||
	 * @param handler        Crypto handler
 | 
			
		||||
	 * @param dataIn         Data to decrypt
 | 
			
		||||
	 * @param dataInLength   Data length
 | 
			
		||||
	 * @param dataOut        Decrypted data
 | 
			
		||||
	 * @param dataOutLength  Length of decrypted data
 | 
			
		||||
	 */
 | 
			
		||||
	virtual void AESDecryptUpdate(void* handler, const unsigned char* dataIn, unsigned int dataInLength,
 | 
			
		||||
				 unsigned char* dataOut, unsigned int* dataOutLength) = 0;
 | 
			
		||||
	virtual void DecryptUpdate(void* handler, const unsigned char* dataIn, unsigned int dataInLength,
 | 
			
		||||
				   unsigned char* dataOut, unsigned int* dataOutLength) = 0;
 | 
			
		||||
	/**
 | 
			
		||||
	 * @brief Finalize AES decryption (decrypt last block and remove padding if it is set).
 | 
			
		||||
	 * @brief Finalize decryption (decrypt last block and remove padding if it is set).
 | 
			
		||||
	 * Destroy handler at the end
 | 
			
		||||
	 *
 | 
			
		||||
	 * @param handler        AES handler
 | 
			
		||||
	 * @param handler        Crypto handler
 | 
			
		||||
	 * @param dataOut        Last block decrypted data
 | 
			
		||||
	 * @param dataOutLength  Length of decrypted data
 | 
			
		||||
	 */
 | 
			
		||||
	virtual void AESDecryptFinalize(void* handler, unsigned char* dataOut, unsigned int* dataOutLength) = 0;
 | 
			
		||||
	virtual void DecryptFinalize(void* handler, unsigned char* dataOut, unsigned int* dataOutLength) = 0;
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -47,23 +47,28 @@
 | 
			
		||||
/* Digest interface */
 | 
			
		||||
void* DRMProcessorClientImpl::createDigest(const std::string& digestName)
 | 
			
		||||
{
 | 
			
		||||
    EVP_MD_CTX *sha_ctx = EVP_MD_CTX_new();
 | 
			
		||||
    EVP_MD_CTX *md_ctx = EVP_MD_CTX_new();
 | 
			
		||||
    const EVP_MD* md = EVP_get_digestbyname(digestName.c_str());
 | 
			
		||||
    EVP_DigestInit(sha_ctx, md);
 | 
			
		||||
 | 
			
		||||
    return sha_ctx;
 | 
			
		||||
    if (EVP_DigestInit(md_ctx, md) != 1)
 | 
			
		||||
    {
 | 
			
		||||
	EVP_MD_CTX_free(md_ctx);
 | 
			
		||||
	return 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return md_ctx;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int DRMProcessorClientImpl::digestUpdate(void* handler, unsigned char* data, unsigned int length)
 | 
			
		||||
{
 | 
			
		||||
    return EVP_DigestUpdate((EVP_MD_CTX *)handler, data, length);
 | 
			
		||||
    return (EVP_DigestUpdate((EVP_MD_CTX *)handler, data, length)) ? 0 : -1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int DRMProcessorClientImpl::digestFinalize(void* handler, unsigned char* digestOut)
 | 
			
		||||
{
 | 
			
		||||
    int res = EVP_DigestFinal((EVP_MD_CTX *)handler, digestOut, NULL);
 | 
			
		||||
    EVP_MD_CTX_free((EVP_MD_CTX *)handler);
 | 
			
		||||
    return res;
 | 
			
		||||
    return (res == 1) ? 0 : -1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int DRMProcessorClientImpl::digest(const std::string& digestName, unsigned char* data, unsigned int length, unsigned char* digestOut)
 | 
			
		||||
@@ -283,83 +288,106 @@ void DRMProcessorClientImpl::extractCertificate(const unsigned char* RSAKey, uns
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Crypto interface */
 | 
			
		||||
void DRMProcessorClientImpl::AESEncrypt(CHAINING_MODE chaining,
 | 
			
		||||
					const unsigned char* key, unsigned int keyLength,
 | 
			
		||||
					const unsigned char* iv, unsigned int ivLength,
 | 
			
		||||
					const unsigned char* dataIn, unsigned int dataInLength,
 | 
			
		||||
					unsigned char* dataOut, unsigned int* dataOutLength)
 | 
			
		||||
void DRMProcessorClientImpl::Encrypt(CRYPTO_ALGO algo, CHAINING_MODE chaining,
 | 
			
		||||
				     const unsigned char* key, unsigned int keyLength,
 | 
			
		||||
				     const unsigned char* iv, unsigned int ivLength,
 | 
			
		||||
				     const unsigned char* dataIn, unsigned int dataInLength,
 | 
			
		||||
				     unsigned char* dataOut, unsigned int* dataOutLength)
 | 
			
		||||
{
 | 
			
		||||
    void* handler = AESEncryptInit(chaining, key, keyLength, iv, ivLength);
 | 
			
		||||
    AESEncryptUpdate(handler, dataIn, dataInLength, dataOut, dataOutLength);
 | 
			
		||||
    AESEncryptFinalize(handler, dataOut+*dataOutLength, dataOutLength);
 | 
			
		||||
    void* handler = EncryptInit(algo, chaining, key, keyLength, iv, ivLength);
 | 
			
		||||
    EncryptUpdate(handler, dataIn, dataInLength, dataOut, dataOutLength);
 | 
			
		||||
    EncryptFinalize(handler, dataOut+*dataOutLength, dataOutLength);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void* DRMProcessorClientImpl::AESEncryptInit(CHAINING_MODE chaining,
 | 
			
		||||
void* DRMProcessorClientImpl::EncryptInit(CRYPTO_ALGO algo, CHAINING_MODE chaining,
 | 
			
		||||
					  const unsigned char* key, unsigned int keyLength,
 | 
			
		||||
					  const unsigned char* iv, unsigned int ivLength)
 | 
			
		||||
{
 | 
			
		||||
    EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new();
 | 
			
		||||
 | 
			
		||||
    if (algo == ALGO_AES)
 | 
			
		||||
    {
 | 
			
		||||
	switch(keyLength)
 | 
			
		||||
	{
 | 
			
		||||
	case 16:
 | 
			
		||||
	    switch(chaining)
 | 
			
		||||
	    {
 | 
			
		||||
	    case CHAIN_ECB:
 | 
			
		||||
		EVP_EncryptInit(ctx, EVP_aes_128_ecb(), key, iv);
 | 
			
		||||
		break;
 | 
			
		||||
	    case CHAIN_CBC:
 | 
			
		||||
		EVP_EncryptInit(ctx, EVP_aes_128_cbc(), key, iv);
 | 
			
		||||
		break;
 | 
			
		||||
	    default:
 | 
			
		||||
		EXCEPTION(gourou::CLIENT_BAD_CHAINING, "Unknown chaining mode " << chaining);
 | 
			
		||||
	    }
 | 
			
		||||
	    break;
 | 
			
		||||
	default:
 | 
			
		||||
	    EVP_CIPHER_CTX_free(ctx);
 | 
			
		||||
	    EXCEPTION(gourou::CLIENT_BAD_KEY_SIZE, "Invalid key size " << keyLength);
 | 
			
		||||
	}
 | 
			
		||||
    }
 | 
			
		||||
    else if (algo == ALGO_RC4)
 | 
			
		||||
    {
 | 
			
		||||
	if (keyLength != 16)
 | 
			
		||||
	{
 | 
			
		||||
	    EVP_CIPHER_CTX_free(ctx);
 | 
			
		||||
	    EXCEPTION(gourou::CLIENT_BAD_KEY_SIZE, "Invalid key size " << keyLength);
 | 
			
		||||
	}
 | 
			
		||||
	EVP_DecryptInit(ctx, EVP_rc4(), key, iv);
 | 
			
		||||
    }
 | 
			
		||||
    return ctx;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void* DRMProcessorClientImpl::DecryptInit(CRYPTO_ALGO algo, CHAINING_MODE chaining,
 | 
			
		||||
					     const unsigned char* key, unsigned int keyLength,
 | 
			
		||||
					     const unsigned char* iv, unsigned int ivLength)
 | 
			
		||||
{
 | 
			
		||||
    EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new();
 | 
			
		||||
 | 
			
		||||
    switch(keyLength)
 | 
			
		||||
    if (algo == ALGO_AES)
 | 
			
		||||
    {
 | 
			
		||||
    case 16:
 | 
			
		||||
	switch(chaining)
 | 
			
		||||
	switch(keyLength)
 | 
			
		||||
	{
 | 
			
		||||
	case CHAIN_ECB:
 | 
			
		||||
	    EVP_EncryptInit_ex(ctx, EVP_aes_128_ecb(), NULL, key, iv);
 | 
			
		||||
	    break;
 | 
			
		||||
	case CHAIN_CBC:
 | 
			
		||||
	    EVP_EncryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, key, iv);
 | 
			
		||||
	case 16:
 | 
			
		||||
	    switch(chaining)
 | 
			
		||||
	    {
 | 
			
		||||
	    case CHAIN_ECB:
 | 
			
		||||
		EVP_DecryptInit(ctx, EVP_aes_128_ecb(), key, iv);
 | 
			
		||||
		break;
 | 
			
		||||
	    case CHAIN_CBC:
 | 
			
		||||
		EVP_DecryptInit(ctx, EVP_aes_128_cbc(), key, iv);
 | 
			
		||||
		break;
 | 
			
		||||
	    default:
 | 
			
		||||
		EXCEPTION(gourou::CLIENT_BAD_CHAINING, "Unknown chaining mode " << chaining);
 | 
			
		||||
	    }
 | 
			
		||||
	    break;
 | 
			
		||||
	default:
 | 
			
		||||
	    EXCEPTION(gourou::CLIENT_BAD_CHAINING, "Unknown chaining mode " << chaining);
 | 
			
		||||
	    EVP_CIPHER_CTX_free(ctx);
 | 
			
		||||
	    EXCEPTION(gourou::CLIENT_BAD_KEY_SIZE, "Invalid key size " << keyLength);
 | 
			
		||||
	}
 | 
			
		||||
	break;
 | 
			
		||||
    default:
 | 
			
		||||
	EVP_CIPHER_CTX_free(ctx);
 | 
			
		||||
	EXCEPTION(gourou::CLIENT_BAD_KEY_SIZE, "Invalid key size " << keyLength);
 | 
			
		||||
    }
 | 
			
		||||
    else if (algo == ALGO_RC4)
 | 
			
		||||
    {
 | 
			
		||||
	if (keyLength != 16)
 | 
			
		||||
	{
 | 
			
		||||
	    EVP_CIPHER_CTX_free(ctx);
 | 
			
		||||
	    EXCEPTION(gourou::CLIENT_BAD_KEY_SIZE, "Invalid key size " << keyLength);
 | 
			
		||||
	}
 | 
			
		||||
	EVP_DecryptInit(ctx, EVP_rc4(), key, iv);
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    return ctx;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void* DRMProcessorClientImpl::AESDecryptInit(CHAINING_MODE chaining,
 | 
			
		||||
					     const unsigned char* key, unsigned int keyLength,
 | 
			
		||||
					     const unsigned char* iv, unsigned int ivLength)
 | 
			
		||||
{
 | 
			
		||||
    EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new();
 | 
			
		||||
 | 
			
		||||
    switch(keyLength)
 | 
			
		||||
    {
 | 
			
		||||
    case 16:
 | 
			
		||||
	switch(chaining)
 | 
			
		||||
	{
 | 
			
		||||
	case CHAIN_ECB:
 | 
			
		||||
	    EVP_DecryptInit_ex(ctx, EVP_aes_128_ecb(), NULL, key, iv);
 | 
			
		||||
	    break;
 | 
			
		||||
	case CHAIN_CBC:
 | 
			
		||||
	    EVP_DecryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, key, iv);
 | 
			
		||||
	    break;
 | 
			
		||||
	default:
 | 
			
		||||
	    EXCEPTION(gourou::CLIENT_BAD_CHAINING, "Unknown chaining mode " << chaining);
 | 
			
		||||
	}
 | 
			
		||||
	break;
 | 
			
		||||
    default:
 | 
			
		||||
	EVP_CIPHER_CTX_free(ctx);
 | 
			
		||||
	EXCEPTION(gourou::CLIENT_BAD_KEY_SIZE, "Invalid key size " << keyLength);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return ctx;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void DRMProcessorClientImpl::AESEncryptUpdate(void* handler, const unsigned char* dataIn, unsigned int dataInLength,
 | 
			
		||||
		 unsigned char* dataOut, unsigned int* dataOutLength)
 | 
			
		||||
void DRMProcessorClientImpl::EncryptUpdate(void* handler, const unsigned char* dataIn, unsigned int dataInLength,
 | 
			
		||||
					   unsigned char* dataOut, unsigned int* dataOutLength)
 | 
			
		||||
{
 | 
			
		||||
    EVP_EncryptUpdate((EVP_CIPHER_CTX*)handler, dataOut, (int*)dataOutLength, dataIn, dataInLength);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void DRMProcessorClientImpl::AESEncryptFinalize(void* handler,
 | 
			
		||||
						unsigned char* dataOut, unsigned int* dataOutLength)
 | 
			
		||||
void DRMProcessorClientImpl::EncryptFinalize(void* handler,
 | 
			
		||||
					     unsigned char* dataOut, unsigned int* dataOutLength)
 | 
			
		||||
{
 | 
			
		||||
    int len;
 | 
			
		||||
    EVP_EncryptFinal_ex((EVP_CIPHER_CTX*)handler, dataOut, &len);
 | 
			
		||||
@@ -367,24 +395,24 @@ void DRMProcessorClientImpl::AESEncryptFinalize(void* handler,
 | 
			
		||||
    EVP_CIPHER_CTX_free((EVP_CIPHER_CTX*)handler);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void DRMProcessorClientImpl::AESDecrypt(CHAINING_MODE chaining,
 | 
			
		||||
					const unsigned char* key, unsigned int keyLength,
 | 
			
		||||
					const unsigned char* iv, unsigned int ivLength,
 | 
			
		||||
					const unsigned char* dataIn, unsigned int dataInLength,
 | 
			
		||||
					unsigned char* dataOut, unsigned int* dataOutLength)
 | 
			
		||||
void DRMProcessorClientImpl::Decrypt(CRYPTO_ALGO algo, CHAINING_MODE chaining,
 | 
			
		||||
				     const unsigned char* key, unsigned int keyLength,
 | 
			
		||||
				     const unsigned char* iv, unsigned int ivLength,
 | 
			
		||||
				     const unsigned char* dataIn, unsigned int dataInLength,
 | 
			
		||||
				     unsigned char* dataOut, unsigned int* dataOutLength)
 | 
			
		||||
{
 | 
			
		||||
    void* handler = AESDecryptInit(chaining, key, keyLength, iv, ivLength);
 | 
			
		||||
    AESDecryptUpdate(handler, dataIn, dataInLength, dataOut, dataOutLength);
 | 
			
		||||
    AESDecryptFinalize(handler, dataOut+*dataOutLength, dataOutLength);
 | 
			
		||||
    void* handler = DecryptInit(algo, chaining, key, keyLength, iv, ivLength);
 | 
			
		||||
    DecryptUpdate(handler, dataIn, dataInLength, dataOut, dataOutLength);
 | 
			
		||||
    DecryptFinalize(handler, dataOut+*dataOutLength, dataOutLength);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void DRMProcessorClientImpl::AESDecryptUpdate(void* handler, const unsigned char* dataIn, unsigned int dataInLength,
 | 
			
		||||
					       unsigned char* dataOut, unsigned int* dataOutLength)
 | 
			
		||||
void DRMProcessorClientImpl::DecryptUpdate(void* handler, const unsigned char* dataIn, unsigned int dataInLength,
 | 
			
		||||
					   unsigned char* dataOut, unsigned int* dataOutLength)
 | 
			
		||||
{
 | 
			
		||||
    EVP_DecryptUpdate((EVP_CIPHER_CTX*)handler, dataOut, (int*)dataOutLength, dataIn, dataInLength);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void DRMProcessorClientImpl::AESDecryptFinalize(void* handler, unsigned char* dataOut, unsigned int* dataOutLength)
 | 
			
		||||
void DRMProcessorClientImpl::DecryptFinalize(void* handler, unsigned char* dataOut, unsigned int* dataOutLength)
 | 
			
		||||
{
 | 
			
		||||
    int len;
 | 
			
		||||
    EVP_DecryptFinal_ex((EVP_CIPHER_CTX*)handler, dataOut, &len);
 | 
			
		||||
 
 | 
			
		||||
@@ -73,34 +73,34 @@ public:
 | 
			
		||||
				    unsigned char** certOut, unsigned int* certOutLength);
 | 
			
		||||
				 
 | 
			
		||||
    /* Crypto interface */
 | 
			
		||||
    virtual void AESEncrypt(CHAINING_MODE chaining,
 | 
			
		||||
			    const unsigned char* key, unsigned int keyLength,
 | 
			
		||||
			    const unsigned char* iv, unsigned int ivLength,
 | 
			
		||||
			    const unsigned char* dataIn, unsigned int dataInLength,
 | 
			
		||||
			    unsigned char* dataOut, unsigned int* dataOutLength);
 | 
			
		||||
    virtual void Encrypt(CRYPTO_ALGO algo, CHAINING_MODE chaining,
 | 
			
		||||
			 const unsigned char* key, unsigned int keyLength,
 | 
			
		||||
			 const unsigned char* iv, unsigned int ivLength,
 | 
			
		||||
			 const unsigned char* dataIn, unsigned int dataInLength,
 | 
			
		||||
			 unsigned char* dataOut, unsigned int* dataOutLength);
 | 
			
		||||
 | 
			
		||||
    virtual void* AESEncryptInit(CHAINING_MODE chaining,
 | 
			
		||||
				 const unsigned char* key, unsigned int keyLength,
 | 
			
		||||
				 const unsigned char* iv=0, unsigned int ivLength=0);
 | 
			
		||||
    virtual void* EncryptInit(CRYPTO_ALGO algo, CHAINING_MODE chaining,
 | 
			
		||||
			      const unsigned char* key, unsigned int keyLength,
 | 
			
		||||
			      const unsigned char* iv=0, unsigned int ivLength=0);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    virtual void AESEncryptUpdate(void* handler, const unsigned char* dataIn, unsigned int dataInLength,
 | 
			
		||||
    virtual void EncryptUpdate(void* handler, const unsigned char* dataIn, unsigned int dataInLength,
 | 
			
		||||
				   unsigned char* dataOut, unsigned int* dataOutLength);
 | 
			
		||||
    virtual void AESEncryptFinalize(void* handler, unsigned char* dataOut, unsigned int* dataOutLength);
 | 
			
		||||
    virtual void EncryptFinalize(void* handler, unsigned char* dataOut, unsigned int* dataOutLength);
 | 
			
		||||
 | 
			
		||||
    virtual void AESDecrypt(CHAINING_MODE chaining,
 | 
			
		||||
			    const unsigned char* key, unsigned int keyLength,
 | 
			
		||||
			    const unsigned char* iv, unsigned int ivLength,
 | 
			
		||||
			    const unsigned char* dataIn, unsigned int dataInLength,
 | 
			
		||||
			    unsigned char* dataOut, unsigned int* dataOutLength);
 | 
			
		||||
    virtual void Decrypt(CRYPTO_ALGO algo, CHAINING_MODE chaining,
 | 
			
		||||
			 const unsigned char* key, unsigned int keyLength,
 | 
			
		||||
			 const unsigned char* iv, unsigned int ivLength,
 | 
			
		||||
			 const unsigned char* dataIn, unsigned int dataInLength,
 | 
			
		||||
			 unsigned char* dataOut, unsigned int* dataOutLength);
 | 
			
		||||
 | 
			
		||||
    virtual void* AESDecryptInit(CHAINING_MODE chaining,
 | 
			
		||||
				 const unsigned char* key, unsigned int keyLength,
 | 
			
		||||
				 const unsigned char* iv=0, unsigned int ivLength=0);
 | 
			
		||||
    virtual void* DecryptInit(CRYPTO_ALGO algo, CHAINING_MODE chaining,
 | 
			
		||||
			      const unsigned char* key, unsigned int keyLength,
 | 
			
		||||
			      const unsigned char* iv=0, unsigned int ivLength=0);
 | 
			
		||||
 | 
			
		||||
    virtual void AESDecryptUpdate(void* handler, const unsigned char* dataIn, unsigned int dataInLength,
 | 
			
		||||
				   unsigned char* dataOut, unsigned int* dataOutLength);
 | 
			
		||||
    virtual void AESDecryptFinalize(void* handler, unsigned char* dataOut, unsigned int* dataOutLength);
 | 
			
		||||
    virtual void DecryptUpdate(void* handler, const unsigned char* dataIn, unsigned int dataInLength,
 | 
			
		||||
			       unsigned char* dataOut, unsigned int* dataOutLength);
 | 
			
		||||
    virtual void DecryptFinalize(void* handler, unsigned char* dataOut, unsigned int* dataOutLength);
 | 
			
		||||
 | 
			
		||||
    /* ZIP Interface */
 | 
			
		||||
    virtual void* zipOpen(const std::string& path);
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user