Public and private key setting now takes SilcPublicKey and
[silc.git] / lib / silccrypt / silcpkcs.h
1 /*
2
3   silcpkcs.h
4
5   Author: Pekka Riikonen <priikone@poseidon.pspt.fi>
6
7   Copyright (C) 1997 - 2000 Pekka Riikonen
8
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; either version 2 of the License, or
12   (at your option) any later version.
13   
14   This program is distributed in the hope that it will be useful,
15   but WITHOUT ANY WARRANTY; without even the implied warranty of
16   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17   GNU General Public License for more details.
18
19 */
20
21 #ifndef SILCPKCS_H
22 #define SILCPKCS_H
23
24 /* The default SILC PKCS (Public Key Cryptosystem) object to represent
25    any PKCS in SILC. */
26 typedef struct SilcPKCSObjectStruct {
27   char *name;
28   void *data_context;
29
30   int (*init)(void *, unsigned int, SilcRng);
31   void (*clear_keys)(void *);
32   unsigned char *(*get_public_key)(void *, unsigned int *);
33   unsigned char *(*get_private_key)(void *, unsigned int *);
34   int (*set_public_key)(void *, unsigned char *, unsigned int);
35   int (*set_private_key)(void *, unsigned char *, unsigned int);
36   unsigned int (*context_len)();
37   unsigned int (*data_context_len)();
38   int (*set_arg)(void *, void *, int, SilcInt);
39   int (*encrypt)(void *, unsigned char *, unsigned int,
40                  unsigned char *, unsigned int *);
41   int (*decrypt)(void *, unsigned char *, unsigned int,
42                  unsigned char *, unsigned int *);
43   int (*sign)(void *, unsigned char *, unsigned int,
44               unsigned char *, unsigned int *);
45   int (*verify)(void *, unsigned char *, unsigned int,
46                 unsigned char *, unsigned int);
47 } SilcPKCSObject;
48
49 /* The main SILC PKCS structure. Use SilcPKCS instead of SilcPKCSStruct.
50    Also remember that SilcPKCS is a pointer. */
51 typedef struct SilcPKCSStruct {
52   void *context;
53   SilcPKCSObject *pkcs;
54   unsigned int key_len;
55
56   unsigned int (*get_key_len)(struct SilcPKCSStruct *);
57 } *SilcPKCS;
58
59 /* List of all PKCS in SILC. */
60 extern SilcPKCSObject silc_pkcs_list[];
61
62 /* SILC style public key object. Public key is read from file to this
63    object. Public keys received from network must be in this format as 
64    well. */
65 typedef struct {
66   unsigned int len;
67   char *name;
68   char *identifier;
69   unsigned char *pk;
70   unsigned int pk_len;
71 } *SilcPublicKey;
72
73 /* SILC style private key object. Private key is read from file to this
74    object. */
75 typedef struct {
76   char *name;
77   unsigned char *prv;
78   unsigned int prv_len;
79 } *SilcPrivateKey;
80
81 /* Public and private key file headers */
82 #define SILC_PKCS_PUBLIC_KEYFILE_BEGIN "-----BEGIN SILC PUBLIC KEY-----\n"
83 #define SILC_PKCS_PUBLIC_KEYFILE_END "\n-----END SILC PUBLIC KEY-----\n"
84 #define SILC_PKCS_PRIVATE_KEYFILE_BEGIN "-----BEGIN SILC PRIVATE KEY-----\n"
85 #define SILC_PKCS_PRIVATE_KEYFILE_END "\n-----END SILC PRIVATE KEY-----\n"
86
87 /* Macros */
88
89 /* Macros used to implement the SILC PKCS API */
90
91 /* XXX: This needs slight redesigning. These needs to be made even
92    more generic. I don't like that the actual prime generation is done
93    in PKCS_API_INIT. The primes used in key generation should be sent
94    as argument to the init function. By doing this we would achieve
95    that PKCS could be used as SIM's. The only requirement would be
96    that they are compiled against GMP (well, actually even that would
97    not be a requirement, but the most generic case anyway). The new init 
98    would look something like this:
99
100    #define SILC_PKCS_API_INIT(pkcs) \
101    inline int silc_##pkcs##_init(void *context, unsigned int keylen, \
102                                  void *p1, void *p2)
103
104    Now we wouldn't have to send the SilcRng object since the primes are 
105    provided as arguments. To send them as void * they could actually be 
106    used as in anyway for real (MP_INT (SilcInt) or even something else 
107    (the pointer could be kludged to be something else in the module))
108    (Plus, the SilcRng object management in prime generation would be
109    simpler and better what it is now (in silcprimegen.c, that is)).
110 */
111
112 #define SILC_PKCS_API_INIT(pkcs) \
113 int silc_##pkcs##_init(void *context, unsigned int keylen, \
114                        SilcRng rng)
115 #define SILC_PKCS_API_CLEAR_KEYS(pkcs) \
116 void silc_##pkcs##_clear_keys(void *context)
117 #define SILC_PKCS_API_GET_PUBLIC_KEY(pkcs) \
118 unsigned char *silc_##pkcs##_get_public_key(void *context, \
119                                             unsigned int *ret_len)
120 #define SILC_PKCS_API_GET_PRIVATE_KEY(pkcs) \
121 unsigned char *silc_##pkcs##_get_private_key(void *context, \
122                                              unsigned int *ret_len)
123 #define SILC_PKCS_API_SET_PUBLIC_KEY(pkcs) \
124 int silc_##pkcs##_set_public_key(void *context, unsigned char *key_data, \
125                                  unsigned int key_len)
126 #define SILC_PKCS_API_SET_PRIVATE_KEY(pkcs) \
127 int silc_##pkcs##_set_private_key(void *context, unsigned char *key_data, \
128                                   unsigned int key_len)
129 #define SILC_PKCS_API_CONTEXT_LEN(pkcs) \
130 unsigned int silc_##pkcs##_context_len()
131 #define SILC_PKCS_API_DATA_CONTEXT_LEN(pkcs) \
132 unsigned int silc_##pkcs##_data_context_len()
133 #define SILC_PKCS_API_SET_ARG(pkcs) \
134 int silc_##pkcs##_set_arg(void *context, \
135                           void *data_context, \
136                           int argnum, \
137                           SilcInt val)
138 #define SILC_PKCS_API_ENCRYPT(pkcs) \
139 int silc_##pkcs##_encrypt(void *context, \
140                           unsigned char *src, \
141                           unsigned int src_len, \
142                           unsigned char *dst, \
143                           unsigned int *dst_len)
144 #define SILC_PKCS_API_DECRYPT(pkcs) \
145 int silc_##pkcs##_decrypt(void *context, \
146                           unsigned char *src, \
147                           unsigned int src_len, \
148                           unsigned char *dst, \
149                           unsigned int *dst_len)
150 #define SILC_PKCS_API_SIGN(pkcs) \
151 int silc_##pkcs##_sign(void *context, \
152                        unsigned char *src, \
153                        unsigned int src_len, \
154                        unsigned char *dst, \
155                        unsigned int *dst_len)
156 #define SILC_PKCS_API_VERIFY(pkcs) \
157 int silc_##pkcs##_verify(void *context, \
158                          unsigned char *signature, \
159                          unsigned int signature_len, \
160                          unsigned char *data, \
161                          unsigned int data_len)
162
163 /* Prototypes */
164 int silc_pkcs_alloc(const unsigned char *name, SilcPKCS *new_pkcs);
165 void silc_pkcs_free(SilcPKCS pkcs);
166 int silc_pkcs_is_supported(const unsigned char *name);
167 char *silc_pkcs_get_supported();
168 unsigned int silc_pkcs_get_key_len(SilcPKCS self);
169 unsigned char *silc_pkcs_get_public_key(SilcPKCS pkcs, unsigned int *len);
170 unsigned char *silc_pkcs_get_private_key(SilcPKCS pkcs, unsigned int *len);
171 int silc_pkcs_public_key_set(SilcPKCS pkcs, SilcPublicKey public_key);
172 int silc_pkcs_public_key_data_set(SilcPKCS pkcs, unsigned char *pk,
173                                   unsigned int pk_len);
174 int silc_pkcs_private_key_set(SilcPKCS pkcs, SilcPrivateKey private_key);
175 int silc_pkcs_private_key_data_set(SilcPKCS pkcs, unsigned char *prv,
176                                    unsigned int prv_len);
177 char *silc_pkcs_encode_identifier(char *username, char *host, char *realname,
178                                   char *email, char *org, char *country);
179 SilcPublicKey silc_pkcs_public_key_alloc(char *name, char *identifier,
180                                          unsigned char *pk, 
181                                          unsigned int pk_len);
182 void silc_pkcs_public_key_free(SilcPublicKey public_key);
183 SilcPrivateKey silc_pkcs_private_key_alloc(char *name, unsigned char *prv,
184                                            unsigned int prv_len);
185 void silc_pkcs_private_key_free(SilcPrivateKey private_key);
186 unsigned char *
187 silc_pkcs_public_key_encode(SilcPublicKey public_key, unsigned int *len);
188 unsigned char *
189 silc_pkcs_public_key_data_encode(unsigned char *pk, unsigned int pk_len,
190                                  char *pkcs, char *identifier, 
191                                  unsigned int *len);
192 int silc_pkcs_public_key_decode(unsigned char *data, unsigned int data_len,
193                                 SilcPublicKey *public_key);
194 unsigned char *
195 silc_pkcs_private_key_encode(SilcPrivateKey private_key, unsigned int *len);
196 unsigned char *
197 silc_pkcs_private_key_data_encode(unsigned char *prv, unsigned int prv_len,
198                                   char *pkcs, unsigned int *len);
199 int silc_pkcs_private_key_decode(unsigned char *data, unsigned int data_len,
200                                  SilcPrivateKey *private_key);
201 int silc_pkcs_save_public_key(char *filename, SilcPublicKey public_key);
202 int silc_pkcs_save_public_key_data(char *filename, unsigned char *data,
203                                    unsigned int data_len);
204 int silc_pkcs_save_private_key(char *filename, SilcPrivateKey private_key, 
205                                unsigned char *passphrase);
206 int silc_pkcs_save_private_key_data(char *filename, unsigned char *data, 
207                                     unsigned int data_len,
208                                     unsigned char *passphrase);
209 int silc_pkcs_load_public_key(char *filename, SilcPublicKey *public_key);
210 int silc_pkcs_load_private_key(char *filename, SilcPrivateKey *private_key);
211
212 #endif