#include #include #include #pragma varargck argpos error 1 /* File names */ #define HOSTKEYPRIV "/sys/lib/ssh/hostkey.secret" #define HOSTKEYPUB "/sys/lib/ssh/hostkey.public" /* Debugging only: #define HOSTKEYPRIV "./hostkey.secret" #define HOSTKEYPUB "./hostkey.public" */ #define HOSTKEYRING "/sys/lib/ssh/keyring" #define PROTSTR "SSH-1.5-" #define PROTVSN "Plan9" #define DBG 0x01 #define DBG_CRYPTO 0x02 #define DBG_PACKET 0x04 #define DBG_AUTH 0x08 #define DBG_PROC 0x10 #define DBG_PROTO 0x20 #define DBG_IO 0x40 #define DBG_SCP 0x80 extern char *progname; #define SSH_MSG_NONE 0 #define SSH_MSG_DISCONNECT 1 #define SSH_SMSG_PUBLIC_KEY 2 #define SSH_CMSG_SESSION_KEY 3 #define SSH_CMSG_USER 4 #define SSH_CMSG_AUTH_RHOSTS 5 #define SSH_CMSG_AUTH_RSA 6 #define SSH_SMSG_AUTH_RSA_CHALLENGE 7 #define SSH_CMSG_AUTH_RSA_RESPONSE 8 #define SSH_CMSG_AUTH_PASSWORD 9 #define SSH_CMSG_REQUEST_PTY 10 #define SSH_CMSG_WINDOW_SIZE 11 #define SSH_CMSG_EXEC_SHELL 12 #define SSH_CMSG_EXEC_CMD 13 #define SSH_SMSG_SUCCESS 14 #define SSH_SMSG_FAILURE 15 #define SSH_CMSG_STDIN_DATA 16 #define SSH_SMSG_STDOUT_DATA 17 #define SSH_SMSG_STDERR_DATA 18 #define SSH_CMSG_EOF 19 #define SSH_SMSG_EXITSTATUS 20 #define SSH_MSG_CHANNEL_OPEN_CONFIRMATION 21 #define SSH_MSG_CHANNEL_OPEN_FAILURE 22 #define SSH_MSG_CHANNEL_DATA 23 #define SSH_MSG_CHANNEL_CLOSE 24 #define SSH_MSG_CHANNEL_CLOSE_CONFIRMATION 25 /* (OBSOLETED; was unix-domain X11 forwarding) 26 */ #define SSH_SMSG_X11_OPEN 27 #define SSH_CMSG_PORT_FORWARD_REQUEST 28 #define SSH_MSG_PORT_OPEN 29 #define SSH_CMSG_AGENT_REQUEST_FORWARDING 30 #define SSH_SMSG_AGENT_OPEN 31 #define SSH_MSG_IGNORE 32 #define SSH_CMSG_EXIT_CONFIRMATION 33 #define SSH_CMSG_X11_REQUEST_FORWARDING 34 #define SSH_CMSG_AUTH_RHOSTS_RSA 35 #define SSH_MSG_DEBUG 36 #define SSH_CMSG_REQUEST_COMPRESSION 37 #define SSH_CMSG_MAX_PACKET_SIZE 38 #define SSH_CMSG_AUTH_TIS 39 #define SSH_SMSG_AUTH_TIS_CHALLENGE 40 #define SSH_CMSG_AUTH_TIS_RESPONSE 41 #define SSH_CMSG_AUTH_KERBEROS 42 #define SSH_SMSG_AUTH_KERBEROS_RESPONSE 43 #define SSH_CMSG_HAVE_KERBEROS_TGT 44 #define SSH_CIPHER_NONE 0 #define SSH_CIPHER_IDEA 1 #define SSH_CIPHER_DES 2 #define SSH_CIPHER_3DES 3 #define SSH_CIPHER_TSS 4 #define SSH_CIPHER_RC4 5 extern char *cipher_names[]; #define SSH_AUTH_RHOSTS 1 #define SSH_AUTH_RSA 2 #define SSH_AUTH_PASSWORD 3 #define SSH_AUTH_RHOSTS_RSA 4 #define SSH_AUTH_TIS 5 #define SSH_AUTH_USER_RSA 6 extern char *auth_names[]; #define SSH_PROTOCOL_SCREEN_NUMBER 1 #define SSH_PROTOCOL_HOST_IN_FWD_OPEN 2 typedef struct Packet { uchar *pos; /* position in packet (while reading or writing */ ulong length; /* output: #bytes before pos, input: #bytes after pos */ uchar pad[8]; uchar type; uchar data[1]; } Packet; #define SSH_MAX_DATA 262144 /* smallest allowed maximum packet size */ #define SSH_MAX_MSG SSH_MAX_DATA+4 #define SESSION_KEY_LENGTH 32 #define SESSION_ID_LENGTH MD5dlen /* Used by both */ extern uchar session_key[SESSION_KEY_LENGTH]; extern uchar session_id[SESSION_ID_LENGTH]; extern uchar session_cipher; /* Cipher used for data encryption */ extern int encryption; extern int compression; extern int DEBUG; extern int doabort; extern char passwd[256]; extern int dfdin, dfdout; /* The all-important file descriptors */ enum { c2s, s2c }; enum { key_ok, key_wrong, key_notfound, key_file }; /* misc.c */ void error(char *, ...); void debug(int, char *, ...); void debugbig(int, mpint*, char); void* mmalloc(int); void* zalloc(int); void printbig(int, mpint*, int, char); void printpublickey(int, RSApub *); void printdecpublickey(int, RSApub *); void printsecretkey(int, RSApriv *); int readsecretkey(FILE *, RSApriv *); int readpublickey(FILE *, RSApub *); void comp_sess_id(mpint*, mpint*, uchar *, uchar *); void RSApad(uchar *, int, uchar *, int); mpint* RSAunpad(mpint*, int); mpint* RSAEncrypt(mpint*, RSApub*); mpint* RSADecrypt(mpint*, RSApriv*); int verify_key(char *, RSApub *, char *); int replace_key(char *, RSApub *, char *); int isatty(int); void getdomainname(char*, char*, int); void mptobuf(mpint*, uchar*, int); /* packet.c */ void mkcrctab(ulong); Packet* getpacket(int); int putpacket(Packet *, int); void preparekey(void); void mfree(Packet *); ulong getlong(Packet *); RSApub* getRSApublic(Packet *); ulong getlong(Packet *); ushort getshort(Packet *); uchar getbyte(Packet *); void getbytes(Packet *, uchar *, int); mpint* getBigInt(Packet *); int getstring(Packet *, char *, int); void putlong(Packet *, ulong); void putshort(Packet *, ushort); void putbyte(Packet *, uchar); void putbytes(Packet *, uchar *, int); void putBigInt(Packet *, mpint*); void putRSApublic(Packet *, RSApub *); void putstring(Packet *, char *, int); /* messages.c */ void get_ssh_smsg_public_key(void);