static public byte[] makeSign(keyInfo key, byte[] data) { int len = key.bits >> 3; Ber signB = new Ber(BigInteger.Parse("3011300D060960864801650304020105000400", NumberStyles.AllowHexSpecifier).ToByteArray().Reverse().ToArray()); signB.childs[1].payload = SHA256.Create().ComputeHash(data); byte[] messB = signB.makeDer().Reverse().Concat(new byte[] { 0 }).ToArray(); messB = messB.Concat(Enumerable.Repeat((byte)0xff, len - (messB.Length % len) - 2)).Concat(new byte[] { 1, 0 }).ToArray(); IEnumerable <byte> ans = new byte[] { 0 }; byte[] block = new byte[len + 1]; BigInteger n = new BigInteger(key.key.childs[1].payload.Reverse().ToArray()); BigInteger d = new BigInteger(key.key.childs[3].payload.Reverse().ToArray()); for (int i = 0; i < messB.Length; i += len) { Array.Copy(messB, i, block, 0, len); byte[] crBlock = BigInteger.ModPow(new BigInteger(block), d, n).ToByteArray(); if (crBlock.Length < len) { ans = ans.Concat(crBlock.Concat(Enumerable.Repeat((byte)0x0, len - crBlock.Length)).Reverse()); } else if (crBlock.Length > len) { ans = ans.Concat(crBlock.Take(len).Reverse()); } else { ans = ans.Concat(crBlock.Reverse()); } } return(ans.ToArray()); }
static public byte[] makeRootCertFromPriv(string KeyName) { keyInfo key = State.session.keys[KeyName]; Ber cert = new Ber(new byte[] { 0x30, 0x80, 0x30, 0x80, 0xA0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x00, 0x30, 0x80, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x0B, 0x05, 0x00, 0x00, 0x00, 0x30, 0x80, 0x31, 0x80, 0x30, 0x80, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x80, 0x17, 0x00, 0x17, 0x00, 0x00, 0x00, 0x30, 0x80, 0x31, 0x80, 0x30, 0x80, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA3, 0x80, 0x30, 0x80, 0x30, 0x0F, 0x06, 0x03, 0x55, 0x1D, 0x13, 0x01, 0x01, 0xFF, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x80, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x0B, 0x05, 0x00, 0x00, 0x00, 0x03, 0x01, 0, 0x00, 0x00 }); cert.childs[0].childs[4].childs[0].payload = Encoding.UTF8.GetBytes(DateTime.UtcNow.ToString(@"yyMMddhhmmssZ")); cert.childs[0].childs[4].childs[1].payload = Encoding.UTF8.GetBytes(DateTime.UtcNow.AddDays(365).ToString(@"yyMMddhhmmssZ")); cert.childs[0].childs[3].childs[0].childs[0].childs[1].payload = Encoding.UTF8.GetBytes(KeyName); cert.childs[0].childs[5].childs[0].childs[0].childs[1].payload = cert.childs[0].childs[3].childs[0].childs[0].childs[1].payload; cert.childs[0].childs[1].payload = cert.childs[0].childs[5].childs[0].childs[0].childs[1].payload;//BitConverter.GetBytes(DateTime.UtcNow.ToUniversalTime().Subtract(new DateTime(1970, 1, 1)).TotalSeconds); cert.childs[0].childs.Insert(6, key.pub); cert.childs[2].payload = makeSign(key, cert.childs[0].makeDer()); return(cert.makeDer()); }
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()); }