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, void **ret_private_key)
65 #define SILC_PKCS_ALG_EXPORT_PRIVATE_KEY(name) \
66 unsigned char *name(const struct SilcPKCSAlgorithmStruct *pkcs, \
67 SilcStack stack, void *private_key, \
70 #define SILC_PKCS_ALG_PRIVATE_KEY_BITLEN(name) \
71 SilcUInt32 name(const struct SilcPKCSAlgorithmStruct *pkcs, \
74 #define SILC_PKCS_ALG_PRIVATE_KEY_FREE(name) \
75 void name(const struct SilcPKCSAlgorithmStruct *pkcs, \
78 #define SILC_PKCS_ALG_ENCRYPT(name) \
79 SilcAsyncOperation name(const struct SilcPKCSAlgorithmStruct *pkcs, \
84 SilcPKCSEncryptCb encrypt_cb, \
87 #define SILC_PKCS_ALG_DECRYPT(name) \
88 SilcAsyncOperation name(const struct SilcPKCSAlgorithmStruct *pkcs, \
92 SilcPKCSDecryptCb decrypt_cb, \
95 #define SILC_PKCS_ALG_SIGN(name) \
96 SilcAsyncOperation name(const struct SilcPKCSAlgorithmStruct *pkcs, \
100 SilcBool compute_hash, \
102 SilcPKCSSignCb sign_cb, \
105 #define SILC_PKCS_ALG_VERIFY(name) \
106 SilcAsyncOperation name(const struct SilcPKCSAlgorithmStruct *pkcs, \
108 unsigned char *signature, \
109 SilcUInt32 signature_len, \
110 unsigned char *data, \
111 SilcUInt32 data_len, \
113 SilcPKCSVerifyCb verify_cb, \
116 /* The PKCS Algorithm object to represent any PKCS algorithm. This context
117 implements the PKCS algorithm, such as RSA, DSA, etc. */
118 struct SilcPKCSAlgorithmStruct {
119 /* Algorithm name and scheme */
120 char *name; /* Eg. rsa, dsa, etc. */
121 char *scheme; /* Eg. pkcs1, openpgp, etc. */
123 /* Supported hash functions, comma separated list */
126 /* Generate new key pair. Returns PKCS algorithm specific public key
127 and private key contexts. */
128 SILC_PKCS_ALG_GENERATE_KEY((*generate_key));
130 /* Public key routines. */
132 /* Import/create new public key. Returns the length of the data that was
133 imported from `key' or 0 on error. Returns the PKCS algorithm specific
134 public key to `ret_public_key'. */
135 SILC_PKCS_ALG_IMPORT_PUBLIC_KEY((*import_public_key));
137 /* Export/encode public key. Returns the encoded public key buffer that
138 the caller must free. */
139 SILC_PKCS_ALG_EXPORT_PUBLIC_KEY((*export_public_key));
141 /* Returns the bit length of public key */
142 SILC_PKCS_ALG_PUBLIC_KEY_BITLEN((*public_key_bitlen));
144 /* Duplicated public key */
145 SILC_PKCS_ALG_PUBLIC_KEY_COPY((*public_key_copy));
147 /* Compares two public keys. Returns TRUE if they are identical. */
148 SILC_PKCS_ALG_PUBLIC_KEY_COMPARE((*public_key_compare));
150 /* Free public key */
151 SILC_PKCS_ALG_PUBLIC_KEY_FREE((*public_key_free));
153 /* Private key routines. */
155 /* Import/create new private key. Returns the length of the data that was
156 imported from `key' or 0 on error. Returns the PKCS algorithm specific
157 private key to `ret_private_key'. */
158 SILC_PKCS_ALG_IMPORT_PRIVATE_KEY((*import_private_key));
160 /* Export/encode private key. Returns the encoded private key buffer that
161 the caller must free. */
162 SILC_PKCS_ALG_EXPORT_PRIVATE_KEY((*export_private_key));
164 /* Returns the bi length of private key */
165 SILC_PKCS_ALG_PRIVATE_KEY_BITLEN((*private_key_bitlen));
167 /* Free private key */
168 SILC_PKCS_ALG_PRIVATE_KEY_FREE((*private_key_free));
170 /* Encrypt and decrypt operations */
171 SILC_PKCS_ALG_ENCRYPT((*encrypt));
172 SILC_PKCS_ALG_DECRYPT((*decrypt));
174 /* Signature and verification operations */
175 SILC_PKCS_ALG_SIGN((*sign));
176 SILC_PKCS_ALG_VERIFY((*verify));
179 /* Macros for defining the PKCS APIs. Use these when you need to declare
180 PKCS API functions. */
182 #define SILC_PKCS_GET_ALGORITHM(name) \
183 const SilcPKCSAlgorithm *name(const struct SilcPKCSObjectStruct *pkcs, \
186 #define SILC_PKCS_IMPORT_PUBLIC_KEY_FILE(name) \
187 SilcBool name(const struct SilcPKCSObjectStruct *pkcs, \
188 unsigned char *filedata, SilcUInt32 filedata_len, \
189 SilcPKCSFileEncoding encoding, void **ret_public_key, \
190 const struct SilcPKCSAlgorithmStruct **ret_alg)
192 #define SILC_PKCS_IMPORT_PUBLIC_KEY(name) \
193 int name(const struct SilcPKCSObjectStruct *pkcs, void *key, \
194 SilcUInt32 key_len, void **ret_public_key, \
195 const struct SilcPKCSAlgorithmStruct **ret_alg)
197 #define SILC_PKCS_EXPORT_PUBLIC_KEY_FILE(name) \
198 unsigned char *name(const struct SilcPKCSObjectStruct *pkcs, \
199 SilcStack stack, void *public_key, \
200 SilcPKCSFileEncoding encoding, \
203 #define SILC_PKCS_EXPORT_PUBLIC_KEY(name) \
204 unsigned char *name(const struct SilcPKCSObjectStruct *pkcs, \
205 SilcStack stack, void *public_key, SilcUInt32 *ret_len)
207 #define SILC_PKCS_PUBLIC_KEY_BITLEN(name) \
208 SilcUInt32 name(const struct SilcPKCSObjectStruct *pkcs, \
211 #define SILC_PKCS_PUBLIC_KEY_COPY(name) \
212 void *name(const struct SilcPKCSObjectStruct *pkcs, void *public_key)
214 #define SILC_PKCS_PUBLIC_KEY_COMPARE(name) \
215 SilcBool name(const struct SilcPKCSObjectStruct *pkcs, \
216 void *key1, void *key2)
218 #define SILC_PKCS_PUBLIC_KEY_FREE(name) \
219 void name(const struct SilcPKCSObjectStruct *pkcs, void *public_key)
221 #define SILC_PKCS_IMPORT_PRIVATE_KEY_FILE(name) \
222 SilcBool name(const struct SilcPKCSObjectStruct *pkcs, \
223 unsigned char *filedata, SilcUInt32 filedata_len, \
224 const char *passphrase, SilcUInt32 passphrase_len, \
225 SilcPKCSFileEncoding encoding, void **ret_private_key, \
226 const struct SilcPKCSAlgorithmStruct **ret_alg)
228 #define SILC_PKCS_IMPORT_PRIVATE_KEY(name) \
229 int name(const struct SilcPKCSObjectStruct *pkcs, void *key, \
230 SilcUInt32 key_len, void **ret_private_key, \
231 const struct SilcPKCSAlgorithmStruct **ret_alg)
233 #define SILC_PKCS_EXPORT_PRIVATE_KEY_FILE(name) \
234 unsigned char *name(const struct SilcPKCSObjectStruct *pkcs, \
235 SilcStack stack, void *private_key, \
236 const char *passphrase, SilcUInt32 passphrase_len, \
237 SilcPKCSFileEncoding encoding, SilcRng rng, \
240 #define SILC_PKCS_EXPORT_PRIVATE_KEY(name) \
241 unsigned char *name(const struct SilcPKCSObjectStruct *pkcs, \
242 SilcStack stack, void *private_key, SilcUInt32 *ret_len)
244 #define SILC_PKCS_PRIVATE_KEY_BITLEN(name) \
245 SilcUInt32 name(const struct SilcPKCSObjectStruct *pkcs, void *private_key)
247 #define SILC_PKCS_PRIVATE_KEY_FREE(name) \
248 void name(const struct SilcPKCSObjectStruct *pkcs, void *private_key)
250 #define SILC_PKCS_ENCRYPT(name) \
251 SilcAsyncOperation name(const struct SilcPKCSObjectStruct *pkcs, \
253 unsigned char *src, \
254 SilcUInt32 src_len, \
256 SilcPKCSEncryptCb encrypt_cb, \
259 #define SILC_PKCS_DECRYPT(name) \
260 SilcAsyncOperation name(const struct SilcPKCSObjectStruct *pkcs, \
262 unsigned char *src, \
263 SilcUInt32 src_len, \
264 SilcPKCSDecryptCb decrypt_cb, \
267 #define SILC_PKCS_SIGN(name) \
268 SilcAsyncOperation name(const struct SilcPKCSObjectStruct *pkcs, \
270 unsigned char *src, \
271 SilcUInt32 src_len, \
272 SilcBool compute_hash, \
274 SilcPKCSSignCb sign_cb, \
277 #define SILC_PKCS_VERIFY(name) \
278 SilcAsyncOperation name(const struct SilcPKCSObjectStruct *pkcs, \
280 unsigned char *signature, \
281 SilcUInt32 signature_len, \
282 unsigned char *data, \
283 SilcUInt32 data_len, \
285 SilcPKCSVerifyCb verify_cb, \
288 /* The PKCS (Public Key Cryptosystem) object to represent any PKCS. This
289 context implements the PKCS, such as SILC public keys, X.509 certificates,
290 OpenPGP certificates, etc. under a common API. */
291 struct SilcPKCSObjectStruct {
295 /* Public key routines */
297 /* Returns PKCS algorithm context from public key */
298 SILC_PKCS_GET_ALGORITHM((*get_algorithm));
300 /* Imports from public key file */
301 SILC_PKCS_IMPORT_PUBLIC_KEY_FILE((*import_public_key_file));
303 /* Imports from public key binary data. Returns the amount of bytes
304 imported from `key' or 0 on error. */
305 SILC_PKCS_IMPORT_PUBLIC_KEY((*import_public_key));
307 /* Exports public key to file */
308 SILC_PKCS_EXPORT_PUBLIC_KEY_FILE((*export_public_key_file));
310 /* Export public key as binary data */
311 SILC_PKCS_EXPORT_PUBLIC_KEY((*export_public_key));
313 /* Returns key length in bits */
314 SILC_PKCS_PUBLIC_KEY_BITLEN((*public_key_bitlen));
316 /* Copy public key */
317 SILC_PKCS_PUBLIC_KEY_COPY((*public_key_copy));
319 /* Compares public keys */
320 SILC_PKCS_PUBLIC_KEY_COMPARE((*public_key_compare));
322 /* Free public key */
323 SILC_PKCS_PUBLIC_KEY_FREE((*public_key_free));
325 /* Private key routines */
327 /* Imports from private key file */
328 SILC_PKCS_IMPORT_PRIVATE_KEY_FILE((*import_private_key_file));
330 /* Imports from private key binary data. Returns the amount of bytes
331 imported from `key' or 0 on error. */
332 SILC_PKCS_IMPORT_PRIVATE_KEY((*import_private_key));
334 /* Exports private key to file */
335 SILC_PKCS_EXPORT_PRIVATE_KEY_FILE((*export_private_key_file));
337 /* Export private key as binary data */
338 SILC_PKCS_EXPORT_PRIVATE_KEY((*export_private_key));
340 /* Returns key length in bits */
341 SILC_PKCS_PRIVATE_KEY_BITLEN((*private_key_bitlen));
343 /* Free private key */
344 SILC_PKCS_PRIVATE_KEY_FREE((*private_key_free));
346 /* Encrypt and decrypt operations */
347 SILC_PKCS_ENCRYPT((*encrypt));
348 SILC_PKCS_DECRYPT((*decrypt));
350 /* Signature and verification operations */
351 SILC_PKCS_SIGN((*sign));
352 SILC_PKCS_VERIFY((*verify));
355 #endif /* SILCPKCS_I_H */