xref: /openbsd-src/lib/libfido2/src/rs1.c (revision 7dcdad297d63e268919cb38314e7671fb269df52)
1ab19a69eSdjm /*
2ab19a69eSdjm  * Copyright (c) 2021 Yubico AB. All rights reserved.
3ab19a69eSdjm  * Use of this source code is governed by a BSD-style
4ab19a69eSdjm  * license that can be found in the LICENSE file.
5ab19a69eSdjm  */
6ab19a69eSdjm 
7ab19a69eSdjm #include <openssl/rsa.h>
8ab19a69eSdjm #include <openssl/obj_mac.h>
9ab19a69eSdjm 
10ab19a69eSdjm #include "fido.h"
11ab19a69eSdjm 
12*7dcdad29Stb #define PRAGMA(s)
13ab19a69eSdjm 
14ab19a69eSdjm static EVP_MD *
rs1_get_EVP_MD(void)15ab19a69eSdjm rs1_get_EVP_MD(void)
16ab19a69eSdjm {
17*7dcdad29Stb 	PRAGMA("GCC diagnostic push");
18*7dcdad29Stb 	PRAGMA("GCC diagnostic ignored \"-Wcast-qual\"");
19aeab8fe0Stb 	return ((EVP_MD *)EVP_sha1());
20*7dcdad29Stb 	PRAGMA("GCC diagnostic pop");
21ab19a69eSdjm }
22ab19a69eSdjm 
23ab19a69eSdjm int
rs1_verify_sig(const fido_blob_t * dgst,EVP_PKEY * pkey,const fido_blob_t * sig)24ab19a69eSdjm rs1_verify_sig(const fido_blob_t *dgst, EVP_PKEY *pkey,
25ab19a69eSdjm     const fido_blob_t *sig)
26ab19a69eSdjm {
27ab19a69eSdjm 	EVP_PKEY_CTX	*pctx = NULL;
28ab19a69eSdjm 	EVP_MD		*md = NULL;
29ab19a69eSdjm 	int		 ok = -1;
30ab19a69eSdjm 
31ab19a69eSdjm 	if (EVP_PKEY_base_id(pkey) != EVP_PKEY_RSA) {
32ab19a69eSdjm 		fido_log_debug("%s: EVP_PKEY_base_id", __func__);
33ab19a69eSdjm 		goto fail;
34ab19a69eSdjm 	}
35ab19a69eSdjm 
36ab19a69eSdjm 	if ((md = rs1_get_EVP_MD()) == NULL) {
37ab19a69eSdjm 		fido_log_debug("%s: rs1_get_EVP_MD", __func__);
38ab19a69eSdjm 		goto fail;
39ab19a69eSdjm 	}
40ab19a69eSdjm 
41ab19a69eSdjm 	if ((pctx = EVP_PKEY_CTX_new(pkey, NULL)) == NULL ||
42ab19a69eSdjm 	    EVP_PKEY_verify_init(pctx) != 1 ||
43ab19a69eSdjm 	    EVP_PKEY_CTX_set_rsa_padding(pctx, RSA_PKCS1_PADDING) != 1 ||
44ab19a69eSdjm 	    EVP_PKEY_CTX_set_signature_md(pctx, md) != 1) {
45ab19a69eSdjm 		fido_log_debug("%s: EVP_PKEY_CTX", __func__);
46ab19a69eSdjm 		goto fail;
47ab19a69eSdjm 	}
48ab19a69eSdjm 
49ab19a69eSdjm 	if (EVP_PKEY_verify(pctx, sig->ptr, sig->len, dgst->ptr,
50ab19a69eSdjm 	    dgst->len) != 1) {
51ab19a69eSdjm 		fido_log_debug("%s: EVP_PKEY_verify", __func__);
52ab19a69eSdjm 		goto fail;
53ab19a69eSdjm 	}
54ab19a69eSdjm 
55ab19a69eSdjm 	ok = 0;
56ab19a69eSdjm fail:
57ab19a69eSdjm 	EVP_PKEY_CTX_free(pctx);
58ab19a69eSdjm 
59ab19a69eSdjm 	return (ok);
60ab19a69eSdjm }
61