Part Number: LAUNCHXL-CC1350
Tool/software: TI-RTOS
Hello All,
I am trying to encrypt my packet data and then i am trying to send that encrypted data over the air. The program is not showing any errors but still packet is not getting transmitted. I am attaching the .c file here. Can anyone please check and let me know what is wrong with this program or why packet is not getting transmitted. There are no errors in this program.
/*
* Copyright (c) 2015-2016, Texas Instruments Incorporated
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* * Neither the name of Texas Instruments Incorporated nor the names of
* its contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
/***** Includes *****/
#include <stdlib.h>
#include <xdc/std.h>
#include <xdc/cfg/global.h>
#include <xdc/runtime/System.h>
#include <ti/sysbios/BIOS.h>
#include <ti/sysbios/knl/Task.h>
#include <ti/sysbios/knl/Semaphore.h>
/* Drivers */
#include <ti/drivers/rf/RF.h>
#include <ti/drivers/crypto/CryptoCC26XX.h>
#include <ti/drivers/PIN.h>
#include <ti/drivers/UART.h>
/* Board Header files */
#include "Board.h"
//#include "RFQueue.h"
#include "smartrf_settings/smartrf_settings.h"
#include <stdlib.h>
/* Pin driver handle */
static PIN_Handle ledPinHandle;
static PIN_State ledPinState;
/*
* Application LED pin configuration table:
* - All LEDs board LEDs are off.
*/
PIN_Config pinTable[] =
{
Board_LED1 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MAX,
PIN_TERMINATE
};
/***** Defines *****/
#define TX_TASK_STACK_SIZE 1024
#define TX_TASK_PRIORITY 3
#define AES_TASK_STACK_SIZE 1024
#define AES_TASK_PRIORITY 2
#define UART_TX_TASK_STACK_SIZE 1024
#define UART_TX_TASK_PRIORITY 1
/* ASCII values of some useful keys */
#define CHAR_LINEFEED 0x0A
#define CHAR_LINE_END_1 0x0D // Enter
#define CHAR_LINE_END_2 0x03 // Enter on numpad
#define CHAR_SPACE 0x20
#define CHAR_ZERO 0x30
#define CHAR_UPPERCASE_START 0x40
/* Encryption Defines */
#define macLength (4)
#define clearTextLength (16)
#define cipherTextLength (macLength + clearTextLength)
#define nonceLength (12)
#define aadLength (14)
/* TX Configuration */
#define PAYLOAD_LENGTH 20
#define PACKET_INTERVAL (uint32_t)(4000000*0.5f) /* Set packet interval to 500ms */
// Holds the AES-CCM setup for this example
typedef struct
{
uint8_t key[16]; // A 128 Bit AES key
CryptoCC26XX_KeyLocation keyLocation; // One of 8 key locations in the hardware
uint8_t clearAndCipherText[cipherTextLength]; // Holds the cleartext before, and the ciphertext
// after the encryption operation.
// Ciphertext = encrypted text + message authentication code (MAC).
uint8_t nonce[nonceLength]; // A value that is used only once (cryptographic term 'nonce')
uint8_t header[aadLength]; // A header that is not encrypted but is authenticated in the operation (AAD).
} AesCcmExample;
AesCcmExample ccmSetup =
{
.key = { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6,
0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C },
.keyLocation = CRYPTOCC26XX_KEY_0,
.clearAndCipherText = { 't','h','i','s','i','s','a','p','l','a','i','n','t','e','x','t','0','0','0','0' },
// .clearAndCipherText = txPacket[0],
.nonce = { 't','h','i','s','i','s','a','n','o','n','c','e' },
.header = { 't','h','i','s','i','s','a','h','e','a','d','e','r','1' }
};
/***** Prototypes *****/
static void txTaskFunction(UArg arg0, UArg arg1);
static void aesTaskFunction(UArg arg0, UArg arg1);
static void uartTxTaskFunction(UArg arg0, UArg arg1);
/***** Variable declarations *****/
static Task_Params txTaskParams;
Task_Struct txTask; /* not static so you can see in ROV */
static uint8_t txTaskStack[TX_TASK_STACK_SIZE];
static Task_Params uartTxTaskParams;
Task_Struct uartTxTask; /* not static so you can see in ROV */
static uint8_t uartTxTaskStack[UART_TX_TASK_STACK_SIZE];
static Task_Params aesTaskParams;
Task_Struct aesTask;
static uint8_t aesTxTaskStack[AES_TASK_STACK_SIZE];
Semaphore_Struct semTxStruct;
Semaphore_Handle semTxHandle;
Semaphore_Struct semAesStruct;
Semaphore_Handle semAesHandle;
static RF_Object rfObject;
static RF_Handle rfHandle;
static RF_CmdHandle rfTxCmd;
UART_Handle uart = NULL;
UART_Params uartParams;
uint32_t time;
static uint8_t txPacket[PAYLOAD_LENGTH];
static PIN_Handle pinHandle;
/***** Function Initailizations *****/
void UartTxTask_init(PIN_Handle ledPinHandle) {
pinHandle = ledPinHandle;
Task_Params_init(&uartTxTaskParams);
uartTxTaskParams.stackSize = UART_TX_TASK_STACK_SIZE;
uartTxTaskParams.priority = UART_TX_TASK_PRIORITY;
uartTxTaskParams.stack = &uartTxTaskStack;
uartTxTaskParams.arg0 = (UInt)1000000;
Task_construct(&uartTxTask, uartTxTaskFunction, &uartTxTaskParams, NULL);
}
void AesTask_init(PIN_Handle inPinHandle)
{
pinHandle = inPinHandle;
Task_Params_init(&uartTxTaskParams);
uartTxTaskParams.stackSize = AES_TASK_STACK_SIZE;
uartTxTaskParams.priority = AES_TASK_PRIORITY;
uartTxTaskParams.stack = &aesTxTaskStack;
uartTxTaskParams.arg0 = (UInt)1000000;
Task_construct(&aesTask, aesTaskFunction, &aesTaskParams, NULL);
}
void TxTask_init(PIN_Handle inPinHandle)
{
pinHandle = inPinHandle;
Task_Params_init(&txTaskParams);
txTaskParams.stackSize = TX_TASK_STACK_SIZE;
txTaskParams.priority = TX_TASK_PRIORITY;
txTaskParams.stack = &txTaskStack;
txTaskParams.arg0 = (UInt)1000000;
Task_construct(&txTask, txTaskFunction, &txTaskParams, NULL);
}
/***** Function definitions *****/
#define UART_TX_BUFFER_SIZE 256
char uartTxBuffer[UART_TX_BUFFER_SIZE];
static void uartTxTaskFunction(UArg arg0, UArg arg1)
{
char input;
uint8_t charIndex = 0;
/* Open UART if not already open */
if (uart == NULL) {
/* Create a UART with data processing off. */
UART_Params_init(&uartParams);
uartParams.writeDataMode = UART_DATA_BINARY;
uartParams.readDataMode = UART_DATA_BINARY;
uartParams.readReturnMode = UART_RETURN_FULL;
uartParams.readEcho = UART_ECHO_OFF;
uartParams.baudRate = 115200;
uart = UART_open(Board_UART0, &uartParams);
if (uart == NULL) {
System_abort("Error opening the UART");
}
}
while (1) {
UART_read(uart, &input, sizeof(input));
UART_write(uart, &input, sizeof(input));
/* Skip the line feed that appears after an enter as the first character of new line */
// if (input == (char)CHAR_LINEFEED)
// charIndex--;
if ((input == (char)CHAR_LINE_END_1) | (input == (char)CHAR_LINE_END_2)) // (charIndex < UART_SERIAL_LINE_SIZE))
{
/* Cancel Rx */
// Semaphore_post(semTxHandle);
Semaphore_post(semAesHandle);
/* reset index to zero to point to begining of the line */
charIndex = 0;
}
else
{
/* Store the input character */
txPacket[charIndex++] = input;
}
}
}
static void aesTaskFunction(UArg arg0, UArg arg1)
{
int i = 0;
for(i=0; i<20; i++){
ccmSetup.clearAndCipherText[i] = txPacket[i];
}
CryptoCC26XX_Handle handle;
int32_t keyIndex;
CryptoCC26XX_AESCCM_Transaction trans;
int32_t status;
// Initialize Crypto driver structures
CryptoCC26XX_init();
// Open the crypto hardware with non-exclusive access and default parameters.
handle = CryptoCC26XX_open(Board_CRYPTO, false, NULL);
if (handle == NULL) {
System_abort("CryptoCC26XX did not open");
}
// Allocate a key storage location in the hardware
keyIndex = CryptoCC26XX_allocateKey(handle, ccmSetup.keyLocation, (const uint32_t *) ccmSetup.key);
if (keyIndex == CRYPTOCC26XX_STATUS_ERROR) {
System_abort("Key Location was not allocated.");
}
Semaphore_pend(semAesHandle, BIOS_WAIT_FOREVER);
// Encrypt and authenticate the message
CryptoCC26XX_Transac_init((CryptoCC26XX_Transaction *) &trans, CRYPTOCC26XX_OP_AES_CCM);
trans.keyIndex = keyIndex;
trans.authLength = macLength;
trans.nonce = (char *) ccmSetup.nonce;
trans.header = (char *) ccmSetup.header;
trans.fieldLength = 3;
trans.msgInLength = clearTextLength;
trans.headerLength = aadLength;
trans.msgIn = (char *) &(ccmSetup.clearAndCipherText[0]); // Message is encrypted in place
// trans.msgIn = (char *) &(ccmSetup.txPacket[0]); // Message is encrypted in place
trans.msgOut = (char *) &(ccmSetup.clearAndCipherText[clearTextLength]); // MAC will be written to this position
status = CryptoCC26XX_transact(handle, (CryptoCC26XX_Transaction *) &trans);
// Do AES-CCM Encryption and authentication
if (status != CRYPTOCC26XX_STATUS_SUCCESS) {
System_abort("Encryption and signing failed.");
}
// Decrypt and authenticate message
/* CryptoCC26XX_Transac_init((CryptoCC26XX_Transaction *) &trans, CRYPTOCC26XX_OP_AES_CCMINV);
trans.keyIndex = keyIndex;
trans.authLength = macLength;
trans.nonce = (char *) ccmSetup.nonce;
trans.header = (char *) ccmSetup.header;
trans.fieldLength = 3;
trans.msgInLength = cipherTextLength;
trans.headerLength = aadLength;
trans.msgIn = (char *) &(ccmSetup.clearAndCipherText[0]); // Message is decrypted in place
trans.msgOut = (char *) &(ccmSetup.clearAndCipherText[clearTextLength]); // Points to the MAC, is used as input here
// Do AES-CCM decryption and authentication
status = CryptoCC26XX_transact(handle, (CryptoCC26XX_Transaction *) &trans);
if(status != CRYPTOCC26XX_STATUS_SUCCESS){
System_abort("Decryption and authentication failed.");
}*/
Semaphore_post(semTxHandle);
// Release the key location
status = CryptoCC26XX_releaseKey(handle, &keyIndex);
if (status != CRYPTOCC26XX_STATUS_SUCCESS) {
System_abort("Key release was not successful.");
}
//Semaphore_post(semTxHandle);
}
static void txTaskFunction(UArg arg0, UArg arg1)
{
uint32_t time;
RF_Params rfParams;
RF_Params_init(&rfParams);
RF_cmdPropTx.pktLen = PAYLOAD_LENGTH;
// RF_cmdPropTx.pPkt = txPacket;
RF_cmdPropTx.pPkt = ccmSetup.clearAndCipherText;
RF_cmdPropTx.startTrigger.triggerType = TRIG_ABSTIME;
RF_cmdPropTx.startTrigger.pastTrig = 1;
RF_cmdPropTx.startTime = 0;
while(1)
{
Semaphore_pend(semTxHandle, BIOS_WAIT_FOREVER);
if (!rfHandle) {
/* Request access to the radio */
rfHandle = RF_open(&rfObject, &RF_prop, (RF_RadioSetup*)&RF_cmdPropRadioDivSetup, &rfParams);
/* Set the frequency */
RF_postCmd(rfHandle, (RF_Op*)&RF_cmdFs, RF_PriorityNormal, NULL, 0);
}
/* Get current time */
time = RF_getCurrentTime();
/* Set absolute TX time to utilize automatic power management */
time += PACKET_INTERVAL;
RF_cmdPropTx.startTime = time;
/* Send packet */
rfTxCmd = RF_postCmd(rfHandle, (RF_Op*)&RF_cmdPropTx, RF_PriorityNormal, NULL, 0);
RF_EventMask result = RF_pendCmd(rfHandle, rfTxCmd, (RF_EventCmdDone | RF_EventCmdError | RF_EventLastCmdDone |
RF_EventCmdAborted | RF_EventCmdCancelled | RF_EventCmdStopped));
if (!(result & RF_EventLastCmdDone))
{
/* Error */
while(1);
}
PIN_setOutputValue(pinHandle, Board_LED1,!PIN_getOutputValue(Board_LED1));
/* clear txPacket buffer */
// memset(txPacket, 0, sizeof(txPacket));
memset(ccmSetup.clearAndCipherText, 0, sizeof(ccmSetup.clearAndCipherText));
}
}
/*
* ======== main ========
*/
int main(void)
{
Semaphore_Params semParams;
/* Call board init functions. */
Board_initGeneral();
Board_initUART();
/* Open LED pins */
ledPinHandle = PIN_open(&ledPinState, pinTable);
if(!ledPinHandle)
{
System_abort("Error initializing board LED pins\n");
}
/* Construct a Semaphore object to be used as a resource lock, initial count 0 */
Semaphore_Params_init(&semParams);
Semaphore_construct(&semTxStruct, 0, &semParams);
Semaphore_construct(&semAesStruct, 0, &semParams);
/* Obtain instance handle */
semTxHandle = Semaphore_handle(&semTxStruct);
semAesHandle = Semaphore_handle(&semAesStruct);
/* Initialize task */
TxTask_init(ledPinHandle);
UartTxTask_init(ledPinHandle);
AesTask_init(ledPinHandle);
/* Start BIOS */
BIOS_start();
return (0);
}