diff options
Diffstat (limited to 'lib/ssh/doc')
| -rw-r--r-- | lib/ssh/doc/src/notes.xml | 304 | ||||
| -rw-r--r-- | lib/ssh/doc/src/ssh.xml | 14 | ||||
| -rw-r--r-- | lib/ssh/doc/src/ssh_connection.xml | 71 | ||||
| -rw-r--r-- | lib/ssh/doc/src/ssh_sftp.xml | 125 | ||||
| -rw-r--r-- | lib/ssh/doc/src/using_ssh.xml | 2 | 
5 files changed, 497 insertions, 19 deletions
| diff --git a/lib/ssh/doc/src/notes.xml b/lib/ssh/doc/src/notes.xml index 84d5e5c86e..3aa61aa9ec 100644 --- a/lib/ssh/doc/src/notes.xml +++ b/lib/ssh/doc/src/notes.xml @@ -29,6 +29,310 @@      <file>notes.xml</file>    </header> +<section><title>Ssh 3.1</title> + +    <section><title>Fixed Bugs and Malfunctions</title> +      <list> +        <item> +          <p> +	    Make sure the clean rule for ssh, ssl, eunit and otp_mibs +	    actually removes generated files.</p> +          <p> +	    Own Id: OTP-12200</p> +        </item> +        <item> +          <p> +	    Improved Property Tests (Thanks to Thomas, John and +	    Tobias at QuviQ)</p> +          <p> +	    Own Id: OTP-12256</p> +        </item> +        <item> +          <p> +	    Correct typo of renegotiate that could cause rekeying to +	    fail</p> +          <p> +	    Own Id: OTP-12277 Aux Id: seq12736 </p> +        </item> +        <item> +          <p> +	    The {timeout, Timeout} option passed to +	    ssh_sftp:start_channel was not applied to the early +	    phases of the SSH protocol. This patch passes the Timeout +	    through to ssh:connect. In case the timeout occurs during +	    these phases, {error, timeout} is returned. (Thanks to +	    Simon Cornish)</p> +          <p> +	    Own Id: OTP-12306</p> +        </item> +      </list> +    </section> + + +    <section><title>Improvements and New Features</title> +      <list> +        <item> +          <p> +	    Added API functions ptty_alloc/3 and ptty_alloc/4, to +	    allocate a pseudo tty.</p> +          <p> +	    Own Id: OTP-11542 Aux Id: seq12493, OTP-11631 </p> +        </item> +        <item> +          <p> +	    Supports tar file creation on other media than file +	    systems mounted on the local machine.</p> +          <p> +	    The <c>erl_tar</c> api is extended with +	    <c>erl_tar:init/3</c> that enables usage of user provided +	    media storage routines. A ssh-specific set of such +	    routines is hidden in the new function +	    <c>ssh_sftp:open_tar/3</c> to simplify creating a tar +	    archive on a remote ssh server.</p> +          <p> +	    A chunked file reading option is added to +	    <c>erl_tar:add/3,4</c> to save memory on e.g small +	    embedded systems. The size of the slices read from a file +	    in that case can be specified.</p> +          <p> +	    Own Id: OTP-12180 Aux Id: seq12715 </p> +        </item> +        <item> +          <p> +	    Always send SSH_DISCONNECT protocol messages when peer +	    sends corrupt messages.</p> +          <p> +	    Own Id: OTP-12185</p> +        </item> +        <item> +          <p> +	    Hooks for funs that can change binaries sent to remote +	    sites from erl_tar for renote tar file creation are +	    added. See <c>ssh_sftp:open_tar/3,4</c> for details. The +	    hooks could also be used to read remote tar files that +	    need transformation before file extraction.</p> +          <p> +	    Those hooks are intended for encryption and decryption of +	    tar files. Effort is put into memory, disk and network +	    resource economy.</p> +          <p> +	    Own Id: OTP-12312 Aux Id: OTP-12180 </p> +        </item> +      </list> +    </section> + +</section> + +<section><title>Ssh 3.0.8</title> + +    <section><title>Fixed Bugs and Malfunctions</title> +      <list> +        <item> +          <p> +	    Fixes of login blocking after port scanning.</p> +          <p> +	    Own Id: OTP-12247 Aux Id: seq12726 </p> +        </item> +      </list> +    </section> + +</section> + +<section><title>Ssh 3.0.7</title> + +    <section><title>Fixed Bugs and Malfunctions</title> +      <list> +        <item> +          <p> +	    Add option sftp_vsn to SFTP</p> +          <p> +	    Own Id: OTP-12227</p> +        </item> +      </list> +    </section> + + +    <section><title>Improvements and New Features</title> +      <list> +        <item> +          <p> +	    Fix option user_interaction to work as expected. When +	    password authentication is implemented with ssh +	    keyboard-interactive method and the password is already +	    supplied, so that we do not need to query user, then +	    connections should succeed even though user_interaction +	    option is set to false.</p> +          <p> +	    Own Id: OTP-11329 Aux Id: seq12420, seq12335 </p> +        </item> +      </list> +    </section> + +</section> + +<section><title>Ssh 3.0.6</title> + +    <section><title>Fixed Bugs and Malfunctions</title> +      <list> +        <item> +          <p> +	    Gracefully handle bad data from the client when expecting +	    ssh version exchange.</p> +          <p> +	    Own Id: OTP-12157 Aux Id: seq12706 </p> +        </item> +        <item> +          <p> +	    When restarting an ssh daemon, that was stopped with +	    ssh:stop_listner/ [1,2] new options given shall replace +	    old ones.</p> +          <p> +	    Own Id: OTP-12168 Aux Id: seq12711 </p> +        </item> +      </list> +    </section> + + +    <section><title>Improvements and New Features</title> +      <list> +        <item> +          <p> +	    ssh now has a format_status function to avoid printing +	    sensitive information in error loggs.</p> +          <p> +	    Own Id: OTP-12030</p> +        </item> +      </list> +    </section> + + +    <section><title>Known Bugs and Problems</title> +      <list> +        <item> +          <p> +	    The option <c>parallel_login</c> didn't work with the +	    value <c>true</c>. All logins were serial.</p> +          <p> +	    Own Id: OTP-12194</p> +        </item> +      </list> +    </section> + +</section> + +<section><title>Ssh 3.0.5</title> + +    <section><title>Fixed Bugs and Malfunctions</title> +      <list> +        <item> +          <p> +	    When starting an ssh-daemon giving the option +	    {parallel_login, true}, the timeout for authentication +	    negotiation ({negotiation_timeout, integer()}) was never +	    removed.</p> +          <p> +	    This caused the session to always be terminated after the +	    timeout if parallel_login was set.</p> +          <p> +	    Own Id: OTP-12057 Aux Id: seq12663 </p> +        </item> +      </list> +    </section> + + +    <section><title>Improvements and New Features</title> +      <list> +        <item> +          <p> +	    Warning: this is experimental and may disappear or change +	    without previous warning.</p> +          <p> +	    Experimental support for running Quickcheck and PropEr +	    tests from common_test suites is added to common_test. +	    See the reference manual for the new module +	    <c>ct_property_testing</c>.</p> +          <p> +	    Experimental property tests are added under +	    <c>lib/{inet,ssh}/test/property_test</c>. They can be run +	    directly or from the commont_test suites +	    <c>inet/ftp_property_test_SUITE.erl</c> and +	    <c>ssh/test/ssh_property_test_SUITE.erl</c>.</p> +          <p> +	    See the code in the <c>test</c> directories and the man +	    page for details.</p> +          <p> +	    (Thanks to Tuncer Ayaz for a patch adding Triq)</p> +          <p> +	    Own Id: OTP-12119</p> +        </item> +      </list> +    </section> + +</section> + +<section><title>Ssh 3.0.4</title> + +    <section><title>Fixed Bugs and Malfunctions</title> +      <list> +        <item> +          <p> +	    When starting an ssh-daemon giving the option +	    {parallel_login, true}, the timeout for authentication +	    negotiation ({negotiation_timeout, integer()}) was never +	    removed.</p> +          <p> +	    This caused the session to always be terminated after the +	    timeout if parallel_login was set.</p> +          <p> +	    Own Id: OTP-12057 Aux Id: seq12663 </p> +        </item> +      </list> +    </section> + +</section> + +<section><title>Ssh 3.0.3</title> + +    <section><title>Fixed Bugs and Malfunctions</title> +      <list> +        <item> +          <p> +	    Removed mail address from error reports and corrected +	    spelling error (Stacktace -> stacktrace)</p> +          <p> +	    Own Id: OTP-11883 Aux Id: seq12586 </p> +        </item> +        <item> +          <p> +	    Decode/encode fixes in SSH_MSG_IGNORE and +	    SSH_MSG_UNIMPLEMENTED.</p> +          <p> +	    Own Id: OTP-11983</p> +        </item> +      </list> +    </section> + + +    <section><title>Improvements and New Features</title> +      <list> +        <item> +          <p> +	    Accepts that some older OpenSSH clients sends incorrect +	    disconnect messages.</p> +          <p> +	    Own Id: OTP-11972</p> +        </item> +        <item> +          <p> +	    Handle inet and inet6 option correctly</p> +          <p> +	    Own Id: OTP-11976</p> +        </item> +      </list> +    </section> + +</section> +  <section><title>Ssh 3.0.2</title>      <section><title>Fixed Bugs and Malfunctions</title> diff --git a/lib/ssh/doc/src/ssh.xml b/lib/ssh/doc/src/ssh.xml index 5a141ced3c..d481a75c9a 100644 --- a/lib/ssh/doc/src/ssh.xml +++ b/lib/ssh/doc/src/ssh.xml @@ -4,7 +4,7 @@  <erlref>    <header>      <copyright> -      <year>2004</year><year>2013</year> +      <year>2004</year><year>2014</year>        <holder>Ericsson AB. All Rights Reserved.</holder>      </copyright>      <legalnotice> @@ -36,8 +36,8 @@      <list type="bulleted">        <item>SSH requires the crypto and public_key applications.</item>        <item>Supported SSH version is 2.0 </item> -      <item>Supported MAC algorithms: hmac-sha1</item> -      <item>Supported encryption algorithms: aes128-cb and 3des-cbc</item> +      <item>Supported MAC algorithms: hmac-sha2-256 and hmac-sha1</item> +      <item>Supported encryption algorithms: aes128-ctr, aes128-cb and 3des-cbc</item>        <item>Supports unicode filenames if the emulator and the underlaying OS supports it. See the DESCRIPTION section in <seealso marker="kernel:file">file</seealso> for information about this subject</item>        <item>Supports unicode in shell and cli</item>      </list> @@ -97,6 +97,8 @@  	<seealso marker="ssh_connection#session_channel/2">ssh_connection:session_channel/[2, 4]</seealso>.</p>  	<p>Options are:</p>  	<taglist> +	  <tag><c><![CDATA[{inet, inet | inet6}]]></c></tag> +	  <item> IP version to use.</item>            <tag><c><![CDATA[{user_dir, string()}]]></c></tag>  	  <item>  	    <p>Sets the user directory i.e. the directory containing @@ -230,11 +232,13 @@          port.</p>  	<p>Options are:</p>          <taglist> -	  <tag><c><![CDATA[{subsystems, [subsystem_spec()]]]></c></tag> +	  <tag><c><![CDATA[{inet, inet | inet6}]]></c></tag> +	  <item> IP version to use when the host address is specified as <c>any</c>. </item> +	  <tag><c><![CDATA[{subsystems, [subsystem_spec()]}]]></c></tag>  	  <item>  	    Provides specifications for handling of subsystems. The  	    "sftp" subsystem spec can be retrieved by calling -	    ssh_sftpd:subsystem_spec/1. If the subsystems option in +	    ssh_sftpd:subsystem_spec/1. If the subsystems option is  	    not present the value of  	    <c>[ssh_sftpd:subsystem_spec([])]</c> will be used.  It is  	    of course possible to set the option to the empty list if diff --git a/lib/ssh/doc/src/ssh_connection.xml b/lib/ssh/doc/src/ssh_connection.xml index 72e7252536..5e2926dfa6 100644 --- a/lib/ssh/doc/src/ssh_connection.xml +++ b/lib/ssh/doc/src/ssh_connection.xml @@ -5,7 +5,7 @@    <header>      <copyright>        <year>2008</year> -      <year>2013</year> +      <year>2014</year>        <holder>Ericsson AB, All Rights Reserved</holder>      </copyright>      <legalnotice> @@ -62,6 +62,7 @@      <p><c>ssh_request_status() = success | failure</c></p>      <p><c>event() = {ssh_cm, ssh_connection_ref(), ssh_event_msg()} </c></p>      <p><c>ssh_event_msg()  = data_events() | status_events() | terminal_events() </c></p> +    <p><c>reason() = timeout | closed  </c></p>      <taglist>        <tag><b>data_events()</b></tag> @@ -137,7 +138,7 @@  	 <tag><c><![CDATA[{pty, ssh_channel_id(),  	 boolean() = WantReply, {string() = Terminal, integer() = CharWidth, -	 integer() = RowHeight, integer() = PixelWidth, integer() = PixelHight, +	 integer() = RowHeight, integer() = PixelWidth, integer() = PixelHeight,  	 [{atom() | integer() = Opcode,  	 integer() = Value}] = TerminalModes}}]]></c></tag>  	 <item>A pseudo-terminal has been requested for the @@ -148,11 +149,11 @@  	 drawable area of the window. The <c>Opcode</c> in the  	 <c>TerminalModes</c> list is the mnemonic name, represented  	 as an lowercase erlang atom, defined in -	 <url href="http://www.ietf.org/rfc/rfc4254.txt">RFC 4254  </url> section 8, -	 or the opcode if the mnemonic name is not listed in the +	 <url href="http://www.ietf.org/rfc/rfc4254.txt">RFC 4254  </url> section 8. +	 It may also be an opcode if the mnemonic name is not listed in the  	 RFC. Example <c>OP code: 53, mnemonic name ECHO erlang atom: -	 echo</c>. There is currently no API function to generate this -	 event.</item> +	 echo</c>.This event is sent as result of calling <seealso +	 marker="ssh_connection#ptty_alloc/4">ssh_connection:ptty_alloc/4</seealso></item>  	 <tag><c><![CDATA[{shell, boolean() = WantReply}]]></c></tag>  	 <item> This message will request that the user's default shell @@ -218,7 +219,7 @@     </func>     <func> -     <name>exec(ConnectionRef, ChannelId, Command, TimeOut) -> ssh_request_status()  </name> +     <name>exec(ConnectionRef, ChannelId, Command, TimeOut) -> ssh_request_status() | {error, reason()} </name>       <fsummary>Request that the server start the execution of the given command.  </fsummary>       <type>         <v> ConnectionRef = ssh_connection_ref() </v> @@ -273,7 +274,53 @@       </desc>     </func> -     <func> +   <func> +     <name>ptty_alloc(ConnectionRef, ChannelId, Options) ->  </name> +     <name>ptty_alloc(ConnectionRef, ChannelId, Options, Timeout) ->  > ssh_request_status() | {error, reason()}  </name> +       <fsummary>Send status replies to requests that want such replies. </fsummary> +      <type> +	<v> ConnectionRef = ssh_connection_ref() </v> +	<v> ChannelId = ssh_channel_id()</v> +	<v> Options = proplists:proplist()</v> +      </type> +      <desc> +	<p> Sends a SSH Connection Protocol pty_req, to allocate a pseudo tty. +	Should be called by a SSH client process. +	Options are: +	</p> + +	<taglist> +	  <tag>{term, string()}</tag> +	  <item> +	    Defaults to os:getenv("TERM") or "vt100" if it is undefined.  +	  </item> +	  <tag>{width, integer()}</tag> +	  <item> +	    Defaults to 80 if pixel_width is not defined. +	  </item> +	  <tag>{height, integer()}</tag> +	  <item> +	    Defaults to 24 if pixel_height is not defined. +	  </item> +	  <tag>{pixel_width, integer()}</tag> +	  <item> +	    Is disregarded if width is defined. +	  </item> +	  <tag>{pixel_height, integer()}</tag> +	  <item> +	    Is disregarded if height is defined. +	  </item> +	  <tag>{pty_opts, [{posix_atom(), integer()}]}</tag> +	  <item> +	    Option may be an empty list, otherwise +	    see possible POSIX names in section 8 in <url href="http://www.ietf.org/rfc/rfc4254.txt"> RFC 4254</url>. +	  </item> +	 </taglist> + +      </desc> +     </func> + +   <func>         <name>reply_request(ConnectionRef, WantReply, Status, ChannelId) -> ok</name>         <fsummary>Send status replies to requests that want such replies. </fsummary>        <type> @@ -329,7 +376,7 @@       <func>         <name>session_channel(ConnectionRef, Timeout) -> </name>         <name>session_channel(ConnectionRef, InitialWindowSize, -       MaxPacketSize, Timeout) -> {ok, ssh_channel_id()} | {error, Reason}</name> +       MaxPacketSize, Timeout) -> {ok, ssh_channel_id()} | {error, reason()}</name>         <fsummary>Opens a channel for a ssh session. </fsummary>         <type>  	 <v> ConnectionRef = ssh_connection_ref()</v> @@ -346,7 +393,7 @@       </func>      <func> -      <name>setenv(ConnectionRef, ChannelId, Var, Value, TimeOut) -> ssh_request_status()</name> +      <name>setenv(ConnectionRef, ChannelId, Var, Value, TimeOut) -> ssh_request_status() | {error, reason()} </name>        <fsummary> Environment variables may be passed to the        shell/command to be started later.</fsummary>        <type> @@ -364,7 +411,7 @@      </func>      <func> -      <name>shell(ConnectionRef, ChannelId) -> ssh_request_status() +      <name>shell(ConnectionRef, ChannelId) -> ssh_request_status() | {error, closed}        </name>        <fsummary> Requests that the user's default shell (typically        defined in /etc/passwd in UNIX systems) shall be executed at the server @@ -381,7 +428,7 @@      </func>      <func> -      <name>subsystem(ConnectionRef, ChannelId, Subsystem, Timeout) -> ssh_request_status()</name> +      <name>subsystem(ConnectionRef, ChannelId, Subsystem, Timeout) -> ssh_request_status() | {error, reason()} </name>        <fsummary>  </fsummary>         <type>  	 <v> ConnectionRef = ssh_connection_ref() </v> diff --git a/lib/ssh/doc/src/ssh_sftp.xml b/lib/ssh/doc/src/ssh_sftp.xml index e55d092fe2..ab111562f9 100644 --- a/lib/ssh/doc/src/ssh_sftp.xml +++ b/lib/ssh/doc/src/ssh_sftp.xml @@ -4,7 +4,7 @@  <erlref>    <header>      <copyright> -      <year>2005</year><year>2013</year> +      <year>2005</year><year>2014</year>        <holder>Ericsson AB. All Rights Reserved.</holder>      </copyright>      <legalnotice> @@ -81,6 +81,17 @@  	    <p>The timeout is passed to the ssh_channel start function,  	    and defaults to infinity.</p>  	  </item> +	  <tag> +	    <p><c><![CDATA[{sftp_vsn, integer()}]]></c></p> +	  </tag> +	  <item> +	    <p> +	      Desired SFTP protocol version. +	      The actual version will be the minimum of +	      the desired version and the maximum supported +	      versions by the SFTP server. +	    </p> +	  </item>  	</taglist>  	<p>All other options are  directly passed to  	<seealso marker="ssh">ssh:connect/3</seealso> or ignored if a @@ -183,6 +194,118 @@            can be used for reading directory contents.</p>        </desc>      </func> + +    <func> +      <name>open_tar(ChannelPid, Path, Mode) -></name> +      <name>open_tar(ChannelPid, Path, Mode, Timeout) -> {ok, Handle} | {error, Reason}</name> +      <fsummary>Opens a tar file on the server to which <v>ChannelPid</v> is connected and returns a handle</fsummary> +      <type> +        <v>ChannelPid = pid()</v> +        <v>Path = string()</v> +	<v>Mode = [read] | [write] | [read,EncryptOpt] | [write,DecryptOpt] </v> +	<v>EncryptOpt = {crypto,{InitFun,EncryptFun,CloseFun}}</v> +	<v>DecryptOpt = {crypto,{InitFun,DecryptFun}}</v> +	<v>InitFun = (fun() -> {ok,CryptoState}) | (fun() -> {ok,CryptoState,ChunkSize}) </v> +	<v>CryptoState = any()</v> +	<v>ChunkSize = undefined | pos_integer()</v> +	<v>EncryptFun = (fun(PlainBin,CryptoState) -> EncryptResult)</v> +	<v>EncryptResult = {ok,EncryptedBin,CryptoState} | {ok,EncryptedBin,CryptoState,ChunkSize}</v> +	<v>PlainBin = binary()</v> +	<v>EncryptedBin = binary()</v> +	<v>DecryptFun = (fun(EncryptedBin,CryptoState) -> DecryptResult)</v> +	<v>DecryptResult = {ok,PlainBin,CryptoState} | {ok,PlainBin,CryptoState,ChunkSize}</v> +	<v>CloseFun = (fun(PlainBin,CryptoState) -> {ok,EncryptedBin})</v> +	<v>Timeout = timeout()</v> +        <v>Reason = term()</v> +      </type> +      <desc> +        <p>Opens a handle to a tar file on the server associated with <c>ChannelPid</c>. The handle +	can be used for remote tar creation and extraction as defined by the +	<seealso marker="stdlib:erl_tar#init/3">erl_tar:init/3</seealso> function. +	</p> +	<p>An example of writing and then reading a tar file:</p> +        <code type="none"> +          {ok,HandleWrite} = ssh_sftp:open_tar(ChannelPid, ?tar_file_name, [write]), +          ok = erl_tar:add(HandleWrite, .... ), +          ok = erl_tar:add(HandleWrite, .... ), +              ... +          ok = erl_tar:add(HandleWrite, .... ), +          ok = erl_tar:close(HandleWrite), + +          %% And for reading +          {ok,HandleRead} = ssh_sftp:open_tar(ChannelPid, ?tar_file_name, [read]), +          {ok,NameValueList} = erl_tar:extract(HandleRead,[memory]), +          ok = erl_tar:close(HandleRead), +        </code> + +	<p>The <c>crypto</c> mode option is applied to the generated stream of bytes just prior to sending +	them to the sftp server.  This is intended for encryption but could of course be used for other +	purposes. +	</p> +	<p>The <c>InitFun</c> is applied once +	prior to any other crypto operation. The returned <c>CryptoState</c> is then folded into +	repeated applications of the <c>EncryptFun</c> or <c>DecryptFun</c>.  The binary returned +	from those Funs are sent further to the remote sftp server. Finally - if doing encryption +	- the <c>CloseFun</c> is applied to the last piece of data.  The <c>CloseFun</c> is +	responsible for padding (if needed) and encryption of that last piece. +	</p> +	<p>The <c>ChunkSize</c> defines the size of the <c>PlainBin</c>s that <c>EncodeFun</c> is applied +	to. If the <c>ChunkSize</c> is <c>undefined</c> the size of the <c>PlainBin</c>s varies because +	this is	inteded for stream crypto while a fixed  <c>ChunkSize</c> is intended for block crypto. It +	is possible to change the  <c>ChunkSize</c>s in the return from the <c>EncryptFun</c> or +	<c>DecryptFun</c>. It is in fact possible to change the value between <c>pos_integer()</c> and +	<c>undefined</c>. +	</p> +	<p>The write and read example above can be extended with encryption and decryption:</p> +        <code type="none"> +          %% First three parameters depending on which crypto type we select: +          Key = <<"This is a 256 bit key. abcdefghi">>, +          Ivec0 = crypto:rand_bytes(16), +          DataSize = 1024,  % DataSize rem 16 = 0 for aes_cbc + +          %% Initialization of the CryptoState, in this case it is the Ivector. +          InitFun = fun() -> {ok, Ivec0, DataSize} end, + +          %% How to encrypt: +          EncryptFun =  +              fun(PlainBin,Ivec) ->  +                   EncryptedBin = crypto:block_encrypt(aes_cbc256, Key, Ivec, PlainBin), +                   {ok, EncryptedBin, crypto:next_iv(aes_cbc,EncryptedBin)} +              end, + +          %% What to do with the very last block: +          CloseFun =  +              fun(PlainBin, Ivec) -> +                    EncryptedBin = crypto:block_encrypt(aes_cbc256, Key, Ivec,  +                                                     pad(16,PlainBin) %% Last chunk +                                                     ), +                    {ok, EncryptedBin}  +            end, + +          Cw = {InitFun,EncryptFun,CloseFun}, +          {ok,HandleWrite} = ssh_sftp:open_tar(ChannelPid, ?tar_file_name, [write,{crypto,Cw}]), +          ok = erl_tar:add(HandleWrite, .... ), +          ok = erl_tar:add(HandleWrite, .... ), +              ... +          ok = erl_tar:add(HandleWrite, .... ), +          ok = erl_tar:close(HandleWrite), + +          %% And for decryption (in this crypto example we could use the same InitFun +          %% as for encryption): +          DecryptFun =  +              fun(EncryptedBin,Ivec) -> +                   PlainBin = crypto:block_decrypt(aes_cbc256, Key, Ivec, EncryptedBin), +                   {ok, PlainBin, crypto:next_iv(aes_cbc,EncryptedBin)} +              end, + +          Cr = {InitFun,DecryptFun}, +          {ok,HandleRead} = ssh_sftp:open_tar(ChannelPid, ?tar_file_name, [read,{crypto,Cw}]), +          {ok,NameValueList} = erl_tar:extract(HandleRead,[memory]), +          ok = erl_tar:close(HandleRead), +        </code> +      </desc> +    </func> +      <func>        <name>close(ChannelPid, Handle) -> </name>        <name>close(ChannelPid, Handle, Timeout) -> ok | {error, Reason}</name> diff --git a/lib/ssh/doc/src/using_ssh.xml b/lib/ssh/doc/src/using_ssh.xml index 9ab71260d3..46178d4018 100644 --- a/lib/ssh/doc/src/using_ssh.xml +++ b/lib/ssh/doc/src/using_ssh.xml @@ -79,7 +79,7 @@      <p> The option user_dir defaults to the users ~/.ssh  directory</p>      <p>In the following example we generate new keys and host keys as -    to be able to run the example without having root privilages</p> +    to be able to run the example without having root privileges</p>      <code>        $bash> ssh-keygen -t rsa -f /tmp/ssh_daemon/ssh_host_rsa_key | 
