This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

CC2745R10-Q1: About ECDSA

Part Number: CC2745R10-Q1

Tool/software:

Hi,

I ran the sample code at the URL below, but the return value of ECDSA_sign is -32.

What could be the cause?

ECDSA_ReturnBehavior is set with ECDSA_RETURN_BEHAVIOR_CALLBACK.

The same phenomenon occurs with ECDSA_RETURN_BEHAVIOR_BLOCKING.

The source code used is also attached.

[Conditions]
SDK:simplelink_lowpower_f3_sdk_8_30_00_11_ea

[URL]
software-dl.ti.com/.../_e_c_d_s_a_8h.html

[Sample]
ECDSA sign with plaintext CryptoKeys for CC27XX and CC35XX devices

Best Regards,
Katsuya

/*
 *  ======== empty.c ========
 */

/* For usleep() */
#include <unistd.h>
#include <stdint.h>
#include <stddef.h>
#include <ti/drivers/cryptoutils/cryptokey/CryptoKeyPlaintext.h>
#include <ti/drivers/cryptoutils/cryptokey/CryptoKeyKeyStore_PSA_init.h>
#include <ti/drivers/cryptoutils/cryptokey/CryptoKeyKeyStore_PSA_helpers.h>
#include <ti/drivers/ECDSA.h>

/* Driver Header files */
#include <ti/drivers/GPIO.h>
// #include <ti/drivers/I2C.h>
// #include <ti/drivers/SPI.h>
// #include <ti/drivers/Watchdog.h>

/* Driver configuration */
#include "ti_drivers_config.h"

static void ECDSA_Callback(
                ECDSA_Handle ecdsaHandle,
                int_fast16_t s2t_ReturnStatus,
                ECDSA_Operation stt_Operation,
                ECDSA_OperationType s4t_OperationType);
static void startecdsa( void);

int_fast16_t operationResult;
/*
 *  ======== mainThread ========
 */
uint8_t myPrivateKeyingMaterial[32] = {0x96, 0xBF, 0x85, 0x49, 0xC3, 0x79, 0xE4, 0x04,
                                       0xED, 0xA1, 0x08, 0xA5, 0x51, 0xF8, 0x36, 0x23,
                                       0x12, 0xD8, 0xD1, 0xB2, 0xA5, 0xFA, 0x57, 0x06,
                                       0xE2, 0xCC, 0x22, 0x5C, 0xF6, 0xF9, 0x77, 0xC4};
uint8_t messageHash[32] = {0xA4,0x1A,0x41,0xA1,0x2A,0x79,0x95,0x48,
                           0x21,0x1C,0x41,0x0C,0x65,0xD8,0x13,0x3A,
                           0xFD,0xE3,0x4D,0x28,0xBD,0xD5,0x42,0xE4,
                           0xB6,0x80,0xCF,0x28,0x99,0xC8,0xA8,0xC4};

uint8_t r[32];
uint8_t s[32];
static void ECDSA_Callback(
                ECDSA_Handle ecdsaHandle,
                int_fast16_t s2t_ReturnStatus,
                ECDSA_Operation stt_Operation,
                ECDSA_OperationType s4t_OperationType)
{
    if( ECDSA_STATUS_SUCCESS == s2t_ReturnStatus )
    {
    }
}

static void startecdsa( void )
{
    CryptoKey myPrivateKey;
    ECDSA_Handle ecdsaHandle;

    ECDSA_OperationSign    operationSign;
    ECDSA_Params         ECDSA_params;
    // Since we are using default ECDSA_Params, we just pass in NULL for that parameter.
    ECDSA_init();
    ECDSA_Params_init( &ECDSA_params );
    ECDSA_params.returnBehavior = ECDSA_RETURN_BEHAVIOR_CALLBACK;
    ECDSA_params.callbackFxn = ECDSA_Callback;
    ecdsaHandle = ECDSA_open(0, &ECDSA_params);
    // Since the ECDSA driver for CC27XX and CC35XX relies on one HW engine (the HSM) for all of its operations
    // If the HSM boot up sequence fails, ECDSA_open() will return NULL.
    if (!ecdsaHandle) {
        // Handle error
    }
    // Initialize myPrivateKey
    CryptoKeyPlaintextHSM_initKey(&myPrivateKey,
                               myPrivateKeyingMaterial,
                               sizeof(myPrivateKeyingMaterial));
    //CryptoKeyPlaintext_initKey(&myPrivateKey,
    //                           myPrivateKeyingMaterial,
    //                           sizeof(myPrivateKeyingMaterial));

    // Initialize the operation
    // For CC27XX and CC35XX devices, you must specify the curveType instead of providing a pointer to the curve like
    // the case with other devices.
    ECDSA_OperationSign_init(&operationSign);
    operationSign.curve         = &ECCParams_NISTP256;
    operationSign.myPrivateKey      = &myPrivateKey;
    operationSign.hash              = messageHash;
    operationSign.r                 = r;
    operationSign.s                 = s;
    // Generate the signature
    operationResult = ECDSA_sign(ecdsaHandle, &operationSign); // ← Return -32
    if (operationResult != ECDSA_STATUS_SUCCESS) {
        // Handle error
    }
}

void *mainThread(void *arg0)
{
    /* 1 second delay */
    uint32_t time = 1;

    startecdsa();

    while (1)
    {
        sleep(time);
        //GPIO_toggle(CONFIG_GPIO_LED_0);
    }
}

  • Hello,

    I'll run the code provided, but in the meantime, what SDK version are you using?

    Best,

    Nima Behmanesh

  • Hi Nima,

    The SDK used for operation verification was simplelink_lowpower_f3_sdk_8_30_00_11_ea.

    Best Regards,

    Katsuya

  • Hello,

    The 8.30.00.11_EA version should no longer be used. Because that's an early access version of the SDK, it has not gone through the full testing cycle and issues may occur. Please move to the latest SDK and re-run your tests.

    Best,

    Nima Behmanesh

  • Hi Nima,

    I checked using SDK 8.40 and the same issue occurred.

    Best Regards,

    Katsuya

  • Hello,

     // Initialize the operation
        // For CC27XX and CC35XX devices, you must specify the curveType instead of providing a pointer to the curve like
        // the case with other devices.
        ECDSA_OperationSign_init(&operationSign);
        // operationSign.curve         = &ECCParams_NISTP256; <-- Line causing the issue
        operationSign.curveType         = ECDSA_TYPE_SEC_P_256_R1; // <-- Fix.
        operationSign.myPrivateKey      = &myPrivateKey;
        operationSign.hash              = messageHash;
        operationSign.r                 = r;
        operationSign.s                 = s;
        // Generate the signature
        operationResult = ECDSA_sign(ecdsaHandle, &operationSign);
        if (operationResult != ECDSA_STATUS_SUCCESS) {
            // Handle error
        }

    For the CC27xx, you must specify the curveType instead of providing a pointer to the curve.

    Hope that helps.

    Best,

    Nima Behmanesh