ssh.h
Go to the documentation of this file.
1 /**
2  * @file ssh.h
3  * @brief Secure Shell (SSH)
4  *
5  * @section License
6  *
7  * SPDX-License-Identifier: GPL-2.0-or-later
8  *
9  * Copyright (C) 2019-2026 Oryx Embedded SARL. All rights reserved.
10  *
11  * This file is part of CycloneSSH Open.
12  *
13  * This program is free software; you can redistribute it and/or
14  * modify it under the terms of the GNU General Public License
15  * as published by the Free Software Foundation; either version 2
16  * of the License, or (at your option) any later version.
17  *
18  * This program is distributed in the hope that it will be useful,
19  * but WITHOUT ANY WARRANTY; without even the implied warranty of
20  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21  * GNU General Public License for more details.
22  *
23  * You should have received a copy of the GNU General Public License
24  * along with this program; if not, write to the Free Software Foundation,
25  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
26  *
27  * @author Oryx Embedded SARL (www.oryx-embedded.com)
28  * @version 2.6.4
29  **/
30 
31 #ifndef _SSH_H
32 #define _SSH_H
33 
34 //Dependencies
35 #include "ssh_config.h"
36 #include "ssh_legacy.h"
37 #include "ssh_types.h"
38 #include "ssh_cert_parse.h"
39 #include "core/net.h"
40 #include "core/crypto.h"
43 #include "hash/hash_algorithms.h"
44 #include "mac/mac_algorithms.h"
45 #include "aead/aead_algorithms.h"
47 #include "ecc/ec.h"
48 
49 
50 /*
51  * CycloneSSH Open is licensed under GPL version 2. In particular:
52  *
53  * - If you link your program to CycloneSSH Open, the result is a derivative
54  * work that can only be distributed under the same GPL license terms.
55  *
56  * - If additions or changes to CycloneSSH Open are made, the result is a
57  * derivative work that can only be distributed under the same license terms.
58  *
59  * - The GPL license requires that you make the source code available to
60  * whoever you make the binary available to.
61  *
62  * - If you sell or distribute a hardware product that runs CycloneSSH Open,
63  * the GPL license requires you to provide public and full access to all
64  * source code on a nondiscriminatory basis.
65  *
66  * If you fully understand and accept the terms of the GPL license, then edit
67  * the os_port_config.h header and add the following directive:
68  *
69  * #define GPL_LICENSE_TERMS_ACCEPTED
70  */
71 
72 #ifndef GPL_LICENSE_TERMS_ACCEPTED
73  #error Before compiling CycloneSSH Open, you must accept the terms of the GPL license
74 #endif
75 
76 //Version string
77 #define CYCLONE_SSH_VERSION_STRING "2.6.4"
78 //Major version
79 #define CYCLONE_SSH_MAJOR_VERSION 2
80 //Minor version
81 #define CYCLONE_SSH_MINOR_VERSION 6
82 //Revision number
83 #define CYCLONE_SSH_REV_NUMBER 4
84 
85 //SSH support
86 #ifndef SSH_SUPPORT
87  #define SSH_SUPPORT ENABLED
88 #elif (SSH_SUPPORT != ENABLED && SSH_SUPPORT != DISABLED)
89  #error SSH_SUPPORT parameter is not valid
90 #endif
91 
92 //SSH client support
93 #ifndef SSH_CLIENT_SUPPORT
94  #define SSH_CLIENT_SUPPORT ENABLED
95 #elif (SSH_CLIENT_SUPPORT != ENABLED && SSH_CLIENT_SUPPORT != DISABLED)
96  #error SSH_CLIENT_SUPPORT parameter is not valid
97 #endif
98 
99 //SSH server support
100 #ifndef SSH_SERVER_SUPPORT
101  #define SSH_SERVER_SUPPORT ENABLED
102 #elif (SSH_SERVER_SUPPORT != ENABLED && SSH_SERVER_SUPPORT != DISABLED)
103  #error SSH_SERVER_SUPPORT parameter is not valid
104 #endif
105 
106 //Public key authentication support
107 #ifndef SSH_PUBLIC_KEY_AUTH_SUPPORT
108  #define SSH_PUBLIC_KEY_AUTH_SUPPORT ENABLED
109 #elif (SSH_PUBLIC_KEY_AUTH_SUPPORT != ENABLED && SSH_PUBLIC_KEY_AUTH_SUPPORT != DISABLED)
110  #error SSH_PUBLIC_KEY_AUTH_SUPPORT parameter is not valid
111 #endif
112 
113 //Password authentication support
114 #ifndef SSH_PASSWORD_AUTH_SUPPORT
115  #define SSH_PASSWORD_AUTH_SUPPORT ENABLED
116 #elif (SSH_PASSWORD_AUTH_SUPPORT != ENABLED && SSH_PASSWORD_AUTH_SUPPORT != DISABLED)
117  #error SSH_PASSWORD_AUTH_SUPPORT parameter is not valid
118 #endif
119 
120 //Encrypted private key support (OpenSSH format)
121 #ifndef SSH_ENCRYPTED_KEY_SUPPORT
122  #define SSH_ENCRYPTED_KEY_SUPPORT DISABLED
123 #elif (SSH_ENCRYPTED_KEY_SUPPORT != ENABLED && SSH_ENCRYPTED_KEY_SUPPORT != DISABLED)
124  #error SSH_ENCRYPTED_KEY_SUPPORT parameter is not valid
125 #endif
126 
127 //Certificate support (OpenSSH format)
128 #ifndef SSH_CERT_SUPPORT
129  #define SSH_CERT_SUPPORT DISABLED
130 #elif (SSH_CERT_SUPPORT != ENABLED && SSH_CERT_SUPPORT != DISABLED)
131  #error SSH_CERT_SUPPORT parameter is not valid
132 #endif
133 
134 //Extension negotiation mechanism
135 #ifndef SSH_EXT_INFO_SUPPORT
136  #define SSH_EXT_INFO_SUPPORT ENABLED
137 #elif (SSH_EXT_INFO_SUPPORT != ENABLED && SSH_EXT_INFO_SUPPORT != DISABLED)
138  #error SSH_EXT_INFO_SUPPORT parameter is not valid
139 #endif
140 
141 //"server-sig-algs" extension support
142 #ifndef SSH_SERVER_SIG_ALGS_EXT_SUPPORT
143  #define SSH_SERVER_SIG_ALGS_EXT_SUPPORT ENABLED
144 #elif (SSH_SERVER_SIG_ALGS_EXT_SUPPORT != ENABLED && SSH_SERVER_SIG_ALGS_EXT_SUPPORT != DISABLED)
145  #error SSH_SERVER_SIG_ALGS_EXT_SUPPORT parameter is not valid
146 #endif
147 
148 //"global-requests-ok" extension support
149 #ifndef SSH_GLOBAL_REQ_OK_EXT_SUPPORT
150  #define SSH_GLOBAL_REQ_OK_EXT_SUPPORT DISABLED
151 #elif (SSH_GLOBAL_REQ_OK_EXT_SUPPORT != ENABLED && SSH_GLOBAL_REQ_OK_EXT_SUPPORT != DISABLED)
152  #error SSH_GLOBAL_REQ_OK_EXT_SUPPORT parameter is not valid
153 #endif
154 
155 //Strict key exchange extension support
156 #ifndef SSH_KEX_STRICT_SUPPORT
157  #define SSH_KEX_STRICT_SUPPORT ENABLED
158 #elif (SSH_KEX_STRICT_SUPPORT != ENABLED && SSH_KEX_STRICT_SUPPORT != DISABLED)
159  #error SSH_KEX_STRICT_SUPPORT parameter is not valid
160 #endif
161 
162 //Signature generation/verification callback functions
163 #ifndef SSH_SIGN_CALLBACK_SUPPORT
164  #define SSH_SIGN_CALLBACK_SUPPORT DISABLED
165 #elif (SSH_SIGN_CALLBACK_SUPPORT != ENABLED && SSH_SIGN_CALLBACK_SUPPORT != DISABLED)
166  #error SSH_SIGN_CALLBACK_SUPPORT parameter is not valid
167 #endif
168 
169 //ECDH callback functions
170 #ifndef SSH_ECDH_CALLBACK_SUPPORT
171  #define SSH_ECDH_CALLBACK_SUPPORT DISABLED
172 #elif (SSH_ECDH_CALLBACK_SUPPORT != ENABLED && SSH_ECDH_CALLBACK_SUPPORT != DISABLED)
173  #error SSH_ECDH_CALLBACK_SUPPORT parameter is not valid
174 #endif
175 
176 //Maximum number of keys the SSH entity can load
177 #ifndef SSH_MAX_HOST_KEYS
178  #define SSH_MAX_HOST_KEYS 3
179 #elif (SSH_MAX_HOST_KEYS < 1)
180  #error SSH_MAX_HOST_KEYS parameter is not valid
181 #endif
182 
183 //Maximum number of simultaneous connections
184 #ifndef SSH_MAX_CONNECTIONS
185  #define SSH_MAX_CONNECTIONS 10
186 #elif (SSH_MAX_CONNECTIONS < 1)
187  #error SSH_MAX_CONNECTIONS parameter is not valid
188 #endif
189 
190 //Maximum number of global request callbacks that can be attached
191 #ifndef SSH_MAX_GLOBAL_REQ_CALLBACKS
192  #define SSH_MAX_GLOBAL_REQ_CALLBACKS 3
193 #elif (SSH_MAX_GLOBAL_REQ_CALLBACKS < 1)
194  #error SSH_MAX_GLOBAL_REQ_CALLBACKS parameter is not valid
195 #endif
196 
197 //Maximum number of channel request callbacks that can be attached
198 #ifndef SSH_MAX_CHANNEL_REQ_CALLBACKS
199  #define SSH_MAX_CHANNEL_REQ_CALLBACKS 3
200 #elif (SSH_MAX_CHANNEL_REQ_CALLBACKS < 1)
201  #error SSH_MAX_CHANNEL_REQ_CALLBACKS parameter is not valid
202 #endif
203 
204 //Maximum number of channel open callbacks that can be attached
205 #ifndef SSH_MAX_CHANNEL_OPEN_CALLBACKS
206  #define SSH_MAX_CHANNEL_OPEN_CALLBACKS 1
207 #elif (SSH_MAX_CHANNEL_OPEN_CALLBACKS < 1)
208  #error SSH_MAX_CHANNEL_OPEN_CALLBACKS parameter is not valid
209 #endif
210 
211 //Maximum number of connection open callbacks that can be attached
212 #ifndef SSH_MAX_CONN_OPEN_CALLBACKS
213  #define SSH_MAX_CONN_OPEN_CALLBACKS 1
214 #elif (SSH_MAX_CONN_OPEN_CALLBACKS < 1)
215  #error SSH_MAX_CONN_OPEN_CALLBACKS parameter is not valid
216 #endif
217 
218 //Maximum number of connection close callbacks that can be attached
219 #ifndef SSH_MAX_CONN_CLOSE_CALLBACKS
220  #define SSH_MAX_CONN_CLOSE_CALLBACKS 1
221 #elif (SSH_MAX_CONN_CLOSE_CALLBACKS < 1)
222  #error SSH_MAX_CONN_CLOSE_CALLBACKS parameter is not valid
223 #endif
224 
225 //Maximum number of authentication attempts
226 #ifndef SSH_MAX_AUTH_ATTEMPTS
227  #define SSH_MAX_AUTH_ATTEMPTS 10
228 #elif (SSH_MAX_AUTH_ATTEMPTS < 1 && SSH_MAX_AUTH_ATTEMPTS > 20)
229  #error SSH_MAX_AUTH_ATTEMPTS parameter is not valid
230 #endif
231 
232 //Maximum packet size
233 #ifndef SSH_MAX_PACKET_SIZE
234  #define SSH_MAX_PACKET_SIZE 2048
235 #elif (SSH_MAX_PACKET_SIZE < 128)
236  #error SSH_MAX_PACKET_SIZE parameter is not valid
237 #endif
238 
239 //Size of channel TX/RX buffers
240 #ifndef SSH_CHANNEL_BUFFER_SIZE
241  #define SSH_CHANNEL_BUFFER_SIZE 2048
242 #elif (SSH_CHANNEL_BUFFER_SIZE < 128)
243  #error SSH_CHANNEL_BUFFER_SIZE parameter is not valid
244 #endif
245 
246 //Maximum length of identification string
247 #ifndef SSH_MAX_ID_LEN
248  #define SSH_MAX_ID_LEN 80
249 #elif (SSH_MAX_ID_LEN < 1)
250  #error SSH_MAX_ID_LEN parameter is not valid
251 #endif
252 
253 //Maximum length of user name
254 #ifndef SSH_MAX_USERNAME_LEN
255  #define SSH_MAX_USERNAME_LEN 32
256 #elif (SSH_MAX_USERNAME_LEN < 0)
257  #error SSH_MAX_USERNAME_LEN parameter is not valid
258 #endif
259 
260 //Maximum length of password
261 #ifndef SSH_MAX_PASSWORD_LEN
262  #define SSH_MAX_PASSWORD_LEN 32
263 #elif (SSH_MAX_PASSWORD_LEN < 0)
264  #error SSH_MAX_PASSWORD_LEN parameter is not valid
265 #endif
266 
267 //Maximum length of password change prompt
268 #ifndef SSH_MAX_PASSWORD_CHANGE_PROMPT_LEN
269  #define SSH_MAX_PASSWORD_CHANGE_PROMPT_LEN 0
270 #elif (SSH_MAX_PASSWORD_CHANGE_PROMPT_LEN < 0)
271  #error SSH_MAX_PASSWORD_CHANGE_PROMPT_LEN parameter is not valid
272 #endif
273 
274 //Encrypt-then-MAC mode support
275 #ifndef SSH_ETM_SUPPORT
276  #define SSH_ETM_SUPPORT DISABLED
277 #elif (SSH_ETM_SUPPORT != ENABLED && SSH_ETM_SUPPORT != DISABLED)
278  #error SSH_ETM_SUPPORT parameter is not valid
279 #endif
280 
281 //Stream cipher support (insecure)
282 #ifndef SSH_STREAM_CIPHER_SUPPORT
283  #define SSH_STREAM_CIPHER_SUPPORT DISABLED
284 #elif (SSH_STREAM_CIPHER_SUPPORT != ENABLED && SSH_STREAM_CIPHER_SUPPORT != DISABLED)
285  #error SSH_STREAM_CIPHER_SUPPORT parameter is not valid
286 #endif
287 
288 //CBC cipher mode support (weak)
289 #ifndef SSH_CBC_CIPHER_SUPPORT
290  #define SSH_CBC_CIPHER_SUPPORT DISABLED
291 #elif (SSH_CBC_CIPHER_SUPPORT != ENABLED && SSH_CBC_CIPHER_SUPPORT != DISABLED)
292  #error SSH_CBC_CIPHER_SUPPORT parameter is not valid
293 #endif
294 
295 //CTR cipher mode support
296 #ifndef SSH_CTR_CIPHER_SUPPORT
297  #define SSH_CTR_CIPHER_SUPPORT ENABLED
298 #elif (SSH_CTR_CIPHER_SUPPORT != ENABLED && SSH_CTR_CIPHER_SUPPORT != DISABLED)
299  #error SSH_CTR_CIPHER_SUPPORT parameter is not valid
300 #endif
301 
302 //GCM AEAD support (OpenSSH variant)
303 #ifndef SSH_GCM_CIPHER_SUPPORT
304  #define SSH_GCM_CIPHER_SUPPORT ENABLED
305 #elif (SSH_GCM_CIPHER_SUPPORT != ENABLED && SSH_GCM_CIPHER_SUPPORT != DISABLED)
306  #error SSH_GCM_CIPHER_SUPPORT parameter is not valid
307 #endif
308 
309 //GCM AEAD support (RFC 5647 variant)
310 #ifndef SSH_RFC5647_SUPPORT
311  #define SSH_RFC5647_SUPPORT DISABLED
312 #elif (SSH_RFC5647_SUPPORT != ENABLED && SSH_RFC5647_SUPPORT != DISABLED)
313  #error SSH_RFC5647_SUPPORT parameter is not valid
314 #endif
315 
316 //ChaCha20Poly1305 AEAD support
317 #ifndef SSH_CHACHA20_POLY1305_SUPPORT
318  #define SSH_CHACHA20_POLY1305_SUPPORT DISABLED
319 #elif (SSH_CHACHA20_POLY1305_SUPPORT != ENABLED && SSH_CHACHA20_POLY1305_SUPPORT != DISABLED)
320  #error SSH_CHACHA20_POLY1305_SUPPORT parameter is not valid
321 #endif
322 
323 //Legacy RC4 cipher support (insecure)
324 #ifndef SSH_RC4_SUPPORT
325  #define SSH_RC4_SUPPORT DISABLED
326 #elif (SSH_RC4_SUPPORT != ENABLED && SSH_RC4_SUPPORT != DISABLED)
327  #error SSH_RC4_SUPPORT parameter is not valid
328 #endif
329 
330 //RC4 128-bit cipher support (insecure)
331 #ifndef SSH_RC4_128_SUPPORT
332  #define SSH_RC4_128_SUPPORT DISABLED
333 #elif (SSH_RC4_128_SUPPORT != ENABLED && SSH_RC4_128_SUPPORT != DISABLED)
334  #error SSH_RC4_128_SUPPORT parameter is not valid
335 #endif
336 
337 //RC4 256-bit cipher support (insecure)
338 #ifndef SSH_RC4_256_SUPPORT
339  #define SSH_RC4_256_SUPPORT DISABLED
340 #elif (SSH_RC4_256_SUPPORT != ENABLED && SSH_RC4_256_SUPPORT != DISABLED)
341  #error SSH_RC4_256_SUPPORT parameter is not valid
342 #endif
343 
344 //CAST-128 cipher support (insecure)
345 #ifndef SSH_CAST128_SUPPORT
346  #define SSH_CAST128_SUPPORT DISABLED
347 #elif (SSH_CAST128_SUPPORT != ENABLED && SSH_CAST128_SUPPORT != DISABLED)
348  #error SSH_CAST128_SUPPORT parameter is not valid
349 #endif
350 
351 //IDEA cipher support (insecure)
352 #ifndef SSH_IDEA_SUPPORT
353  #define SSH_IDEA_SUPPORT DISABLED
354 #elif (SSH_IDEA_SUPPORT != ENABLED && SSH_IDEA_SUPPORT != DISABLED)
355  #error SSH_IDEA_SUPPORT parameter is not valid
356 #endif
357 
358 //Blowfish cipher support (insecure)
359 #ifndef SSH_BLOWFISH_SUPPORT
360  #define SSH_BLOWFISH_SUPPORT DISABLED
361 #elif (SSH_BLOWFISH_SUPPORT != ENABLED && SSH_BLOWFISH_SUPPORT != DISABLED)
362  #error SSH_BLOWFISH_SUPPORT parameter is not valid
363 #endif
364 
365 //Triple DES cipher support (weak)
366 #ifndef SSH_3DES_SUPPORT
367  #define SSH_3DES_SUPPORT DISABLED
368 #elif (SSH_3DES_SUPPORT != ENABLED && SSH_3DES_SUPPORT != DISABLED)
369  #error SSH_3DES_SUPPORT parameter is not valid
370 #endif
371 
372 //AES 128-bit cipher support
373 #ifndef SSH_AES_128_SUPPORT
374  #define SSH_AES_128_SUPPORT ENABLED
375 #elif (SSH_AES_128_SUPPORT != ENABLED && SSH_AES_128_SUPPORT != DISABLED)
376  #error SSH_AES_128_SUPPORT parameter is not valid
377 #endif
378 
379 //AES 192-bit cipher support
380 #ifndef SSH_AES_192_SUPPORT
381  #define SSH_AES_192_SUPPORT ENABLED
382 #elif (SSH_AES_192_SUPPORT != ENABLED && SSH_AES_192_SUPPORT != DISABLED)
383  #error SSH_AES_192_SUPPORT parameter is not valid
384 #endif
385 
386 //AES 256-bit cipher support
387 #ifndef SSH_AES_256_SUPPORT
388  #define SSH_AES_256_SUPPORT ENABLED
389 #elif (SSH_AES_256_SUPPORT != ENABLED && SSH_AES_256_SUPPORT != DISABLED)
390  #error SSH_AES_256_SUPPORT parameter is not valid
391 #endif
392 
393 //Twofish 128-bit cipher support
394 #ifndef SSH_TWOFISH_128_SUPPORT
395  #define SSH_TWOFISH_128_SUPPORT DISABLED
396 #elif (SSH_TWOFISH_128_SUPPORT != ENABLED && SSH_TWOFISH_128_SUPPORT != DISABLED)
397  #error SSH_TWOFISH_128_SUPPORT parameter is not valid
398 #endif
399 
400 //Twofish 192-bit cipher support
401 #ifndef SSH_TWOFISH_192_SUPPORT
402  #define SSH_TWOFISH_192_SUPPORT DISABLED
403 #elif (SSH_TWOFISH_192_SUPPORT != ENABLED && SSH_TWOFISH_192_SUPPORT != DISABLED)
404  #error SSH_TWOFISH_192_SUPPORT parameter is not valid
405 #endif
406 
407 //Twofish 256-bit cipher support
408 #ifndef SSH_TWOFISH_256_SUPPORT
409  #define SSH_TWOFISH_256_SUPPORT DISABLED
410 #elif (SSH_TWOFISH_256_SUPPORT != ENABLED && SSH_TWOFISH_256_SUPPORT != DISABLED)
411  #error SSH_TWOFISH_256_SUPPORT parameter is not valid
412 #endif
413 
414 //Serpent 128-bit cipher support
415 #ifndef SSH_SERPENT_128_SUPPORT
416  #define SSH_SERPENT_128_SUPPORT DISABLED
417 #elif (SSH_SERPENT_128_SUPPORT != ENABLED && SSH_SERPENT_128_SUPPORT != DISABLED)
418  #error SSH_SERPENT_128_SUPPORT parameter is not valid
419 #endif
420 
421 //Serpent 192-bit cipher support
422 #ifndef SSH_SERPENT_192_SUPPORT
423  #define SSH_SERPENT_192_SUPPORT DISABLED
424 #elif (SSH_SERPENT_192_SUPPORT != ENABLED && SSH_SERPENT_192_SUPPORT != DISABLED)
425  #error SSH_SERPENT_192_SUPPORT parameter is not valid
426 #endif
427 
428 //Serpent 256-bit cipher support
429 #ifndef SSH_SERPENT_256_SUPPORT
430  #define SSH_SERPENT_256_SUPPORT DISABLED
431 #elif (SSH_SERPENT_256_SUPPORT != ENABLED && SSH_SERPENT_256_SUPPORT != DISABLED)
432  #error SSH_SERPENT_256_SUPPORT parameter is not valid
433 #endif
434 
435 //Camellia 128-bit cipher support
436 #ifndef SSH_CAMELLIA_128_SUPPORT
437  #define SSH_CAMELLIA_128_SUPPORT DISABLED
438 #elif (SSH_CAMELLIA_128_SUPPORT != ENABLED && SSH_CAMELLIA_128_SUPPORT != DISABLED)
439  #error SSH_CAMELLIA_128_SUPPORT parameter is not valid
440 #endif
441 
442 //Camellia 192-bit cipher support
443 #ifndef SSH_CAMELLIA_192_SUPPORT
444  #define SSH_CAMELLIA_192_SUPPORT DISABLED
445 #elif (SSH_CAMELLIA_192_SUPPORT != ENABLED && SSH_CAMELLIA_192_SUPPORT != DISABLED)
446  #error SSH_CAMELLIA_192_SUPPORT parameter is not valid
447 #endif
448 
449 //Camellia 256-bit cipher support
450 #ifndef SSH_CAMELLIA_256_SUPPORT
451  #define SSH_CAMELLIA_256_SUPPORT DISABLED
452 #elif (SSH_CAMELLIA_256_SUPPORT != ENABLED && SSH_CAMELLIA_256_SUPPORT != DISABLED)
453  #error SSH_CAMELLIA_256_SUPPORT parameter is not valid
454 #endif
455 
456 //SEED cipher support (weak)
457 #ifndef SSH_SEED_SUPPORT
458  #define SSH_SEED_SUPPORT DISABLED
459 #elif (SSH_SEED_SUPPORT != ENABLED && SSH_SEED_SUPPORT != DISABLED)
460  #error SSH_SEED_SUPPORT parameter is not valid
461 #endif
462 
463 //MD5 hash support (insecure)
464 #ifndef SSH_MD5_SUPPORT
465  #define SSH_MD5_SUPPORT DISABLED
466 #elif (SSH_MD5_SUPPORT != ENABLED && SSH_MD5_SUPPORT != DISABLED)
467  #error SSH_MD5_SUPPORT parameter is not valid
468 #endif
469 
470 //MD5/96 hash support (insecure)
471 #ifndef SSH_MD5_96_SUPPORT
472  #define SSH_MD5_96_SUPPORT DISABLED
473 #elif (SSH_MD5_96_SUPPORT != ENABLED && SSH_MD5_96_SUPPORT != DISABLED)
474  #error SSH_MD5_96_SUPPORT parameter is not valid
475 #endif
476 
477 //RIPEMD-160 hash support (weak)
478 #ifndef SSH_RIPEMD160_SUPPORT
479  #define SSH_RIPEMD160_SUPPORT DISABLED
480 #elif (SSH_RIPEMD160_SUPPORT != ENABLED && SSH_RIPEMD160_SUPPORT != DISABLED)
481  #error SSH_RIPEMD160_SUPPORT parameter is not valid
482 #endif
483 
484 //SHA-1 hash support (weak)
485 #ifndef SSH_SHA1_SUPPORT
486  #define SSH_SHA1_SUPPORT ENABLED
487 #elif (SSH_SHA1_SUPPORT != ENABLED && SSH_SHA1_SUPPORT != DISABLED)
488  #error SSH_SHA1_SUPPORT parameter is not valid
489 #endif
490 
491 //SHA-1/96 hash support (insecure)
492 #ifndef SSH_SHA1_96_SUPPORT
493  #define SSH_SHA1_96_SUPPORT DISABLED
494 #elif (SSH_SHA1_96_SUPPORT != ENABLED && SSH_SHA1_96_SUPPORT != DISABLED)
495  #error SSH_SHA1_96_SUPPORT parameter is not valid
496 #endif
497 
498 //SHA-224 hash support (weak)
499 #ifndef SSH_SHA224_SUPPORT
500  #define SSH_SHA224_SUPPORT DISABLED
501 #elif (SSH_SHA224_SUPPORT != ENABLED && SSH_SHA224_SUPPORT != DISABLED)
502  #error SSH_SHA224_SUPPORT parameter is not valid
503 #endif
504 
505 //SHA-256 hash support
506 #ifndef SSH_SHA256_SUPPORT
507  #define SSH_SHA256_SUPPORT ENABLED
508 #elif (SSH_SHA256_SUPPORT != ENABLED && SSH_SHA256_SUPPORT != DISABLED)
509  #error SSH_SHA256_SUPPORT parameter is not valid
510 #endif
511 
512 //SHA-384 hash support
513 #ifndef SSH_SHA384_SUPPORT
514  #define SSH_SHA384_SUPPORT ENABLED
515 #elif (SSH_SHA384_SUPPORT != ENABLED && SSH_SHA384_SUPPORT != DISABLED)
516  #error SSH_SHA384_SUPPORT parameter is not valid
517 #endif
518 
519 //SHA-512 hash support
520 #ifndef SSH_SHA512_SUPPORT
521  #define SSH_SHA512_SUPPORT ENABLED
522 #elif (SSH_SHA512_SUPPORT != ENABLED && SSH_SHA512_SUPPORT != DISABLED)
523  #error SSH_SHA512_SUPPORT parameter is not valid
524 #endif
525 
526 //RSA key exchange support
527 #ifndef SSH_RSA_KEX_SUPPORT
528  #define SSH_RSA_KEX_SUPPORT DISABLED
529 #elif (SSH_RSA_KEX_SUPPORT != ENABLED && SSH_RSA_KEX_SUPPORT != DISABLED)
530  #error SSH_RSA_KEX_SUPPORT parameter is not valid
531 #endif
532 
533 //Diffie-Hellman key exchange support
534 #ifndef SSH_DH_KEX_SUPPORT
535  #define SSH_DH_KEX_SUPPORT ENABLED
536 #elif (SSH_DH_KEX_SUPPORT != ENABLED && SSH_DH_KEX_SUPPORT != DISABLED)
537  #error SSH_DH_KEX_SUPPORT parameter is not valid
538 #endif
539 
540 //DH GEX key exchange support
541 #ifndef SSH_DH_GEX_KEX_SUPPORT
542  #define SSH_DH_GEX_KEX_SUPPORT DISABLED
543 #elif (SSH_DH_GEX_KEX_SUPPORT != ENABLED && SSH_DH_GEX_KEX_SUPPORT != DISABLED)
544  #error SSH_DH_GEX_KEX_SUPPORT parameter is not valid
545 #endif
546 
547 //ECDH key exchange support
548 #ifndef SSH_ECDH_KEX_SUPPORT
549  #define SSH_ECDH_KEX_SUPPORT ENABLED
550 #elif (SSH_ECDH_KEX_SUPPORT != ENABLED && SSH_ECDH_KEX_SUPPORT != DISABLED)
551  #error SSH_ECDH_KEX_SUPPORT parameter is not valid
552 #endif
553 
554 //Pure post-quantum key exchange support
555 #ifndef SSH_KEM_KEX_SUPPORT
556  #define SSH_KEM_KEX_SUPPORT DISABLED
557 #elif (SSH_KEM_KEX_SUPPORT != ENABLED && SSH_KEM_KEX_SUPPORT != DISABLED)
558  #error SSH_KEM_KEX_SUPPORT parameter is not valid
559 #endif
560 
561 //Post-quantum hybrid key exchange support
562 #ifndef SSH_HYBRID_KEX_SUPPORT
563  #define SSH_HYBRID_KEX_SUPPORT DISABLED
564 #elif (SSH_HYBRID_KEX_SUPPORT != ENABLED && SSH_HYBRID_KEX_SUPPORT != DISABLED)
565  #error SSH_HYBRID_KEX_SUPPORT parameter is not valid
566 #endif
567 
568 //RSA signature support
569 #ifndef SSH_RSA_SIGN_SUPPORT
570  #define SSH_RSA_SIGN_SUPPORT ENABLED
571 #elif (SSH_RSA_SIGN_SUPPORT != ENABLED && SSH_RSA_SIGN_SUPPORT != DISABLED)
572  #error SSH_RSA_SIGN_SUPPORT parameter is not valid
573 #endif
574 
575 //DSA signature support
576 #ifndef SSH_DSA_SIGN_SUPPORT
577  #define SSH_DSA_SIGN_SUPPORT ENABLED
578 #elif (SSH_DSA_SIGN_SUPPORT != ENABLED && SSH_DSA_SIGN_SUPPORT != DISABLED)
579  #error SSH_DSA_SIGN_SUPPORT parameter is not valid
580 #endif
581 
582 //ECDSA signature support
583 #ifndef SSH_ECDSA_SIGN_SUPPORT
584  #define SSH_ECDSA_SIGN_SUPPORT ENABLED
585 #elif (SSH_ECDSA_SIGN_SUPPORT != ENABLED && SSH_ECDSA_SIGN_SUPPORT != DISABLED)
586  #error SSH_ECDSA_SIGN_SUPPORT parameter is not valid
587 #endif
588 
589 //Ed25519 signature support
590 #ifndef SSH_ED25519_SIGN_SUPPORT
591  #define SSH_ED25519_SIGN_SUPPORT ENABLED
592 #elif (SSH_ED25519_SIGN_SUPPORT != ENABLED && SSH_ED25519_SIGN_SUPPORT != DISABLED)
593  #error SSH_ED25519_SIGN_SUPPORT parameter is not valid
594 #endif
595 
596 //Ed448 signature support
597 #ifndef SSH_ED448_SIGN_SUPPORT
598  #define SSH_ED448_SIGN_SUPPORT DISABLED
599 #elif (SSH_ED448_SIGN_SUPPORT != ENABLED && SSH_ED448_SIGN_SUPPORT != DISABLED)
600  #error SSH_ED448_SIGN_SUPPORT parameter is not valid
601 #endif
602 
603 //ML-DSA-44 signature support
604 #ifndef SSH_MLDSA44_SIGN_SUPPORT
605  #define SSH_MLDSA44_SIGN_SUPPORT DISABLED
606 #elif (SSH_MLDSA44_SIGN_SUPPORT != ENABLED && SSH_MLDSA44_SIGN_SUPPORT != DISABLED)
607  #error SSH_MLDSA44_SIGN_SUPPORT parameter is not valid
608 #endif
609 
610 //ML-DSA-65 signature support
611 #ifndef SSH_MLDSA65_SIGN_SUPPORT
612  #define SSH_MLDSA65_SIGN_SUPPORT DISABLED
613 #elif (SSH_MLDSA65_SIGN_SUPPORT != ENABLED && SSH_MLDSA65_SIGN_SUPPORT != DISABLED)
614  #error SSH_MLDSA65_SIGN_SUPPORT parameter is not valid
615 #endif
616 
617 //ML-DSA-87 signature support
618 #ifndef SSH_MLDSA87_SIGN_SUPPORT
619  #define SSH_MLDSA87_SIGN_SUPPORT DISABLED
620 #elif (SSH_MLDSA87_SIGN_SUPPORT != ENABLED && SSH_MLDSA87_SIGN_SUPPORT != DISABLED)
621  #error SSH_MLDSA87_SIGN_SUPPORT parameter is not valid
622 #endif
623 
624 //NIST P-256 elliptic curve support
625 #ifndef SSH_NISTP256_SUPPORT
626  #define SSH_NISTP256_SUPPORT ENABLED
627 #elif (SSH_NISTP256_SUPPORT != ENABLED && SSH_NISTP256_SUPPORT != DISABLED)
628  #error SSH_NISTP256_SUPPORT parameter is not valid
629 #endif
630 
631 //NIST P-384 elliptic curve support
632 #ifndef SSH_NISTP384_SUPPORT
633  #define SSH_NISTP384_SUPPORT ENABLED
634 #elif (SSH_NISTP384_SUPPORT != ENABLED && SSH_NISTP384_SUPPORT != DISABLED)
635  #error SSH_NISTP384_SUPPORT parameter is not valid
636 #endif
637 
638 //NIST P-521 elliptic curve support
639 #ifndef SSH_NISTP521_SUPPORT
640  #define SSH_NISTP521_SUPPORT ENABLED
641 #elif (SSH_NISTP521_SUPPORT != ENABLED && SSH_NISTP521_SUPPORT != DISABLED)
642  #error SSH_NISTP521_SUPPORT parameter is not valid
643 #endif
644 
645 //Curve25519 elliptic curve support
646 #ifndef SSH_CURVE25519_SUPPORT
647  #define SSH_CURVE25519_SUPPORT ENABLED
648 #elif (SSH_CURVE25519_SUPPORT != ENABLED && SSH_CURVE25519_SUPPORT != DISABLED)
649  #error SSH_CURVE25519_SUPPORT parameter is not valid
650 #endif
651 
652 //Curve448 elliptic curve support
653 #ifndef SSH_CURVE448_SUPPORT
654  #define SSH_CURVE448_SUPPORT DISABLED
655 #elif (SSH_CURVE448_SUPPORT != ENABLED && SSH_CURVE448_SUPPORT != DISABLED)
656  #error SSH_CURVE448_SUPPORT parameter is not valid
657 #endif
658 
659 //ML-KEM-768 key encapsulation mechanism support
660 #ifndef SSH_MLKEM768_SUPPORT
661  #define SSH_MLKEM768_SUPPORT DISABLED
662 #elif (SSH_MLKEM768_SUPPORT != ENABLED && SSH_MLKEM768_SUPPORT != DISABLED)
663  #error SSH_MLKEM768_SUPPORT parameter is not valid
664 #endif
665 
666 //ML-KEM-1024 key encapsulation mechanism support
667 #ifndef SSH_MLKEM1024_SUPPORT
668  #define SSH_MLKEM1024_SUPPORT DISABLED
669 #elif (SSH_MLKEM1024_SUPPORT != ENABLED && SSH_MLKEM1024_SUPPORT != DISABLED)
670  #error SSH_MLKEM1024_SUPPORT parameter is not valid
671 #endif
672 
673 //Streamlined NTRU Prime 761 key encapsulation mechanism support
674 #ifndef SSH_SNTRUP761_SUPPORT
675  #define SSH_SNTRUP761_SUPPORT DISABLED
676 #elif (SSH_SNTRUP761_SUPPORT != ENABLED && SSH_SNTRUP761_SUPPORT != DISABLED)
677  #error SSH_SNTRUP761_SUPPORT parameter is not valid
678 #endif
679 
680 //Key logging (for debugging purpose only)
681 #ifndef SSH_KEY_LOG_SUPPORT
682  #define SSH_KEY_LOG_SUPPORT DISABLED
683 #elif (SSH_KEY_LOG_SUPPORT != ENABLED && SSH_KEY_LOG_SUPPORT != DISABLED)
684  #error SSH_KEY_LOG_SUPPORT parameter is not valid
685 #endif
686 
687 //Maximum number of transient RSA keys that can be loaded
688 #ifndef SSH_MAX_RSA_KEYS
689  #define SSH_MAX_RSA_KEYS 2
690 #elif (SSH_MAX_RSA_KEYS < 1)
691  #error SSH_MAX_RSA_KEYS parameter is not valid
692 #endif
693 
694 //Maximum number of Diffie-Hellman groups that can be loaded
695 #ifndef SSH_MAX_DH_GEX_GROUPS
696  #define SSH_MAX_DH_GEX_GROUPS 2
697 #elif (SSH_MAX_DH_GEX_GROUPS < 1)
698  #error SSH_MAX_DH_GEX_GROUPS parameter is not valid
699 #endif
700 
701 //Minimum acceptable size for Diffie-Hellman prime modulus
702 #ifndef SSH_MIN_DH_MODULUS_SIZE
703  #define SSH_MIN_DH_MODULUS_SIZE 1024
704 #elif (SSH_MIN_DH_MODULUS_SIZE < 1024)
705  #error SSH_MIN_DH_MODULUS_SIZE parameter is not valid
706 #endif
707 
708 //Preferred size for Diffie-Hellman prime modulus
709 #ifndef SSH_PREFERRED_DH_MODULUS_SIZE
710  #define SSH_PREFERRED_DH_MODULUS_SIZE 2048
711 #elif (SSH_PREFERRED_DH_MODULUS_SIZE < SSH_MIN_DH_MODULUS_SIZE)
712  #error SSH_PREFERRED_DH_MODULUS_SIZE parameter is not valid
713 #endif
714 
715 //Maximum acceptable size for Diffie-Hellman prime modulus
716 #ifndef SSH_MAX_DH_MODULUS_SIZE
717  #define SSH_MAX_DH_MODULUS_SIZE 3072
718 #elif (SSH_MAX_DH_MODULUS_SIZE < SSH_PREFERRED_DH_MODULUS_SIZE)
719  #error SSH_MAX_DH_MODULUS_SIZE parameter is not valid
720 #endif
721 
722 //Minimum acceptable size for RSA modulus
723 #ifndef SSH_MIN_RSA_MODULUS_SIZE
724  #define SSH_MIN_RSA_MODULUS_SIZE 1024
725 #elif (SSH_MIN_RSA_MODULUS_SIZE < 512)
726  #error SSH_MIN_RSA_MODULUS_SIZE parameter is not valid
727 #endif
728 
729 //Maximum acceptable size for RSA modulus
730 #ifndef SSH_MAX_RSA_MODULUS_SIZE
731  #define SSH_MAX_RSA_MODULUS_SIZE 4096
732 #elif (SSH_MAX_RSA_MODULUS_SIZE < SSH_MIN_RSA_MODULUS_SIZE)
733  #error SSH_MAX_RSA_MODULUS_SIZE parameter is not valid
734 #endif
735 
736 //Minimum acceptable size for DSA prime modulus
737 #ifndef SSH_MIN_DSA_MODULUS_SIZE
738  #define SSH_MIN_DSA_MODULUS_SIZE 1024
739 #elif (SSH_MIN_DSA_MODULUS_SIZE < 512)
740  #error SSH_MIN_DSA_MODULUS_SIZE parameter is not valid
741 #endif
742 
743 //Maximum acceptable size for DSA prime modulus
744 #ifndef SSH_MAX_DSA_MODULUS_SIZE
745  #define SSH_MAX_DSA_MODULUS_SIZE 4096
746 #elif (SSH_MAX_DSA_MODULUS_SIZE < SSH_MIN_DSA_MODULUS_SIZE)
747  #error SSH_MAX_DSA_MODULUS_SIZE parameter is not valid
748 #endif
749 
750 //Allocate memory block
751 #ifndef sshAllocMem
752  #define sshAllocMem(size) osAllocMem(size)
753 #endif
754 
755 //Deallocate memory block
756 #ifndef sshFreeMem
757  #define sshFreeMem(p) osFreeMem(p)
758 #endif
759 
760 //HMAC support
761 #if (SSH_STREAM_CIPHER_SUPPORT == ENABLED)
762  #define SSH_HMAC_SUPPORT ENABLED
763 #elif (SSH_CBC_CIPHER_SUPPORT == ENABLED)
764  #define SSH_HMAC_SUPPORT ENABLED
765 #elif (SSH_CTR_CIPHER_SUPPORT == ENABLED)
766  #define SSH_HMAC_SUPPORT ENABLED
767 #else
768  #define SSH_HMAC_SUPPORT DISABLED
769 #endif
770 
771 //Maximum key size (encryption algorithms)
772 #if (SSH_CHACHA20_POLY1305_SUPPORT == ENABLED)
773  #define SSH_MAX_ENC_KEY_SIZE 64
774 #else
775  #define SSH_MAX_ENC_KEY_SIZE 32
776 #endif
777 
778 //Maximum block size (encryption algorithms)
779 #if (SSH_AES_128_SUPPORT == ENABLED)
780  #define SSH_MAX_CIPHER_BLOCK_SIZE AES_BLOCK_SIZE
781 #elif (SSH_AES_192_SUPPORT == ENABLED)
782  #define SSH_MAX_CIPHER_BLOCK_SIZE AES_BLOCK_SIZE
783 #elif (SSH_AES_256_SUPPORT == ENABLED)
784  #define SSH_MAX_CIPHER_BLOCK_SIZE AES_BLOCK_SIZE
785 #elif (SSH_TWOFISH_128_SUPPORT == ENABLED)
786  #define SSH_MAX_CIPHER_BLOCK_SIZE TWOFISH_BLOCK_SIZE
787 #elif (SSH_TWOFISH_192_SUPPORT == ENABLED)
788  #define SSH_MAX_CIPHER_BLOCK_SIZE TWOFISH_BLOCK_SIZE
789 #elif (SSH_TWOFISH_256_SUPPORT == ENABLED)
790  #define SSH_MAX_CIPHER_BLOCK_SIZE TWOFISH_BLOCK_SIZE
791 #elif (SSH_SERPENT_128_SUPPORT == ENABLED)
792  #define SSH_MAX_CIPHER_BLOCK_SIZE SERPENT_BLOCK_SIZE
793 #elif (SSH_SERPENT_192_SUPPORT == ENABLED)
794  #define SSH_MAX_CIPHER_BLOCK_SIZE SERPENT_BLOCK_SIZE
795 #elif (SSH_SERPENT_256_SUPPORT == ENABLED)
796  #define SSH_MAX_CIPHER_BLOCK_SIZE SERPENT_BLOCK_SIZE
797 #elif (SSH_CAMELLIA_128_SUPPORT == ENABLED)
798  #define SSH_MAX_CIPHER_BLOCK_SIZE CAMELLIA_BLOCK_SIZE
799 #elif (SSH_CAMELLIA_192_SUPPORT == ENABLED)
800  #define SSH_MAX_CIPHER_BLOCK_SIZE CAMELLIA_BLOCK_SIZE
801 #elif (SSH_CAMELLIA_256_SUPPORT == ENABLED)
802  #define SSH_MAX_CIPHER_BLOCK_SIZE CAMELLIA_BLOCK_SIZE
803 #elif (SSH_SEED_SUPPORT == ENABLED)
804  #define SSH_MAX_CIPHER_BLOCK_SIZE SEED_BLOCK_SIZE
805 #elif (SSH_CAST128_SUPPORT == ENABLED)
806  #define SSH_MAX_CIPHER_BLOCK_SIZE CAST128_BLOCK_SIZE
807 #elif (SSH_IDEA_SUPPORT == ENABLED)
808  #define SSH_MAX_CIPHER_BLOCK_SIZE IDEA_BLOCK_SIZE
809 #elif (SSH_BLOWFISH_SUPPORT == ENABLED)
810  #define SSH_MAX_CIPHER_BLOCK_SIZE BLOWFISH_BLOCK_SIZE
811 #else
812  #define SSH_MAX_CIPHER_BLOCK_SIZE DES3_BLOCK_SIZE
813 #endif
814 
815 //Maximum digest size (MAC algorithms)
816 #if (SSH_SHA512_SUPPORT == ENABLED)
817  #define SSH_MAX_HASH_DIGEST_SIZE SHA512_DIGEST_SIZE
818 #elif (SSH_SHA384_SUPPORT == ENABLED)
819  #define SSH_MAX_HASH_DIGEST_SIZE SHA384_DIGEST_SIZE
820 #elif (SSH_SHA256_SUPPORT == ENABLED)
821  #define SSH_MAX_HASH_DIGEST_SIZE SHA256_DIGEST_SIZE
822 #elif (SSH_SHA1_SUPPORT == ENABLED || SSH_SHA1_96_SUPPORT == ENABLED)
823  #define SSH_MAX_HASH_DIGEST_SIZE SHA1_DIGEST_SIZE
824 #elif (SSH_RIPEMD160_SUPPORT == ENABLED)
825  #define SSH_MAX_HASH_DIGEST_SIZE RIPEMD160_DIGEST_SIZE
826 #else
827  #define SSH_MAX_HASH_DIGEST_SIZE MD5_DIGEST_SIZE
828 #endif
829 
830 //Maximum shared secret length (RSA key exchange)
831 #if (SSH_RSA_KEX_SUPPORT == ENABLED)
832  #define SSH_MAX_RSA_SHARED_SECRET_LEN ((SSH_MAX_RSA_MODULUS_SIZE + 47) / 8)
833 #else
834  #define SSH_MAX_RSA_SHARED_SECRET_LEN 0
835 #endif
836 
837 //Maximum shared secret length (Diffie-Hellman key exchange)
838 #if (SSH_DH_KEX_SUPPORT == ENABLED || SSH_DH_GEX_KEX_SUPPORT == ENABLED)
839  #define SSH_MAX_DH_SHARED_SECRET_LEN ((SSH_MAX_DH_MODULUS_SIZE + 47) / 8)
840 #else
841  #define SSH_MAX_DH_SHARED_SECRET_LEN 0
842 #endif
843 
844 //Maximum shared secret length (ECDH key exchange)
845 #if (SSH_ECDH_KEX_SUPPORT == ENABLED && SSH_NISTP521_SUPPORT == ENABLED)
846  #define SSH_MAX_ECDH_SHARED_SECRET_LEN 71
847 #elif (SSH_ECDH_KEX_SUPPORT == ENABLED && SSH_CURVE448_SUPPORT == ENABLED)
848  #define SSH_MAX_ECDH_SHARED_SECRET_LEN 61
849 #elif (SSH_ECDH_KEX_SUPPORT == ENABLED && SSH_NISTP384_SUPPORT == ENABLED)
850  #define SSH_MAX_ECDH_SHARED_SECRET_LEN 53
851 #else
852  #define SSH_MAX_ECDH_SHARED_SECRET_LEN 37
853 #endif
854 
855 //Maximum shared secret length (pure post quantum key exchange)
856 #if (SSH_KEM_KEX_SUPPORT == ENABLED)
857  #define SSH_MAX_KEM_SHARED_SECRET_LEN 36
858 #else
859  #define SSH_MAX_KEM_SHARED_SECRET_LEN 0
860 #endif
861 
862 //Maximum shared secret length (post quantum hybrid key exchange)
863 #if (SSH_HYBRID_KEX_SUPPORT == ENABLED && SSH_SNTRUP761_SUPPORT == ENABLED)
864  #define SSH_MAX_HYBRID_SHARED_SECRET_LEN 68
865 #elif (SSH_HYBRID_KEX_SUPPORT == ENABLED && SSH_MLKEM1024_SUPPORT == ENABLED)
866  #define SSH_MAX_HYBRID_SHARED_SECRET_LEN 68
867 #elif (SSH_HYBRID_KEX_SUPPORT == ENABLED && SSH_MLKEM768_SUPPORT == ENABLED)
868  #define SSH_MAX_HYBRID_SHARED_SECRET_LEN 52
869 #else
870  #define SSH_MAX_HYBRID_SHARED_SECRET_LEN 0
871 #endif
872 
873 //Maximum shared secret length
874 #if (SSH_MAX_RSA_SHARED_SECRET_LEN >= SSH_MAX_DH_SHARED_SECRET_LEN && \
875  SSH_MAX_RSA_SHARED_SECRET_LEN >= SSH_MAX_ECDH_SHARED_SECRET_LEN && \
876  SSH_MAX_RSA_SHARED_SECRET_LEN >= SSH_MAX_KEM_SHARED_SECRET_LEN && \
877  SSH_MAX_RSA_SHARED_SECRET_LEN >= SSH_MAX_HYBRID_SHARED_SECRET_LEN)
878  #define SSH_MAX_SHARED_SECRET_LEN SSH_MAX_RSA_SHARED_SECRET_LEN
879 #elif (SSH_MAX_DH_SHARED_SECRET_LEN >= SSH_MAX_RSA_SHARED_SECRET_LEN && \
880  SSH_MAX_DH_SHARED_SECRET_LEN >= SSH_MAX_ECDH_SHARED_SECRET_LEN && \
881  SSH_MAX_DH_SHARED_SECRET_LEN >= SSH_MAX_KEM_SHARED_SECRET_LEN && \
882  SSH_MAX_DH_SHARED_SECRET_LEN >= SSH_MAX_HYBRID_SHARED_SECRET_LEN)
883  #define SSH_MAX_SHARED_SECRET_LEN SSH_MAX_DH_SHARED_SECRET_LEN
884 #elif (SSH_MAX_ECDH_SHARED_SECRET_LEN >= SSH_MAX_RSA_SHARED_SECRET_LEN && \
885  SSH_MAX_ECDH_SHARED_SECRET_LEN >= SSH_MAX_DH_SHARED_SECRET_LEN && \
886  SSH_MAX_ECDH_SHARED_SECRET_LEN >= SSH_MAX_KEM_SHARED_SECRET_LEN && \
887  SSH_MAX_ECDH_SHARED_SECRET_LEN >= SSH_MAX_HYBRID_SHARED_SECRET_LEN)
888  #define SSH_MAX_SHARED_SECRET_LEN SSH_MAX_ECDH_SHARED_SECRET_LEN
889 #elif (SSH_MAX_KEM_SHARED_SECRET_LEN >= SSH_MAX_RSA_SHARED_SECRET_LEN && \
890  SSH_MAX_KEM_SHARED_SECRET_LEN >= SSH_MAX_DH_SHARED_SECRET_LEN && \
891  SSH_MAX_KEM_SHARED_SECRET_LEN >= SSH_MAX_ECDH_SHARED_SECRET_LEN && \
892  SSH_MAX_KEM_SHARED_SECRET_LEN >= SSH_MAX_HYBRID_SHARED_SECRET_LEN)
893  #define SSH_MAX_SHARED_SECRET_LEN SSH_MAX_KEM_SHARED_SECRET_LEN
894 #else
895  #define SSH_MAX_SHARED_SECRET_LEN SSH_MAX_HYBRID_SHARED_SECRET_LEN
896 #endif
897 
898 //SSH port number
899 #define SSH_PORT 22
900 
901 //Cookie size
902 #define SSH_COOKIE_SIZE 16
903 //Data overhead caused by mpint encoding
904 #define SSH_MAX_MPINT_OVERHEAD 5
905 //Data overhead caused by packet encryption
906 #define SSH_MAX_PACKET_OVERHEAD 128
907 
908 //Size of buffer used for input/output operations
909 #define SSH_BUFFER_SIZE (SSH_MAX_PACKET_SIZE + SSH_MAX_PACKET_OVERHEAD)
910 
911 //Forward declaration of SshContext structure
912 struct _SshContext;
913 #define SshContext struct _SshContext
914 
915 //Forward declaration of SshConnection structure
916 struct _SshConnection;
917 #define SshConnection struct _SshConnection
918 
919 //Forward declaration of SshChannel structure
920 struct _SshChannel;
921 #define SshChannel struct _SshChannel
922 
923 //C++ guard
924 #ifdef __cplusplus
925 extern "C" {
926 #endif
927 
928 
929 /**
930  * @brief Mode of operation
931  **/
932 
933 typedef enum
934 {
938 
939 
940 /**
941  * @brief Authentication status
942  **/
943 
944 typedef enum
945 {
950 
951 
952 /**
953  * @brief Flags used by read and write functions
954  **/
955 
956 typedef enum
957 {
958  SSH_FLAG_EOF = 0x0100,
963  SSH_FLAG_DELAY = 0x8000
965 
966 //The SSH_FLAG_BREAK macro causes the read function to stop reading
967 //data whenever the specified break character is encountered
968 #define SSH_FLAG_BREAK(c) (SSH_FLAG_BREAK_CHAR | LSB(c))
969 
970 
971 /**
972  * @brief SSH message types
973  **/
974 
975 typedef enum
976 {
1031  SSH_MSG_PONG = 193
1033 
1034 
1035 /**
1036  * @brief Disconnection messages reason codes
1037  **/
1038 
1039 typedef enum
1040 {
1057 
1058 
1059 /**
1060  * @brief Channel connection failure reason codes
1061  **/
1062 
1063 typedef enum
1064 {
1070 
1071 
1072 /**
1073  * @brief SSH connection state
1074  **/
1075 
1076 typedef enum
1077 {
1112 
1113 
1114 /**
1115  * @brief SSH channel state
1116  **/
1117 
1118 typedef enum
1119 {
1125 
1126 
1127 /**
1128  * @brief SSH request states
1129  **/
1130 
1131 typedef enum
1132 {
1138 
1139 
1140 /**
1141  * @brief SSH channel events
1142  **/
1143 
1144 typedef enum
1145 {
1155 } SshChannelEvent;
1156 
1157 
1158 /**
1159  * @brief Transient RSA key (for RSA key exchange)
1160  **/
1161 
1162 typedef struct
1163 {
1164  uint_t modulusSize; ///<Length of the modulus, in bits
1165  const char_t *publicKey; ///<RSA public key (PEM, SSH2 or OpenSSH format)
1166  size_t publicKeyLen; ///<Length of the RSA public key
1167  const char_t *privateKey; ///<RSA private key (PEM or OpenSSH format)
1168  size_t privateKeyLen; ///<Length of the RSA private key
1169  char_t password[SSH_MAX_PASSWORD_LEN + 1]; ///<Password used to decrypt the private key
1170 } SshRsaKey;
1171 
1172 
1173 /**
1174  * @brief Diffie-Hellman group
1175  **/
1176 
1177 typedef struct
1178 {
1179  uint_t dhModulusSize; ///<Length of the prime modulus, in bits
1180  const char_t *dhParams; ///<Diffie-Hellman parameters (PEM format)
1181  size_t dhParamsLen; ///<Length of the Diffie-Hellman parameters
1182 } SshDhGexGroup;
1183 
1184 
1185 /**
1186  * @brief Host key
1187  **/
1188 
1189 typedef struct
1190 {
1191  const char_t *keyFormatId; ///<Key format identifier
1192  const char_t *publicKey; ///<Public key (PEM, SSH2 or OpenSSH format)
1193  size_t publicKeyLen; ///<Length of the public key
1194  const char_t *privateKey; ///<Private key (PEM or OpenSSH format)
1195  size_t privateKeyLen; ///<Length of the private key
1196  char_t password[SSH_MAX_PASSWORD_LEN + 1]; ///<Password used to decrypt the private key
1197 #if (SSH_CLIENT_SUPPORT == ENABLED)
1198  const char_t *publicKeyAlgo; ///<Public key algorithm to use during user authentication
1199 #endif
1200 } SshHostKey;
1201 
1202 
1203 /**
1204  * @brief Host key algorithm
1205  **/
1206 
1207 typedef struct
1208 {
1209  const char_t *publicKeyAlgo; ///<Public key algorithm
1210  const char_t *keyFormatId; ///<Key format identifier
1211  const char_t *signFormatId; ///<Signature format identifier
1212 } SshHostKeyAlgo;
1213 
1214 
1215 /**
1216  * @brief Host key verification callback function
1217  **/
1218 
1220  const uint8_t *hostKey, size_t hostKeyLen);
1221 
1222 
1223 /**
1224  * @brief Certificate verification callback function
1225  **/
1226 
1228  const SshCertificate *cert);
1229 
1230 
1231 /**
1232  * @brief CA public key verification callback function
1233  **/
1234 
1236  const uint8_t *publicKey, size_t publicKeyLen);
1237 
1238 
1239 /**
1240  * @brief Public key authentication callback function
1241  **/
1242 
1244  const char_t *user, const uint8_t *publicKey, size_t publicKeyLen);
1245 
1246 
1247 /**
1248  * @brief Certificate authentication callback function
1249  **/
1250 
1252  const char_t *user, const SshCertificate *cert);
1253 
1254 
1255 /**
1256  * @brief Password authentication callback function
1257  **/
1258 
1260  const char_t *user, const char_t *password, size_t passwordLen);
1261 
1262 
1263 /**
1264  * @brief Password change callback function
1265  **/
1266 
1268  const char_t *user, const char_t *oldPassword, size_t oldPasswordLen,
1269  const char_t *newPassword, size_t newPasswordLen);
1270 
1271 
1272 /**
1273  * @brief Signature generation callback function
1274  **/
1275 
1277  const char_t *publicKeyAlgo, const SshHostKey *hostKey,
1279  uint8_t *p, size_t *written);
1280 
1281 
1282 /**
1283  * @brief Signature verification callback function
1284  **/
1285 
1287  const SshString *publicKeyAlgo, const SshBinaryString *publicKeyBlob,
1289  const SshBinaryString *signatureBlob);
1290 
1291 
1292 /**
1293  * @brief ECDH key pair generation callback
1294  **/
1295 
1297  const char_t *kexAlgo, EcPublicKey *publicKey);
1298 
1299 
1300 /**
1301  * @brief ECDH shared secret calculation callback
1302  **/
1303 
1305  const char_t *kexAlgo, const EcPublicKey *publicKey, uint8_t *output,
1306  size_t *outputLen);
1307 
1308 
1309 /**
1310  * @brief Global request callback function
1311  **/
1312 
1314  const SshString *name, const uint8_t *data, size_t length, void *param);
1315 
1316 
1317 /**
1318  * @brief Channel request callback function
1319  **/
1320 
1322  const SshString *type, const uint8_t *data, size_t length, void *param);
1323 
1324 
1325 /**
1326  * @brief Channel open callback function
1327  **/
1328 
1330  const SshString *type, uint32_t senderChannel, uint32_t initialWindowSize,
1331  uint32_t maxPacketSize, const uint8_t *data, size_t length, void *param);
1332 
1333 
1334 /**
1335  * @brief Connection open callback function
1336  **/
1337 
1339  void *param);
1340 
1341 
1342 /**
1343  * @brief Connection close callback function
1344  **/
1345 
1347  void *param);
1348 
1349 
1350 /**
1351  * @brief Key logging callback function (for debugging purpose only)
1352  **/
1353 
1355  const char_t *key);
1356 
1357 
1358 /**
1359  * @brief Encryption engine
1360  **/
1361 
1362 typedef struct
1363 {
1364  CipherMode cipherMode; ///<Cipher mode of operation
1365  const CipherAlgo *cipherAlgo; ///<Cipher algorithm
1366  CipherContext cipherContext; ///<Cipher context
1367  const HashAlgo *hashAlgo; ///<Hash algorithm for MAC operations
1368  HmacContext *hmacContext; ///<HMAC context
1369  size_t macSize; ///<Size of the MAC tag, in bytes
1370  bool_t etm; ///<Encrypt-then-MAC
1371  uint8_t iv[SSH_MAX_CIPHER_BLOCK_SIZE]; ///<Initialization vector
1372  uint8_t encKey[SSH_MAX_ENC_KEY_SIZE]; ///<Encryption key
1373  size_t encKeyLen; ///<Length of the encryption key, in bytes
1374  uint8_t macKey[SSH_MAX_HASH_DIGEST_SIZE]; ///<Integrity key
1375  uint8_t seqNum[4]; ///<Sequence number
1376 #if (SSH_GCM_CIPHER_SUPPORT == ENABLED || SSH_RFC5647_SUPPORT == ENABLED)
1377  GcmContext gcmContext; ///<GCM context
1378 #endif
1379 #if (SSH_CHACHA20_POLY1305_SUPPORT == ENABLED)
1380  uint8_t aad[4]; ///<Additional authenticated data
1381 #endif
1383 
1384 
1385 /**
1386  * @brief SSH channel buffer
1387  **/
1388 
1389 typedef struct
1390 {
1392  size_t length;
1393  size_t threshold;
1394  size_t writePos;
1395  size_t readPos;
1397 
1398 
1399 /**
1400  * @brief SSH channel
1401  **/
1402 
1404 {
1405  SshChannelState state; ///<Channel state
1406  SshRequestState requestState; ///<Channel request state
1407  SshContext *context; ///<SSH context
1408  SshConnection *connection; ///<SSH connection
1413  systime_t timeout; ///<Timeout value
1414  uint32_t localChannelNum; ///<Local channel number
1415  uint32_t remoteChannelNum; ///<Remote channel number
1416  uint32_t maxPacketSize; ///<Maximum packet size
1419  size_t txWindowSize; ///<TX flow-control window
1420  size_t rxWindowSize; ///<RX flow-control window
1421  size_t rxWindowSizeInc; ///<Window size increment
1422  bool_t channelSuccessSent; ///<An SSH_MSG_CHANNEL_SUCCESS message has been sent
1423  bool_t eofRequest; ///<Channel EOF request
1424  bool_t eofSent; ///<An SSH_MSG_CHANNEL_EOF message has been sent
1425  bool_t eofReceived; ///<An SSH_MSG_CHANNEL_EOF message has been received
1426  bool_t closeRequest; ///<Channel close request
1427  bool_t closeSent; ///<An SSH_MSG_CHANNEL_CLOSE message has been sent
1428  bool_t closeReceived; ///<An SSH_MSG_CHANNEL_CLOSE message has been received
1429  int32_t exitStatus; ///<Exit status of the command
1430  bool_t exitStatusSent; ///<An SSH_MSG_CHANNEL_REQUEST with the exit status has been sent
1431 };
1432 
1433 
1434 /**
1435  * @brief SSH connection
1436  **/
1437 
1439 {
1440  SshConnectionState state; ///<Connection state
1441  SshRequestState requestState; ///<Global request state
1442  SshContext *context; ///<SSH context
1443  Socket *socket; ///<Underlying socket
1444  systime_t timestamp; ///<Time stamp to manage connection timeout
1445 
1446  char_t clientId[SSH_MAX_ID_LEN + 1]; ///<Client's identification string
1447  char_t serverId[SSH_MAX_ID_LEN + 1]; ///<Server's identification string
1448  uint8_t cookie[SSH_COOKIE_SIZE]; ///<Random value generated by the sender
1449  char_t user[SSH_MAX_USERNAME_LEN + 1]; ///<User name
1450 
1451 #if (SSH_SERVER_SUPPORT == ENABLED && SSH_PASSWORD_AUTH_SUPPORT == ENABLED)
1452  char_t passwordChangePrompt[SSH_MAX_PASSWORD_CHANGE_PROMPT_LEN + 1]; ///<Password change prompt string
1453 #endif
1454 
1455  const char_t *kexAlgo; ///<Selected key exchange algorithm name
1456  const char_t *serverHostKeyAlgo; ///<Selected server's host key algorithm name
1457  const char_t *clientEncAlgo; ///<Selected client's encryption algorithm name
1458  const char_t *serverEncAlgo; ///<Selected server's encryption algorithm name
1459  const char_t *clientMacAlgo; ///<Selected client's MAC algorithm name
1460  const char_t *serverMacAlgo; ///<Selected server's MAC algorithm name
1461  const char_t *clientCompressAlgo; ///<Selected client's encryption algorithm name
1462  const char_t *serverCompressAlgo; ///<Selected server's encryption algorithm name
1463  int_t hostKeyIndex; ///<Index of the selected host key
1464 #if (SSH_RSA_KEX_SUPPORT == ENABLED)
1465  int_t rsaKeyIndex; ///<Index of the transient RSA key to use
1466  uint8_t *serverHostKey; ///<Server's host key
1467  size_t serverHostKeyLen; ///<Length of the server's host key, in bytes
1468 #endif
1469 #if (SSH_DH_GEX_KEX_SUPPORT == ENABLED)
1470  int_t dhGexGroupIndex; ///<Index of the selected Diffie-Hellman group
1471 #endif
1472 
1473  uint8_t sessionId[SSH_MAX_HASH_DIGEST_SIZE]; ///<Session identifier
1474  size_t sessionIdLen; ///<Length of the session identifier, in bytes
1475  uint8_t h[SSH_MAX_HASH_DIGEST_SIZE]; ///<Exchange hash H
1476  size_t hLen; ///<Length of the exchange hash, in bytes
1477  uint8_t k[SSH_MAX_SHARED_SECRET_LEN]; ///<Shared secret K
1478  size_t kLen; ///<Length of the shared secret, in bytes
1479 
1480  const HashAlgo *hashAlgo; ///<Exchange hash algorithm
1481  HashContext hashContext; ///<Exchange hash context
1482 #if (SSH_HMAC_SUPPORT == ENABLED)
1483  HmacContext hmacContext; ///<HMAC context
1484 #endif
1485 #if (SSH_DH_KEX_SUPPORT == ENABLED || SSH_DH_GEX_KEX_SUPPORT == ENABLED)
1486  DhContext dhContext; ///<Diffie-Hellman context
1487 #endif
1488 #if (SSH_ECDH_KEX_SUPPORT == ENABLED || SSH_HYBRID_KEX_SUPPORT == ENABLED)
1489  EcdhContext ecdhContext; ///<ECDH context
1490 #endif
1491 #if (SSH_HYBRID_KEX_SUPPORT == ENABLED)
1492  KemContext kemContext; ///<KEM context
1493 #endif
1494 
1495  SshEncryptionEngine encryptionEngine; ///<Encryption engine
1496  SshEncryptionEngine decryptionEngine; ///<Decryption engine
1497 
1498  bool_t kexInitSent; ///<An SSH_MSG_KEXINIT message has been sent
1499  bool_t kexInitReceived; ///<An SSH_MSG_KEXINIT message has been received
1500  bool_t newKeysSent; ///<An SSH_MSG_NEWKEYS message has been sent
1501  bool_t newKeysReceived; ///<An SSH_MSG_NEWKEYS message has been received
1502  bool_t disconnectRequest; ///<Request for disconnection
1503  bool_t disconnectSent; ///<An SSH_MSG_DISCONNECT message has been sent
1504  bool_t disconnectReceived; ///<An SSH_MSG_DISCONNECT message has been received
1505  bool_t wrongGuess; ///<A wrong guessed key exchange packet follows
1506  uint_t authAttempts; ///<Number of authentication attempts
1507  bool_t publicKeyOk; ///<The provided host key is acceptable
1508  uint32_t localChannelNum; ///<Current channel number
1509 
1510 #if (SSH_EXT_INFO_SUPPORT == ENABLED)
1511  bool_t extInfoReceived; ///<"ext-info-c" or "ext-info-s" indicator has been received
1512 #endif
1513 #if (SSH_KEX_STRICT_SUPPORT == ENABLED)
1514  bool_t kexStrictReceived; ///<"strict KEX" pseudo-algorithm received
1515 #endif
1516 
1517  uint8_t buffer[SSH_BUFFER_SIZE]; ///<Internal buffer
1518  size_t txBufferLen; ///<Number of bytes that are pending to be sent
1519  size_t txBufferPos; ///<Current position in TX buffer
1520  size_t rxBufferLen; ///<Number of bytes available for reading
1521  size_t rxBufferPos; ///<Current position in RX buffer
1522 };
1523 
1524 
1525 /**
1526  * @brief SSH context
1527  **/
1528 
1530 {
1531  SshOperationMode mode; ///<Mode of operation (client or server)
1532  uint_t numConnections; ///<Maximum number of SSH connections
1533  SshConnection *connections; ///<SSH connections
1534  uint_t numChannels; ///<Maximum number of SSH channels
1535  SshChannel *channels; ///<SSH channels
1536  const PrngAlgo *prngAlgo; ///<Pseudo-random number generator to be used
1537  void *prngContext; ///<Pseudo-random number generator context
1538  SshHostKey hostKeys[SSH_MAX_HOST_KEYS]; ///<List of host keys
1539 
1540 #if (SSH_CLIENT_SUPPORT == ENABLED)
1543 #endif
1544 
1545 #if (SSH_SERVER_SUPPORT == ENABLED && SSH_RSA_KEX_SUPPORT == ENABLED)
1546  SshRsaKey rsaKeys[SSH_MAX_RSA_KEYS]; ///<Transient RSA keys (for RSA key exchange)
1547 #endif
1548 #if (SSH_SERVER_SUPPORT == ENABLED && SSH_DH_GEX_KEX_SUPPORT == ENABLED)
1550 #endif
1551 
1552  SshHostKeyVerifyCallback hostKeyVerifyCallback; ///<Host key verification callback
1553 #if (SSH_CERT_SUPPORT == ENABLED)
1554  SshCertVerifyCallback certVerifyCallback; ///<Certificate verification callback
1555  SshCaPublicKeyVerifyCallback caPublicKeyVerifyCallback; ///<CA public key verification callback
1556 #endif
1557 #if (SSH_PUBLIC_KEY_AUTH_SUPPORT == ENABLED)
1558  SshPublicKeyAuthCallback publicKeyAuthCallback; ///<Public key authentication callback
1559 #endif
1560 #if (SSH_PUBLIC_KEY_AUTH_SUPPORT == ENABLED && SSH_CERT_SUPPORT == ENABLED)
1561  SshCertAuthCallback certAuthCallback; ///<Certificate authentication callback
1562 #endif
1563 #if (SSH_PASSWORD_AUTH_SUPPORT == ENABLED)
1564  SshPasswordAuthCallback passwordAuthCallback; ///<Password authentication callback
1566 #endif
1567 #if (SSH_SIGN_CALLBACK_SUPPORT == ENABLED)
1568  SshSignGenCallback signGenCallback; ///<Signature generation callback
1569  SshSignVerifyCallback signVerifyCallback; ///<Signature verification callback
1570 #endif
1571 #if (SSH_ECDH_CALLBACK_SUPPORT == ENABLED)
1572  SshEcdhKeyPairGenCallback ecdhKeyPairGenCallback; ///<ECDH key pair generation callback
1573  SshEcdhSharedSecretCalcCallback ecdhSharedSecretCalcCallback; ///<ECDH shared secret calculation callback
1574 #endif
1576  void *globalReqParam[SSH_MAX_GLOBAL_REQ_CALLBACKS]; ///<Opaque pointer passed to the global request callback
1578  void *channelReqParam[SSH_MAX_CHANNEL_REQ_CALLBACKS]; ///<Opaque pointer passed to the channel request callback
1580  void *channelOpenParam[SSH_MAX_CHANNEL_OPEN_CALLBACKS]; ///<Opaque pointer passed to the channel open callback
1582  void *connectionOpenParam[SSH_MAX_CONN_OPEN_CALLBACKS]; ///<Opaque pointer passed to the connection open callback
1584  void *connectionCloseParam[SSH_MAX_CONN_CLOSE_CALLBACKS]; ///<Opaque pointer passed to the connection close callback
1585 #if (SSH_KEY_LOG_SUPPORT == ENABLED)
1586  SshKeyLogCallback keyLogCallback; ///<Key logging callback (for debugging purpose only)
1587 #endif
1588 
1589  OsMutex mutex; ///<Mutex preventing simultaneous access to the context
1590  OsEvent event; ///<Event object used to poll the sockets
1591  SocketEventDesc eventDesc[SSH_MAX_CONNECTIONS + 1]; ///<The events the application is interested in
1592 };
1593 
1594 
1595 /**
1596  * @brief Structure describing channel events
1597  **/
1598 
1599 typedef struct
1600 {
1601  SshChannel *channel; ///<Handle to a channel to monitor
1602  uint_t eventMask; ///<Requested events
1603  uint_t eventFlags; ///<Returned events
1605 
1606 
1607 //SSH related functions
1608 error_t sshInit(SshContext *context, SshConnection *connections,
1609  uint_t numConnections, SshChannel *channels, uint_t numChannels);
1610 
1612 
1613 error_t sshSetPrng(SshContext *context, const PrngAlgo *prngAlgo,
1614  void *prngContext);
1615 
1616 error_t sshSetUsername(SshContext *context, const char_t *username);
1617 error_t sshSetPassword(SshContext *context, const char_t *password);
1618 
1620  SshHostKeyVerifyCallback callback);
1621 
1623  SshCertVerifyCallback callback);
1624 
1626  SshCaPublicKeyVerifyCallback callback);
1627 
1629  SshPublicKeyAuthCallback callback);
1630 
1632  SshCertAuthCallback callback);
1633 
1635  SshPasswordAuthCallback callback);
1636 
1638  SshPasswordChangeCallback callback);
1639 
1641  SshSignGenCallback callback);
1642 
1644  SshSignVerifyCallback callback);
1645 
1647  SshEcdhKeyPairGenCallback callback);
1648 
1651 
1653  SshGlobalReqCallback callback, void *param);
1654 
1656  SshGlobalReqCallback callback);
1657 
1659  SshChannelReqCallback callback, void *param);
1660 
1662  SshChannelReqCallback callback);
1663 
1665  SshChannelOpenCallback callback, void *param);
1666 
1668  SshChannelOpenCallback callback);
1669 
1671  SshConnectionOpenCallback callback, void *param);
1672 
1674  SshConnectionOpenCallback callback);
1675 
1677  SshConnectionCloseCallback callback, void *param);
1678 
1680  SshConnectionCloseCallback callback);
1681 
1683  SshKeyLogCallback callback);
1684 
1685 error_t sshLoadRsaKey(SshContext *context, uint_t index,
1686  const char_t *publicKey, size_t publicKeyLen, const char_t *privateKey,
1687  size_t privateKeyLen, const char_t *password);
1688 
1689 error_t sshUnloadRsaKey(SshContext *context, uint_t index);
1690 
1691 error_t sshLoadDhGexGroup(SshContext *context, uint_t index,
1692  const char_t *dhParams, size_t dhParamsLen);
1693 
1694 error_t sshUnloadDhGexGroup(SshContext *context, uint_t index);
1695 
1696 error_t sshLoadHostKey(SshContext *context, uint_t index,
1697  const char_t *publicKey, size_t publicKeyLen, const char_t *privateKey,
1698  size_t privateKeyLen, const char_t *password);
1699 
1700 error_t sshUnloadHostKey(SshContext *context, uint_t index);
1701 
1703  const char_t *cert, size_t certLen, const char_t *privateKey,
1704  size_t privateKeyLen, const char_t *password);
1705 
1707 
1709  const char_t *prompt);
1710 
1712 
1714 
1715 error_t sshWriteChannel(SshChannel *channel, const void *data, size_t length,
1716  size_t *written, uint_t flags);
1717 
1718 error_t sshReadChannel(SshChannel *channel, void *data, size_t size,
1719  size_t *received, uint_t flags);
1720 
1722  OsEvent *extEvent, systime_t timeout);
1723 
1724 error_t sshSetExitStatus(SshChannel *channel, int32_t exitStatus);
1725 
1727 void sshDeleteChannel(SshChannel *channel);
1728 
1729 void sshDeinit(SshContext *context);
1730 
1731 //C++ guard
1732 #ifdef __cplusplus
1733 }
1734 #endif
1735 
1736 #endif
uint8_t h[SSH_MAX_HASH_DIGEST_SIZE]
Exchange hash H.
Definition: ssh.h:1475
const PrngAlgo * prngAlgo
Pseudo-random number generator to be used.
Definition: ssh.h:1536
bool_t closeSent
An SSH_MSG_CHANNEL_CLOSE message has been sent.
Definition: ssh.h:1427
@ SSH_FLAG_WAIT_ALL
Definition: ssh.h:959
SocketEventDesc eventDesc[SSH_MAX_CONNECTIONS+1]
The events the application is interested in.
Definition: ssh.h:1591
SshEcdhKeyPairGenCallback ecdhKeyPairGenCallback
ECDH key pair generation callback.
Definition: ssh.h:1572
size_t privateKeyLen
Length of the RSA private key.
Definition: ssh.h:1168
error_t(* SshChannelReqCallback)(SshChannel *channel, const SshString *type, const uint8_t *data, size_t length, void *param)
Channel request callback function.
Definition: ssh.h:1321
systime_t timeout
Timeout value.
Definition: ssh.h:1413
@ SSH_MSG_KEX_DH_REPLY
Definition: ssh.h:994
@ SSH_OPEN_RESOURCE_SHORTAGE
Definition: ssh.h:1068
size_t rxWindowSizeInc
Window size increment.
Definition: ssh.h:1421
Collection of key exchange algorithms.
Generic hash algorithm context.
char_t clientId[SSH_MAX_ID_LEN+1]
Client's identification string.
Definition: ssh.h:1446
#define SSH_MAX_CONN_CLOSE_CALLBACKS
Definition: ssh.h:220
int bool_t
Definition: compiler_port.h:63
uint8_t sessionId[]
Definition: tls.h:1941
HMAC algorithm context.
Definition: hmac.h:59
@ SSH_CONN_STATE_USER_AUTH_REPLY
Definition: ssh.h:1107
const char_t * clientEncAlgo
Selected client's encryption algorithm name.
Definition: ssh.h:1457
SshOperationMode
Mode of operation.
Definition: ssh.h:934
@ SSH_CONN_STATE_OPEN
Definition: ssh.h:1109
@ SSH_CONN_STATE_KEX_KEM_REPLY
Definition: ssh.h:1095
error_t sshLoadHostKey(SshContext *context, uint_t index, const char_t *publicKey, size_t publicKeyLen, const char_t *privateKey, size_t privateKeyLen, const char_t *password)
Load entity's host key.
Definition: ssh.c:1353
void * globalReqParam[SSH_MAX_GLOBAL_REQ_CALLBACKS]
Opaque pointer passed to the global request callback.
Definition: ssh.h:1576
SshGlobalReqCallback globalReqCallback[SSH_MAX_GLOBAL_REQ_CALLBACKS]
Global request callbacks.
Definition: ssh.h:1575
@ SSH_CHANNEL_EVENT_CONNECTED
Definition: ssh.h:1147
const char_t * clientMacAlgo
Selected client's MAC algorithm name.
Definition: ssh.h:1459
uint_t eventMask
Requested events.
Definition: ssh.h:1602
error_t sshUnloadDhGexGroup(SshContext *context, uint_t index)
Unload Diffie-Hellman group.
Definition: ssh.c:1311
error_t sshInit(SshContext *context, SshConnection *connections, uint_t numConnections, SshChannel *channels, uint_t numChannels)
SSH context initialization.
Definition: ssh.c:58
@ SSH_MSG_USERAUTH_PASSWD_CHANGEREQ
Definition: ssh.h:1013
error_t sshLoadCertificate(SshContext *context, uint_t index, const char_t *cert, size_t certLen, const char_t *privateKey, size_t privateKeyLen, const char_t *password)
Load entity's certificate.
Definition: ssh.c:1678
SshChannelState
SSH channel state.
Definition: ssh.h:1119
size_t serverHostKeyLen
Length of the server's host key, in bytes.
Definition: ssh.h:1467
signed int int_t
Definition: compiler_port.h:56
@ SSH_CONN_STATE_KEX_HYBRID_INIT
Definition: ssh.h:1096
@ SSH_AUTH_STATUS_FAILURE
Definition: ssh.h:946
error_t sshSetExitStatus(SshChannel *channel, int32_t exitStatus)
Set exit status.
Definition: ssh.c:2491
error_t(* SshCaPublicKeyVerifyCallback)(SshConnection *connection, const uint8_t *publicKey, size_t publicKeyLen)
CA public key verification callback function.
Definition: ssh.h:1235
void(* SshConnectionCloseCallback)(SshConnection *connection, void *param)
Connection close callback function.
Definition: ssh.h:1346
Binary string.
Definition: ssh_types.h:67
@ SSH_CONN_STATE_KEX_DH_GEX_REQUEST
Definition: ssh.h:1088
void(* SshKeyLogCallback)(SshConnection *connection, const char_t *key)
Key logging callback function (for debugging purpose only)
Definition: ssh.h:1354
const char_t * privateKey
Private key (PEM or OpenSSH format)
Definition: ssh.h:1194
#define PrngAlgo
Definition: crypto.h:1049
error_t sshSetPrng(SshContext *context, const PrngAlgo *prngAlgo, void *prngContext)
Set the pseudo-random number generator to be used.
Definition: ssh.c:193
@ SSH_CONN_STATE_SERVER_EXT_INFO_2
Definition: ssh.h:1102
void * connectionOpenParam[SSH_MAX_CONN_OPEN_CALLBACKS]
Opaque pointer passed to the connection open callback.
Definition: ssh.h:1582
const char_t * publicKeyAlgo
Public key algorithm.
Definition: ssh.h:1209
@ SSH_CONN_STATE_KEX_RSA_SECRET
Definition: ssh.h:1084
bool_t closeReceived
An SSH_MSG_CHANNEL_CLOSE message has been received.
Definition: ssh.h:1428
SshChannelEvent
SSH channel events.
Definition: ssh.h:1145
uint8_t p
Definition: ndp.h:300
const HashAlgo * hashAlgo
Hash algorithm for MAC operations.
Definition: ssh.h:1367
size_t rxBufferLen
Number of bytes available for reading.
Definition: ssh.h:1520
uint8_t message[]
Definition: chap.h:154
SshContext * context
SSH context.
Definition: ssh.h:1407
@ SSH_CONN_STATE_SERVICE_ACCEPT
Definition: ssh.h:1104
@ SSH_MSG_KEX_HYBRID_INIT
Definition: ssh.h:1004
@ SSH_AUTH_STATUS_SUCCESS
Definition: ssh.h:947
Collection of AEAD algorithms.
@ SSH_DISCONNECT_COMPRESSION_ERROR
Definition: ssh.h:1046
@ SSH_FLAG_BREAK_CHAR
Definition: ssh.h:960
#define SSH_MAX_CHANNEL_OPEN_CALLBACKS
Definition: ssh.h:206
uint8_t data[]
Definition: ethernet.h:224
error_t(* SshCertAuthCallback)(SshConnection *connection, const char_t *user, const SshCertificate *cert)
Certificate authentication callback function.
Definition: ssh.h:1251
@ SSH_DISCONNECT_MAC_ERROR
Definition: ssh.h:1045
SshSignVerifyCallback signVerifyCallback
Signature verification callback.
Definition: ssh.h:1569
size_t txBufferPos
Current position in TX buffer.
Definition: ssh.h:1519
Event object.
const char_t * publicKey
RSA public key (PEM, SSH2 or OpenSSH format)
Definition: ssh.h:1165
Generic cipher algorithm context.
@ SSH_MSG_CHANNEL_FAILURE
Definition: ssh.h:1029
GcmContext gcmContext
GCM context.
Definition: ssh.h:1377
OsEvent event
Event object used to poll the sockets.
Definition: ssh.h:1590
size_t threshold
Definition: ssh.h:1393
error_t sshUnloadCertificate(SshContext *context, uint_t index)
Unload entity's certificate.
Definition: ssh.c:1899
size_t macSize
Size of the MAC tag, in bytes.
Definition: ssh.h:1369
uint_t eventFlags
Returned events.
Definition: ssh.h:1603
size_t rxWindowSize
RX flow-control window.
Definition: ssh.h:1420
error_t sshRegisterEcdhSharedSecretCalcCallback(SshContext *context, SshEcdhSharedSecretCalcCallback callback)
Register ECDH shared secret calculation callback function.
Definition: ssh.c:586
SshConnectionState
SSH connection state.
Definition: ssh.h:1077
void * channelReqParam[SSH_MAX_CHANNEL_REQ_CALLBACKS]
Opaque pointer passed to the channel request callback.
Definition: ssh.h:1578
uint8_t type
Definition: coap_common.h:176
@ SSH_MSG_CHANNEL_SUCCESS
Definition: ssh.h:1028
bool_t eofRequest
Channel EOF request.
Definition: ssh.h:1423
@ SSH_DISCONNECT_HOST_KEY_NOT_VERIFIABLE
Definition: ssh.h:1049
Transient RSA key (for RSA key exchange)
Definition: ssh.h:1163
error_t sshUnregisterConnectionOpenCallback(SshContext *context, SshConnectionOpenCallback callback)
Unregister connection open callback function.
Definition: ssh.c:926
SshConnectionCloseCallback connectionCloseCallback[SSH_MAX_CONN_CLOSE_CALLBACKS]
Connection close callback function.
Definition: ssh.h:1583
SshChannel * channel
Handle to a channel to monitor.
Definition: ssh.h:1601
SshChannelBuffer txBuffer
TX buffer.
Definition: ssh.h:1417
char_t name[]
@ SSH_MSG_CHANNEL_OPEN_CONFIRMATION
Definition: ssh.h:1020
@ SSH_MSG_REQUEST_FAILURE
Definition: ssh.h:1018
size_t txBufferLen
Number of bytes that are pending to be sent.
Definition: ssh.h:1518
size_t txWindowSize
TX flow-control window.
Definition: ssh.h:1419
#define SSH_MAX_SHARED_SECRET_LEN
Definition: ssh.h:878
const char_t * privateKey
RSA private key (PEM or OpenSSH format)
Definition: ssh.h:1167
SSH channel buffer.
Definition: ssh.h:1390
error_t sshRegisterCaPublicKeyVerifyCallback(SshContext *context, SshCaPublicKeyVerifyCallback callback)
Register CA public key verification callback function.
Definition: ssh.c:338
error_t sshLoadDhGexGroup(SshContext *context, uint_t index, const char_t *dhParams, size_t dhParamsLen)
Load Diffie-Hellman group.
Definition: ssh.c:1234
SshCaPublicKeyVerifyCallback caPublicKeyVerifyCallback
CA public key verification callback.
Definition: ssh.h:1555
SshMessageType
SSH message types.
Definition: ssh.h:976
SshConnection * connection
SSH connection.
Definition: ssh.h:1408
error_t sshRegisterPasswordChangeCallback(SshContext *context, SshPasswordChangeCallback callback)
Register password change callback function.
Definition: ssh.c:462
@ SSH_MSG_KEX_KEM_INIT
Definition: ssh.h:1002
@ SSH_CONN_STATE_KEX_DH_GEX_GROUP
Definition: ssh.h:1089
@ SSH_MSG_NEWCOMPRESS
Definition: ssh.h:985
@ SSH_CONN_STATE_KEX_HYBRID_REPLY
Definition: ssh.h:1097
@ SSH_CONN_STATE_SERVER_EXT_INFO_1
Definition: ssh.h:1101
Structure describing socket events.
Definition: socket.h:433
char_t username[SSH_MAX_USERNAME_LEN+1]
User name.
Definition: ssh.h:1541
uint_t eventFlags
Definition: ssh.h:1411
uint_t numChannels
Maximum number of SSH channels.
Definition: ssh.h:1534
SshCertVerifyCallback certVerifyCallback
Certificate verification callback.
Definition: ssh.h:1554
Encryption engine.
Definition: ssh.h:1363
#define SSH_MAX_CIPHER_BLOCK_SIZE
Definition: ssh.h:780
@ SSH_OPEN_ADMINISTRATIVELY_PROHIBITED
Definition: ssh.h:1065
@ SSH_CHANNEL_EVENT_CLOSED
Definition: ssh.h:1148
@ SSH_CONN_STATE_DISCONNECT
Definition: ssh.h:1110
error_t sshRegisterPasswordAuthCallback(SshContext *context, SshPasswordAuthCallback callback)
Register password authentication callback function.
Definition: ssh.c:431
@ SSH_MSG_KEX_DH_GEX_REPLY
Definition: ssh.h:999
@ SSH_REQUEST_STATE_PENDING
Definition: ssh.h:1134
uint32_t remoteChannelNum
Remote channel number.
Definition: ssh.h:1415
error_t sshUnregisterGlobalRequestCallback(SshContext *context, SshGlobalReqCallback callback)
Unregister global request callback function.
Definition: ssh.c:665
@ SSH_CHANNEL_EVENT_TX_READY
Definition: ssh.h:1149
uint_t numConnections
Maximum number of SSH connections.
Definition: ssh.h:1532
int_t dhGexGroupIndex
Index of the selected Diffie-Hellman group.
Definition: ssh.h:1470
SshAuthStatus
Authentication status.
Definition: ssh.h:945
bool_t eofReceived
An SSH_MSG_CHANNEL_EOF message has been received.
Definition: ssh.h:1425
@ SSH_DISCONNECT_BY_APPLICATION
Definition: ssh.h:1051
error_t sshUnloadRsaKey(SshContext *context, uint_t index)
Unload transient RSA key (for RSA key exchange)
Definition: ssh.c:1197
@ SSH_MSG_CHANNEL_DATA
Definition: ssh.h:1023
@ SSH_CHANNEL_EVENT_TX_SHUTDOWN
Definition: ssh.h:1152
Diffie-Hellman context.
Definition: dh.h:60
error_t sshReadChannel(SshChannel *channel, void *data, size_t size, size_t *received, uint_t flags)
Receive data from the specified channel.
Definition: ssh.c:2206
void * channelOpenParam[SSH_MAX_CHANNEL_OPEN_CALLBACKS]
Opaque pointer passed to the channel open callback.
Definition: ssh.h:1580
@ SSH_MSG_KEX_DH_INIT
Definition: ssh.h:993
@ SSH_MSG_GLOBAL_REQUEST
Definition: ssh.h:1016
@ SSH_DISCONNECT_HOST_NOT_ALLOWED_TO_CONNECT
Definition: ssh.h:1041
#define SshContext
Definition: ssh.h:913
error_t sshUnloadHostKey(SshContext *context, uint_t index)
Unload entity's host key.
Definition: ssh.c:1615
const char_t * keyFormatId
Key format identifier.
Definition: ssh.h:1191
@ SSH_MSG_NEWKEYS
Definition: ssh.h:987
int32_t exitStatus
Exit status of the command.
Definition: ssh.h:1429
@ SSH_MSG_INVALID
Definition: ssh.h:977
size_t kLen
Length of the shared secret, in bytes.
Definition: ssh.h:1478
size_t hLen
Length of the exchange hash, in bytes.
Definition: ssh.h:1476
error_t sshCloseChannel(SshChannel *channel)
Close channel.
Definition: ssh.c:2511
error_t
Error codes.
Definition: error.h:43
uint32_t seqNum
Definition: tcp.h:348
error_t sshLoadRsaKey(SshContext *context, uint_t index, const char_t *publicKey, size_t publicKeyLen, const char_t *privateKey, size_t privateKeyLen, const char_t *password)
Load transient RSA key (for RSA key exchange)
Definition: ssh.c:1087
@ SSH_MSG_KEX_HYBRID_REPLY
Definition: ssh.h:1005
SSH connection.
Definition: ssh.h:1439
CipherMode cipherMode
Cipher mode of operation.
Definition: ssh.h:1364
uint8_t cookie[SSH_COOKIE_SIZE]
Random value generated by the sender.
Definition: ssh.h:1448
bool_t closeRequest
Channel close request.
Definition: ssh.h:1426
error_t(* SshGlobalReqCallback)(SshConnection *connection, const SshString *name, const uint8_t *data, size_t length, void *param)
Global request callback function.
Definition: ssh.h:1313
KEM context.
Definition: kem.h:68
@ SSH_MSG_USERAUTH_INFO_RESPONSE
Definition: ssh.h:1015
bool_t disconnectRequest
Request for disconnection.
Definition: ssh.h:1502
@ SSH_MSG_CHANNEL_CLOSE
Definition: ssh.h:1026
SshRsaKey rsaKeys[SSH_MAX_RSA_KEYS]
Transient RSA keys (for RSA key exchange)
Definition: ssh.h:1546
#define SSH_MAX_ID_LEN
Definition: ssh.h:248
@ SSH_MSG_USERAUTH_PK_OK
Definition: ssh.h:1012
error_t sshRegisterSignGenCallback(SshContext *context, SshSignGenCallback callback)
Register signature generation callback function.
Definition: ssh.c:493
uint32_t localChannelNum
Current channel number.
Definition: ssh.h:1508
@ SSH_OPERATION_MODE_SERVER
Definition: ssh.h:936
@ SSH_CONN_STATE_KEX_KEM_INIT
Definition: ssh.h:1094
error_t(* SshChannelOpenCallback)(SshConnection *connection, const SshString *type, uint32_t senderChannel, uint32_t initialWindowSize, uint32_t maxPacketSize, const uint8_t *data, size_t length, void *param)
Channel open callback function.
Definition: ssh.h:1329
uint_t authAttempts
Number of authentication attempts.
Definition: ssh.h:1506
bool_t kexInitReceived
An SSH_MSG_KEXINIT message has been received.
Definition: ssh.h:1499
#define SSH_MAX_RSA_KEYS
Definition: ssh.h:689
@ SSH_OPERATION_MODE_CLIENT
Definition: ssh.h:935
@ SSH_MSG_KEXRSA_DONE
Definition: ssh.h:992
size_t publicKeyLen
Length of the RSA public key.
Definition: ssh.h:1166
@ SSH_MSG_KEX_DH_GEX_REQUEST_OLD
Definition: ssh.h:995
const char_t * publicKey
Public key (PEM, SSH2 or OpenSSH format)
Definition: ssh.h:1192
@ SSH_CONN_STATE_KEX_ECDH_INIT
Definition: ssh.h:1092
Diffie-Hellman group.
Definition: ssh.h:1178
const CipherAlgo * cipherAlgo
Cipher algorithm.
Definition: ssh.h:1365
bool_t publicKeyOk
The provided host key is acceptable.
Definition: ssh.h:1507
@ SSH_FLAG_NO_DELAY
Definition: ssh.h:962
size_t writePos
Definition: ssh.h:1394
EcdhContext ecdhContext
ECDH context.
Definition: ssh.h:1489
@ SSH_FLAG_DELAY
Definition: ssh.h:963
char_t passwordChangePrompt[SSH_MAX_PASSWORD_CHANGE_PROMPT_LEN+1]
Password change prompt string.
Definition: ssh.h:1452
@ SSH_MSG_SERVICE_REQUEST
Definition: ssh.h:982
bool_t kexStrictReceived
"strict KEX" pseudo-algorithm received
Definition: ssh.h:1514
const char_t * kexAlgo
Selected key exchange algorithm name.
Definition: ssh.h:1455
error_t(* SshCertVerifyCallback)(SshConnection *connection, const SshCertificate *cert)
Certificate verification callback function.
Definition: ssh.h:1227
SshChannelBuffer rxBuffer
RX buffer.
Definition: ssh.h:1418
Host key.
Definition: ssh.h:1190
uint_t eventMask
Definition: ssh.h:1410
const char_t * dhParams
Diffie-Hellman parameters (PEM format)
Definition: ssh.h:1180
error_t sshPollChannels(SshChannelEventDesc *eventDesc, uint_t size, OsEvent *extEvent, systime_t timeout)
Wait for one of a set of channels to become ready to perform I/O.
Definition: ssh.c:2402
error_t sshRegisterKeyLogCallback(SshContext *context, SshKeyLogCallback callback)
Register key logging callback function (for debugging purpose only)
Definition: ssh.c:1052
bool_t etm
Encrypt-then-MAC.
Definition: ssh.h:1370
@ SSH_MSG_USERAUTH_REQUEST
Definition: ssh.h:1006
bool_t eofSent
An SSH_MSG_CHANNEL_EOF message has been sent.
Definition: ssh.h:1424
General definitions for cryptographic algorithms.
SshAuthStatus(* SshPasswordChangeCallback)(SshConnection *connection, const char_t *user, const char_t *oldPassword, size_t oldPasswordLen, const char_t *newPassword, size_t newPasswordLen)
Password change callback function.
Definition: ssh.h:1267
CipherContext cipherContext
Cipher context.
Definition: ssh.h:1366
error_t(* SshEcdhKeyPairGenCallback)(SshConnection *connection, const char_t *kexAlgo, EcPublicKey *publicKey)
ECDH key pair generation callback.
Definition: ssh.h:1296
@ SSH_CHANNEL_STATE_OPEN
Definition: ssh.h:1122
SSH certificate parsing.
@ SSH_CONN_STATE_KEX_ECDH_REPLY
Definition: ssh.h:1093
@ SSH_MSG_USERAUTH_FAILURE
Definition: ssh.h:1007
const char_t * serverEncAlgo
Selected server's encryption algorithm name.
Definition: ssh.h:1458
@ SSH_MSG_DEBUG
Definition: ssh.h:981
SshEncryptionEngine encryptionEngine
Encryption engine.
Definition: ssh.h:1495
SshHostKey hostKeys[SSH_MAX_HOST_KEYS]
List of host keys.
Definition: ssh.h:1538
@ SSH_MSG_PING
Definition: ssh.h:1030
uint8_t iv[]
Definition: ike.h:1659
@ SSH_CONN_STATE_KEX_RSA_PUB_KEY
Definition: ssh.h:1083
error_t sshRegisterChannelOpenCallback(SshContext *context, SshChannelOpenCallback callback, void *param)
Register channel open callback function.
Definition: ssh.c:792
error_t sshRegisterHostKeyVerifyCallback(SshContext *context, SshHostKeyVerifyCallback callback)
Register host key verification callback function.
Definition: ssh.c:281
SshDisconnectReasonCode
Disconnection messages reason codes.
Definition: ssh.h:1040
Block cipher modes of operation.
@ SSH_CONN_STATE_CLIENT_ID
Definition: ssh.h:1079
@ SSH_MSG_CHANNEL_OPEN_FAILURE
Definition: ssh.h:1021
size_t publicKeyLen
Length of the public key.
Definition: ssh.h:1193
error_t sshSetPassword(SshContext *context, const char_t *password)
Set the password to be used for authentication.
Definition: ssh.c:251
HashContext hashContext
Exchange hash context.
Definition: ssh.h:1481
error_t sshUnregisterChannelOpenCallback(SshContext *context, SshChannelOpenCallback callback)
Unregister channel open callback function.
Definition: ssh.c:839
error_t sshUnregisterChannelRequestCallback(SshContext *context, SshChannelReqCallback callback)
Unregister channel request callback function.
Definition: ssh.c:752
#define SSH_CHANNEL_BUFFER_SIZE
Definition: ssh.h:241
@ SSH_MSG_USERAUTH_BANNER
Definition: ssh.h:1009
@ SSH_DISCONNECT_CONNECTION_LOST
Definition: ssh.h:1050
Host key algorithm.
Definition: ssh.h:1208
@ SSH_REQUEST_STATE_IDLE
Definition: ssh.h:1133
error_t(* SshEcdhSharedSecretCalcCallback)(SshConnection *connection, const char_t *kexAlgo, const EcPublicKey *publicKey, uint8_t *output, size_t *outputLen)
ECDH shared secret calculation callback.
Definition: ssh.h:1304
@ SSH_MSG_DISCONNECT
Definition: ssh.h:978
SshPasswordChangeCallback passwordChangeCallback
Password change callback.
Definition: ssh.h:1565
bool_t newKeysReceived
An SSH_MSG_NEWKEYS message has been received.
Definition: ssh.h:1501
error_t sshWriteChannel(SshChannel *channel, const void *data, size_t length, size_t *written, uint_t flags)
Write data to the specified channel.
Definition: ssh.c:2077
uint8_t length
Definition: tcp.h:375
#define SSH_MAX_HOST_KEYS
Definition: ssh.h:178
@ SSH_CHANNEL_EVENT_TIMEOUT
Definition: ssh.h:1146
error_t sshRegisterConnectionCloseCallback(SshContext *context, SshConnectionCloseCallback callback, void *param)
Register connection close callback function.
Definition: ssh.c:966
error_t sshRegisterConnectionOpenCallback(SshContext *context, SshConnectionOpenCallback callback, void *param)
Register connection open callback function.
Definition: ssh.c:879
@ SSH_CONN_STATE_SERVER_NEW_KEYS
Definition: ssh.h:1099
@ SSH_AUTH_STATUS_PASSWORD_EXPIRED
Definition: ssh.h:948
SshChannelOpenCallback channelOpenCallback[SSH_MAX_CHANNEL_OPEN_CALLBACKS]
Channel open callbacks.
Definition: ssh.h:1579
CipherMode
Cipher operation modes.
Definition: crypto.h:1073
uint8_t buffer[SSH_BUFFER_SIZE]
Internal buffer.
Definition: ssh.h:1517
bool_t kexInitSent
An SSH_MSG_KEXINIT message has been sent.
Definition: ssh.h:1498
String.
Definition: ssh_types.h:56
@ SSH_DISCONNECT_PROTOCOL_VERSION_NOT_SUPPORTED
Definition: ssh.h:1048
@ SSH_DISCONNECT_NO_MORE_AUTH_METHODS_AVAILABLE
Definition: ssh.h:1054
error_t(* SshConnectionOpenCallback)(SshConnection *connection, void *param)
Connection open callback function.
Definition: ssh.h:1338
error_t(* SshSignVerifyCallback)(SshConnection *connection, const SshString *publicKeyAlgo, const SshBinaryString *publicKeyBlob, const SshBinaryString *sessionId, const SshBinaryString *message, const SshBinaryString *signatureBlob)
Signature verification callback function.
Definition: ssh.h:1286
@ SSH_MSG_USERAUTH_SUCCESS
Definition: ssh.h:1008
size_t rxBufferPos
Current position in RX buffer.
Definition: ssh.h:1521
@ SSH_CONN_STATE_CLOSED
Definition: ssh.h:1078
@ SSH_CHANNEL_EVENT_TX_DONE
Definition: ssh.h:1150
bool_t extInfoReceived
"ext-info-c" or "ext-info-s" indicator has been received
Definition: ssh.h:1511
const char_t * clientCompressAlgo
Selected client's encryption algorithm name.
Definition: ssh.h:1461
#define SSH_MAX_PASSWORD_CHANGE_PROMPT_LEN
Definition: ssh.h:269
@ SSH_DISCONNECT_SERVICE_NOT_AVAILABLE
Definition: ssh.h:1047
#define SSH_MAX_HASH_DIGEST_SIZE
Definition: ssh.h:817
error_t sshSetPasswordChangePrompt(SshConnection *connection, const char_t *prompt)
Set password change prompt message.
Definition: ssh.c:1959
uint8_t * serverHostKey
Server's host key.
Definition: ssh.h:1466
uint8_t k[SSH_MAX_SHARED_SECRET_LEN]
Shared secret K.
Definition: ssh.h:1477
Collection of hash algorithms.
@ SSH_CONN_STATE_USER_AUTH_SUCCESS
Definition: ssh.h:1108
Mutex object.
@ SSH_REQUEST_STATE_FAILURE
Definition: ssh.h:1136
const char_t * keyFormatId
Key format identifier.
Definition: ssh.h:1210
@ SSH_CONN_STATE_CLIENT_NEW_KEYS
Definition: ssh.h:1098
error_t sshSetUsername(SshContext *context, const char_t *username)
Set the user name to be used for authentication.
Definition: ssh.c:221
uint32_t systime_t
System time.
#define SSH_MAX_CONNECTIONS
Definition: ssh.h:185
@ SSH_DISCONNECT_PROTOCOL_ERROR
Definition: ssh.h:1042
bool_t channelSuccessSent
An SSH_MSG_CHANNEL_SUCCESS message has been sent.
Definition: ssh.h:1422
EC public key.
Definition: ec.h:421
int_t hostKeyIndex
Index of the selected host key.
Definition: ssh.h:1463
void * connectionCloseParam[SSH_MAX_CONN_CLOSE_CALLBACKS]
Opaque pointer passed to the connection close callback.
Definition: ssh.h:1584
#define SSH_MAX_PASSWORD_LEN
Definition: ssh.h:262
SshKeyLogCallback keyLogCallback
Key logging callback (for debugging purpose only)
Definition: ssh.h:1586
char char_t
Definition: compiler_port.h:55
char_t serverId[SSH_MAX_ID_LEN+1]
Server's identification string.
Definition: ssh.h:1447
GCM context.
Definition: gcm.h:64
#define SSH_MAX_GLOBAL_REQ_CALLBACKS
Definition: ssh.h:192
SshConnection * connections
SSH connections.
Definition: ssh.h:1533
const char_t * publicKeyAlgo
Public key algorithm to use during user authentication.
Definition: ssh.h:1198
@ SSH_MSG_CHANNEL_OPEN
Definition: ssh.h:1019
@ SSH_OPEN_CONNECT_FAILED
Definition: ssh.h:1066
#define SSH_MAX_ENC_KEY_SIZE
Definition: ssh.h:773
SshRequestState
SSH request states.
Definition: ssh.h:1132
KemContext kemContext
KEM context.
Definition: ssh.h:1492
@ SSH_DISCONNECT_AUTH_CANCELLED_BY_USER
Definition: ssh.h:1053
size_t readPos
Definition: ssh.h:1395
@ SSH_REQUEST_STATE_SUCCESS
Definition: ssh.h:1135
@ SSH_CHANNEL_EVENT_RX_SHUTDOWN
Definition: ssh.h:1154
@ SSH_CONN_STATE_SERVER_KEX_INIT
Definition: ssh.h:1082
SshChannelFlags
Flags used by read and write functions.
Definition: ssh.h:957
error_t(* SshPublicKeyAuthCallback)(SshConnection *connection, const char_t *user, const uint8_t *publicKey, size_t publicKeyLen)
Public key authentication callback function.
Definition: ssh.h:1243
@ SSH_CONN_STATE_SERVER_ID
Definition: ssh.h:1080
@ SSH_CONN_STATE_KEX_DH_INIT
Definition: ssh.h:1086
error_t sshRegisterCertAuthCallback(SshContext *context, SshCertAuthCallback callback)
Register certificate authentication callback function.
Definition: ssh.c:400
@ SSH_MSG_CHANNEL_REQUEST
Definition: ssh.h:1027
const HashAlgo * hashAlgo
Exchange hash algorithm.
Definition: ssh.h:1480
@ SSH_CONN_STATE_CLIENT_EXT_INFO
Definition: ssh.h:1100
SSH data type representations.
Structure describing channel events.
Definition: ssh.h:1600
@ SSH_DISCONNECT_KEY_EXCHANGE_FAILED
Definition: ssh.h:1043
@ SSH_CHANNEL_EVENT_RX_READY
Definition: ssh.h:1153
@ SSH_CONN_STATE_KEX_RSA_DONE
Definition: ssh.h:1085
const char_t * serverHostKeyAlgo
Selected server's host key algorithm name.
Definition: ssh.h:1456
HmacContext hmacContext
HMAC context.
Definition: ssh.h:1483
@ SSH_CONN_STATE_SERVICE_REQUEST
Definition: ssh.h:1103
#define SshConnection
Definition: ssh.h:917
@ SSH_FLAG_EOF
Definition: ssh.h:958
Legacy definitions.
@ SSH_MSG_CHANNEL_EOF
Definition: ssh.h:1025
SshOpenFailureReasonCode
Channel connection failure reason codes.
Definition: ssh.h:1064
#define SSH_MAX_CONN_OPEN_CALLBACKS
Definition: ssh.h:213
@ SSH_CONN_STATE_USER_AUTH_REQUEST
Definition: ssh.h:1106
SshRequestState requestState
Channel request state.
Definition: ssh.h:1406
error_t sshUnregisterConnectionCloseCallback(SshContext *context, SshConnectionCloseCallback callback)
Unregister connection close callback function.
Definition: ssh.c:1013
@ SSH_MSG_CHANNEL_WINDOW_ADJUST
Definition: ssh.h:1022
@ SSH_MSG_KEX_DH_GEX_INIT
Definition: ssh.h:998
@ SSH_CHANNEL_STATE_RESERVED
Definition: ssh.h:1121
@ SSH_MSG_KEXRSA_PUBKEY
Definition: ssh.h:990
error_t sshRegisterChannelRequestCallback(SshContext *context, SshChannelReqCallback callback, void *param)
Register channel request callback function.
Definition: ssh.c:705
bool_t exitStatusSent
An SSH_MSG_CHANNEL_REQUEST with the exit status has been sent.
Definition: ssh.h:1430
#define Socket
Definition: socket.h:36
systime_t timestamp
Time stamp to manage connection timeout.
Definition: ssh.h:1444
@ SSH_CONN_STATE_CLIENT_KEX_INIT
Definition: ssh.h:1081
#define SSH_MAX_DH_GEX_GROUPS
Definition: ssh.h:696
@ SSH_MSG_KEX_ECDH_INIT
Definition: ssh.h:1000
@ SSH_MSG_PONG
Definition: ssh.h:1031
error_t sshSetOperationMode(SshContext *context, SshOperationMode mode)
Set operation mode (client or server)
Definition: ssh.c:167
size_t sessionIdLen
Length of the session identifier, in bytes.
Definition: ssh.h:1474
@ SSH_FLAG_BREAK_CRLF
Definition: ssh.h:961
@ SSH_CONN_STATE_KEX_DH_GEX_REPLY
Definition: ssh.h:1091
OsEvent * userEvent
Definition: ssh.h:1412
@ SSH_MSG_USERAUTH_INFO_REQUEST
Definition: ssh.h:1014
uint8_t sessionId[SSH_MAX_HASH_DIGEST_SIZE]
Session identifier.
Definition: ssh.h:1473
uint32_t localChannelNum
Local channel number.
Definition: ssh.h:1414
Common interface for encryption algorithms.
Definition: crypto.h:1205
error_t sshRegisterCertVerifyCallback(SshContext *context, SshCertVerifyCallback callback)
Register certificate verification callback function.
Definition: ssh.c:307
#define SSH_MAX_CHANNEL_REQ_CALLBACKS
Definition: ssh.h:199
SshAuthStatus(* SshPasswordAuthCallback)(SshConnection *connection, const char_t *user, const char_t *password, size_t passwordLen)
Password authentication callback function.
Definition: ssh.h:1259
@ SSH_MSG_KEX_DH_GEX_REQUEST
Definition: ssh.h:996
SshCertAuthCallback certAuthCallback
Certificate authentication callback.
Definition: ssh.h:1561
@ SSH_MSG_REQUEST_SUCCESS
Definition: ssh.h:1017
@ SSH_MSG_IGNORE
Definition: ssh.h:979
char_t password[SSH_MAX_PASSWORD_LEN+1]
Password.
Definition: ssh.h:1542
const char_t * serverCompressAlgo
Selected server's encryption algorithm name.
Definition: ssh.h:1462
Collection of MAC algorithms.
void sshDeleteChannel(SshChannel *channel)
Release channel.
Definition: ssh.c:2582
bool_t disconnectSent
An SSH_MSG_DISCONNECT message has been sent.
Definition: ssh.h:1503
SshChannelReqCallback channelReqCallback[SSH_MAX_CHANNEL_REQ_CALLBACKS]
Channel request callbacks.
Definition: ssh.h:1577
@ SSH_CONN_STATE_KEX_DH_REPLY
Definition: ssh.h:1087
size_t privateKeyLen
Length of the private key.
Definition: ssh.h:1195
@ SSH_MSG_KEX_MAX
Definition: ssh.h:989
SshConnectionOpenCallback connectionOpenCallback[SSH_MAX_CONN_OPEN_CALLBACKS]
Connection open callback function.
Definition: ssh.h:1581
uint_t dhModulusSize
Length of the prime modulus, in bits.
Definition: ssh.h:1179
@ SSH_DISCONNECT_RESERVED
Definition: ssh.h:1044
@ SSH_MSG_SERVICE_ACCEPT
Definition: ssh.h:983
HmacContext * hmacContext
HMAC context.
Definition: ssh.h:1368
Common interface for hash algorithms.
Definition: crypto.h:1165
@ SSH_MSG_KEXRSA_SECRET
Definition: ssh.h:991
SshChannelState state
Channel state.
Definition: ssh.h:1405
error_t sshRegisterEcdhKeyPairGenCallback(SshContext *context, SshEcdhKeyPairGenCallback callback)
Register ECDH key pair generation callback function.
Definition: ssh.c:555
@ SSH_CONN_STATE_KEX_DH_GEX_INIT
Definition: ssh.h:1090
bool_t newKeysSent
An SSH_MSG_NEWKEYS message has been sent.
Definition: ssh.h:1500
@ SSH_MSG_UNIMPLEMENTED
Definition: ssh.h:980
@ SSH_OPEN_UNKNOWN_CHANNEL_TYPE
Definition: ssh.h:1067
void * prngContext
Pseudo-random number generator context.
Definition: ssh.h:1537
OsMutex mutex
Mutex preventing simultaneous access to the context.
Definition: ssh.h:1589
@ SSH_MSG_KEX_KEM_REPLY
Definition: ssh.h:1003
@ SSH_MSG_USERAUTH_MAX
Definition: ssh.h:1011
SshRequestState requestState
Global request state.
Definition: ssh.h:1441
uint8_t flags
Definition: tcp.h:358
const char_t * serverMacAlgo
Selected server's MAC algorithm name.
Definition: ssh.h:1460
#define SSH_COOKIE_SIZE
Definition: ssh.h:902
SshPasswordAuthCallback passwordAuthCallback
Password authentication callback.
Definition: ssh.h:1564
error_t sshRegisterSignVerifyCallback(SshContext *context, SshSignVerifyCallback callback)
Register signature verification callback function.
Definition: ssh.c:524
int_t rsaKeyIndex
Index of the transient RSA key to use.
Definition: ssh.h:1465
SshSignGenCallback signGenCallback
Signature generation callback.
Definition: ssh.h:1568
SshDhGexGroup dhGexGroups[SSH_MAX_DH_GEX_GROUPS]
Diffie-Hellman groups.
Definition: ssh.h:1549
unsigned int uint_t
Definition: compiler_port.h:57
@ SSH_MSG_EXT_INFO
Definition: ssh.h:984
@ SSH_CHANNEL_STATE_CLOSED
Definition: ssh.h:1123
bool_t disconnectReceived
An SSH_MSG_DISCONNECT message has been received.
Definition: ssh.h:1504
TCP/IP stack core.
SshContext * context
SSH context.
Definition: ssh.h:1442
SshChannel * sshCreateChannel(SshConnection *connection)
Create a new SSH channel.
Definition: ssh.c:1989
char_t user[SSH_MAX_USERNAME_LEN+1]
User name.
Definition: ssh.h:1449
@ SSH_MSG_KEX_ECDH_REPLY
Definition: ssh.h:1001
size_t length
Definition: ssh.h:1392
@ SSH_MSG_USERAUTH_MIN
Definition: ssh.h:1010
error_t(* SshSignGenCallback)(SshConnection *connection, const char_t *publicKeyAlgo, const SshHostKey *hostKey, const SshBinaryString *sessionId, const SshBinaryString *message, uint8_t *p, size_t *written)
Signature generation callback function.
Definition: ssh.h:1276
@ SSH_MSG_KEX_DH_GEX_GROUP
Definition: ssh.h:997
SshEncryptionEngine decryptionEngine
Decryption engine.
Definition: ssh.h:1496
SshPublicKeyAuthCallback publicKeyAuthCallback
Public key authentication callback.
Definition: ssh.h:1558
OsEvent event
Definition: ssh.h:1409
error_t(* SshHostKeyVerifyCallback)(SshConnection *connection, const uint8_t *hostKey, size_t hostKeyLen)
Host key verification callback function.
Definition: ssh.h:1219
ECC (Elliptic Curve Cryptography)
#define SSH_MAX_USERNAME_LEN
Definition: ssh.h:255
@ SSH_CHANNEL_STATE_UNUSED
Definition: ssh.h:1120
SshChannel * channels
SSH channels.
Definition: ssh.h:1535
error_t sshRegisterGlobalRequestCallback(SshContext *context, SshGlobalReqCallback callback, void *param)
Register global request callback function.
Definition: ssh.c:618
SshConnectionState state
Connection state.
Definition: ssh.h:1440
uint_t modulusSize
Length of the modulus, in bits.
Definition: ssh.h:1164
DhContext dhContext
Diffie-Hellman context.
Definition: ssh.h:1486
#define SSH_BUFFER_SIZE
Definition: ssh.h:909
error_t sshSetChannelTimeout(SshChannel *channel, systime_t timeout)
Set timeout for read/write operations.
Definition: ssh.c:2053
error_t sshRegisterPublicKeyAuthCallback(SshContext *context, SshPublicKeyAuthCallback callback)
Register public key authentication callback function.
Definition: ssh.c:369
@ SSH_DISCONNECT_TOO_MANY_CONNECTIONS
Definition: ssh.h:1052
SshHostKeyVerifyCallback hostKeyVerifyCallback
Host key verification callback.
Definition: ssh.h:1552
SSH context.
Definition: ssh.h:1530
ECDH context.
Definition: ecdh.h:60
@ SSH_CONN_STATE_USER_AUTH_BANNER
Definition: ssh.h:1105
const char_t * signFormatId
Signature format identifier.
Definition: ssh.h:1211
SSH certificate (OpenSSH format)
size_t encKeyLen
Length of the encryption key, in bytes.
Definition: ssh.h:1373
SshOperationMode mode
Mode of operation (client or server)
Definition: ssh.h:1531
@ SSH_MSG_KEX_MIN
Definition: ssh.h:988
#define SshChannel
Definition: ssh.h:921
SshEcdhSharedSecretCalcCallback ecdhSharedSecretCalcCallback
ECDH shared secret calculation callback.
Definition: ssh.h:1573
Socket * socket
Underlying socket.
Definition: ssh.h:1443
uint32_t maxPacketSize
Maximum packet size.
Definition: ssh.h:1416
@ SSH_CHANNEL_EVENT_TX_ACKED
Definition: ssh.h:1151
void sshDeinit(SshContext *context)
Release SSH context.
Definition: ssh.c:2602
@ SSH_MSG_CHANNEL_EXTENDED_DATA
Definition: ssh.h:1024
bool_t wrongGuess
A wrong guessed key exchange packet follows.
Definition: ssh.h:1505
SSH channel.
Definition: ssh.h:1404
size_t dhParamsLen
Length of the Diffie-Hellman parameters.
Definition: ssh.h:1181
@ SSH_DISCONNECT_ILLEGAL_USER_NAME
Definition: ssh.h:1055
@ SSH_MSG_KEXINIT
Definition: ssh.h:986