Skip to content

Commit 882e57e

Browse files
psa_constant_names: support key agreement algorithms
1 parent a52460c commit 882e57e

File tree

3 files changed

+52
-19
lines changed

3 files changed

+52
-19
lines changed

programs/psa/psa_constant_names.c

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -84,22 +84,21 @@ static void append_with_curve(char **buffer, size_t buffer_size,
8484
append(buffer, buffer_size, required_size, ")", 1);
8585
}
8686

87-
static void append_with_hash(char **buffer, size_t buffer_size,
88-
size_t *required_size,
89-
const char *string, size_t length,
90-
psa_algorithm_t hash_alg)
87+
typedef const char *(*psa_get_algorithm_name_func_ptr)(psa_algorithm_t alg);
88+
89+
static void append_with_alg(char **buffer, size_t buffer_size,
90+
size_t *required_size,
91+
psa_get_algorithm_name_func_ptr get_name,
92+
psa_algorithm_t alg)
9193
{
92-
const char *hash_name = psa_hash_algorithm_name(hash_alg);
93-
append(buffer, buffer_size, required_size, string, length);
94-
append(buffer, buffer_size, required_size, "(", 1);
95-
if (hash_name != NULL) {
94+
const char *name = get_name(alg);
95+
if (name != NULL) {
9696
append(buffer, buffer_size, required_size,
97-
hash_name, strlen(hash_name));
97+
name, strlen(name));
9898
} else {
9999
append_integer(buffer, buffer_size, required_size,
100-
"0x%08lx", hash_alg);
100+
"0x%08lx", alg);
101101
}
102-
append(buffer, buffer_size, required_size, ")", 1);
103102
}
104103

105104
#include "psa_constant_names_generated.c"

scripts/generate_psa_constants.py

Lines changed: 39 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,14 @@
3030
}
3131
}
3232
33+
static const char *psa_ka_algorithm_name(psa_algorithm_t ka_alg)
34+
{
35+
switch (ka_alg) {
36+
%(ka_algorithm_cases)s
37+
default: return NULL;
38+
}
39+
}
40+
3341
static int psa_snprint_key_type(char *buffer, size_t buffer_size,
3442
psa_key_type_t type)
3543
{
@@ -47,12 +55,13 @@
4755
return (int) required_size;
4856
}
4957
58+
#define NO_LENGTH_MODIFIER 0xfffffffflu
5059
static int psa_snprint_algorithm(char *buffer, size_t buffer_size,
5160
psa_algorithm_t alg)
5261
{
5362
size_t required_size = 0;
5463
psa_algorithm_t core_alg = alg;
55-
unsigned long length_modifier = 0;
64+
unsigned long length_modifier = NO_LENGTH_MODIFIER;
5665
if (PSA_ALG_IS_MAC(alg)) {
5766
core_alg = PSA_ALG_TRUNCATED_MAC(alg, 0);
5867
if (core_alg != alg) {
@@ -70,6 +79,15 @@
7079
"PSA_ALG_AEAD_WITH_TAG_LENGTH(", 29);
7180
length_modifier = PSA_AEAD_TAG_LENGTH(alg);
7281
}
82+
} else if (PSA_ALG_IS_KEY_AGREEMENT(alg) &&
83+
!PSA_ALG_IS_RAW_KEY_AGREEMENT(alg)) {
84+
core_alg = PSA_ALG_KEY_AGREEMENT_GET_KDF(alg);
85+
append(&buffer, buffer_size, &required_size,
86+
"PSA_ALG_KEY_AGREEMENT(", 22);
87+
append_with_alg(&buffer, buffer_size, &required_size,
88+
psa_ka_algorithm_name,
89+
PSA_ALG_KEY_AGREEMENT_GET_BASE(alg));
90+
append(&buffer, buffer_size, &required_size, ", ", 2);
7391
}
7492
switch (core_alg) {
7593
%(algorithm_cases)s
@@ -81,9 +99,11 @@
8199
break;
82100
}
83101
if (core_alg != alg) {
84-
append(&buffer, buffer_size, &required_size, ", ", 2);
85-
append_integer(&buffer, buffer_size, &required_size,
86-
"%%lu", length_modifier);
102+
if (length_modifier != NO_LENGTH_MODIFIER) {
103+
append(&buffer, buffer_size, &required_size, ", ", 2);
104+
append_integer(&buffer, buffer_size, &required_size,
105+
"%%lu", length_modifier);
106+
}
87107
append(&buffer, buffer_size, &required_size, ")", 1);
88108
}
89109
buffer[0] = 0;
@@ -126,9 +146,12 @@
126146
} else '''
127147

128148
algorithm_from_hash_template = '''if (%(tester)s(core_alg)) {
129-
append_with_hash(&buffer, buffer_size, &required_size,
130-
"%(builder)s", %(builder_length)s,
131-
PSA_ALG_GET_HASH(core_alg));
149+
append(&buffer, buffer_size, &required_size,
150+
"%(builder)s(", %(builder_length)s + 1);
151+
append_with_alg(&buffer, buffer_size, &required_size,
152+
psa_hash_algorithm_name,
153+
PSA_ALG_GET_HASH(core_alg));
154+
append(&buffer, buffer_size, &required_size, ")", 1);
132155
} else '''
133156

134157
bit_test_template = '''\
@@ -149,6 +172,7 @@ def __init__(self):
149172
self.ecc_curves = set()
150173
self.algorithms = set()
151174
self.hash_algorithms = set()
175+
self.ka_algorithms = set()
152176
self.algorithms_from_hash = {}
153177
self.key_usages = set()
154178

@@ -193,6 +217,9 @@ def read_line(self, line):
193217
# Ad hoc detection of hash algorithms
194218
if re.search(r'0x010000[0-9A-Fa-f]{2}', definition):
195219
self.hash_algorithms.add(name)
220+
# Ad hoc detection of key agreement algorithms
221+
if re.search(r'0x30[0-9A-Fa-f]{2}0000', definition):
222+
self.ka_algorithms.add(name)
196223
elif name.startswith('PSA_ALG_') and parameter == 'hash_alg':
197224
if name in ['PSA_ALG_DSA', 'PSA_ALG_ECDSA']:
198225
# A naming irregularity
@@ -256,6 +283,10 @@ def make_hash_algorithm_cases(self):
256283
return '\n '.join(map(self.make_return_case,
257284
sorted(self.hash_algorithms)))
258285

286+
def make_ka_algorithm_cases(self):
287+
return '\n '.join(map(self.make_return_case,
288+
sorted(self.ka_algorithms)))
289+
259290
def make_algorithm_cases(self):
260291
return '\n '.join(map(self.make_append_case,
261292
sorted(self.algorithms)))
@@ -281,6 +312,7 @@ def write_file(self, output_file):
281312
data['key_type_cases'] = self.make_key_type_cases()
282313
data['key_type_code'] = self.make_key_type_code()
283314
data['hash_algorithm_cases'] = self.make_hash_algorithm_cases()
315+
data['ka_algorithm_cases'] = self.make_ka_algorithm_cases()
284316
data['algorithm_cases'] = self.make_algorithm_cases()
285317
data['algorithm_code'] = self.make_algorithm_code()
286318
data['key_usage_code'] = self.make_key_usage_code()

tests/scripts/test_psa_constant_names.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,8 @@ def __init__(self):
6363
# Hard-coded value for unknown algorithms
6464
self.hash_algorithms = set(['0x010000fe'])
6565
self.mac_algorithms = set(['0x02ff00ff'])
66-
self.kdf_algorithms = set(['0x300000ff', '0x310000ff'])
66+
self.ka_algorithms = set(['0x30fc0000'])
67+
self.kdf_algorithms = set(['0x200000ff'])
6768
# For AEAD algorithms, the only variability is over the tag length,
6869
# and this only applies to known algorithms, so don't test an
6970
# unknown algorithm.
@@ -89,6 +90,7 @@ def gather_arguments(self):
8990
Call this after parsing all the inputs.'''
9091
self.arguments_for['hash_alg'] = sorted(self.hash_algorithms)
9192
self.arguments_for['mac_alg'] = sorted(self.mac_algorithms)
93+
self.arguments_for['ka_alg'] = sorted(self.ka_algorithms)
9294
self.arguments_for['kdf_alg'] = sorted(self.kdf_algorithms)
9395
self.arguments_for['aead_alg'] = sorted(self.aead_algorithms)
9496
self.arguments_for['curve'] = sorted(self.ecc_curves)

0 commit comments

Comments
 (0)