1 /* Copyright (C) 2009, 2010 Simon Josefsson
2  * Copyright (C) 2006, 2007 The Written Word, Inc.  All rights reserved.
3  * Copyright (C) 2010-2019 Daniel Stenberg
4  *
5  * Redistribution and use in source and binary forms,
6  * with or without modification, are permitted provided
7  * that the following conditions are met:
8  *
9  *   Redistributions of source code must retain the above
10  *   copyright notice, this list of conditions and the
11  *   following disclaimer.
12  *
13  *   Redistributions in binary form must reproduce the above
14  *   copyright notice, this list of conditions and the following
15  *   disclaimer in the documentation and/or other materials
16  *   provided with the distribution.
17  *
18  *   Neither the name of the copyright holder nor the names
19  *   of any other contributors may be used to endorse or
20  *   promote products derived from this software without
21  *   specific prior written permission.
22  *
23  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
24  * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
25  * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
26  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
27  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
28  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
29  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
30  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
31  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
32  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
33  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
34  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
35  * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
36  * OF SUCH DAMAGE.
37  */
38 #ifndef LIBSSH2_CRYPTO_H
39 #define LIBSSH2_CRYPTO_H
40 
41 #ifdef LIBSSH2_OPENSSL
42 #include "openssl.h"
43 #endif
44 
45 #ifdef LIBSSH2_LIBGCRYPT
46 #include "libgcrypt.h"
47 #endif
48 
49 #ifdef LIBSSH2_WINCNG
50 #include "wincng.h"
51 #endif
52 
53 #ifdef LIBSSH2_OS400QC3
54 #include "os400qc3.h"
55 #endif
56 
57 #ifdef LIBSSH2_MBEDTLS
58 #include "mbedtls.h"
59 #endif
60 
61 #define LIBSSH2_ED25519_KEY_LEN 32
62 #define LIBSSH2_ED25519_PRIVATE_KEY_LEN 64
63 #define LIBSSH2_ED25519_SIG_LEN 64
64 
65 #if LIBSSH2_RSA
66 int _libssh2_rsa_new(libssh2_rsa_ctx ** rsa,
67                      const unsigned char *edata,
68                      unsigned long elen,
69                      const unsigned char *ndata,
70                      unsigned long nlen,
71                      const unsigned char *ddata,
72                      unsigned long dlen,
73                      const unsigned char *pdata,
74                      unsigned long plen,
75                      const unsigned char *qdata,
76                      unsigned long qlen,
77                      const unsigned char *e1data,
78                      unsigned long e1len,
79                      const unsigned char *e2data,
80                      unsigned long e2len,
81                      const unsigned char *coeffdata, unsigned long coefflen);
82 int _libssh2_rsa_new_private(libssh2_rsa_ctx ** rsa,
83                              LIBSSH2_SESSION * session,
84                              const char *filename,
85                              unsigned const char *passphrase);
86 int _libssh2_rsa_sha1_verify(libssh2_rsa_ctx * rsa,
87                              const unsigned char *sig,
88                              unsigned long sig_len,
89                              const unsigned char *m, unsigned long m_len);
90 int _libssh2_rsa_sha1_sign(LIBSSH2_SESSION * session,
91                            libssh2_rsa_ctx * rsactx,
92                            const unsigned char *hash,
93                            size_t hash_len,
94                            unsigned char **signature,
95                            size_t *signature_len);
96 int _libssh2_rsa_new_private_frommemory(libssh2_rsa_ctx ** rsa,
97                                         LIBSSH2_SESSION * session,
98                                         const char *filedata,
99                                         size_t filedata_len,
100                                         unsigned const char *passphrase);
101 #endif
102 
103 #if LIBSSH2_DSA
104 int _libssh2_dsa_new(libssh2_dsa_ctx ** dsa,
105                      const unsigned char *pdata,
106                      unsigned long plen,
107                      const unsigned char *qdata,
108                      unsigned long qlen,
109                      const unsigned char *gdata,
110                      unsigned long glen,
111                      const unsigned char *ydata,
112                      unsigned long ylen,
113                      const unsigned char *x, unsigned long x_len);
114 int _libssh2_dsa_new_private(libssh2_dsa_ctx ** dsa,
115                              LIBSSH2_SESSION * session,
116                              const char *filename,
117                              unsigned const char *passphrase);
118 int _libssh2_dsa_sha1_verify(libssh2_dsa_ctx * dsactx,
119                              const unsigned char *sig,
120                              const unsigned char *m, unsigned long m_len);
121 int _libssh2_dsa_sha1_sign(libssh2_dsa_ctx * dsactx,
122                            const unsigned char *hash,
123                            unsigned long hash_len, unsigned char *sig);
124 int _libssh2_dsa_new_private_frommemory(libssh2_dsa_ctx ** dsa,
125                                         LIBSSH2_SESSION * session,
126                                         const char *filedata,
127                                         size_t filedata_len,
128                                         unsigned const char *passphrase);
129 #endif
130 
131 #if LIBSSH2_ECDSA
132 int
133 _libssh2_ecdsa_curve_name_with_octal_new(libssh2_ecdsa_ctx ** ecdsactx,
134                                          const unsigned char *k,
135                                          size_t k_len,
136                                          libssh2_curve_type type);
137 int
138 _libssh2_ecdsa_new_private(libssh2_ecdsa_ctx ** ec_ctx,
139                            LIBSSH2_SESSION * session,
140                            const char *filename,
141                            unsigned const char *passphrase);
142 
143 int
144 _libssh2_ecdsa_verify(libssh2_ecdsa_ctx * ctx,
145                       const unsigned char *r, size_t r_len,
146                       const unsigned char *s, size_t s_len,
147                       const unsigned char *m, size_t m_len);
148 
149 int
150 _libssh2_ecdsa_create_key(LIBSSH2_SESSION *session,
151                           _libssh2_ec_key **out_private_key,
152                           unsigned char **out_public_key_octal,
153                           size_t *out_public_key_octal_len,
154                           libssh2_curve_type curve_type);
155 
156 int
157 _libssh2_ecdh_gen_k(_libssh2_bn **k, _libssh2_ec_key *private_key,
158                     const unsigned char *server_public_key,
159                     size_t server_public_key_len);
160 
161 int
162 _libssh2_ecdsa_sign(LIBSSH2_SESSION *session, libssh2_ecdsa_ctx *ec_ctx,
163                     const unsigned char *hash, unsigned long hash_len,
164                     unsigned char **signature, size_t *signature_len);
165 
166 int _libssh2_ecdsa_new_private_frommemory(libssh2_ecdsa_ctx ** ec_ctx,
167                                           LIBSSH2_SESSION * session,
168                                           const char *filedata,
169                                           size_t filedata_len,
170                                           unsigned const char *passphrase);
171 
172 libssh2_curve_type
173 _libssh2_ecdsa_key_get_curve_type(_libssh2_ec_key *key);
174 
175 int
176 _libssh2_ecdsa_curve_type_from_name(const char *name,
177                                     libssh2_curve_type *out_type);
178 
179 #endif /* LIBSSH2_ECDSA */
180 
181 #if LIBSSH2_ED25519
182 
183 int
184 _libssh2_curve25519_new(LIBSSH2_SESSION *session, libssh2_ed25519_ctx **ctx,
185                         uint8_t **out_public_key, uint8_t **out_private_key);
186 
187 int
188 _libssh2_curve25519_gen_k(_libssh2_bn **k,
189                           uint8_t private_key[LIBSSH2_ED25519_KEY_LEN],
190                           uint8_t server_public_key[LIBSSH2_ED25519_KEY_LEN]);
191 
192 int
193 _libssh2_ed25519_verify(libssh2_ed25519_ctx *ctx, const uint8_t *s,
194                         size_t s_len, const uint8_t *m, size_t m_len);
195 
196 int
197 _libssh2_ed25519_new_private(libssh2_ed25519_ctx **ed_ctx,
198                             LIBSSH2_SESSION *session,
199                             const char *filename, const uint8_t *passphrase);
200 
201 int
202 _libssh2_ed25519_new_public(libssh2_ed25519_ctx **ed_ctx,
203                             LIBSSH2_SESSION *session,
204                             const unsigned char *raw_pub_key,
205                             const uint8_t key_len);
206 
207 int
208 _libssh2_ed25519_sign(libssh2_ed25519_ctx *ctx, LIBSSH2_SESSION *session,
209                       uint8_t **out_sig, size_t *out_sig_len,
210                       const uint8_t *message, size_t message_len);
211 
212 int
213 _libssh2_ed25519_new_private_frommemory(libssh2_ed25519_ctx **ed_ctx,
214                                         LIBSSH2_SESSION *session,
215                                         const char *filedata,
216                                         size_t filedata_len,
217                                         unsigned const char *passphrase);
218 
219 #endif /* LIBSSH2_ED25519 */
220 
221 
222 int _libssh2_cipher_init(_libssh2_cipher_ctx * h,
223                          _libssh2_cipher_type(algo),
224                          unsigned char *iv,
225                          unsigned char *secret, int encrypt);
226 
227 int _libssh2_cipher_crypt(_libssh2_cipher_ctx * ctx,
228                           _libssh2_cipher_type(algo),
229                           int encrypt, unsigned char *block, size_t blocksize);
230 
231 int _libssh2_pub_priv_keyfile(LIBSSH2_SESSION *session,
232                               unsigned char **method,
233                               size_t *method_len,
234                               unsigned char **pubkeydata,
235                               size_t *pubkeydata_len,
236                               const char *privatekey,
237                               const char *passphrase);
238 
239 int _libssh2_pub_priv_keyfilememory(LIBSSH2_SESSION *session,
240                                     unsigned char **method,
241                                     size_t *method_len,
242                                     unsigned char **pubkeydata,
243                                     size_t *pubkeydata_len,
244                                     const char *privatekeydata,
245                                     size_t privatekeydata_len,
246                                     const char *passphrase);
247 
248 #endif
249