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