Exemplo n.º 1
0
        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());
        }
Exemplo n.º 2
0
        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());
        }
Exemplo n.º 3
0
        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()));
            //}
        }
Exemplo n.º 4
0
        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()));
        }
Exemplo n.º 5
0
        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);
        }
Exemplo n.º 6
0
        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());
        }