summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjsing <>2022-02-01 17:18:38 +0000
committerjsing <>2022-02-01 17:18:38 +0000
commit38b0a58078d54a33f27c269dc2cf28bfb11b7f92 (patch)
tree7b6ff534f6a06c4c69f4a8f3e86b37c70edb90ff
parent1929a825a07468e5453b528de05c88e8e277c9fa (diff)
downloadopenbsd-38b0a58078d54a33f27c269dc2cf28bfb11b7f92.tar.gz
openbsd-38b0a58078d54a33f27c269dc2cf28bfb11b7f92.tar.bz2
openbsd-38b0a58078d54a33f27c269dc2cf28bfb11b7f92.zip
Provide our own signature padding defines.
Rather than leaking libcrypto defines through the tls_sign_cb and tls_signer_sign() interfaces, provide and use our own TLS_PADDING_* defines. ok inoguchi@ tb@
-rw-r--r--src/lib/libtls/tls.h6
-rw-r--r--src/lib/libtls/tls_signer.c38
2 files changed, 38 insertions, 6 deletions
diff --git a/src/lib/libtls/tls.h b/src/lib/libtls/tls.h
index 91166bf9a7..91218b729d 100644
--- a/src/lib/libtls/tls.h
+++ b/src/lib/libtls/tls.h
@@ -1,4 +1,4 @@
1/* $OpenBSD: tls.h,v 1.60 2022/02/01 17:13:10 jsing Exp $ */ 1/* $OpenBSD: tls.h,v 1.61 2022/02/01 17:18:38 jsing Exp $ */
2/* 2/*
3 * Copyright (c) 2014 Joel Sing <jsing@openbsd.org> 3 * Copyright (c) 2014 Joel Sing <jsing@openbsd.org>
4 * 4 *
@@ -72,6 +72,10 @@ extern "C" {
72#define TLS_MAX_SESSION_ID_LENGTH 32 72#define TLS_MAX_SESSION_ID_LENGTH 32
73#define TLS_TICKET_KEY_SIZE 48 73#define TLS_TICKET_KEY_SIZE 48
74 74
75#define TLS_PADDING_NONE 0
76#define TLS_PADDING_RSA_PKCS1 1
77#define TLS_PADDING_RSA_X9_31 2
78
75struct tls; 79struct tls;
76struct tls_config; 80struct tls_config;
77 81
diff --git a/src/lib/libtls/tls_signer.c b/src/lib/libtls/tls_signer.c
index d6429762e9..1f11096792 100644
--- a/src/lib/libtls/tls_signer.c
+++ b/src/lib/libtls/tls_signer.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: tls_signer.c,v 1.3 2022/02/01 17:13:10 jsing Exp $ */ 1/* $OpenBSD: tls_signer.c,v 1.4 2022/02/01 17:18:38 jsing Exp $ */
2/* 2/*
3 * Copyright (c) 2021 Eric Faurot <eric@openbsd.org> 3 * Copyright (c) 2021 Eric Faurot <eric@openbsd.org>
4 * 4 *
@@ -183,12 +183,24 @@ tls_sign_rsa(struct tls_signer *signer, struct tls_signer_key *skey,
183 const uint8_t *input, size_t input_len, int padding_type, 183 const uint8_t *input, size_t input_len, int padding_type,
184 uint8_t **out_signature, size_t *out_signature_len) 184 uint8_t **out_signature, size_t *out_signature_len)
185{ 185{
186 int rsa_size, signature_len; 186 int rsa_padding, rsa_size, signature_len;
187 char *signature = NULL; 187 char *signature = NULL;
188 188
189 *out_signature = NULL; 189 *out_signature = NULL;
190 *out_signature_len = 0; 190 *out_signature_len = 0;
191 191
192 if (padding_type == TLS_PADDING_NONE) {
193 rsa_padding = RSA_NO_PADDING;
194 } else if (padding_type == TLS_PADDING_RSA_PKCS1) {
195 rsa_padding = RSA_PKCS1_PADDING;
196 } else if (padding_type == TLS_PADDING_RSA_X9_31) {
197 rsa_padding = RSA_X931_PADDING;
198 } else {
199 tls_error_setx(&signer->error, "invalid RSA padding type (%d)",
200 padding_type);
201 return (-1);
202 }
203
192 if (input_len > INT_MAX) { 204 if (input_len > INT_MAX) {
193 tls_error_setx(&signer->error, "input too large"); 205 tls_error_setx(&signer->error, "input too large");
194 return (-1); 206 return (-1);
@@ -204,7 +216,7 @@ tls_sign_rsa(struct tls_signer *signer, struct tls_signer_key *skey,
204 } 216 }
205 217
206 if ((signature_len = RSA_private_encrypt((int)input_len, input, 218 if ((signature_len = RSA_private_encrypt((int)input_len, input,
207 signature, skey->rsa, padding_type)) <= 0) { 219 signature, skey->rsa, rsa_padding)) <= 0) {
208 /* XXX - include further details from libcrypto. */ 220 /* XXX - include further details from libcrypto. */
209 tls_error_setx(&signer->error, "RSA signing failed"); 221 tls_error_setx(&signer->error, "RSA signing failed");
210 free(signature); 222 free(signature);
@@ -228,6 +240,11 @@ tls_sign_ecdsa(struct tls_signer *signer, struct tls_signer_key *skey,
228 *out_signature = NULL; 240 *out_signature = NULL;
229 *out_signature_len = 0; 241 *out_signature_len = 0;
230 242
243 if (padding_type != TLS_PADDING_NONE) {
244 tls_error_setx(&signer->error, "invalid ECDSA padding");
245 return (-1);
246 }
247
231 if (input_len > INT_MAX) { 248 if (input_len > INT_MAX) {
232 tls_error_setx(&signer->error, "digest too large"); 249 tls_error_setx(&signer->error, "digest too large");
233 return (-1); 250 return (-1);
@@ -296,6 +313,7 @@ tls_rsa_priv_enc(int from_len, const unsigned char *from, unsigned char *to,
296 uint8_t *signature = NULL; 313 uint8_t *signature = NULL;
297 size_t signature_len = 0; 314 size_t signature_len = 0;
298 const char *pubkey_hash; 315 const char *pubkey_hash;
316 int padding_type;
299 317
300 /* 318 /*
301 * This function is called via RSA_private_encrypt() and has to conform 319 * This function is called via RSA_private_encrypt() and has to conform
@@ -309,11 +327,21 @@ tls_rsa_priv_enc(int from_len, const unsigned char *from, unsigned char *to,
309 if (pubkey_hash == NULL || config == NULL) 327 if (pubkey_hash == NULL || config == NULL)
310 goto err; 328 goto err;
311 329
330 if (rsa_padding == RSA_NO_PADDING) {
331 padding_type = TLS_PADDING_NONE;
332 } else if (rsa_padding == RSA_PKCS1_PADDING) {
333 padding_type = TLS_PADDING_RSA_PKCS1;
334 } else if (rsa_padding == RSA_X931_PADDING) {
335 padding_type = TLS_PADDING_RSA_X9_31;
336 } else {
337 goto err;
338 }
339
312 if (from_len < 0) 340 if (from_len < 0)
313 goto err; 341 goto err;
314 342
315 if (config->sign_cb(config->sign_cb_arg, pubkey_hash, from, from_len, 343 if (config->sign_cb(config->sign_cb_arg, pubkey_hash, from, from_len,
316 rsa_padding, &signature, &signature_len) == -1) 344 padding_type, &signature, &signature_len) == -1)
317 goto err; 345 goto err;
318 346
319 if (signature_len > INT_MAX || (int)signature_len > RSA_size(rsa)) 347 if (signature_len > INT_MAX || (int)signature_len > RSA_size(rsa))
@@ -378,7 +406,7 @@ tls_ecdsa_do_sign(const unsigned char *dgst, int dgst_len, const BIGNUM *inv,
378 goto err; 406 goto err;
379 407
380 if (config->sign_cb(config->sign_cb_arg, pubkey_hash, dgst, dgst_len, 408 if (config->sign_cb(config->sign_cb_arg, pubkey_hash, dgst, dgst_len,
381 0, &signature, &signature_len) == -1) 409 TLS_PADDING_NONE, &signature, &signature_len) == -1)
382 goto err; 410 goto err;
383 411
384 p = signature; 412 p = signature;