1981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt/* 2981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt * keyDeriveAes.c 3981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt * 4981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt * Copyright(c) 1998 - 2009 Texas Instruments. All rights reserved. 5981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt * All rights reserved. 6981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt * 7981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt * Redistribution and use in source and binary forms, with or without 8981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt * modification, are permitted provided that the following conditions 9981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt * are met: 10981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt * 11981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt * * Redistributions of source code must retain the above copyright 12981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt * notice, this list of conditions and the following disclaimer. 13981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt * * Redistributions in binary form must reproduce the above copyright 14981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt * notice, this list of conditions and the following disclaimer in 15981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt * the documentation and/or other materials provided with the 16981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt * distribution. 17981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt * * Neither the name Texas Instruments nor the names of its 18981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt * contributors may be used to endorse or promote products derived 19981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt * from this software without specific prior written permission. 20981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt * 21981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 22981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 23981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 24981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 25981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 26981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 27981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 28981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 29981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 30981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 31981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 32981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt */ 33981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt 34981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt/** \file keyDeriveAes.c 35981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt * \brief AES encryption key derivation implementation. 36981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt * 37981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt * \see aesBroadcastKeyDerivation.h 38981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*/ 39981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt 40981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt/**************************************************************************** 41981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt * * 42981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt * MODULE: AES broadcast key derivation * 43981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt * PURPOSE: AES broadcast key derivation * 44981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt * * 45981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt ****************************************************************************/ 46981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt 47981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt#define __FILE_ID__ FILE_ID_29 48981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt#include "osApi.h" 49981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt#include "report.h" 50981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt#include "rsnApi.h" 51981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt 52981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt#include "keyDerive.h" 53981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt#include "keyDeriveAes.h" 54981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt 55981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt#include "mainKeysSm.h" 56981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt 57981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt/** 58981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* 59981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* keyDeriveAes_config 60981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* 61981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* \b Description: 62981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* 63981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* AES broadcast key derivation configuration function: 64981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* - Initializes the derive & remove callback functions 65981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* \b ARGS: 66981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* 67981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* None 68981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* 69981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* \b RETURNS: 70981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* 71981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* TI_OK on success, TI_NOK otherwise. 72981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*/ 73981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt 74981801b95b81e6d1c7a2085967406e86af0f08fcDmitry ShmidtTI_STATUS keyDeriveAes_config(struct _keyDerive_t *pKeyDerive) 75981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt{ 76981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt pKeyDerive->derive = keyDeriveAes_derive; 77981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt pKeyDerive->remove = keyDeriveAes_remove; 78981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt 79981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt return TI_OK; 80981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt} 81981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt 82981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt 83981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt/** 84981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* 85981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* keyDeriveAes_derive 86981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* 87981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* \b Description: 88981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* 89981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* AES key derivation function: 90981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* - Decodes the key material. 91981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* - Distribute the decoded key material to the driver. 92981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* 93981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* \b ARGS: 94981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* 95981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* I - p - Pointer to the encoded key material. 96981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* 97981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* \b RETURNS: 98981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* 99981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* TI_OK on success, TI_NOK otherwise. 100981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*/ 101981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt 102981801b95b81e6d1c7a2085967406e86af0f08fcDmitry ShmidtTI_STATUS keyDeriveAes_derive(struct _keyDerive_t *pKeyDerive, encodedKeyMaterial_t *pEncodedKey) 103981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt{ 104981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt TI_STATUS status; 105981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt TSecurityKeys key; 106981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt keyMaterialAes_t *keyMaterialAes = NULL; 107981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt 108981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt /* Small verification */ 109981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt if ((pEncodedKey==NULL) || (pKeyDerive == NULL)) 110981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt { 111981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt return TI_NOK; 112981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt } 113981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt 114981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt /* Note: Reduce 2 bytes from the size of keyMaterialAes_t in the following check, 115981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt because it is added as padding at the end due to the OS_PACKED removal. */ 116981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt if ( pEncodedKey->keyLen < (sizeof(keyMaterialAes_t) - 2) ) 117981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt { 118981801b95b81e6d1c7a2085967406e86af0f08fcDmitry ShmidtTRACE1(pKeyDerive->hReport, REPORT_SEVERITY_ERROR, "KEY_DERIVE_AES: ERROR: wrong key length %d !!!\n", pEncodedKey->keyLen); 119981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt return TI_NOK; 120981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt } 121981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt 122981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt keyMaterialAes = (keyMaterialAes_t*)pEncodedKey->pData; 123981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt 124981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt 125981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt /* Fill security key structure */ 126981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt os_memoryZero(pKeyDerive->hOs, &key, sizeof(TSecurityKeys)); 127981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt 128981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt key.keyType = KEY_AES; 129981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt key.keyIndex = (TI_UINT8)pEncodedKey->keyId; 130981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt key.encLen = DERIVE_AES_KEY_LEN; 131981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt os_memoryCopy(pKeyDerive->hOs, (void *)key.encKey, pEncodedKey->pData + MAC_ADDR_LEN+KEY_RSC_LEN, 132981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt DERIVE_AES_KEY_LEN); 133981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt 134981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt /* Copy MAC address key */ 135981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt MAC_COPY (key.macAddress, keyMaterialAes->macAddress); 136981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt /* Copy RSC */ 137981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt os_memoryCopy(pKeyDerive->hOs, (void *)key.keyRsc, (void *)keyMaterialAes->keyRSC, KEY_RSC_LEN); 138981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt 139981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt status = pKeyDerive->pMainKeys->setKey(pKeyDerive->pMainKeys, &key); 140981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt if (status == TI_OK) 141981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt { 142981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt os_memoryCopy(pKeyDerive->hOs, &pKeyDerive->key, pEncodedKey, sizeof(encodedKeyMaterial_t)); 143981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt } 144981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt 145981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt return status; 146981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt} 147981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt 148981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt/** 149981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* 150981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* keyDeriveAes_remove 151981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* 152981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* \b Description: 153981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* 154981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* AES key remove function: 155981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* - Remove the key material from the driver. 156981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* 157981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* \b ARGS: 158981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* 159981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* None. 160981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* 161981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* \b RETURNS: 162981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* 163981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* TI_OK on success, TI_NOK otherwise. 164981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*/ 165981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt 166981801b95b81e6d1c7a2085967406e86af0f08fcDmitry ShmidtTI_STATUS keyDeriveAes_remove(struct _keyDerive_t *pKeyDerive, encodedKeyMaterial_t *pEncodedKey) 167981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt{ 168981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt TI_STATUS status; 169981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt TSecurityKeys key; 170981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt 171981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt if ((pEncodedKey==NULL) || (pKeyDerive == NULL)) 172981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt { 173981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt return TI_NOK; 174981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt } 175981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt 176981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt os_memoryZero(pKeyDerive->hOs, &key, sizeof(TSecurityKeys)); 177981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt key.keyType = KEY_AES; 178981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt key.keyIndex = (TI_UINT8)pEncodedKey->keyId; 179981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt key.encLen = DERIVE_AES_KEY_LEN; 180981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt MAC_COPY (key.macAddress, pEncodedKey->pData); 181981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt 182981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt status = pKeyDerive->pMainKeys->removeKey(pKeyDerive->pMainKeys, &key); 183981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt if (status == TI_OK) 184981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt { 185981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt os_memoryZero(pKeyDerive->hOs, &pKeyDerive->key, sizeof(encodedKeyMaterial_t)); 186981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt } 187981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt 188981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt return status; 189981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt} 190981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt 191