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 || key == NULL ||
210 message == NULL || ciphertext == NULL || ciphertextLen == NULL)
221 if(nLen <= 4096 && eLen <= 512 && messageLen <= 512)
234 genericRsa.algo = RSA_PKCS1_V1_5_CRYPT;
235 genericRsa.mode = kEncryption;
236 genericRsa.key_size = nLen;
237 genericRsa.modulus = (uint32_t) eleRsaArgs.n;
238 genericRsa.modulus_size = (nLen + 7) / 8;
239 genericRsa.pub_exponent = (uint32_t) eleRsaArgs.e;
240 genericRsa.pub_exponent_size = eLen;
241 genericRsa.plaintext = (uint32_t) eleRsaArgs.m;
242 genericRsa.plaintext_size = messageLen;
243 genericRsa.ciphertext = (uint32_t) eleRsaArgs.c;
244 genericRsa.ciphertext_size = (nLen + 7) / 8;
245 genericRsa.flags = kFlagDigest;
248 status = ELE_GenericRsa(MU_APPS_S3MUA, &genericRsa);
251 if(status == kStatus_Success)
254 osMemcpy(ciphertext, eleRsaArgs.c, (nLen + 7) / 8);
256 *ciphertextLen = (nLen + 7) / 8;
293 const uint8_t *ciphertext,
size_t ciphertextLen, uint8_t *
message,
294 size_t messageSize,
size_t *messageLen)
300 ele_generic_rsa_t genericRsa = {0};
303 if(key == NULL || ciphertext == NULL ||
message == NULL ||
304 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;
402 const char_t *label,
size_t labelLen,
const uint8_t *
message,
403 size_t messageLen, uint8_t *ciphertext,
size_t *ciphertextLen)
410 generic_rsa_algo_t algo;
411 ele_generic_rsa_t genericRsa = {0};
414 if(prngAlgo == NULL || prngContext == NULL || key == NULL || hash == NULL ||
415 mgfHash == NULL ||
message == NULL || ciphertext == NULL ||
416 ciphertextLen == NULL)
424 algo = RSA_PKCS1_OAEP_SHA1;
428 algo = RSA_PKCS1_OAEP_SHA224;
432 algo = RSA_PKCS1_OAEP_SHA256;
436 algo = RSA_PKCS1_OAEP_SHA384;
440 algo = RSA_PKCS1_OAEP_SHA512;
453 if(nLen <= 4096 && eLen <= 512 && messageLen <= 512)
477 genericRsa.algo = algo;
478 genericRsa.mode = kEncryption;
479 genericRsa.key_size = nLen;
480 genericRsa.modulus = (uint32_t) eleRsaArgs.n;
481 genericRsa.modulus_size = (nLen + 7) / 8;
482 genericRsa.pub_exponent = (uint32_t) eleRsaArgs.e;
483 genericRsa.pub_exponent_size = eLen;
484 genericRsa.plaintext = (uint32_t) eleRsaArgs.m;
485 genericRsa.plaintext_size = messageLen;
486 genericRsa.ciphertext = (uint32_t) eleRsaArgs.c;
487 genericRsa.ciphertext_size = (nLen + 7) / 8;
488 genericRsa.label = (uint32_t) eleRsaArgs.label;
489 genericRsa.label_size = labelLen;
490 genericRsa.flags = kFlagDigest;
493 status = ELE_GenericRsa(MU_APPS_S3MUA, &genericRsa);
496 if(status == kStatus_Success)
499 osMemcpy(ciphertext, eleRsaArgs.c, (nLen + 7) / 8);
501 *ciphertextLen = (nLen + 7) / 8;
543 const uint8_t *ciphertext,
size_t ciphertextLen, uint8_t *
message,
544 size_t messageSize,
size_t *messageLen)
551 generic_rsa_algo_t algo;
552 ele_generic_rsa_t genericRsa = {0};
555 if(key == NULL || hash == NULL || mgfHash == NULL || ciphertext == NULL ||
556 message == NULL || messageSize == 0 || messageLen == NULL)
564 algo = RSA_PKCS1_OAEP_SHA1;
568 algo = RSA_PKCS1_OAEP_SHA224;
572 algo = RSA_PKCS1_OAEP_SHA256;
576 algo = RSA_PKCS1_OAEP_SHA384;
580 algo = RSA_PKCS1_OAEP_SHA512;
593 if(nLen <= 4096 && dLen <= 512 && ciphertextLen <= 512)
603 osMemcpy(eleRsaArgs.c, ciphertext, ciphertextLen);
617 genericRsa.algo = algo;
618 genericRsa.mode = kDecryption;
619 genericRsa.key_size = nLen;
620 genericRsa.modulus = (uint32_t) eleRsaArgs.n;
621 genericRsa.modulus_size = (nLen + 7) / 8;
622 genericRsa.priv_exponent = (uint32_t) eleRsaArgs.d;
623 genericRsa.priv_exponent_size = dLen;
624 genericRsa.ciphertext = (uint32_t) eleRsaArgs.c;
625 genericRsa.ciphertext_size = ciphertextLen;
626 genericRsa.plaintext = (uint32_t) eleRsaArgs.m;
627 genericRsa.plaintext_size = (nLen + 7) / 8;
628 genericRsa.label = (uint32_t) eleRsaArgs.label;
629 genericRsa.label_size = labelLen;
630 genericRsa.flags = kFlagDigest;
633 status = ELE_GenericRsa(MU_APPS_S3MUA, &genericRsa);
636 if(status == kStatus_Success)
639 if(genericRsa.out_plaintext_len <= messageSize)
644 *messageLen = genericRsa.out_plaintext_len;
686 const uint8_t *digest, uint8_t *signature,
size_t *signatureLen)
692 generic_rsa_algo_t algo;
693 ele_generic_rsa_t genericRsa = {0};
696 if(key == NULL || hash == NULL || digest == NULL || signature == NULL ||
697 signatureLen == NULL)
705 algo = RSA_PKCS1_V1_5_SHA224_SIGN;
709 algo = RSA_PKCS1_V1_5_SHA256_SIGN;
713 algo = RSA_PKCS1_V1_5_SHA384_SIGN;
717 algo = RSA_PKCS1_V1_5_SHA512_SIGN;
730 if(nLen <= 4096 && dLen <= 512)
743 genericRsa.algo = algo;
744 genericRsa.mode = kSignGen;
745 genericRsa.key_size = nLen;
746 genericRsa.modulus = (uint32_t) eleRsaArgs.n;
747 genericRsa.modulus_size = (nLen + 7) / 8;
748 genericRsa.priv_exponent = (uint32_t) eleRsaArgs.d;
749 genericRsa.priv_exponent_size = dLen;
750 genericRsa.digest = (uint32_t) eleRsaArgs.digest;
752 genericRsa.signature = (uint32_t) eleRsaArgs.signature;
753 genericRsa.signature_size = (nLen + 7) / 8;
754 genericRsa.flags = kFlagDigest;
757 status = ELE_GenericRsa(MU_APPS_S3MUA, &genericRsa);
760 if(status == kStatus_Success)
763 osMemcpy(signature, eleRsaArgs.signature, (nLen + 7) / 8);
765 *signatureLen = (nLen + 7) / 8;
801 const uint8_t *digest,
const uint8_t *signature,
size_t signatureLen)
807 generic_rsa_algo_t algo;
808 ele_generic_rsa_t genericRsa = {0};
811 if(key == NULL || hash == NULL || digest == NULL || signature == NULL)
817 algo = RSA_PKCS1_V1_5_SHA224_SIGN;
821 algo = RSA_PKCS1_V1_5_SHA256_SIGN;
825 algo = RSA_PKCS1_V1_5_SHA384_SIGN;
829 algo = RSA_PKCS1_V1_5_SHA512_SIGN;
842 if(nLen <= 4096 && eLen <= 512 && signatureLen <= 512)
854 osMemcpy(eleRsaArgs.signature, signature, signatureLen);
857 genericRsa.algo = algo;
858 genericRsa.mode = kVerification;
859 genericRsa.key_size = nLen;
860 genericRsa.modulus = (uint32_t) eleRsaArgs.n;
861 genericRsa.modulus_size = (nLen + 7) / 8;
862 genericRsa.pub_exponent = (uint32_t) eleRsaArgs.e;
863 genericRsa.pub_exponent_size = eLen;
864 genericRsa.digest = (uint32_t) eleRsaArgs.digest;
866 genericRsa.signature = (uint32_t) eleRsaArgs.signature;
867 genericRsa.signature_size = signatureLen;
868 genericRsa.flags = kFlagDigest;
871 status = ELE_GenericRsa(MU_APPS_S3MUA, &genericRsa);
874 if(status == kStatus_Success)
877 if(genericRsa.verify_status == kVerifySuccess)
881 else if(genericRsa.verify_status == kVerifyFailure)
926 size_t saltLen,
const uint8_t *digest, uint8_t *signature,
927 size_t *signatureLen)
933 generic_rsa_algo_t algo;
934 ele_generic_rsa_t genericRsa = {0};
937 if(prngAlgo == NULL || prngContext == NULL || key == NULL || hash == NULL ||
938 mgfHash == NULL || digest == NULL || signature == NULL ||
939 signatureLen == NULL)
947 algo = RSA_PKCS1_PSS_MGF1_SHA224;
951 algo = RSA_PKCS1_PSS_MGF1_SHA256;
955 algo = RSA_PKCS1_PSS_MGF1_SHA384;
959 algo = RSA_PKCS1_PSS_MGF1_SHA512;
972 if(nLen <= 4096 && dLen <= 512)
985 genericRsa.algo = algo;
986 genericRsa.mode = kSignGen;
987 genericRsa.key_size = nLen;
988 genericRsa.modulus = (uint32_t) eleRsaArgs.n;
989 genericRsa.modulus_size = (nLen + 7) / 8;
990 genericRsa.priv_exponent = (uint32_t) eleRsaArgs.d;
991 genericRsa.priv_exponent_size = dLen;
992 genericRsa.digest = (uint32_t) eleRsaArgs.digest;
994 genericRsa.signature = (uint32_t) eleRsaArgs.signature;
995 genericRsa.signature_size = (nLen + 7) / 8;
996 genericRsa.flags = kFlagDigest;
999 status = ELE_GenericRsa(MU_APPS_S3MUA, &genericRsa);
1002 if(status == kStatus_Success)
1005 osMemcpy(signature, eleRsaArgs.signature, (nLen + 7) / 8);
1007 *signatureLen = (nLen + 7) / 8;
1045 const HashAlgo *mgfHash,
size_t saltLen,
const uint8_t *digest,
1046 const uint8_t *signature,
size_t signatureLen)
1052 generic_rsa_algo_t algo;
1053 ele_generic_rsa_t genericRsa = {0};
1056 if(key == NULL || hash == NULL || mgfHash == NULL || digest == NULL ||
1065 algo = RSA_PKCS1_PSS_MGF1_SHA224;
1069 algo = RSA_PKCS1_PSS_MGF1_SHA256;
1073 algo = RSA_PKCS1_PSS_MGF1_SHA384;
1077 algo = RSA_PKCS1_PSS_MGF1_SHA512;
1090 if(nLen <= 4096 && eLen <= 512 && signatureLen <= 512)
1102 osMemcpy(eleRsaArgs.signature, signature, signatureLen);
1105 genericRsa.algo = algo;
1106 genericRsa.mode = kVerification;
1107 genericRsa.key_size = nLen;
1108 genericRsa.modulus = (uint32_t) eleRsaArgs.n;
1109 genericRsa.modulus_size = (nLen + 7) / 8;
1110 genericRsa.pub_exponent = (uint32_t) eleRsaArgs.e;
1111 genericRsa.pub_exponent_size = eLen;
1112 genericRsa.digest = (uint32_t) eleRsaArgs.digest;
1114 genericRsa.signature = (uint32_t) eleRsaArgs.signature;
1115 genericRsa.signature_size = signatureLen;
1116 genericRsa.flags = kFlagDigest;
1119 status = ELE_GenericRsa(MU_APPS_S3MUA, &genericRsa);
1122 if(status == kStatus_Success)
1125 if(genericRsa.verify_status == kVerifySuccess)
1129 else if(genericRsa.verify_status == kVerifyFailure)