How to encrypt message using RSA.

Tip / Sign in to post questions, reply, level up, and achieve exciting badges. Know more

cross mob
ThGr_4523916
Level 1
Level 1

I'm trying to get a message RSA encrypted using the crypto server. I've used rsa_keygen.bat from the secure_image example to generate a 2048 bit public key which is input for the crypto server. But whenever I call Cy_Crypto_Rsa_Proc it does not generate a 245 bytes long encoded message. It only seems to generate a output message based on the input message length...

Am I doing something wrong with the configuration for the crypto server?

Is there a code example available which RSA encrypts messages using the crypto server?

message to encrypt:

message.PNG

processed message after encryption:

procmessage.PNG

crypto config:

/* Crypto configuration structure */

const cy_stc_crypto_config_t cryptoConfig = {

3,

1,

2,

cpuss_interrupts_ipc_2_IRQn,

2u, },

NULL,

NULL,

NULL,

{

cpuss_interrupts_ipc_1_IRQn,

2u, },

{

cpuss_interrupt_crypto_IRQn,

2u, } };

#include "cy_device_headers.h"#include "cycfg.h"#include "cy_crypto.h"#include "cy_crypto_server.h"#include "stdio_user.h"#include <stdio.h>#include <string.h>
/******************************************************************************* * Macro definitions ********************************************************************************/
/* Macros to configure the Crypto block *//* IPC data channel for the Crypto */#define MY_CHAN_CRYPTO         (uint32_t)(3u)/* IPC interrupt structure for the Crypto server */#define MY_INTR_CRYPTO_SRV     (uint32_t)(1u)/* IPC interrupt structure for the Crypto client */#define MY_INTR_CRYPTO_CLI     (uint32_t)(2u)/* CM0+ IPC interrupt mux number the Crypto server */#define MY_INTR_CRYPTO_SRV_MUX (IRQn_Type)(2u)/* CM0+ IPC interrupt mux number the Crypto client */#define MY_INTR_CRYPTO_CLI_MUX (IRQn_Type)(3u)/* CM0+ ERROR interrupt mux number the Crypto server */#define MY_INTR_CRYPTO_ERR_MUX (IRQn_Type)(4u)
/* The input message size (inclusive of the string terminating character '\0'). * Edit this macro to suit your message size */#define MAX_MESSAGE_SIZE    (100u)
/******************************************************************************* * Data type definitions ********************************************************************************/
/* Data type definition to access the data in 1-byte format as well as 4-byte * aligned format. This is required since the Crypto block operates on 4-byte * aligned values. */
/* Variables to store Crypto internal states */cy_stc_crypto_context_t cryptoScratch;cy_stc_crypto_server_context_t cryptoServerContext;cy_stc_crypto_context_rsa_t cryptoRSA;
/* Crypto configuration structure */const cy_stc_crypto_config_t cryptoConfig = {/* .ipcChannel             */MY_CHAN_CRYPTO,/* .acquireNotifierChannel */MY_INTR_CRYPTO_SRV,/* .releaseNotifierChannel */MY_INTR_CRYPTO_CLI,/* .releaseNotifierConfig */{#if (CY_CPU_CORTEX_M0P) /* .intrSrc            */MY_INTR_CRYPTO_CLI_MUX, /* .cm0pSrc            */cpuss_interrupts_ipc_2_IRQn, /* depends on selected releaseNotifierChannel value */#else /* .intrSrc            */cpuss_interrupts_ipc_2_IRQn, /* depends on selected releaseNotifierChannel value */#endif /* .intrPriority       */2u, },/* .userCompleteCallback   */NULL,/* .userGetDataHandler     */NULL,/* .userErrorHandler       */NULL,/* .acquireNotifierConfig */{#if (CY_CPU_CORTEX_M0P) /* .intrSrc            */MY_INTR_CRYPTO_SRV_MUX, /* to use with DeepSleep mode should be in DeepSleep capable muxer's range */ /* .cm0pSrc            */cpuss_interrupts_ipc_1_IRQn, /* depends on selected acquireNotifierChannel value */#else /* .intrSrc            */cpuss_interrupts_ipc_1_IRQn, /* depends on selected acquireNotifierChannel value */#endif /* .intrPriority       */2u, },/* .cryptoErrorIntrConfig */{#if (CY_CPU_CORTEX_M0P) /* .intrSrc            */MY_INTR_CRYPTO_ERR_MUX, /* .cm0pSrc            */cpuss_interrupt_crypto_IRQn,#else /* .intrSrc            */cpuss_interrupt_crypto_IRQn,#endif /* .intrPriority       */2u, } };
/* Variables to hold the user message and the corresponding encrypted message */CY_ALIGN(4) char message[MAX_MESSAGE_SIZE];CY_ALIGN(4) char procmessage[512];
uint8_t moduloData[] = { 0xB5u, 0xACu, 0xADu, 0x6Du, 0xD0u, 0xF8u, 0x64u, 0x2Fu, 0x16u, 0xA9u, 0x07u, 0x78u, 0x62u, 0x81u, 0x31u, 0x1Bu, 0xD7u, 0xD1u, 0x4Bu, 0x24u, 0xBFu, 0x1Eu, 0x28u, 0x37u, 0x55u, 0xFAu, 0xE5u, 0xD8u, 0x64u, 0x27u, 0xADu, 0xEBu, 0x25u, 0x68u, 0x3Eu, 0x12u, 0x90u, 0xFBu, 0xA6u, 0x9Eu, 0xBCu, 0x4Eu, 0x3Fu, 0x09u, 0x44u, 0xD6u, 0xDEu, 0x48u, 0x38u, 0xD7u, 0x84u, 0x68u, 0x9Eu, 0x22u, 0x1Cu, 0xB8u, 0x66u, 0x08u, 0x3Bu, 0xC9u, 0x35u, 0x99u, 0xC0u, 0x49u, 0xC1u, 0x9Au, 0x32u, 0x0Du, 0x9Du, 0x2Du, 0xFAu, 0x8Au, 0x61u, 0x2Au, 0x27u, 0x77u, 0x5Du, 0x77u, 0x1Bu, 0x92u, 0xC9u, 0xFAu, 0x76u, 0xEFu, 0x70u, 0xF7u, 0xB5u, 0xF9u, 0x34u, 0x70u, 0xE7u, 0xF2u, 0x0Cu, 0xF5u, 0xF3u, 0x11u, 0xF8u, 0xB2u, 0xC1u, 0x03u, 0x50u, 0xA5u, 0x30u, 0x89u, 0x34u, 0x2Eu, 0x3Eu, 0xC2u, 0x3Bu, 0xE7u, 0x6Fu, 0xF9u, 0x46u, 0x5Du, 0x7Bu, 0x29u, 0x49u, 0xE2u, 0xD2u, 0x15u, 0xDEu, 0xD9u, 0x2Du, 0xE8u, 0x95u, 0xCEu, 0x2Eu, 0x21u, 0xD5u, 0x15u, 0xEDu, 0xB2u, 0xCEu, 0xCBu, 0xE4u, 0xDBu, 0x7Au, 0x86u, 0x92u, 0x38u, 0x85u, 0x1Au, 0x57u, 0xA6u, 0xDBu, 0x90u, 0xCEu, 0x29u, 0x3Fu, 0x2Eu, 0xEDu, 0x66u, 0x7Au, 0x72u, 0xDFu, 0xE2u, 0x26u, 0xF2u, 0xD1u, 0xC7u, 0x17u, 0xBCu, 0xC0u, 0x71u, 0x76u, 0xCCu, 0xC1u, 0x63u, 0xA2u, 0xADu, 0x53u, 0x2Fu, 0x8Fu, 0x55u, 0xFAu, 0x40u, 0xA5u, 0x47u, 0x65u, 0x0Cu, 0xA7u, 0x27u, 0xBCu, 0x57u, 0x4Cu, 0x1Cu, 0x53u, 0xC3u, 0x47u, 0x6Cu, 0xE7u, 0xB2u, 0xB3u, 0x12u, 0xE8u, 0xA6u, 0x6Du, 0x07u, 0x2Eu, 0x1Fu, 0xDDu, 0xBAu, 0xBAu, 0xC1u, 0x94u, 0xF9u, 0x23u, 0x0Au, 0xC7u, 0xD0u, 0xC6u, 0x51u, 0x6Bu, 0x6Fu, 0x3Cu, 0xE2u, 0x15u, 0x21u, 0xAFu, 0x95u, 0x2Du, 0x0Du, 0x35u, 0x7Fu, 0x79u, 0xC6u, 0x5Bu, 0xD6u, 0xA9u, 0xC6u, 0x69u, 0xB1u, 0x3Fu, 0x46u, 0xBFu, 0x3Bu, 0x77u, 0xFBu, 0x83u, 0x23u, 0x27u, 0x4Bu, 0x89u, 0xC6u, 0xCBu, 0x86u, 0x82u, 0xE7u, 0x1Au, 0x76u, 0x90u, 0xFCu, 0x0Cu, 0xDAu, 0x8Bu, 0xCDu, };uint8_t expData[] = { 0x01u, 0x00u, 0x01u, 0x00u, };uint8_t barrettData[] = { 0x89u, 0x7Du, 0xDDu, 0x92u, 0x5Au, 0xABu, 0xD8u, 0xC2u, 0xCEu, 0xAFu, 0xF6u, 0x32u, 0x2Bu, 0x96u, 0xDEu, 0xE3u, 0xCFu, 0x7Du, 0x16u, 0x5Eu, 0x50u, 0x15u, 0x94u, 0x6Fu, 0x59u, 0x47u, 0xACu, 0x30u, 0xAAu, 0x12u, 0x57u, 0x1Au, 0xACu, 0x19u, 0xDFu, 0x5Fu, 0x60u, 0x5Fu, 0x13u, 0x67u, 0x91u, 0x65u, 0x92u, 0x56u, 0x14u, 0x0Eu, 0xB2u, 0x68u, 0x67u, 0xF9u, 0x92u, 0xD4u, 0xB5u, 0xE7u, 0xBCu, 0xC5u, 0x13u, 0x07u, 0x0Cu, 0xB6u, 0xF1u, 0x1Fu, 0x6Fu, 0x03u, 0x0Du, 0x00u, 0xC4u, 0x91u, 0xEDu, 0x6Eu, 0x5Bu, 0xCCu, 0x96u, 0x31u, 0xCBu, 0x51u, 0xD4u, 0x3Eu, 0x44u, 0x69u, 0xBCu, 0xB4u, 0x4Du, 0xCCu, 0xDBu, 0xFFu, 0x8Bu, 0xE3u, 0x30u, 0xA2u, 0x1Fu, 0xE0u, 0xCEu, 0xD0u, 0x30u, 0x21u, 0x96u, 0xB4u, 0x58u, 0xBBu, 0x4Fu, 0xF4u, 0x65u, 0xEDu, 0x5Au, 0xCCu, 0xDFu, 0x07u, 0x3Du, 0xDFu, 0x2Eu, 0x8Au, 0x2Cu, 0x61u, 0xDDu, 0x30u, 0x7Bu, 0xBFu, 0x2Du, 0x6Au, 0xBBu, 0x80u, 0x0Cu, 0x7Eu, 0x87u, 0x62u, 0x40u, 0x68u, 0xDDu, 0xF0u, 0x37u, 0xE5u, 0xE0u, 0x8Bu, 0xEFu, 0x3Bu, 0xC3u, 0x16u, 0xB0u, 0x6Cu, 0x6Bu, 0xC2u, 0xB2u, 0xA9u, 0x99u, 0x01u, 0x2Au, 0x93u, 0xD5u, 0xEDu, 0xE3u, 0xFBu, 0xABu, 0x6Au, 0xA2u, 0x50u, 0x9Au, 0x9Au, 0x5Cu, 0xA8u, 0x57u, 0xB8u, 0x33u, 0x9Bu, 0x57u, 0x7Eu, 0xF2u, 0x4Bu, 0x74u, 0xFFu, 0x6Eu, 0xE6u, 0xECu, 0x3Au, 0x37u, 0x16u, 0x59u, 0xB8u, 0x25u, 0xD9u, 0x6Eu, 0x99u, 0x06u, 0x45u, 0x56u, 0x6Eu, 0xF8u, 0xF0u, 0x43u, 0x6Fu, 0x11u, 0x33u, 0x04u, 0x0Cu, 0xB6u, 0x90u, 0xA6u, 0x0Fu, 0xD2u, 0x4Du, 0xC3u, 0x6Au, 0x4Cu, 0xD9u, 0x17u, 0x1Fu, 0x15u, 0xA1u, 0x10u, 0x74u, 0xB0u, 0x75u, 0xFEu, 0xB1u, 0xCBu, 0x4Cu, 0x18u, 0x25u, 0x1Du, 0xCFu, 0x7Cu, 0x00u, 0x26u, 0x1Du, 0x54u, 0x9Eu, 0xB9u, 0x7Bu, 0xD9u, 0x52u, 0xE9u, 0xFFu, 0x46u, 0x2Au, 0x7Bu, 0x58u, 0x56u, 0x69u, 0xBDu, 0x8Cu, 0x1Cu, 0x0Bu, 0x40u, 0x82u, 0x1Au, 0x90u, 0xC6u, 0xF6u, 0x17u, 0xC9u, 0x9Fu, 0x71u, 0xC3u, 0x90u, 0xD6u, 0x3Eu, 0x01u, 0x00u, 0x00u, 0x00u, };uint8_t inverseModuloData[] = { 0x63u, 0x1Eu, 0xD5u, 0x05u, 0xDFu, 0x17u, 0x76u, 0x63u, 0xE9u, 0x2Fu, 0x17u, 0x8Du, 0xB4u, 0xB3u, 0x65u, 0x67u, 0x99u, 0xADu, 0xA7u, 0x3Eu, 0x00u, 0x80u, 0xC6u, 0x5Eu, 0xBFu, 0xEFu, 0xB1u, 0x09u, 0x45u, 0x0Au, 0x55u, 0xD7u, 0x17u, 0x10u, 0x16u, 0x44u, 0x0Du, 0x59u, 0xB3u, 0x16u, 0xEDu, 0x50u, 0x7Fu, 0x9Eu, 0x0Du, 0x0Cu, 0xFCu, 0x04u, 0x60u, 0xF1u, 0x77u, 0x7Cu, 0x90u, 0xFDu, 0x73u, 0x12u, 0x59u, 0x00u, 0x08u, 0x84u, 0xD0u, 0xF5u, 0xBFu, 0x3Du, 0x41u, 0xA9u, 0x4Fu, 0xF8u, 0xBDu, 0x62u, 0xA3u, 0x4Eu, 0x90u, 0x62u, 0x17u, 0x17u, 0x81u, 0x56u, 0x7Cu, 0x44u, 0xF9u, 0x58u, 0x8Au, 0x75u, 0x0Bu, 0xD9u, 0x24u, 0x0Bu, 0xD2u, 0xDDu, 0x35u, 0x3Fu, 0x4Du, 0x33u, 0x34u, 0x01u, 0x90u, 0xD5u, 0xF0u, 0xC6u, 0xAFu, 0xC6u, 0x60u, 0xA2u, 0x7Au, 0x87u, 0xDCu, 0x6Cu, 0x8Fu, 0x19u, 0x9Bu, 0x9Cu, 0x2Du, 0x60u, 0x12u, 0xF4u, 0x25u, 0xD5u, 0x5Au, 0x19u, 0x95u, 0x87u, 0xFCu, 0x0Du, 0xCDu, 0x0Au, 0xC8u, 0x33u, 0xBEu, 0xDEu, 0x24u, 0x63u, 0x9Du, 0xE7u, 0x73u, 0x88u, 0x86u, 0x14u, 0x32u, 0xF5u, 0x70u, 0x48u, 0xBCu, 0xD4u, 0x99u, 0x7Fu, 0x81u, 0x95u, 0xB8u, 0x72u, 0x30u, 0x5Fu, 0x8Du, 0xCAu, 0x21u, 0xD2u, 0x29u, 0xAFu, 0xBEu, 0x49u, 0xB4u, 0xABu, 0xE2u, 0xB1u, 0x2Au, 0x6Au, 0x87u, 0x4Au, 0x83u, 0xBFu, 0x19u, 0xCEu, 0x20u, 0x4Cu, 0x81u, 0x41u, 0x0Du, 0x6Cu, 0xE3u, 0xE6u, 0xC9u, 0xEFu, 0xC5u, 0x1Eu, 0x7Bu, 0x36u, 0xD6u, 0xBAu, 0xE0u, 0x33u, 0x7Eu, 0x1Fu, 0xBEu, 0xABu, 0xCDu, 0xFCu, 0x69u, 0x3Cu, 0x66u, 0xBFu, 0x53u, 0x39u, 0xECu, 0xFAu, 0xC8u, 0x62u, 0xD7u, 0xA7u, 0xBDu, 0x1Cu, 0xBCu, 0xD9u, 0xF8u, 0xF8u, 0x9Du, 0x5Fu, 0xA3u, 0x79u, 0xEBu, 0xEBu, 0x3Fu, 0x50u, 0x1Cu, 0x8Cu, 0x1Fu, 0x30u, 0xB2u, 0x6Au, 0xA6u, 0x0Au, 0x56u, 0x57u, 0xBCu, 0xEFu, 0xE9u, 0xFCu, 0x82u, 0x7Cu, 0xEEu, 0x2Eu, 0x35u, 0xBEu, 0x25u, 0x58u, 0x4Cu, 0xC1u, 0xD0u, 0x5Au, 0xCCu, 0x25u, 0xCBu, 0x23u, 0xF8u, 0xC1u, 0xB0u, 0x51u, };uint8_t rBarData[] = { 0x4Bu, 0x53u, 0x52u, 0x92u, 0x2Fu, 0x07u, 0x9Bu, 0xD0u, 0xE9u, 0x56u, 0xF8u, 0x87u, 0x9Du, 0x7Eu, 0xCEu, 0xE4u, 0x28u, 0x2Eu, 0xB4u, 0xDBu, 0x40u, 0xE1u, 0xD7u, 0xC8u, 0xAAu, 0x05u, 0x1Au, 0x27u, 0x9Bu, 0xD8u, 0x52u, 0x14u, 0xDAu, 0x97u, 0xC1u, 0xEDu, 0x6Fu, 0x04u, 0x59u, 0x61u, 0x43u, 0xB1u, 0xC0u, 0xF6u, 0xBBu, 0x29u, 0x21u, 0xB7u, 0xC7u, 0x28u, 0x7Bu, 0x97u, 0x61u, 0xDDu, 0xE3u, 0x47u, 0x99u, 0xF7u, 0xC4u, 0x36u, 0xCAu, 0x66u, 0x3Fu, 0xB6u, 0x3Eu, 0x65u, 0xCDu, 0xF2u, 0x62u, 0xD2u, 0x05u, 0x75u, 0x9Eu, 0xD5u, 0xD8u, 0x88u, 0xA2u, 0x88u, 0xE4u, 0x6Du, 0x36u, 0x05u, 0x89u, 0x10u, 0x8Fu, 0x08u, 0x4Au, 0x06u, 0xCBu, 0x8Fu, 0x18u, 0x0Du, 0xF3u, 0x0Au, 0x0Cu, 0xEEu, 0x07u, 0x4Du, 0x3Eu, 0xFCu, 0xAFu, 0x5Au, 0xCFu, 0x76u, 0xCBu, 0xD1u, 0xC1u, 0x3Du, 0xC4u, 0x18u, 0x90u, 0x06u, 0xB9u, 0xA2u, 0x84u, 0xD6u, 0xB6u, 0x1Du, 0x2Du, 0xEAu, 0x21u, 0x26u, 0xD2u, 0x17u, 0x6Au, 0x31u, 0xD1u, 0xDEu, 0x2Au, 0xEAu, 0x12u, 0x4Du, 0x31u, 0x34u, 0x1Bu, 0x24u, 0x85u, 0x79u, 0x6Du, 0xC7u, 0x7Au, 0xE5u, 0xA8u, 0x59u, 0x24u, 0x6Fu, 0x31u, 0xD6u, 0xC0u, 0xD1u, 0x12u, 0x99u, 0x85u, 0x8Du, 0x20u, 0x1Du, 0xD9u, 0x0Du, 0x2Eu, 0x38u, 0xE8u, 0x43u, 0x3Fu, 0x8Eu, 0x89u, 0x33u, 0x3Eu, 0x9Cu, 0x5Du, 0x52u, 0xACu, 0xD0u, 0x70u, 0xAAu, 0x05u, 0xBFu, 0x5Au, 0xB8u, 0x9Au, 0xF3u, 0x58u, 0xD8u, 0x43u, 0xA8u, 0xB3u, 0xE3u, 0xACu, 0x3Cu, 0xB8u, 0x93u, 0x18u, 0x4Du, 0x4Cu, 0xEDu, 0x17u, 0x59u, 0x92u, 0xF8u, 0xD1u, 0xE0u, 0x22u, 0x45u, 0x45u, 0x3Eu, 0x6Bu, 0x06u, 0xDCu, 0xF5u, 0x38u, 0x2Fu, 0x39u, 0xAEu, 0x94u, 0x90u, 0xC3u, 0x1Du, 0xEAu, 0xDEu, 0x50u, 0x6Au, 0xD2u, 0xF2u, 0xCAu, 0x80u, 0x86u, 0x39u, 0xA4u, 0x29u, 0x56u, 0x39u, 0x96u, 0x4Eu, 0xC0u, 0xB9u, 0x40u, 0xC4u, 0x88u, 0x04u, 0x7Cu, 0xDCu, 0xD8u, 0xB4u, 0x76u, 0x39u, 0x34u, 0x79u, 0x7Du, 0x18u, 0xE5u, 0x89u, 0x6Fu, 0x03u, 0xF3u, 0x25u, 0x74u, 0x32u, };
//* Barrett coefficient, inverse modulo, and r-bar are optional.
const cy_stc_crypto_rsa_pub_key_t cryptoRsaPubKey ={    /* .moduloPtr        */ moduloData,    /* .moduloLength     */ sizeof(moduloData)/sizeof(moduloData[0]),    /* .pubExpPtr        */ expData,    /* .pubExpLength     */ sizeof(expData)/sizeof(expData[0]),    /* .barretCoefPtr    */ barrettData,    /* .inverseModuloPtr */ inverseModuloData,    /* .rBarPtr          */ rBarData};
int main(void) { /* Set up the device based on configurator selections */ init_cycfg_all();
__enable_irq();
uint8_t messagesize = 0;
/* Start the Crypto Server */ Cy_Crypto_Server_Start(&cryptoConfig, &cryptoServerContext);
/*Initialization of Crypto Driver */ Cy_Crypto_Init(&cryptoConfig, &cryptoScratch);
/* Enable Crypto Hardware */ Cy_Crypto_Enable();
memset(message, 0, MAX_MESSAGE_SIZE); messagesize = 0;
strcpy(message, "hello world!"); messagesize = sizeof("hello world!") / sizeof(char);
/* Wait for Crypto Block to be available */ Cy_Crypto_Sync(CY_CRYPTO_SYNC_BLOCKING);
volatile cy_en_crypto_status_t cryptstat = Cy_Crypto_Rsa_Proc(&cryptoRsaPubKey, (uint32_t*) message, messagesize, (uint32_t*) procmessage,         &cryptoRSA);
/* Wait for Crypto Block to be available */ Cy_Crypto_Sync(CY_CRYPTO_SYNC_BLOCKING);}

0 Likes
1 Solution
AnCi_2234676
Level 4
Level 4
10 replies posted 5 replies posted 10 questions asked

RSA is not safe unless you use a suitable padding scheme to fit the length of your key. To my understanding, the crypto module only handles the RSA encryption algorithm, not the padding. See RFC 2313 - PKCS #1: RSA Encryption Version 1.5 or RFC 2437 - PKCS #1: RSA Cryptography Specifications Version 2.0.

View solution in original post

3 Replies
ShipingW_81
Moderator
Moderator
Moderator
500 replies posted 250 solutions authored 250 replies posted

As far as I know, there is no code example by now for RSA encryption. The description for RSA related API/function in PDL maybe helpful for your application - PSoC 6 RSA Encryption Help

0 Likes
AnCi_2234676
Level 4
Level 4
10 replies posted 5 replies posted 10 questions asked

RSA is not safe unless you use a suitable padding scheme to fit the length of your key. To my understanding, the crypto module only handles the RSA encryption algorithm, not the padding. See RFC 2313 - PKCS #1: RSA Encryption Version 1.5 or RFC 2437 - PKCS #1: RSA Cryptography Specifications Version 2.0.

Yes, that make sense. With my example I'm actually applying plain RSA encryption.

Thanks for your answer, I'm going to read into padding schemes now!

0 Likes