Go to the documentation of this file.
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"
49 #if (RA4_CRYPTO_PKC_SUPPORT == ENABLED)
55 #if (MPI_SUPPORT == ENABLED)
83 if((aLen <= 256 && eLen <= 4 && pLen <= 256) ||
84 (aLen <= 384 && eLen <= 4 && pLen <= 384) ||
85 (aLen <= 512 && eLen <= 4 && pLen <= 512))
87 sce_oem_cmd_t command;
92 command = SCE_OEM_CMD_RSA2048_PUBLIC;
97 command = SCE_OEM_CMD_RSA3072_PUBLIC;
102 command = SCE_OEM_CMD_RSA4096_PUBLIC;
117 status = HW_SCE_GenerateOemKeyIndexPrivate(SCE_OEM_KEY_TYPE_PLAIN,
118 command, NULL, NULL, (uint8_t *) rsaArgs.
key, rsaArgs.
wrappedKey);
121 if(status == FSP_SUCCESS)
126 status = HW_SCE_Rsa2048ModularExponentEncryptSub(rsaArgs.
wrappedKey,
127 rsaArgs.
m, rsaArgs.
c);
131 status = HW_SCE_Rsa3072ModularExponentEncryptSub(rsaArgs.
wrappedKey,
132 rsaArgs.
m, rsaArgs.
c);
136 status = HW_SCE_Rsa4096ModularExponentEncryptSub(rsaArgs.
wrappedKey,
137 rsaArgs.
m, rsaArgs.
c);
141 status = FSP_ERR_CRYPTO_NOT_IMPLEMENTED;
146 if(status == FSP_SUCCESS)
196 if(aLen <= 256 && eLen <= 256 && pLen <= 256)
209 status = HW_SCE_GenerateOemKeyIndexPrivate(SCE_OEM_KEY_TYPE_PLAIN,
210 SCE_OEM_CMD_RSA2048_PRIVATE, NULL, NULL, (uint8_t *) rsaArgs.
key,
214 if(status == FSP_SUCCESS)
217 status = HW_SCE_Rsa2048ModularExponentDecryptSub(rsaArgs.
wrappedKey,
218 rsaArgs.
c, rsaArgs.
m);
222 if(status == FSP_SUCCESS)
247 #if (RSA_SUPPORT == ENABLED)
290 if(nLen <= 256 && dLen <= 256)
295 else if(nLen > 0 && pLen > 0 && qLen > 0 && dpLen > 0 && dqLen > 0 &&
353 else if(nLen > 0 && dLen > 0)
369 #if (EC_SUPPORT == ENABLED)
405 sce_oem_cmd_t oemCommand;
408 if(
osStrcmp(curve->name,
"secp256k1") == 0)
410 curveType = SCE_ECC_CURVE_TYPE_KOBLITZ;
411 oemCommand = SCE_OEM_CMD_ECC_SECP256K1_PRIVATE;
415 else if(
osStrcmp(curve->name,
"secp256r1") == 0)
417 curveType = SCE_ECC_CURVE_TYPE_NIST;
418 oemCommand = SCE_OEM_CMD_ECC_P256_PRIVATE;
422 else if(
osStrcmp(curve->name,
"secp384r1") == 0)
424 curveType = SCE_ECC_CURVE_TYPE_NIST;
425 oemCommand = SCE_OEM_CMD_ECC_P384_PRIVATE;
429 else if(
osStrcmp(curve->name,
"brainpoolP256r1") == 0)
431 curveType = SCE_ECC_CURVE_TYPE_BRAINPOOL;
432 oemCommand = SCE_OEM_CMD_ECC_P256R1_PRIVATE;
436 else if(
osStrcmp(curve->name,
"brainpoolP384r1") == 0)
438 curveType = SCE_ECC_CURVE_TYPE_BRAINPOOL;
439 oemCommand = SCE_OEM_CMD_ECC_P384R1_PRIVATE;
463 status = HW_SCE_GenerateOemKeyIndexPrivate(SCE_OEM_KEY_TYPE_PLAIN,
464 oemCommand, NULL, NULL, (uint8_t *) ecArgs.
d, ecArgs.
wrappedKey);
467 if(status == FSP_SUCCESS)
470 if(curve->fieldSize == 256)
472 status = HW_SCE_Ecc256ScalarMultiplicationSub(&curveType,
475 else if(curve->fieldSize == 384)
477 status = HW_SCE_Ecc384ScalarMultiplicationSub(&curveType,
482 status = FSP_ERR_CRYPTO_NOT_IMPLEMENTED;
487 if(status == FSP_SUCCESS)
522 #if (ECDSA_SUPPORT == ENABLED)
536 const EcPrivateKey *privateKey,
const uint8_t *digest,
size_t digestLen,
545 sce_oem_cmd_t oemCommand;
549 if(privateKey == NULL || digest == NULL || signature == NULL)
553 if(privateKey->
curve == NULL)
557 curve = privateKey->
curve;
560 orderLen = (curve->orderSize + 7) / 8;
563 if(
osStrcmp(curve->name,
"secp256k1") == 0)
565 curveType = SCE_ECC_CURVE_TYPE_KOBLITZ;
566 oemCommand = SCE_OEM_CMD_ECC_SECP256K1_PRIVATE;
570 else if(
osStrcmp(curve->name,
"secp256r1") == 0)
572 curveType = SCE_ECC_CURVE_TYPE_NIST;
573 oemCommand = SCE_OEM_CMD_ECC_P256_PRIVATE;
577 else if(
osStrcmp(curve->name,
"secp384r1") == 0)
579 curveType = SCE_ECC_CURVE_TYPE_NIST;
580 oemCommand = SCE_OEM_CMD_ECC_P384_PRIVATE;
584 else if(
osStrcmp(curve->name,
"brainpoolP256r1") == 0)
586 curveType = SCE_ECC_CURVE_TYPE_BRAINPOOL;
587 oemCommand = SCE_OEM_CMD_ECC_P256R1_PRIVATE;
591 else if(
osStrcmp(curve->name,
"brainpoolP384r1") == 0)
593 curveType = SCE_ECC_CURVE_TYPE_BRAINPOOL;
594 oemCommand = SCE_OEM_CMD_ECC_P384R1_PRIVATE;
604 digestLen =
MIN(digestLen, orderLen);
611 osMemcpy((uint8_t *) ecArgs.
digest +
n - digestLen, digest, digestLen);
618 status = HW_SCE_GenerateOemKeyIndexPrivate(SCE_OEM_KEY_TYPE_PLAIN,
619 oemCommand, NULL, NULL, (uint8_t *) ecArgs.
d, ecArgs.
wrappedKey);
622 if(status == FSP_SUCCESS)
625 if(curve->fieldSize == 256)
627 status = HW_SCE_EcdsaSignatureGenerateSub(&curveType, &command,
630 else if(curve->fieldSize == 384)
632 status = HW_SCE_EcdsaP384SignatureGenerateSub(&curveType,
637 status = FSP_ERR_CRYPTO_NOT_IMPLEMENTED;
642 if(status == FSP_SUCCESS)
645 signature->
curve = curve;
683 const uint8_t *digest,
size_t digestLen,
const EcdsaSignature *signature)
690 sce_oem_cmd_t oemCommand;
694 if(publicKey == NULL || digest == NULL || signature == NULL)
698 if(publicKey->
curve == NULL)
724 curve = publicKey->
curve;
727 orderLen = (curve->orderSize + 7) / 8;
730 if(
osStrcmp(curve->name,
"secp256k1") == 0)
732 curveType = SCE_ECC_CURVE_TYPE_KOBLITZ;
733 oemCommand = SCE_OEM_CMD_ECC_SECP256K1_PUBLIC;
737 else if(
osStrcmp(curve->name,
"secp256r1") == 0)
739 curveType = SCE_ECC_CURVE_TYPE_NIST;
740 oemCommand = SCE_OEM_CMD_ECC_P256_PUBLIC;
744 else if(
osStrcmp(curve->name,
"secp384r1") == 0)
746 curveType = SCE_ECC_CURVE_TYPE_NIST;
747 oemCommand = SCE_OEM_CMD_ECC_P384_PUBLIC;
751 else if(
osStrcmp(curve->name,
"brainpoolP256r1") == 0)
753 curveType = SCE_ECC_CURVE_TYPE_BRAINPOOL;
754 oemCommand = SCE_OEM_CMD_ECC_P256R1_PUBLIC;
758 else if(
osStrcmp(curve->name,
"brainpoolP384r1") == 0)
760 curveType = SCE_ECC_CURVE_TYPE_BRAINPOOL;
761 oemCommand = SCE_OEM_CMD_ECC_P384R1_PUBLIC;
771 digestLen =
MIN(digestLen, orderLen);
778 osMemcpy((uint8_t *) ecArgs.
digest +
n - digestLen, digest, digestLen);
795 status = HW_SCE_GenerateOemKeyIndexPrivate(SCE_OEM_KEY_TYPE_PLAIN,
796 oemCommand, NULL, NULL, (uint8_t *) ecArgs.
q, ecArgs.
wrappedKey);
799 if(status == FSP_SUCCESS)
802 if(curve->fieldSize == 256)
804 status = HW_SCE_EcdsaSignatureVerificationSub(&curveType, &command,
807 else if(curve->fieldSize == 384)
809 status = HW_SCE_EcdsaP384SignatureVerificationSub(&curveType,
814 status = FSP_ERR_CRYPTO_NOT_IMPLEMENTED;
error_t ecScalarImport(uint32_t *r, uint_t n, const uint8_t *input, size_t length, EcScalarFormat format)
Octet string to integer conversion.
error_t ecdsaGenerateSignature(const PrngAlgo *prngAlgo, void *prngContext, const EcPrivateKey *privateKey, const uint8_t *digest, size_t digestLen, EcdsaSignature *signature)
ECDSA signature generation.
error_t ecScalarExport(const uint32_t *a, uint_t n, uint8_t *output, size_t length, EcScalarFormat format)
Integer to octet string conversion.
Arbitrary precision integer.
ECDSA (Elliptic Curve Digital Signature Algorithm)
const EcCurve * curve
Elliptic curve parameters.
const EcCurve * curve
Elliptic curve parameters.
#define EC_MAX_ORDER_SIZE
RA4 public-key hardware accelerator.
#define mpiWriteRaw(a, data, length)
uint32_t y[EC_MAX_MODULUS_SIZE]
y-coordinate
void mpiInit(Mpi *r)
Initialize a multiple precision integer.
error_t mpiExpModFast(Mpi *r, const Mpi *a, const Mpi *e, const Mpi *p)
Modular exponentiation (fast calculation)
#define mpiReadRaw(r, data, length)
error_t mpiMod(Mpi *r, const Mpi *a, const Mpi *p)
Modulo operation.
@ ERROR_INVALID_ELLIPTIC_CURVE
error_t mpiMul(Mpi *r, const Mpi *a, const Mpi *b)
Multiple precision multiplication.
@ ERROR_INVALID_PARAMETER
Invalid parameter.
#define osMemcpy(dest, src, length)
error_t mpiSub(Mpi *r, const Mpi *a, const Mpi *b)
Multiple precision subtraction.
error_t mpiAdd(Mpi *r, const Mpi *a, const Mpi *b)
Multiple precision addition.
@ ERROR_FAILURE
Generic error code.
void ecScalarSetInt(uint32_t *a, uint32_t b, uint_t n)
Set integer value.
uint32_t r[EC_MAX_ORDER_SIZE]
Integer R.
error_t ecMulRegular(const EcCurve *curve, EcPoint3 *r, const uint32_t *d, const EcPoint3 *s)
Scalar multiplication (regular calculation)
General definitions for cryptographic algorithms.
RSA public-key cryptography standard.
Mpi dq
Second factor's CRT exponent.
__weak_func bool_t ecIsPointAffine(const EcCurve *curve, const EcPoint *s)
Check whether the affine point S is on the curve.
RA4 hardware cryptographic accelerator (SCE5 / SCE9)
uint32_t d[EC_MAX_ORDER_SIZE]
Private key.
int_t ecScalarCompInt(const uint32_t *a, uint32_t b, uint_t n)
Compare integers.
@ EC_SCALAR_FORMAT_BIG_ENDIAN
error_t ecdsaVerifySignature(const EcPublicKey *publicKey, const uint8_t *digest, size_t digestLen, const EcdsaSignature *signature)
ECDSA signature verification.
void osAcquireMutex(OsMutex *mutex)
Acquire ownership of the specified mutex object.
EC point (projective coordinates)
void osReleaseMutex(OsMutex *mutex)
Release ownership of the specified mutex object.
uint32_t s[EC_MAX_ORDER_SIZE]
Integer S.
error_t rsadp(const RsaPrivateKey *key, const Mpi *c, Mpi *m)
RSA decryption primitive.
int_t mpiComp(const Mpi *a, const Mpi *b)
Compare two multiple precision integers.
Mpi dp
First factor's CRT exponent.
error_t mpiExpModRegular(Mpi *r, const Mpi *a, const Mpi *e, const Mpi *p)
Modular exponentiation (regular calculation)
int_t ecScalarComp(const uint32_t *a, const uint32_t *b, uint_t n)
Compare integers.
error_t ecMulFast(const EcCurve *curve, EcPoint3 *r, const uint32_t *d, const EcPoint3 *s)
Scalar multiplication (fast calculation)
int_t mpiCompInt(const Mpi *a, mpi_sword_t b)
Compare a multiple precision integer with an integer.
uint32_t x[EC_MAX_MODULUS_SIZE]
x-coordinate
#define osMemset(p, value, length)
error_t mpiMulMod(Mpi *r, const Mpi *a, const Mpi *b, const Mpi *p)
Modular multiplication.
ECC (Elliptic Curve Cryptography)
@ ERROR_INVALID_SIGNATURE
const EcCurve * curve
Elliptic curve parameters.
error_t mpiExpMod(Mpi *r, const Mpi *a, const Mpi *e, const Mpi *p)
Modular exponentiation.
#define EC_MAX_MODULUS_SIZE
uint_t mpiGetByteLength(const Mpi *a)
Get the actual length in bytes.
void mpiFree(Mpi *r)
Release a multiple precision integer.