root / lab4 / .minix-src / include / netpgp / verify.h @ 13
History | View | Annotate | Download (8.51 KB)
1 |
/*-
|
---|---|
2 |
* Copyright (c) 2012,2013,2014,2015 Alistair Crooks <agc@NetBSD.org>
|
3 |
* All rights reserved.
|
4 |
*
|
5 |
* Redistribution and use in source and binary forms, with or without
|
6 |
* modification, are permitted provided that the following conditions
|
7 |
* are met:
|
8 |
* 1. Redistributions of source code must retain the above copyright
|
9 |
* notice, this list of conditions and the following disclaimer.
|
10 |
* 2. Redistributions in binary form must reproduce the above copyright
|
11 |
* notice, this list of conditions and the following disclaimer in the
|
12 |
* documentation and/or other materials provided with the distribution.
|
13 |
*
|
14 |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
15 |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
16 |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
17 |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
18 |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
19 |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
20 |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
21 |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
22 |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
23 |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
24 |
*/
|
25 |
#ifndef NETPGP_VERIFY_H_
|
26 |
#define NETPGP_VERIFY_H_ 20150205 |
27 |
|
28 |
#define NETPGPVERIFY_VERSION "netpgpverify portable 20150205" |
29 |
|
30 |
#include <sys/types.h> |
31 |
|
32 |
#include <inttypes.h> |
33 |
|
34 |
#ifndef PGPV_ARRAY
|
35 |
/* creates 2 unsigned vars called "name"c and "name"size in current scope */
|
36 |
/* also creates an array called "name"s in current scope */
|
37 |
#define PGPV_ARRAY(type, name) \
|
38 |
unsigned name##c; unsigned name##vsize; type *name##s |
39 |
#endif
|
40 |
|
41 |
/* 64bit key ids */
|
42 |
#define PGPV_KEYID_LEN 8 |
43 |
#define PGPV_STR_KEYID_LEN (PGPV_KEYID_LEN + PGPV_KEYID_LEN + 1) |
44 |
|
45 |
/* bignum structure */
|
46 |
typedef struct pgpv_bignum_t { |
47 |
void *bn; /* hide the implementation details */ |
48 |
uint16_t bits; /* cached number of bits */
|
49 |
} pgpv_bignum_t; |
50 |
|
51 |
/* right now, our max binary digest length is 20 bytes */
|
52 |
#define PGPV_MAX_HASH_LEN 64 |
53 |
|
54 |
/* fingerprint */
|
55 |
typedef struct pgpv_fingerprint_t { |
56 |
uint8_t hashalg; /* algorithm for digest */
|
57 |
uint8_t v[PGPV_MAX_HASH_LEN]; /* the digest */
|
58 |
uint32_t len; /* its length */
|
59 |
} pgpv_fingerprint_t; |
60 |
|
61 |
/* specify size for array of bignums */
|
62 |
#define PGPV_MAX_PUBKEY_BN 4 |
63 |
|
64 |
/* public key */
|
65 |
typedef struct pgpv_pubkey_t { |
66 |
pgpv_fingerprint_t fingerprint; /* key fingerprint i.e. digest */
|
67 |
uint8_t keyid[PGPV_KEYID_LEN]; /* last 8 bytes of v4 keys */
|
68 |
int64_t birth; /* creation time */
|
69 |
int64_t expiry; /* expiry time */
|
70 |
pgpv_bignum_t bn[PGPV_MAX_PUBKEY_BN]; /* bignums */
|
71 |
uint8_t keyalg; /* key algorithm */
|
72 |
uint8_t hashalg; /* hash algorithm */
|
73 |
uint8_t version; /* key version */
|
74 |
} pgpv_pubkey_t; |
75 |
|
76 |
#define PGPV_MAX_SESSKEY_BN 2 |
77 |
|
78 |
/* a (size, byte array) string */
|
79 |
typedef struct pgpv_string_t { |
80 |
size_t size; |
81 |
uint8_t *data; |
82 |
} pgpv_string_t; |
83 |
|
84 |
typedef struct pgpv_ref_t { |
85 |
void *vp;
|
86 |
size_t offset; |
87 |
unsigned mem;
|
88 |
} pgpv_ref_t; |
89 |
|
90 |
#define PGPV_MAX_SECKEY_BN 4 |
91 |
|
92 |
typedef struct pgpv_compress_t { |
93 |
pgpv_string_t s; |
94 |
uint8_t compalg; |
95 |
} pgpv_compress_t; |
96 |
|
97 |
/* a packet dealing with trust */
|
98 |
typedef struct pgpv_trust_t { |
99 |
uint8_t level; |
100 |
uint8_t amount; |
101 |
} pgpv_trust_t; |
102 |
|
103 |
/* a signature sub packet */
|
104 |
typedef struct pgpv_sigsubpkt_t { |
105 |
pgpv_string_t s; |
106 |
uint8_t tag; |
107 |
uint8_t critical; |
108 |
} pgpv_sigsubpkt_t; |
109 |
|
110 |
#define PGPV_MAX_SIG_BN 2 |
111 |
|
112 |
typedef struct pgpv_signature_t { |
113 |
uint8_t *signer; /* key id of signer */
|
114 |
pgpv_ref_t hashstart; |
115 |
uint8_t *hash2; |
116 |
uint8_t *mpi; |
117 |
int64_t birth; |
118 |
int64_t keyexpiry; |
119 |
int64_t expiry; |
120 |
uint32_t hashlen; |
121 |
uint8_t version; |
122 |
uint8_t type; |
123 |
uint8_t keyalg; |
124 |
uint8_t hashalg; |
125 |
uint8_t trustlevel; |
126 |
uint8_t trustamount; |
127 |
pgpv_bignum_t bn[PGPV_MAX_SIG_BN]; |
128 |
char *regexp;
|
129 |
char *pref_key_server;
|
130 |
char *policy;
|
131 |
char *features;
|
132 |
char *why_revoked;
|
133 |
uint8_t *revoke_fingerprint; |
134 |
uint8_t revoke_alg; |
135 |
uint8_t revoke_sensitive; |
136 |
uint8_t trustsig; |
137 |
uint8_t revocable; |
138 |
uint8_t pref_symm_alg; |
139 |
uint8_t pref_hash_alg; |
140 |
uint8_t pref_compress_alg; |
141 |
uint8_t key_server_modify; |
142 |
uint8_t notation; |
143 |
uint8_t type_key; |
144 |
uint8_t primary_userid; |
145 |
uint8_t revoked; /* subtract 1 to get real reason, 0 == not revoked */
|
146 |
} pgpv_signature_t; |
147 |
|
148 |
/* a signature packet */
|
149 |
typedef struct pgpv_sigpkt_t { |
150 |
pgpv_signature_t sig; |
151 |
uint16_t subslen; |
152 |
uint16_t unhashlen; |
153 |
PGPV_ARRAY(pgpv_sigsubpkt_t, subpkts); |
154 |
} pgpv_sigpkt_t; |
155 |
|
156 |
/* a one-pass signature packet */
|
157 |
typedef struct pgpv_onepass_t { |
158 |
uint8_t keyid[PGPV_KEYID_LEN]; |
159 |
uint8_t version; |
160 |
uint8_t type; |
161 |
uint8_t hashalg; |
162 |
uint8_t keyalg; |
163 |
uint8_t nested; |
164 |
} pgpv_onepass_t; |
165 |
|
166 |
/* a literal data packet */
|
167 |
typedef struct pgpv_litdata_t { |
168 |
uint8_t *filename; |
169 |
pgpv_string_t s; |
170 |
uint32_t secs; |
171 |
uint8_t namelen; |
172 |
char format;
|
173 |
unsigned mem;
|
174 |
size_t offset; |
175 |
size_t len; |
176 |
} pgpv_litdata_t; |
177 |
|
178 |
/* user attributes - images */
|
179 |
typedef struct pgpv_userattr_t { |
180 |
size_t len; |
181 |
PGPV_ARRAY(pgpv_string_t, subattrs); |
182 |
} pgpv_userattr_t; |
183 |
|
184 |
/* a general PGP packet */
|
185 |
typedef struct pgpv_pkt_t { |
186 |
uint8_t tag; |
187 |
uint8_t newfmt; |
188 |
uint8_t allocated; |
189 |
uint8_t mement; |
190 |
size_t offset; |
191 |
pgpv_string_t s; |
192 |
union {
|
193 |
pgpv_sigpkt_t sigpkt; |
194 |
pgpv_onepass_t onepass; |
195 |
pgpv_litdata_t litdata; |
196 |
pgpv_compress_t compressed; |
197 |
pgpv_trust_t trust; |
198 |
pgpv_pubkey_t pubkey; |
199 |
pgpv_string_t userid; |
200 |
pgpv_userattr_t userattr; |
201 |
} u; |
202 |
} pgpv_pkt_t; |
203 |
|
204 |
/* a memory structure */
|
205 |
typedef struct pgpv_mem_t { |
206 |
size_t size; |
207 |
size_t cc; |
208 |
uint8_t *mem; |
209 |
FILE *fp; |
210 |
uint8_t dealloc; |
211 |
const char *allowed; /* the types of packet that are allowed */ |
212 |
} pgpv_mem_t; |
213 |
|
214 |
/* packet parser */
|
215 |
|
216 |
typedef struct pgpv_signed_userid_t { |
217 |
pgpv_string_t userid; |
218 |
PGPV_ARRAY(pgpv_signature_t, sigs); |
219 |
uint8_t primary_userid; |
220 |
uint8_t revoked; |
221 |
} pgpv_signed_userid_t; |
222 |
|
223 |
typedef struct pgpv_signed_userattr_t { |
224 |
pgpv_userattr_t userattr; |
225 |
PGPV_ARRAY(pgpv_signature_t, sigs); |
226 |
uint8_t revoked; |
227 |
} pgpv_signed_userattr_t; |
228 |
|
229 |
typedef struct pgpv_signed_subkey_t { |
230 |
pgpv_pubkey_t subkey; |
231 |
pgpv_signature_t revoc_self_sig; |
232 |
PGPV_ARRAY(pgpv_signature_t, sigs); |
233 |
} pgpv_signed_subkey_t; |
234 |
|
235 |
typedef struct pgpv_primarykey_t { |
236 |
pgpv_pubkey_t primary; |
237 |
pgpv_signature_t revoc_self_sig; |
238 |
PGPV_ARRAY(pgpv_signature_t, direct_sigs); |
239 |
PGPV_ARRAY(pgpv_signed_userid_t, signed_userids); |
240 |
PGPV_ARRAY(pgpv_signed_userattr_t, signed_userattrs); |
241 |
PGPV_ARRAY(pgpv_signed_subkey_t, signed_subkeys); |
242 |
size_t fmtsize; |
243 |
uint8_t primary_userid; |
244 |
} pgpv_primarykey_t; |
245 |
|
246 |
/* everything stems from this structure */
|
247 |
typedef struct pgpv_t { |
248 |
PGPV_ARRAY(pgpv_pkt_t, pkts); /* packet array */
|
249 |
PGPV_ARRAY(pgpv_primarykey_t, primaries); /* array of primary keys */
|
250 |
PGPV_ARRAY(pgpv_mem_t, areas); /* areas we read packets from */
|
251 |
PGPV_ARRAY(size_t, datastarts); /* starts of data packets */
|
252 |
size_t pkt; /* when parsing, current pkt number */
|
253 |
const char *op; /* the operation we're doing */ |
254 |
unsigned ssh; /* using ssh keys */ |
255 |
} pgpv_t; |
256 |
|
257 |
#define PGPV_REASON_LEN 128 |
258 |
|
259 |
/* when searching, we define a cursor, and fill in an array of subscripts */
|
260 |
typedef struct pgpv_cursor_t { |
261 |
pgpv_t *pgp; /* pointer to pgp tree */
|
262 |
char *field; /* field we're searching on */ |
263 |
char *op; /* operation we're doing */ |
264 |
char *value; /* value we're searching for */ |
265 |
void *ptr; /* for regexps etc */ |
266 |
PGPV_ARRAY(uint32_t, found); /* array of matched pimary key subscripts */
|
267 |
PGPV_ARRAY(size_t, datacookies); /* cookies to retrieve matched data */
|
268 |
int64_t sigtime; /* time of signature */
|
269 |
char why[PGPV_REASON_LEN]; /* reason for bad signature */ |
270 |
} pgpv_cursor_t; |
271 |
|
272 |
#ifndef __BEGIN_DECLS
|
273 |
# if defined(__cplusplus)
|
274 |
# define __BEGIN_DECLS extern "C" { |
275 |
# define __END_DECLS }
|
276 |
# else
|
277 |
# define __BEGIN_DECLS
|
278 |
# define __END_DECLS
|
279 |
# endif
|
280 |
#endif
|
281 |
|
282 |
__BEGIN_DECLS |
283 |
|
284 |
int pgpv_read_pubring(pgpv_t */*pgp*/, const void */*keyringfile/mem*/, ssize_t /*size*/); |
285 |
int pgpv_read_ssh_pubkeys(pgpv_t */*pgp*/, const void */*keyring*/, ssize_t /*size*/); |
286 |
|
287 |
size_t pgpv_verify(pgpv_cursor_t */*cursor*/, pgpv_t */*pgp*/, const void */*mem/file*/, ssize_t /*size*/); |
288 |
size_t pgpv_get_verified(pgpv_cursor_t */*cursor*/, size_t /*cookie*/, char **/*ret*/); |
289 |
int pgpv_get_cursor_element(pgpv_cursor_t */*cursor*/, size_t /*element*/); |
290 |
size_t pgpv_dump(pgpv_t */*pgp*/, char **/*data*/); |
291 |
|
292 |
size_t pgpv_get_entry(pgpv_t */*pgp*/, unsigned /*ent*/, char **/*ret*/, const char */*modifiers*/); |
293 |
|
294 |
int pgpv_close(pgpv_t */*pgp*/); |
295 |
|
296 |
__END_DECLS |
297 |
|
298 |
#endif
|