%% %% 2004-2007 %% Ericsson AB, All Rights Reserved %% %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in %% compliance with the License. You should have received a copy of the %% Erlang Public License along with this software. If not, it can be %% retrieved online at http://www.erlang.org/. %% %% Software distributed under the License is distributed on an "AS IS" %% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See %% the License for the specific language governing rights and limitations %% under the License. %% %% The Initial Developer of the Original Code is Ericsson AB. %% %% %% %% SSH definitions %% -ifndef(SSH_HRL). -define(SSH_HRL, 1). -define(SSH_DEFAULT_PORT, 22). -define(SSH_MAX_PACKET_SIZE, (256*1024)). -define(FALSE, 0). -define(TRUE, 1). %% basic binary constructors -define(BOOLEAN(X), X:8/unsigned-big-integer). -define(BYTE(X), X:8/unsigned-big-integer). -define(UINT16(X), X:16/unsigned-big-integer). -define(UINT32(X), X:32/unsigned-big-integer). -define(UINT64(X), X:64/unsigned-big-integer). -define(STRING(X), ?UINT32((size(X))), (X)/binary). %% building macros -define(boolean(X), case X of true -> <>; false -> (<>) end). -define(byte(X), << ?BYTE(X) >> ). -define(uint16(X), << ?UINT16(X) >> ). -define(uint32(X), << ?UINT32(X) >> ). -define(uint64(X), << ?UINT64(X) >> ). -define(string(X), if list(X) -> (fun(__B) -> (<>) end)(list_to_binary(X)); atom(X) -> (fun(__B) -> (<>) end)(list_to_binary(atom_to_list(X))); binary(X) -> (<>) end). -define(binary(X), <>). -ifdef(debug). -define(dbg(Debug, Fmt, As), case (Debug) of true -> io:format([$# | (Fmt)], (As)); _ -> ok end). -else. -define(dbg(Debug, Fmt, As), ok). -endif. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% %% BASIC transport messages %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -define(SSH_MSG_DISCONNECT, 1). -define(SSH_MSG_IGNORE, 2). -define(SSH_MSG_UNIMPLEMENTED, 3). -define(SSH_MSG_DEBUG, 4). -define(SSH_MSG_SERVICE_REQUEST, 5). -define(SSH_MSG_SERVICE_ACCEPT, 6). -define(SSH_MSG_KEXINIT, 20). -define(SSH_MSG_NEWKEYS, 21). -record(ssh_msg_disconnect, { code, %% uint32 description, %% string language %% string }). -record(ssh_msg_ignore, { data %% string }). -record(ssh_msg_unimplemented, { sequence %% uint32 }). -record(ssh_msg_debug, { always_display, %% boolean message, %% string language %% string }). -record(ssh_msg_service_request, { name %% string (service name) }). -record(ssh_msg_service_accept, { name %% string }). -record(ssh_msg_kexinit, { cookie, %% random(16) kex_algorithms, %% string server_host_key_algorithms, %% string encryption_algorithms_client_to_server, %% string encryption_algorithms_server_to_client, %% string mac_algorithms_client_to_server, %% string mac_algorithms_server_to_client, %% string compression_algorithms_client_to_server, %% string compression_algorithms_server_to_client, %% string languages_client_to_server, %% string languages_server_to_client, %% string first_kex_packet_follows=false, %% boolean %% (reserved for future extension) reserved=0 %% uint32=0 }). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% %% KEY DH messages %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% diffie-hellman-group1-sha1 -define(SSH_MSG_KEXDH_INIT, 30). -define(SSH_MSG_KEXDH_REPLY, 31). -record(ssh_msg_kexdh_init, { e %% mpint }). -record(ssh_msg_kexdh_reply, { public_host_key, %% string (K_S) f, %% mpint h_sig %% string, signature of H }). -record(ssh_msg_newkeys, {}). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% %% KEY DH GEX messages %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% diffie-hellman-group-exchange-sha1 -define(SSH_MSG_KEX_DH_GEX_REQUEST_OLD, 30). -define(SSH_MSG_KEX_DH_GEX_REQUEST, 34). -define(SSH_MSG_KEX_DH_GEX_GROUP, 31). -define(SSH_MSG_KEX_DH_GEX_INIT, 32). -define(SSH_MSG_KEX_DH_GEX_REPLY, 33). -record(ssh_msg_kex_dh_gex_request, { min, n, max }). -record(ssh_msg_kex_dh_gex_request_old, { n }). -record(ssh_msg_kex_dh_gex_group, { p, %% prime g %% generator }). -record(ssh_msg_kex_dh_gex_init, { e }). -record(ssh_msg_kex_dh_gex_reply, { public_host_key, %% string (K_S) f, h_sig }). -define(SSH_CIPHER_NONE, 0). -define(SSH_CIPHER_3DES, 3). -define(SSH_CIPHER_AUTHFILE, ?SSH_CIPHER_3DES). -record(ssh_key, { type, public, private, comment = "" }). %% assertion macro -define(ssh_assert(Expr, Reason), case Expr of true -> ok; _ -> exit(Reason) end). %% error codes -define(SSH_DISCONNECT_HOST_NOT_ALLOWED_TO_CONNECT, 1). -define(SSH_DISCONNECT_PROTOCOL_ERROR, 2). -define(SSH_DISCONNECT_KEY_EXCHANGE_FAILED, 3). -define(SSH_DISCONNECT_RESERVED, 4). -define(SSH_DISCONNECT_MAC_ERROR, 5). -define(SSH_DISCONNECT_COMPRESSION_ERROR, 6). -define(SSH_DISCONNECT_SERVICE_NOT_AVAILABLE, 7). -define(SSH_DISCONNECT_PROTOCOL_VERSION_NOT_SUPPORTED, 8). -define(SSH_DISCONNECT_HOST_KEY_NOT_VERIFIABLE, 9). -define(SSH_DISCONNECT_CONNECTION_LOST, 10). -define(SSH_DISCONNECT_BY_APPLICATION, 11). -define(SSH_DISCONNECT_TOO_MANY_CONNECTIONS, 12). -define(SSH_DISCONNECT_AUTH_CANCELLED_BY_USER, 13). -define(SSH_DISCONNECT_NO_MORE_AUTH_METHODS_AVAILABLE, 14). -define(SSH_DISCONNECT_ILLEGAL_USER_NAME, 15). %%%---------------------------------------------------------------------- %%% # DH_14_xxx %%% Description: Oakley group 14 prime numbers and generator. Used in %%% diffie-hellman-group1-sha1 key exchange method. %%%---------------------------------------------------------------------- %%%---------------------------------------------------------------------- %%% # DH_14_P %%% Description: Prime for this group %%%---------------------------------------------------------------------- -define(DH_14_P, <<000,000,000,129,000,255,255,255,255,255,255,255,255,201,015,218, 162,033,104,194,052,196,198,098,139,128,220,028,209,041,002,078, 008,138,103,204,116,002,011,190,166,059,019,155,034,081,074,008, 121,142,052,004,221,239,149,025,179,205,058,067,027,048,043,010, 109,242,095,020,055,079,225,053,109,109,081,194,069,228,133,181, 118,098,094,126,198,244,076,066,233,166,055,237,107,011,255,092, 182,244,006,183,237,238,056,107,251,090,137,159,165,174,159,036, 017,124,075,031,230,073,040,102,081,236,230,083,129,255,255,255, 255,255,255,255,255>>). %%%---------------------------------------------------------------------- %%% # DH_14_G %%% Description: Generator for DH_14_P. %%%---------------------------------------------------------------------- -define(DH_14_G, <<0,0,0,1,2>>). %%%---------------------------------------------------------------------- %%% # DH_14_Q %%% Description: Group order (DH_14_P - 1) / 2. %%%---------------------------------------------------------------------- -define(DH_14_Q, <<000,000,000,128,127,255,255,255,255,255,255,255,228,135,237,081, 016,180,097,026,098,099,049,069,192,110,014,104,148,129,039,004, 069,051,230,058,001,005,223,083,029,137,205,145,040,165,004,060, 199,026,002,110,247,202,140,217,230,157,033,141,152,021,133,054, 249,047,138,027,167,240,154,182,182,168,225,034,242,066,218,187, 049,047,063,099,122,038,033,116,211,027,246,181,133,255,174,091, 122,003,091,246,247,028,053,253,173,068,207,210,215,079,146,008, 190,037,143,243,036,148,051,040,246,115,041,192,255,255,255,255, 255,255,255,255>>). %%%---------------------------------------------------------------------- %%% # SSH_PORT %%% Description: The default server port to connect to. %%%---------------------------------------------------------------------- -define(SSH_PORT, 22). %%%---------------------------------------------------------------------- %%% # SSH_VERSION %%% Description: The SSH transport protocol version we implement. %%%---------------------------------------------------------------------- -define(SSH_VERSION, "2.0"). %%%---------------------------------------------------------------------- %%% # COMPATIBLE_VERSIONS %%% Description: The SSH transport protocol versions compatible with our %%% version. %%%---------------------------------------------------------------------- -define(SSH_COMPATIBLE_VERSIONS, ["2.0","1.99"]). %%%---------------------------------------------------------------------- %%% # SOFTWARE_VERSION %%% Description: The SSH transport protocol versions compatible with our %%% version. %%%---------------------------------------------------------------------- -define(SSH_SOFTWARE_VERSION, "Erlang/OTP"). %%%---------------------------------------------------------------------- %%% # SSH_VERSION_STRING %%% Description: The string we send when connecting to SSH server. %%%---------------------------------------------------------------------- -define(SSH_VERSION_STRING, "SSH-" ++ ?SSH_VERSION ++ "-" ++ ?SSH_SOFTWARE_VERSION). %%%---------------------------------------------------------------------- %%% # SSH_LINE_TERM %%% Description: This is what we use to terminate lines in our version of %%% the SSH transport protocol. %%%---------------------------------------------------------------------- -define(SSH_LINE_TERM, "\r\n"). %%%---------------------------------------------------------------------- %%% # SSH_FALSE SSH_TRUE %%% Description: The representation of boolean values in the SSH protocol. %%%---------------------------------------------------------------------- -define(SSH_FALSE, 0). -define(SSH_TRUE, 1). %%%---------------------------------------------------------------------- %%% # SSH_ALG_xxx %%% Description: The names of algorithms we support. %%%---------------------------------------------------------------------- -define(SSH_ALG_KEX_DH_GROUP1, "diffie-hellman-group1-sha1"). -define(SSH_ALG_PUB_KEY_DSS, "ssh-dss"). -define(SSH_ALG_PUB_KEY_RSA, "ssh-rsa"). -define(SSH_ALG_HMAC_SHA1, "hmac-sha1"). -define(SSH_ALG_HMAC_MD5, "hmac-md5"). -define(SSH_ALG_3DES_CBC, "3des-cbc"). -define(SSH_ALG_AES128_CBC, "aes128-cbc"). %%%---------------------------------------------------------------------- %%% #2.2 DEFINITION OF RECORDS %%%---------------------------------------------------------------------- -record(sftp_file_attrs, {size = '_', uid = '_', gid = '_', permissions = '_', atime = '_', mtime = '_', extended = []}). -record(ssh_pty, {term = "", % e.g. "xterm" width = 80, height = 25, pixel_width = 1024, pixel_height = 768, modes = <<>>}). %% -record(ssh_key, {type = '_', %% public = '_', %% private = '_', %% comment = ""}). %%%---------------------------------------------------------------------- %%% #2.3 DEFINITION OF MACROS %%%---------------------------------------------------------------------- -define(SSH_STRING(String), [<<(length(String)):32/integer>>, list_to_binary(String)]). -define(SSH_UINT_32(Integer), <<(Integer):32/integer>>). -endif. % SSH_HRL defined