5 Author: Pekka Riikonen <priikone@silcnet.org>
7 Copyright (C) 1997 - 2007 Pekka Riikonen
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; version 2 of the License.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
24 #error "Do not include this header directly"
27 /* Macros for defining the PKCS APIs. Use these when you need to declare
28 PKCS API functions. */
30 #define SILC_PKCS_ALG_GENERATE_KEY(name) \
31 SilcBool name(const struct SilcPKCSAlgorithmStruct *pkcs, \
32 SilcUInt32 keylen, SilcRng rng, \
33 void **ret_public_key, void **ret_private_key)
35 #define SILC_PKCS_ALG_IMPORT_PUBLIC_KEY(name) \
36 int name(const struct SilcPKCSAlgorithmStruct *pkcs, \
37 void *key, SilcUInt32 key_len, \
38 void **ret_public_key)
40 #define SILC_PKCS_ALG_EXPORT_PUBLIC_KEY(name) \
41 unsigned char *name(const struct SilcPKCSAlgorithmStruct *pkcs, \
46 #define SILC_PKCS_ALG_PUBLIC_KEY_BITLEN(name) \
47 SilcUInt32 name(const struct SilcPKCSAlgorithmStruct *pkcs, \
50 #define SILC_PKCS_ALG_PUBLIC_KEY_COPY(name) \
51 void *name(const struct SilcPKCSAlgorithmStruct *pkcs, \
54 #define SILC_PKCS_ALG_PUBLIC_KEY_COMPARE(name) \
55 SilcBool name(const struct SilcPKCSAlgorithmStruct *pkcs, \
56 void *key1, void *key2)
58 #define SILC_PKCS_ALG_PUBLIC_KEY_FREE(name) \
59 void name(const struct SilcPKCSAlgorithmStruct *pkcs, void *public_key)
61 #define SILC_PKCS_ALG_IMPORT_PRIVATE_KEY(name) \
62 int name(const struct SilcPKCSAlgorithmStruct *pkcs, \
63 void *key, SilcUInt32 key_len, \
64 void **ret_private_key)
66 #define SILC_PKCS_ALG_EXPORT_PRIVATE_KEY(name) \
67 unsigned char *name(const struct SilcPKCSAlgorithmStruct *pkcs, \
68 SilcStack stack, void *private_key, \
71 #define SILC_PKCS_ALG_PRIVATE_KEY_BITLEN(name) \
72 SilcUInt32 name(const struct SilcPKCSAlgorithmStruct *pkcs, \
75 #define SILC_PKCS_ALG_PRIVATE_KEY_FREE(name) \
76 void name(const struct SilcPKCSAlgorithmStruct *pkcs, \
79 #define SILC_PKCS_ALG_ENCRYPT(name) \
80 SilcAsyncOperation name(const struct SilcPKCSAlgorithmStruct *pkcs, \
85 SilcPKCSEncryptCb encrypt_cb, \
88 #define SILC_PKCS_ALG_DECRYPT(name) \
89 SilcAsyncOperation name(const struct SilcPKCSAlgorithmStruct *pkcs, \
93 SilcPKCSDecryptCb decrypt_cb, \
96 #define SILC_PKCS_ALG_SIGN(name) \
97 SilcAsyncOperation name(const struct SilcPKCSAlgorithmStruct *pkcs, \
100 SilcUInt32 src_len, \
101 SilcBool compute_hash, \
104 SilcPKCSSignCb sign_cb, \
107 #define SILC_PKCS_ALG_VERIFY(name) \
108 SilcAsyncOperation name(const struct SilcPKCSAlgorithmStruct *pkcs, \
110 unsigned char *signature, \
111 SilcUInt32 signature_len, \
112 unsigned char *data, \
113 SilcUInt32 data_len, \
116 SilcPKCSVerifyCb verify_cb, \
119 /* The PKCS Algorithm object to represent any PKCS algorithm. This context
120 implements the PKCS algorithm, such as RSA, DSA, etc. */
121 struct SilcPKCSAlgorithmStruct {
122 /* Algorithm name and scheme */
123 char *name; /* Eg. rsa, dsa, etc. */
124 char *scheme; /* Eg. pkcs1, openpgp, etc. */
126 /* Supported hash functions, comma separated list */
129 /* Generate new key pair. Returns PKCS algorithm specific public key
130 and private key contexts. */
131 SILC_PKCS_ALG_GENERATE_KEY((*generate_key));
133 /* Public key routines. */
135 /* Import/create new public key. Returns the length of the data that was
136 imported from `key' or 0 on error. Returns the PKCS algorithm specific
137 public key to `ret_public_key'. */
138 SILC_PKCS_ALG_IMPORT_PUBLIC_KEY((*import_public_key));
140 /* Export/encode public key. Returns the encoded public key buffer that
141 the caller must free. */
142 SILC_PKCS_ALG_EXPORT_PUBLIC_KEY((*export_public_key));
144 /* Returns the bit length of public key */
145 SILC_PKCS_ALG_PUBLIC_KEY_BITLEN((*public_key_bitlen));
147 /* Duplicated public key */
148 SILC_PKCS_ALG_PUBLIC_KEY_COPY((*public_key_copy));
150 /* Compares two public keys. Returns TRUE if they are identical. */
151 SILC_PKCS_ALG_PUBLIC_KEY_COMPARE((*public_key_compare));
153 /* Free public key */
154 SILC_PKCS_ALG_PUBLIC_KEY_FREE((*public_key_free));
156 /* Private key routines. */
158 /* Import/create new private key. Returns the length of the data that was
159 imported from `key' or 0 on error. Returns the PKCS algorithm specific
160 private key to `ret_private_key'. */
161 SILC_PKCS_ALG_IMPORT_PRIVATE_KEY((*import_private_key));
163 /* Export/encode private key. Returns the encoded private key buffer that
164 the caller must free. */
165 SILC_PKCS_ALG_EXPORT_PRIVATE_KEY((*export_private_key));
167 /* Returns the bi length of private key */
168 SILC_PKCS_ALG_PRIVATE_KEY_BITLEN((*private_key_bitlen));
170 /* Free private key */
171 SILC_PKCS_ALG_PRIVATE_KEY_FREE((*private_key_free));
173 /* Encrypt and decrypt operations */
174 SILC_PKCS_ALG_ENCRYPT((*encrypt));
175 SILC_PKCS_ALG_DECRYPT((*decrypt));
177 /* Signature and verification operations */
178 SILC_PKCS_ALG_SIGN((*sign));
179 SILC_PKCS_ALG_VERIFY((*verify));
182 /* Macros for defining the PKCS APIs. Use these when you need to declare
183 PKCS API functions. */
185 #define SILC_PKCS_GET_ALGORITHM(name) \
186 const SilcPKCSAlgorithm *name(const struct SilcPKCSObjectStruct *pkcs, \
189 #define SILC_PKCS_IMPORT_PUBLIC_KEY_FILE(name) \
190 SilcBool name(const struct SilcPKCSObjectStruct *pkcs, \
191 unsigned char *filedata, SilcUInt32 filedata_len, \
192 SilcPKCSFileEncoding encoding, void **ret_public_key, \
193 const struct SilcPKCSAlgorithmStruct **ret_alg)
195 #define SILC_PKCS_IMPORT_PUBLIC_KEY(name) \
196 int name(const struct SilcPKCSObjectStruct *pkcs, \
197 const struct SilcPKCSAlgorithmStruct *alg, \
198 void *key, SilcUInt32 key_len, void **ret_public_key, \
199 const struct SilcPKCSAlgorithmStruct **ret_alg)
201 #define SILC_PKCS_EXPORT_PUBLIC_KEY_FILE(name) \
202 unsigned char *name(const struct SilcPKCSObjectStruct *pkcs, \
203 SilcStack stack, void *public_key, \
204 SilcPKCSFileEncoding encoding, \
207 #define SILC_PKCS_EXPORT_PUBLIC_KEY(name) \
208 unsigned char *name(const struct SilcPKCSObjectStruct *pkcs, \
209 SilcStack stack, void *public_key, SilcUInt32 *ret_len)
211 #define SILC_PKCS_PUBLIC_KEY_BITLEN(name) \
212 SilcUInt32 name(const struct SilcPKCSObjectStruct *pkcs, \
215 #define SILC_PKCS_PUBLIC_KEY_COPY(name) \
216 void *name(const struct SilcPKCSObjectStruct *pkcs, void *public_key)
218 #define SILC_PKCS_PUBLIC_KEY_COMPARE(name) \
219 SilcBool name(const struct SilcPKCSObjectStruct *pkcs, \
220 void *key1, void *key2)
222 #define SILC_PKCS_PUBLIC_KEY_FREE(name) \
223 void name(const struct SilcPKCSObjectStruct *pkcs, void *public_key)
225 #define SILC_PKCS_IMPORT_PRIVATE_KEY_FILE(name) \
226 SilcBool name(const struct SilcPKCSObjectStruct *pkcs, \
227 unsigned char *filedata, SilcUInt32 filedata_len, \
228 const char *passphrase, SilcUInt32 passphrase_len, \
229 SilcPKCSFileEncoding encoding, void **ret_private_key, \
230 const struct SilcPKCSAlgorithmStruct **ret_alg)
232 #define SILC_PKCS_IMPORT_PRIVATE_KEY(name) \
233 int name(const struct SilcPKCSObjectStruct *pkcs, \
234 const struct SilcPKCSAlgorithmStruct *alg, \
235 const char *passphrase, SilcUInt32 passphrase_len, \
236 void *key, SilcUInt32 key_len, void **ret_private_key, \
237 const struct SilcPKCSAlgorithmStruct **ret_alg)
239 #define SILC_PKCS_EXPORT_PRIVATE_KEY_FILE(name) \
240 unsigned char *name(const struct SilcPKCSObjectStruct *pkcs, \
241 SilcStack stack, void *private_key, \
242 const char *passphrase, SilcUInt32 passphrase_len, \
243 SilcPKCSFileEncoding encoding, SilcRng rng, \
246 #define SILC_PKCS_EXPORT_PRIVATE_KEY(name) \
247 unsigned char *name(const struct SilcPKCSObjectStruct *pkcs, \
248 SilcStack stack, void *private_key, SilcUInt32 *ret_len)
250 #define SILC_PKCS_PRIVATE_KEY_BITLEN(name) \
251 SilcUInt32 name(const struct SilcPKCSObjectStruct *pkcs, void *private_key)
253 #define SILC_PKCS_PRIVATE_KEY_FREE(name) \
254 void name(const struct SilcPKCSObjectStruct *pkcs, void *private_key)
256 #define SILC_PKCS_ENCRYPT(name) \
257 SilcAsyncOperation name(const struct SilcPKCSObjectStruct *pkcs, \
259 unsigned char *src, \
260 SilcUInt32 src_len, \
262 SilcPKCSEncryptCb encrypt_cb, \
265 #define SILC_PKCS_DECRYPT(name) \
266 SilcAsyncOperation name(const struct SilcPKCSObjectStruct *pkcs, \
268 unsigned char *src, \
269 SilcUInt32 src_len, \
270 SilcPKCSDecryptCb decrypt_cb, \
273 #define SILC_PKCS_SIGN(name) \
274 SilcAsyncOperation name(const struct SilcPKCSObjectStruct *pkcs, \
276 unsigned char *src, \
277 SilcUInt32 src_len, \
278 SilcBool compute_hash, \
281 SilcPKCSSignCb sign_cb, \
284 #define SILC_PKCS_VERIFY(name) \
285 SilcAsyncOperation name(const struct SilcPKCSObjectStruct *pkcs, \
287 unsigned char *signature, \
288 SilcUInt32 signature_len, \
289 unsigned char *data, \
290 SilcUInt32 data_len, \
293 SilcPKCSVerifyCb verify_cb, \
296 /* The PKCS (Public Key Cryptosystem) object to represent any PKCS. This
297 context implements the PKCS, such as SILC public keys, X.509 certificates,
298 OpenPGP certificates, etc. under a common API. */
299 struct SilcPKCSObjectStruct {
303 /* Public key routines */
305 /* Returns PKCS algorithm context from public key */
306 SILC_PKCS_GET_ALGORITHM((*get_algorithm));
308 /* Imports from public key file */
309 SILC_PKCS_IMPORT_PUBLIC_KEY_FILE((*import_public_key_file));
311 /* Imports from public key binary data. Returns the amount of bytes
312 imported from `key' or 0 on error. */
313 SILC_PKCS_IMPORT_PUBLIC_KEY((*import_public_key));
315 /* Exports public key to file */
316 SILC_PKCS_EXPORT_PUBLIC_KEY_FILE((*export_public_key_file));
318 /* Export public key as binary data */
319 SILC_PKCS_EXPORT_PUBLIC_KEY((*export_public_key));
321 /* Returns key length in bits */
322 SILC_PKCS_PUBLIC_KEY_BITLEN((*public_key_bitlen));
324 /* Copy public key */
325 SILC_PKCS_PUBLIC_KEY_COPY((*public_key_copy));
327 /* Compares public keys */
328 SILC_PKCS_PUBLIC_KEY_COMPARE((*public_key_compare));
330 /* Free public key */
331 SILC_PKCS_PUBLIC_KEY_FREE((*public_key_free));
333 /* Private key routines */
335 /* Imports from private key file */
336 SILC_PKCS_IMPORT_PRIVATE_KEY_FILE((*import_private_key_file));
338 /* Imports from private key binary data. Returns the amount of bytes
339 imported from `key' or 0 on error. */
340 SILC_PKCS_IMPORT_PRIVATE_KEY((*import_private_key));
342 /* Exports private key to file */
343 SILC_PKCS_EXPORT_PRIVATE_KEY_FILE((*export_private_key_file));
345 /* Export private key as binary data */
346 SILC_PKCS_EXPORT_PRIVATE_KEY((*export_private_key));
348 /* Returns key length in bits */
349 SILC_PKCS_PRIVATE_KEY_BITLEN((*private_key_bitlen));
351 /* Free private key */
352 SILC_PKCS_PRIVATE_KEY_FREE((*private_key_free));
354 /* Encrypt and decrypt operations */
355 SILC_PKCS_ENCRYPT((*encrypt));
356 SILC_PKCS_DECRYPT((*decrypt));
358 /* Signature and verification operations */
359 SILC_PKCS_SIGN((*sign));
360 SILC_PKCS_VERIFY((*verify));
363 /* Backwards support for PKCS API */
365 #define silc_pkcs_get_context silc_pkcs_public_key_get_pkcs
367 #endif /* SILCPKCS_I_H */