Example #1
0
        private static Asn1Node AddString(Asn1Node parent, string name, string value)
        {
            var childNode = new Asn1Node
            {
                Tag = Asn1Tag.SEQUENCE | Asn1TagClasses.CONSTRUCTED
            };

            parent.AddChild(childNode);

            var nameNode = new Asn1Node
            {
                Tag  = Asn1Tag.OBJECT_IDENTIFIER,
                Data = oidInstance.Encode(name)
            };

            childNode.AddChild(nameNode);

            var valueNode = new Asn1Node();

            if (value == null)
            {
                valueNode.Tag = Asn1Tag.TAG_NULL;
            }
            else
            {
                valueNode.Tag  = Asn1Tag.PRINTABLE_STRING;
                valueNode.Data = Encoding.ASCII.GetBytes(value);
            }
            childNode.AddChild(valueNode);

            return(parent);
        }
Example #2
0
        public static void GenerateCsr(int keysize, string domainname, string email, string city, string state, string country, string orgname, Stream output)
        {
            var keyPair = new RSACryptoServiceProvider(keysize);

            var rootNode = new Asn1Node
            {
                Tag = Asn1Tag.SEQUENCE | Asn1TagClasses.CONSTRUCTED
            };

            var topSequenceNode = new Asn1Node
            {
                Tag = Asn1Tag.SEQUENCE | Asn1TagClasses.CONSTRUCTED
            };

            rootNode.AddChild(topSequenceNode);

            var versionNode = new Asn1Node
            {
                Tag  = Asn1Tag.INTEGER,
                Data = new byte[] { 0 }
            };

            topSequenceNode.AddChild(versionNode);

            var stringSequenceNode = new Asn1Node
            {
                Tag = Asn1Tag.SEQUENCE | Asn1TagClasses.CONSTRUCTED
            };

            topSequenceNode.AddChild(stringSequenceNode);

            AddSubjectString(stringSequenceNode, "2.5.4.3", domainname);
            AddSubjectString(stringSequenceNode, "2.5.4.7", city);
            AddSubjectString(stringSequenceNode, "2.5.4.6", country);
            AddSubjectString(stringSequenceNode, "2.5.4.8", state);
            AddSubjectString(stringSequenceNode, "2.5.4.10", orgname);
            AddSubjectString(stringSequenceNode, "1.2.840.113549.1.9.1", email);

            var rsaNode = new Asn1Node
            {
                Tag = Asn1Tag.SEQUENCE | Asn1TagClasses.CONSTRUCTED
            };

            topSequenceNode.AddChild(AddString(rsaNode, "1.2.840.113549.1.1.1", null));

            var publicKeyNode = new Asn1Node
            {
                Tag = Asn1Tag.BIT_STRING
            };

            rsaNode.AddChild(publicKeyNode);

            var publicKeySequenceNode = new Asn1Node
            {
                Tag = Asn1Tag.SEQUENCE | Asn1TagClasses.CONSTRUCTED
            };

            publicKeyNode.AddChild(publicKeySequenceNode);

            var publicKeyInfo = keyPair.ExportParameters(false);

            publicKeySequenceNode.AddChild(new Asn1Node
            {
                Tag  = Asn1Tag.INTEGER,
                Data = publicKeyInfo.Modulus
            });
            publicKeySequenceNode.AddChild(new Asn1Node
            {
                Tag  = Asn1Tag.INTEGER,
                Data = publicKeyInfo.Exponent
            });

            topSequenceNode.AddChild(new Asn1Node
            {
                Tag = Asn1TagClasses.CONTEXT_SPECIFIC | Asn1TagClasses.CONSTRUCTED
            });

            byte[] signature;
            using (var data = new MemoryStream(keysize))
            {
                topSequenceNode.SaveData(data);
                signature = keyPair.SignData(data.GetBuffer(), 0, (int)data.Length, new SHA1CryptoServiceProvider());
            }

            AddString(rootNode, "1.2.840.113549.1.1.5", null);
            rootNode.AddChild(new Asn1Node
            {
                Tag  = Asn1Tag.BIT_STRING,
                Data = signature
            });

            var csrOutput = new StreamWriter(output);

            csrOutput.WriteLine("-----BEGIN CERTIFICATE REQUEST-----");

            using (var data = new MemoryStream(keysize))
            {
                rootNode.SaveData(data);
                var base64Data = Convert.ToBase64String(data.GetBuffer(), 0, (int)data.Length,
                                                        Base64FormattingOptions.InsertLineBreaks);
                csrOutput.WriteLine(base64Data);
            }

            csrOutput.WriteLine("-----END CERTIFICATE REQUEST-----");
            csrOutput.Flush();
        }