bool IGangCryptoVerificationService.Verify( GangCryptoParameters parameters, ReadOnlySpan <byte> data, ReadOnlySpan <byte> signature ) { if (parameters is null) { throw new ArgumentNullException(nameof(parameters)); } var rsa = RSA.Create(); rsa.ImportParameters(new RSAParameters { Exponent = parameters.GetByteArray("-2"), Modulus = parameters.GetByteArray("-1") }); return(rsa.VerifyData( data.ToArray(), signature.ToArray(), HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1 )); }
bool IGangCryptoVerificationService.Verify( GangCryptoParameters parameters, ReadOnlySpan <byte> data, ReadOnlySpan <byte> signature ) { if (parameters is null) { throw new ArgumentNullException(nameof(parameters)); } var curveType = parameters.GetInt("-1"); var curve = curveType switch { 1 => ECCurve.NamedCurves.nistP256, _ => throw new Exception($"Unknown curve type {curveType}"), }; var ecDsa = ECDsa.Create(new ECParameters { Curve = curve, Q = new ECPoint { X = parameters.GetByteArray("-2"), Y = parameters.GetByteArray("-3") } }); using var ms = new MemoryStream(signature.ToArray()); var header = ms.ReadByte(); var b1 = ms.ReadByte(); var markerR = ms.ReadByte(); var b2 = ms.ReadByte(); var vr = new byte[b2]; ms.Read(vr, 0, vr.Length); vr = RemoveNegativeFlag(vr); var markerS = ms.ReadByte(); var b3 = ms.ReadByte(); var vs = new byte[b3]; ms.Read(vs, 0, vs.Length); vs = RemoveNegativeFlag(vs); var parsedSignature = new byte[vr.Length + vs.Length]; vr.CopyTo(parsedSignature, 0); vs.CopyTo(parsedSignature, vr.Length); return(ecDsa.VerifyData( data.ToArray(), parsedSignature, HashAlgorithmName.SHA256)); }