32 #define TRACE_LEVEL CRYPTO_TRACE_LEVEL
35 #include "hw_sce_private.h"
36 #include "hw_sce_ra_private.h"
37 #include "hw_sce_rsa_private.h"
38 #include "hw_sce_ecc_private.h"
48 #if (RA4_CRYPTO_PKC_SUPPORT == ENABLED)
81 if((aLen <= 256 && eLen <= 4 && pLen <= 256) ||
82 (aLen <= 384 && eLen <= 4 && pLen <= 384) ||
83 (aLen <= 512 && eLen <= 4 && pLen <= 512))
85 sce_oem_cmd_t command;
90 command = SCE_OEM_CMD_RSA2048_PUBLIC;
95 command = SCE_OEM_CMD_RSA3072_PUBLIC;
100 command = SCE_OEM_CMD_RSA4096_PUBLIC;
115 status = HW_SCE_GenerateOemKeyIndexPrivate(SCE_OEM_KEY_TYPE_PLAIN,
116 command, NULL, NULL, (uint8_t *) rsaArgs.
key, rsaArgs.
wrappedKey);
119 if(status == FSP_SUCCESS)
124 status = HW_SCE_Rsa2048ModularExponentEncryptSub(rsaArgs.
wrappedKey,
125 rsaArgs.
m, rsaArgs.
c);
129 status = HW_SCE_Rsa3072ModularExponentEncryptSub(rsaArgs.
wrappedKey,
130 rsaArgs.
m, rsaArgs.
c);
134 status = HW_SCE_Rsa4096ModularExponentEncryptSub(rsaArgs.
wrappedKey,
135 rsaArgs.
m, rsaArgs.
c);
139 status = FSP_ERR_CRYPTO_NOT_IMPLEMENTED;
144 if(status == FSP_SUCCESS)
194 if(aLen <= 256 && eLen <= 256 && pLen <= 256)
207 status = HW_SCE_GenerateOemKeyIndexPrivate(SCE_OEM_KEY_TYPE_PLAIN,
208 SCE_OEM_CMD_RSA2048_PRIVATE, NULL, NULL, (uint8_t *) rsaArgs.
key,
212 if(status == FSP_SUCCESS)
215 status = HW_SCE_Rsa2048ModularExponentDecryptSub(rsaArgs.
wrappedKey,
216 rsaArgs.
c, rsaArgs.
m);
220 if(status == FSP_SUCCESS)
286 if(nLen <= 256 && dLen <= 256)
291 else if(nLen > 0 && pLen > 0 && qLen > 0 && dpLen > 0 && dqLen > 0 &&
349 else if(nLen > 0 && dLen > 0)
382 sce_oem_cmd_t oemCommand;
387 curveType = SCE_ECC_CURVE_TYPE_KOBLITZ;
388 oemCommand = SCE_OEM_CMD_ECC_SECP256K1_PRIVATE;
394 curveType = SCE_ECC_CURVE_TYPE_NIST;
395 oemCommand = SCE_OEM_CMD_ECC_P256_PRIVATE;
401 curveType = SCE_ECC_CURVE_TYPE_NIST;
402 oemCommand = SCE_OEM_CMD_ECC_P384_PRIVATE;
408 curveType = SCE_ECC_CURVE_TYPE_BRAINPOOL;
409 oemCommand = SCE_OEM_CMD_ECC_P256R1_PRIVATE;
415 curveType = SCE_ECC_CURVE_TYPE_BRAINPOOL;
416 oemCommand = SCE_OEM_CMD_ECC_P384R1_PRIVATE;
436 status = HW_SCE_GenerateOemKeyIndexPrivate(SCE_OEM_KEY_TYPE_PLAIN,
437 oemCommand, NULL, NULL, (uint8_t *) ecArgs.
d, ecArgs.
wrappedKey);
440 if(status == FSP_SUCCESS)
445 status = HW_SCE_Ecc256ScalarMultiplicationSub(&curveType,
450 status = HW_SCE_Ecc384ScalarMultiplicationSub(&curveType,
455 status = FSP_ERR_CRYPTO_NOT_IMPLEMENTED;
460 if(status == FSP_SUCCESS)
507 const uint8_t *digest,
size_t digestLen,
EcdsaSignature *signature)
515 sce_oem_cmd_t oemCommand;
518 if(params == NULL || privateKey == NULL || digest == NULL || signature == NULL)
527 curveType = SCE_ECC_CURVE_TYPE_KOBLITZ;
528 oemCommand = SCE_OEM_CMD_ECC_SECP256K1_PRIVATE;
534 curveType = SCE_ECC_CURVE_TYPE_NIST;
535 oemCommand = SCE_OEM_CMD_ECC_P256_PRIVATE;
541 curveType = SCE_ECC_CURVE_TYPE_NIST;
542 oemCommand = SCE_OEM_CMD_ECC_P384_PRIVATE;
548 curveType = SCE_ECC_CURVE_TYPE_BRAINPOOL;
549 oemCommand = SCE_OEM_CMD_ECC_P256R1_PRIVATE;
555 curveType = SCE_ECC_CURVE_TYPE_BRAINPOOL;
556 oemCommand = SCE_OEM_CMD_ECC_P384R1_PRIVATE;
566 digestLen =
MIN(digestLen, orderLen);
573 osMemcpy((uint8_t *) ecArgs.
digest +
n - digestLen, digest, digestLen);
579 status = HW_SCE_GenerateOemKeyIndexPrivate(SCE_OEM_KEY_TYPE_PLAIN,
580 oemCommand, NULL, NULL, (uint8_t *) ecArgs.
d, ecArgs.
wrappedKey);
583 if(status == FSP_SUCCESS)
588 status = HW_SCE_EcdsaSignatureGenerateSub(&curveType, &command,
593 status = HW_SCE_EcdsaP384SignatureGenerateSub(&curveType,
598 status = FSP_ERR_CRYPTO_NOT_IMPLEMENTED;
603 if(status == FSP_SUCCESS)
640 const EcPublicKey *publicKey,
const uint8_t *digest,
size_t digestLen,
648 sce_oem_cmd_t oemCommand;
651 if(params == NULL || publicKey == NULL || digest == NULL || signature == NULL)
676 curveType = SCE_ECC_CURVE_TYPE_KOBLITZ;
677 oemCommand = SCE_OEM_CMD_ECC_SECP256K1_PUBLIC;
683 curveType = SCE_ECC_CURVE_TYPE_NIST;
684 oemCommand = SCE_OEM_CMD_ECC_P256_PUBLIC;
690 curveType = SCE_ECC_CURVE_TYPE_NIST;
691 oemCommand = SCE_OEM_CMD_ECC_P384_PUBLIC;
697 curveType = SCE_ECC_CURVE_TYPE_BRAINPOOL;
698 oemCommand = SCE_OEM_CMD_ECC_P256R1_PUBLIC;
704 curveType = SCE_ECC_CURVE_TYPE_BRAINPOOL;
705 oemCommand = SCE_OEM_CMD_ECC_P384R1_PUBLIC;
715 digestLen =
MIN(digestLen, orderLen);
722 osMemcpy((uint8_t *) ecArgs.
digest +
n - digestLen, digest, digestLen);
733 status = HW_SCE_GenerateOemKeyIndexPrivate(SCE_OEM_KEY_TYPE_PLAIN,
734 oemCommand, NULL, NULL, (uint8_t *) ecArgs.
q, ecArgs.
wrappedKey);
737 if(status == FSP_SUCCESS)
742 status = HW_SCE_EcdsaSignatureVerificationSub(&curveType, &command,
747 status = HW_SCE_EcdsaP384SignatureVerificationSub(&curveType,
752 status = FSP_ERR_CRYPTO_NOT_IMPLEMENTED;
General definitions for cryptographic algorithms.
#define mpiReadRaw(r, data, length)
#define mpiWriteRaw(a, data, length)
ECC (Elliptic Curve Cryptography)
ECDSA (Elliptic Curve Digital Signature Algorithm)
@ ERROR_INVALID_SIGNATURE
@ ERROR_FAILURE
Generic error code.
@ ERROR_INVALID_PARAMETER
Invalid parameter.
error_t mpiMul(Mpi *r, const Mpi *a, const Mpi *b)
Multiple precision multiplication.
error_t mpiExpMod(Mpi *r, const Mpi *a, const Mpi *e, const Mpi *p)
Modular exponentiation.
error_t mpiMulMod(Mpi *r, const Mpi *a, const Mpi *b, const Mpi *p)
Modular multiplication.
error_t mpiSetValue(Mpi *r, int_t a)
Set the value of a multiple precision integer.
error_t mpiSub(Mpi *r, const Mpi *a, const Mpi *b)
Multiple precision subtraction.
int_t mpiCompInt(const Mpi *a, int_t b)
Compare a multiple precision integer with an integer.
int_t mpiComp(const Mpi *a, const Mpi *b)
Compare two multiple precision integers.
void mpiInit(Mpi *r)
Initialize a multiple precision integer.
uint_t mpiGetByteLength(const Mpi *a)
Get the actual length in bytes.
void mpiFree(Mpi *r)
Release a multiple precision integer.
error_t mpiAdd(Mpi *r, const Mpi *a, const Mpi *b)
Multiple precision addition.
error_t mpiMod(Mpi *r, const Mpi *a, const Mpi *p)
Modulo operation.
#define osMemset(p, value, length)
#define osMemcpy(dest, src, length)
void osAcquireMutex(OsMutex *mutex)
Acquire ownership of the specified mutex object.
void osReleaseMutex(OsMutex *mutex)
Release ownership of the specified mutex object.
RA4 hardware cryptographic accelerator (SCE5 / SCE9)
error_t mpiExpModRegular(Mpi *r, const Mpi *a, const Mpi *e, const Mpi *p)
Modular exponentiation (regular calculation)
error_t ecMult(const EcDomainParameters *params, EcPoint *r, const Mpi *d, const EcPoint *s)
Scalar multiplication.
error_t rsadp(const RsaPrivateKey *key, const Mpi *c, Mpi *m)
RSA decryption primitive.
error_t ecdsaGenerateSignature(const PrngAlgo *prngAlgo, void *prngContext, const EcDomainParameters *params, const EcPrivateKey *privateKey, const uint8_t *digest, size_t digestLen, EcdsaSignature *signature)
ECDSA signature generation.
error_t ecdsaVerifySignature(const EcDomainParameters *params, const EcPublicKey *publicKey, const uint8_t *digest, size_t digestLen, const EcdsaSignature *signature)
ECDSA signature verification.
error_t mpiExpModFast(Mpi *r, const Mpi *a, const Mpi *e, const Mpi *p)
Modular exponentiation (fast calculation)
RA4 public-key hardware accelerator.
RSA public-key cryptography standard.
const char_t * name
Curve name.
Mpi q
Order of the point G.
Arbitrary precision integer.
Mpi dq
Second factor's CRT exponent.
Mpi dp
First factor's CRT exponent.