internal IdentityFile(String identity, SshClient jsch) { this.identity = identity; this.jsch = jsch; try { Type c = Type.GetType(jsch.getConfig("3des-cbc")); cipher = (ICipher)Activator.CreateInstance(c); key = new byte[cipher.getBlockSize()]; // 24 iv = new byte[cipher.getIVSize()]; // 8 c = Type.GetType(jsch.getConfig("md5")); hash = (IHASH)(Activator.CreateInstance(c)); hash.Init(); FileInfo file = new FileInfo(identity); FileStream fis = File.OpenRead(identity); byte[] buf = new byte[(int)(file.Length)]; int len = fis.Read(buf, 0, buf.Length); fis.Close(); int i = 0; while (i < len) { if (buf[i] == 'B' && 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.out.println("invalid format: "+identity); throw new SshClientException("invaid privatekey: " + identity); } i += 3; continue; } if (buf[i] == 'C' && buf[i + 1] == 'B' && buf[i + 2] == 'C' && buf[i + 3] == ',') { i += 4; for (int ii = 0; ii < iv.Length; ii++) { iv[ii] = (byte)(((a2b(buf[i++]) << 4) & 0xf0) + (a2b(buf[i++]) & 0xf)); } continue; } if (buf[i] == 0x0d && i + 1 < buf.Length && buf[i + 1] == 0x0a) { i++; continue; } if (buf[i] == 0x0a && i + 1 < buf.Length) { if (buf[i + 1] == 0x0a) { i += 2; break; } if (buf[i + 1] == 0x0d && i + 2 < buf.Length && buf[i + 2] == 0x0a) { i += 3; break; } bool inheader = false; for (int j = i + 1; j < buf.Length; j++) { if (buf[j] == 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 SshClientException("invaid privatekey: " + identity); } int start = i; while (i < len) { if (buf[i] == 0x0a) { bool xd = (buf[i - 1] == 0x0d); 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 = StringAux.fromBase64(buf, start, i - start); if (encoded_data.Length > 4 && // FSecure encoded_data[0] == (byte)0x3f && encoded_data[1] == (byte)0x6f && encoded_data[2] == (byte)0xf9 && encoded_data[3] == (byte)0xeb) { Buffer _buf = new Buffer(encoded_data); _buf.getInt(); // 0x3f6ff9be _buf.getInt(); byte[] _type = _buf.getString(); //System.out.println("type: "+new String(_type)); byte[] _cipher = _buf.getString(); String s_cipher = System.Text.Encoding.Default.GetString(_cipher); //System.out.println("cipher: "+cipher); if (s_cipher.Equals("3des-cbc")) { _buf.getInt(); byte[] foo = new byte[encoded_data.Length - _buf.getOffSet()]; _buf.getByte(foo); encoded_data = foo; encrypted = true; throw new SshClientException("unknown privatekey format: " + identity); } else if (s_cipher.Equals("none")) { _buf.getInt(); //_buf.getInt(); encrypted = false; byte[] foo = new byte[encoded_data.Length - _buf.getOffSet()]; _buf.getByte(foo); encoded_data = foo; } } try { file = new FileInfo(identity + ".pub"); fis = File.OpenRead(identity + ".pub"); buf = new byte[(int)(file.Length)]; len = fis.Read(buf, 0, buf.Length); fis.Close(); } catch { return; } if (buf.Length > 4 && // FSecure's public key buf[0] == '-' && buf[1] == '-' && buf[2] == '-' && buf[3] == '-') { i = 0; do { i++; } while (buf.Length > i && buf[i] != 0x0a); if (buf.Length <= i) { return; } while (true) { if (buf[i] == 0x0a) { bool inheader = false; for (int j = i + 1; j < buf.Length; j++) { if (buf[j] == 0x0a) { break; } if (buf[j] == ':') { inheader = true; break; } } if (!inheader) { i++; break; } } i++; } if (buf.Length <= i) { return; } start = i; while (i < len) { if (buf[i] == 0x0a) { Array.Copy(buf, i + 1, buf, i, len - i - 1); len--; continue; } if (buf[i] == '-') { break; } i++; } publickeyblob = StringAux.fromBase64(buf, start, i - start); if (type == UNKNOWN) { 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] == ' ') { break; } i++; } publickeyblob = StringAux.fromBase64(buf, start, i - start); } } catch (Exception e) { Console.WriteLine("Identity: " + e); if (e is SshClientException) { throw (SshClientException)e; } throw new SshClientException(e.ToString()); } }
public static AKeyPair load(SshClient jsch, String prvkey, String pubkey) { byte[] iv = new byte[8]; // 8 bool encrypted = true; byte[] data = null; byte[] publickeyblob = null; int type = ERROR; int vendor = VENDOR_OPENSSH; try { //File file=new File(prvkey); FileStream fis = File.OpenRead(prvkey); byte[] buf = new byte[(int)(fis.Length)]; int len = fis.Read(buf, 0, buf.Length); fis.Close(); int i = 0; while (i < len) { if (buf[i] == 'B' && 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 = DSA; } 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; vendor = VENDOR_FSECURE; } else { //System.outs.println("invalid format: "+identity); throw new SshClientException("invaid privatekey: " + prvkey); } i += 3; continue; } if (buf[i] == 'C' && buf[i + 1] == 'B' && buf[i + 2] == 'C' && buf[i + 3] == ',') { i += 4; for (int ii = 0; ii < iv.Length; ii++) { iv[ii] = (byte)(((a2b(buf[i++]) << 4) & 0xf0) + (a2b(buf[i++]) & 0xf)); } continue; } if (buf[i] == 0x0d && i + 1 < buf.Length && buf[i + 1] == 0x0a) { i++; continue; } if (buf[i] == 0x0a && i + 1 < buf.Length) { if (buf[i + 1] == 0x0a) { i += 2; break; } if (buf[i + 1] == 0x0d && i + 2 < buf.Length && buf[i + 2] == 0x0a) { i += 3; break; } bool inheader = false; for (int j = i + 1; j < buf.Length; j++) { if (buf[j] == 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 SshClientException("invaid privatekey: " + prvkey); } int start = i; while (i < len) { if (buf[i] == 0x0a) { bool xd = (buf[i - 1] == 0x0d); 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++; } data = StringAux.fromBase64(buf, start, i - start); if (data.Length > 4 && // FSecure data[0] == (byte)0x3f && data[1] == (byte)0x6f && data[2] == (byte)0xf9 && data[3] == (byte)0xeb) { LibSterileSSH.SecureShell.Buffer _buf = new LibSterileSSH.SecureShell.Buffer(data); _buf.getInt(); // 0x3f6ff9be _buf.getInt(); byte[] _type = _buf.getString(); //System.outs.println("type: "+new String(_type)); byte[] _cipher = _buf.getString(); String cipher = StringAux.getString(_cipher); //System.outs.println("cipher: "+cipher); if (cipher.Equals("3des-cbc")) { _buf.getInt(); byte[] foo = new byte[data.Length - _buf.getOffSet()]; _buf.getByte(foo); data = foo; encrypted = true; throw new SshClientException("unknown privatekey format: " + prvkey); } else if (cipher.Equals("none")) { _buf.getInt(); _buf.getInt(); encrypted = false; byte[] foo = new byte[data.Length - _buf.getOffSet()]; _buf.getByte(foo); data = foo; } } if (pubkey != null) { try { //file=new File(pubkey); fis = File.OpenRead(pubkey); buf = new byte[(int)(fis.Length)]; len = fis.Read(buf, 0, buf.Length); fis.Close(); if (buf.Length > 4 && // FSecure's public key buf[0] == '-' && buf[1] == '-' && buf[2] == '-' && buf[3] == '-') { bool valid = true; i = 0; do { i++; } while (buf.Length > i && buf[i] != 0x0a); if (buf.Length <= i) { valid = false; } while (valid) { if (buf[i] == 0x0a) { bool inheader = false; for (int j = i + 1; j < buf.Length; j++) { if (buf[j] == 0x0a) { break; } if (buf[j] == ':') { inheader = true; break; } } if (!inheader) { i++; break; } } i++; } if (buf.Length <= i) { valid = false; } start = i; while (valid && i < len) { if (buf[i] == 0x0a) { Array.Copy(buf, i + 1, buf, i, len - i - 1); len--; continue; } if (buf[i] == '-') { break; } i++; } if (valid) { publickeyblob = StringAux.fromBase64(buf, start, i - start); if (type == UNKNOWN) { if (publickeyblob[8] == 'd') { type = DSA; } else if (publickeyblob[8] == 'r') { type = RSA; } } } } else { if (buf[0] == 's' && buf[1] == 's' && buf[2] == 'h' && buf[3] == '-') { i = 0; while (i < len) { if (buf[i] == ' ') { break; } i++; } i++; if (i < len) { start = i; while (i < len) { if (buf[i] == ' ') { break; } i++; } publickeyblob = StringAux.fromBase64(buf, start, i - start); } } } } catch //(Exception ee) { } } } catch (Exception e) { if (e is SshClientException) { throw (SshClientException)e; } throw new SshClientException(e.ToString()); } AKeyPair kpair = null; if (type == DSA) { kpair = new KeyPairDSA(jsch); } else if (type == RSA) { kpair = new KeyPairRSA(jsch); } if (kpair != null) { kpair.encrypted = encrypted; kpair.publickeyblob = publickeyblob; kpair.vendor = vendor; if (encrypted) { kpair.iv = iv; kpair.data = data; } else { if (kpair.parse(data)) { return(kpair); } else { throw new SshClientException("invaid privatekey: " + prvkey); } } } return(kpair); }
internal void setKnownHosts(StreamReader foo) { pool.Clear(); System.Text.StringBuilder sb = new System.Text.StringBuilder(); byte i; int j; bool error = false; try { StreamReader fis = foo; String host; String key = null; int type; byte[] buf = new byte[1024]; int bufl = 0; loop: while (true) { bufl = 0; while (true) { j = fis.Read(); if (j == -1) { goto break_loop; } if (j == 0x0d) { continue; } if (j == 0x0a) { break; } buf[bufl++] = (byte)j; } j = 0; while (j < bufl) { i = buf[j]; if (i == ' ' || i == '\t') { j++; continue; } if (i == '#') { addInvalidLine(System.Text.Encoding.Default.GetString(buf, 0, bufl)); goto loop; } break; } if (j >= bufl) { addInvalidLine(System.Text.Encoding.Default.GetString(buf, 0, bufl)); goto loop; } sb.Length = 0; while (j < bufl) { i = buf[j++]; if (i == 0x20 || i == '\t') { break; } sb.Append((char)i); } host = sb.ToString(); if (j >= bufl || host.Length == 0) { addInvalidLine(System.Text.Encoding.Default.GetString(buf, 0, bufl)); goto loop; } sb.Length = 0; type = -1; while (j < bufl) { i = buf[j++]; if (i == 0x20 || i == '\t') { break; } sb.Append((char)i); } if (sb.ToString().Equals("ssh-dss")) { type = HostKey.SSHDSS; } else if (sb.ToString().Equals("ssh-rsa")) { type = HostKey.SSHRSA; } else { j = bufl; } if (j >= bufl) { addInvalidLine(StringAux.getString(buf, 0, bufl)); goto loop; } sb.Length = 0; while (j < bufl) { i = buf[j++]; if (i == 0x0d) { continue; } if (i == 0x0a) { break; } sb.Append((char)i); } key = sb.ToString(); if (key.Length == 0) { addInvalidLine(StringAux.getString(buf, 0, bufl)); goto loop; } //System.out.println(host); //System.out.println("|"+key+"|"); HostKey hk = new HostKey(host, type, StringAux.fromBase64(StringAux.getBytes(key), 0, key.Length)); pool.Add(hk); } break_loop: fis.Close(); if (error) { throw new SshClientException("KnownHosts: invalid format"); } } catch (Exception e) { if (e is SshClientException) { throw (SshClientException)e; } throw new SshClientException(e.ToString()); } }