blob: e4e532bce696bbb4f6c68f217ac5cb655d6e1162 [file] [log] [blame]
Antonio de Angelis8908f472018-08-31 15:44:25 +01001/*
Summer Qin614002c2023-01-19 15:22:39 +08002 * Copyright (c) 2018-2023, Arm Limited. All rights reserved.
Antonio de Angelis8908f472018-08-31 15:44:25 +01003 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 *
6 */
Antonio de Angelis8908f472018-08-31 15:44:25 +01007/**
Jamie Foxcc31d402019-01-28 17:13:52 +00008 * \file psa/crypto_extra.h
Antonio de Angelis8908f472018-08-31 15:44:25 +01009 *
10 * \brief PSA cryptography module: vendor extensions
Antonio de Angelis377a1552018-11-22 17:02:40 +000011 *
12 * \note This file may not be included directly. Applications must
Jamie Foxcc31d402019-01-28 17:13:52 +000013 * include psa/crypto.h.
Antonio de Angelis377a1552018-11-22 17:02:40 +000014 *
15 * This file is reserved for vendor-specific definitions.
Antonio de Angelis8908f472018-08-31 15:44:25 +010016 */
17
Antonio de Angelis377a1552018-11-22 17:02:40 +000018#ifndef PSA_CRYPTO_EXTRA_H
19#define PSA_CRYPTO_EXTRA_H
Antonio de Angelis8908f472018-08-31 15:44:25 +010020
Antonio de Angelis380b2b42023-03-17 13:54:37 +000021#include "crypto_types.h"
22#include "crypto_compat.h"
Antonio de Angelis04debbd2019-10-14 12:12:52 +010023
Antonio de Angelis8908f472018-08-31 15:44:25 +010024#ifdef __cplusplus
25extern "C" {
26#endif
27
Soby Mathewf5cd3692020-05-12 22:46:47 +010028/** \addtogroup crypto_types
29 * @{
30 */
31
32/** DSA public key.
33 *
34 * The import and export format is the
35 * representation of the public key `y = g^x mod p` as a big-endian byte
36 * string. The length of the byte string is the length of the base prime `p`
37 * in bytes.
38 */
Summer Qind635cd02023-03-31 18:07:38 +080039#define PSA_KEY_TYPE_DSA_PUBLIC_KEY ((psa_key_type_t) 0x4002)
Soby Mathewf5cd3692020-05-12 22:46:47 +010040
41/** DSA key pair (private and public key).
42 *
43 * The import and export format is the
44 * representation of the private key `x` as a big-endian byte string. The
45 * length of the byte string is the private key size in bytes (leading zeroes
46 * are not stripped).
47 *
Antonio de Angelis90bee0f2022-07-13 11:22:41 +010048 * Deterministic DSA key derivation with psa_generate_derived_key follows
Soby Mathewf5cd3692020-05-12 22:46:47 +010049 * FIPS 186-4 §B.1.2: interpret the byte string as integer
50 * in big-endian order. Discard it if it is not in the range
51 * [0, *N* - 2] where *N* is the boundary of the private key domain
52 * (the prime *p* for Diffie-Hellman, the subprime *q* for DSA,
53 * or the order of the curve's base point for ECC).
54 * Add 1 to the resulting integer and use this as the private key *x*.
55 *
56 */
Summer Qind635cd02023-03-31 18:07:38 +080057#define PSA_KEY_TYPE_DSA_KEY_PAIR ((psa_key_type_t) 0x7002)
Soby Mathewf5cd3692020-05-12 22:46:47 +010058
Summer Qin614002c2023-01-19 15:22:39 +080059/** Whether a key type is a DSA key (pair or public-only). */
Antonio de Angelis90bee0f2022-07-13 11:22:41 +010060#define PSA_KEY_TYPE_IS_DSA(type) \
61 (PSA_KEY_TYPE_PUBLIC_KEY_OF_KEY_PAIR(type) == PSA_KEY_TYPE_DSA_PUBLIC_KEY)
62
Summer Qind635cd02023-03-31 18:07:38 +080063#define PSA_ALG_DSA_BASE ((psa_algorithm_t) 0x06000400)
Antonio de Angelis90bee0f2022-07-13 11:22:41 +010064/** DSA signature with hashing.
65 *
66 * This is the signature scheme defined by FIPS 186-4,
67 * with a random per-message secret number (*k*).
68 *
69 * \param hash_alg A hash algorithm (\c PSA_ALG_XXX value such that
70 * #PSA_ALG_IS_HASH(\p hash_alg) is true).
71 * This includes #PSA_ALG_ANY_HASH
72 * when specifying the algorithm in a usage policy.
73 *
74 * \return The corresponding DSA signature algorithm.
75 * \return Unspecified if \p hash_alg is not a supported
76 * hash algorithm.
77 */
78#define PSA_ALG_DSA(hash_alg) \
79 (PSA_ALG_DSA_BASE | ((hash_alg) & PSA_ALG_HASH_MASK))
Summer Qind635cd02023-03-31 18:07:38 +080080#define PSA_ALG_DETERMINISTIC_DSA_BASE ((psa_algorithm_t) 0x06000500)
Antonio de Angelis90bee0f2022-07-13 11:22:41 +010081#define PSA_ALG_DSA_DETERMINISTIC_FLAG PSA_ALG_ECDSA_DETERMINISTIC_FLAG
82/** Deterministic DSA signature with hashing.
83 *
84 * This is the deterministic variant defined by RFC 6979 of
85 * the signature scheme defined by FIPS 186-4.
86 *
87 * \param hash_alg A hash algorithm (\c PSA_ALG_XXX value such that
88 * #PSA_ALG_IS_HASH(\p hash_alg) is true).
89 * This includes #PSA_ALG_ANY_HASH
90 * when specifying the algorithm in a usage policy.
91 *
92 * \return The corresponding DSA signature algorithm.
93 * \return Unspecified if \p hash_alg is not a supported
94 * hash algorithm.
95 */
96#define PSA_ALG_DETERMINISTIC_DSA(hash_alg) \
97 (PSA_ALG_DETERMINISTIC_DSA_BASE | ((hash_alg) & PSA_ALG_HASH_MASK))
98#define PSA_ALG_IS_DSA(alg) \
99 (((alg) & ~PSA_ALG_HASH_MASK & ~PSA_ALG_DSA_DETERMINISTIC_FLAG) == \
100 PSA_ALG_DSA_BASE)
101#define PSA_ALG_DSA_IS_DETERMINISTIC(alg) \
102 (((alg) & PSA_ALG_DSA_DETERMINISTIC_FLAG) != 0)
103#define PSA_ALG_IS_DETERMINISTIC_DSA(alg) \
104 (PSA_ALG_IS_DSA(alg) && PSA_ALG_DSA_IS_DETERMINISTIC(alg))
105#define PSA_ALG_IS_RANDOMIZED_DSA(alg) \
106 (PSA_ALG_IS_DSA(alg) && !PSA_ALG_DSA_IS_DETERMINISTIC(alg))
107
108
109/* We need to expand the sample definition of this macro from
110 * the API definition. */
111#undef PSA_ALG_IS_VENDOR_HASH_AND_SIGN
112#define PSA_ALG_IS_VENDOR_HASH_AND_SIGN(alg) \
113 PSA_ALG_IS_DSA(alg)
114
Soby Mathewf5cd3692020-05-12 22:46:47 +0100115/**@}*/
116
Antonio de Angelis8908f472018-08-31 15:44:25 +0100117#ifdef __cplusplus
118}
119#endif
120
Antonio de Angelis377a1552018-11-22 17:02:40 +0000121#endif /* PSA_CRYPTO_EXTRA_H */