public certInfo(Ber data) { cert = data; int len = cert.childs[0].childs[6].childs[1].childs[0].childs[0].payloadLength; bits = len * 8 - 8 - cert.childs[0].childs[6].childs[1].childs[0].childs[0].payload[0]; Ber payload = new Ber(0, BerTags.SEQUENCE, true); payload.addChild(cert.childs[0].childs[6].childs[1].childs[0].childs[0]); payload.addChild(cert.childs[0].childs[6].childs[1].childs[0].childs[1]); pub = new Ber(0, BerTags.SEQUENCE, true); pub.addChild(new Ber(0, BerTags.SEQUENCE, true)); pub.addChild(new Ber(0, BerTags.BIT_STRING, false)).addChild(payload); pub.childs.First().addChild(new Ber(0, BerTags.OBJECT_IDENTIFIER, false, new byte[] { 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x01 })); pub.childs.First().addChild(new Ber(0, BerTags.NULL, false)); pinSHA256 = Convert.ToBase64String(SHA256.Create().ComputeHash(pub.makeDer())); fingerPrint = utils.getHex(SHA1.Create().ComputeHash(cert.makeDer())); payload = cert.childs[0].childs[3]; iCN = null; for (int i = 0; i < payload.childs.Count; i++) { if (!Enumerable.SequenceEqual(payload.childs[i].childs[0].childs[0].payload, utils.CName)) { continue; } iCN = Encoding.UTF8.GetString(payload.childs[i].childs[0].childs[1].payload); break; } payload = cert.childs[0].childs[5]; CN = null; for (int i = 0; i < payload.childs.Count; i++) { if (!Enumerable.SequenceEqual(payload.childs[i].childs[0].childs[0].payload, utils.CName)) { continue; } CN = Encoding.UTF8.GetString(payload.childs[i].childs[0].childs[1].payload); break; } //if (CN == iCN) { //BigInteger n = new BigInteger(cert.childs[0].childs[6].childs[1].childs[0].childs[0].payload.Reverse().ToArray()); //BigInteger e = new BigInteger(cert.childs[0].childs[6].childs[1].childs[0].childs[1].payload.Reverse().ToArray()); //BigInteger sign = new BigInteger(cert.childs[2].payload.Reverse().ToArray()); //BigInteger ans = BigInteger.ModPow(sign, e, n); //string ss = utils.getHex(ans.ToByteArray().Reverse()); //string ss2 = utils.getHex(SHA256.Create().ComputeHash(cert.childs[0].makeDer())); //} }
public keyInfo(Ber data) { key = data; int len = key.childs[1].payloadLength; bits = len * 8 - ((key.childs[1].payload[0] == 0) ? 8 : 0); Ber payload = new Ber(0, BerTags.SEQUENCE, true); payload.addChild(key.childs[1]); payload.addChild(key.childs[2]); pub = new Ber(0, BerTags.SEQUENCE, true); pub.addChild(new Ber(0, BerTags.SEQUENCE, true)); pub.addChild(new Ber(0, BerTags.BIT_STRING, false)).addChild(payload); pub.childs.First().addChild(new Ber(0, BerTags.OBJECT_IDENTIFIER, false, new byte[] { 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x01 })); pub.childs.First().addChild(new Ber(0, BerTags.NULL, false)); pinSHA256 = Convert.ToBase64String(SHA256.Create().ComputeHash(pub.makeDer())); }
static public bool saveStorage(storageInfo sess) { Ber data = new Ber(3, 0xB183651C18E500, true); data.UNKLength = true; using (data) { data.addChild(new Ber(BerClass.UNIVERSAL, BerTags.UTF8String, false, Encoding.UTF8.GetBytes("shStorage"))); data.addChild(new Ber(BerClass.UNIVERSAL, BerTags.INTEGER, false, new byte[] { 1 })); data.addChild(storageParse.saveVER1(sess)); data.addChild(new Ber(BerClass.PRIVATE, BerTags.OCTET_STRING, false, SHA256.Create().ComputeHash(data.childs.Last().makeDer()))); byte[] raw = data.makeDer(); sess.file.Seek(0, SeekOrigin.Begin); sess.file.Write(raw, 0, raw.Length); sess.file.SetLength(raw.Length); sess.file.Flush(); } return(true); }
static public byte[] makeCSR(keyInfo key, string def, DomainInfo dom, System.ComponentModel.BackgroundWorker worker, bool star) { worker.ReportProgress(101, new object[] { -3, "Pattern parse.." }); Ber csr = new Ber(BigInteger.Parse( "3042302e020100300b3109300706035504030c00a01c301a06092a864886f70d01090e310d300b30090603551d1104023000300d06092a864886f70d01010b0500030100", NumberStyles.AllowHexSpecifier).ToByteArray().Reverse().ToArray()); worker.ReportProgress(101, new object[] { -3, "OK\r\nEdit CN.." }); if (star) { csr.childs[0].childs[1].childs[0].childs[0].childs[1].payload = Encoding.UTF8.GetBytes((def == "@") ? dom.dns : String.Format("{0}.{1}", def, dom.dns)); } else { csr.childs[0].childs[1].childs[0].childs[0].childs[1].payload = Encoding.UTF8.GetBytes((def == "@") ? dom.dns : String.Format("{0}.{1}", def, dom.dns).Replace("*.", "")); } Ber subs = csr.childs[0].childs[2].childs[0].childs[1].childs[0].childs[0].childs[1].childs[0]; csr.childs[0].childs.Insert(2, key.pub.cloneAsParrent()); worker.ReportProgress(101, new object[] { -3, "OK\r\nEdit subs.." }); foreach (string sub in dom.subs2) { if (Regex.IsMatch(sub, "\\*")) { subs.addChild(new Ber(BerClass.CONTEXT, BerTags.INTEGER, false, Encoding.UTF8.GetBytes(String.Format("{0}.{1}", sub, dom.dns)))); subs.addChild(new Ber(BerClass.CONTEXT, BerTags.INTEGER, false, Encoding.UTF8.GetBytes((sub == "*") ? dom.dns : String.Format("{0}.{1}", sub, dom.dns)))); } else { subs.addChild(new Ber(BerClass.CONTEXT, BerTags.INTEGER, false, Encoding.UTF8.GetBytes((sub == "@") ? dom.dns : String.Format("{0}.{1}", sub, dom.dns)))); } } ; worker.ReportProgress(101, new object[] { -3, "OK\r\nMake sign.." }); csr.childs[2].payload = makeSign(key, csr.childs[0].makeDer()); worker.ReportProgress(101, new object[] { -3, "OK\r\nGet DER.." }); return(csr.makeDer()); }
static public Ber saveVER1(storageInfo sess) { int j = 77; Ber storage = new Ber(BerClass.UNIVERSAL, BerTags.SEQUENCE, true); Ber box = null; string[] ar = null; //save domains if (sess.domains.Count > 0) { box = storage.addChild(new Ber(3, 'D', true)); ar = new String[sess.domains.Keys.Count]; sess.domains.Keys.CopyTo(ar, 0); Array.Sort(ar, StringComparer.InvariantCulture); foreach (string domainName in ar) { Ber temp = box.addChild(new Ber(BerClass.PRIVATE, BerTags.OCTET_STRING, false, Encoding.UTF8.GetBytes(domainName))); for (int i = 0; i < temp.payload.Length; i++, j += 70) { temp.payload[i] ^= (byte)j; } j += 43; temp = box.addChild(new Ber(BerClass.PRIVATE, BerTags.OCTET_STRING, false, Encoding.UTF8.GetBytes(sess.domains[domainName].dns))); for (int i = 0; i < temp.payload.Length; i++, j += 73) { temp.payload[i] ^= (byte)j; } j -= 9; temp = box.addChild(new Ber(BerClass.PRIVATE, BerTags.OCTET_STRING, false, Encoding.UTF8.GetBytes(sess.domains[domainName].subs))); for (int i = 0; i < temp.payload.Length; i++, j += 79) { temp.payload[i] ^= (byte)j; } j = j * 3 - 1; } box = null; } //certs if (sess.certs.Count > 0) { box = storage.addChild(new Ber(3, 'C', true)); ar = new String[sess.certs.Keys.Count]; sess.certs.Keys.CopyTo(ar, 0); Array.Sort(ar, StringComparer.InvariantCulture); foreach (string certName in ar) { Ber temp = box.addChild(new Ber(BerClass.PRIVATE, BerTags.OCTET_STRING, false, Encoding.UTF8.GetBytes(certName))); for (int i = 0; i < temp.payload.Length; i++, j += 149) { temp.payload[i] ^= (byte)j; } j += 35; temp = box.addChild(new Ber(BerClass.PRIVATE, BerTags.OCTET_STRING, false, sess.certs[certName].cert.makeDer())); for (int i = 0; i < temp.payload.Length; i++, j += 137) { temp.payload[i] ^= (byte)j; } j -= 15; } box = null; } //save keys if (sess.keys.Count > 0) { box = storage.addChild(new Ber(3, 'K', true)); ar = new String[sess.keys.Keys.Count]; sess.keys.Keys.CopyTo(ar, 0); Array.Sort(ar, StringComparer.InvariantCulture); foreach (string keyName in ar) { Ber temp = box.addChild(new Ber(BerClass.PRIVATE, BerTags.OCTET_STRING, false, Encoding.UTF8.GetBytes(keyName))); for (int i = 0; i < temp.payload.Length; i++, j += 171) { temp.payload[i] ^= (byte)j; } j += 31; temp = box.addChild(new Ber(BerClass.PRIVATE, BerTags.OCTET_STRING, false, sess.keys[keyName].key.makeDer())); for (int i = 0; i < temp.payload.Length; i++, j += 73) { temp.payload[i] ^= (byte)j; } j -= 18; } box = null; } //save servers if (sess.servers.Count > 0) { box = storage.addChild(new Ber(3, 'S', true)); ar = new String[sess.servers.Keys.Count]; sess.servers.Keys.CopyTo(ar, 0); Array.Sort(ar, StringComparer.InvariantCulture); foreach (string keyName in ar) { Ber temp = box.addChild(new Ber(BerClass.PRIVATE, BerTags.OCTET_STRING, false, Encoding.UTF8.GetBytes(keyName))); for (int i = 0; i < temp.payload.Length; i++, j += 97) { temp.payload[i] ^= (byte)j; } j += 89; temp = box.addChild(new Ber(BerClass.PRIVATE, BerTags.OCTET_STRING, false, Encoding.UTF8.GetBytes(sess.servers[keyName].link))); for (int i = 0; i < temp.payload.Length; i++, j += 29) { temp.payload[i] ^= (byte)j; } j -= 21; temp = box.addChild(new Ber(BerClass.PRIVATE, BerTags.OCTET_STRING, false, Encoding.UTF8.GetBytes(sess.servers[keyName].pass))); for (int i = 0; i < temp.payload.Length; i++, j += 31) { temp.payload[i] ^= (byte)j; } j = j * 2 + 1; } box = null; } return(storage); }