5 Author: Pekka Riikonen <priikone@silcnet.org>
7 Copyright (C) 1997 - 2008 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, \
114 SilcBool compute_hash, \
117 SilcPKCSVerifyCb verify_cb, \
120 /* The PKCS Algorithm object to represent any PKCS algorithm. This context
121 implements the PKCS algorithm, such as RSA, DSA, etc. */
122 struct SilcPKCSAlgorithmStruct {
123 /* Algorithm name and scheme */
124 char *name; /* Eg. rsa, dsa, etc. */
125 char *scheme; /* Eg. pkcs1, openpgp, etc. */
127 /* Supported hash functions, comma separated list */
130 /* Generate new key pair. Returns PKCS algorithm specific public key
131 and private key contexts. */
132 SILC_PKCS_ALG_GENERATE_KEY((*generate_key));
134 /* Public key routines. */
136 /* Import/create new public key. Returns the length of the data that was
137 imported from `key' or 0 on error. Returns the PKCS algorithm specific
138 public key to `ret_public_key'. */
139 SILC_PKCS_ALG_IMPORT_PUBLIC_KEY((*import_public_key));
141 /* Export/encode public key. Returns the encoded public key buffer that
142 the caller must free. */
143 SILC_PKCS_ALG_EXPORT_PUBLIC_KEY((*export_public_key));
145 /* Returns the bit length of public key */
146 SILC_PKCS_ALG_PUBLIC_KEY_BITLEN((*public_key_bitlen));
148 /* Duplicated public key */
149 SILC_PKCS_ALG_PUBLIC_KEY_COPY((*public_key_copy));
151 /* Compares two public keys. Returns TRUE if they are identical. */
152 SILC_PKCS_ALG_PUBLIC_KEY_COMPARE((*public_key_compare));
154 /* Free public key */
155 SILC_PKCS_ALG_PUBLIC_KEY_FREE((*public_key_free));
157 /* Private key routines. */
159 /* Import/create new private key. Returns the length of the data that was
160 imported from `key' or 0 on error. Returns the PKCS algorithm specific
161 private key to `ret_private_key'. */
162 SILC_PKCS_ALG_IMPORT_PRIVATE_KEY((*import_private_key));
164 /* Export/encode private key. Returns the encoded private key buffer that
165 the caller must free. */
166 SILC_PKCS_ALG_EXPORT_PRIVATE_KEY((*export_private_key));
168 /* Returns the bi length of private key */
169 SILC_PKCS_ALG_PRIVATE_KEY_BITLEN((*private_key_bitlen));
171 /* Free private key */
172 SILC_PKCS_ALG_PRIVATE_KEY_FREE((*private_key_free));
174 /* Encrypt and decrypt operations */
175 SILC_PKCS_ALG_ENCRYPT((*encrypt));
176 SILC_PKCS_ALG_DECRYPT((*decrypt));
178 /* Signature and verification operations */
179 SILC_PKCS_ALG_SIGN((*sign));
180 SILC_PKCS_ALG_VERIFY((*verify));
183 /* Macros for defining the PKCS APIs. Use these when you need to declare
184 PKCS API functions. */
186 #define SILC_PKCS_GET_ALGORITHM(name) \
187 const SilcPKCSAlgorithm *name(const struct SilcPKCSObjectStruct *pkcs, \
190 #define SILC_PKCS_IMPORT_PUBLIC_KEY_FILE(name) \
191 SilcBool name(const struct SilcPKCSObjectStruct *pkcs, \
192 unsigned char *filedata, SilcUInt32 filedata_len, \
193 SilcPKCSFileEncoding encoding, void **ret_public_key, \
194 const struct SilcPKCSAlgorithmStruct **ret_alg)
196 #define SILC_PKCS_IMPORT_PUBLIC_KEY(name) \
197 int name(const struct SilcPKCSObjectStruct *pkcs, \
198 const struct SilcPKCSAlgorithmStruct *alg, \
199 void *key, SilcUInt32 key_len, void **ret_public_key, \
200 const struct SilcPKCSAlgorithmStruct **ret_alg)
202 #define SILC_PKCS_EXPORT_PUBLIC_KEY_FILE(name) \
203 unsigned char *name(const struct SilcPKCSObjectStruct *pkcs, \
204 SilcStack stack, void *public_key, \
205 SilcPKCSFileEncoding encoding, \
208 #define SILC_PKCS_EXPORT_PUBLIC_KEY(name) \
209 unsigned char *name(const struct SilcPKCSObjectStruct *pkcs, \
210 SilcStack stack, void *public_key, SilcUInt32 *ret_len)
212 #define SILC_PKCS_PUBLIC_KEY_BITLEN(name) \
213 SilcUInt32 name(const struct SilcPKCSObjectStruct *pkcs, \
216 #define SILC_PKCS_PUBLIC_KEY_COPY(name) \
217 void *name(const struct SilcPKCSObjectStruct *pkcs, void *public_key)
219 #define SILC_PKCS_PUBLIC_KEY_COMPARE(name) \
220 SilcBool name(const struct SilcPKCSObjectStruct *pkcs, \
221 void *key1, void *key2)
223 #define SILC_PKCS_PUBLIC_KEY_FREE(name) \
224 void name(const struct SilcPKCSObjectStruct *pkcs, void *public_key)
226 #define SILC_PKCS_IMPORT_PRIVATE_KEY_FILE(name) \
227 SilcBool name(const struct SilcPKCSObjectStruct *pkcs, \
228 unsigned char *filedata, SilcUInt32 filedata_len, \
229 const char *passphrase, SilcUInt32 passphrase_len, \
230 SilcPKCSFileEncoding encoding, void **ret_private_key, \
231 const struct SilcPKCSAlgorithmStruct **ret_alg)
233 #define SILC_PKCS_IMPORT_PRIVATE_KEY(name) \
234 int name(const struct SilcPKCSObjectStruct *pkcs, \
235 const struct SilcPKCSAlgorithmStruct *alg, \
236 const char *passphrase, SilcUInt32 passphrase_len, \
237 void *key, SilcUInt32 key_len, void **ret_private_key, \
238 const struct SilcPKCSAlgorithmStruct **ret_alg)
240 #define SILC_PKCS_EXPORT_PRIVATE_KEY_FILE(name) \
241 unsigned char *name(const struct SilcPKCSObjectStruct *pkcs, \
242 SilcStack stack, void *private_key, \
243 const char *passphrase, SilcUInt32 passphrase_len, \
244 SilcPKCSFileEncoding encoding, SilcRng rng, \
247 #define SILC_PKCS_EXPORT_PRIVATE_KEY(name) \
248 unsigned char *name(const struct SilcPKCSObjectStruct *pkcs, \
249 SilcStack stack, void *private_key, SilcUInt32 *ret_len)
251 #define SILC_PKCS_PRIVATE_KEY_BITLEN(name) \
252 SilcUInt32 name(const struct SilcPKCSObjectStruct *pkcs, void *private_key)
254 #define SILC_PKCS_PRIVATE_KEY_FREE(name) \
255 void name(const struct SilcPKCSObjectStruct *pkcs, void *private_key)
257 #define SILC_PKCS_ENCRYPT(name) \
258 SilcAsyncOperation name(const struct SilcPKCSObjectStruct *pkcs, \
260 unsigned char *src, \
261 SilcUInt32 src_len, \
263 SilcPKCSEncryptCb encrypt_cb, \
266 #define SILC_PKCS_DECRYPT(name) \
267 SilcAsyncOperation name(const struct SilcPKCSObjectStruct *pkcs, \
269 unsigned char *src, \
270 SilcUInt32 src_len, \
271 SilcPKCSDecryptCb decrypt_cb, \
274 #define SILC_PKCS_SIGN(name) \
275 SilcAsyncOperation name(const struct SilcPKCSObjectStruct *pkcs, \
277 unsigned char *src, \
278 SilcUInt32 src_len, \
279 SilcBool compute_hash, \
282 SilcPKCSSignCb sign_cb, \
285 #define SILC_PKCS_VERIFY(name) \
286 SilcAsyncOperation name(const struct SilcPKCSObjectStruct *pkcs, \
288 unsigned char *signature, \
289 SilcUInt32 signature_len, \
290 unsigned char *data, \
291 SilcUInt32 data_len, \
292 SilcBool compute_hash, \
295 SilcPKCSVerifyCb verify_cb, \
298 /* The PKCS (Public Key Cryptosystem) object to represent any PKCS. This
299 context implements the PKCS, such as SILC public keys, X.509 certificates,
300 OpenPGP certificates, etc. under a common API. */
301 struct SilcPKCSObjectStruct {
305 /* Public key routines */
307 /* Returns PKCS algorithm context from public key */
308 SILC_PKCS_GET_ALGORITHM((*get_algorithm));
310 /* Imports from public key file */
311 SILC_PKCS_IMPORT_PUBLIC_KEY_FILE((*import_public_key_file));
313 /* Imports from public key binary data. Returns the amount of bytes
314 imported from `key' or 0 on error. */
315 SILC_PKCS_IMPORT_PUBLIC_KEY((*import_public_key));
317 /* Exports public key to file */
318 SILC_PKCS_EXPORT_PUBLIC_KEY_FILE((*export_public_key_file));
320 /* Export public key as binary data */
321 SILC_PKCS_EXPORT_PUBLIC_KEY((*export_public_key));
323 /* Returns key length in bits */
324 SILC_PKCS_PUBLIC_KEY_BITLEN((*public_key_bitlen));
326 /* Copy public key */
327 SILC_PKCS_PUBLIC_KEY_COPY((*public_key_copy));
329 /* Compares public keys */
330 SILC_PKCS_PUBLIC_KEY_COMPARE((*public_key_compare));
332 /* Free public key */
333 SILC_PKCS_PUBLIC_KEY_FREE((*public_key_free));
335 /* Private key routines */
337 /* Imports from private key file */
338 SILC_PKCS_IMPORT_PRIVATE_KEY_FILE((*import_private_key_file));
340 /* Imports from private key binary data. Returns the amount of bytes
341 imported from `key' or 0 on error. */
342 SILC_PKCS_IMPORT_PRIVATE_KEY((*import_private_key));
344 /* Exports private key to file */
345 SILC_PKCS_EXPORT_PRIVATE_KEY_FILE((*export_private_key_file));
347 /* Export private key as binary data */
348 SILC_PKCS_EXPORT_PRIVATE_KEY((*export_private_key));
350 /* Returns key length in bits */
351 SILC_PKCS_PRIVATE_KEY_BITLEN((*private_key_bitlen));
353 /* Free private key */
354 SILC_PKCS_PRIVATE_KEY_FREE((*private_key_free));
356 /* Encrypt and decrypt operations */
357 SILC_PKCS_ENCRYPT((*encrypt));
358 SILC_PKCS_DECRYPT((*decrypt));
360 /* Signature and verification operations */
361 SILC_PKCS_SIGN((*sign));
362 SILC_PKCS_VERIFY((*verify));
365 /* Backwards support for PKCS API */
367 #define silc_pkcs_get_context silc_pkcs_public_key_get_pkcs
369 #endif /* SILCPKCS_I_H */