Develop and Download Open Source Software

Browse Subversion Repository

Contents of /branches/ssh_chacha20poly1305/ttssh2/ttxssh/ssh.h

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3037 - (show annotations) (download) (as text)
Tue Oct 16 15:31:49 2007 UTC (16 years, 5 months ago) by maya
Original Path: ttssh2/trunk/ttxssh/ssh.h
File MIME type: text/x-chdr
File size: 16231 byte(s)
no message

1 /*
2 Copyright (c) 1998-2001, Robert O'Callahan
3 All rights reserved.
4
5 Redistribution and use in source and binary forms, with or without modification,
6 are permitted provided that the following conditions are met:
7
8 Redistributions of source code must retain the above copyright notice, this list of
9 conditions and the following disclaimer.
10
11 Redistributions in binary form must reproduce the above copyright notice, this list
12 of conditions and the following disclaimer in the documentation and/or other materials
13 provided with the distribution.
14
15 The name of Robert O'Callahan may not be used to endorse or promote products derived from
16 this software without specific prior written permission.
17
18 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND
19 ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20 OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
21 THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
22 EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23 SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24 HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
25 OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
26 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29 /*
30 This code is copyright (C) 1998-1999 Robert O'Callahan.
31 See LICENSE.TXT for the license.
32 */
33
34 #ifndef __SSH_H
35 #define __SSH_H
36
37 #include "zlib.h"
38 #include <openssl/evp.h>
39
40
41 #define DEBUG_PRINT_TO_FILE(base, msg, len) { \
42 static int count = 0; \
43 debug_print(count + base, msg, len); \
44 count++; \
45 }
46
47
48 // yutaka
49 #define SSH2_USE
50
51
52 /* Some of this code has been adapted from Ian Goldberg's Pilot SSH */
53
54 typedef enum {
55 SSH_MSG_NONE, SSH_MSG_DISCONNECT, SSH_SMSG_PUBLIC_KEY, //2
56 SSH_CMSG_SESSION_KEY, SSH_CMSG_USER, SSH_CMSG_AUTH_RHOSTS, // 5
57 SSH_CMSG_AUTH_RSA, SSH_SMSG_AUTH_RSA_CHALLENGE,
58 SSH_CMSG_AUTH_RSA_RESPONSE, SSH_CMSG_AUTH_PASSWORD,
59 SSH_CMSG_REQUEST_PTY, // 10
60 SSH_CMSG_WINDOW_SIZE, SSH_CMSG_EXEC_SHELL,
61 SSH_CMSG_EXEC_CMD, SSH_SMSG_SUCCESS, SSH_SMSG_FAILURE,
62 SSH_CMSG_STDIN_DATA, SSH_SMSG_STDOUT_DATA, SSH_SMSG_STDERR_DATA,
63 SSH_CMSG_EOF, SSH_SMSG_EXITSTATUS,
64 SSH_MSG_CHANNEL_OPEN_CONFIRMATION, SSH_MSG_CHANNEL_OPEN_FAILURE,
65 SSH_MSG_CHANNEL_DATA, SSH_MSG_CHANNEL_INPUT_EOF,
66 SSH_MSG_CHANNEL_OUTPUT_CLOSED, SSH_MSG_OBSOLETED0,
67 SSH_SMSG_X11_OPEN, SSH_CMSG_PORT_FORWARD_REQUEST, SSH_MSG_PORT_OPEN,
68 SSH_CMSG_AGENT_REQUEST_FORWARDING, SSH_SMSG_AGENT_OPEN,
69 SSH_MSG_IGNORE, SSH_CMSG_EXIT_CONFIRMATION,
70 SSH_CMSG_X11_REQUEST_FORWARDING, SSH_CMSG_AUTH_RHOSTS_RSA,
71 SSH_MSG_DEBUG, SSH_CMSG_REQUEST_COMPRESSION,
72 SSH_CMSG_MAX_PACKET_SIZE, SSH_CMSG_AUTH_TIS,
73 SSH_SMSG_AUTH_TIS_CHALLENGE, SSH_CMSG_AUTH_TIS_RESPONSE,
74 SSH_CMSG_AUTH_KERBEROS, SSH_SMSG_AUTH_KERBEROS_RESPONSE
75 } SSHMessage;
76
77 typedef enum {
78 SSH_CIPHER_NONE, SSH_CIPHER_IDEA, SSH_CIPHER_DES, SSH_CIPHER_3DES,
79 SSH_CIPHER_TSS, SSH_CIPHER_RC4, SSH_CIPHER_BLOWFISH,
80 // for SSH2
81 SSH_CIPHER_3DES_CBC, SSH_CIPHER_AES128,SSH_CIPHER_AES256,
82 } SSHCipher;
83
84 #define SSH_CIPHER_MAX SSH_CIPHER_AES256
85
86 typedef enum {
87 SSH_AUTH_NONE, SSH_AUTH_RHOSTS, SSH_AUTH_RSA, SSH_AUTH_PASSWORD,
88 SSH_AUTH_RHOSTS_RSA, SSH_AUTH_TIS, SSH_AUTH_KERBEROS,
89 } SSHAuthMethod;
90
91 /* we don't support Kerberos at this time */
92 #define SSH_AUTH_MAX SSH_AUTH_TIS
93
94 typedef enum {
95 SSH_GENERIC_AUTHENTICATION, SSH_TIS_AUTHENTICATION
96 } SSHAuthMode;
97
98 #define SSH_PROTOFLAG_SCREEN_NUMBER 1
99 #define SSH_PROTOFLAG_HOST_IN_FWD_OPEN 2
100
101 #define SSH_MAX_SEND_PACKET_SIZE 250000
102
103
104 /* SSH2 constants */
105
106 /* SSH2 messages */
107 #define SSH2_MSG_DISCONNECT 1
108 #define SSH2_MSG_IGNORE 2
109 #define SSH2_MSG_UNIMPLEMENTED 3
110 #define SSH2_MSG_DEBUG 4
111 #define SSH2_MSG_SERVICE_REQUEST 5
112 #define SSH2_MSG_SERVICE_ACCEPT 6
113
114 #define SSH2_MSG_KEXINIT 20
115 #define SSH2_MSG_NEWKEYS 21
116
117 #define SSH2_MSG_KEXDH_INIT 30
118 #define SSH2_MSG_KEXDH_REPLY 31
119
120 #define SSH2_MSG_KEX_DH_GEX_GROUP 31
121 #define SSH2_MSG_KEX_DH_GEX_INIT 32
122 #define SSH2_MSG_KEX_DH_GEX_REPLY 33
123 #define SSH2_MSG_KEX_DH_GEX_REQUEST 34
124
125 #define SSH2_MSG_USERAUTH_REQUEST 50
126 #define SSH2_MSG_USERAUTH_FAILURE 51
127 #define SSH2_MSG_USERAUTH_SUCCESS 52
128 #define SSH2_MSG_USERAUTH_BANNER 53
129
130 #define SSH2_MSG_USERAUTH_PK_OK 60
131 #define SSH2_MSG_USERAUTH_PASSWD_CHANGEREQ 60
132 #define SSH2_MSG_USERAUTH_INFO_REQUEST 60
133 #define SSH2_MSG_USERAUTH_INFO_RESPONSE 61
134
135 #define SSH2_MSG_GLOBAL_REQUEST 80
136 #define SSH2_MSG_REQUEST_SUCCESS 81
137 #define SSH2_MSG_REQUEST_FAILURE 82
138 #define SSH2_MSG_CHANNEL_OPEN 90
139 #define SSH2_MSG_CHANNEL_OPEN_CONFIRMATION 91
140 #define SSH2_MSG_CHANNEL_OPEN_FAILURE 92
141 #define SSH2_MSG_CHANNEL_WINDOW_ADJUST 93
142 #define SSH2_MSG_CHANNEL_DATA 94
143 #define SSH2_MSG_CHANNEL_EXTENDED_DATA 95
144 #define SSH2_MSG_CHANNEL_EOF 96
145 #define SSH2_MSG_CHANNEL_CLOSE 97
146 #define SSH2_MSG_CHANNEL_REQUEST 98
147 #define SSH2_MSG_CHANNEL_SUCCESS 99
148 #define SSH2_MSG_CHANNEL_FAILURE 100
149
150 /* SSH2 miscellaneous constants */
151 #define SSH2_DISCONNECT_HOST_NOT_ALLOWED_TO_CONNECT 1
152 #define SSH2_DISCONNECT_PROTOCOL_ERROR 2
153 #define SSH2_DISCONNECT_KEY_EXCHANGE_FAILED 3
154 #define SSH2_DISCONNECT_HOST_AUTHENTICATION_FAILED 4
155 #define SSH2_DISCONNECT_MAC_ERROR 5
156 #define SSH2_DISCONNECT_COMPRESSION_ERROR 6
157 #define SSH2_DISCONNECT_SERVICE_NOT_AVAILABLE 7
158 #define SSH2_DISCONNECT_PROTOCOL_VERSION_NOT_SUPPORTED 8
159 #define SSH2_DISCONNECT_HOST_KEY_NOT_VERIFIABLE 9
160 #define SSH2_DISCONNECT_CONNECTION_LOST 10
161 #define SSH2_DISCONNECT_BY_APPLICATION 11
162
163 #define SSH2_OPEN_ADMINISTRATIVELY_PROHIBITED 1
164 #define SSH2_OPEN_CONNECT_FAILED 2
165 #define SSH2_OPEN_UNKNOWN_CHANNEL_TYPE 3
166 #define SSH2_OPEN_RESOURCE_SHORTAGE 4
167
168 // �L�[�����A���S���Y��
169 #define KEX_DH1 "diffie-hellman-group1-sha1"
170 #define KEX_DH14 "diffie-hellman-group14-sha1"
171 #define KEX_DHGEX "diffie-hellman-group-exchange-sha1"
172
173 // support of "Compression delayed" (2006.6.23 maya)
174 enum compression_algorithm {
175 COMP_NONE,
176 COMP_ZLIB,
177 COMP_DELAYED,
178 COMP_UNKNOWN
179 };
180
181 enum kex_exchange {
182 KEX_DH_GRP1_SHA1,
183 KEX_DH_GRP14_SHA1,
184 KEX_DH_GEX_SHA1,
185 KEX_MAX
186 };
187
188 enum hostkey_type {
189 KEY_RSA1,
190 KEY_RSA,
191 KEY_DSA,
192 KEY_UNSPEC,
193 };
194
195 // ���L���C���f�b�N�X�� ssh2_macs[] ���������������B
196 enum hmac_type {
197 HMAC_SHA1,
198 HMAC_MD5,
199 HMAC_UNKNOWN
200 };
201
202 #define KEX_DEFAULT_KEX "diffie-hellman-group-exchange-sha1," \
203 "diffie-hellman-group14-sha1," \
204 "diffie-hellman-group1-sha1"
205 #define KEX_DEFAULT_PK_ALG "ssh-rsa,ssh-dss"
206 #ifdef SSH2_BLOWFISH
207 #define KEX_DEFAULT_ENCRYPT "aes128-cbc,3des-cbc,blowfish-cbc,aes256-cbc"
208 #else
209 #define KEX_DEFAULT_ENCRYPT "aes128-cbc,3des-cbc,aes256-cbc"
210 #endif
211 #define KEX_DEFAULT_MAC "hmac-sha1,hmac-md5"
212 // support of "Compression delayed" (2006.6.23 maya)
213 #define KEX_DEFAULT_COMP "none,zlib@openssh.com,zlib"
214 #define KEX_DEFAULT_LANG ""
215
216 /* Minimum modulus size (n) for RSA keys. */
217 #define SSH_RSA_MINIMUM_MODULUS_SIZE 768
218
219 enum kex_init_proposals {
220 PROPOSAL_KEX_ALGS,
221 PROPOSAL_SERVER_HOST_KEY_ALGS,
222 PROPOSAL_ENC_ALGS_CTOS,
223 PROPOSAL_ENC_ALGS_STOC,
224 PROPOSAL_MAC_ALGS_CTOS,
225 PROPOSAL_MAC_ALGS_STOC,
226 PROPOSAL_COMP_ALGS_CTOS,
227 PROPOSAL_COMP_ALGS_STOC,
228 PROPOSAL_LANG_CTOS,
229 PROPOSAL_LANG_STOC,
230 PROPOSAL_MAX
231 };
232
233
234 // �N���C�A���g�����T�[�o������������
235 #ifdef SSH2_DEBUG
236 static char *myproposal[PROPOSAL_MAX] = {
237 // KEX_DEFAULT_KEX,
238 "diffie-hellman-group14-sha1,diffie-hellman-group1-sha1,diffie-hellman-group-exchange-sha1",
239 KEX_DEFAULT_PK_ALG,
240 // "ssh-dss,ssh-rsa",
241 KEX_DEFAULT_ENCRYPT,
242 KEX_DEFAULT_ENCRYPT,
243 "hmac-md5,hmac-sha1",
244 "hmac-md5,hmac-sha1",
245 // "hmac-sha1",
246 // "hmac-sha1",
247 // KEX_DEFAULT_MAC,
248 // KEX_DEFAULT_MAC,
249 KEX_DEFAULT_COMP,
250 KEX_DEFAULT_COMP,
251 KEX_DEFAULT_LANG,
252 KEX_DEFAULT_LANG,
253 };
254 #else
255 static char *myproposal[PROPOSAL_MAX] = {
256 KEX_DEFAULT_KEX,
257 KEX_DEFAULT_PK_ALG,
258 KEX_DEFAULT_ENCRYPT,
259 KEX_DEFAULT_ENCRYPT,
260 KEX_DEFAULT_MAC,
261 KEX_DEFAULT_MAC,
262 KEX_DEFAULT_COMP,
263 KEX_DEFAULT_COMP,
264 KEX_DEFAULT_LANG,
265 KEX_DEFAULT_LANG,
266 };
267 #endif
268
269
270 typedef struct ssh2_cipher {
271 SSHCipher cipher;
272 char *name;
273 int block_size;
274 int key_len;
275 const EVP_CIPHER *(*func)(void);
276 } ssh2_cipher_t;
277
278 static ssh2_cipher_t ssh2_ciphers[] = {
279 {SSH_CIPHER_3DES_CBC, "3des-cbc", 8, 24, EVP_des_ede3_cbc},
280 {SSH_CIPHER_AES128, "aes128-cbc", 16, 16, EVP_aes_128_cbc},
281 {SSH_CIPHER_AES256, "aes256-cbc", 16, 32, EVP_aes_256_cbc},
282 #ifdef SSH2_BLOWFISH
283 {SSH_CIPHER_BLOWFISH, "blowfish-cbc", 8, 32, EVP_enc_null}, // func ���g�p��������
284 #endif
285 {SSH_CIPHER_NONE, NULL, 0, 0, NULL},
286 };
287
288
289 typedef struct ssh2_mac {
290 char *name;
291 const EVP_MD *(*func)(void);
292 int truncatebits;
293 } ssh2_mac_t;
294
295 static ssh2_mac_t ssh2_macs[] = {
296 {"hmac-sha1", EVP_sha1, 0},
297 {"hmac-md5", EVP_md5, 0},
298 {NULL, NULL, 0},
299 };
300
301 static char *ssh_comp[] = {
302 "none",
303 "zlib",
304 "zlib@openssh.com",
305 };
306
307
308 struct Enc {
309 u_char *key;
310 u_char *iv;
311 unsigned int key_len;
312 unsigned int block_size;
313 };
314
315 struct Mac {
316 char *name;
317 int enabled;
318 const EVP_MD *md;
319 int mac_len;
320 u_char *key;
321 int key_len;
322 };
323
324 struct Comp {
325 int type;
326 int enabled;
327 char *name;
328 };
329
330 typedef struct {
331 struct Enc enc;
332 struct Mac mac;
333 struct Comp comp;
334 } Newkeys;
335
336 #define roundup(x, y) ((((x)+((y)-1))/(y))*(y))
337
338 enum kex_modes {
339 MODE_IN,
340 MODE_OUT,
341 MODE_MAX
342 };
343
344
345 // �z�X�g�L�[(SSH1, SSH2����)���f�[�^�\�� (2006.3.21 yutaka)
346 typedef struct Key {
347 // host key type
348 enum hostkey_type type;
349 // SSH2 RSA
350 RSA *rsa;
351 // SSH2 DSA
352 DSA *dsa;
353 // SSH1 RSA
354 int bits;
355 unsigned char *exp;
356 unsigned char *mod;
357 } Key;
358
359
360 /* The packet handler returns TRUE to keep the handler in place,
361 FALSE to remove the handler. */
362 typedef BOOL (* SSHPacketHandler)(PTInstVar pvar);
363
364 typedef struct _SSHPacketHandlerItem SSHPacketHandlerItem;
365 struct _SSHPacketHandlerItem {
366 SSHPacketHandler handler;
367 /* Circular list of handlers for given message */
368 SSHPacketHandlerItem FAR * next_for_message;
369 SSHPacketHandlerItem FAR * last_for_message;
370 /* Circular list of handlers in set */
371 SSHPacketHandlerItem FAR * next_in_set;
372 int active_for_message;
373 };
374
375 typedef struct {
376 char FAR * hostname;
377
378 int server_protocol_flags;
379 char FAR * server_ID;
380
381 /* This buffer is used to hold the outgoing data, and encrypted in-place
382 here if necessary. */
383 unsigned char FAR * outbuf;
384 long outbuflen;
385 /* This buffer is used by the SSH protocol processing to store uncompressed
386 packet data for compression. User data is never streamed through here;
387 it is compressed directly from the user's buffer. */
388 unsigned char FAR * precompress_outbuf;
389 long precompress_outbuflen;
390 /* this is the length of the packet data, including the type header */
391 long outgoing_packet_len;
392
393 /* This buffer is used by the SSH protocol processing to store decompressed
394 packet data. User data is never streamed through here; it is decompressed
395 directly to the user's buffer. */
396 unsigned char FAR * postdecompress_inbuf;
397 long postdecompress_inbuflen;
398
399 unsigned char FAR * payload;
400 long payload_grabbed;
401 long payloadlen;
402 long payload_datastart;
403 long payload_datalen;
404
405 uint32 receiver_sequence_number;
406 uint32 sender_sequence_number;
407
408 z_stream compress_stream;
409 z_stream decompress_stream;
410 BOOL compressing;
411 BOOL decompressing;
412 int compression_level;
413
414 SSHPacketHandlerItem FAR * packet_handlers[256];
415 int status_flags;
416
417 int win_cols;
418 int win_rows;
419 } SSHState;
420
421 #define STATUS_DONT_SEND_USER_NAME 0x01
422 #define STATUS_EXPECTING_COMPRESSION_RESPONSE 0x02
423 #define STATUS_DONT_SEND_CREDENTIALS 0x04
424 #define STATUS_HOST_OK 0x08
425 #define STATUS_INTERACTIVE 0x10
426 #define STATUS_IN_PARTIAL_ID_STRING 0x20
427
428 void SSH_init(PTInstVar pvar);
429 void SSH_open(PTInstVar pvar);
430 void SSH_notify_disconnecting(PTInstVar pvar, char FAR * reason);
431 /* SSH_handle_server_ID returns TRUE iff a valid ID string has been
432 received. If it returns FALSE, we need to keep looking for another
433 ID string. */
434 BOOL SSH_handle_server_ID(PTInstVar pvar, char FAR * ID, int ID_len);
435 /* SSH_handle_packet requires NO PAYLOAD on entry.
436 'len' is the size of the packet: payload + padding (+ CRC for SSHv1)
437 'padding' is the size of the padding.
438 'data' points to the start of the packet data (the length field)
439 */
440 void SSH_handle_packet(PTInstVar pvar, char FAR * data, int len, int padding);
441 void SSH_notify_win_size(PTInstVar pvar, int cols, int rows);
442 void SSH_notify_user_name(PTInstVar pvar);
443 void SSH_notify_cred(PTInstVar pvar);
444 void SSH_notify_host_OK(PTInstVar pvar);
445 void SSH_send(PTInstVar pvar, unsigned char const FAR * buf, int buflen);
446 /* SSH_extract_payload returns number of bytes extracted */
447 int SSH_extract_payload(PTInstVar pvar, unsigned char FAR * dest, int len);
448 void SSH_end(PTInstVar pvar);
449
450 void SSH_get_server_ID_info(PTInstVar pvar, char FAR * dest, int len);
451 void SSH_get_protocol_version_info(PTInstVar pvar, char FAR * dest, int len);
452 void SSH_get_compression_info(PTInstVar pvar, char FAR * dest, int len);
453
454 /* len must be <= SSH_MAX_SEND_PACKET_SIZE */
455 void SSH_channel_send(PTInstVar pvar, int channel_num,
456 uint32 remote_channel_num,
457 unsigned char FAR * buf, int len);
458 void SSH_fail_channel_open(PTInstVar pvar, uint32 remote_channel_num);
459 void SSH_confirm_channel_open(PTInstVar pvar, uint32 remote_channel_num, uint32 local_channel_num);
460 void SSH_channel_output_eof(PTInstVar pvar, uint32 remote_channel_num);
461 void SSH_channel_input_eof(PTInstVar pvar, uint32 remote_channel_num, uint32 local_channel_num);
462 void SSH_request_forwarding(PTInstVar pvar, int from_server_port,
463 char FAR * to_local_host, int to_local_port);
464 void SSH_request_X11_forwarding(PTInstVar pvar,
465 char FAR * auth_protocol, unsigned char FAR * auth_data, int auth_data_len, int screen_num);
466 void SSH_open_channel(PTInstVar pvar, uint32 local_channel_num,
467 char FAR * to_remote_host, int to_remote_port,
468 char FAR * originator, unsigned short originator_port);
469
470 /* auxiliary SSH2 interfaces for pkt.c */
471 int SSH_get_min_packet_size(PTInstVar pvar);
472 /* data is guaranteed to be at least SSH_get_min_packet_size bytes long
473 at least 5 bytes must be decrypted */
474 void SSH_predecrpyt_packet(PTInstVar pvar, char FAR * data);
475 int SSH_get_clear_MAC_size(PTInstVar pvar);
476
477 #define SSH_is_any_payload(pvar) ((pvar)->ssh_state.payload_datalen > 0)
478 #define SSH_get_host_name(pvar) ((pvar)->ssh_state.hostname)
479 #define SSH_get_compression_level(pvar) ((pvar)->ssh_state.compressing ? (pvar)->ts_SSH_CompressionLevel : 0)
480
481 void SSH2_send_kexinit(PTInstVar pvar);
482 BOOL do_SSH2_userauth(PTInstVar pvar);
483 void debug_print(int no, char *msg, int len);
484 int get_cipher_block_size(SSHCipher cipher);
485 int get_cipher_key_len(SSHCipher cipher);
486 const EVP_CIPHER * (*get_cipher_EVP_CIPHER(SSHCipher cipher))(void);
487 void ssh_heartbeat_lock_initialize(void);
488 void ssh_heartbeat_lock_finalize(void);
489 void ssh_heartbeat_lock(void);
490 void ssh_heartbeat_unlock(void);
491 void halt_ssh_heartbeat_thread(PTInstVar pvar);
492 void ssh2_channel_free(void);
493 BOOL handle_SSH2_userauth_inforeq(PTInstVar pvar);
494 void SSH2_update_compression_myproposal(PTInstVar pvar);
495 void SSH2_update_cipher_myproposal(PTInstVar pvar);
496
497 enum hostkey_type get_keytype_from_name(char *name);
498 char *get_sshname_from_key(Key *key);
499 int key_to_blob(Key *key, char **blobp, int *lenp);
500 Key *key_from_blob(char *data, int blen);
501 void key_free(Key *key);
502 RSA *duplicate_RSA(RSA *src);
503 DSA *duplicate_DSA(DSA *src);
504 char *key_fingerprint(Key *key);
505
506 #endif

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26