1 | /*- |
2 | * Copyright (c) 2009 The NetBSD Foundation, Inc. |
3 | * All rights reserved. |
4 | * |
5 | * This code is derived from software contributed to The NetBSD Foundation |
6 | * by Alistair Crooks (agc@NetBSD.org) |
7 | * |
8 | * Redistribution and use in source and binary forms, with or without |
9 | * modification, are permitted provided that the following conditions |
10 | * are met: |
11 | * 1. Redistributions of source code must retain the above copyright |
12 | * notice, this list of conditions and the following disclaimer. |
13 | * 2. Redistributions in binary form must reproduce the above copyright |
14 | * notice, this list of conditions and the following disclaimer in the |
15 | * documentation and/or other materials provided with the distribution. |
16 | * |
17 | * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS |
18 | * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
19 | * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
20 | * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS |
21 | * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
22 | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
23 | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
24 | * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
25 | * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
26 | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
27 | * POSSIBILITY OF SUCH DAMAGE. |
28 | */ |
29 | /* |
30 | * Copyright (c) 2005-2008 Nominet UK (www.nic.uk) |
31 | * All rights reserved. |
32 | * Contributors: Ben Laurie, Rachel Willmer. The Contributors have asserted |
33 | * their moral rights under the UK Copyright Design and Patents Act 1988 to |
34 | * be recorded as the authors of this copyright work. |
35 | * |
36 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not |
37 | * use this file except in compliance with the License. |
38 | * |
39 | * You may obtain a copy of the License at |
40 | * http://www.apache.org/licenses/LICENSE-2.0 |
41 | * |
42 | * Unless required by applicable law or agreed to in writing, software |
43 | * distributed under the License is distributed on an "AS IS" BASIS, |
44 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
45 | * |
46 | * See the License for the specific language governing permissions and |
47 | * limitations under the License. |
48 | */ |
49 | |
50 | /** \file |
51 | */ |
52 | |
53 | #ifndef CRYPTO_H_ |
54 | #define CRYPTO_H_ |
55 | |
56 | #include "keyring.h" |
57 | #include "packet.h" |
58 | #include "memory.h" |
59 | #include "packet-parse.h" |
60 | |
61 | #include <openssl/dsa.h> |
62 | |
63 | #define PGP_MIN_HASH_SIZE 16 |
64 | |
65 | /** pgp_hash_t */ |
66 | struct pgp_hash_t { |
67 | pgp_hash_alg_t alg; /* algorithm */ |
68 | size_t size; /* size */ |
69 | const char *name; /* what it's known as */ |
70 | int (*init)(pgp_hash_t *); |
71 | void (*add)(pgp_hash_t *, const uint8_t *, unsigned); |
72 | unsigned (*finish)(pgp_hash_t *, uint8_t *); |
73 | void *data; /* blob for data */ |
74 | }; |
75 | |
76 | /** pgp_crypt_t */ |
77 | struct pgp_crypt_t { |
78 | pgp_symm_alg_t alg; |
79 | size_t blocksize; |
80 | size_t keysize; |
81 | void (*set_iv)(pgp_crypt_t *, const uint8_t *); |
82 | void (*set_crypt_key)(pgp_crypt_t *, const uint8_t *); |
83 | int (*base_init)(pgp_crypt_t *); |
84 | void (*decrypt_resync)(pgp_crypt_t *); |
85 | /* encrypt/decrypt one block */ |
86 | void (*block_encrypt)(pgp_crypt_t *, void *, const void *); |
87 | void (*block_decrypt)(pgp_crypt_t *, void *, const void *); |
88 | /* Standard CFB encrypt/decrypt (as used by Sym Enc Int Prot packets) */ |
89 | void (*cfb_encrypt)(pgp_crypt_t *, void *, const void *, size_t); |
90 | void (*cfb_decrypt)(pgp_crypt_t *, void *, const void *, size_t); |
91 | void (*decrypt_finish)(pgp_crypt_t *); |
92 | uint8_t iv[PGP_MAX_BLOCK_SIZE]; |
93 | uint8_t civ[PGP_MAX_BLOCK_SIZE]; |
94 | uint8_t siv[PGP_MAX_BLOCK_SIZE]; |
95 | /* siv is needed for weird v3 resync */ |
96 | uint8_t key[PGP_MAX_KEY_SIZE]; |
97 | int num; |
98 | /* num is offset - see openssl _encrypt doco */ |
99 | void *encrypt_key; |
100 | void *decrypt_key; |
101 | }; |
102 | |
103 | void pgp_crypto_finish(void); |
104 | void pgp_hash_md5(pgp_hash_t *); |
105 | void pgp_hash_sha1(pgp_hash_t *); |
106 | void pgp_hash_sha256(pgp_hash_t *); |
107 | void pgp_hash_sha512(pgp_hash_t *); |
108 | void pgp_hash_sha384(pgp_hash_t *); |
109 | void pgp_hash_sha224(pgp_hash_t *); |
110 | void pgp_hash_any(pgp_hash_t *, pgp_hash_alg_t); |
111 | pgp_hash_alg_t pgp_str_to_hash_alg(const char *); |
112 | const char *pgp_text_from_hash(pgp_hash_t *); |
113 | unsigned pgp_hash_size(pgp_hash_alg_t); |
114 | unsigned pgp_hash(uint8_t *, pgp_hash_alg_t, const void *, size_t); |
115 | |
116 | void pgp_hash_add_int(pgp_hash_t *, unsigned, unsigned); |
117 | |
118 | unsigned pgp_dsa_verify(const uint8_t *, size_t, |
119 | const pgp_dsa_sig_t *, |
120 | const pgp_dsa_pubkey_t *); |
121 | |
122 | int pgp_rsa_public_decrypt(uint8_t *, const uint8_t *, size_t, |
123 | const pgp_rsa_pubkey_t *); |
124 | int pgp_rsa_public_encrypt(uint8_t *, const uint8_t *, size_t, |
125 | const pgp_rsa_pubkey_t *); |
126 | |
127 | int pgp_rsa_private_encrypt(uint8_t *, const uint8_t *, size_t, |
128 | const pgp_rsa_seckey_t *, const pgp_rsa_pubkey_t *); |
129 | int pgp_rsa_private_decrypt(uint8_t *, const uint8_t *, size_t, |
130 | const pgp_rsa_seckey_t *, const pgp_rsa_pubkey_t *); |
131 | |
132 | int pgp_elgamal_public_encrypt(uint8_t *, uint8_t *, const uint8_t *, size_t, |
133 | const pgp_elgamal_pubkey_t *); |
134 | int pgp_elgamal_private_decrypt(uint8_t *, const uint8_t *, const uint8_t *, size_t, |
135 | const pgp_elgamal_seckey_t *, const pgp_elgamal_pubkey_t *); |
136 | |
137 | pgp_symm_alg_t pgp_str_to_cipher(const char *); |
138 | unsigned pgp_block_size(pgp_symm_alg_t); |
139 | unsigned pgp_key_size(pgp_symm_alg_t); |
140 | |
141 | int pgp_decrypt_data(pgp_content_enum, pgp_region_t *, |
142 | pgp_stream_t *); |
143 | |
144 | int pgp_crypt_any(pgp_crypt_t *, pgp_symm_alg_t); |
145 | void pgp_decrypt_init(pgp_crypt_t *); |
146 | void pgp_encrypt_init(pgp_crypt_t *); |
147 | size_t pgp_decrypt_se(pgp_crypt_t *, void *, const void *, size_t); |
148 | size_t pgp_encrypt_se(pgp_crypt_t *, void *, const void *, size_t); |
149 | size_t pgp_decrypt_se_ip(pgp_crypt_t *, void *, const void *, size_t); |
150 | size_t pgp_encrypt_se_ip(pgp_crypt_t *, void *, const void *, size_t); |
151 | unsigned pgp_is_sa_supported(pgp_symm_alg_t); |
152 | |
153 | void pgp_reader_push_decrypt(pgp_stream_t *, pgp_crypt_t *, |
154 | pgp_region_t *); |
155 | void pgp_reader_pop_decrypt(pgp_stream_t *); |
156 | |
157 | /* Hash everything that's read */ |
158 | void pgp_reader_push_hash(pgp_stream_t *, pgp_hash_t *); |
159 | void pgp_reader_pop_hash(pgp_stream_t *); |
160 | |
161 | int pgp_decrypt_decode_mpi(uint8_t *, unsigned, const BIGNUM *, |
162 | const BIGNUM *, const pgp_seckey_t *); |
163 | |
164 | unsigned pgp_rsa_encrypt_mpi(const uint8_t *, const size_t, |
165 | const pgp_pubkey_t *, |
166 | pgp_pk_sesskey_params_t *); |
167 | unsigned pgp_elgamal_encrypt_mpi(const uint8_t *, const size_t, |
168 | const pgp_pubkey_t *, |
169 | pgp_pk_sesskey_params_t *); |
170 | |
171 | /* Encrypt everything that's written */ |
172 | struct pgp_key_data; |
173 | void pgp_writer_push_encrypt(pgp_output_t *, |
174 | const struct pgp_key_data *); |
175 | |
176 | unsigned pgp_encrypt_file(pgp_io_t *, const char *, const char *, |
177 | const pgp_key_t *, |
178 | const unsigned, const unsigned, const char *); |
179 | unsigned pgp_decrypt_file(pgp_io_t *, |
180 | const char *, |
181 | const char *, |
182 | pgp_keyring_t *, |
183 | pgp_keyring_t *, |
184 | const unsigned, |
185 | const unsigned, |
186 | const unsigned, |
187 | void *, |
188 | int, |
189 | pgp_cbfunc_t *); |
190 | |
191 | pgp_memory_t * |
192 | pgp_encrypt_buf(pgp_io_t *, const void *, const size_t, |
193 | const pgp_key_t *, |
194 | const unsigned, const char *); |
195 | pgp_memory_t * |
196 | pgp_decrypt_buf(pgp_io_t *, |
197 | const void *, |
198 | const size_t, |
199 | pgp_keyring_t *, |
200 | pgp_keyring_t *, |
201 | const unsigned, |
202 | const unsigned, |
203 | void *, |
204 | int, |
205 | pgp_cbfunc_t *); |
206 | |
207 | /* Keys */ |
208 | pgp_key_t *pgp_rsa_new_selfsign_key(const int, |
209 | const unsigned long, uint8_t *, const char *, |
210 | const char *); |
211 | |
212 | int pgp_dsa_size(const pgp_dsa_pubkey_t *); |
213 | DSA_SIG *pgp_dsa_sign(uint8_t *, unsigned, |
214 | const pgp_dsa_seckey_t *, |
215 | const pgp_dsa_pubkey_t *); |
216 | |
217 | int openssl_read_pem_seckey(const char *, pgp_key_t *, const char *, int); |
218 | |
219 | /** pgp_reader_t */ |
220 | struct pgp_reader_t { |
221 | pgp_reader_func_t *reader; /* reader func to get parse data */ |
222 | pgp_reader_destroyer_t *destroyer; |
223 | void *arg; /* args to pass to reader function */ |
224 | unsigned accumulate:1; /* set to gather packet data */ |
225 | uint8_t *accumulated; /* the accumulated data */ |
226 | unsigned asize; /* size of the buffer */ |
227 | unsigned alength;/* used buffer */ |
228 | unsigned position; /* reader-specific offset */ |
229 | pgp_reader_t *next; |
230 | pgp_stream_t *parent;/* parent parse_info structure */ |
231 | }; |
232 | |
233 | |
234 | /** pgp_cryptinfo_t |
235 | Encrypt/decrypt settings |
236 | */ |
237 | struct pgp_cryptinfo_t { |
238 | char *passphrase; |
239 | pgp_keyring_t *secring; |
240 | const pgp_key_t *keydata; |
241 | pgp_cbfunc_t *getpassphrase; |
242 | pgp_keyring_t *pubring; |
243 | }; |
244 | |
245 | /** pgp_cbdata_t */ |
246 | struct pgp_cbdata_t { |
247 | pgp_cbfunc_t *cbfunc; /* callback function */ |
248 | void *arg; /* args to pass to callback func */ |
249 | pgp_error_t **errors; /* address of error stack */ |
250 | pgp_cbdata_t *next; |
251 | pgp_output_t *output; /* when writing out parsed info */ |
252 | pgp_io_t *io; /* error/output messages */ |
253 | void *passfp; /* fp for passphrase input */ |
254 | pgp_cryptinfo_t cryptinfo; /* used when decrypting */ |
255 | pgp_printstate_t printstate; /* used to keep printing state */ |
256 | pgp_seckey_t *sshseckey; /* secret key for ssh */ |
257 | int numtries; /* # of passphrase attempts */ |
258 | int gotpass; /* when passphrase entered */ |
259 | }; |
260 | |
261 | /** pgp_hashtype_t */ |
262 | typedef struct { |
263 | pgp_hash_t hash; /* hashes we should hash data with */ |
264 | uint8_t keyid[PGP_KEY_ID_SIZE]; |
265 | } pgp_hashtype_t; |
266 | |
267 | #define NTAGS 0x100 /* == 256 */ |
268 | |
269 | /** \brief Structure to hold information about a packet parse. |
270 | * |
271 | * This information includes options about the parse: |
272 | * - whether the packet contents should be accumulated or not |
273 | * - whether signature subpackets should be parsed or left raw |
274 | * |
275 | * It contains options specific to the parsing of armoured data: |
276 | * - whether headers are allowed in armoured data without a gap |
277 | * - whether a blank line is allowed at the start of the armoured data |
278 | * |
279 | * It also specifies : |
280 | * - the callback function to use and its arguments |
281 | * - the reader function to use and its arguments |
282 | * |
283 | * It also contains information about the current state of the parse: |
284 | * - offset from the beginning |
285 | * - the accumulated data, if any |
286 | * - the size of the buffer, and how much has been used |
287 | * |
288 | * It has a linked list of errors. |
289 | */ |
290 | |
291 | struct pgp_stream_t { |
292 | uint8_t ss_raw[NTAGS / 8]; |
293 | /* 1 bit / sig-subpkt type; set to get raw data */ |
294 | uint8_t ss_parsed[NTAGS / 8]; |
295 | /* 1 bit / sig-subpkt type; set to get parsed data */ |
296 | pgp_reader_t readinfo; |
297 | pgp_cbdata_t cbinfo; |
298 | pgp_error_t *errors; |
299 | void *io; /* io streams */ |
300 | pgp_crypt_t decrypt; |
301 | pgp_cryptinfo_t cryptinfo; |
302 | size_t hashc; |
303 | pgp_hashtype_t *hashes; |
304 | unsigned reading_v3_secret:1; |
305 | unsigned reading_mpi_len:1; |
306 | unsigned exact_read:1; |
307 | unsigned partial_read:1; |
308 | unsigned coalescing:1; |
309 | /* used for partial length coalescing */ |
310 | unsigned virtualc; |
311 | unsigned virtualoff; |
312 | uint8_t *virtualpkt; |
313 | }; |
314 | |
315 | #endif /* CRYPTO_H_ */ |
316 | |