forked from soutade/libgourou
		
	Make Encryption/Decryption method of DRMProcessorClient generic
This commit is contained in:
		@@ -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