4
FILE_LICENCE ( GPL2_OR_LATER );
7
#include <ipxe/crypto.h>
11
* Report public key decryption test result
13
* @v pubkey Public key algorithm
15
* @v key_len Key length
16
* @v ciphertext Ciphertext
17
* @v ciphertext_len Ciphertext length
18
* @v expected Expected plaintext
19
* @v expected_len Expected plaintext length
21
#define pubkey_decrypt_ok( pubkey, key, key_len, ciphertext, \
22
ciphertext_len, expected, expected_len ) do {\
23
uint8_t ctx[ (pubkey)->ctxsize ]; \
25
ok ( pubkey_init ( (pubkey), ctx, (key), (key_len) ) == 0 ); \
27
size_t max_len = pubkey_max_len ( (pubkey), ctx ); \
28
uint8_t decrypted[ max_len ]; \
31
decrypted_len = pubkey_decrypt ( (pubkey), ctx, \
35
ok ( decrypted_len == ( ( int ) (expected_len) ) ); \
36
ok ( memcmp ( decrypted, (expected), \
37
(expected_len) ) == 0 ); \
39
pubkey_final ( (pubkey), ctx ); \
43
* Report public key encryption and decryption test result
45
* @v pubkey Public key algorithm
46
* @v encrypt_key Encryption key
47
* @v encrypt_key_len Encryption key length
48
* @v decrypt_key Decryption key
49
* @v decrypt_key_len Decryption key length
50
* @v plaintext Plaintext
51
* @v plaintext_len Plaintext length
53
#define pubkey_encrypt_ok( pubkey, encrypt_key, encrypt_key_len, \
54
decrypt_key, decrypt_key_len, plaintext, \
55
plaintext_len ) do { \
56
uint8_t ctx[ (pubkey)->ctxsize ]; \
58
ok ( pubkey_init ( (pubkey), ctx, (encrypt_key), \
59
(encrypt_key_len) ) == 0 ); \
61
size_t max_len = pubkey_max_len ( (pubkey), ctx ); \
62
uint8_t encrypted[ max_len ]; \
65
encrypted_len = pubkey_encrypt ( (pubkey), ctx, \
69
ok ( encrypted_len >= 0 ); \
70
pubkey_decrypt_ok ( (pubkey), (decrypt_key), \
71
(decrypt_key_len), encrypted, \
72
encrypted_len, (plaintext), \
75
pubkey_final ( (pubkey), ctx ); \
79
* Report public key signature test result
81
* @v pubkey Public key algorithm
83
* @v key_len Key length
84
* @v digest Digest algorithm
85
* @v plaintext Plaintext
86
* @v plaintext_len Plaintext length
87
* @v expected Expected signature
88
* @v expected_len Expected signature length
90
#define pubkey_sign_ok( pubkey, key, key_len, digest, plaintext, \
91
plaintext_len, expected, expected_len ) do { \
92
uint8_t ctx[ (pubkey)->ctxsize ]; \
93
uint8_t digestctx[ (digest)->ctxsize ]; \
94
uint8_t digestout[ (digest)->digestsize ]; \
96
digest_init ( (digest), digestctx ); \
97
digest_update ( (digest), digestctx, (plaintext), \
99
digest_final ( (digest), digestctx, digestout ); \
101
ok ( pubkey_init ( (pubkey), ctx, (key), (key_len) ) == 0 ); \
103
size_t max_len = pubkey_max_len ( (pubkey), ctx ); \
104
uint8_t signature[ max_len ]; \
107
signature_len = pubkey_sign ( (pubkey), ctx, (digest), \
108
digestout, signature ); \
109
ok ( signature_len == ( ( int ) (expected_len) ) ); \
110
ok ( memcmp ( signature, (expected), \
111
(expected_len) ) == 0 ); \
113
pubkey_final ( (pubkey), ctx ); \
117
* Report public key verification test result
119
* @v pubkey Public key algorithm
121
* @v key_len Key length
122
* @v digest Digest algorithm
123
* @v plaintext Plaintext
124
* @v plaintext_len Plaintext length
125
* @v signature Signature
126
* @v signature_len Signature length
128
#define pubkey_verify_ok( pubkey, key, key_len, digest, plaintext, \
129
plaintext_len, signature, signature_len ) do {\
130
uint8_t ctx[ (pubkey)->ctxsize ]; \
131
uint8_t digestctx[ (digest)->ctxsize ]; \
132
uint8_t digestout[ (digest)->digestsize ]; \
134
digest_init ( (digest), digestctx ); \
135
digest_update ( (digest), digestctx, (plaintext), \
137
digest_final ( (digest), digestctx, digestout ); \
139
ok ( pubkey_init ( (pubkey), ctx, (key), (key_len) ) == 0 ); \
140
ok ( pubkey_verify ( (pubkey), ctx, (digest), digestout, \
141
(signature), (signature_len) ) == 0 ); \
142
pubkey_final ( (pubkey), ctx ); \
146
* Report public key verification test result
148
* @v pubkey Public key algorithm
150
* @v key_len Key length
151
* @v digest Digest algorithm
152
* @v plaintext Plaintext
153
* @v plaintext_len Plaintext length
154
* @v signature Signature
155
* @v signature_len Signature length
157
#define pubkey_verify_fail_ok( pubkey, key, key_len, digest, plaintext, \
158
plaintext_len, signature, \
159
signature_len ) do { \
160
uint8_t ctx[ (pubkey)->ctxsize ]; \
161
uint8_t digestctx[ (digest)->ctxsize ]; \
162
uint8_t digestout[ (digest)->digestsize ]; \
164
digest_init ( (digest), digestctx ); \
165
digest_update ( (digest), digestctx, (plaintext), \
167
digest_final ( (digest), digestctx, digestout ); \
169
ok ( pubkey_init ( (pubkey), ctx, (key), (key_len) ) == 0 ); \
170
ok ( pubkey_verify ( (pubkey), ctx, (digest), digestout, \
171
(signature), (signature_len) ) != 0 ); \
172
pubkey_final ( (pubkey), ctx ); \
175
#endif /* _PUBKEY_TEST_H */