updates.
[crypto.git] / lib / silccrypt / silccipher.h
1 /*
2
3   silccipher.h
4
5   Author: Pekka Riikonen <priikone@poseidon.pspt.fi>
6
7   Copyright (C) 1997 - 2001 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 SILCCIPHER_H
22 #define SILCCIPHER_H
23
24 /* 
25    SILC Cipher object.
26
27    Default SILC cipher object to represent any cipher. The function
28    pointers are the stub functions for each implemented cipher. Following
29    short description of the fields:
30
31    char *name
32
33        Logical name of the cipher.
34
35    uint32 block_len
36
37        Block size of the cipher.
38
39    uint32 key_len
40
41        Length of the key of the cipher (in bits).
42
43 */
44 typedef struct {
45   char *name;
46   uint32 block_len;
47   uint32 key_len;
48
49   bool (*set_key)(void *, const unsigned char *, uint32);
50   bool (*set_key_with_string)(void *, const unsigned char *, uint32);
51   bool (*encrypt)(void *, const unsigned char *, unsigned char *,
52                   uint32, unsigned char *);
53   bool (*decrypt)(void *, const unsigned char *, unsigned char *, 
54                   uint32, unsigned char *);
55   uint32 (*context_len)();
56 } SilcCipherObject;
57
58 #define SILC_CIPHER_MAX_IV_SIZE 16
59
60 /* The main SilcCipher structure. Use SilcCipher instead of SilcCipherStruct.
61    Also remember that SilcCipher is a pointer. */
62 typedef struct SilcCipherStruct {
63   SilcCipherObject *cipher;
64   void *context;
65   unsigned char iv[SILC_CIPHER_MAX_IV_SIZE];
66
67   /* XXX Backwards support for 0.5.x
68      XXX Remove in 0.7.x */
69   bool back;
70
71   void (*set_iv)(struct SilcCipherStruct *, const unsigned char *);
72   void (*get_iv)(struct SilcCipherStruct *, unsigned char *);
73   uint32 (*get_key_len)(struct SilcCipherStruct *);
74   uint32 (*get_block_len)(struct SilcCipherStruct *);
75 } *SilcCipher;
76
77 /* Marks for all ciphers in silc. This can be used in silc_cipher_unregister
78    to unregister all ciphers at once. */
79 #define SILC_ALL_CIPHERS ((SilcCipherObject *)1)
80
81 /* Static list of ciphers for silc_cipher_register_default(). */
82 extern SilcCipherObject silc_default_ciphers[];
83
84 /* Default cipher in the SILC protocol */
85 #define SILC_DEFAULT_CIPHER "aes-256-cbc"
86
87 /* Macros */
88
89 /* Function names in SILC Crypto modules. The name of the cipher
90    is appended into these names and used to the get correct symbol out
91    of the module. All SILC Crypto API compliant modules must support
92    these function names (use macros below to assure this). */
93 #define SILC_CIPHER_SIM_SET_KEY "set_key"
94 #define SILC_CIPHER_SIM_SET_KEY_WITH_STRING "set_key_with_string"
95 #define SILC_CIPHER_SIM_ENCRYPT_CBC "encrypt_cbc"
96 #define SILC_CIPHER_SIM_DECRYPT_CBC "decrypt_cbc"
97 #define SILC_CIPHER_SIM_CONTEXT_LEN "context_len"
98
99 /* These macros can be used to implement the SILC Crypto API and to avoid
100    errors in the API these macros should be used always. */
101 #define SILC_CIPHER_API_SET_KEY(cipher)                 \
102 bool silc_##cipher##_set_key(void *context,             \
103                              const unsigned char *key,  \
104                              uint32 keylen)
105 #define SILC_CIPHER_API_SET_KEY_WITH_STRING(cipher)                     \
106 bool silc_##cipher##_set_key_with_string(void *context,                 \
107                                          const unsigned char *string,   \
108                                          uint32 stringlen)
109 #define SILC_CIPHER_API_ENCRYPT_CBC(cipher)                     \
110 bool silc_##cipher##_encrypt_cbc(void *context,                 \
111                                  const unsigned char *src,      \
112                                  unsigned char *dst,            \
113                                  uint32 len,            \
114                                  unsigned char *iv)
115 #define SILC_CIPHER_API_DECRYPT_CBC(cipher)                     \
116 bool silc_##cipher##_decrypt_cbc(void *context,                 \
117                                  const unsigned char *src,      \
118                                  unsigned char *dst,            \
119                                  uint32 len,            \
120                                  unsigned char *iv)
121 #define SILC_CIPHER_API_CONTEXT_LEN(cipher)                     \
122 uint32 silc_##cipher##_context_len()
123
124 /* Prototypes */
125 bool silc_cipher_register(SilcCipherObject *cipher);
126 bool silc_cipher_unregister(SilcCipherObject *cipher);
127 bool silc_cipher_register_default(void);
128 bool silc_cipher_alloc(const unsigned char *name, SilcCipher *new_cipher);
129 void silc_cipher_free(SilcCipher cipher);
130 bool silc_cipher_is_supported(const unsigned char *name);
131 char *silc_cipher_get_supported(void);
132 bool silc_cipher_encrypt(SilcCipher cipher, const unsigned char *src,
133                          unsigned char *dst, uint32 len, 
134                          unsigned char *iv);
135 bool silc_cipher_decrypt(SilcCipher cipher, const unsigned char *src,
136                          unsigned char *dst, uint32 len, 
137                          unsigned char *iv);
138 bool silc_cipher_set_key(SilcCipher cipher, const unsigned char *key,
139                          uint32 keylen);
140 void silc_cipher_set_iv(SilcCipher cipher, const unsigned char *iv);
141 void silc_cipher_get_iv(SilcCipher cipher, unsigned char *iv);
142 uint32 silc_cipher_get_key_len(SilcCipher cipher);
143 uint32 silc_cipher_get_block_len(SilcCipher cipher);
144
145 #endif