Commit | Line | Data |
---|---|---|
cfc2bb32 TS |
1 | /* |
2 | * RSA key extract helper | |
3 | * | |
4 | * Copyright (c) 2015, Intel Corporation | |
5 | * Authors: Tadeusz Struk <tadeusz.struk@intel.com> | |
6 | * | |
7 | * This program is free software; you can redistribute it and/or modify it | |
8 | * under the terms of the GNU General Public License as published by the Free | |
9 | * Software Foundation; either version 2 of the License, or (at your option) | |
10 | * any later version. | |
11 | * | |
12 | */ | |
13 | #include <linux/kernel.h> | |
14 | #include <linux/export.h> | |
15 | #include <linux/err.h> | |
16 | #include <linux/fips.h> | |
17 | #include <crypto/internal/rsa.h> | |
22287b0b TS |
18 | #include "rsapubkey-asn1.h" |
19 | #include "rsaprivkey-asn1.h" | |
cfc2bb32 TS |
20 | |
21 | int rsa_get_n(void *context, size_t hdrlen, unsigned char tag, | |
22 | const void *value, size_t vlen) | |
23 | { | |
24 | struct rsa_key *key = context; | |
5a7de973 TA |
25 | const u8 *ptr = value; |
26 | size_t n_sz = vlen; | |
cfc2bb32 | 27 | |
5a7de973 TA |
28 | /* invalid key provided */ |
29 | if (!value || !vlen) | |
cfc2bb32 | 30 | return -EINVAL; |
5a7de973 TA |
31 | |
32 | if (fips_enabled) { | |
33 | while (!*ptr && n_sz) { | |
34 | ptr++; | |
35 | n_sz--; | |
36 | } | |
37 | ||
38 | /* In FIPS mode only allow key size 2K & 3K */ | |
39 | if (n_sz != 256 && n_sz != 384) { | |
40 | pr_err("RSA: key size not allowed in FIPS mode\n"); | |
41 | return -EINVAL; | |
42 | } | |
cfc2bb32 | 43 | } |
5a7de973 TA |
44 | |
45 | key->n = value; | |
46 | key->n_sz = vlen; | |
47 | ||
cfc2bb32 TS |
48 | return 0; |
49 | } | |
50 | ||
51 | int rsa_get_e(void *context, size_t hdrlen, unsigned char tag, | |
52 | const void *value, size_t vlen) | |
53 | { | |
54 | struct rsa_key *key = context; | |
55 | ||
5a7de973 TA |
56 | /* invalid key provided */ |
57 | if (!value || !key->n_sz || !vlen || vlen > key->n_sz) | |
58 | return -EINVAL; | |
cfc2bb32 | 59 | |
5a7de973 TA |
60 | key->e = value; |
61 | key->e_sz = vlen; | |
cfc2bb32 TS |
62 | |
63 | return 0; | |
64 | } | |
65 | ||
66 | int rsa_get_d(void *context, size_t hdrlen, unsigned char tag, | |
67 | const void *value, size_t vlen) | |
68 | { | |
69 | struct rsa_key *key = context; | |
70 | ||
5a7de973 TA |
71 | /* invalid key provided */ |
72 | if (!value || !key->n_sz || !vlen || vlen > key->n_sz) | |
cfc2bb32 | 73 | return -EINVAL; |
cfc2bb32 | 74 | |
5a7de973 TA |
75 | key->d = value; |
76 | key->d_sz = vlen; | |
cfc2bb32 | 77 | |
5a7de973 | 78 | return 0; |
cfc2bb32 | 79 | } |
cfc2bb32 TS |
80 | |
81 | /** | |
5a7de973 TA |
82 | * rsa_parse_pub_key() - decodes the BER encoded buffer and stores in the |
83 | * provided struct rsa_key, pointers to the raw key as is, | |
84 | * so that the caller can copy it or MPI parse it, etc. | |
cfc2bb32 TS |
85 | * |
86 | * @rsa_key: struct rsa_key key representation | |
87 | * @key: key in BER format | |
88 | * @key_len: length of key | |
89 | * | |
90 | * Return: 0 on success or error code in case of error | |
91 | */ | |
22287b0b TS |
92 | int rsa_parse_pub_key(struct rsa_key *rsa_key, const void *key, |
93 | unsigned int key_len) | |
cfc2bb32 | 94 | { |
5a7de973 | 95 | return asn1_ber_decoder(&rsapubkey_decoder, rsa_key, key, key_len); |
cfc2bb32 | 96 | } |
22287b0b TS |
97 | EXPORT_SYMBOL_GPL(rsa_parse_pub_key); |
98 | ||
99 | /** | |
5a7de973 TA |
100 | * rsa_parse_priv_key() - decodes the BER encoded buffer and stores in the |
101 | * provided struct rsa_key, pointers to the raw key | |
102 | * as is, so that the caller can copy it or MPI parse it, | |
103 | * etc. | |
22287b0b TS |
104 | * |
105 | * @rsa_key: struct rsa_key key representation | |
106 | * @key: key in BER format | |
107 | * @key_len: length of key | |
108 | * | |
109 | * Return: 0 on success or error code in case of error | |
110 | */ | |
111 | int rsa_parse_priv_key(struct rsa_key *rsa_key, const void *key, | |
112 | unsigned int key_len) | |
113 | { | |
5a7de973 | 114 | return asn1_ber_decoder(&rsaprivkey_decoder, rsa_key, key, key_len); |
22287b0b TS |
115 | } |
116 | EXPORT_SYMBOL_GPL(rsa_parse_priv_key); |