1 /*
2 * Copyright (c) 2021-2023 Arm Limited. All rights reserved.
3 * SPDX-License-Identifier: BSD-3-Clause
4 */
5
6 #include "psa_adac_config.h"
7 #include "psa_adac_debug.h"
8 #include "adac_crypto_cc312.h"
9
10 #if defined (PSA_ADAC_RSA3072) || defined (PSA_ADAC_RSA4096)
11 #include "cc_rsa_build.h"
12 #include "rsa/cc_rsa_local.h"
13 #include "cc_rsa_schemes.h"
14 #endif
15
16 #if defined (PSA_ADAC_EC_P256) || defined (PSA_ADAC_EC_P521)
17 #include "cc_ecpki_build.h"
18 #include "ec_wrst/cc_ecpki_local.h"
19 #if defined (PSA_ADAC_EC_P256)
20 #include "ec_wrst/ecc_domains/cc_ecpki_domain_secp256r1.h"
21 #endif
22 #if defined (PSA_ADAC_EC_P521)
23 #include "ec_wrst/ecc_domains/cc_ecpki_domain_secp521r1.h"
24 #endif
25 #endif
26
27 #include <string.h>
28
psa_adac_verify_signature(uint8_t key_type,uint8_t * key,size_t key_size,psa_algorithm_t hash_algo,const uint8_t * inputs[],size_t input_sizes[],size_t input_count,psa_algorithm_t sig_algo,uint8_t * sig,size_t sig_size)29 psa_status_t psa_adac_verify_signature(uint8_t key_type, uint8_t *key,
30 size_t key_size, psa_algorithm_t hash_algo, const uint8_t *inputs[],
31 size_t input_sizes[], size_t input_count, psa_algorithm_t sig_algo,
32 uint8_t *sig, size_t sig_size)
33 {
34 psa_status_t r;
35 uint8_t hash[PSA_HASH_MAX_SIZE];
36 size_t hash_size;
37 CCError_t error = CC_FAIL;
38
39 r = psa_adac_hash_multiple(hash_algo, inputs, input_sizes, input_count,
40 hash, sizeof(hash), &hash_size);
41
42 if (r != PSA_SUCCESS) {
43 return r;
44 }
45
46 if ((key_type == RSA_3072_SHA256) || (key_type == RSA_4096_SHA256)) {
47 #if defined (PSA_ADAC_RSA3072) || defined (PSA_ADAC_RSA4096)
48 CCRsaPubUserContext_t rsaPubUserContext;
49 CCRsaUserPubKey_t pubKey;
50 uint8_t F4[3] = {0x01, 0x0, 0x1};
51 CCRsaHashOpMode_t hashOpMode =
52 (hash_algo == PSA_ALG_SHA_256) ? CC_RSA_After_SHA256_mode :
53 ((hash_algo == PSA_ALG_SHA_512) ? CC_RSA_After_SHA512_mode :
54 CC_RSA_HASH_NO_HASH_mode);
55
56 PSA_ADAC_LOG_TRACE("cc312", "psa_adac_verify_signature Rsa%d\r\n",
57 key_size);
58
59 error = CC_RsaPubKeyBuild(&pubKey, F4, sizeof(F4), key, key_size);
60 if (error != CC_OK) {
61 PSA_ADAC_LOG_ERR("cc312", "Error in CC_RsaPubKeyBuild %lx\r\n",
62 error);
63 } else {
64 error = CC_RsaPssVerify(&rsaPubUserContext, &pubKey, hashOpMode,
65 CC_PKCS1_MGF1, 32, (uint8_t *)hash,
66 hash_size, (uint8_t *)sig);
67 if (error != CC_OK) {
68 PSA_ADAC_LOG_ERR("cc312", "Error in CC_RsaPssVerify %lx\r\n",
69 error);
70 }
71 }
72
73 #else
74 return PSA_ERROR_NOT_SUPPORTED;
75 #endif
76 } else if ((key_type == ECDSA_P256_SHA256) ||
77 (key_type == ECDSA_P521_SHA512)) {
78 #if defined (PSA_ADAC_EC_P256) || defined (PSA_ADAC_EC_P521)
79 CCEcdsaVerifyUserContext_t ecdsaVerifyUserContext;
80 CCEcpkiUserPublKey_t pubKey;
81
82 CCEcpkiHashOpMode_t hashOpMode =
83 (hash_algo == PSA_ALG_SHA_256) ? CC_ECPKI_AFTER_HASH_SHA256_mode :
84 ((hash_algo == PSA_ALG_SHA_512) ? CC_ECPKI_AFTER_HASH_SHA512_mode :
85 CC_ECPKI_HASH_NumOfModes);
86
87 if (key_type == ECDSA_P256_SHA256) {
88 #if defined (PSA_ADAC_EC_P256)
89 if (key_size == ECDSA_P256_PUBLIC_KEY_SIZE) {
90 uint8_t pub_key[ECDSA_P256_PUBLIC_KEY_SIZE + 1] = {0x04};
91 memcpy(pub_key + 1, key, ECDSA_P256_PUBLIC_KEY_SIZE);
92 PSA_ADAC_LOG_TRACE("cc312",
93 "psa_adac_verify_signature EcdsaP256\r\n");
94 error = CC_EcpkiPubKeyBuild(CC_EcpkiGetSecp256r1DomainP(),
95 pub_key, sizeof(pub_key), &pubKey);
96 } else {
97 return PSA_ERROR_INVALID_ARGUMENT;
98 }
99 #else
100 return PSA_ERROR_NOT_SUPPORTED;
101 #endif
102 } else if (key_type == ECDSA_P521_SHA512) {
103 #if defined (PSA_ADAC_EC_P521)
104 if (key_size == ECDSA_P521_PUBLIC_KEY_SIZE) {
105 uint8_t pub_key[ECDSA_P521_PUBLIC_KEY_SIZE + 1] = {0x04};
106 memcpy(pub_key + 1, key, ECDSA_P521_PUBLIC_KEY_SIZE);
107 PSA_ADAC_LOG_TRACE("cc312",
108 "psa_adac_verify_signature EcdsaP521\r\n");
109 error = CC_EcpkiPubKeyBuild(CC_EcpkiGetSecp521r1DomainP(),
110 pub_key, sizeof(pub_key), &pubKey);
111 } else {
112 return PSA_ERROR_INVALID_ARGUMENT;
113 }
114 #else
115 return PSA_ERROR_NOT_SUPPORTED;
116 #endif
117 } else {
118 return PSA_ERROR_INVALID_ARGUMENT;
119 }
120
121 if (CC_OK != error) {
122 PSA_ADAC_LOG_ERR("cc312", "Error in CC_EcpkiPubKeyBuild %lx\r\n",
123 error);
124 } else if (CC_OK != (error = EcdsaVerifyInit(&ecdsaVerifyUserContext,
125 &pubKey, hashOpMode))) {
126 PSA_ADAC_LOG_ERR("cc312", "Error in EcdsaVerifyInit %lx\r\n", error);
127 } else if (CC_OK != (error = EcdsaVerifyUpdate(&ecdsaVerifyUserContext,
128 hash, hash_size))) {
129 PSA_ADAC_LOG_ERR("cc312", "Error in EcdsaVerifyUpdate %lx\r\n",
130 error);
131 } else if (CC_OK != (error = EcdsaVerifyFinish(&ecdsaVerifyUserContext,
132 sig, sig_size))) {
133 PSA_ADAC_LOG_ERR("cc312", "Error in EcdsaVerifyFinish %lx\r\n",
134 error);
135 }
136 #else
137 return PSA_ERROR_NOT_SUPPORTED;
138 #endif
139 } else {
140 return PSA_ERROR_NOT_SUPPORTED;
141 }
142
143 PSA_ADAC_LOG_DEBUG("cc312", "Signature verification: %s\r\n",
144 error == CC_OK ? "success" : "failure");
145 return (error == CC_OK) ? PSA_SUCCESS : PSA_ERROR_INVALID_SIGNATURE;
146 }
147