Line | Count | Source (jump to first uncovered line) |
1 | | /* |
2 | | * Copyright (c) 2021 Yubico AB. All rights reserved. |
3 | | * Use of this source code is governed by a BSD-style |
4 | | * license that can be found in the LICENSE file. |
5 | | * SPDX-License-Identifier: BSD-2-Clause |
6 | | */ |
7 | | |
8 | | #include <openssl/rsa.h> |
9 | | #include <openssl/obj_mac.h> |
10 | | |
11 | | #include "fido.h" |
12 | | |
13 | | #if defined(LIBRESSL_VERSION_NUMBER) && LIBRESSL_VERSION_NUMBER < 0x3050200fL |
14 | | static EVP_MD * |
15 | | rs1_get_EVP_MD(void) |
16 | | { |
17 | | const EVP_MD *from; |
18 | | EVP_MD *to = NULL; |
19 | | |
20 | | if ((from = EVP_sha1()) != NULL && (to = malloc(sizeof(*to))) != NULL) |
21 | | memcpy(to, from, sizeof(*to)); |
22 | | |
23 | | return (to); |
24 | | } |
25 | | |
26 | | static void |
27 | | rs1_free_EVP_MD(EVP_MD *md) |
28 | | { |
29 | | freezero(md, sizeof(*md)); |
30 | | } |
31 | | #elif OPENSSL_VERSION_NUMBER >= 0x30000000 |
32 | | static EVP_MD * |
33 | | rs1_get_EVP_MD(void) |
34 | 12 | { |
35 | 12 | return (EVP_MD_fetch(NULL, "SHA-1", NULL)); |
36 | 12 | } |
37 | | |
38 | | static void |
39 | | rs1_free_EVP_MD(EVP_MD *md) |
40 | 12 | { |
41 | 12 | EVP_MD_free(md); |
42 | 12 | } |
43 | | #else |
44 | | static EVP_MD * |
45 | | rs1_get_EVP_MD(void) |
46 | | { |
47 | | const EVP_MD *md; |
48 | | |
49 | | if ((md = EVP_sha1()) == NULL) |
50 | | return (NULL); |
51 | | |
52 | | return (EVP_MD_meth_dup(md)); |
53 | | } |
54 | | |
55 | | static void |
56 | | rs1_free_EVP_MD(EVP_MD *md) |
57 | | { |
58 | | EVP_MD_meth_free(md); |
59 | | } |
60 | | #endif /* LIBRESSL_VERSION_NUMBER */ |
61 | | |
62 | | int |
63 | | rs1_verify_sig(const fido_blob_t *dgst, EVP_PKEY *pkey, |
64 | | const fido_blob_t *sig) |
65 | 12 | { |
66 | 12 | EVP_PKEY_CTX *pctx = NULL; |
67 | 12 | EVP_MD *md = NULL; |
68 | 12 | int ok = -1; |
69 | | |
70 | 12 | if (EVP_PKEY_base_id(pkey) != EVP_PKEY_RSA) { |
71 | 0 | fido_log_debug("%s: EVP_PKEY_base_id", __func__); |
72 | 0 | goto fail; |
73 | 0 | } |
74 | | |
75 | 12 | if ((md = rs1_get_EVP_MD()) == NULL) { |
76 | 0 | fido_log_debug("%s: rs1_get_EVP_MD", __func__); |
77 | 0 | goto fail; |
78 | 0 | } |
79 | | |
80 | 12 | if ((pctx = EVP_PKEY_CTX_new(pkey, NULL)) == NULL || |
81 | 12 | EVP_PKEY_verify_init(pctx) != 1 || |
82 | 12 | EVP_PKEY_CTX_set_rsa_padding(pctx, RSA_PKCS1_PADDING) != 1 || |
83 | 12 | EVP_PKEY_CTX_set_signature_md(pctx, md) != 1) { |
84 | 2 | fido_log_debug("%s: EVP_PKEY_CTX", __func__); |
85 | 2 | goto fail; |
86 | 2 | } |
87 | | |
88 | 10 | if (EVP_PKEY_verify(pctx, sig->ptr, sig->len, dgst->ptr, |
89 | 10 | dgst->len) != 1) { |
90 | 9 | fido_log_debug("%s: EVP_PKEY_verify", __func__); |
91 | 9 | goto fail; |
92 | 9 | } |
93 | | |
94 | 1 | ok = 0; |
95 | 12 | fail: |
96 | 12 | EVP_PKEY_CTX_free(pctx); |
97 | 12 | rs1_free_EVP_MD(md); |
98 | | |
99 | 12 | return (ok); |
100 | 1 | } |