Software APIs
ecdsa_commands.h
1 // Copyright lowRISC contributors (OpenTitan project).
2 // Licensed under the Apache License, Version 2.0, see LICENSE for details.
3 // SPDX-License-Identifier: Apache-2.0
4 
5 #ifndef OPENTITAN_SW_DEVICE_TESTS_CRYPTO_CRYPTOTEST_JSON_ECDSA_COMMANDS_H_
6 #define OPENTITAN_SW_DEVICE_TESTS_CRYPTO_CRYPTOTEST_JSON_ECDSA_COMMANDS_H_
7 #include "sw/device/lib/ujson/ujson_derive.h"
8 #ifdef __cplusplus
9 extern "C" {
10 #endif
11 
12 #define ECDSA_CMD_MAX_MESSAGE_BYTES 64
13 #define ECDSA_CMD_MAX_SIGNATURE_SCALAR_BYTES 64
14 #define ECDSA_CMD_MAX_COORDINATE_BYTES 64
15 #define ECDSA_CMD_MAX_PRIVATE_KEY_SHARE_BYTES 64
16 
17 // clang-format off
18 
19 // Following a `Verify` Operation, the host is expected to send the following parameters, in order:
20 // - hash_alg (ECDSA_HASH_ALG)
21 // - curve (ECDSA_CURVE)
22 // - message_digest (ECDSA_MESSAGE)
23 // - signature (ECDSA_SIGNATURE)
24 // - qx (ECDSA_COORDINATE)
25 // - qy (ECDSA_COORDINATE)
26 // The device will then respond with:
27 // - result (ECDSA_VERIFY_OUTPUT)
28 #define ECDSA_OPERATION(_, value) \
29  value(_, Sign) \
30  value(_, Verify)
31 UJSON_SERDE_ENUM(CryptotestEcdsaOperation, cryptotest_ecdsa_operation_t, ECDSA_OPERATION);
32 
33 #define ECDSA_HASH_ALG(_, value) \
34  value(_, Sha256) \
35  value(_, Sha384) \
36  value(_, Sha512) \
37  value(_, Sha3_256) \
38  value(_, Sha3_384) \
39  value(_, Sha3_512)
40 UJSON_SERDE_ENUM(CryptotestEcdsaHashAlg, cryptotest_ecdsa_hash_alg_t, ECDSA_HASH_ALG);
41 
42 #define ECDSA_CURVE(_, value) \
43  value(_, P256) \
44  value(_, P384)
45 UJSON_SERDE_ENUM(CryptotestEcdsaCurve, cryptotest_ecdsa_curve_t, ECDSA_CURVE);
46 
47 #define ECDSA_MESSAGE(field, string) \
48  field(input, uint8_t, ECDSA_CMD_MAX_MESSAGE_BYTES) \
49  field(input_len, size_t)
50 UJSON_SERDE_STRUCT(CryptotestEcdsaMessage, cryptotest_ecdsa_message_t, ECDSA_MESSAGE);
51 
52 #define ECDSA_SIGNATURE(field, string) \
53  field(r, uint8_t, ECDSA_CMD_MAX_SIGNATURE_SCALAR_BYTES) \
54  field(r_len, size_t) \
55  field(s, uint8_t, ECDSA_CMD_MAX_SIGNATURE_SCALAR_BYTES) \
56  field(s_len, size_t)
57 UJSON_SERDE_STRUCT(CryptotestEcdsaSignature, cryptotest_ecdsa_signature_t, ECDSA_SIGNATURE);
58 
59 #define ECDSA_COORDINATE(field, string) \
60  field(coordinate, uint8_t, ECDSA_CMD_MAX_COORDINATE_BYTES) \
61  field(coordinate_len, size_t)
62 UJSON_SERDE_STRUCT(CryptotestEcdsaCoordinate, cryptotest_ecdsa_coordinate_t, ECDSA_COORDINATE);
63 
64 #define ECDSA_PRIVATE_KEY(field, string) \
65  field(d0, uint8_t, ECDSA_CMD_MAX_PRIVATE_KEY_SHARE_BYTES) \
66  field(d0_len, size_t) \
67  field(d1, uint8_t, ECDSA_CMD_MAX_PRIVATE_KEY_SHARE_BYTES) \
68  field(d1_len, size_t) \
69  field(unmasked_len, size_t)
70 UJSON_SERDE_STRUCT(CryptotestEcdsaPrivateKey, cryptotest_ecdsa_private_key_t, ECDSA_PRIVATE_KEY);
71 
72 #define ECDSA_VERIFY_OUTPUT(_, value) \
73  value(_, Success) \
74  value(_, Failure)
75 UJSON_SERDE_ENUM(CryptotestEcdsaVerifyOutput, cryptotest_ecdsa_verify_output_t, ECDSA_VERIFY_OUTPUT);
76 
77 // clang-format on
78 
79 #ifdef __cplusplus
80 }
81 #endif
82 #endif // OPENTITAN_SW_DEVICE_TESTS_CRYPTO_CRYPTOTEST_JSON_ECDSA_COMMANDS_H_