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