30
30
}
31
31
}
32
32
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
+
33
41
static int psa_snprint_key_type(char *buffer, size_t buffer_size,
34
42
psa_key_type_t type)
35
43
{
47
55
return (int) required_size;
48
56
}
49
57
58
+ #define NO_LENGTH_MODIFIER 0xfffffffflu
50
59
static int psa_snprint_algorithm(char *buffer, size_t buffer_size,
51
60
psa_algorithm_t alg)
52
61
{
53
62
size_t required_size = 0;
54
63
psa_algorithm_t core_alg = alg;
55
- unsigned long length_modifier = 0 ;
64
+ unsigned long length_modifier = NO_LENGTH_MODIFIER ;
56
65
if (PSA_ALG_IS_MAC(alg)) {
57
66
core_alg = PSA_ALG_TRUNCATED_MAC(alg, 0);
58
67
if (core_alg != alg) {
70
79
"PSA_ALG_AEAD_WITH_TAG_LENGTH(", 29);
71
80
length_modifier = PSA_AEAD_TAG_LENGTH(alg);
72
81
}
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);
73
91
}
74
92
switch (core_alg) {
75
93
%(algorithm_cases)s
81
99
break;
82
100
}
83
101
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
+ }
87
107
append(&buffer, buffer_size, &required_size, ")", 1);
88
108
}
89
109
buffer[0] = 0;
126
146
} else '''
127
147
128
148
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);
132
155
} else '''
133
156
134
157
bit_test_template = '''\
@@ -149,6 +172,7 @@ def __init__(self):
149
172
self .ecc_curves = set ()
150
173
self .algorithms = set ()
151
174
self .hash_algorithms = set ()
175
+ self .ka_algorithms = set ()
152
176
self .algorithms_from_hash = {}
153
177
self .key_usages = set ()
154
178
@@ -193,6 +217,9 @@ def read_line(self, line):
193
217
# Ad hoc detection of hash algorithms
194
218
if re .search (r'0x010000[0-9A-Fa-f]{2}' , definition ):
195
219
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 )
196
223
elif name .startswith ('PSA_ALG_' ) and parameter == 'hash_alg' :
197
224
if name in ['PSA_ALG_DSA' , 'PSA_ALG_ECDSA' ]:
198
225
# A naming irregularity
@@ -256,6 +283,10 @@ def make_hash_algorithm_cases(self):
256
283
return '\n ' .join (map (self .make_return_case ,
257
284
sorted (self .hash_algorithms )))
258
285
286
+ def make_ka_algorithm_cases (self ):
287
+ return '\n ' .join (map (self .make_return_case ,
288
+ sorted (self .ka_algorithms )))
289
+
259
290
def make_algorithm_cases (self ):
260
291
return '\n ' .join (map (self .make_append_case ,
261
292
sorted (self .algorithms )))
@@ -281,6 +312,7 @@ def write_file(self, output_file):
281
312
data ['key_type_cases' ] = self .make_key_type_cases ()
282
313
data ['key_type_code' ] = self .make_key_type_code ()
283
314
data ['hash_algorithm_cases' ] = self .make_hash_algorithm_cases ()
315
+ data ['ka_algorithm_cases' ] = self .make_ka_algorithm_cases ()
284
316
data ['algorithm_cases' ] = self .make_algorithm_cases ()
285
317
data ['algorithm_code' ] = self .make_algorithm_code ()
286
318
data ['key_usage_code' ] = self .make_key_usage_code ()
0 commit comments