public static ASN1_Generator Parse(byte[] content) { ASN1_Generator thisSequence = new ASN1_Generator(); var reversedContent = content.Reverse <byte>().ToList(); int cursor = 0; while (cursor < reversedContent.Count) { var type = reversedContent[cursor]; var size = reversedContent[cursor + 1]; switch (type) { case 0x30: thisSequence.Elements.Add(parseSequence(reversedContent.Skip(cursor + 2).Take(size).ToArray())); break; case 0x02: thisSequence.Elements.Add(parseInteger(reversedContent.Skip(cursor + 2).Take(size).ToArray())); break; } cursor += size + 2; } return(thisSequence); }
public static byte[] GenerarFirmaElectronica(byte[] message, BigInteger privateKey) { while (true) { //Genero un valor 'k' aleatorio BigInteger k = Helper.Random(Params.n); //Calculo el punto P = k*G Punto kP = k * Params.G; BigInteger r = Arithmetic.Mod(kP.x, Params.n); if (r.IsZero) { continue; } var eHash = FirmaElectronica.ObtenerHash(message); var e = new BigInteger(eHash); if (e.Sign == -1) { e = BigInteger.Negate(e); } BigInteger s = Arithmetic.Mod( Arithmetic.Inversion_ExtendedEuclidean(k, Params.n) * (e + privateKey * r), Params.n ); var asn1 = new ASN1_Generator.ASN1_Generator(); var seq = new ASN1_Generator.ASN1_Sequence(); seq.content.Add(new ASN1_Generator.ASN1_Integer() { Value = r }); seq.content.Add(new ASN1_Generator.ASN1_Integer() { Value = s }); asn1.Elements.Add(seq); return(asn1.GetBytes()); } }