internal static string GetFingerPrint(HASH hash, byte[] data) { try { hash.Init(); hash.Update(data, 0, data.Length); byte[] foo = hash.Digest(); StringBuilder sb = new StringBuilder(); int bar; for (int i = 0; i < foo.Length; i++) { bar = foo[i] & unchecked ((int)(0xff)); sb.Append(chars[((int)(((uint)bar) >> 4)) & unchecked ((int)(0xf))]); sb.Append(chars[(bar) & unchecked ((int)(0xf))]); if (i + 1 < foo.Length) { sb.Append(":"); } } return(sb.ToString()); } catch (Exception) { return("???"); } }
private HASH GenHash() { try { Type c = Sharpen.Runtime.GetType(JSch.GetConfig("md5")); hash = (HASH)(System.Activator.CreateInstance(c)); hash.Init(); } catch (Exception) { } return(hash); }
internal static string GetFingerPrint(HASH hash, byte[] data) { try { hash.Init(); hash.Update(data, 0, data.Length); byte[] foo = hash.Digest(); StringBuilder sb = new StringBuilder(); int bar; for (int i = 0; i < foo.Length; i++) { bar = foo[i] & unchecked((int)(0xff)); sb.Append(chars[((int)(((uint)bar) >> 4)) & unchecked((int)(0xf))]); sb.Append(chars[(bar) & unchecked((int)(0xf))]); if (i + 1 < foo.Length) { sb.Append(":"); } } return sb.ToString(); } catch (Exception) { return "???"; } }
private HASH GenHash() { try { Type c = Sharpen.Runtime.GetType(JSch.GetConfig("md5")); hash = (HASH)(System.Activator.CreateInstance(c)); hash.Init(); } catch (Exception) { } return hash; }
/// <exception cref="NSch.JSchException"></exception> private IdentityFile(string name, byte[] prvkey, byte[] pubkey, JSch jsch) { this.identity = name; this.jsch = jsch; // prvkey from "ssh-add" command on the remote. if (pubkey == null && prvkey != null && (prvkey.Length > 11 && prvkey[0] == 0 && prvkey[1] == 0 && prvkey[2] == 0 && prvkey[3] == 7)) { Buffer buf = new Buffer(prvkey); string _type = Sharpen.Runtime.GetStringForBytes(buf.GetString()); // ssh-rsa if (_type.Equals("ssh-rsa")) { type = RSA; n_array = buf.GetString(); e_array = buf.GetString(); d_array = buf.GetString(); buf.GetString(); buf.GetString(); buf.GetString(); this.identity += Sharpen.Runtime.GetStringForBytes(buf.GetString()); } else { if (_type.Equals("ssh-dss")) { type = DSS; P_array = buf.GetString(); Q_array = buf.GetString(); G_array = buf.GetString(); pub_array = buf.GetString(); prv_array = buf.GetString(); this.identity += Sharpen.Runtime.GetStringForBytes(buf.GetString()); } else { throw new JSchException("privatekey: invalid key " + Sharpen.Runtime.GetStringForBytes (prvkey, 4, 7)); } } encoded_data = prvkey; encrypted = false; keytype = OPENSSH; return; } try { Type c; c = Sharpen.Runtime.GetType((string)JSch.GetConfig("3des-cbc")); cipher = (NSch.Cipher)(System.Activator.CreateInstance(c)); key = new byte[cipher.GetBlockSize()]; // 24 iv = new byte[cipher.GetIVSize()]; // 8 c = Sharpen.Runtime.GetType((string)JSch.GetConfig("md5")); hash = (HASH)(System.Activator.CreateInstance(c)); hash.Init(); byte[] buf = prvkey; int len = buf.Length; int i = 0; while (i < len) { if (buf[i] == '-' && i + 4 < len && buf[i + 1] == '-' && buf[i + 2] == '-' && buf [i + 3] == '-' && buf[i + 4] == '-') { break; } i++; } while (i < len) { if (buf[i] == 'B' && i + 3 < len && buf[i + 1] == 'E' && buf[i + 2] == 'G' && buf [i + 3] == 'I') { i += 6; if (buf[i] == 'D' && buf[i + 1] == 'S' && buf[i + 2] == 'A') { type = DSS; } else { if (buf[i] == 'R' && buf[i + 1] == 'S' && buf[i + 2] == 'A') { type = RSA; } else { if (buf[i] == 'S' && buf[i + 1] == 'S' && buf[i + 2] == 'H') { // FSecure type = UNKNOWN; keytype = FSECURE; } else { //System.err.println("invalid format: "+identity); throw new JSchException("invalid privatekey: " + identity); } } } i += 3; continue; } if (buf[i] == 'A' && i + 7 < len && buf[i + 1] == 'E' && buf[i + 2] == 'S' && buf [i + 3] == '-' && buf[i + 4] == '2' && buf[i + 5] == '5' && buf[i + 6] == '6' && buf[i + 7] == '-') { i += 8; if (Session.CheckCipher((string)JSch.GetConfig("aes256-cbc"))) { c = Sharpen.Runtime.GetType((string)JSch.GetConfig("aes256-cbc")); cipher = (NSch.Cipher)(System.Activator.CreateInstance(c)); key = new byte[cipher.GetBlockSize()]; iv = new byte[cipher.GetIVSize()]; } else { throw new JSchException("privatekey: aes256-cbc is not available " + identity); } continue; } if (buf[i] == 'A' && i + 7 < len && buf[i + 1] == 'E' && buf[i + 2] == 'S' && buf [i + 3] == '-' && buf[i + 4] == '1' && buf[i + 5] == '9' && buf[i + 6] == '2' && buf[i + 7] == '-') { i += 8; if (Session.CheckCipher((string)JSch.GetConfig("aes192-cbc"))) { c = Sharpen.Runtime.GetType((string)JSch.GetConfig("aes192-cbc")); cipher = (NSch.Cipher)(System.Activator.CreateInstance(c)); key = new byte[cipher.GetBlockSize()]; iv = new byte[cipher.GetIVSize()]; } else { throw new JSchException("privatekey: aes192-cbc is not available " + identity); } continue; } if (buf[i] == 'A' && i + 7 < len && buf[i + 1] == 'E' && buf[i + 2] == 'S' && buf [i + 3] == '-' && buf[i + 4] == '1' && buf[i + 5] == '2' && buf[i + 6] == '8' && buf[i + 7] == '-') { i += 8; if (Session.CheckCipher((string)JSch.GetConfig("aes128-cbc"))) { c = Sharpen.Runtime.GetType((string)JSch.GetConfig("aes128-cbc")); cipher = (NSch.Cipher)(System.Activator.CreateInstance(c)); key = new byte[cipher.GetBlockSize()]; iv = new byte[cipher.GetIVSize()]; } else { throw new JSchException("privatekey: aes128-cbc is not available " + identity); } continue; } if (buf[i] == 'C' && i + 3 < len && buf[i + 1] == 'B' && buf[i + 2] == 'C' && buf [i + 3] == ',') { i += 4; for (int ii = 0; ii < iv.Length; ii++) { iv[ii] = unchecked ((byte)(((A2b(buf[i++]) << 4) & unchecked ((int)(0xf0))) + (A2b( buf[i++]) & unchecked ((int)(0xf))))); } continue; } if (buf[i] == unchecked ((int)(0x0d)) && i + 1 < len && buf[i + 1] == unchecked ((int )(0x0a))) { i++; continue; } if (buf[i] == unchecked ((int)(0x0a)) && i + 1 < len) { if (buf[i + 1] == unchecked ((int)(0x0a))) { i += 2; break; } if (buf[i + 1] == unchecked ((int)(0x0d)) && i + 2 < len && buf[i + 2] == unchecked ( (int)(0x0a))) { i += 3; break; } bool inheader = false; for (int j = i + 1; j < len; j++) { if (buf[j] == unchecked ((int)(0x0a))) { break; } //if(buf[j]==0x0d) break; if (buf[j] == ':') { inheader = true; break; } } if (!inheader) { i++; encrypted = false; // no passphrase break; } } i++; } if (type == ERROR) { throw new JSchException("invalid privatekey: " + identity); } int start = i; while (i < len) { if (buf[i] == unchecked ((int)(0x0a))) { bool xd = (buf[i - 1] == unchecked ((int)(0x0d))); System.Array.Copy(buf, i + 1, buf, i - (xd ? 1 : 0), len - i - 1 - (xd ? 1 : 0)); if (xd) { len--; } len--; continue; } if (buf[i] == '-') { break; } i++; } encoded_data = Util.FromBase64(buf, start, i - start); if (encoded_data.Length > 4 && encoded_data[0] == unchecked ((byte)unchecked ((int) (0x3f))) && encoded_data[1] == unchecked ((byte)unchecked ((int)(0x6f))) && encoded_data [2] == unchecked ((byte)unchecked ((int)(0xf9))) && encoded_data[3] == unchecked (( byte)unchecked ((int)(0xeb)))) { // FSecure Buffer _buf = new Buffer(encoded_data); _buf.GetInt(); // 0x3f6ff9be _buf.GetInt(); byte[] _type = _buf.GetString(); //System.err.println("type: "+new String(_type)); byte[] _cipher = _buf.GetString(); string cipherStr = Util.Byte2str(_cipher); //System.err.println("cipher: "+cipher); if (cipherStr.Equals("3des-cbc")) { _buf.GetInt(); byte[] foo = new byte[encoded_data.Length - _buf.GetOffSet()]; _buf.GetByte(foo); encoded_data = foo; encrypted = true; throw new JSchException("unknown privatekey format: " + identity); } else { if (cipherStr.Equals("none")) { _buf.GetInt(); //_buf.getInt(); encrypted = false; byte[] foo = new byte[encoded_data.Length - _buf.GetOffSet()]; _buf.GetByte(foo); encoded_data = foo; } } } if (pubkey == null) { return; } buf = pubkey; len = buf.Length; if (buf.Length > 4 && buf[0] == '-' && buf[1] == '-' && buf[2] == '-' && buf[3] == '-') { // FSecure's public key i = 0; do { i++; }while (len > i && buf[i] != unchecked ((int)(0x0a))); if (len <= i) { return; } while (i < len) { if (buf[i] == unchecked ((int)(0x0a))) { bool inheader = false; for (int j = i + 1; j < len; j++) { if (buf[j] == unchecked ((int)(0x0a))) { break; } if (buf[j] == ':') { inheader = true; break; } } if (!inheader) { i++; break; } } i++; } if (len <= i) { return; } start = i; while (i < len) { if (buf[i] == unchecked ((int)(0x0a))) { System.Array.Copy(buf, i + 1, buf, i, len - i - 1); len--; continue; } if (buf[i] == '-') { break; } i++; } publickeyblob = Util.FromBase64(buf, start, i - start); if (type == UNKNOWN && publickeyblob.Length > 8) { if (publickeyblob[8] == 'd') { type = DSS; } else { if (publickeyblob[8] == 'r') { type = RSA; } } } } else { if (buf[0] != 's' || buf[1] != 's' || buf[2] != 'h' || buf[3] != '-') { return; } i = 0; while (i < len) { if (buf[i] == ' ') { break; } i++; } i++; if (i >= len) { return; } start = i; while (i < len) { if (buf[i] == ' ' || buf[i] == '\n') { break; } i++; } publickeyblob = Util.FromBase64(buf, start, i - start); if (publickeyblob.Length < 4 + 7) { // It must start with "ssh-XXX". if (JSch.GetLogger().IsEnabled(Logger.WARN)) { JSch.GetLogger().Log(Logger.WARN, "failed to parse the public key"); } publickeyblob = null; } } } catch (Exception e) { //System.err.println("IdentityFile: "+e); if (e is JSchException) { throw (JSchException)e; } if (e is Exception) { throw new JSchException(e.ToString(), (Exception)e); } throw new JSchException(e.ToString()); } }
/// <exception cref="NSch.JSchException"></exception> private IdentityFile(string name, byte[] prvkey, byte[] pubkey, JSch jsch) { this.identity = name; this.jsch = jsch; try { Type c; c = Sharpen.Runtime.GetType((string)JSch.GetConfig("3des-cbc")); cipher = (NSch.Cipher)(System.Activator.CreateInstance(c)); key = new byte[cipher.GetBlockSize()]; // 24 iv = new byte[cipher.GetIVSize()]; // 8 c = Sharpen.Runtime.GetType((string)JSch.GetConfig("md5")); hash = (HASH)(System.Activator.CreateInstance(c)); hash.Init(); byte[] buf = prvkey; int len = buf.Length; int i = 0; while (i < len) { if (buf[i] == '-' && i + 4 < len && buf[i + 1] == '-' && buf[i + 2] == '-' && buf [i + 3] == '-' && buf[i + 4] == '-') { break; } i++; } while (i < len) { if (buf[i] == 'B' && i + 3 < len && buf[i + 1] == 'E' && buf[i + 2] == 'G' && buf [i + 3] == 'I') { i += 6; if (buf[i] == 'D' && buf[i + 1] == 'S' && buf[i + 2] == 'A') { type = DSS; } else { if (buf[i] == 'R' && buf[i + 1] == 'S' && buf[i + 2] == 'A') { type = RSA; } else { if (buf[i] == 'S' && buf[i + 1] == 'S' && buf[i + 2] == 'H') { // FSecure type = UNKNOWN; keytype = FSECURE; } else { //System.err.println("invalid format: "+identity); throw new JSchException("invalid privatekey: " + identity); } } } i += 3; continue; } if (buf[i] == 'A' && i + 7 < len && buf[i + 1] == 'E' && buf[i + 2] == 'S' && buf [i + 3] == '-' && buf[i + 4] == '2' && buf[i + 5] == '5' && buf[i + 6] == '6' && buf[i + 7] == '-') { i += 8; if (Session.CheckCipher((string)JSch.GetConfig("aes256-cbc"))) { c = Sharpen.Runtime.GetType((string)JSch.GetConfig("aes256-cbc")); cipher = (NSch.Cipher)(System.Activator.CreateInstance(c)); key = new byte[cipher.GetBlockSize()]; iv = new byte[cipher.GetIVSize()]; } else { throw new JSchException("privatekey: aes256-cbc is not available " + identity); } continue; } if (buf[i] == 'C' && i + 3 < len && buf[i + 1] == 'B' && buf[i + 2] == 'C' && buf [i + 3] == ',') { i += 4; for (int ii = 0; ii < iv.Length; ii++) { iv[ii] = unchecked((byte)(((A2b(buf[i++]) << 4) & unchecked((int)(0xf0))) + (A2b( buf[i++]) & unchecked((int)(0xf))))); } continue; } if (buf[i] == unchecked((int)(0x0d)) && i + 1 < len && buf[i + 1] == unchecked((int )(0x0a))) { i++; continue; } if (buf[i] == unchecked((int)(0x0a)) && i + 1 < len) { if (buf[i + 1] == unchecked((int)(0x0a))) { i += 2; break; } if (buf[i + 1] == unchecked((int)(0x0d)) && i + 2 < len && buf[i + 2] == unchecked( (int)(0x0a))) { i += 3; break; } bool inheader = false; for (int j = i + 1; j < len; j++) { if (buf[j] == unchecked((int)(0x0a))) { break; } //if(buf[j]==0x0d) break; if (buf[j] == ':') { inheader = true; break; } } if (!inheader) { i++; encrypted = false; // no passphrase break; } } i++; } if (type == ERROR) { throw new JSchException("invalid privatekey: " + identity); } int start = i; while (i < len) { if (buf[i] == unchecked((int)(0x0a))) { bool xd = (buf[i - 1] == unchecked((int)(0x0d))); System.Array.Copy(buf, i + 1, buf, i - (xd ? 1 : 0), len - i - 1 - (xd ? 1 : 0)); if (xd) { len--; } len--; continue; } if (buf[i] == '-') { break; } i++; } encoded_data = Util.FromBase64(buf, start, i - start); if (encoded_data.Length > 4 && encoded_data[0] == unchecked((byte)unchecked((int) (0x3f))) && encoded_data[1] == unchecked((byte)unchecked((int)(0x6f))) && encoded_data [2] == unchecked((byte)unchecked((int)(0xf9))) && encoded_data[3] == unchecked(( byte)unchecked((int)(0xeb)))) { // FSecure Buffer _buf = new Buffer(encoded_data); _buf.GetInt(); // 0x3f6ff9be _buf.GetInt(); byte[] _type = _buf.GetString(); //System.err.println("type: "+new String(_type)); byte[] _cipher = _buf.GetString(); string cipher2 = Util.Byte2str(_cipher); //System.err.println("cipher: "+cipher); if (cipher2.Equals("3des-cbc")) { _buf.GetInt(); byte[] foo = new byte[encoded_data.Length - _buf.GetOffSet()]; _buf.GetByte(foo); encoded_data = foo; encrypted = true; throw new JSchException("unknown privatekey format: " + identity); } else { if (cipher2.Equals("none")) { _buf.GetInt(); //_buf.getInt(); encrypted = false; byte[] foo = new byte[encoded_data.Length - _buf.GetOffSet()]; _buf.GetByte(foo); encoded_data = foo; } } } if (pubkey == null) { return; } buf = pubkey; len = buf.Length; if (buf.Length > 4 && buf[0] == '-' && buf[1] == '-' && buf[2] == '-' && buf[3] == '-') { // FSecure's public key i = 0; do { i++; } while (len > i && buf[i] != unchecked((int)(0x0a))); if (len <= i) { return; } while (i < len) { if (buf[i] == unchecked((int)(0x0a))) { bool inheader = false; for (int j = i + 1; j < len; j++) { if (buf[j] == unchecked((int)(0x0a))) { break; } if (buf[j] == ':') { inheader = true; break; } } if (!inheader) { i++; break; } } i++; } if (len <= i) { return; } start = i; while (i < len) { if (buf[i] == unchecked((int)(0x0a))) { System.Array.Copy(buf, i + 1, buf, i, len - i - 1); len--; continue; } if (buf[i] == '-') { break; } i++; } publickeyblob = Util.FromBase64(buf, start, i - start); if (type == UNKNOWN && publickeyblob.Length > 8) { if (publickeyblob[8] == 'd') { type = DSS; } else { if (publickeyblob[8] == 'r') { type = RSA; } } } } else { if (buf[0] != 's' || buf[1] != 's' || buf[2] != 'h' || buf[3] != '-') { return; } i = 0; while (i < len) { if (buf[i] == ' ') { break; } i++; } i++; if (i >= len) { return; } start = i; while (i < len) { if (buf[i] == ' ' || buf[i] == '\n') { break; } i++; } publickeyblob = Util.FromBase64(buf, start, i - start); if (publickeyblob.Length < 4 + 7) { // It must start with "ssh-XXX". if (JSch.GetLogger().IsEnabled(Logger.WARN)) { JSch.GetLogger().Log(Logger.WARN, "failed to parse the public key"); } publickeyblob = null; } } } catch (Exception e) { //System.err.println("IdentityFile: "+e); if (e is JSchException) { throw (JSchException)e; } if (e is Exception) { throw new JSchException(e.ToString(), (Exception)e); } throw new JSchException(e.ToString()); } }