omadrm/drmengine/server/src/drmcrypto.c
changeset 29 3bdc3b853094
parent 23 493788a4a8a4
child 31 908beac81e0a
--- a/omadrm/drmengine/server/src/drmcrypto.c	Fri Apr 16 15:14:55 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,687 +0,0 @@
-/*
-* Copyright (c) 1999-2009 Nokia Corporation and/or its subsidiary(-ies).
-* All rights reserved.
-* This component and the accompanying materials are made available
-* under the terms of "Eclipse Public License v1.0"
-* which accompanies this distribution, and is available
-* at the URL "http://www.eclipse.org/legal/epl-v10.html".
-*
-* Initial Contributors:
-* Nokia Corporation - initial contribution.
-*
-* Contributors:
-*
-* Description:  DRM Crypto functionality
-*
-*/
-
-
-
-/*
-
-            DRMCrypto
-            --------------------------
-
-            SW module - ANSI C
-
-Location:           -
-
-Filename:           drmcrypto.c
-
-Document code:      -
-
-/* ------------------------------------------------------------------------- */
-
-/*  1    ABSTRACT
-    1.1    Module type
-    1.2    Functional description
-    1.3    Notes
-
-    2    CONTENTS
-
-    3    GLOSSARY
-
-    4    REFERENCES
-
-    5    EXTERNAL RESOURCES
-    5.1    Mandatory include files
-    5.2    Library include files
-    5.3    Interface include files
-
-    6    LOCAL DEFINITIONS
-    6.1    Local include files
-    6.2    Local constants
-    6.3    Local macros
-    6.3.1    dummy_message_type
-    6.3.2    generate_connection_address
-    6.4    Local data types
-    6.5    Local data structures
-    6.6    Local function prototypes
-
-    7    MODULE CODE
-    7.1     DRMCrypto_Encrypt
-	7.2	    DRMCrypto_Decrypt
-	7.3		DRMCrypto_EncryptRightsDb
-	7.4		DRMCrypto_DecryptRightsVDb
-	7.5		DRMCrypto_AddPadding
-	7.6		DRMCrypto_RemovePadding
-	7.7		DRMCrypto_GenerateKey
-	7.8		DRMCrypto_GenerateIV
-
-
-
-
-
-*/
-
-
-/*  3    GLOSSARY
-		 -
-*/
-
-/*  4    REFERENCES
-
-    Specification reference
-
-    DRM Engine Crypto Interface Specification
-
-
-    Design reference
-
-    -
-
-    Module test specification reference
-
-    -
-*/
-#ifndef C_DRMCRYPTO_CFILE
-#define C_DRMCRYPTO_CFILE
-
-/*  5    EXTERNAL RESOURCES */
-
-/*  5.1    Mandatory include files */
-
-/*  5.2    Library include files */
-
-/*  5.3    Interface include files */
-#include "drmcrypto.h"
-#include "drmenv.h" /* for DRMEnv_GetRandom */
-
-/*  6    LOCAL DEFINITIONS */
-
-/*  6.1    Local include files */
-
-#include "aes_if.h"
-
-/*  6.2    Local constants */
-#define	KEYSEED_NUMBER_OF_INT32		4
-#define KEYSEED_LENGTH				16
-/*  6.3    Local macros */
-
-/*  6.4    Local data types */
-
-/*  6.5    Local data structures */
-
-/*  6.6    Local function prototypes */
-
-/*  7    MODULE CODE */
-
-
-/* ========================================================================= */
-
-/*  7.1 */
-
-/* Functional description
- *
- * Encrypt data using specified algorithm
- *
- *
- * Parameters
- *
- * Cipher type
- *
- cType
- *
- * Pointer to encryption key
- *
- pszKey
- *
- * Encryption key length in bytes
- *
- iKeyLen
- *
- * Pointer to initializer vector of encryption
- *
- pszIV
- *
- * Pointer to data to be encrypted
- *
- pszIn
- *
- * Pointer to encrypted data.
- * It can be same pointer as pszOut.
- *
- pszOut
- *
- * Length in bytes of content to be encrypted.
- *
- iInLen
- *
- * Cipher type(AES encryption modes).
- *		AES_MODE_CBC ... AES_MODE_ECB
- *
- uiParameters
- *
- * Return values
- *
- * If encryption is OK, return DRM_ENG_OK, 
- * otherwize DRM_ENG_ERROR.
- */
-
-/* ---------------------------------------------------------------------- */
-
-#ifdef	ENCRYPT_USED
-uint8 DRMCrypto_Encrypt( 
-		  CipherType				cType, 
-		  uint8*					pszKey, 
-		  uint16					iKeyLen,
-		  uint8*					pszIV,
-		  uint8*					pszIn,
-		  uint8*					pszOut,
-		  uint32					iInLen, 
-		  CipherParamType			uiParameters	)
-	{
-	/* Data structures */
-
-	/* return code
-	 */
-	uint8 ret = 0;
-
-	/* AES encryption mode
-	 */
-	uint8 iMode = 0;
-
-	/*  Code  */
-
-	/* check parameter */
-	if( !pszKey || !pszIV || !pszIn || !pszOut )
-		{
-		return DRM_ENG_INVALID_PARAM;
-		}
-
-	/* Convert uiParameters to inner interface type
-	 */
-	if( uiParameters ==  AES_MODE_CBC)
-		{
-		iMode = AES_CBC;
-		}
-	else if( uiParameters ==  AES_MODE_ECB)
-		{
-		iMode = AES_ECB;
-		}
-	else 
-		{
-		DEBUG("Crypto Error: invalid uiParameters!")
-		return DRM_ENG_ERROR;
-		}
-
-	if( cType == CIPHER_AES )
-		{
-		ret = AESEncrypt( (uint32*)pszKey, (uint16)(iKeyLen*8), (uint32*)pszIV, 
-						  (uint32*)pszIn, (uint32*)pszOut, iInLen, iMode );
-		if( ret==AES_CRYPTO_OK ) 
-			{
-			return DRM_ENG_OK;
-			}
-		else if( ret == AES_CRYPTO_ERR_MEMORY )
-			{
-			return DRM_ENG_MEM_ERROR;
-			}
-		else 
-			{
-			DEBUGD("Crypto Error: AES Encryption Error ", ret)
-			return DRM_ENG_ERROR;
-			}
-		}
-	else
-		{
-		return DRM_ENG_ERROR;
-		}
-	}
-#endif /* #ifdef	ENCRYPT_USED */
-
-
-/*  7.2 */
-
-/* Functional description
- *
- * Decrypt data using specified algorithm.
- *
- *
- * Parameters
- *
- * Cipher type
- *
- cType
- *
- * Pointer to encryption key
- *
- pszKey
- *
- * Encryption key length in bytes
- *
- iKeyLen
- *
- * Pointer to initializer vector of encryption
- *
- pszIV
- *
- * Pointer to encrypted data which is to be decrypted
- *
- pszIn
- *
- * Pointer to decrypted content.
- * It can be same pointer as pszOut.
- *
- pszOut
- *
- * Length in bytes of content to be decrypted.
- *
- iInLen
- *
- * Cipher type(AES encryption modes).
- *		AES_MODE_CBC ... AES_MODE_ECB
- *
- uiParameters
- *
- * Return values
- *
- * If decryption is OK, return DRM_ENG_OK, 
- * otherwize DRM_ENG_ERROR.
- */
-
-/* ---------------------------------------------------------------------- */
-
-
-uint8 DRMCrypto_Decrypt( 
-		  CipherType				cType,
-		  uint8*					pszKey, 
-          uint16					iKeyLen,
-		  uint8*					pszIV,
-		  uint8*					pszIn,
-		  uint8*					pszOut,
-		  uint32					iInLen,
-		  CipherParamType			uiParameters	)
-	{
-	/* Data structures */
-
-	/* return code
-	 */
-	uint8 ret = 0;
-
-	/* AES encryption mode
-	 */
-	uint8 iMode = 0;
-
-	/* Aligned buffer for Key
-	 */
-	/* uint32*			pKeyAligned=NULL; */
-
-	/* Aligned buffer for IV
-	 */
-	/* uint32*			pIVAligned=NULL; */
-
-	/* Aligned buffer for Input data
-	 */
-	/* uint32*			pInAligned=NULL; */
-
-	/* Byte stream pointer
-	 */
-	/* uint8* pBytes = NULL; */
-
-	/*  Code  */
-
-	/* check parameter */
-	if( !pszKey || !pszIV || !pszIn || !pszOut )
-		{
-		return DRM_ENG_INVALID_PARAM;
-		}
-
-	/* Convert uiParameters to inner interface type
-	 */
-	if( uiParameters ==  AES_MODE_CBC)
-		{
-		iMode = AES_CBC;
-		}
-	else if( uiParameters ==  AES_MODE_ECB)
-		{
-		iMode = AES_ECB;
-		}
-	else 
-		{
-		DEBUG("Crypto Error: invalid uiParameters !")
-		return DRM_ENG_ERROR;
-		}
-
-	if( cType == CIPHER_AES )
-		{
-			
-			ret = AESDecrypt( (uint32*)pszKey, (uint16)(iKeyLen*8), (uint32*)pszIV, 
-							  (uint32*)pszIn,  (uint32*)pszOut, iInLen, iMode );
-
-		if( ret==AES_CRYPTO_OK ) 
-			{
-			ret = DRM_ENG_OK;
-			}
-		else if( ret == AES_CRYPTO_ERR_MEMORY )
-			{
-			ret = DRM_ENG_MEM_ERROR;
-			}
-		else 
-			{
-			DEBUGD("Crypto Error: AES Decryption Error ", ret)
-			ret = DRM_ENG_ERROR;
-			}
-		}
-	else
-		{
-		ret = DRM_ENG_ERROR;
-		}
-
-	return ret;
-	}
-
-
-/*  7.5 */
-
-/* Functional description
- *
- * Adds padding bytes at the end of data.
- *
- *
- * Parameters
- *
- * Pointer to pointer to data.
- * IN: points to data before adding padding bytes.
- * OUT: points to data with added padding bytes.
- * Memory used by input data will be freed inside this function.
- * New memory will be allocated for output data.
- *
- ppData
- *
- * Pointer to data length in bytes
- * IN:  pointer to length of data with padding.
- * OUT: points to length of data without padding.
- *
- pDataLen
- *
- * Cipher block size. 
- * Max 256
- *
- CipBlockSize
- *
- * Specifies used padding method.
- *      PADDING_PKCS7
- *
- uiPaddingMethod
- *
- * Return values
- *
- * If operation is OK, return DRM_ENG_OK, 
- * otherwize DRM_ENG_ERROR.
- */
-
-/* ---------------------------------------------------------------------- */
-
-
-uint8 DRMCrypto_AddPadding(
-		  uint8**				ppData, 
-		  uint32*				pDataLen,
-		  uint8					CipBlockSize,
-		  PaddingMethodType		uiPaddingMethod	)
-	{
-	/* Data structures */
-
-	/* Number of bytes to add to data
-	 */
-	uint8	padSize=0;
-
-	/* Address of input data
-	 */
-	uint8	*pDataIn;
-
-	/* Iterator
-	 */
-	uint16	i;
-
-	/* return code */
-	uint8 ret = DRM_ENG_OK;
-
-
-	/*  Code  */
-
-	/* check parameter */
-	if( !ppData || !pDataLen )
-		{
-		return DRM_ENG_INVALID_PARAM;
-		}
-
-	if( uiPaddingMethod == PADDING_PKCS7)
-		{
-		/* calculate padding size
-		 */
-		padSize = (uint8)( CipBlockSize-( *pDataLen % CipBlockSize ) );
-	
-		/* record input data address
-		 */
-		pDataIn = *ppData;
-
-		/* allocate memory
-		 */
-		*ppData = (uint8*)DRM_BLOCK_ALLOC( *pDataLen+padSize ) ;
-		if( !(*ppData) )
-			{
-			return DRM_ENG_MEM_ERROR;
-			}
-
-		/* copy data
-		 */
-		DRM_BLOCK_COPY( *ppData, pDataIn, *pDataLen  );
-
-		/* free memory for input data
-		 */
-		DRM_BLOCK_DEALLOC( pDataIn);
-
-		/* add padding
-		 */
-		for( i=0; i<padSize; i++)
-			*( (uint8*)(*ppData) + *pDataLen +i) = padSize;
-
-		/* calculate new data length:
-		 */
-		*pDataLen = *pDataLen+padSize;
-
-		return	DRM_ENG_OK;
-		}
-	else
-		{
-		DEBUG( "Cypto Error: invalid uiPaddingMethod !" )
-		ret = DRM_ENG_ERROR;
-		}
-
-	return ret;
-	}
-
-
-
-/*  7.6 */
-
-/* Functional description
- *
- * Remove padding bytes from data.
- *
- *
- * Parameters
- *
- * Pointer to pointer to data(with padding bytes).
- * IN: points to data with padding bytes.
- * OUT: points to data without padding bytes.
- *
- ppData
- *
- * Pointer to data length in bytes
- * IN:  points to length of data with padding.
- * OUT: points to length of data without padding.
- *
- pDataLen
- *
- * Specifies used padding method.
- *      PADDING_PKCS7
- *
- uiPaddingMethod
- *
- * Return values
- *
- * If operation is OK, return DRM_ENG_OK, 
- * otherwize DRM_ENG_ERROR.
- */
-
-/* ---------------------------------------------------------------------- */
-
-
-uint8 DRMCrypto_RemovePadding(
-		  uint8**				ppData, 
-		  uint32*				pDataLen,
-		  PaddingMethodType		uiPaddingMethod	)
-	{
-	/* Data structures */
-
-	/* Number of bytes of padding data
-	 */
-	uint8	padSize=0;
-
-		/* return code */
-	uint8 ret = DRM_ENG_OK;
-
-	/*  Code  */
-
-	/* check parameter */
-	if( !ppData || !pDataLen )
-		{
-		return DRM_ENG_INVALID_PARAM;
-		}
-
-	if( uiPaddingMethod == PADDING_PKCS7)
-		{
-		/* calculate padding size
-		 * padding size is equal to last byte value of data
-		 */
-		padSize = *( (*ppData) + (*pDataLen) -1);
-
-		if( padSize<1 || padSize>CRYPTO_BLOCK_SIZE )
-			{
-			DEBUG("Padding Size wrong!")
-			return DRM_ENG_ERROR;
-			}
-
-		/* calculate new data length:
-		 */
-		*pDataLen = *pDataLen-padSize;
-
-		return	DRM_ENG_OK;
-		}
-	else
-		{
-		DEBUG( "Cypto Error: invalid uiPaddingMethod !" )
-		ret = DRM_ENG_ERROR;
-		}
-
-	return ret;
-	}
-
-
-/*  7.8 */
-
-/* Functional description
- *
- * Generates an initialization vector for cipher CBC mode. 
- *
- *
- * Parameters
- *
- * Lenght of the IV to be generated in bits. Must be a value between 1-16.
- *
- ivLen
- *
- *
- * Pointer to pointer to the generated IV.
- *
- ppIV
- *
- *
- * Return values
- *
- * If operation is OK, return DRM_ENG_OK, 
- * otherwize DRM_ENG_ERROR.
- */
-
-/* ---------------------------------------------------------------------- */
-
-uint8 DRMCrypto_GenerateIV(uint32 ivLen, uint8 **ppIV)
-	{
-	/* Data structures */
-
-	/* return code	 */
-	uint8	ret=DRM_ENG_OK;
-
-	/* seed */
-	uint8* pSeed=NULL;
-
-	/*  Code  */
-	
-	/* check parameter */
-	if( ppIV == NULL || ivLen == 0 || ivLen > 16)
-		{
-		return DRM_ENG_INVALID_PARAM;
-		}
-
-	/* allocate memory for IV */
-	*ppIV = DRM_BLOCK_ALLOC( ivLen );
-	
-	if( !(*ppIV) )
-		{
-		return DRM_ENG_MEM_ERROR;
-		}
-
-	/* generate random number as seed */
-	pSeed = DRM_BLOCK_ALLOC( KEYSEED_LENGTH );
-	if( !pSeed )
-		{
-		ret = DRM_ENG_MEM_ERROR;
-		}
-	else
-		{
-		ret = DRMEnv_GetRandom( (uint32*)pSeed, KEYSEED_NUMBER_OF_INT32 );
-		TRANSLATE_ERROR_CODE( ret );
-		}
-
-	/* generate IV by seed */
-	if( ret == DRM_ENG_OK )
-		{
-		/* Just copy the seed as IV. */
-		DRM_BLOCK_COPY(*ppIV, pSeed, ivLen<KEYSEED_LENGTH?ivLen:KEYSEED_LENGTH );
-		}
-	else /* free memory */
-		{
-		DRM_BLOCK_DEALLOC( *ppIV );
-		}
-
-	/* free memory */
-	DRM_BLOCK_DEALLOC( pSeed );
-
-	return ret;
-	}
-
-#endif /* #ifndef C_DRMCRYPTO_CFILE */
-/* End of File */
-