SparkleShare/SharpSSH/Main.cs
2010-07-15 20:41:37 +01:00

373 lines
9.2 KiB
C#

using System;
using System.IO;
using Tamir.Streams;
using Tamir.SharpSsh.jsch;
using Tamir.SharpSsh.jsch.examples;
namespace Tamir
{
/// <summary>
/// Summary description for Main.
/// </summary>
public class MainClass
{
public static void Main()
{
Console.WriteLine("sharpSsh 1.0");
//testSsh();
//test();
//testSig();
//testSig2();
//testSigFromJava();
//testDump();
//testDumpBase64();
//testHMacMD5();
testExamples();
//jarAndScp();
}
public static void test()
{
JSch jsch = new JSch();
DH dh1 = null;
DH dh2 = null;
try
{
Type t=Type.GetType(jsch.getConfig("dh"));
dh1=(DH)(Activator.CreateInstance(t));
dh1.init();
dh2=(DH)(Activator.CreateInstance(t));
dh2.init();
}
catch(Exception ee)
{
Console.WriteLine(ee);
}
dh1.setP(DHG1.p);
dh1.setG(DHG1.g);
dh2.setP(DHG1.p);
dh2.setG(DHG1.g);
// The client responds with:
// byte SSH_MSG_KEXDH_INIT(30)
// mpint e <- g^x mod p
// x is a random number (1 < x < (p-1)/2)
byte[] e=dh1.getE();
byte[] f=dh2.getE();
Console.WriteLine("Private1 = {0}", hex(e));
Console.WriteLine();
Console.WriteLine("Private2 = {0}", hex(f));
Console.WriteLine();
dh1.setF(f);
dh2.setF(e);
byte[] k1 = dh1.getK();
byte[] k2 = dh2.getK();
Console.WriteLine("Public1 = {0}", hex(k1));
Console.WriteLine();
Console.WriteLine("Public2 = {0}", hex(k2));
Console.WriteLine();
}
public static void testSig()
{
byte[] hash = Util.getBytes( "Tamir" );
Tamir.SharpSsh.jsch.jce.SignatureRSA enc_rsa = new Tamir.SharpSsh.jsch.jce.SignatureRSA();
Tamir.SharpSsh.jsch.jce.SignatureRSA dec_rsa = new Tamir.SharpSsh.jsch.jce.SignatureRSA();
Tamir.SharpSsh.jsch.jce.KeyPairGenRSA gen = new Tamir.SharpSsh.jsch.jce.KeyPairGenRSA();
gen.init(512);
enc_rsa.init();
enc_rsa.setPrvKey(gen.KeyInfo);
enc_rsa.update(hash);
byte[] sig = enc_rsa.sign();
dump(gen.getE(), gen.getN(), sig, hash);
dec_rsa.init();
dec_rsa.setPubKey(gen.getE(), gen.getN());
dec_rsa.update(hash);
Console.WriteLine( dec_rsa.verify(sig) );
}
public static void testSigFromJava()
{
FileStream fs = File.OpenRead("e.bin");
byte[] e = new byte[fs.Length];
fs.Read(e, 0, e.Length);
fs.Close();
fs = File.OpenRead("n.bin");
byte[] n = new byte[fs.Length];
fs.Read(n, 0, n.Length);
fs.Close();
fs = File.OpenRead("sig.bin");
byte[] sig = new byte[fs.Length];
fs.Read(sig, 0, sig.Length);
fs.Close();
Console.Write("E: ");
Console.WriteLine( hex(e) );
Console.Write("N: ");
Console.WriteLine( hex(n) );
Console.Write("SIG: ");
Console.WriteLine( hex(sig) );
byte[] hash = Util.getBytes( "Tamir" );
Tamir.SharpSsh.jsch.jce.SignatureRSA dec_rsa = new Tamir.SharpSsh.jsch.jce.SignatureRSA();
dec_rsa.init();
dec_rsa.setPubKey(e, n);
dec_rsa.update(hash);
Console.WriteLine( dec_rsa.verify(sig) );
}
public static void dump(byte[] e, byte[] n, byte[] sig, byte[] hash)
{
String fname = "e.bin";
if(File.Exists(fname)) File.Delete(fname);
FileStream fs = File.OpenWrite(fname);
fs.Write(e, 0, e.Length);
fs.Close();
fname = "n.bin";
if(File.Exists(fname)) File.Delete(fname);
fs = File.OpenWrite(fname);
fs.Write(n, 0, n.Length);
fs.Close();
fname = "sig.bin";
if(File.Exists(fname)) File.Delete(fname);
fs = File.OpenWrite(fname);
fs.Write(sig, 0, sig.Length);
fs.Close();
fname = "hash.bin";
if(File.Exists(fname)) File.Delete(fname);
fs = File.OpenWrite(fname);
fs.Write(hash, 0, hash.Length);
fs.Close();
Console.Write("E: ");
Console.WriteLine( hex(e) );
Console.WriteLine();
Console.Write("N: ");
Console.WriteLine( hex(n) );
Console.WriteLine();
Console.Write("SIG: ");
Console.WriteLine( hex(sig) );
Console.WriteLine();
Console.Write("HASH: ");
Console.WriteLine( hex(hash) );
Console.WriteLine();
}
public static void testDump()
{
String fname = "e.bin";
FileStream fs = File.OpenRead(fname);
byte[] e = new byte[fs.Length];
fs.Read(e, 0, e.Length);
fs.Close();
fname = "n.bin";
fs = File.OpenRead(fname);
byte[] n = new byte[fs.Length];
fs.Read(n, 0, n.Length);
fs.Close();
fname = "sig.bin";
fs = File.OpenRead(fname);
byte[] sig = new byte[fs.Length];
fs.Read(sig, 0, sig.Length);
fs.Close();
fname = "hash.bin";
fs = File.OpenRead(fname);
byte[] hash = new byte[fs.Length];
fs.Read(hash, 0, hash.Length);
fs.Close();
print("E", e);
print("N", n);
print("SIG", sig);
print("HASH", hash);
Tamir.SharpSsh.jsch.jce.SignatureRSA dec_rsa = new Tamir.SharpSsh.jsch.jce.SignatureRSA();
dec_rsa.init();
dec_rsa.setPubKey(e, n);
dec_rsa.update(hash);
Console.WriteLine( dec_rsa.verify(sig) );
Console.WriteLine();
}
public static void testDumpBase64()
{
String fname = "e.bin";
StreamReader fs = File.OpenText(fname);
string base64 = fs.ReadToEnd();
byte[] e = Convert.FromBase64String( base64 );
fs.Close();
fname = "n.bin";
fs = File.OpenText(fname);
base64 = fs.ReadToEnd();
byte[] n = Convert.FromBase64String( base64 );
fs.Close();
fname = "sig.bin";
fs = File.OpenText(fname);
base64 = fs.ReadToEnd();
byte[] sig = Convert.FromBase64String( base64 );
fs.Close();
fname = "hash.bin";
fs = File.OpenText(fname);
base64 = fs.ReadToEnd();
byte[] hash = Convert.FromBase64String( base64 );
fs.Close();
print("E", e);
print("N", n);
print("SIG", sig);
print("HASH", hash);
Tamir.SharpSsh.jsch.jce.SignatureRSA dec_rsa = new Tamir.SharpSsh.jsch.jce.SignatureRSA();
dec_rsa.init();
dec_rsa.setPubKey(e, n);
dec_rsa.update(hash);
Console.WriteLine( dec_rsa.verify(sig) );
Console.WriteLine();
}
public static void testHMacMD5()
{
byte[] msg = Util.getBytes("Tamir");
byte[] key = new byte[]{1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6};
Tamir.SharpSsh.jsch.jce.HMACMD5 md5 = new Tamir.SharpSsh.jsch.jce.HMACMD5();
md5.init( key );
md5.update(msg, 0, msg.Length);
byte[] hash = md5.doFinal();
Console.WriteLine(hex(hash));
}
public static void testExamples()
{
//String[] arg = new string[]{"rsa", "key", "sharpSSH"};
//KeyGen.RunExample(arg);
// String[] arg = new string[]{"key"};
// ChangePassphrase.RunExample(arg);
//UserAuthPubKey.RunExample(null);
Tamir.SharpSsh.jsch.examples.KnownHosts.RunExample(null);
// String[] arg = new string[]{"C:\\untitled.db", "root@rhclient8:/root/mng/tamir/file"};
// Tamir.SharpSsh.jsch.examples.ScpTo.RunExample(arg);
// String[] arg = new string[]{"root@rhclient8:/root/mng/tamir/file", "file.txt"};
// Tamir.SharpSsh.jsch.examples.ScpFrom.RunExample(arg);
// Tamir.SharpSsh.jsch.examples.Sftp.RunExample(null);
}
public static void jarAndScp()
{
TextReader r = File.OpenText( "jarAndScp.txt" );
string dir = r.ReadLine();
string host = r.ReadLine();
string path = r.ReadLine();
string user = r.ReadLine();
string pass = r.ReadLine();
r.Close();
string file = dir+".jar";
string jarFile = "\""+dir+".jar\"";
//dir = "\""+dir+"\"";
System.Diagnostics.ProcessStartInfo p = new System.Diagnostics.ProcessStartInfo(@"D:\Program Files\Java\jdk1.5.0_03\bin\jar.exe");
p.WorkingDirectory = Directory.GetParent(dir).FullName;
p.Arguments = "-cf "+jarFile+" "+ Path.GetFileName(dir);
p.UseShellExecute = false;
// p.RedirectStandardOutput = true;
// p.RedirectStandardError = true;
System.Diagnostics.Process.Start(p);
System.Diagnostics.Process pr = new System.Diagnostics.Process();
pr.StartInfo = p;
pr.Start();
pr.WaitForExit();
String[] arg = new string[]{file, user+"@"+host+":"+path+Path.GetFileName(file)};
//Tamir.SharpSsh.Scp.To(file, host, path+Path.GetFileName(file), user, pass);
}
public static void print(string name, byte[] data)
{
Console.WriteLine();
Console.Write(name+": ");
Console.WriteLine( hex(data) );
Console.WriteLine();
}
public static string hex(byte[] arr)
{
string hex = "0x";
for(int i=0;i<arr.Length; i++)
{
string mbyte = arr[i].ToString("X");
if (mbyte.Length == 1)
mbyte = "0"+mbyte;
hex += mbyte;
}
return hex;
}
public static byte[] reverse(byte[] arr)
{
byte[] tmp = new byte[arr.Length];
for(int i=0; i<arr.Length; i++)
{
tmp[i] = arr[ arr.Length-1-i];
}
return tmp;
}
/**
* Utility method to delete the leading zeros from the modulus.
* @param a modulus
* @return modulus
*/
public static byte[] stripLeadingZeros(byte[] a)
{
int lastZero = -1;
for (int i = 0; i < a.Length; i++)
{
if (a[i] == 0)
{
lastZero = i;
}
else
{
break;
}
}
lastZero++;
byte[] result = new byte[a.Length - lastZero];
Array.Copy(a, lastZero, result, 0, result.Length);
return result;
}
}
}