6 #include "sw/device/lib/base/status.h"
7 #include "sw/device/lib/crypto/impl/ecc/p256.h"
8 #include "sw/device/lib/crypto/impl/ecc/p384.h"
9 #include "sw/device/lib/crypto/impl/integrity.h"
10 #include "sw/device/lib/crypto/impl/keyblob.h"
15 #include "sw/device/lib/testing/test_framework/ujson_ottf.h"
16 #include "sw/device/lib/ujson/ujson.h"
17 #include "sw/device/tests/crypto/cryptotest/json/ecdsa_commands.h"
22 kP256PrivateKeyBytes = 256 / 8,
24 kP384PrivateKeyBytes = 384 / 8,
28 .version = kOtcryptoLibVersion1,
29 .key_mode = kOtcryptoKeyModeEcdsaP256,
30 .key_length = kP256PrivateKeyBytes,
32 .security_level = kOtcryptoKeySecurityLevelLow,
36 .version = kOtcryptoLibVersion1,
37 .key_mode = kOtcryptoKeyModeEcdsaP384,
38 .key_length = kP384PrivateKeyBytes,
40 .security_level = kOtcryptoKeySecurityLevelLow,
43 int set_nist_p256_params(cryptotest_ecdsa_coordinate_t uj_qx,
44 cryptotest_ecdsa_coordinate_t uj_qy,
45 cryptotest_ecdsa_signature_t uj_signature,
51 if (uj_qx.coordinate_len > kP256CoordBytes) {
53 "Coordinate value qx too large for P256 (have = %d bytes, max = %d "
55 uj_qx.coordinate_len, kP256CoordBytes);
58 if (uj_qy.coordinate_len > kP256CoordBytes) {
60 "Coordinate value qy too large for P256 (have = %d bytes, max = %d "
62 uj_qy.coordinate_len, kP256CoordBytes);
65 memset(pub_p256->
x, 0, kP256CoordBytes);
66 memcpy(pub_p256->
x, uj_qx.coordinate, uj_qx.coordinate_len);
67 memset(pub_p256->
y, 0, kP256CoordBytes);
68 memcpy(pub_p256->
y, uj_qy.coordinate, uj_qy.coordinate_len);
69 public_key->key_mode = kOtcryptoKeyModeEcdsaP256;
71 public_key->key = (uint32_t *)pub_p256;
72 *digest_len = kP256ScalarWords;
73 if (uj_signature.r_len > kP256ScalarBytes) {
75 "Signature r value too large for P256 (have = %d bytes, max = %d "
77 uj_signature.r_len, kP256ScalarBytes);
80 if (uj_signature.s_len > kP256ScalarBytes) {
82 "Signature s value too large for P256 (have = %d bytes, max = %d "
84 uj_signature.s_len, kP256ScalarBytes);
87 memset(signature_p256->r, 0, kP256ScalarBytes);
88 memcpy(signature_p256->r, uj_signature.r, uj_signature.r_len);
89 memset(signature_p256->s, 0, kP256ScalarBytes);
90 memcpy(signature_p256->s, uj_signature.s, uj_signature.s_len);
91 signature_mut->len = kP256ScalarWords * 2;
92 signature_mut->data = (uint32_t *)signature_p256;
97 int set_nist_p384_params(cryptotest_ecdsa_coordinate_t uj_qx,
98 cryptotest_ecdsa_coordinate_t uj_qy,
99 cryptotest_ecdsa_signature_t uj_signature,
104 size_t *digest_len) {
105 if (uj_qx.coordinate_len > kP384CoordBytes) {
107 "Coordinate value qx too large for P384 (have = %d bytes, max = %d "
109 uj_qx.coordinate_len, kP384CoordBytes);
112 if (uj_qy.coordinate_len > kP384CoordBytes) {
114 "Coordinate value qy too large for P384 (have = %d bytes, max = %d "
116 uj_qy.coordinate_len, kP384CoordBytes);
119 memset(pub_p384->
x, 0, kP384CoordBytes);
120 memcpy(pub_p384->
x, uj_qx.coordinate, uj_qx.coordinate_len);
121 memset(pub_p384->
y, 0, kP384CoordBytes);
122 memcpy(pub_p384->
y, uj_qy.coordinate, uj_qy.coordinate_len);
123 public_key->key_mode = kOtcryptoKeyModeEcdsaP384;
125 public_key->key = (uint32_t *)pub_p384;
126 *digest_len = kP384ScalarWords;
127 if (uj_signature.r_len > kP384ScalarBytes) {
129 "Signature r value too large for P384 (have = %d bytes, max = %d "
131 uj_signature.r_len, kP384ScalarBytes);
134 if (uj_signature.s_len > kP384ScalarBytes) {
136 "Signature s value too large for P384 (have = %d bytes, max = %d "
138 uj_signature.s_len, kP384ScalarBytes);
141 memset(signature_p384->r, 0, kP384ScalarBytes);
142 memcpy(signature_p384->r, uj_signature.r, uj_signature.r_len);
143 memset(signature_p384->s, 0, kP384ScalarBytes);
144 memcpy(signature_p384->s, uj_signature.s, uj_signature.s_len);
145 signature_mut->len = kP384ScalarWords * 2;
146 signature_mut->data = (uint32_t *)signature_p384;
153 cryptotest_ecdsa_verify_output_t uj_output;
154 switch (*verification_result) {
156 uj_output = kCryptotestEcdsaVerifyOutputFailure;
159 uj_output = kCryptotestEcdsaVerifyOutputSuccess;
162 LOG_ERROR(
"Unexpected result value from otcrypto_ecdsa_verify: %d",
163 verification_result);
166 RESP_OK(ujson_serialize_cryptotest_ecdsa_verify_output_t, uj, &uj_output);
172 cryptotest_ecdsa_verify_output_t uj_output;
174 case kOtcryptoStatusValueOk:
175 return interpret_verification_result(uj, verification_result);
176 case kOtcryptoStatusValueBadArgs:
180 uj_output = kCryptotestEcdsaVerifyOutputFailure;
181 RESP_OK(ujson_serialize_cryptotest_ecdsa_verify_output_t, uj, &uj_output);
185 "Unexpected status value returned from otcrypto_ecdsa_verify: "
192 status_t p256_sign(
ujson_t *uj, cryptotest_ecdsa_private_key_t *uj_private_key,
195 cryptotest_ecdsa_signature_t *uj_signature) {
198 .config = kP256PrivateKeyConfig,
199 .keyblob_length =
sizeof(private_key_masked),
200 .keyblob = (uint32_t *)&private_key_masked,
202 memset(private_key_masked.
share0, 0, kP256MaskedScalarShareBytes);
203 memcpy(private_key_masked.
share0, uj_private_key->d0, kP256ScalarBytes);
204 memset(private_key_masked.
share1, 0, kP256MaskedScalarShareBytes);
205 memcpy(private_key_masked.
share1, uj_private_key->d1, kP256ScalarBytes);
206 private_key.checksum = integrity_blinded_checksum(&private_key);
210 if (
status.value != kOtcryptoStatusValueOk) {
211 return INTERNAL(
status.value);
214 memset(uj_signature->r, 0, ECDSA_CMD_MAX_SIGNATURE_SCALAR_BYTES);
215 memset(uj_signature->s, 0, ECDSA_CMD_MAX_SIGNATURE_SCALAR_BYTES);
218 memcpy(uj_signature->r, signature_p256->r, kP256ScalarBytes);
219 uj_signature->r_len = kP256ScalarBytes;
220 memcpy(uj_signature->s, signature_p256->s, kP256ScalarBytes);
221 uj_signature->s_len = kP256ScalarBytes;
222 RESP_OK(ujson_serialize_cryptotest_ecdsa_signature_t, uj, uj_signature);
227 status_t p384_sign(
ujson_t *uj, cryptotest_ecdsa_private_key_t *uj_private_key,
230 cryptotest_ecdsa_signature_t *uj_signature) {
233 .config = kP384PrivateKeyConfig,
234 .keyblob_length =
sizeof(private_key_masked),
235 .keyblob = (uint32_t *)&private_key_masked,
237 memset(private_key_masked.
share0, 0, kP384MaskedScalarShareBytes);
238 memcpy(private_key_masked.
share0, uj_private_key->d0, kP384ScalarBytes);
239 memset(private_key_masked.
share1, 0, kP384MaskedScalarShareBytes);
240 memcpy(private_key_masked.
share1, uj_private_key->d1, kP384ScalarBytes);
241 private_key.checksum = integrity_blinded_checksum(&private_key);
245 if (
status.value != kOtcryptoStatusValueOk) {
246 return INTERNAL(
status.value);
249 memset(uj_signature->r, 0, ECDSA_CMD_MAX_SIGNATURE_SCALAR_BYTES);
250 memset(uj_signature->s, 0, ECDSA_CMD_MAX_SIGNATURE_SCALAR_BYTES);
253 memcpy(uj_signature->r, signature_p384->r, kP384ScalarBytes);
254 uj_signature->r_len = kP384ScalarBytes;
255 memcpy(uj_signature->s, signature_p384->s, kP384ScalarBytes);
256 uj_signature->s_len = kP384ScalarBytes;
257 RESP_OK(ujson_serialize_cryptotest_ecdsa_signature_t, uj, uj_signature);
264 cryptotest_ecdsa_operation_t uj_op;
265 cryptotest_ecdsa_hash_alg_t uj_hash_alg;
266 cryptotest_ecdsa_curve_t uj_curve;
267 cryptotest_ecdsa_message_t uj_message;
268 cryptotest_ecdsa_signature_t uj_signature;
269 cryptotest_ecdsa_coordinate_t uj_qx;
270 cryptotest_ecdsa_coordinate_t uj_qy;
271 cryptotest_ecdsa_private_key_t uj_private_key;
274 TRY(ujson_deserialize_cryptotest_ecdsa_operation_t(uj, &uj_op));
275 TRY(ujson_deserialize_cryptotest_ecdsa_hash_alg_t(uj, &uj_hash_alg));
276 TRY(ujson_deserialize_cryptotest_ecdsa_curve_t(uj, &uj_curve));
277 TRY(ujson_deserialize_cryptotest_ecdsa_message_t(uj, &uj_message));
278 TRY(ujson_deserialize_cryptotest_ecdsa_signature_t(uj, &uj_signature));
279 TRY(ujson_deserialize_cryptotest_ecdsa_coordinate_t(uj, &uj_qx));
280 TRY(ujson_deserialize_cryptotest_ecdsa_coordinate_t(uj, &uj_qy));
281 TRY(ujson_deserialize_cryptotest_ecdsa_private_key_t(uj, &uj_private_key));
293 case kCryptotestEcdsaCurveP256:
294 success = set_nist_p256_params(uj_qx, uj_qy, uj_signature, &public_key,
295 &signature_p256, &pub_p256, &signature_mut,
298 return INVALID_ARGUMENT();
301 case kCryptotestEcdsaCurveP384:
302 success = set_nist_p384_params(uj_qx, uj_qy, uj_signature, &public_key,
303 &signature_p384, &pub_p384, &signature_mut,
306 return INVALID_ARGUMENT();
310 LOG_ERROR(
"Unsupported ECC curve: %d", uj_curve);
311 return INVALID_ARGUMENT();
313 public_key.checksum = integrity_unblinded_checksum(&public_key);
315 .len = signature_mut.len,
316 .data = signature_mut.data,
320 switch (uj_hash_alg) {
321 case kCryptotestEcdsaHashAlgSha256:
322 mode = kOtcryptoHashModeSha256;
324 case kCryptotestEcdsaHashAlgSha384:
325 mode = kOtcryptoHashModeSha384;
327 case kCryptotestEcdsaHashAlgSha512:
328 mode = kOtcryptoHashModeSha512;
330 case kCryptotestEcdsaHashAlgSha3_256:
331 mode = kOtcryptoHashModeSha3_256;
333 case kCryptotestEcdsaHashAlgSha3_384:
334 mode = kOtcryptoHashModeSha3_384;
336 case kCryptotestEcdsaHashAlgSha3_512:
337 mode = kOtcryptoHashModeSha3_512;
340 LOG_ERROR(
"Unrecognized ECDSA hash mode: %d", uj_hash_alg);
341 return INVALID_ARGUMENT();
343 uint8_t message_buf[ECDSA_CMD_MAX_MESSAGE_BYTES];
344 memset(message_buf, 0, digest_len *
sizeof(uint32_t));
345 memcpy(message_buf, uj_message.input, uj_message.input_len);
349 .data = (uint32_t *)message_buf,
353 case kCryptotestEcdsaOperationSign: {
355 case kCryptotestEcdsaCurveP256: {
356 return p256_sign(uj, &uj_private_key, message_digest, signature_mut,
359 case kCryptotestEcdsaCurveP384: {
360 return p384_sign(uj, &uj_private_key, message_digest, signature_mut,
364 LOG_ERROR(
"Unsupported ECC curve: %d", uj_curve);
365 return INVALID_ARGUMENT();
369 case kCryptotestEcdsaOperationVerify: {
373 case kCryptotestEcdsaCurveP256: {
375 signature, &verification_result);
378 case kCryptotestEcdsaCurveP384: {
380 signature, &verification_result);
384 LOG_ERROR(
"Unsupported ECC curve: %d", uj_curve);
385 return INVALID_ARGUMENT();
387 return interpret_verify_status(uj,
status, &verification_result);
390 LOG_ERROR(
"Unrecognized ECDSA operation: %d", uj_op);
391 return INVALID_ARGUMENT();