32 #define TRACE_LEVEL CRYPTO_TRACE_LEVEL
35 #include "fsl_device_registers.h"
36 #include "ele_crypto.h"
44 #if (MIMXRT1180_CRYPTO_PKC_SUPPORT == ENABLED)
50 #if (RSA_SUPPORT == ENABLED)
68 ele_generic_rsa_t genericRsa = {0};
71 if(privateKey == NULL)
79 if(e == 3 || e == 5 || e == 17)
81 eleRsaArgs.e[0] = e & 0xFF;
86 eleRsaArgs.e[0] = (e >> 8) & 0xFF;
87 eleRsaArgs.e[1] = e & 0xFF;
92 eleRsaArgs.e[0] = (e >> 16) & 0xFF;
93 eleRsaArgs.e[1] = (e >> 8) & 0xFF;
94 eleRsaArgs.e[2] = e & 0xFF;
106 genericRsa.key_size = k;
107 genericRsa.modulus = (uint32_t) eleRsaArgs.n;
108 genericRsa.modulus_size = (k + 7) / 8;
109 genericRsa.priv_exponent = (uint32_t) eleRsaArgs.d;
110 genericRsa.priv_exponent_size = (k + 7) / 8;
111 genericRsa.pub_exponent = (uint32_t) eleRsaArgs.e;
112 genericRsa.pub_exponent_size = eLen;
115 status = ELE_GenericRsaKeygen(MU_APPS_S3MUA, &genericRsa);
118 if(status == kStatus_Success)
127 error =
mpiReadRaw(&privateKey->
d, eleRsaArgs.d, (k + 7) / 8);
134 error =
mpiReadRaw(&privateKey->
n, eleRsaArgs.n, (k + 7) / 8);
200 uint8_t *ciphertext,
size_t *ciphertextLen)
206 ele_generic_rsa_t genericRsa = {0};
209 if(prngAlgo == NULL || prngContext == NULL)
211 if(key == NULL ||
message == NULL)
213 if(ciphertext == NULL || ciphertextLen == NULL)
222 if(nLen <= 4096 && eLen <= 512 && messageLen <= 512)
235 genericRsa.algo = RSA_PKCS1_V1_5_CRYPT;
236 genericRsa.mode = kEncryption;
237 genericRsa.key_size = nLen;
238 genericRsa.modulus = (uint32_t) eleRsaArgs.n;
239 genericRsa.modulus_size = (nLen + 7) / 8;
240 genericRsa.pub_exponent = (uint32_t) eleRsaArgs.e;
241 genericRsa.pub_exponent_size = eLen;
242 genericRsa.plaintext = (uint32_t) eleRsaArgs.m;
243 genericRsa.plaintext_size = messageLen;
244 genericRsa.ciphertext = (uint32_t) eleRsaArgs.c;
245 genericRsa.ciphertext_size = (nLen + 7) / 8;
246 genericRsa.flags = kFlagDigest;
249 status = ELE_GenericRsa(MU_APPS_S3MUA, &genericRsa);
252 if(status == kStatus_Success)
255 osMemcpy(ciphertext, eleRsaArgs.c, (nLen + 7) / 8);
257 *ciphertextLen = (nLen + 7) / 8;
294 const uint8_t *ciphertext,
size_t ciphertextLen, uint8_t *
message,
295 size_t messageSize,
size_t *messageLen)
301 ele_generic_rsa_t genericRsa = {0};
304 if(key == NULL || ciphertext == NULL)
306 if(
message == NULL || messageSize == 0 || messageLen == NULL)
315 if(nLen <= 4096 && dLen <= 512 && ciphertextLen <= 512)
325 osMemcpy(eleRsaArgs.c, ciphertext, ciphertextLen);
328 genericRsa.algo = RSA_PKCS1_V1_5_CRYPT;
329 genericRsa.mode = kDecryption;
330 genericRsa.key_size = nLen;
331 genericRsa.modulus = (uint32_t) eleRsaArgs.n;
332 genericRsa.modulus_size = (nLen + 7) / 8;
333 genericRsa.priv_exponent = (uint32_t) eleRsaArgs.d;
334 genericRsa.priv_exponent_size = dLen;
335 genericRsa.ciphertext = (uint32_t) eleRsaArgs.c;
336 genericRsa.ciphertext_size = ciphertextLen;
337 genericRsa.plaintext = (uint32_t) eleRsaArgs.m;
338 genericRsa.plaintext_size = (nLen + 7) / 8;
339 genericRsa.flags = kFlagDigest;
342 status = ELE_GenericRsa(MU_APPS_S3MUA, &genericRsa);
345 if(status == kStatus_Success)
348 if(genericRsa.out_plaintext_len <= messageSize)
353 *messageLen = genericRsa.out_plaintext_len;
400 const uint8_t *
message,
size_t messageLen, uint8_t *ciphertext,
401 size_t *ciphertextLen)
408 generic_rsa_algo_t algo;
409 ele_generic_rsa_t genericRsa = {0};
412 if(prngAlgo == NULL || prngContext == NULL)
414 if(key == NULL ||
message == NULL)
416 if(ciphertext == NULL || ciphertextLen == NULL)
422 algo = RSA_PKCS1_OAEP_SHA1;
426 algo = RSA_PKCS1_OAEP_SHA224;
430 algo = RSA_PKCS1_OAEP_SHA256;
434 algo = RSA_PKCS1_OAEP_SHA384;
438 algo = RSA_PKCS1_OAEP_SHA512;
451 if(nLen <= 4096 && eLen <= 512 && messageLen <= 512)
475 genericRsa.algo = algo;
476 genericRsa.mode = kEncryption;
477 genericRsa.key_size = nLen;
478 genericRsa.modulus = (uint32_t) eleRsaArgs.n;
479 genericRsa.modulus_size = (nLen + 7) / 8;
480 genericRsa.pub_exponent = (uint32_t) eleRsaArgs.e;
481 genericRsa.pub_exponent_size = eLen;
482 genericRsa.plaintext = (uint32_t) eleRsaArgs.m;
483 genericRsa.plaintext_size = messageLen;
484 genericRsa.ciphertext = (uint32_t) eleRsaArgs.c;
485 genericRsa.ciphertext_size = (nLen + 7) / 8;
486 genericRsa.label = (uint32_t) eleRsaArgs.label;
487 genericRsa.label_size = labelLen;
488 genericRsa.flags = kFlagDigest;
491 status = ELE_GenericRsa(MU_APPS_S3MUA, &genericRsa);
494 if(status == kStatus_Success)
497 osMemcpy(ciphertext, eleRsaArgs.c, (nLen + 7) / 8);
499 *ciphertextLen = (nLen + 7) / 8;
538 const char_t *label,
const uint8_t *ciphertext,
size_t ciphertextLen,
539 uint8_t *
message,
size_t messageSize,
size_t *messageLen)
546 generic_rsa_algo_t algo;
547 ele_generic_rsa_t genericRsa = {0};
550 if(key == NULL || ciphertext == NULL)
552 if(
message == NULL || messageSize == 0 || messageLen == NULL)
558 algo = RSA_PKCS1_OAEP_SHA1;
562 algo = RSA_PKCS1_OAEP_SHA224;
566 algo = RSA_PKCS1_OAEP_SHA256;
570 algo = RSA_PKCS1_OAEP_SHA384;
574 algo = RSA_PKCS1_OAEP_SHA512;
587 if(nLen <= 4096 && dLen <= 512 && ciphertextLen <= 512)
597 osMemcpy(eleRsaArgs.c, ciphertext, ciphertextLen);
611 genericRsa.algo = algo;
612 genericRsa.mode = kDecryption;
613 genericRsa.key_size = nLen;
614 genericRsa.modulus = (uint32_t) eleRsaArgs.n;
615 genericRsa.modulus_size = (nLen + 7) / 8;
616 genericRsa.priv_exponent = (uint32_t) eleRsaArgs.d;
617 genericRsa.priv_exponent_size = dLen;
618 genericRsa.ciphertext = (uint32_t) eleRsaArgs.c;
619 genericRsa.ciphertext_size = ciphertextLen;
620 genericRsa.plaintext = (uint32_t) eleRsaArgs.m;
621 genericRsa.plaintext_size = (nLen + 7) / 8;
622 genericRsa.label = (uint32_t) eleRsaArgs.label;
623 genericRsa.label_size = labelLen;
624 genericRsa.flags = kFlagDigest;
627 status = ELE_GenericRsa(MU_APPS_S3MUA, &genericRsa);
630 if(status == kStatus_Success)
633 if(genericRsa.out_plaintext_len <= messageSize)
638 *messageLen = genericRsa.out_plaintext_len;
680 const uint8_t *digest, uint8_t *signature,
size_t *signatureLen)
686 generic_rsa_algo_t algo;
687 ele_generic_rsa_t genericRsa = {0};
690 if(key == NULL || hash == NULL || digest == NULL)
692 if(signature == NULL || signatureLen == NULL)
698 algo = RSA_PKCS1_V1_5_SHA224_SIGN;
702 algo = RSA_PKCS1_V1_5_SHA256_SIGN;
706 algo = RSA_PKCS1_V1_5_SHA384_SIGN;
710 algo = RSA_PKCS1_V1_5_SHA512_SIGN;
723 if(nLen <= 4096 && dLen <= 512)
736 genericRsa.algo = algo;
737 genericRsa.mode = kSignGen;
738 genericRsa.key_size = nLen;
739 genericRsa.modulus = (uint32_t) eleRsaArgs.n;
740 genericRsa.modulus_size = (nLen + 7) / 8;
741 genericRsa.priv_exponent = (uint32_t) eleRsaArgs.d;
742 genericRsa.priv_exponent_size = dLen;
743 genericRsa.digest = (uint32_t) eleRsaArgs.digest;
745 genericRsa.signature = (uint32_t) eleRsaArgs.signature;
746 genericRsa.signature_size = (nLen + 7) / 8;
747 genericRsa.flags = kFlagDigest;
750 status = ELE_GenericRsa(MU_APPS_S3MUA, &genericRsa);
753 if(status == kStatus_Success)
756 osMemcpy(signature, eleRsaArgs.signature, (nLen + 7) / 8);
758 *signatureLen = (nLen + 7) / 8;
794 const uint8_t *digest,
const uint8_t *signature,
size_t signatureLen)
800 generic_rsa_algo_t algo;
801 ele_generic_rsa_t genericRsa = {0};
804 if(key == NULL || hash == NULL || digest == NULL || signature == NULL)
810 algo = RSA_PKCS1_V1_5_SHA224_SIGN;
814 algo = RSA_PKCS1_V1_5_SHA256_SIGN;
818 algo = RSA_PKCS1_V1_5_SHA384_SIGN;
822 algo = RSA_PKCS1_V1_5_SHA512_SIGN;
835 if(nLen <= 4096 && eLen <= 512 && signatureLen <= 512)
847 osMemcpy(eleRsaArgs.signature, signature, signatureLen);
850 genericRsa.algo = algo;
851 genericRsa.mode = kVerification;
852 genericRsa.key_size = nLen;
853 genericRsa.modulus = (uint32_t) eleRsaArgs.n;
854 genericRsa.modulus_size = (nLen + 7) / 8;
855 genericRsa.pub_exponent = (uint32_t) eleRsaArgs.e;
856 genericRsa.pub_exponent_size = eLen;
857 genericRsa.digest = (uint32_t) eleRsaArgs.digest;
859 genericRsa.signature = (uint32_t) eleRsaArgs.signature;
860 genericRsa.signature_size = signatureLen;
861 genericRsa.flags = kFlagDigest;
864 status = ELE_GenericRsa(MU_APPS_S3MUA, &genericRsa);
867 if(status == kStatus_Success)
870 if(genericRsa.verify_status == kVerifySuccess)
874 else if(genericRsa.verify_status == kVerifyFailure)
918 const uint8_t *digest, uint8_t *signature,
size_t *signatureLen)
924 generic_rsa_algo_t algo;
925 ele_generic_rsa_t genericRsa = {0};
928 if(key == NULL || hash == NULL || digest == NULL)
930 if(signature == NULL || signatureLen == NULL)
936 algo = RSA_PKCS1_PSS_MGF1_SHA224;
940 algo = RSA_PKCS1_PSS_MGF1_SHA256;
944 algo = RSA_PKCS1_PSS_MGF1_SHA384;
948 algo = RSA_PKCS1_PSS_MGF1_SHA512;
961 if(nLen <= 4096 && dLen <= 512)
974 genericRsa.algo = algo;
975 genericRsa.mode = kSignGen;
976 genericRsa.key_size = nLen;
977 genericRsa.modulus = (uint32_t) eleRsaArgs.n;
978 genericRsa.modulus_size = (nLen + 7) / 8;
979 genericRsa.priv_exponent = (uint32_t) eleRsaArgs.d;
980 genericRsa.priv_exponent_size = dLen;
981 genericRsa.digest = (uint32_t) eleRsaArgs.digest;
983 genericRsa.signature = (uint32_t) eleRsaArgs.signature;
984 genericRsa.signature_size = (nLen + 7) / 8;
985 genericRsa.flags = kFlagDigest;
988 status = ELE_GenericRsa(MU_APPS_S3MUA, &genericRsa);
991 if(status == kStatus_Success)
994 osMemcpy(signature, eleRsaArgs.signature, (nLen + 7) / 8);
996 *signatureLen = (nLen + 7) / 8;
1033 size_t saltLen,
const uint8_t *digest,
const uint8_t *signature,
1034 size_t signatureLen)
1040 generic_rsa_algo_t algo;
1041 ele_generic_rsa_t genericRsa = {0};
1044 if(key == NULL || hash == NULL || digest == NULL || signature == NULL)
1050 algo = RSA_PKCS1_PSS_MGF1_SHA224;
1054 algo = RSA_PKCS1_PSS_MGF1_SHA256;
1058 algo = RSA_PKCS1_PSS_MGF1_SHA384;
1062 algo = RSA_PKCS1_PSS_MGF1_SHA512;
1075 if(nLen <= 4096 && eLen <= 512 && signatureLen <= 512)
1087 osMemcpy(eleRsaArgs.signature, signature, signatureLen);
1090 genericRsa.algo = algo;
1091 genericRsa.mode = kVerification;
1092 genericRsa.key_size = nLen;
1093 genericRsa.modulus = (uint32_t) eleRsaArgs.n;
1094 genericRsa.modulus_size = (nLen + 7) / 8;
1095 genericRsa.pub_exponent = (uint32_t) eleRsaArgs.e;
1096 genericRsa.pub_exponent_size = eLen;
1097 genericRsa.digest = (uint32_t) eleRsaArgs.digest;
1099 genericRsa.signature = (uint32_t) eleRsaArgs.signature;
1100 genericRsa.signature_size = signatureLen;
1101 genericRsa.flags = kFlagDigest;
1104 status = ELE_GenericRsa(MU_APPS_S3MUA, &genericRsa);
1107 if(status == kStatus_Success)
1110 if(genericRsa.verify_status == kVerifySuccess)
1114 else if(genericRsa.verify_status == kVerifyFailure)