This repository has been archived on 2023-05-27. You can view files and clone it, but cannot push or open issues or pull requests.
BirdsiteLIVE/src/BirdsiteLive.Cryptography/ASN1.cs

52 lines
1.5 KiB
C#

using System.Linq;
using System.Security.Cryptography;
using Asn1;
using Asn1Null = Asn1.Asn1Null;
using Asn1Sequence = Asn1.Asn1Sequence;
namespace BirdsiteLive.Cryptography
{
public class ASN1
{
public static RSA ToRSA(byte[] data)
{
var node = Asn1Node.ReadNode(data);
var rsaSequence = Asn1Node.ReadNode((node.Nodes[1] as Asn1BitString).Data);
var modulus = (rsaSequence.Nodes[0] as Asn1Integer).Value;
var exponent = (rsaSequence.Nodes[1] as Asn1Integer).Value;
var prms = new RSAParameters { Modulus = modulus, Exponent = exponent };
var rsa = RSA.Create();
rsa.ImportParameters(prms);
return rsa;
}
public static byte[] FromRSA(RSA rsa)
{
var prms = rsa.ExportParameters(false);
var modulus = new Asn1Integer((new byte[] { 0x00 }.Concat(prms.Modulus)).ToArray());
var exponent = new Asn1Integer(prms.Exponent);
var oidheader = new Asn1Sequence();
oidheader.Nodes.Add(new Asn1ObjectIdentifier("1.2.840.113549.1.1.1"));
oidheader.Nodes.Add(new Asn1Null());
var rsaSequence = new Asn1Sequence();
rsaSequence.Nodes.Add(modulus);
rsaSequence.Nodes.Add(exponent);
var bitString = new Asn1BitString(rsaSequence.GetBytes());
var result = new Asn1Sequence();
result.Nodes.Add(oidheader);
result.Nodes.Add(bitString);
return result.GetBytes();
}
}
}