From f1cea91624fd2deae28bfb2414a4fd9c7e246883 Mon Sep 17 00:00:00 2001 From: clickingbuttons Date: Thu, 25 Apr 2024 22:52:19 -0400 Subject: [PATCH] std.crypto: add DER parser and RSA - Add secure DER parser. - Use in ECDSA. - Add comments to Wycheproof tests. - Move Wycheproof test suite to external file. - Use in Ed25519. - Not public. - Add std.crypto.rsa. - Modulus_bits up to 4096. - Any hash function for signatures. - Use it in Certificate and tls.Client. --- gen_wycheproof.zig | 93 + lib/std/crypto.zig | 4 + lib/std/crypto/25519/ed25519.zig | 21 + lib/std/crypto/Certificate.zig | 299 +- lib/std/crypto/der.zig | 467 +++ lib/std/crypto/ecdsa.zig | 472 +-- lib/std/crypto/ff.zig | 5 + lib/std/crypto/oid.zig | 132 + lib/std/crypto/rsa.zig | 873 ++++++ .../ecdsa_secp256r1_sha256_wycheproof.zig | 2740 +++++++++++++++++ lib/std/crypto/testdata/id_rsa.der | Bin 0 -> 1191 bytes lib/std/crypto/tls/Client.zig | 70 +- 12 files changed, 4408 insertions(+), 768 deletions(-) create mode 100644 gen_wycheproof.zig create mode 100644 lib/std/crypto/der.zig create mode 100644 lib/std/crypto/oid.zig create mode 100644 lib/std/crypto/rsa.zig create mode 100644 lib/std/crypto/testdata/ecdsa_secp256r1_sha256_wycheproof.zig create mode 100644 lib/std/crypto/testdata/id_rsa.der diff --git a/gen_wycheproof.zig b/gen_wycheproof.zig new file mode 100644 index 000000000000..d5b67a916571 --- /dev/null +++ b/gen_wycheproof.zig @@ -0,0 +1,93 @@ +// transforms https://raw.githubusercontent.com/C2SP/wycheproof/cd27d6419bedd83cbd24611ec54b6d4bfdb0cdca/testvectors/ecdsa_secp256r1_sha256_test.json into [_]TestVector{} +const std = @import("std"); + +const path = "ecdsa_secp256r1_sha256_test.json"; + +pub fn main() !void { + var gpa = std.heap.GeneralPurposeAllocator(.{}){}; + defer _ = gpa.deinit(); + const allocator = gpa.allocator(); + + const infile = try std.fs.cwd().openFile(path, .{}); + defer infile.close(); + + const json_str = try infile.readToEndAlloc(allocator, 1 << 24); + defer allocator.free(json_str); + const T = struct { + testGroups: []struct { key: struct { uncompressed: []const u8 }, tests: []struct { + comment: []const u8, + msg: []const u8, + sig: []const u8, + result: []const u8, + } }, + }; + const Result = enum { + valid, + invalid, + acceptable, + }; + + const parsed = try std.json.parseFromSlice(T, allocator, json_str, .{ .ignore_unknown_fields = true }); + defer parsed.deinit(); + + const outfile = try std.fs.cwd().createFile("./ecdsa_secp256r1_sha256_wycheproof.zig", .{}); + defer outfile.close(); + + var writer = outfile.writer(); + + try writer.writeAll("// generated from " ++ path ++ + \\ + \\pub const Test = struct { + \\ comment: []const u8, + \\ msg: []const u8, + \\ sig: []const u8, + \\ result: enum { + \\ valid, + \\ invalid, + \\ acceptable, + \\ }, + \\}; + \\pub const TestGroup = struct { + \\ key: []const u8, + \\ tests: []const Test, + \\}; + \\ + \\pub const test_groups = [_]TestGroup{ + ); + + const value = parsed.value; + for (value.testGroups) |group| { + try writer.print( + \\ + \\ .{{ + \\ .key = "{s}", + \\ .tests = &[_]Test{{ + , .{group.key.uncompressed}); + for (group.tests) |t| { + try writer.print( + \\ + \\ .{{ + \\ .comment = "{s}", + \\ .msg = "{s}", + \\ .sig = "{s}", + \\ .result = .{s}, + \\ }}, + , .{ + t.comment, + t.msg, + t.sig, + @tagName(std.meta.stringToEnum(Result, t.result).?), + }); + } + try writer.writeAll( + \\ + \\ }, + \\ }, + ); + } + + try outfile.writeAll( + \\ + \\}; + ); +} diff --git a/lib/std/crypto.zig b/lib/std/crypto.zig index 3dc48ce146e4..aa36ead9fd0f 100644 --- a/lib/std/crypto.zig +++ b/lib/std/crypto.zig @@ -195,6 +195,8 @@ pub const errors = @import("crypto/errors.zig"); pub const tls = @import("crypto/tls.zig"); pub const Certificate = @import("crypto/Certificate.zig"); +pub const rsa = @import("crypto/rsa.zig"); + /// Side-channels mitigations. pub const SideChannelsMitigations = enum { /// No additional side-channel mitigations are applied. @@ -307,6 +309,8 @@ test { _ = errors; _ = tls; _ = Certificate; + _ = rsa; + _ = @import("crypto/oid.zig"); } test "CSPRNG" { diff --git a/lib/std/crypto/25519/ed25519.zig b/lib/std/crypto/25519/ed25519.zig index d7b51271d29d..10e66f57a546 100644 --- a/lib/std/crypto/25519/ed25519.zig +++ b/lib/std/crypto/25519/ed25519.zig @@ -1,4 +1,5 @@ const std = @import("std"); +const der = @import("../der.zig"); const crypto = std.crypto; const debug = std.debug; const fmt = std.fmt; @@ -213,6 +214,26 @@ pub const Ed25519 = struct { }; } + pub fn fromDer(bytes: []const u8) !Signature { + var parser = der.Parser{ .bytes = bytes }; + const seq = try parser.expectSequence(); + defer parser.seek(seq.slice.end); + + const r = try parser.expectPrimitive(.integer); + if (r.slice.len() > Curve.encoded_length) return error.InvalidScalar; + const s = try parser.expectPrimitive(.integer); + if (s.slice.len() > @sizeOf(CompressedScalar)) return error.InvalidScalar; + + if (parser.index != seq.slice.end) return error.InvalidSequence; + if (parser.index != parser.bytes.len) return error.InvalidSequence; + + var res = std.mem.zeroInit(Signature, .{}); + @memcpy(res.r[res.r.len - parser.view(r).len ..], parser.view(r)); + @memcpy(res.s[res.r.len - parser.view(s).len ..], parser.view(s)); + + return res; + } + /// Create a Verifier for incremental verification of a signature. pub fn verifier(self: Signature, public_key: PublicKey) (NonCanonicalError || EncodingError || IdentityElementError)!Verifier { return Verifier.init(self, public_key); diff --git a/lib/std/crypto/Certificate.zig b/lib/std/crypto/Certificate.zig index 1e3bb9ca0b4e..4d5be4c811b6 100644 --- a/lib/std/crypto/Certificate.zig +++ b/lib/std/crypto/Certificate.zig @@ -729,71 +729,18 @@ pub fn parseVersion(bytes: []const u8, version_elem: der.Element) ParseVersionEr fn verifyRsa( comptime Hash: type, message: []const u8, - sig: []const u8, + sig_bytes: []const u8, pub_key_algo: Parsed.PubKeyAlgo, - pub_key: []const u8, + pub_key_der: []const u8, ) !void { if (pub_key_algo != .rsaEncryption) return error.CertificateSignatureAlgorithmMismatch; - const pk_components = try rsa.PublicKey.parseDer(pub_key); - const exponent = pk_components.exponent; - const modulus = pk_components.modulus; - if (exponent.len > modulus.len) return error.CertificatePublicKeyInvalid; - if (sig.len != modulus.len) return error.CertificateSignatureInvalidLength; - - const hash_der = switch (Hash) { - crypto.hash.Sha1 => [_]u8{ - 0x30, 0x21, 0x30, 0x09, 0x06, 0x05, 0x2b, 0x0e, - 0x03, 0x02, 0x1a, 0x05, 0x00, 0x04, 0x14, - }, - crypto.hash.sha2.Sha224 => [_]u8{ - 0x30, 0x2d, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86, - 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x04, 0x05, - 0x00, 0x04, 0x1c, - }, - crypto.hash.sha2.Sha256 => [_]u8{ - 0x30, 0x31, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86, - 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01, 0x05, - 0x00, 0x04, 0x20, - }, - crypto.hash.sha2.Sha384 => [_]u8{ - 0x30, 0x41, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86, - 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x02, 0x05, - 0x00, 0x04, 0x30, - }, - crypto.hash.sha2.Sha512 => [_]u8{ - 0x30, 0x51, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86, - 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x03, 0x05, - 0x00, 0x04, 0x40, - }, - else => @compileError("unreachable"), - }; - - var msg_hashed: [Hash.digest_length]u8 = undefined; - Hash.hash(message, &msg_hashed, .{}); - - switch (modulus.len) { - inline 128, 256, 384, 512 => |modulus_len| { - const ps_len = modulus_len - (hash_der.len + msg_hashed.len) - 3; - const em: [modulus_len]u8 = - [2]u8{ 0, 1 } ++ - ([1]u8{0xff} ** ps_len) ++ - [1]u8{0} ++ - hash_der ++ - msg_hashed; - - const public_key = rsa.PublicKey.fromBytes(exponent, modulus) catch return error.CertificateSignatureInvalid; - const em_dec = rsa.encrypt(modulus_len, sig[0..modulus_len].*, public_key) catch |err| switch (err) { - error.MessageTooLong => unreachable, - }; - if (!mem.eql(u8, &em, &em_dec)) { - return error.CertificateSignatureInvalid; - } - }, - else => { - return error.CertificateSignatureUnsupportedBitCount; - }, - } + const pk = rsa.PublicKey.fromDer(pub_key_der) catch |err| switch (err) { + error.InsecureBitCount => return error.CertificateSignatureUnsupportedBitCount, + else => return error.CertificatePublicKeyInvalid, + }; + const sig = rsa.PKCS1v1_5(Hash).Signature{ .bytes = sig_bytes }; + sig.verify(message, pk) catch return error.CertificateSignatureInvalid; } fn verify_ecdsa( @@ -816,19 +763,9 @@ fn verify_ecdsa( .secp384r1, => |curve| { const Ecdsa = crypto.sign.ecdsa.Ecdsa(curve.Curve(), Hash); - const sig = Ecdsa.Signature.fromDer(encoded_sig) catch |err| switch (err) { - error.InvalidEncoding => return error.CertificateSignatureInvalid, - }; - const pub_key = Ecdsa.PublicKey.fromSec1(sec1_pub_key) catch |err| switch (err) { - error.InvalidEncoding => return error.CertificateSignatureInvalid, - error.NonCanonical => return error.CertificateSignatureInvalid, - error.NotSquare => return error.CertificateSignatureInvalid, - }; - sig.verify(message, pub_key) catch |err| switch (err) { - error.IdentityElement => return error.CertificateSignatureInvalid, - error.NonCanonical => return error.CertificateSignatureInvalid, - error.SignatureVerificationFailed => return error.CertificateSignatureInvalid, - }; + const sig = Ecdsa.Signature.fromDer(encoded_sig) catch return error.CertificateSignatureInvalid; + const pub_key = Ecdsa.PublicKey.fromSec1(sec1_pub_key) catch return error.CertificateSignatureInvalid; + sig.verify(message, pub_key) catch return error.CertificateSignatureInvalid; }, } } @@ -858,6 +795,7 @@ fn verifyEd25519( const std = @import("../std.zig"); const crypto = std.crypto; +const rsa = crypto.rsa; const mem = std.mem; const Certificate = @This(); @@ -949,217 +887,4 @@ test { _ = Bundle; } -pub const rsa = struct { - const max_modulus_bits = 4096; - const Uint = std.crypto.ff.Uint(max_modulus_bits); - const Modulus = std.crypto.ff.Modulus(max_modulus_bits); - const Fe = Modulus.Fe; - - pub const PSSSignature = struct { - pub fn fromBytes(comptime modulus_len: usize, msg: []const u8) [modulus_len]u8 { - var result = [1]u8{0} ** modulus_len; - std.mem.copyForwards(u8, &result, msg); - return result; - } - - pub fn verify(comptime modulus_len: usize, sig: [modulus_len]u8, msg: []const u8, public_key: PublicKey, comptime Hash: type) !void { - const mod_bits = public_key.n.bits(); - const em_dec = try encrypt(modulus_len, sig, public_key); - - EMSA_PSS_VERIFY(msg, &em_dec, mod_bits - 1, Hash.digest_length, Hash) catch unreachable; - } - - fn EMSA_PSS_VERIFY(msg: []const u8, em: []const u8, emBit: usize, sLen: usize, comptime Hash: type) !void { - // 1. If the length of M is greater than the input limitation for - // the hash function (2^61 - 1 octets for SHA-1), output - // "inconsistent" and stop. - // All the cryptographic hash functions in the standard library have a limit of >= 2^61 - 1. - // Even then, this check is only there for paranoia. In the context of TLS certifcates, emBit cannot exceed 4096. - if (emBit >= 1 << 61) return error.InvalidSignature; - - // emLen = \ceil(emBits/8) - const emLen = ((emBit - 1) / 8) + 1; - std.debug.assert(emLen == em.len); - - // 2. Let mHash = Hash(M), an octet string of length hLen. - var mHash: [Hash.digest_length]u8 = undefined; - Hash.hash(msg, &mHash, .{}); - - // 3. If emLen < hLen + sLen + 2, output "inconsistent" and stop. - if (emLen < Hash.digest_length + sLen + 2) { - return error.InvalidSignature; - } - - // 4. If the rightmost octet of EM does not have hexadecimal value - // 0xbc, output "inconsistent" and stop. - if (em[em.len - 1] != 0xbc) { - return error.InvalidSignature; - } - - // 5. Let maskedDB be the leftmost emLen - hLen - 1 octets of EM, - // and let H be the next hLen octets. - const maskedDB = em[0..(emLen - Hash.digest_length - 1)]; - const h = em[(emLen - Hash.digest_length - 1)..(emLen - 1)][0..Hash.digest_length]; - - // 6. If the leftmost 8emLen - emBits bits of the leftmost octet in - // maskedDB are not all equal to zero, output "inconsistent" and - // stop. - const zero_bits = emLen * 8 - emBit; - var mask: u8 = maskedDB[0]; - var i: usize = 0; - while (i < 8 - zero_bits) : (i += 1) { - mask = mask >> 1; - } - if (mask != 0) { - return error.InvalidSignature; - } - - // 7. Let dbMask = MGF(H, emLen - hLen - 1). - const mgf_len = emLen - Hash.digest_length - 1; - var mgf_out_buf: [512]u8 = undefined; - if (mgf_len > mgf_out_buf.len) { // Modulus > 4096 bits - return error.InvalidSignature; - } - const mgf_out = mgf_out_buf[0 .. ((mgf_len - 1) / Hash.digest_length + 1) * Hash.digest_length]; - var dbMask = try MGF1(Hash, mgf_out, h, mgf_len); - - // 8. Let DB = maskedDB \xor dbMask. - i = 0; - while (i < dbMask.len) : (i += 1) { - dbMask[i] = maskedDB[i] ^ dbMask[i]; - } - - // 9. Set the leftmost 8emLen - emBits bits of the leftmost octet - // in DB to zero. - i = 0; - mask = 0; - while (i < 8 - zero_bits) : (i += 1) { - mask = mask << 1; - mask += 1; - } - dbMask[0] = dbMask[0] & mask; - - // 10. If the emLen - hLen - sLen - 2 leftmost octets of DB are not - // zero or if the octet at position emLen - hLen - sLen - 1 (the - // leftmost position is "position 1") does not have hexadecimal - // value 0x01, output "inconsistent" and stop. - if (dbMask[mgf_len - sLen - 2] != 0x00) { - return error.InvalidSignature; - } - - if (dbMask[mgf_len - sLen - 1] != 0x01) { - return error.InvalidSignature; - } - - // 11. Let salt be the last sLen octets of DB. - const salt = dbMask[(mgf_len - sLen)..]; - - // 12. Let - // M' = (0x)00 00 00 00 00 00 00 00 || mHash || salt ; - // M' is an octet string of length 8 + hLen + sLen with eight - // initial zero octets. - if (sLen > Hash.digest_length) { // A seed larger than the hash length would be useless - return error.InvalidSignature; - } - var m_p_buf: [8 + Hash.digest_length + Hash.digest_length]u8 = undefined; - var m_p = m_p_buf[0 .. 8 + Hash.digest_length + sLen]; - std.mem.copyForwards(u8, m_p, &([_]u8{0} ** 8)); - std.mem.copyForwards(u8, m_p[8..], &mHash); - std.mem.copyForwards(u8, m_p[(8 + Hash.digest_length)..], salt); - - // 13. Let H' = Hash(M'), an octet string of length hLen. - var h_p: [Hash.digest_length]u8 = undefined; - Hash.hash(m_p, &h_p, .{}); - - // 14. If H = H', output "consistent". Otherwise, output - // "inconsistent". - if (!std.mem.eql(u8, h, &h_p)) { - return error.InvalidSignature; - } - } - - fn MGF1(comptime Hash: type, out: []u8, seed: *const [Hash.digest_length]u8, len: usize) ![]u8 { - var counter: usize = 0; - var idx: usize = 0; - var c: [4]u8 = undefined; - var hash: [Hash.digest_length + c.len]u8 = undefined; - @memcpy(hash[0..Hash.digest_length], seed); - var hashed: [Hash.digest_length]u8 = undefined; - - while (idx < len) { - c[0] = @as(u8, @intCast((counter >> 24) & 0xFF)); - c[1] = @as(u8, @intCast((counter >> 16) & 0xFF)); - c[2] = @as(u8, @intCast((counter >> 8) & 0xFF)); - c[3] = @as(u8, @intCast(counter & 0xFF)); - - std.mem.copyForwards(u8, hash[seed.len..], &c); - Hash.hash(&hash, &hashed, .{}); - - std.mem.copyForwards(u8, out[idx..], &hashed); - idx += hashed.len; - - counter += 1; - } - - return out[0..len]; - } - }; - - pub const PublicKey = struct { - n: Modulus, - e: Fe, - - pub fn fromBytes(pub_bytes: []const u8, modulus_bytes: []const u8) !PublicKey { - // Reject modulus below 512 bits. - // 512-bit RSA was factored in 1999, so this limit barely means anything, - // but establish some limit now to ratchet in what we can. - const _n = Modulus.fromBytes(modulus_bytes, .big) catch return error.CertificatePublicKeyInvalid; - if (_n.bits() < 512) return error.CertificatePublicKeyInvalid; - - // Exponent must be odd and greater than 2. - // Also, it must be less than 2^32 to mitigate DoS attacks. - // Windows CryptoAPI doesn't support values larger than 32 bits [1], so it is - // unlikely that exponents larger than 32 bits are being used for anything - // Windows commonly does. - // [1] https://learn.microsoft.com/en-us/windows/win32/api/wincrypt/ns-wincrypt-rsapubkey - if (pub_bytes.len > 4) return error.CertificatePublicKeyInvalid; - const _e = Fe.fromBytes(_n, pub_bytes, .big) catch return error.CertificatePublicKeyInvalid; - if (!_e.isOdd()) return error.CertificatePublicKeyInvalid; - const e_v = _e.toPrimitive(u32) catch return error.CertificatePublicKeyInvalid; - if (e_v < 2) return error.CertificatePublicKeyInvalid; - - return .{ - .n = _n, - .e = _e, - }; - } - - pub fn parseDer(pub_key: []const u8) !struct { modulus: []const u8, exponent: []const u8 } { - const pub_key_seq = try der.Element.parse(pub_key, 0); - if (pub_key_seq.identifier.tag != .sequence) return error.CertificateFieldHasWrongDataType; - const modulus_elem = try der.Element.parse(pub_key, pub_key_seq.slice.start); - if (modulus_elem.identifier.tag != .integer) return error.CertificateFieldHasWrongDataType; - const exponent_elem = try der.Element.parse(pub_key, modulus_elem.slice.end); - if (exponent_elem.identifier.tag != .integer) return error.CertificateFieldHasWrongDataType; - // Skip over meaningless zeroes in the modulus. - const modulus_raw = pub_key[modulus_elem.slice.start..modulus_elem.slice.end]; - const modulus_offset = for (modulus_raw, 0..) |byte, i| { - if (byte != 0) break i; - } else modulus_raw.len; - return .{ - .modulus = modulus_raw[modulus_offset..], - .exponent = pub_key[exponent_elem.slice.start..exponent_elem.slice.end], - }; - } - }; - - fn encrypt(comptime modulus_len: usize, msg: [modulus_len]u8, public_key: PublicKey) ![modulus_len]u8 { - const m = Fe.fromBytes(public_key.n, &msg, .big) catch return error.MessageTooLong; - const e = public_key.n.powPublic(m, public_key.e) catch unreachable; - var res: [modulus_len]u8 = undefined; - e.toBytes(&res, .big) catch unreachable; - return res; - } -}; - const use_vectors = @import("builtin").zig_backend != .stage2_x86_64; diff --git a/lib/std/crypto/der.zig b/lib/std/crypto/der.zig new file mode 100644 index 000000000000..743a65ad03cc --- /dev/null +++ b/lib/std/crypto/der.zig @@ -0,0 +1,467 @@ +//! An encoding of ASN.1. +//! +//! Distinguised Encoding Rules as defined in X.690 and X.691. +//! +//! A version of Basic Encoding Rules (BER) where there is exactly ONE way to +//! represent non-constructed elements. This is useful for cryptographic signatures. +//! +//! Currently an implementation detail of the standard library not fit for public +//! use since it's missing an encoder. + +const std = @import("std"); +const builtin = @import("builtin"); + +pub const Index = usize; +const log = std.log.scoped(.der); + +/// A secure DER parser that: +/// - Does NOT read memory outside `bytes`. +/// - Does NOT return elements with slices outside `bytes`. +/// - Errors on values that do NOT follow DER rules. +/// - Lengths that could be represented in a shorter form. +/// - Booleans that are not 0xff or 0x00. +pub const Parser = struct { + bytes: []const u8, + index: Index = 0, + + pub const Error = Element.Error || error{ + UnexpectedElement, + InvalidIntegerEncoding, + Overflow, + NonCanonical, + }; + + pub fn expectBool(self: *Parser) Error!bool { + const ele = try self.expect(.universal, false, .boolean); + if (ele.slice.len() != 1) return error.InvalidBool; + + return switch (self.view(ele)[0]) { + 0x00 => false, + 0xff => true, + else => error.InvalidBool, + }; + } + + pub fn expectBitstring(self: *Parser) Error!BitString { + const ele = try self.expect(.universal, false, .bitstring); + const bytes = self.view(ele); + const right_padding = bytes[0]; + if (right_padding >= 8) return error.InvalidBitString; + return .{ + .bytes = bytes[1..], + .right_padding = @intCast(right_padding), + }; + } + + // TODO: return high resolution date time type instead of epoch seconds + pub fn expectDateTime(self: *Parser) Error!i64 { + const ele = try self.expect(.universal, false, null); + const bytes = self.view(ele); + switch (ele.identifier.tag) { + .utc_time => { + // Example: "YYMMDD000000Z" + if (bytes.len != 13) + return error.InvalidDateTime; + if (bytes[12] != 'Z') + return error.InvalidDateTime; + + var date: Date = undefined; + date.year = try parseTimeDigits(bytes[0..2], 0, 99); + date.year += if (date.year >= 50) 1900 else 2000; + date.month = try parseTimeDigits(bytes[2..4], 1, 12); + date.day = try parseTimeDigits(bytes[4..6], 1, 31); + const time = try parseTime(bytes[6..12]); + + return date.toEpochSeconds() + time.toSec(); + }, + .generalized_time => { + // Examples: + // "19920622123421Z" + // "19920722132100.3Z" + if (bytes.len < 15) + return error.InvalidDateTime; + + var date: Date = undefined; + date.year = try parseYear4(bytes[0..4]); + date.month = try parseTimeDigits(bytes[4..6], 1, 12); + date.day = try parseTimeDigits(bytes[6..8], 1, 31); + const time = try parseTime(bytes[8..14]); + + return date.toEpochSeconds() + time.toSec(); + }, + else => return error.InvalidDateTime, + } + } + + pub fn expectOid(self: *Parser) Error![]const u8 { + const oid = try self.expect(.universal, false, .object_identifier); + return self.view(oid); + } + + pub fn expectEnum(self: *Parser, comptime Enum: type) Error!Enum { + const oid = try self.expectOid(); + return Enum.oids.get(oid) orelse { + if (builtin.mode == .Debug) { + var buf: [256]u8 = undefined; + var stream = std.io.fixedBufferStream(&buf); + try @import("./oid.zig").decode(oid, stream.writer()); + log.warn("unknown oid {s} for enum {s}\n", .{ stream.getWritten(), @typeName(Enum) }); + } + return error.UnknownObjectId; + }; + } + + pub fn expectInt(self: *Parser, comptime T: type) Error!T { + const ele = try self.expectPrimitive(.integer); + const bytes = self.view(ele); + + const info = @typeInfo(T); + if (info != .Int) @compileError(@typeName(T) ++ " is not an int type"); + const Shift = std.math.Log2Int(u8); + + var result: std.meta.Int(.unsigned, info.Int.bits) = 0; + for (bytes, 0..) |b, index| { + const shifted = @shlWithOverflow(b, @as(Shift, @intCast(index * 8))); + if (shifted[1] == 1) return error.Overflow; + + result |= shifted[0]; + } + + return @bitCast(result); + } + + pub fn expectString(self: *Parser, allowed: std.EnumSet(String.Tag)) Error!String { + const ele = try self.expect(.universal, false, null); + switch (ele.identifier.tag) { + inline .string_utf8, + .string_numeric, + .string_printable, + .string_teletex, + .string_videotex, + .string_ia5, + .string_visible, + .string_universal, + .string_bmp, + => |t| { + const tagname = @tagName(t)["string_".len..]; + const tag = std.meta.stringToEnum(String.Tag, tagname) orelse unreachable; + if (allowed.contains(tag)) { + return String{ .tag = tag, .data = self.view(ele) }; + } + }, + else => {}, + } + return error.UnexpectedElement; + } + + pub fn expectPrimitive(self: *Parser, tag: ?Identifier.Tag) Error!Element { + var elem = try self.expect(.universal, false, tag); + if (tag == .integer and elem.slice.len() > 0) { + if (self.view(elem)[0] == 0) elem.slice.start += 1; + if (elem.slice.len() > 0 and self.view(elem)[0] == 0) return error.InvalidIntegerEncoding; + } + return elem; + } + + /// Remember to call `expectEnd` + pub fn expectSequence(self: *Parser) Error!Element { + return try self.expect(.universal, true, .sequence); + } + + /// Remember to call `expectEnd` + pub fn expectSequenceOf(self: *Parser) Error!Element { + return try self.expect(.universal, true, .sequence_of); + } + + pub fn expectEnd(self: *Parser, val: usize) Error!void { + if (self.index != val) return error.NonCanonical; // either forgot to parse end OR an attacker + } + + pub fn expect( + self: *Parser, + class: ?Identifier.Class, + constructed: ?bool, + tag: ?Identifier.Tag, + ) Error!Element { + if (self.index >= self.bytes.len) return error.EndOfStream; + + const res = try Element.init(self.bytes, self.index); + if (tag) |e| { + if (res.identifier.tag != e) return error.UnexpectedElement; + } + if (constructed) |e| { + if (res.identifier.constructed != e) return error.UnexpectedElement; + } + if (class) |e| { + if (res.identifier.class != e) return error.UnexpectedElement; + } + self.index = if (res.identifier.constructed) res.slice.start else res.slice.end; + return res; + } + + pub fn view(self: Parser, elem: Element) []const u8 { + return elem.slice.view(self.bytes); + } + + pub fn seek(self: *Parser, index: usize) void { + self.index = index; + } + + pub fn eof(self: *Parser) bool { + return self.index == self.bytes.len; + } +}; + +pub const Element = struct { + identifier: Identifier, + slice: Slice, + + pub const Slice = struct { + start: Index, + end: Index, + + pub fn len(self: Slice) Index { + return self.end - self.start; + } + + pub fn view(self: Slice, bytes: []const u8) []const u8 { + return bytes[self.start..self.end]; + } + }; + + pub const Error = error{ InvalidLength, EndOfStream }; + + pub fn init(bytes: []const u8, index: Index) Error!Element { + var stream = std.io.fixedBufferStream(bytes[index..]); + var reader = stream.reader(); + + const identifier = @as(Identifier, @bitCast(try reader.readByte())); + const size_or_len_size = try reader.readByte(); + + var start = index + 2; + // short form between 0-127 + if (size_or_len_size < 128) { + const end = start + size_or_len_size; + if (end > bytes.len) return error.InvalidLength; + + return .{ .identifier = identifier, .slice = .{ .start = start, .end = end } }; + } + + // long form between 0 and std.math.maxInt(u1024) + const len_size: u7 = @truncate(size_or_len_size); + start += len_size; + if (len_size > @sizeOf(Index)) return error.InvalidLength; + const len = try reader.readVarInt(Index, .big, len_size); + if (len < 128) return error.InvalidLength; // should have used short form + + const end = std.math.add(Index, start, len) catch return error.InvalidLength; + if (end > bytes.len) return error.InvalidLength; + + return .{ .identifier = identifier, .slice = .{ .start = start, .end = end } }; + } +}; + +test Element { + const short_form = [_]u8{ 0x30, 0x03, 0x02, 0x01, 0x09 }; + try std.testing.expectEqual(Element{ + .identifier = Identifier{ .tag = .sequence, .constructed = true, .class = .universal }, + .slice = .{ .start = 2, .end = short_form.len }, + }, Element.init(&short_form, 0)); + + const long_form = [_]u8{ 0x30, 129, 129 } ++ [_]u8{0} ** 129; + try std.testing.expectEqual(Element{ + .identifier = Identifier{ .tag = .sequence, .constructed = true, .class = .universal }, + .slice = .{ .start = 3, .end = long_form.len }, + }, Element.init(&long_form, 0)); +} + +test "parser.expectInt" { + const one = [_]u8{ 2, 1, 1 }; + var parser = Parser{ .bytes = &one }; + try std.testing.expectEqual(@as(u8, 1), try parser.expectInt(u8)); +} + +pub const Identifier = packed struct(u8) { + tag: Tag, + constructed: bool, + class: Class, + + pub const Class = enum(u2) { + universal, + application, + context_specific, + private, + }; + + // https://www.oss.com/asn1/resources/asn1-made-simple/asn1-quick-reference/asn1-tags.html + pub const Tag = enum(u5) { + boolean = 1, + integer = 2, + bitstring = 3, + octetstring = 4, + null = 5, + object_identifier = 6, + real = 9, + enumerated = 10, + string_utf8 = 12, + sequence = 16, + sequence_of = 17, + string_numeric = 18, + string_printable = 19, + string_teletex = 20, + string_videotex = 21, + string_ia5 = 22, + utc_time = 23, + generalized_time = 24, + string_visible = 26, + string_universal = 28, + string_bmp = 30, + _, + }; +}; + +pub const BitString = struct { + bytes: []const u8, + right_padding: u3, + + pub fn bitLen(self: BitString) usize { + return self.bytes.len * 8 + self.right_padding; + } +}; + +pub const String = struct { + tag: Tag, + data: []const u8, + + pub const Tag = enum { + /// Blessed. + utf8, + /// us-ascii ([-][0-9][eE][.])* + numeric, + /// us-ascii ([A-Z][a-z][0-9][.?!,][ \t])* + printable, + /// iso-8859-1 with escaping into different character sets. + /// Cursed. + teletex, + /// iso-8859-1 + videotex, + /// us-ascii first 128 characters. + ia5, + /// us-ascii without control characters. + visible, + /// utf-32-be + universal, + /// utf-16-be + bmp, + }; + + pub const all = [_]Tag{ + .utf8, + .numeric, + .printable, + .teletex, + .videotex, + .ia5, + .visible, + .universal, + .bmp, + }; +}; + +const Date = struct { + year: Year, + month: u8, + day: u8, + + const Year = std.time.epoch.Year; + + fn toEpochSeconds(date: Date) i64 { + // Euclidean Affine Transform by Cassio and Neri. + // Shift and correction constants for 1970-01-01. + const s = 82; + const K = 719468 + 146097 * s; + const L = 400 * s; + + const Y_G: u32 = date.year; + const M_G: u32 = date.month; + const D_G: u32 = date.day; + // Map to computational calendar. + const J: u32 = if (M_G <= 2) 1 else 0; + const Y: u32 = Y_G + L - J; + const M: u32 = if (J != 0) M_G + 12 else M_G; + const D: u32 = D_G - 1; + const C: u32 = Y / 100; + + // Rata die. + const y_star: u32 = 1461 * Y / 4 - C + C / 4; + const m_star: u32 = (979 * M - 2919) / 32; + const N: u32 = y_star + m_star + D; + const days: i32 = @intCast(N - K); + + return @as(i64, days) * std.time.epoch.secs_per_day; + } +}; + +const Time = struct { + hour: std.math.IntFittingRange(0, 24), + minute: std.math.IntFittingRange(0, 60), + second: std.math.IntFittingRange(0, 60), + + fn toSec(t: Time) i64 { + var sec: i64 = 0; + sec += @as(i64, t.hour) * 60 * 60; + sec += @as(i64, t.minute) * 60; + sec += t.second; + return sec; + } +}; + +fn parseTimeDigits( + text: *const [2]u8, + min: comptime_int, + max: comptime_int, +) !std.math.IntFittingRange(min, max) { + const result = std.fmt.parseInt(std.math.IntFittingRange(min, max), text, 10) catch + return error.InvalidTime; + if (result < min) return error.InvalidTime; + if (result > max) return error.InvalidTime; + return result; +} + +test parseTimeDigits { + const expectEqual = std.testing.expectEqual; + try expectEqual(@as(u8, 0), try parseTimeDigits("00", 0, 99)); + try expectEqual(@as(u8, 99), try parseTimeDigits("99", 0, 99)); + try expectEqual(@as(u8, 42), try parseTimeDigits("42", 0, 99)); + + const expectError = std.testing.expectError; + try expectError(error.InvalidTime, parseTimeDigits("13", 1, 12)); + try expectError(error.InvalidTime, parseTimeDigits("00", 1, 12)); + try expectError(error.InvalidTime, parseTimeDigits("Di", 0, 99)); +} + +fn parseYear4(text: *const [4]u8) !Date.Year { + const result = std.fmt.parseInt(Date.Year, text, 10) catch return error.InvalidYear; + if (result > 9999) return error.InvalidYear; + return result; +} + +test parseYear4 { + const expectEqual = std.testing.expectEqual; + try expectEqual(@as(Date.Year, 0), try parseYear4("0000")); + try expectEqual(@as(Date.Year, 9999), try parseYear4("9999")); + try expectEqual(@as(Date.Year, 1988), try parseYear4("1988")); + + const expectError = std.testing.expectError; + try expectError(error.InvalidYear, parseYear4("999b")); + try expectError(error.InvalidYear, parseYear4("crap")); + try expectError(error.InvalidYear, parseYear4("r:bQ")); +} + +fn parseTime(bytes: *const [6]u8) !Time { + return .{ + .hour = try parseTimeDigits(bytes[0..2], 0, 23), + .minute = try parseTimeDigits(bytes[2..4], 0, 59), + .second = try parseTimeDigits(bytes[4..6], 0, 59), + }; +} diff --git a/lib/std/crypto/ecdsa.zig b/lib/std/crypto/ecdsa.zig index 5551f990d27e..b46e6c241cae 100644 --- a/lib/std/crypto/ecdsa.zig +++ b/lib/std/crypto/ecdsa.zig @@ -1,5 +1,6 @@ const builtin = @import("builtin"); const std = @import("std"); +const der = @import("der.zig"); const crypto = std.crypto; const fmt = std.fmt; const io = std.io; @@ -144,40 +145,26 @@ pub fn Ecdsa(comptime Curve: type, comptime Hash: type) type { return fb.getWritten(); } - // Read a DER-encoded integer. - fn readDerInt(out: []u8, reader: anytype) EncodingError!void { - var buf: [2]u8 = undefined; - _ = reader.readNoEof(&buf) catch return error.InvalidEncoding; - if (buf[0] != 0x02) return error.InvalidEncoding; - var expected_len = @as(usize, buf[1]); - if (expected_len == 0 or expected_len > 1 + out.len) return error.InvalidEncoding; - var has_top_bit = false; - if (expected_len == 1 + out.len) { - if ((reader.readByte() catch return error.InvalidEncoding) != 0) return error.InvalidEncoding; - expected_len -= 1; - has_top_bit = true; - } - const out_slice = out[out.len - expected_len ..]; - reader.readNoEof(out_slice) catch return error.InvalidEncoding; - if (has_top_bit and out[0] >> 7 == 0) return error.InvalidEncoding; - } + pub const FromDerError = der.Parser.Error || error{InvalidScalar}; - /// Create a signature from a DER representation. - /// Returns InvalidEncoding if the DER encoding is invalid. - pub fn fromDer(der: []const u8) EncodingError!Signature { - var sig: Signature = mem.zeroInit(Signature, .{}); - var fb = io.fixedBufferStream(der); - const reader = fb.reader(); - var buf: [2]u8 = undefined; - _ = reader.readNoEof(&buf) catch return error.InvalidEncoding; - if (buf[0] != 0x30 or @as(usize, buf[1]) + 2 != der.len) { - return error.InvalidEncoding; - } - try readDerInt(&sig.r, reader); - try readDerInt(&sig.s, reader); - if (fb.getPos() catch unreachable != der.len) return error.InvalidEncoding; + pub fn fromDer(bytes: []const u8) FromDerError!Signature { + var parser = der.Parser{ .bytes = bytes }; + const seq = try parser.expectSequence(); + + const max_len = @sizeOf(Curve.scalar.CompressedScalar); + const r = try parser.expectPrimitive(.integer); + if (r.slice.len() > max_len) return error.InvalidScalar; + const s = try parser.expectPrimitive(.integer); + if (s.slice.len() > max_len) return error.InvalidScalar; + + try parser.expectEnd(seq.slice.end); + try parser.expectEnd(bytes.len); - return sig; + var res = std.mem.zeroInit(Signature, .{}); + @memcpy(res.r[res.r.len - parser.view(r).len ..], parser.view(r)); + @memcpy(res.s[res.r.len - parser.view(s).len ..], parser.view(s)); + + return res; } }; @@ -376,7 +363,7 @@ pub fn Ecdsa(comptime Curve: type, comptime Hash: type) type { }; } -test "Basic operations over EcdsaP384Sha384" { +test EcdsaP384Sha384 { if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; const Scheme = EcdsaP384Sha384; @@ -392,7 +379,7 @@ test "Basic operations over EcdsaP384Sha384" { try sig2.verify(msg, kp.public_key); } -test "Basic operations over Secp256k1" { +test EcdsaSecp256k1Sha256oSha256 { if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; const Scheme = EcdsaSecp256k1Sha256oSha256; @@ -408,7 +395,7 @@ test "Basic operations over Secp256k1" { try sig2.verify(msg, kp.public_key); } -test "Basic operations over EcdsaP384Sha256" { +test "Ecdsa(crypto.ecc.P384, crypto.hash.sha2.Sha256)" { if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; const Scheme = Ecdsa(crypto.ecc.P384, crypto.hash.sha2.Sha256); @@ -468,417 +455,32 @@ const TestVector = struct { result: enum { valid, invalid, acceptable }, }; +const wycheproof = @import("./testdata/ecdsa_secp256r1_sha256_wycheproof.zig"); + test "Test vectors from Project Wycheproof" { if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; - const vectors = [_]TestVector{ - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "304402202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e1802204cd60b855d442f5b3c7b11eb6c4e0ae7525fe710fab9aa7c77a67f79e6fadd76", .result = .valid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "304402202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180220b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", .result = .acceptable }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", .result = .valid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "30814502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "3082004502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "304602202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "304402202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "3085010000004502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "308901000000000000004502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "30847fffffff02202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "3084ffffffff02202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "3085ffffffffff02202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "3088ffffffffffffffff02202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "30ff02202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "308002202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "304502802ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18028000b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "30", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "304702202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db0000", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "3047000002202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db0000", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "304702202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db0500", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "304a498177304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "30492500304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "3047304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db0004deadbeef", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "304a222549817702202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "30492224250002202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "304d222202202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180004deadbeef022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "304a02202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e182226498177022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "304902202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e1822252500022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "304d02202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e182223022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db0004deadbeef", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "304daa00bb00cd00304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "304baa02aabb304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "304d2228aa00bb00cd0002202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "304b2226aa02aabb02202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "304d02202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e182229aa00bb00cd00022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "304b02202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e182227aa02aabb022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "3081", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "3080304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db0000", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "3049228002202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180000022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "304902202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e182280022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db0000", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "3080314502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db0000", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "3049228003202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180000022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "304902202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e182280032100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db0000", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "0500", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "2e4502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "2f4502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "314502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "324502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "ff4502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "3000", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "30493001023044202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "304402202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "3044202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "308002202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db0000", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "308002202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db00", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "308002202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db05000000", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "308002202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db060811220000", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "308002202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db0000fe02beef", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "308002202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db0002beef", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "3047300002202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "304702202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db3000", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "304802202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847dbbf7f00", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "3047304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "302202202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "306802202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "30460281202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "304602202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e1802812100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "3047028200202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "304702202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180282002100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "304502212ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "3045021f2ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022200b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022000b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "304a028501000000202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "304a02202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180285010000002100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "304e02890100000000000000202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "304e02202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18028901000000000000002100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "304902847fffffff2ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "304902202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e1802847fffffff00b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "30490284ffffffff2ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "304902202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180284ffffffff00b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "304a0285ffffffffff2ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "304a02202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180285ffffffffff00b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "304d0288ffffffffffffffff2ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "304d02202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180288ffffffffffffffff00b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "304502ff2ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e1802ff00b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "3023022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "302402022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "302302202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e1802", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "304702222ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180000022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "304702202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022300b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db0000", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "3047022200002ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "304702202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180223000000b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "304702202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180000022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "304702222ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180500022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "304702202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022300b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db0500", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "30250281022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "302402202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180281", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "30250500022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "302402202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180500", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "304500202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "304501202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "304503202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "304504202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "3045ff202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18002100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18012100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18032100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18042100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18ff2100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "30250200022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "302402202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180200", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "3049222402012b021fa3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "304902202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e1822250201000220b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "3045022029a3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022102b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e98022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b491568475b", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "3044021f2ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "3044021fa3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "304402202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022000b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "30460221ff2ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "304602202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180222ff00b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "3026090180022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "302502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18090180", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "3026020100022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "302502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18020100", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "30460221012ba3a8bd6b94d5ed80a6d9d1190a436ebccc0833490686deac8635bcb9bf5369022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "30460221ff2ba3a8bf6b94d5eb80a6d9d1190a436f42fe12d7fad749d4c512a036c0f908c7022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "30450220d45c5741946b2a137f59262ee6f5bc91001af27a5e1117a64733950642a3d1e8022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "3046022100d45c5740946b2a147f59262ee6f5bc90bd01ed280528b62b3aed5fc93f06f739022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "30460221fed45c5742946b2a127f59262ee6f5bc914333f7ccb6f979215379ca434640ac97022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "30460221012ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "3046022100d45c5741946b2a137f59262ee6f5bc91001af27a5e1117a64733950642a3d1e8022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022101b329f478a2bbd0a6c384ee1493b1f518276e0e4a5375928d6fcd160c11cb6d2c", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "304402202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180220b329f47aa2bbd0a4c384ee1493b1f518ada018ef05465583885980861905228a", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180221ff4cd60b865d442f5a3c7b11eb6c4e0ae79578ec6353a20bf783ecb4b6ea97b825", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180221fe4cd60b875d442f593c7b11eb6c4e0ae7d891f1b5ac8a6d729032e9f3ee3492d4", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022101b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "304402202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e1802204cd60b865d442f5a3c7b11eb6c4e0ae79578ec6353a20bf783ecb4b6ea97b825", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "3006020100020100", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "3006020100020101", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "30060201000201ff", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "3026020100022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "3026020100022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "3026020100022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "3026020100022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "3026020100022100ffffffff00000001000000000000000000000001000000000000000000000000", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "3008020100090380fe01", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "3006020100090142", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "3006020101020100", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "3006020101020101", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "30060201010201ff", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "3026020101022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "3026020101022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "3026020101022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "3026020101022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "3026020101022100ffffffff00000001000000000000000000000001000000000000000000000000", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "3008020101090380fe01", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "3006020101090142", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "30060201ff020100", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "30060201ff020101", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "30060201ff0201ff", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "30260201ff022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "30260201ff022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "30260201ff022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "30260201ff022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "30260201ff022100ffffffff00000001000000000000000000000001000000000000000000000000", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "30080201ff090380fe01", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "30060201ff090142", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551020100", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551020101", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325510201ff", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551022100ffffffff00000001000000000000000000000001000000000000000000000000", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "3028022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551090380fe01", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551090142", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550020100", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550020101", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325500201ff", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550022100ffffffff00000001000000000000000000000001000000000000000000000000", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "3028022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550090380fe01", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550090142", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552020100", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552020101", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325520201ff", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552022100ffffffff00000001000000000000000000000001000000000000000000000000", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "3028022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552090380fe01", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552090142", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "3026022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff020100", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "3026022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff020101", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "3026022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff0201ff", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "3046022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "3046022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "3046022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "3046022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "3046022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff022100ffffffff00000001000000000000000000000001000000000000000000000000", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "3028022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff090380fe01", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "3026022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff090142", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "3026022100ffffffff00000001000000000000000000000001000000000000000000000000020100", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "3026022100ffffffff00000001000000000000000000000001000000000000000000000000020101", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "3026022100ffffffff000000010000000000000000000000010000000000000000000000000201ff", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "3046022100ffffffff00000001000000000000000000000001000000000000000000000000022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "3046022100ffffffff00000001000000000000000000000001000000000000000000000000022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "3046022100ffffffff00000001000000000000000000000001000000000000000000000000022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "3046022100ffffffff00000001000000000000000000000001000000000000000000000000022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "3046022100ffffffff00000001000000000000000000000001000000000000000000000000022100ffffffff00000001000000000000000000000001000000000000000000000000", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "3028022100ffffffff00000001000000000000000000000001000000000000000000000000090380fe01", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "3026022100ffffffff00000001000000000000000000000001000000000000000000000000090142", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "30060201010c0130", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "30050201010c00", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "30090c0225730c03732573", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "30080201013003020100", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "3003020101", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "3006020101010100", .result = .invalid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "3639383139", .sig = "3044022064a1aab5000d0e804f3e2fc02bdee9be8ff312334e2ba16d11547c97711c898e02206af015971cc30be6d1a206d4e013e0997772a2f91d73286ffd683b9bb2cf4f1b", .result = .valid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "343236343739373234", .sig = "3044022016aea964a2f6506d6f78c81c91fc7e8bded7d397738448de1e19a0ec580bf2660220252cd762130c6667cfe8b7bc47d27d78391e8e80c578d1cd38c3ff033be928e9", .result = .valid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "37313338363834383931", .sig = "30450221009cc98be2347d469bf476dfc26b9b733df2d26d6ef524af917c665baccb23c8820220093496459effe2d8d70727b82462f61d0ec1b7847929d10ea631dacb16b56c32", .result = .valid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "3130333539333331363638", .sig = "3044022073b3c90ecd390028058164524dde892703dce3dea0d53fa8093999f07ab8aa4302202f67b0b8e20636695bb7d8bf0a651c802ed25a395387b5f4188c0c4075c88634", .result = .valid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "33393439343031323135", .sig = "3046022100bfab3098252847b328fadf2f89b95c851a7f0eb390763378f37e90119d5ba3dd022100bdd64e234e832b1067c2d058ccb44d978195ccebb65c2aaf1e2da9b8b4987e3b", .result = .valid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "31333434323933303739", .sig = "30440220204a9784074b246d8bf8bf04a4ceb1c1f1c9aaab168b1596d17093c5cd21d2cd022051cce41670636783dc06a759c8847868a406c2506fe17975582fe648d1d88b52", .result = .valid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "33373036323131373132", .sig = "3046022100ed66dc34f551ac82f63d4aa4f81fe2cb0031a91d1314f835027bca0f1ceeaa0302210099ca123aa09b13cd194a422e18d5fda167623c3f6e5d4d6abb8953d67c0c48c7", .result = .valid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "333433363838373132", .sig = "30450220060b700bef665c68899d44f2356a578d126b062023ccc3c056bf0f60a237012b0221008d186c027832965f4fcc78a3366ca95dedbb410cbef3f26d6be5d581c11d3610", .result = .valid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "31333531353330333730", .sig = "30460221009f6adfe8d5eb5b2c24d7aa7934b6cf29c93ea76cd313c9132bb0c8e38c96831d022100b26a9c9e40e55ee0890c944cf271756c906a33e66b5bd15e051593883b5e9902", .result = .valid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "36353533323033313236", .sig = "3045022100a1af03ca91677b673ad2f33615e56174a1abf6da168cebfa8868f4ba273f16b7022020aa73ffe48afa6435cd258b173d0c2377d69022e7d098d75caf24c8c5e06b1c", .result = .valid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "31353634333436363033", .sig = "3045022100fdc70602766f8eed11a6c99a71c973d5659355507b843da6e327a28c11893db902203df5349688a085b137b1eacf456a9e9e0f6d15ec0078ca60a7f83f2b10d21350", .result = .valid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "34343239353339313137", .sig = "3046022100b516a314f2fce530d6537f6a6c49966c23456f63c643cf8e0dc738f7b876e675022100d39ffd033c92b6d717dd536fbc5efdf1967c4bd80954479ba66b0120cd16fff2", .result = .valid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "3130393533323631333531", .sig = "304402203b2cbf046eac45842ecb7984d475831582717bebb6492fd0a485c101e29ff0a802204c9b7b47a98b0f82de512bc9313aaf51701099cac5f76e68c8595fc1c1d99258", .result = .valid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "35393837333530303431", .sig = "3044022030c87d35e636f540841f14af54e2f9edd79d0312cfa1ab656c3fb15bfde48dcf022047c15a5a82d24b75c85a692bd6ecafeb71409ede23efd08e0db9abf6340677ed", .result = .valid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "33343633303036383738", .sig = "3044022038686ff0fda2cef6bc43b58cfe6647b9e2e8176d168dec3c68ff262113760f520220067ec3b651f422669601662167fa8717e976e2db5e6a4cf7c2ddabb3fde9d67d", .result = .valid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "39383137333230323837", .sig = "3044022044a3e23bf314f2b344fc25c7f2de8b6af3e17d27f5ee844b225985ab6e2775cf02202d48e223205e98041ddc87be532abed584f0411f5729500493c9cc3f4dd15e86", .result = .valid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "33323232303431303436", .sig = "304402202ded5b7ec8e90e7bf11f967a3d95110c41b99db3b5aa8d330eb9d638781688e902207d5792c53628155e1bfc46fb1a67e3088de049c328ae1f44ec69238a009808f9", .result = .valid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "36363636333037313034", .sig = "3046022100bdae7bcb580bf335efd3bc3d31870f923eaccafcd40ec2f605976f15137d8b8f022100f6dfa12f19e525270b0106eecfe257499f373a4fb318994f24838122ce7ec3c7", .result = .valid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "31303335393531383938", .sig = "3045022050f9c4f0cd6940e162720957ffff513799209b78596956d21ece251c2401f1c6022100d7033a0a787d338e889defaaabb106b95a4355e411a59c32aa5167dfab244726", .result = .valid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "31383436353937313935", .sig = "3045022100f612820687604fa01906066a378d67540982e29575d019aabe90924ead5c860d02203f9367702dd7dd4f75ea98afd20e328a1a99f4857b316525328230ce294b0fef", .result = .valid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "33313336303436313839", .sig = "30460221009505e407657d6e8bc93db5da7aa6f5081f61980c1949f56b0f2f507da5782a7a022100c60d31904e3669738ffbeccab6c3656c08e0ed5cb92b3cfa5e7f71784f9c5021", .result = .valid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "32363633373834323534", .sig = "3046022100bbd16fbbb656b6d0d83e6a7787cd691b08735aed371732723e1c68a40404517d0221009d8e35dba96028b7787d91315be675877d2d097be5e8ee34560e3e7fd25c0f00", .result = .valid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "31363532313030353234", .sig = "304402202ec9760122db98fd06ea76848d35a6da442d2ceef7559a30cf57c61e92df327e02207ab271da90859479701fccf86e462ee3393fb6814c27b760c4963625c0a19878", .result = .valid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "35373438303831363936", .sig = "3044022054e76b7683b6650baa6a7fc49b1c51eed9ba9dd463221f7a4f1005a89fe00c5902202ea076886c773eb937ec1cc8374b7915cfd11b1c1ae1166152f2f7806a31c8fd", .result = .valid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "36333433393133343638", .sig = "304402205291deaf24659ffbbce6e3c26f6021097a74abdbb69be4fb10419c0c496c9466022065d6fcf336d27cc7cdb982bb4e4ecef5827f84742f29f10abf83469270a03dc3", .result = .valid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "31353431313033353938", .sig = "30450220207a3241812d75d947419dc58efb05e8003b33fc17eb50f9d15166a88479f107022100cdee749f2e492b213ce80b32d0574f62f1c5d70793cf55e382d5caadf7592767", .result = .valid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "3130343738353830313238", .sig = "304502206554e49f82a855204328ac94913bf01bbe84437a355a0a37c0dee3cf81aa7728022100aea00de2507ddaf5c94e1e126980d3df16250a2eaebc8be486effe7f22b4f929", .result = .valid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "3130353336323835353638", .sig = "3046022100a54c5062648339d2bff06f71c88216c26c6e19b4d80a8c602990ac82707efdfc022100e99bbe7fcfafae3e69fd016777517aa01056317f467ad09aff09be73c9731b0d", .result = .valid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "393533393034313035", .sig = "3045022100975bd7157a8d363b309f1f444012b1a1d23096593133e71b4ca8b059cff37eaf02207faa7a28b1c822baa241793f2abc930bd4c69840fe090f2aacc46786bf919622", .result = .valid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "393738383438303339", .sig = "304402205694a6f84b8f875c276afd2ebcfe4d61de9ec90305afb1357b95b3e0da43885e02200dffad9ffd0b757d8051dec02ebdf70d8ee2dc5c7870c0823b6ccc7c679cbaa4", .result = .valid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "33363130363732343432", .sig = "3045022100a0c30e8026fdb2b4b4968a27d16a6d08f7098f1a98d21620d7454ba9790f1ba602205e470453a8a399f15baf463f9deceb53acc5ca64459149688bd2760c65424339", .result = .valid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "31303534323430373035", .sig = "30440220614ea84acf736527dd73602cd4bb4eea1dfebebd5ad8aca52aa0228cf7b99a880220737cc85f5f2d2f60d1b8183f3ed490e4de14368e96a9482c2a4dd193195c902f", .result = .valid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "35313734343438313937", .sig = "3045022100bead6734ebe44b810d3fb2ea00b1732945377338febfd439a8d74dfbd0f942fa02206bb18eae36616a7d3cad35919fd21a8af4bbe7a10f73b3e036a46b103ef56e2a", .result = .valid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "31393637353631323531", .sig = "30440220499625479e161dacd4db9d9ce64854c98d922cbf212703e9654fae182df9bad2022042c177cf37b8193a0131108d97819edd9439936028864ac195b64fca76d9d693", .result = .valid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "33343437323533333433", .sig = "3045022008f16b8093a8fb4d66a2c8065b541b3d31e3bfe694f6b89c50fb1aaa6ff6c9b20221009d6455e2d5d1779748573b611cb95d4a21f967410399b39b535ba3e5af81ca2e", .result = .valid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "333638323634333138", .sig = "3046022100be26231b6191658a19dd72ddb99ed8f8c579b6938d19bce8eed8dc2b338cb5f8022100e1d9a32ee56cffed37f0f22b2dcb57d5c943c14f79694a03b9c5e96952575c89", .result = .valid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "33323631313938363038", .sig = "3045022015e76880898316b16204ac920a02d58045f36a229d4aa4f812638c455abe0443022100e74d357d3fcb5c8c5337bd6aba4178b455ca10e226e13f9638196506a1939123", .result = .valid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "39363738373831303934", .sig = "30440220352ecb53f8df2c503a45f9846fc28d1d31e6307d3ddbffc1132315cc07f16dad02201348dfa9c482c558e1d05c5242ca1c39436726ecd28258b1899792887dd0a3c6", .result = .valid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "34393538383233383233", .sig = "304402204a40801a7e606ba78a0da9882ab23c7677b8642349ed3d652c5bfa5f2a9558fb02203a49b64848d682ef7f605f2832f7384bdc24ed2925825bf8ea77dc5981725782", .result = .valid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "383234363337383337", .sig = "3045022100eacc5e1a8304a74d2be412b078924b3bb3511bac855c05c9e5e9e44df3d61e9602207451cd8e18d6ed1885dd827714847f96ec4bb0ed4c36ce9808db8f714204f6d1", .result = .valid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "3131303230383333373736", .sig = "304502202f7a5e9e5771d424f30f67fdab61e8ce4f8cd1214882adb65f7de94c31577052022100ac4e69808345809b44acb0b2bd889175fb75dd050c5a449ab9528f8f78daa10c", .result = .valid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313333383731363438", .sig = "3045022100ffcda40f792ce4d93e7e0f0e95e1a2147dddd7f6487621c30a03d710b3300219022079938b55f8a17f7ed7ba9ade8f2065a1fa77618f0b67add8d58c422c2453a49a", .result = .valid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "333232313434313632", .sig = "304602210081f2359c4faba6b53d3e8c8c3fcc16a948350f7ab3a588b28c17603a431e39a8022100cd6f6a5cc3b55ead0ff695d06c6860b509e46d99fccefb9f7f9e101857f74300", .result = .valid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "3130363836363535353436", .sig = "3045022100dfc8bf520445cbb8ee1596fb073ea283ea130251a6fdffa5c3f5f2aaf75ca8080220048e33efce147c9dd92823640e338e68bfd7d0dc7a4905b3a7ac711e577e90e7", .result = .valid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "3632313535323436", .sig = "3046022100ad019f74c6941d20efda70b46c53db166503a0e393e932f688227688ba6a576202210093320eb7ca0710255346bdbb3102cdcf7964ef2e0988e712bc05efe16c199345", .result = .valid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "37303330383138373734", .sig = "3046022100ac8096842e8add68c34e78ce11dd71e4b54316bd3ebf7fffdeb7bd5a3ebc1883022100f5ca2f4f23d674502d4caf85d187215d36e3ce9f0ce219709f21a3aac003b7a8", .result = .valid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "35393234353233373434", .sig = "30440220677b2d3a59b18a5ff939b70ea002250889ddcd7b7b9d776854b4943693fb92f702206b4ba856ade7677bf30307b21f3ccda35d2f63aee81efd0bab6972cc0795db55", .result = .valid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "31343935353836363231", .sig = "30450220479e1ded14bcaed0379ba8e1b73d3115d84d31d4b7c30e1f05e1fc0d5957cfb0022100918f79e35b3d89487cf634a4f05b2e0c30857ca879f97c771e877027355b2443", .result = .valid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "34303035333134343036", .sig = "3044022043dfccd0edb9e280d9a58f01164d55c3d711e14b12ac5cf3b64840ead512a0a302201dbe33fa8ba84533cd5c4934365b3442ca1174899b78ef9a3199f49584389772", .result = .valid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "33303936343537353132", .sig = "304402205b09ab637bd4caf0f4c7c7e4bca592fea20e9087c259d26a38bb4085f0bbff11022045b7eb467b6748af618e9d80d6fdcd6aa24964e5a13f885bca8101de08eb0d75", .result = .valid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "32373834303235363230", .sig = "304502205e9b1c5a028070df5728c5c8af9b74e0667afa570a6cfa0114a5039ed15ee06f022100b1360907e2d9785ead362bb8d7bd661b6c29eeffd3c5037744edaeb9ad990c20", .result = .valid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "32363138373837343138", .sig = "304502200671a0a85c2b72d54a2fb0990e34538b4890050f5a5712f6d1a7a5fb8578f32e022100db1846bab6b7361479ab9c3285ca41291808f27fd5bd4fdac720e5854713694c", .result = .valid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "31363432363235323632", .sig = "304402207673f8526748446477dbbb0590a45492c5d7d69859d301abbaedb35b2095103a02203dc70ddf9c6b524d886bed9e6af02e0e4dec0d417a414fed3807ef4422913d7c", .result = .valid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "36383234313839343336", .sig = "304402207f085441070ecd2bb21285089ebb1aa6450d1a06c36d3ff39dfd657a796d12b50220249712012029870a2459d18d47da9aa492a5e6cb4b2d8dafa9e4c5c54a2b9a8b", .result = .valid }, - .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "343834323435343235", .sig = "3046022100914c67fb61dd1e27c867398ea7322d5ab76df04bc5aa6683a8e0f30a5d287348022100fa07474031481dda4953e3ac1959ee8cea7e66ec412b38d6c96d28f6d37304ea", .result = .valid }, - .{ .key = "040ad99500288d466940031d72a9f5445a4d43784640855bf0a69874d2de5fe103c5011e6ef2c42dcd50d5d3d29f99ae6eba2c80c9244f4c5422f0979ff0c3ba5e", .msg = "313233343030", .sig = "303502104319055358e8617b0c46353d039cdaab022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254e", .result = .valid }, - .{ .key = "040ad99500288d466940031d72a9f5445a4d43784640855bf0a69874d2de5fe103c5011e6ef2c42dcd50d5d3d29f99ae6eba2c80c9244f4c5422f0979ff0c3ba5e", .msg = "313233343030", .sig = "3046022100ffffffff00000001000000000000000000000000fffffffffffffffffffffffc022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254e", .result = .invalid }, - .{ .key = "04ab05fd9d0de26b9ce6f4819652d9fc69193d0aa398f0fba8013e09c58220455419235271228c786759095d12b75af0692dd4103f19f6a8c32f49435a1e9b8d45", .msg = "313233343030", .sig = "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254e", .result = .valid }, - .{ .key = "0480984f39a1ff38a86a68aa4201b6be5dfbfecf876219710b07badf6fdd4c6c5611feb97390d9826e7a06dfb41871c940d74415ed3cac2089f1445019bb55ed95", .msg = "313233343030", .sig = "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100909135bdb6799286170f5ead2de4f6511453fe50914f3df2de54a36383df8dd4", .result = .valid }, - .{ .key = "044201b4272944201c3294f5baa9a3232b6dd687495fcc19a70a95bc602b4f7c0595c37eba9ee8171c1bb5ac6feaf753bc36f463e3aef16629572c0c0a8fb0800e", .msg = "313233343030", .sig = "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022027b4577ca009376f71303fd5dd227dcef5deb773ad5f5a84360644669ca249a5", .result = .valid }, - .{ .key = "04a71af64de5126a4a4e02b7922d66ce9415ce88a4c9d25514d91082c8725ac9575d47723c8fbe580bb369fec9c2665d8e30a435b9932645482e7c9f11e872296b", .msg = "313233343030", .sig = "3006020105020101", .result = .valid }, - .{ .key = "046627cec4f0731ea23fc2931f90ebe5b7572f597d20df08fc2b31ee8ef16b15726170ed77d8d0a14fc5c9c3c4c9be7f0d3ee18f709bb275eaf2073e258fe694a5", .msg = "313233343030", .sig = "3006020105020103", .result = .valid }, - .{ .key = "045a7c8825e85691cce1f5e7544c54e73f14afc010cb731343262ca7ec5a77f5bfef6edf62a4497c1bd7b147fb6c3d22af3c39bfce95f30e13a16d3d7b2812f813", .msg = "313233343030", .sig = "3006020105020105", .result = .valid }, - .{ .key = "04cbe0c29132cd738364fedd603152990c048e5e2fff996d883fa6caca7978c73770af6a8ce44cb41224b2603606f4c04d188e80bff7cc31ad5189d4ab0d70e8c1", .msg = "313233343030", .sig = "3006020105020106", .result = .valid }, - .{ .key = "04cbe0c29132cd738364fedd603152990c048e5e2fff996d883fa6caca7978c73770af6a8ce44cb41224b2603606f4c04d188e80bff7cc31ad5189d4ab0d70e8c1", .msg = "313233343030", .sig = "3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632556020106", .result = .invalid }, - .{ .key = "044be4178097002f0deab68f0d9a130e0ed33a6795d02a20796db83444b037e13920f13051e0eecdcfce4dacea0f50d1f247caa669f193c1b4075b51ae296d2d56", .msg = "313233343030", .sig = "3026020105022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc75fbd8", .result = .invalid }, - .{ .key = "04d0f73792203716afd4be4329faa48d269f15313ebbba379d7783c97bf3e890d9971f4a3206605bec21782bf5e275c714417e8f566549e6bc68690d2363c89cc1", .msg = "313233343030", .sig = "3027020201000221008f1e3c7862c58b16bb76eddbb76eddbb516af4f63f2d74d76e0d28c9bb75ea88", .result = .valid }, - .{ .key = "044838b2be35a6276a80ef9e228140f9d9b96ce83b7a254f71ccdebbb8054ce05ffa9cbc123c919b19e00238198d04069043bd660a828814051fcb8aac738a6c6b", .msg = "313233343030", .sig = "302c02072d9b4d347952d6022100ef3043e7329581dbb3974497710ab11505ee1c87ff907beebadd195a0ffe6d7a", .result = .valid }, - .{ .key = "047393983ca30a520bbc4783dc9960746aab444ef520c0a8e771119aa4e74b0f64e9d7be1ab01a0bf626e709863e6a486dbaf32793afccf774e2c6cd27b1857526", .msg = "313233343030", .sig = "3032020d1033e67e37b32b445580bf4eff0221008b748b74000000008b748b748b748b7466e769ad4a16d3dcd87129b8e91d1b4d", .result = .valid }, - .{ .key = "045ac331a1103fe966697379f356a937f350588a05477e308851b8a502d5dfcdc5fe9993df4b57939b2b8da095bf6d794265204cfe03be995a02e65d408c871c0b", .msg = "313233343030", .sig = "302702020100022100ef9f6ba4d97c09d03178fa20b4aaad83be3cf9cb824a879fec3270fc4b81ef5b", .result = .valid }, - .{ .key = "041d209be8de2de877095a399d3904c74cc458d926e27bb8e58e5eae5767c41509dd59e04c214f7b18dce351fc2a549893a6860e80163f38cc60a4f2c9d040d8c9", .msg = "313233343030", .sig = "3032020d062522bbd3ecbe7c39e93e7c25022100ef9f6ba4d97c09d03178fa20b4aaad83be3cf9cb824a879fec3270fc4b81ef5b", .result = .valid }, - .{ .key = "04083539fbee44625e3acaafa2fcb41349392cef0633a1b8fabecee0c133b10e99915c1ebe7bf00df8535196770a58047ae2a402f26326bb7d41d4d7616337911e", .msg = "313233343030", .sig = "3045022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324d50220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70", .result = .valid }, - .{ .key = "048aeb368a7027a4d64abdea37390c0c1d6a26f399e2d9734de1eb3d0e1937387405bd13834715e1dbae9b875cf07bd55e1b6691c7f7536aef3b19bf7a4adf576d", .msg = "313233343030", .sig = "30250220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70020101", .result = .valid }, - .{ .key = "048aeb368a7027a4d64abdea37390c0c1d6a26f399e2d9734de1eb3d0e1937387405bd13834715e1dbae9b875cf07bd55e1b6691c7f7536aef3b19bf7a4adf576d", .msg = "313233343030", .sig = "30250220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70020100", .result = .invalid }, - .{ .key = "04b533d4695dd5b8c5e07757e55e6e516f7e2c88fa0239e23f60e8ec07dd70f2871b134ee58cc583278456863f33c3a85d881f7d4a39850143e29d4eaf009afe47", .msg = "313233343030", .sig = "304402207fffffff800000007fffffffffffffffde737d56d38bcf4279dce5617e3192a80220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70", .result = .invalid }, - .{ .key = "04f50d371b91bfb1d7d14e1323523bc3aa8cbf2c57f9e284de628c8b4536787b86f94ad887ac94d527247cd2e7d0c8b1291c553c9730405380b14cbb209f5fa2dd", .msg = "313233343030", .sig = "304402207fffffff800000007fffffffffffffffde737d56d38bcf4279dce5617e3192a902207fffffff800000007fffffffffffffffde737d56d38bcf4279dce5617e3192a8", .result = .valid }, - .{ .key = "0468ec6e298eafe16539156ce57a14b04a7047c221bafc3a582eaeb0d857c4d94697bed1af17850117fdb39b2324f220a5698ed16c426a27335bb385ac8ca6fb30", .msg = "313233343030", .sig = "304402207fffffff800000007fffffffffffffffde737d56d38bcf4279dce5617e3192a902207fffffff800000007fffffffffffffffde737d56d38bcf4279dce5617e3192a9", .result = .valid }, - .{ .key = "0469da0364734d2e530fece94019265fefb781a0f1b08f6c8897bdf6557927c8b866d2d3c7dcd518b23d726960f069ad71a933d86ef8abbcce8b20f71e2a847002", .msg = "313233343030", .sig = "30450220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70022100bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023", .result = .valid }, - .{ .key = "04d8adc00023a8edc02576e2b63e3e30621a471e2b2320620187bf067a1ac1ff3233e2b50ec09807accb36131fff95ed12a09a86b4ea9690aa32861576ba2362e1", .msg = "313233343030", .sig = "30440220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70022044a5ad0ad0636d9f12bc9e0a6bdd5e1cbcb012ea7bf091fcec15b0c43202d52e", .result = .valid }, - .{ .key = "043623ac973ced0a56fa6d882f03a7d5c7edca02cfc7b2401fab3690dbe75ab7858db06908e64b28613da7257e737f39793da8e713ba0643b92e9bb3252be7f8fe", .msg = "313233343030", .sig = "30440220555555550000000055555555555555553ef7a8e48d07df81a693439654210c700220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70", .result = .valid }, - .{ .key = "04cf04ea77e9622523d894b93ff52dc3027b31959503b6fa3890e5e04263f922f1e8528fb7c006b3983c8b8400e57b4ed71740c2f3975438821199bedeaecab2e9", .msg = "313233343030", .sig = "30450220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70022100aaaaaaaa00000000aaaaaaaaaaaaaaaa7def51c91a0fbf034d26872ca84218e1", .result = .valid }, - .{ .key = "04db7a2c8a1ab573e5929dc24077b508d7e683d49227996bda3e9f78dbeff773504f417f3bc9a88075c2e0aadd5a13311730cf7cc76a82f11a36eaf08a6c99a206", .msg = "313233343030", .sig = "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100e91e1ba60fdedb76a46bcb51dc0b8b4b7e019f0a28721885fa5d3a8196623397", .result = .valid }, - .{ .key = "04dead11c7a5b396862f21974dc4752fadeff994efe9bbd05ab413765ea80b6e1f1de3f0640e8ac6edcf89cff53c40e265bb94078a343736df07aa0318fc7fe1ff", .msg = "313233343030", .sig = "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100fdea5843ffeb73af94313ba4831b53fe24f799e525b1e8e8c87b59b95b430ad9", .result = .valid }, - .{ .key = "04d0bc472e0d7c81ebaed3a6ef96c18613bb1fea6f994326fbe80e00dfde67c7e9986c723ea4843d48389b946f64ad56c83ad70ff17ba85335667d1bb9fa619efd", .msg = "313233343030", .sig = "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022003ffcabf2f1b4d2a65190db1680d62bb994e41c5251cd73b3c3dfc5e5bafc035", .result = .valid }, - .{ .key = "04a0a44ca947d66a2acb736008b9c08d1ab2ad03776e02640f78495d458dd51c326337fe5cf8c4604b1f1c409dc2d872d4294a4762420df43a30a2392e40426add", .msg = "313233343030", .sig = "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02204dfbc401f971cd304b33dfdb17d0fed0fe4c1a88ae648e0d2847f74977534989", .result = .valid }, - .{ .key = "04c9c2115290d008b45fb65fad0f602389298c25420b775019d42b62c3ce8a96b73877d25a8080dc02d987ca730f0405c2c9dbefac46f9e601cc3f06e9713973fd", .msg = "313233343030", .sig = "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100bc4024761cd2ffd43dfdb17d0fed112b988977055cd3a8e54971eba9cda5ca71", .result = .valid }, - .{ .key = "045eca1ef4c287dddc66b8bccf1b88e8a24c0018962f3c5e7efa83bc1a5ff6033e5e79c4cb2c245b8c45abdce8a8e4da758d92a607c32cd407ecaef22f1c934a71", .msg = "313233343030", .sig = "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd0220788048ed39a5ffa77bfb62fa1fda2257742bf35d128fb3459f2a0c909ee86f91", .result = .valid }, - .{ .key = "045caaa030e7fdf0e4936bc7ab5a96353e0a01e4130c3f8bf22d473e317029a47adeb6adc462f7058f2a20d371e9702254e9b201642005b3ceda926b42b178bef9", .msg = "313233343030", .sig = "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd0220476d9131fd381bd917d0fed112bc9e0a5924b5ed5b11167edd8b23582b3cb15e", .result = .valid }, - .{ .key = "04c2fd20bac06e555bb8ac0ce69eb1ea20f83a1fc3501c8a66469b1a31f619b0986237050779f52b615bd7b8d76a25fc95ca2ed32525c75f27ffc87ac397e6cbaf", .msg = "313233343030", .sig = "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd0221008374253e3e21bd154448d0a8f640fe46fafa8b19ce78d538f6cc0a19662d3601", .result = .valid }, - .{ .key = "043fd6a1ca7f77fb3b0bbe726c372010068426e11ea6ae78ce17bedae4bba86ced03ce5516406bf8cfaab8745eac1cd69018ad6f50b5461872ddfc56e0db3c8ff4", .msg = "313233343030", .sig = "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd0220357cfd3be4d01d413c5b9ede36cba5452c11ee7fe14879e749ae6a2d897a52d6", .result = .valid }, - .{ .key = "049cb8e51e27a5ae3b624a60d6dc32734e4989db20e9bca3ede1edf7b086911114b4c104ab3c677e4b36d6556e8ad5f523410a19f2e277aa895fc57322b4427544", .msg = "313233343030", .sig = "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022029798c5c0ee287d4a5e8e6b799fd86b8df5225298e6ffc807cd2f2bc27a0a6d8", .result = .valid }, - .{ .key = "04a3e52c156dcaf10502620b7955bc2b40bc78ef3d569e1223c262512d8f49602a4a2039f31c1097024ad3cc86e57321de032355463486164cf192944977df147f", .msg = "313233343030", .sig = "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02200b70f22c781092452dca1a5711fa3a5a1f72add1bf52c2ff7cae4820b30078dd", .result = .valid }, - .{ .key = "04f19b78928720d5bee8e670fb90010fb15c37bf91b58a5157c3f3c059b2655e88cf701ec962fb4a11dcf273f5dc357e58468560c7cfeb942d074abd4329260509", .msg = "313233343030", .sig = "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022016e1e458f021248a5b9434ae23f474b43ee55ba37ea585fef95c90416600f1ba", .result = .valid }, - .{ .key = "0483a744459ecdfb01a5cf52b27a05bb7337482d242f235d7b4cb89345545c90a8c05d49337b9649813287de9ffe90355fd905df5f3c32945828121f37cc50de6e", .msg = "313233343030", .sig = "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02202252d6856831b6cf895e4f0535eeaf0e5e5809753df848fe760ad86219016a97", .result = .valid }, - .{ .key = "04dd13c6b34c56982ddae124f039dfd23f4b19bbe88cee8e528ae51e5d6f3a21d7bfad4c2e6f263fe5eb59ca974d039fc0e4c3345692fb5320bdae4bd3b42a45ff", .msg = "313233343030", .sig = "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02210081ffe55f178da695b28c86d8b406b15dab1a9e39661a3ae017fbe390ac0972c3", .result = .valid }, - .{ .key = "0467e6f659cdde869a2f65f094e94e5b4dfad636bbf95192feeed01b0f3deb7460a37e0a51f258b7aeb51dfe592f5cfd5685bbe58712c8d9233c62886437c38ba0", .msg = "313233343030", .sig = "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02207fffffffaaaaaaaaffffffffffffffffe9a2538f37b28a2c513dee40fecbb71a", .result = .valid }, - .{ .key = "042eb6412505aec05c6545f029932087e490d05511e8ec1f599617bb367f9ecaaf805f51efcc4803403f9b1ae0124890f06a43fedcddb31830f6669af292895cb0", .msg = "313233343030", .sig = "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100b62f26b5f2a2b26f6de86d42ad8a13da3ab3cccd0459b201de009e526adf21f2", .result = .valid }, - .{ .key = "0484db645868eab35e3a9fd80e056e2e855435e3a6b68d75a50a854625fe0d7f356d2589ac655edc9a11ef3e075eddda9abf92e72171570ef7bf43a2ee39338cfe", .msg = "313233343030", .sig = "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100bb1d9ac949dd748cd02bbbe749bd351cd57b38bb61403d700686aa7b4c90851e", .result = .valid }, - .{ .key = "0491b9e47c56278662d75c0983b22ca8ea6aa5059b7a2ff7637eb2975e386ad66349aa8ff283d0f77c18d6d11dc062165fd13c3c0310679c1408302a16854ecfbd", .msg = "313233343030", .sig = "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022066755a00638cdaec1c732513ca0234ece52545dac11f816e818f725b4f60aaf2", .result = .valid }, - .{ .key = "04f3ec2f13caf04d0192b47fb4c5311fb6d4dc6b0a9e802e5327f7ec5ee8e4834df97e3e468b7d0db867d6ecfe81e2b0f9531df87efdb47c1338ac321fefe5a432", .msg = "313233343030", .sig = "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022055a00c9fcdaebb6032513ca0234ecfffe98ebe492fdf02e48ca48e982beb3669", .result = .valid }, - .{ .key = "04d92b200aefcab6ac7dafd9acaf2fa10b3180235b8f46b4503e4693c670fccc885ef2f3aebf5b317475336256768f7c19efb7352d27e4cccadc85b6b8ab922c72", .msg = "313233343030", .sig = "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100ab40193f9b5d76c064a27940469d9fffd31d7c925fbe05c919491d3057d66cd2", .result = .valid }, - .{ .key = "040a88361eb92ecca2625b38e5f98bbabb96bf179b3d76fc48140a3bcd881523cde6bdf56033f84a5054035597375d90866aa2c96b86a41ccf6edebf47298ad489", .msg = "313233343030", .sig = "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100ca0234ebb5fdcb13ca0234ecffffffffcb0dadbbc7f549f8a26b4408d0dc8600", .result = .valid }, - .{ .key = "04d0fb17ccd8fafe827e0c1afc5d8d80366e2b20e7f14a563a2ba50469d84375e868612569d39e2bb9f554355564646de99ac602cc6349cf8c1e236a7de7637d93", .msg = "313233343030", .sig = "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100bfffffff3ea3677e082b9310572620ae19933a9e65b285598711c77298815ad3", .result = .valid }, - .{ .key = "04836f33bbc1dc0d3d3abbcef0d91f11e2ac4181076c9af0a22b1e4309d3edb2769ab443ff6f901e30c773867582997c2bec2b0cb8120d760236f3a95bbe881f75", .msg = "313233343030", .sig = "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd0220266666663bbbbbbbe6666666666666665b37902e023fab7c8f055d86e5cc41f4", .result = .valid }, - .{ .key = "0492f99fbe973ed4a299719baee4b432741237034dec8d72ba5103cb33e55feeb8033dd0e91134c734174889f3ebcf1b7a1ac05767289280ee7a794cebd6e69697", .msg = "313233343030", .sig = "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100bfffffff36db6db7a492492492492492146c573f4c6dfc8d08a443e258970b09", .result = .valid }, - .{ .key = "04d35ba58da30197d378e618ec0fa7e2e2d12cffd73ebbb2049d130bba434af09eff83986e6875e41ea432b7585a49b3a6c77cbb3c47919f8e82874c794635c1d2", .msg = "313233343030", .sig = "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100bfffffff2aaaaaab7fffffffffffffffc815d0e60b3e596ecb1ad3a27cfd49c4", .result = .valid }, - .{ .key = "048651ce490f1b46d73f3ff475149be29136697334a519d7ddab0725c8d0793224e11c65bd8ca92dc8bc9ae82911f0b52751ce21dd9003ae60900bd825f590cc28", .msg = "313233343030", .sig = "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02207fffffff55555555ffffffffffffffffd344a71e6f651458a27bdc81fd976e37", .result = .valid }, - .{ .key = "046d8e1b12c831a0da8795650ff95f101ed921d9e2f72b15b1cdaca9826b9cfc6def6d63e2bc5c089570394a4bc9f892d5e6c7a6a637b20469a58c106ad486bf37", .msg = "313233343030", .sig = "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02203fffffff800000007fffffffffffffffde737d56d38bcf4279dce5617e3192aa", .result = .valid }, - .{ .key = "040ae580bae933b4ef2997cbdbb0922328ca9a410f627a0f7dff24cb4d920e15428911e7f8cc365a8a88eb81421a361ccc2b99e309d8dcd9a98ba83c3949d893e3", .msg = "313233343030", .sig = "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02205d8ecd64a4eeba466815ddf3a4de9a8e6abd9c5db0a01eb80343553da648428f", .result = .valid }, - .{ .key = "045b812fd521aafa69835a849cce6fbdeb6983b442d2444fe70e134c027fc46963838a40f2a36092e9004e92d8d940cf5638550ce672ce8b8d4e15eba5499249e9", .msg = "313233343030", .sig = "304502206f2347cab7dd76858fe0555ac3bc99048c4aacafdfb6bcbe05ea6c42c4934569022100bb726660235793aa9957a61e76e00c2c435109cf9a15dd624d53f4301047856b", .result = .valid }, - .{ .key = "045b812fd521aafa69835a849cce6fbdeb6983b442d2444fe70e134c027fc469637c75bf0c5c9f6d17ffb16d2726bf30a9c7aaf31a8d317472b1ea145ab66db616", .msg = "313233343030", .sig = "304502206f2347cab7dd76858fe0555ac3bc99048c4aacafdfb6bcbe05ea6c42c4934569022100bb726660235793aa9957a61e76e00c2c435109cf9a15dd624d53f4301047856b", .result = .invalid }, - .{ .key = "046adda82b90261b0f319faa0d878665a6b6da497f09c903176222c34acfef72a647e6f50dcc40ad5d9b59f7602bb222fad71a41bf5e1f9df4959a364c62e488d9", .msg = "313233343030", .sig = "30250201010220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70", .result = .invalid }, - .{ .key = "042fca0d0a47914de77ed56e7eccc3276a601120c6df0069c825c8f6a01c9f382065f3450a1d17c6b24989a39beb1c7decfca8384fbdc294418e5d807b3c6ed7de", .msg = "313233343030", .sig = "3045022101000000000000000000000000000000000000000000000000000000000000000002203333333300000000333333333333333325c7cbbc549e52e763f1f55a327a3aa9", .result = .invalid }, - .{ .key = "04dd86d3b5f4a13e8511083b78002081c53ff467f11ebd98a51a633db76665d25045d5c8200c89f2fa10d849349226d21d8dfaed6ff8d5cb3e1b7e17474ebc18f7", .msg = "313233343030", .sig = "30440220555555550000000055555555555555553ef7a8e48d07df81a693439654210c7002203333333300000000333333333333333325c7cbbc549e52e763f1f55a327a3aa9", .result = .invalid }, - .{ .key = "044fea55b32cb32aca0c12c4cd0abfb4e64b0f5a516e578c016591a93f5a0fbcc5d7d3fd10b2be668c547b212f6bb14c88f0fecd38a8a4b2c785ed3be62ce4b280", .msg = "313233343030", .sig = "304402207cf27b188d034f7e8a52380304b51ac3c08969e277f21b35a60b48fc476699780220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70", .result = .valid }, - .{ .key = "04c6a771527024227792170a6f8eee735bf32b7f98af669ead299802e32d7c3107bc3b4b5e65ab887bbd343572b3e5619261fe3a073e2ffd78412f726867db589e", .msg = "313233343030", .sig = "304502207cf27b188d034f7e8a52380304b51ac3c08969e277f21b35a60b48fc47669978022100b6db6db6249249254924924924924924625bd7a09bec4ca81bcdd9f8fd6b63cc", .result = .valid }, - .{ .key = "04851c2bbad08e54ec7a9af99f49f03644d6ec6d59b207fec98de85a7d15b956efcee9960283045075684b410be8d0f7494b91aa2379f60727319f10ddeb0fe9d6", .msg = "313233343030", .sig = "304502207cf27b188d034f7e8a52380304b51ac3c08969e277f21b35a60b48fc47669978022100cccccccc00000000cccccccccccccccc971f2ef152794b9d8fc7d568c9e8eaa7", .result = .valid }, - .{ .key = "04f6417c8a670584e388676949e53da7fc55911ff68318d1bf3061205acb19c48f8f2b743df34ad0f72674acb7505929784779cd9ac916c3669ead43026ab6d43f", .msg = "313233343030", .sig = "304402207cf27b188d034f7e8a52380304b51ac3c08969e277f21b35a60b48fc4766997802203333333300000000333333333333333325c7cbbc549e52e763f1f55a327a3aaa", .result = .valid }, - .{ .key = "04501421277be45a5eefec6c639930d636032565af420cf3373f557faa7f8a06438673d6cb6076e1cfcdc7dfe7384c8e5cac08d74501f2ae6e89cad195d0aa1371", .msg = "313233343030", .sig = "304402207cf27b188d034f7e8a52380304b51ac3c08969e277f21b35a60b48fc47669978022049249248db6db6dbb6db6db6db6db6db5a8b230d0b2b51dcd7ebf0c9fef7c185", .result = .valid }, - .{ .key = "040d935bf9ffc115a527735f729ca8a4ca23ee01a4894adf0e3415ac84e808bb343195a3762fea29ed38912bd9ea6c4fde70c3050893a4375850ce61d82eba33c5", .msg = "313233343030", .sig = "304402207cf27b188d034f7e8a52380304b51ac3c08969e277f21b35a60b48fc47669978022016a4502e2781e11ac82cbc9d1edd8c981584d13e18411e2f6e0478c34416e3bb", .result = .valid }, - .{ .key = "045e59f50708646be8a589355014308e60b668fb670196206c41e748e64e4dca215de37fee5c97bcaf7144d5b459982f52eeeafbdf03aacbafef38e213624a01de", .msg = "313233343030", .sig = "304402206b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2960220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70", .result = .valid }, - .{ .key = "04169fb797325843faff2f7a5b5445da9e2fd6226f7ef90ef0bfe924104b02db8e7bbb8de662c7b9b1cf9b22f7a2e582bd46d581d68878efb2b861b131d8a1d667", .msg = "313233343030", .sig = "304502206b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296022100b6db6db6249249254924924924924924625bd7a09bec4ca81bcdd9f8fd6b63cc", .result = .valid }, - .{ .key = "04271cd89c000143096b62d4e9e4ca885aef2f7023d18affdaf8b7b548981487540a1c6e954e32108435b55fa385b0f76481a609b9149ccb4b02b2ca47fe8e4da5", .msg = "313233343030", .sig = "304502206b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296022100cccccccc00000000cccccccccccccccc971f2ef152794b9d8fc7d568c9e8eaa7", .result = .valid }, - .{ .key = "043d0bc7ed8f09d2cb7ddb46ebc1ed799ab1563a9ab84bf524587a220afe499c12e22dc3b3c103824a4f378d96adb0a408abf19ce7d68aa6244f78cb216fa3f8df", .msg = "313233343030", .sig = "304402206b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29602203333333300000000333333333333333325c7cbbc549e52e763f1f55a327a3aaa", .result = .valid }, - .{ .key = "04a6c885ade1a4c566f9bb010d066974abb281797fa701288c721bcbd23663a9b72e424b690957168d193a6096fc77a2b004a9c7d467e007e1f2058458f98af316", .msg = "313233343030", .sig = "304402206b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296022049249248db6db6dbb6db6db6db6db6db5a8b230d0b2b51dcd7ebf0c9fef7c185", .result = .valid }, - .{ .key = "048d3c2c2c3b765ba8289e6ac3812572a25bf75df62d87ab7330c3bdbad9ebfa5c4c6845442d66935b238578d43aec54f7caa1621d1af241d4632e0b780c423f5d", .msg = "313233343030", .sig = "304402206b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296022016a4502e2781e11ac82cbc9d1edd8c981584d13e18411e2f6e0478c34416e3bb", .result = .valid }, - .{ .key = "046b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2964fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5", .msg = "313233343030", .sig = "3045022100bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca6050230220249249246db6db6ddb6db6db6db6db6dad4591868595a8ee6bf5f864ff7be0c2", .result = .invalid }, - .{ .key = "046b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2964fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5", .msg = "313233343030", .sig = "3044022044a5ad0ad0636d9f12bc9e0a6bdd5e1cbcb012ea7bf091fcec15b0c43202d52e0220249249246db6db6ddb6db6db6db6db6dad4591868595a8ee6bf5f864ff7be0c2", .result = .invalid }, - .{ .key = "046b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296b01cbd1c01e58065711814b583f061e9d431cca994cea1313449bf97c840ae0a", .msg = "313233343030", .sig = "3045022100bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca6050230220249249246db6db6ddb6db6db6db6db6dad4591868595a8ee6bf5f864ff7be0c2", .result = .invalid }, - .{ .key = "046b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296b01cbd1c01e58065711814b583f061e9d431cca994cea1313449bf97c840ae0a", .msg = "313233343030", .sig = "3044022044a5ad0ad0636d9f12bc9e0a6bdd5e1cbcb012ea7bf091fcec15b0c43202d52e0220249249246db6db6ddb6db6db6db6db6dad4591868595a8ee6bf5f864ff7be0c2", .result = .invalid }, - .{ .key = "0404aaec73635726f213fb8a9e64da3b8632e41495a944d0045b522eba7240fad587d9315798aaa3a5ba01775787ced05eaaf7b4e09fc81d6d1aa546e8365d525d", .msg = "", .sig = "3045022100b292a619339f6e567a305c951c0dcbcc42d16e47f219f9e98e76e09d8770b34a02200177e60492c5a8242f76f07bfe3661bde59ec2a17ce5bd2dab2abebdf89a62e2", .result = .valid }, - .{ .key = "0404aaec73635726f213fb8a9e64da3b8632e41495a944d0045b522eba7240fad587d9315798aaa3a5ba01775787ced05eaaf7b4e09fc81d6d1aa546e8365d525d", .msg = "4d7367", .sig = "30450220530bd6b0c9af2d69ba897f6b5fb59695cfbf33afe66dbadcf5b8d2a2a6538e23022100d85e489cb7a161fd55ededcedbf4cc0c0987e3e3f0f242cae934c72caa3f43e9", .result = .valid }, - .{ .key = "0404aaec73635726f213fb8a9e64da3b8632e41495a944d0045b522eba7240fad587d9315798aaa3a5ba01775787ced05eaaf7b4e09fc81d6d1aa546e8365d525d", .msg = "313233343030", .sig = "3046022100a8ea150cb80125d7381c4c1f1da8e9de2711f9917060406a73d7904519e51388022100f3ab9fa68bd47973a73b2d40480c2ba50c22c9d76ec217257288293285449b86", .result = .valid }, - .{ .key = "0404aaec73635726f213fb8a9e64da3b8632e41495a944d0045b522eba7240fad587d9315798aaa3a5ba01775787ced05eaaf7b4e09fc81d6d1aa546e8365d525d", .msg = "0000000000000000000000000000000000000000", .sig = "3045022100986e65933ef2ed4ee5aada139f52b70539aaf63f00a91f29c69178490d57fb7102203dafedfb8da6189d372308cbf1489bbbdabf0c0217d1c0ff0f701aaa7a694b9c", .result = .valid }, - .{ .key = "044f337ccfd67726a805e4f1600ae2849df3807eca117380239fbd816900000000ed9dea124cc8c396416411e988c30f427eb504af43a3146cd5df7ea60666d685", .msg = "4d657373616765", .sig = "3046022100d434e262a49eab7781e353a3565e482550dd0fd5defa013c7f29745eff3569f10221009b0c0a93f267fb6052fd8077be769c2b98953195d7bc10de844218305c6ba17a", .result = .valid }, - .{ .key = "044f337ccfd67726a805e4f1600ae2849df3807eca117380239fbd816900000000ed9dea124cc8c396416411e988c30f427eb504af43a3146cd5df7ea60666d685", .msg = "4d657373616765", .sig = "304402200fe774355c04d060f76d79fd7a772e421463489221bf0a33add0be9b1979110b0220500dcba1c69a8fbd43fa4f57f743ce124ca8b91a1f325f3fac6181175df55737", .result = .valid }, - .{ .key = "044f337ccfd67726a805e4f1600ae2849df3807eca117380239fbd816900000000ed9dea124cc8c396416411e988c30f427eb504af43a3146cd5df7ea60666d685", .msg = "4d657373616765", .sig = "3045022100bb40bf217bed3fb3950c7d39f03d36dc8e3b2cd79693f125bfd06595ee1135e30220541bf3532351ebb032710bdb6a1bf1bfc89a1e291ac692b3fa4780745bb55677", .result = .valid }, - .{ .key = "043cf03d614d8939cfd499a07873fac281618f06b8ff87e8015c3f49726500493584fa174d791c72bf2ce3880a8960dd2a7c7a1338a82f85a9e59cdbde80000000", .msg = "4d657373616765", .sig = "30440220664eb7ee6db84a34df3c86ea31389a5405badd5ca99231ff556d3e75a233e73a022059f3c752e52eca46137642490a51560ce0badc678754b8f72e51a2901426a1bd", .result = .valid }, - .{ .key = "043cf03d614d8939cfd499a07873fac281618f06b8ff87e8015c3f49726500493584fa174d791c72bf2ce3880a8960dd2a7c7a1338a82f85a9e59cdbde80000000", .msg = "4d657373616765", .sig = "304502204cd0429bbabd2827009d6fcd843d4ce39c3e42e2d1631fd001985a79d1fd8b430221009638bf12dd682f60be7ef1d0e0d98f08b7bca77a1a2b869ae466189d2acdabe3", .result = .valid }, - .{ .key = "043cf03d614d8939cfd499a07873fac281618f06b8ff87e8015c3f49726500493584fa174d791c72bf2ce3880a8960dd2a7c7a1338a82f85a9e59cdbde80000000", .msg = "4d657373616765", .sig = "3046022100e56c6ea2d1b017091c44d8b6cb62b9f460e3ce9aed5e5fd41e8added97c56c04022100a308ec31f281e955be20b457e463440b4fcf2b80258078207fc1378180f89b55", .result = .valid }, - .{ .key = "043cf03d614d8939cfd499a07873fac281618f06b8ff87e8015c3f4972650049357b05e8b186e38d41d31c77f5769f22d58385ecc857d07a561a6324217fffffff", .msg = "4d657373616765", .sig = "304402201158a08d291500b4cabed3346d891eee57c176356a2624fb011f8fbbf34668300220228a8c486a736006e082325b85290c5bc91f378b75d487dda46798c18f285519", .result = .valid }, - .{ .key = "043cf03d614d8939cfd499a07873fac281618f06b8ff87e8015c3f4972650049357b05e8b186e38d41d31c77f5769f22d58385ecc857d07a561a6324217fffffff", .msg = "4d657373616765", .sig = "3045022100b1db9289649f59410ea36b0c0fc8d6aa2687b29176939dd23e0dde56d309fa9d02203e1535e4280559015b0dbd987366dcf43a6d1af5c23c7d584e1c3f48a1251336", .result = .valid }, - .{ .key = "043cf03d614d8939cfd499a07873fac281618f06b8ff87e8015c3f4972650049357b05e8b186e38d41d31c77f5769f22d58385ecc857d07a561a6324217fffffff", .msg = "4d657373616765", .sig = "3046022100b7b16e762286cb96446aa8d4e6e7578b0a341a79f2dd1a220ac6f0ca4e24ed86022100ddc60a700a139b04661c547d07bbb0721780146df799ccf55e55234ecb8f12bc", .result = .valid }, - .{ .key = "042829c31faa2e400e344ed94bca3fcd0545956ebcfe8ad0f6dfa5ff8effffffffa01aafaf000e52585855afa7676ade284113099052df57e7eb3bd37ebeb9222e", .msg = "4d657373616765", .sig = "3045022100d82a7c2717261187c8e00d8df963ff35d796edad36bc6e6bd1c91c670d9105b402203dcabddaf8fcaa61f4603e7cbac0f3c0351ecd5988efb23f680d07debd139929", .result = .valid }, - .{ .key = "042829c31faa2e400e344ed94bca3fcd0545956ebcfe8ad0f6dfa5ff8effffffffa01aafaf000e52585855afa7676ade284113099052df57e7eb3bd37ebeb9222e", .msg = "4d657373616765", .sig = "304402205eb9c8845de68eb13d5befe719f462d77787802baff30ce96a5cba063254af7802202c026ae9be2e2a5e7ca0ff9bbd92fb6e44972186228ee9a62b87ddbe2ef66fb5", .result = .valid }, - .{ .key = "042829c31faa2e400e344ed94bca3fcd0545956ebcfe8ad0f6dfa5ff8effffffffa01aafaf000e52585855afa7676ade284113099052df57e7eb3bd37ebeb9222e", .msg = "4d657373616765", .sig = "304602210096843dd03c22abd2f3b782b170239f90f277921becc117d0404a8e4e36230c28022100f2be378f526f74a543f67165976de9ed9a31214eb4d7e6db19e1ede123dd991d", .result = .valid }, - .{ .key = "04fffffff948081e6a0458dd8f9e738f2665ff9059ad6aac0708318c4ca9a7a4f55a8abcba2dda8474311ee54149b973cae0c0fb89557ad0bf78e6529a1663bd73", .msg = "4d657373616765", .sig = "30440220766456dce1857c906f9996af729339464d27e9d98edc2d0e3b760297067421f60220402385ecadae0d8081dccaf5d19037ec4e55376eced699e93646bfbbf19d0b41", .result = .valid }, - .{ .key = "04fffffff948081e6a0458dd8f9e738f2665ff9059ad6aac0708318c4ca9a7a4f55a8abcba2dda8474311ee54149b973cae0c0fb89557ad0bf78e6529a1663bd73", .msg = "4d657373616765", .sig = "3046022100c605c4b2edeab20419e6518a11b2dbc2b97ed8b07cced0b19c34f777de7b9fd9022100edf0f612c5f46e03c719647bc8af1b29b2cde2eda700fb1cff5e159d47326dba", .result = .valid }, - .{ .key = "04fffffff948081e6a0458dd8f9e738f2665ff9059ad6aac0708318c4ca9a7a4f55a8abcba2dda8474311ee54149b973cae0c0fb89557ad0bf78e6529a1663bd73", .msg = "4d657373616765", .sig = "3046022100d48b68e6cabfe03cf6141c9ac54141f210e64485d9929ad7b732bfe3b7eb8a84022100feedae50c61bd00e19dc26f9b7e2265e4508c389109ad2f208f0772315b6c941", .result = .valid }, - .{ .key = "0400000003fa15f963949d5f03a6f5c7f86f9e0015eeb23aebbff1173937ba748e1099872070e8e87c555fa13659cca5d7fadcfcb0023ea889548ca48af2ba7e71", .msg = "4d657373616765", .sig = "3046022100b7c81457d4aeb6aa65957098569f0479710ad7f6595d5874c35a93d12a5dd4c7022100b7961a0b652878c2d568069a432ca18a1a9199f2ca574dad4b9e3a05c0a1cdb3", .result = .valid }, - .{ .key = "0400000003fa15f963949d5f03a6f5c7f86f9e0015eeb23aebbff1173937ba748e1099872070e8e87c555fa13659cca5d7fadcfcb0023ea889548ca48af2ba7e71", .msg = "4d657373616765", .sig = "304402206b01332ddb6edfa9a30a1321d5858e1ee3cf97e263e669f8de5e9652e76ff3f702205939545fced457309a6a04ace2bd0f70139c8f7d86b02cb1cc58f9e69e96cd5a", .result = .valid }, - .{ .key = "0400000003fa15f963949d5f03a6f5c7f86f9e0015eeb23aebbff1173937ba748e1099872070e8e87c555fa13659cca5d7fadcfcb0023ea889548ca48af2ba7e71", .msg = "4d657373616765", .sig = "3046022100efdb884720eaeadc349f9fc356b6c0344101cd2fd8436b7d0e6a4fb93f106361022100f24bee6ad5dc05f7613975473aadf3aacba9e77de7d69b6ce48cb60d8113385d", .result = .valid }, - .{ .key = "04bcbb2914c79f045eaa6ecbbc612816b3be5d2d6796707d8125e9f851c18af015000000001352bb4a0fa2ea4cceb9ab63dd684ade5a1127bcf300a698a7193bc2", .msg = "4d657373616765", .sig = "3044022031230428405560dcb88fb5a646836aea9b23a23dd973dcbe8014c87b8b20eb0702200f9344d6e812ce166646747694a41b0aaf97374e19f3c5fb8bd7ae3d9bd0beff", .result = .valid }, - .{ .key = "04bcbb2914c79f045eaa6ecbbc612816b3be5d2d6796707d8125e9f851c18af015000000001352bb4a0fa2ea4cceb9ab63dd684ade5a1127bcf300a698a7193bc2", .msg = "4d657373616765", .sig = "3046022100caa797da65b320ab0d5c470cda0b36b294359c7db9841d679174db34c4855743022100cf543a62f23e212745391aaf7505f345123d2685ee3b941d3de6d9b36242e5a0", .result = .valid }, - .{ .key = "04bcbb2914c79f045eaa6ecbbc612816b3be5d2d6796707d8125e9f851c18af015000000001352bb4a0fa2ea4cceb9ab63dd684ade5a1127bcf300a698a7193bc2", .msg = "4d657373616765", .sig = "304502207e5f0ab5d900d3d3d7867657e5d6d36519bc54084536e7d21c336ed8001859450221009450c07f201faec94b82dfb322e5ac676688294aad35aa72e727ff0b19b646aa", .result = .valid }, - .{ .key = "04bcbb2914c79f045eaa6ecbbc612816b3be5d2d6796707d8125e9f851c18af015fffffffeecad44b6f05d15b33146549c2297b522a5eed8430cff596758e6c43d", .msg = "4d657373616765", .sig = "3046022100d7d70c581ae9e3f66dc6a480bf037ae23f8a1e4a2136fe4b03aa69f0ca25b35602210089c460f8a5a5c2bbba962c8a3ee833a413e85658e62a59e2af41d9127cc47224", .result = .valid }, - .{ .key = "04bcbb2914c79f045eaa6ecbbc612816b3be5d2d6796707d8125e9f851c18af015fffffffeecad44b6f05d15b33146549c2297b522a5eed8430cff596758e6c43d", .msg = "4d657373616765", .sig = "30440220341c1b9ff3c83dd5e0dfa0bf68bcdf4bb7aa20c625975e5eeee34bb396266b34022072b69f061b750fd5121b22b11366fad549c634e77765a017902a67099e0a4469", .result = .valid }, - .{ .key = "04bcbb2914c79f045eaa6ecbbc612816b3be5d2d6796707d8125e9f851c18af015fffffffeecad44b6f05d15b33146549c2297b522a5eed8430cff596758e6c43d", .msg = "4d657373616765", .sig = "3045022070bebe684cdcb5ca72a42f0d873879359bd1781a591809947628d313a3814f67022100aec03aca8f5587a4d535fa31027bbe9cc0e464b1c3577f4c2dcde6b2094798a9", .result = .valid }, - }; - for (vectors) |vector| { - if (tvTry(vector)) { - try std.testing.expect(vector.result == .valid or vector.result == .acceptable); - } else |_| { - try std.testing.expectEqual(vector.result, .invalid); + for (wycheproof.test_groups) |g| { + var key_sec1_: [EcdsaP256Sha256.PublicKey.uncompressed_sec1_encoded_length]u8 = undefined; + const key_sec1 = try fmt.hexToBytes(&key_sec1_, g.key); + const pk = try EcdsaP256Sha256.PublicKey.fromSec1(key_sec1); + + for (g.tests) |t| { + if (tryWycheproof(pk, t)) { + try std.testing.expect(t.result == .valid or t.result == .acceptable); + } else |_| { + try std.testing.expectEqual(t.result, .invalid); + } } } } -fn tvTry(vector: TestVector) !void { - const Scheme = EcdsaP256Sha256; - var key_sec1_: [Scheme.PublicKey.uncompressed_sec1_encoded_length]u8 = undefined; - const key_sec1 = try fmt.hexToBytes(&key_sec1_, vector.key); - const pk = try Scheme.PublicKey.fromSec1(key_sec1); +fn tryWycheproof(pk: EcdsaP256Sha256.PublicKey, vector: wycheproof.Test) !void { var msg_: [20]u8 = undefined; const msg = try fmt.hexToBytes(&msg_, vector.msg); var sig_der_: [152]u8 = undefined; const sig_der = try fmt.hexToBytes(&sig_der_, vector.sig); - const sig = try Scheme.Signature.fromDer(sig_der); + const sig = try EcdsaP256Sha256.Signature.fromDer(sig_der); try sig.verify(msg, pk); } diff --git a/lib/std/crypto/ff.zig b/lib/std/crypto/ff.zig index 31792318d05e..3c4d4db7a6eb 100644 --- a/lib/std/crypto/ff.zig +++ b/lib/std/crypto/ff.zig @@ -404,6 +404,11 @@ pub fn Modulus(comptime max_bits: comptime_int) type { return self.limbs_count() * t_bits - self.leading; } + /// Actual size of the modulus, in bytes. + pub fn byteLen(self: Self) usize { + return std.math.divCeil(usize, self.bits(), 8) catch unreachable; + } + /// Returns the element `1`. pub fn one(self: Self) Fe { var fe = self.zero; diff --git a/lib/std/crypto/oid.zig b/lib/std/crypto/oid.zig new file mode 100644 index 000000000000..fd360c3ff1ff --- /dev/null +++ b/lib/std/crypto/oid.zig @@ -0,0 +1,132 @@ +//! Developed by ITU-U and ISO/IEC for naming objects. Used in DER. +//! +//! This implementation supports any number of `u32` arcs. + +const Arc = u32; +const encoding_base = 128; + +/// Returns encoded length. +pub fn encodeLen(dot_notation: []const u8) !usize { + var split = std.mem.splitScalar(u8, dot_notation, '.'); + if (split.next() == null) return 0; + if (split.next() == null) return 1; + + var res: usize = 1; + while (split.next()) |s| { + const parsed = try std.fmt.parseUnsigned(Arc, s, 10); + const n_bytes = if (parsed == 0) 0 else std.math.log(Arc, encoding_base, parsed); + + res += n_bytes; + res += 1; + } + + return res; +} + +pub const EncodeError = std.fmt.ParseIntError || error{ + MissingPrefix, + BufferTooSmall, +}; + +pub fn encode(dot_notation: []const u8, buf: []u8) EncodeError![]const u8 { + if (buf.len < try encodeLen(dot_notation)) return error.BufferTooSmall; + + var split = std.mem.splitScalar(u8, dot_notation, '.'); + const first_str = split.next() orelse return error.MissingPrefix; + const second_str = split.next() orelse return error.MissingPrefix; + + const first = try std.fmt.parseInt(u8, first_str, 10); + const second = try std.fmt.parseInt(u8, second_str, 10); + + buf[0] = first * 40 + second; + + var i: usize = 1; + while (split.next()) |s| { + var parsed = try std.fmt.parseUnsigned(Arc, s, 10); + const n_bytes = if (parsed == 0) 0 else std.math.log(Arc, encoding_base, parsed); + + for (0..n_bytes) |j| { + const place = std.math.pow(Arc, encoding_base, n_bytes - @as(Arc, @intCast(j))); + const digit: u8 = @intCast(@divFloor(parsed, place)); + + buf[i] = digit | 0x80; + parsed -= digit * place; + + i += 1; + } + buf[i] = @intCast(parsed); + i += 1; + } + + return buf[0..i]; +} + +pub fn decode(encoded: []const u8, writer: anytype) @TypeOf(writer).Error!void { + const first = @divTrunc(encoded[0], 40); + const second = encoded[0] - first * 40; + try writer.print("{d}.{d}", .{ first, second }); + + var i: usize = 1; + while (i != encoded.len) { + const n_bytes: usize = brk: { + var res: usize = 1; + var j: usize = i; + while (encoded[j] & 0x80 != 0) { + res += 1; + j += 1; + } + break :brk res; + }; + + var n: usize = 0; + for (0..n_bytes) |j| { + const place = std.math.pow(usize, encoding_base, n_bytes - j - 1); + n += place * (encoded[i] & 0b01111111); + i += 1; + } + try writer.print(".{d}", .{n}); + } +} + +pub fn encodeComptime(comptime dot_notation: []const u8) [encodeLen(dot_notation) catch unreachable]u8 { + @setEvalBranchQuota(10_000); + var buf: [encodeLen(dot_notation) catch unreachable]u8 = undefined; + _ = encode(dot_notation, &buf) catch unreachable; + return buf; +} + +const std = @import("std"); + +fn testOid(expected_encoded: []const u8, expected_dot_notation: []const u8) !void { + var buf: [256]u8 = undefined; + const encoded = try encode(expected_dot_notation, &buf); + try std.testing.expectEqualSlices(u8, expected_encoded, encoded); + + var stream = std.io.fixedBufferStream(&buf); + try decode(expected_encoded, stream.writer()); + try std.testing.expectEqualStrings(expected_dot_notation, stream.getWritten()); +} + +test "encode and decode" { + // https://learn.microsoft.com/en-us/windows/win32/seccertenroll/about-object-identifier + try testOid( + &[_]u8{ 0x2b, 0x06, 0x01, 0x04, 0x01, 0x82, 0x37, 0x15, 0x14 }, + "1.3.6.1.4.1.311.21.20", + ); + // https://luca.ntop.org/Teaching/Appunti/asn1.html + try testOid(&[_]u8{ 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d }, "1.2.840.113549"); + // https://www.sysadmins.lv/blog-en/how-to-encode-object-identifier-to-an-asn1-der-encoded-string.aspx + try testOid(&[_]u8{ 0x2a, 0x86, 0x8d, 0x20 }, "1.2.100000"); + try testOid( + &[_]u8{ 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b }, + "1.2.840.113549.1.1.11", + ); + try testOid(&[_]u8{ 0x2b, 0x65, 0x70 }, "1.3.101.112"); +} + +test encodeComptime { + try std.testing.expectEqual( + [_]u8{ 0x2b, 0x06, 0x01, 0x04, 0x01, 0x82, 0x37, 0x15, 0x14 }, + encodeComptime("1.3.6.1.4.1.311.21.20"), + ); +} diff --git a/lib/std/crypto/rsa.zig b/lib/std/crypto/rsa.zig new file mode 100644 index 000000000000..bfaa213d8488 --- /dev/null +++ b/lib/std/crypto/rsa.zig @@ -0,0 +1,873 @@ +//! RFC8017: Public Key Cryptography Standards #1 v2.2 (PKCS1) +const std = @import("../std.zig"); +const der = @import("der.zig"); +const ff = std.crypto.ff; + +pub const max_modulus_bits = 4096; +const max_modulus_len = max_modulus_bits / 8; + +const Modulus = std.crypto.ff.Modulus(max_modulus_bits); +const Fe = Modulus.Fe; + +pub const ValueError = error{ + Modulus, + Exponent, +}; + +pub const PublicKey = struct { + /// `n` + modulus: Modulus, + /// `e` + public_exponent: Fe, + + pub const FromBytesError = ValueError || ff.OverflowError || ff.FieldElementError || ff.InvalidModulusError || error{InsecureBitCount}; + + pub fn fromBytes(mod: []const u8, exp: []const u8) FromBytesError!PublicKey { + const modulus = try Modulus.fromBytes(mod, .big); + if (modulus.bits() <= 512) return error.InsecureBitCount; + const public_exponent = try Fe.fromBytes(modulus, exp, .big); + + if (std.debug.runtime_safety) { + // > the RSA public exponent e is an integer between 3 and n - 1 satisfying + // > GCD(e,\lambda(n)) = 1, where \lambda(n) = LCM(r_1 - 1, ..., r_u - 1) + const e_v = public_exponent.toPrimitive(u32) catch return error.Exponent; + if (!public_exponent.isOdd()) return error.Exponent; + if (e_v < 3) return error.Exponent; + if (modulus.v.compare(public_exponent.v) == .lt) return error.Exponent; + } + + return .{ .modulus = modulus, .public_exponent = public_exponent }; + } + + pub fn fromDer(bytes: []const u8) (der.Parser.Error || FromBytesError)!PublicKey { + var parser = der.Parser{ .bytes = bytes }; + + const seq = try parser.expectSequence(); + defer parser.seek(seq.slice.end); + + const modulus = try parser.expectPrimitive(.integer); + const pub_exp = try parser.expectPrimitive(.integer); + + try parser.expectEnd(seq.slice.end); + try parser.expectEnd(bytes.len); + + return try fromBytes(parser.view(modulus), parser.view(pub_exp)); + } + + /// Deprecated. + /// + /// Encrypt a short message using RSAES-PKCS1-v1_5. + /// The use of this scheme for encrypting an arbitrary message, as opposed to a + /// randomly generated key, is NOT RECOMMENDED. + pub fn encryptPkcsv1_5(pk: PublicKey, msg: []const u8, out: []u8) ![]const u8 { + // align variable names with spec + const k = pk.modulus.byteLen(); + if (out.len < k) return error.BufferTooSmall; + if (msg.len > k - 11) return error.MessageTooLong; + + // EM = 0x00 || 0x02 || PS || 0x00 || M. + var em = out[0..k]; + em[0] = 0; + em[1] = 2; + + const ps = em[2..][0 .. k - msg.len - 3]; + std.crypto.random.bytes(ps); + + em[em.len - msg.len - 1] = 0; + @memcpy(em[em.len - msg.len ..][0..msg.len], msg); + + const m = try Fe.fromBytes(pk.modulus, em, .big); + const e = try pk.modulus.powPublic(m, pk.public_exponent); + try e.toBytes(em, .big); + return em; + } + + /// Encrypt a short message using Optimal Asymmetric Encryption Padding (RSAES-OAEP). + pub fn encryptOaep( + pk: PublicKey, + comptime Hash: type, + msg: []const u8, + label: []const u8, + out: []u8, + ) ![]const u8 { + // align variable names with spec + const k = pk.modulus.byteLen(); + if (out.len < k) return error.BufferTooSmall; + + if (msg.len > k - 2 * Hash.digest_length - 2) return error.MessageTooLong; + + // EM = 0x00 || maskedSeed || maskedDB. + var em = out[0..k]; + em[0] = 0; + const seed = em[1..][0..Hash.digest_length]; + std.crypto.random.bytes(seed); + + // DB = lHash || PS || 0x01 || M. + var db = em[1 + seed.len ..]; + const lHash = labelHash(Hash, label); + @memcpy(db[0..lHash.len], &lHash); + @memset(db[lHash.len .. db.len - msg.len - 2], 0); + db[db.len - msg.len - 1] = 1; + @memcpy(db[db.len - msg.len ..], msg); + + var mgf_buf: [max_modulus_len]u8 = undefined; + + const db_mask = mgf1(Hash, seed, mgf_buf[0..db.len]); + for (db, db_mask) |*v, m| v.* ^= m; + + const seed_mask = mgf1(Hash, db, mgf_buf[0..seed.len]); + for (seed, seed_mask) |*v, m| v.* ^= m; + + const m = try Fe.fromBytes(pk.modulus, em, .big); + const e = try pk.modulus.powPublic(m, pk.public_exponent); + try e.toBytes(em, .big); + return em; + } +}; + +pub const SecretKey = struct { + /// `d` + private_exponent: Fe, + + pub const FromBytesError = ValueError || ff.OverflowError || ff.FieldElementError; + + pub fn fromBytes(n: Modulus, exp: []const u8) FromBytesError!SecretKey { + const d = try Fe.fromBytes(n, exp, .big); + if (std.debug.runtime_safety) { + // > The RSA private exponent d is a positive integer less than n + // > satisfying e * d == 1 (mod \lambda(n)), + if (!d.isOdd()) return error.Exponent; + if (d.v.compare(n.v) != .lt) return error.Exponent; + } + + return .{ .private_exponent = d }; + } +}; + +pub const KeyPair = struct { + public: PublicKey, + secret: SecretKey, + + pub const FromDerError = PublicKey.FromBytesError || SecretKey.FromBytesError || der.Parser.Error || error{ KeyMismatch, InvalidVersion }; + + pub fn fromDer(bytes: []const u8) FromDerError!KeyPair { + var parser = der.Parser{ .bytes = bytes }; + const seq = try parser.expectSequence(); + const version = try parser.expectInt(u8); + + const mod = try parser.expectPrimitive(.integer); + const pub_exp = try parser.expectPrimitive(.integer); + const sec_exp = try parser.expectPrimitive(.integer); + + const public = try PublicKey.fromBytes(parser.view(mod), parser.view(pub_exp)); + const secret = try SecretKey.fromBytes(public.modulus, parser.view(sec_exp)); + + const prime1 = try parser.expectPrimitive(.integer); + const prime2 = try parser.expectPrimitive(.integer); + const exp1 = try parser.expectPrimitive(.integer); + const exp2 = try parser.expectPrimitive(.integer); + const coeff = try parser.expectPrimitive(.integer); + _ = .{ exp1, exp2, coeff }; + + switch (version) { + 0 => {}, + 1 => { + _ = try parser.expectSequenceOf(); + while (!parser.eof()) { + _ = try parser.expectSequence(); + const ri = try parser.expectPrimitive(.integer); + const di = try parser.expectPrimitive(.integer); + const ti = try parser.expectPrimitive(.integer); + _ = .{ ri, di, ti }; + } + }, + else => return error.InvalidVersion, + } + + try parser.expectEnd(seq.slice.end); + try parser.expectEnd(bytes.len); + + if (std.debug.runtime_safety) { + const p = try Fe.fromBytes(public.modulus, parser.view(prime1), .big); + const q = try Fe.fromBytes(public.modulus, parser.view(prime2), .big); + + // check that n = p * q + const expected_zero = public.modulus.mul(p, q); + if (!expected_zero.isZero()) return error.KeyMismatch; + + // TODO: check that d * e is one mod p-1 and mod q-1. Note d and e were bound + // const de = secret.private_exponent.mul(public.public_exponent); + // const one = public.modulus.one(); + + // if (public.modulus.mul(de, p).compare(one) != .eq) return error.KeyMismatch; + // if (public.modulus.mul(de, q).compare(one) != .eq) return error.KeyMismatch; + } + + return .{ .public = public, .secret = secret }; + } + + /// Deprecated. + pub fn signPkcsv1_5(kp: KeyPair, comptime Hash: type, msg: []const u8, out: []u8) !PKCS1v1_5(Hash).Signature { + var st = try signerPkcsv1_5(kp, Hash); + st.update(msg); + return try st.finalize(out); + } + + /// Deprecated. + pub fn signerPkcsv1_5(kp: KeyPair, comptime Hash: type) !PKCS1v1_5(Hash).Signer { + return PKCS1v1_5(Hash).Signer.init(kp); + } + + /// Deprecated. + pub fn decryptPkcsv1_5(kp: KeyPair, ciphertext: []const u8, out: []u8) ![]const u8 { + const k = kp.public.modulus.byteLen(); + if (out.len < k) return error.BufferTooSmall; + + const em = out[0..k]; + + const m = try Fe.fromBytes(kp.public.modulus, ciphertext, .big); + const e = try kp.public.modulus.pow(m, kp.secret.private_exponent); + try e.toBytes(em, .big); + + // Care shall be taken to ensure that an opponent cannot + // distinguish these error conditions, whether by error + // message or timing. + const msg_start = ct.lastIndexOfScalar(em, 0) orelse em.len; + const ps_len = em.len - msg_start; + if (ct.@"or"(em[0] != 0, ct.@"or"(em[1] != 2, ps_len < 8))) { + return error.Inconsistent; + } + + return em[msg_start + 1 ..]; + } + + pub fn signOaep( + kp: KeyPair, + comptime Hash: type, + msg: []const u8, + salt: ?[]const u8, + out: []u8, + ) !Pss(Hash).Signature { + var st = try signerOaep(kp, Hash, salt); + st.update(msg); + return try st.finalize(out); + } + + /// Salt must outlive returned `PSS.Signer`. + pub fn signerOaep(kp: KeyPair, comptime Hash: type, salt: ?[]const u8) !Pss(Hash).Signer { + return Pss(Hash).Signer.init(kp, salt); + } + + pub fn decryptOaep( + kp: KeyPair, + comptime Hash: type, + ciphertext: []const u8, + label: []const u8, + out: []u8, + ) ![]u8 { + // align variable names with spec + const k = kp.public.modulus.byteLen(); + if (out.len < k) return error.BufferTooSmall; + + const mod = try Fe.fromBytes(kp.public.modulus, ciphertext, .big); + const exp = kp.public.modulus.pow(mod, kp.secret.private_exponent) catch unreachable; + const em = out[0..k]; + try exp.toBytes(em, .big); + + const y = em[0]; + const seed = em[1..][0..Hash.digest_length]; + const db = em[1 + Hash.digest_length ..]; + + var mgf_buf: [max_modulus_len]u8 = undefined; + + const seed_mask = mgf1(Hash, db, mgf_buf[0..seed.len]); + for (seed, seed_mask) |*v, m| v.* ^= m; + + const db_mask = mgf1(Hash, seed, mgf_buf[0..db.len]); + for (db, db_mask) |*v, m| v.* ^= m; + + const expected_hash = labelHash(Hash, label); + const actual_hash = db[0..expected_hash.len]; + + // Care shall be taken to ensure that an opponent cannot + // distinguish these error conditions, whether by error + // message or timing. + const msg_start = ct.indexOfScalarPos(em, expected_hash.len + 1, 1) orelse 0; + if (ct.@"or"(y != 0, ct.@"or"(msg_start == 0, !ct.memEql(&expected_hash, actual_hash)))) { + return error.Inconsistent; + } + + return em[msg_start + 1 ..]; + } + + /// Encrypt short plaintext with secret key. + pub fn encrypt(kp: KeyPair, plaintext: []const u8, out: []u8) !void { + const n = kp.public.modulus; + const k = n.byteLen(); + if (plaintext.len > k) return error.MessageTooLong; + + const msg_as_int = try Fe.fromBytes(n, plaintext, .big); + const enc_as_int = try n.pow(msg_as_int, kp.secret.private_exponent); + try enc_as_int.toBytes(out, .big); + } +}; + +/// Deprecated. +/// +/// Signature Scheme with Appendix v1.5 (RSASSA-PKCS1-v1_5) +/// +/// This standard has been superceded by PSS which is formally proven secure +/// and has fewer footguns. +pub fn PKCS1v1_5(comptime Hash: type) type { + return struct { + const PkcsT = @This(); + pub const Signature = struct { + bytes: []const u8, + + const Self = @This(); + + pub fn verifier(self: Self, public_key: PublicKey) !Verifier { + return Verifier.init(self, public_key); + } + + pub fn verify(self: Self, msg: []const u8, public_key: PublicKey) !void { + var st = Verifier.init(self, public_key); + st.update(msg); + return st.verify(); + } + }; + + pub const Signer = struct { + h: Hash, + key_pair: KeyPair, + + fn init(key_pair: KeyPair) Signer { + return .{ + .h = Hash.init(.{}), + .key_pair = key_pair, + }; + } + + pub fn update(self: *Signer, data: []const u8) void { + self.h.update(data); + } + + pub fn finalize(self: *Signer, out: []u8) !PkcsT.Signature { + const k = self.key_pair.public.modulus.byteLen(); + if (out.len < k) return error.BufferTooSmall; + + var hash: [Hash.digest_length]u8 = undefined; + self.h.final(&hash); + + const em = try emsaEncode(hash, out[0..k]); + try self.key_pair.encrypt(em, em); + return .{ .bytes = em }; + } + }; + + pub const Verifier = struct { + h: Hash, + sig: PkcsT.Signature, + public_key: PublicKey, + + fn init(sig: PkcsT.Signature, public_key: PublicKey) Verifier { + return Verifier{ + .h = Hash.init(.{}), + .sig = sig, + .public_key = public_key, + }; + } + + pub fn update(self: *Verifier, data: []const u8) void { + self.h.update(data); + } + + pub fn verify(self: *Verifier) !void { + const pk = self.public_key; + const s = try Fe.fromBytes(pk.modulus, self.sig.bytes, .big); + const emm = try pk.modulus.powPublic(s, pk.public_exponent); + + var em_buf: [max_modulus_len]u8 = undefined; + const em = em_buf[0..pk.modulus.byteLen()]; + try emm.toBytes(em, .big); + + var hash: [Hash.digest_length]u8 = undefined; + self.h.final(&hash); + + // TODO: compare hash values instead of emsa values + const expected = try emsaEncode(hash, em); + + if (!std.mem.eql(u8, expected, em)) return error.Inconsistent; + } + }; + + /// PKCS Encrypted Message Signature Appendix + fn emsaEncode(hash: [Hash.digest_length]u8, out: []u8) ![]u8 { + const digest_header = comptime digestHeader(); + const tLen = digest_header.len + Hash.digest_length; + const emLen = out.len; + if (emLen < tLen + 11) return error.ModulusTooShort; + if (out.len < emLen) return error.BufferTooSmall; + + var res = out[0..emLen]; + res[0] = 0; + res[1] = 1; + const padding_len = emLen - tLen - 3; + @memset(res[2..][0..padding_len], 0xff); + res[2 + padding_len] = 0; + @memcpy(res[2 + padding_len + 1 ..][0..digest_header.len], digest_header); + @memcpy(res[res.len - hash.len ..], &hash); + + return res; + } + + /// DER encoded header. Sequence of digest algo + digest. + /// TODO: use a DER encoder instead + fn digestHeader() []const u8 { + const sha2 = std.crypto.hash.sha2; + // Section 9.2 Notes 1. + return switch (Hash) { + std.crypto.hash.Sha1 => &hexToBytes( + \\30 21 30 09 06 05 2b 0e 03 02 1a 05 00 04 14 + ), + sha2.Sha224 => &hexToBytes( + \\30 2d 30 0d 06 09 60 86 48 01 65 03 04 02 04 + \\05 00 04 1c + ), + sha2.Sha256 => &hexToBytes( + \\30 31 30 0d 06 09 60 86 48 01 65 03 04 02 01 05 00 + \\04 20 + ), + sha2.Sha384 => &hexToBytes( + \\30 41 30 0d 06 09 60 86 48 01 65 03 04 02 02 05 00 + \\04 30 + ), + sha2.Sha512 => &hexToBytes( + \\30 51 30 0d 06 09 60 86 48 01 65 03 04 02 03 05 00 + \\04 40 + ), + sha2.Sha512224 => &hexToBytes( + \\30 2d 30 0d 06 09 60 86 48 01 65 03 04 02 05 + \\05 00 04 1c + ), + sha2.Sha512256 => &hexToBytes( + \\30 31 30 0d 06 09 60 86 48 01 65 03 04 02 06 + \\05 00 04 20 + ), + else => @compileError("unknown Hash " ++ @typeName(Hash)), + }; + } + }; +} + +/// Probabilistic Signature Scheme (RSASSA-PSS) +pub fn Pss(comptime Hash: type) type { + return struct { + // RFC 4055 S3.1 + pub const default_salt_len = 32; + + pub const Signature = struct { + bytes: []const u8, + + const Self = @This(); + + pub fn verifier(self: Self, public_key: PublicKey) !Verifier { + return Verifier.init(self, public_key); + } + + pub fn verify(self: Self, msg: []const u8, public_key: PublicKey, salt_len: ?usize) !void { + var st = Verifier.init(self, public_key, salt_len orelse default_salt_len); + st.update(msg); + return st.verify(); + } + }; + + const PssT = @This(); + + pub const Signer = struct { + h: Hash, + key_pair: KeyPair, + salt: ?[]const u8, + + fn init(key_pair: KeyPair, salt: ?[]const u8) Signer { + return .{ + .h = Hash.init(.{}), + .key_pair = key_pair, + .salt = salt, + }; + } + + pub fn update(self: *Signer, data: []const u8) void { + self.h.update(data); + } + + pub fn finalize(self: *Signer, out: []u8) !PssT.Signature { + var hashed: [Hash.digest_length]u8 = undefined; + self.h.final(&hashed); + + const salt = if (self.salt) |s| s else brk: { + var res: [default_salt_len]u8 = undefined; + std.crypto.random.bytes(&res); + break :brk &res; + }; + + const em_bits = self.key_pair.public.modulus.bits() - 1; + const em = try emsaEncode(hashed, salt, em_bits, out); + try self.key_pair.encrypt(em, em); + return .{ .bytes = em }; + } + }; + + pub const Verifier = struct { + h: Hash, + sig: PssT.Signature, + public_key: PublicKey, + salt_len: usize, + + fn init(sig: PssT.Signature, public_key: PublicKey, salt_len: usize) Verifier { + return Verifier{ + .h = Hash.init(.{}), + .sig = sig, + .public_key = public_key, + .salt_len = salt_len, + }; + } + + pub fn update(self: *Verifier, data: []const u8) void { + self.h.update(data); + } + + pub fn verify(self: *Verifier) !void { + const pk = self.public_key; + const s = try Fe.fromBytes(pk.modulus, self.sig.bytes, .big); + const emm = try pk.modulus.powPublic(s, pk.public_exponent); + + var em_buf: [max_modulus_len]u8 = undefined; + const em_bits = pk.modulus.bits() - 1; + const em_len = std.math.divCeil(usize, em_bits, 8) catch unreachable; + var em = em_buf[0..em_len]; + try emm.toBytes(em, .big); + + if (em.len < Hash.digest_length + self.salt_len + 2) return error.Inconsistent; + if (em[em.len - 1] != 0xbc) return error.Inconsistent; + + const db = em[0 .. em.len - Hash.digest_length - 1]; + if (@clz(db[0]) < em.len * 8 - em_bits) return error.Inconsistent; + + const expected_hash = em[db.len..][0..Hash.digest_length]; + var mgf_buf: [max_modulus_len]u8 = undefined; + const db_mask = mgf1(Hash, expected_hash, mgf_buf[0..db.len]); + for (db, db_mask) |*v, m| v.* ^= m; + + for (1..db.len - self.salt_len - 1) |i| { + if (db[i] != 0) return error.Inconsistent; + } + if (db[db.len - self.salt_len - 1] != 1) return error.Inconsistent; + const salt = db[db.len - self.salt_len ..]; + var mp_buf: [max_modulus_len]u8 = undefined; + var mp = mp_buf[0 .. 8 + Hash.digest_length + self.salt_len]; + @memset(mp[0..8], 0); + self.h.final(mp[8..][0..Hash.digest_length]); + @memcpy(mp[8 + Hash.digest_length ..][0..salt.len], salt); + + var actual_hash: [Hash.digest_length]u8 = undefined; + Hash.hash(mp, &actual_hash, .{}); + + if (!std.mem.eql(u8, expected_hash, &actual_hash)) return error.Inconsistent; + } + }; + + /// PSS Encrypted Message Signature Appendix + fn emsaEncode(msg_hash: [Hash.digest_length]u8, salt: []const u8, em_bits: usize, out: []u8) ![]u8 { + const em_len = std.math.divCeil(usize, em_bits, 8) catch unreachable; + + if (em_len < Hash.digest_length + salt.len + 2) return error.Encoding; + + // EM = maskedDB || H || 0xbc + var em = out[0..em_len]; + em[em.len - 1] = 0xbc; + + var mp_buf: [max_modulus_len]u8 = undefined; + // M' = (0x)00 00 00 00 00 00 00 00 || mHash || salt; + const mp = mp_buf[0 .. 8 + Hash.digest_length + salt.len]; + @memset(mp[0..8], 0); + @memcpy(mp[8..][0..Hash.digest_length], &msg_hash); + @memcpy(mp[8 + Hash.digest_length ..][0..salt.len], salt); + + // H = Hash(M') + const hash = em[em.len - 1 - Hash.digest_length ..][0..Hash.digest_length]; + Hash.hash(mp, hash, .{}); + + // DB = PS || 0x01 || salt + var db = em[0 .. em_len - Hash.digest_length - 1]; + @memset(db[0 .. db.len - salt.len - 1], 0); + db[db.len - salt.len - 1] = 1; + @memcpy(db[db.len - salt.len ..], salt); + + var mgf_buf: [max_modulus_len]u8 = undefined; + const db_mask = mgf1(Hash, hash, mgf_buf[0..db.len]); + for (db, db_mask) |*v, m| v.* ^= m; + + // Set the leftmost 8emLen - emBits bits of the leftmost octet + // in maskedDB to zero. + const shift = std.math.comptimeMod(8 * em_len - em_bits, 8); + const mask = @as(u8, 0xff) >> shift; + db[0] &= mask; + + return em; + } + }; +} + +/// Mask generation function. Currently the only one defined. +fn mgf1(comptime Hash: type, seed: []const u8, out: []u8) []u8 { + var c: [@sizeOf(u32)]u8 = undefined; + var tmp: [Hash.digest_length]u8 = undefined; + + var i: usize = 0; + var counter: u32 = 0; + while (i < out.len) : (counter += 1) { + var hasher = Hash.init(.{}); + hasher.update(seed); + std.mem.writeInt(u32, &c, counter, .big); + hasher.update(&c); + + const left = out.len - i; + if (left >= Hash.digest_length) { + // optimization: write straight to `out` + hasher.final(out[i..][0..Hash.digest_length]); + i += Hash.digest_length; + } else { + hasher.final(&tmp); + @memcpy(out[i..][0..left], tmp[0..left]); + i += left; + } + } + + return out; +} + +test mgf1 { + const Hash = std.crypto.hash.sha2.Sha256; + var out: [Hash.digest_length * 2 + 1]u8 = undefined; + try std.testing.expectEqualSlices( + u8, + &hexToBytes( + \\ed 1b 84 6b b9 26 39 00 c8 17 82 ad 08 eb 17 01 + \\fa 8c 72 21 c6 57 63 77 31 7f 5c e8 09 89 9f + ), + mgf1(Hash, "asdf", out[0 .. Hash.digest_length - 1]), + ); + try std.testing.expectEqualSlices( + u8, + &hexToBytes( + \\ed 1b 84 6b b9 26 39 00 c8 17 82 ad 08 eb 17 01 + \\fa 8c 72 21 c6 57 63 77 31 7f 5c e8 09 89 9f 5a + \\22 F2 80 D5 28 08 F4 93 83 76 00 DE 09 E4 EC 92 + \\4A 2C 7C EF 0D F7 7B BE 8F 7F 12 CB 8F 33 A6 65 + \\AB + ), + mgf1(Hash, "asdf", &out), + ); +} + +/// For OAEP. +inline fn labelHash(comptime Hash: type, label: []const u8) [Hash.digest_length]u8 { + if (label.len == 0) { + // magic constants from NIST + const sha2 = std.crypto.hash.sha2; + switch (Hash) { + std.crypto.hash.Sha1 => return hexToBytes( + \\da39a3ee 5e6b4b0d 3255bfef 95601890 + \\afd80709 + ), + sha2.Sha256 => return hexToBytes( + \\e3b0c442 98fc1c14 9afbf4c8 996fb924 + \\27ae41e4 649b934c a495991b 7852b855 + ), + sha2.Sha384 => return hexToBytes( + \\38b060a7 51ac9638 4cd9327e b1b1e36a + \\21fdb711 14be0743 4c0cc7bf 63f6e1da + \\274edebf e76f65fb d51ad2f1 4898b95b + ), + sha2.Sha512 => return hexToBytes( + \\cf83e135 7eefb8bd f1542850 d66d8007 + \\d620e405 0b5715dc 83f4a921 d36ce9ce + \\47d0d13c 5d85f2b0 ff8318d2 877eec2f + \\63b931bd 47417a81 a538327a f927da3e + ), + // just use the empty hash... + else => {}, + } + } + var res: [Hash.digest_length]u8 = undefined; + Hash.hash(label, &res, .{}); + return res; +} + +const ct = if (std.options.side_channels_mitigations == .none) ct_unprotected else ct_protected; + +const ct_unprotected = struct { + fn lastIndexOfScalar(slice: []const u8, value: u8) ?usize { + return std.mem.lastIndexOfScalar(u8, slice, value); + } + + fn indexOfScalarPos(slice: []const u8, start_index: usize, value: u8) ?usize { + return std.mem.indexOfScalarPos(u8, slice, start_index, value); + } + + fn memEql(a: []const u8, b: []const u8) bool { + return std.mem.eql(u8, a, b); + } + + fn @"and"(a: bool, b: bool) bool { + return a and b; + } + + fn @"or"(a: bool, b: bool) bool { + return a or b; + } +}; + +const ct_protected = struct { + fn lastIndexOfScalar(slice: []const u8, value: u8) ?usize { + var res: ?usize = null; + var i: usize = slice.len; + while (i != 0) { + i -= 1; + if (@intFromBool(res == null) & @intFromBool(slice[i] == value) == 1) res = i; + } + return res; + } + + fn indexOfScalarPos(slice: []const u8, start_index: usize, value: u8) ?usize { + var res: ?usize = null; + for (slice[start_index..], start_index..) |c, j| { + if (c == value) res = j; + } + return res; + } + + fn memEql(a: []const u8, b: []const u8) bool { + var res: u1 = 1; + for (a, b) |a_elem, b_elem| { + res &= @intFromBool(a_elem == b_elem); + } + return res == 1; + } + + fn @"and"(a: bool, b: bool) bool { + return (@intFromBool(a) & @intFromBool(b)) == 1; + } + + fn @"or"(a: bool, b: bool) bool { + return (@intFromBool(a) | @intFromBool(b)) == 1; + } +}; + +test ct { + const c = ct_unprotected; + try std.testing.expectEqual(true, c.@"or"(true, false)); + try std.testing.expectEqual(true, c.@"and"(true, true)); + try std.testing.expectEqual(true, c.memEql("Asdf", "Asdf")); + try std.testing.expectEqual(false, c.memEql("asdf", "Asdf")); + try std.testing.expectEqual(3, c.indexOfScalarPos("asdff", 1, 'f')); + try std.testing.expectEqual(4, c.lastIndexOfScalar("asdff", 'f')); +} + +fn removeNonHex(comptime hex: []const u8) []const u8 { + var res: [hex.len]u8 = undefined; + var i: usize = 0; + for (hex) |c| { + if (std.ascii.isHex(c)) { + res[i] = c; + i += 1; + } + } + return res[0..i]; +} + +/// For readable copy/pasting from hex viewers. +fn hexToBytes(comptime hex: []const u8) [removeNonHex(hex).len / 2]u8 { + const hex2 = comptime removeNonHex(hex); + comptime var res: [hex2.len / 2]u8 = undefined; + _ = comptime std.fmt.hexToBytes(&res, hex2) catch unreachable; + return res; +} + +test hexToBytes { + const hex = + \\e3b0c442 98fc1c14 9afbf4c8 996fb924 + \\27ae41e4 649b934c a495991b 7852b855 + ; + try std.testing.expectEqual( + [_]u8{ + 0xe3, 0xb0, 0xc4, 0x42, 0x98, 0xfc, 0x1c, 0x14, + 0x9a, 0xfb, 0xf4, 0xc8, 0x99, 0x6f, 0xb9, 0x24, + 0x27, 0xae, 0x41, 0xe4, 0x64, 0x9b, 0x93, 0x4c, + 0xa4, 0x95, 0x99, 0x1b, 0x78, 0x52, 0xb8, 0x55, + }, + hexToBytes(hex), + ); +} + +const TestHash = std.crypto.hash.sha2.Sha256; +fn testKeypair() !KeyPair { + const keypair_bytes = @embedFile("testdata/id_rsa.der"); + const kp = try KeyPair.fromDer(keypair_bytes); + try std.testing.expectEqual(2048, kp.public.modulus.bits()); + return kp; +} + +test "rsa PKCS1-v1_5 encrypt and decrypt" { + const kp = try testKeypair(); + + const msg = "rsa PKCS1-v1_5 encrypt and decrypt"; + var out: [max_modulus_len]u8 = undefined; + const enc = try kp.public.encryptPkcsv1_5(msg, &out); + + var out2: [max_modulus_len]u8 = undefined; + const dec = try kp.decryptPkcsv1_5(enc, &out2); + + try std.testing.expectEqualSlices(u8, msg, dec); +} + +test "rsa OAEP encrypt and decrypt" { + const kp = try testKeypair(); + + const msg = "rsa OAEP encrypt and decrypt"; + const label = ""; + var out: [max_modulus_len]u8 = undefined; + const enc = try kp.public.encryptOaep(TestHash, msg, label, &out); + + var out2: [max_modulus_len]u8 = undefined; + const dec = try kp.decryptOaep(TestHash, enc, label, &out2); + + try std.testing.expectEqualSlices(u8, msg, dec); +} + +test "rsa PKCS1-v1_5 signature" { + const kp = try testKeypair(); + + const msg = "rsa PKCS1-v1_5 signature"; + var out: [max_modulus_len]u8 = undefined; + + const signature = try kp.signPkcsv1_5(TestHash, msg, &out); + try signature.verify(msg, kp.public); +} + +test "rsa PSS signature" { + const kp = try testKeypair(); + + const msg = "rsa PSS signature"; + var out: [max_modulus_len]u8 = undefined; + + const salts = [_][]const u8{ "asdf", "" }; + for (salts) |salt| { + const signature = try kp.signOaep(TestHash, msg, salt, &out); + try signature.verify(msg, kp.public, salt.len); + } + + const signature = try kp.signOaep(TestHash, msg, null, &out); // random salt + try signature.verify(msg, kp.public, null); +} diff --git a/lib/std/crypto/testdata/ecdsa_secp256r1_sha256_wycheproof.zig b/lib/std/crypto/testdata/ecdsa_secp256r1_sha256_wycheproof.zig new file mode 100644 index 000000000000..f1e693197036 --- /dev/null +++ b/lib/std/crypto/testdata/ecdsa_secp256r1_sha256_wycheproof.zig @@ -0,0 +1,2740 @@ +// generated from ecdsa_secp256r1_sha256_test.json by gen_wycheproof.zig +pub const Test = struct { + comment: []const u8, + msg: []const u8, + sig: []const u8, + result: enum { + valid, + invalid, + acceptable, + }, +}; +pub const TestGroup = struct { + key: []const u8, + tests: []const Test, +}; + +pub const test_groups = [_]TestGroup{ + .{ + .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", + .tests = &[_]Test{ + .{ + .comment = "signature malleability", + .msg = "313233343030", + .sig = "304402202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e1802204cd60b855d442f5b3c7b11eb6c4e0ae7525fe710fab9aa7c77a67f79e6fadd76", + .result = .valid, + }, + .{ + .comment = "Legacy:ASN encoding of s misses leading 0", + .msg = "313233343030", + .sig = "304402202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180220b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + .result = .acceptable, + }, + .{ + .comment = "valid", + .msg = "313233343030", + .sig = "304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + .result = .valid, + }, + .{ + .comment = "long form encoding of length of sequence", + .msg = "313233343030", + .sig = "30814502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + .result = .invalid, + }, + .{ + .comment = "length of sequence contains leading 0", + .msg = "313233343030", + .sig = "3082004502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + .result = .invalid, + }, + .{ + .comment = "wrong length of sequence", + .msg = "313233343030", + .sig = "304602202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + .result = .invalid, + }, + .{ + .comment = "wrong length of sequence", + .msg = "313233343030", + .sig = "304402202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + .result = .invalid, + }, + .{ + .comment = "uint32 overflow in length of sequence", + .msg = "313233343030", + .sig = "3085010000004502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + .result = .invalid, + }, + .{ + .comment = "uint64 overflow in length of sequence", + .msg = "313233343030", + .sig = "308901000000000000004502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + .result = .invalid, + }, + .{ + .comment = "length of sequence = 2**31 - 1", + .msg = "313233343030", + .sig = "30847fffffff02202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + .result = .invalid, + }, + .{ + .comment = "length of sequence = 2**32 - 1", + .msg = "313233343030", + .sig = "3084ffffffff02202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + .result = .invalid, + }, + .{ + .comment = "length of sequence = 2**40 - 1", + .msg = "313233343030", + .sig = "3085ffffffffff02202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + .result = .invalid, + }, + .{ + .comment = "length of sequence = 2**64 - 1", + .msg = "313233343030", + .sig = "3088ffffffffffffffff02202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + .result = .invalid, + }, + .{ + .comment = "incorrect length of sequence", + .msg = "313233343030", + .sig = "30ff02202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + .result = .invalid, + }, + .{ + .comment = "indefinite length without termination", + .msg = "313233343030", + .sig = "308002202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + .result = .invalid, + }, + .{ + .comment = "indefinite length without termination", + .msg = "313233343030", + .sig = "304502802ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + .result = .invalid, + }, + .{ + .comment = "indefinite length without termination", + .msg = "313233343030", + .sig = "304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18028000b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + .result = .invalid, + }, + .{ + .comment = "removing sequence", + .msg = "313233343030", + .sig = "", + .result = .invalid, + }, + .{ + .comment = "lonely sequence tag", + .msg = "313233343030", + .sig = "30", + .result = .invalid, + }, + .{ + .comment = "appending 0's to sequence", + .msg = "313233343030", + .sig = "304702202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db0000", + .result = .invalid, + }, + .{ + .comment = "prepending 0's to sequence", + .msg = "313233343030", + .sig = "3047000002202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + .result = .invalid, + }, + .{ + .comment = "appending unused 0's to sequence", + .msg = "313233343030", + .sig = "304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db0000", + .result = .invalid, + }, + .{ + .comment = "appending null value to sequence", + .msg = "313233343030", + .sig = "304702202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db0500", + .result = .invalid, + }, + .{ + .comment = "including garbage", + .msg = "313233343030", + .sig = "304a498177304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + .result = .invalid, + }, + .{ + .comment = "including garbage", + .msg = "313233343030", + .sig = "30492500304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + .result = .invalid, + }, + .{ + .comment = "including garbage", + .msg = "313233343030", + .sig = "3047304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db0004deadbeef", + .result = .invalid, + }, + .{ + .comment = "including garbage", + .msg = "313233343030", + .sig = "304a222549817702202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + .result = .invalid, + }, + .{ + .comment = "including garbage", + .msg = "313233343030", + .sig = "30492224250002202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + .result = .invalid, + }, + .{ + .comment = "including garbage", + .msg = "313233343030", + .sig = "304d222202202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180004deadbeef022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + .result = .invalid, + }, + .{ + .comment = "including garbage", + .msg = "313233343030", + .sig = "304a02202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e182226498177022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + .result = .invalid, + }, + .{ + .comment = "including garbage", + .msg = "313233343030", + .sig = "304902202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e1822252500022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + .result = .invalid, + }, + .{ + .comment = "including garbage", + .msg = "313233343030", + .sig = "304d02202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e182223022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db0004deadbeef", + .result = .invalid, + }, + .{ + .comment = "including undefined tags", + .msg = "313233343030", + .sig = "304daa00bb00cd00304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + .result = .invalid, + }, + .{ + .comment = "including undefined tags", + .msg = "313233343030", + .sig = "304baa02aabb304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + .result = .invalid, + }, + .{ + .comment = "including undefined tags", + .msg = "313233343030", + .sig = "304d2228aa00bb00cd0002202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + .result = .invalid, + }, + .{ + .comment = "including undefined tags", + .msg = "313233343030", + .sig = "304b2226aa02aabb02202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + .result = .invalid, + }, + .{ + .comment = "including undefined tags", + .msg = "313233343030", + .sig = "304d02202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e182229aa00bb00cd00022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + .result = .invalid, + }, + .{ + .comment = "including undefined tags", + .msg = "313233343030", + .sig = "304b02202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e182227aa02aabb022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + .result = .invalid, + }, + .{ + .comment = "truncated length of sequence", + .msg = "313233343030", + .sig = "3081", + .result = .invalid, + }, + .{ + .comment = "using composition with indefinite length", + .msg = "313233343030", + .sig = "3080304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db0000", + .result = .invalid, + }, + .{ + .comment = "using composition with indefinite length", + .msg = "313233343030", + .sig = "3049228002202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180000022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + .result = .invalid, + }, + .{ + .comment = "using composition with indefinite length", + .msg = "313233343030", + .sig = "304902202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e182280022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db0000", + .result = .invalid, + }, + .{ + .comment = "using composition with wrong tag", + .msg = "313233343030", + .sig = "3080314502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db0000", + .result = .invalid, + }, + .{ + .comment = "using composition with wrong tag", + .msg = "313233343030", + .sig = "3049228003202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180000022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + .result = .invalid, + }, + .{ + .comment = "using composition with wrong tag", + .msg = "313233343030", + .sig = "304902202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e182280032100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db0000", + .result = .invalid, + }, + .{ + .comment = "Replacing sequence with NULL", + .msg = "313233343030", + .sig = "0500", + .result = .invalid, + }, + .{ + .comment = "changing tag value of sequence", + .msg = "313233343030", + .sig = "2e4502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + .result = .invalid, + }, + .{ + .comment = "changing tag value of sequence", + .msg = "313233343030", + .sig = "2f4502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + .result = .invalid, + }, + .{ + .comment = "changing tag value of sequence", + .msg = "313233343030", + .sig = "314502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + .result = .invalid, + }, + .{ + .comment = "changing tag value of sequence", + .msg = "313233343030", + .sig = "324502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + .result = .invalid, + }, + .{ + .comment = "changing tag value of sequence", + .msg = "313233343030", + .sig = "ff4502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + .result = .invalid, + }, + .{ + .comment = "dropping value of sequence", + .msg = "313233343030", + .sig = "3000", + .result = .invalid, + }, + .{ + .comment = "using composition for sequence", + .msg = "313233343030", + .sig = "30493001023044202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + .result = .invalid, + }, + .{ + .comment = "truncated sequence", + .msg = "313233343030", + .sig = "304402202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847", + .result = .invalid, + }, + .{ + .comment = "truncated sequence", + .msg = "313233343030", + .sig = "3044202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + .result = .invalid, + }, + .{ + .comment = "indefinite length", + .msg = "313233343030", + .sig = "308002202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db0000", + .result = .invalid, + }, + .{ + .comment = "indefinite length with truncated delimiter", + .msg = "313233343030", + .sig = "308002202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db00", + .result = .invalid, + }, + .{ + .comment = "indefinite length with additional element", + .msg = "313233343030", + .sig = "308002202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db05000000", + .result = .invalid, + }, + .{ + .comment = "indefinite length with truncated element", + .msg = "313233343030", + .sig = "308002202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db060811220000", + .result = .invalid, + }, + .{ + .comment = "indefinite length with garbage", + .msg = "313233343030", + .sig = "308002202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db0000fe02beef", + .result = .invalid, + }, + .{ + .comment = "indefinite length with nonempty EOC", + .msg = "313233343030", + .sig = "308002202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db0002beef", + .result = .invalid, + }, + .{ + .comment = "prepend empty sequence", + .msg = "313233343030", + .sig = "3047300002202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + .result = .invalid, + }, + .{ + .comment = "append empty sequence", + .msg = "313233343030", + .sig = "304702202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db3000", + .result = .invalid, + }, + .{ + .comment = "append garbage with high tag number", + .msg = "313233343030", + .sig = "304802202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847dbbf7f00", + .result = .invalid, + }, + .{ + .comment = "sequence of sequence", + .msg = "313233343030", + .sig = "3047304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + .result = .invalid, + }, + .{ + .comment = "truncated sequence: removed last 1 elements", + .msg = "313233343030", + .sig = "302202202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18", + .result = .invalid, + }, + .{ + .comment = "repeating element in sequence", + .msg = "313233343030", + .sig = "306802202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + .result = .invalid, + }, + .{ + .comment = "long form encoding of length of integer", + .msg = "313233343030", + .sig = "30460281202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + .result = .invalid, + }, + .{ + .comment = "long form encoding of length of integer", + .msg = "313233343030", + .sig = "304602202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e1802812100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + .result = .invalid, + }, + .{ + .comment = "length of integer contains leading 0", + .msg = "313233343030", + .sig = "3047028200202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + .result = .invalid, + }, + .{ + .comment = "length of integer contains leading 0", + .msg = "313233343030", + .sig = "304702202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180282002100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + .result = .invalid, + }, + .{ + .comment = "wrong length of integer", + .msg = "313233343030", + .sig = "304502212ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + .result = .invalid, + }, + .{ + .comment = "wrong length of integer", + .msg = "313233343030", + .sig = "3045021f2ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + .result = .invalid, + }, + .{ + .comment = "wrong length of integer", + .msg = "313233343030", + .sig = "304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022200b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + .result = .invalid, + }, + .{ + .comment = "wrong length of integer", + .msg = "313233343030", + .sig = "304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022000b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + .result = .invalid, + }, + .{ + .comment = "uint32 overflow in length of integer", + .msg = "313233343030", + .sig = "304a028501000000202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + .result = .invalid, + }, + .{ + .comment = "uint32 overflow in length of integer", + .msg = "313233343030", + .sig = "304a02202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180285010000002100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + .result = .invalid, + }, + .{ + .comment = "uint64 overflow in length of integer", + .msg = "313233343030", + .sig = "304e02890100000000000000202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + .result = .invalid, + }, + .{ + .comment = "uint64 overflow in length of integer", + .msg = "313233343030", + .sig = "304e02202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18028901000000000000002100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + .result = .invalid, + }, + .{ + .comment = "length of integer = 2**31 - 1", + .msg = "313233343030", + .sig = "304902847fffffff2ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + .result = .invalid, + }, + .{ + .comment = "length of integer = 2**31 - 1", + .msg = "313233343030", + .sig = "304902202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e1802847fffffff00b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + .result = .invalid, + }, + .{ + .comment = "length of integer = 2**32 - 1", + .msg = "313233343030", + .sig = "30490284ffffffff2ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + .result = .invalid, + }, + .{ + .comment = "length of integer = 2**32 - 1", + .msg = "313233343030", + .sig = "304902202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180284ffffffff00b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + .result = .invalid, + }, + .{ + .comment = "length of integer = 2**40 - 1", + .msg = "313233343030", + .sig = "304a0285ffffffffff2ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + .result = .invalid, + }, + .{ + .comment = "length of integer = 2**40 - 1", + .msg = "313233343030", + .sig = "304a02202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180285ffffffffff00b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + .result = .invalid, + }, + .{ + .comment = "length of integer = 2**64 - 1", + .msg = "313233343030", + .sig = "304d0288ffffffffffffffff2ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + .result = .invalid, + }, + .{ + .comment = "length of integer = 2**64 - 1", + .msg = "313233343030", + .sig = "304d02202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180288ffffffffffffffff00b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + .result = .invalid, + }, + .{ + .comment = "incorrect length of integer", + .msg = "313233343030", + .sig = "304502ff2ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + .result = .invalid, + }, + .{ + .comment = "incorrect length of integer", + .msg = "313233343030", + .sig = "304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e1802ff00b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + .result = .invalid, + }, + .{ + .comment = "removing integer", + .msg = "313233343030", + .sig = "3023022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + .result = .invalid, + }, + .{ + .comment = "lonely integer tag", + .msg = "313233343030", + .sig = "302402022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + .result = .invalid, + }, + .{ + .comment = "lonely integer tag", + .msg = "313233343030", + .sig = "302302202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e1802", + .result = .invalid, + }, + .{ + .comment = "appending 0's to integer", + .msg = "313233343030", + .sig = "304702222ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180000022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + .result = .invalid, + }, + .{ + .comment = "appending 0's to integer", + .msg = "313233343030", + .sig = "304702202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022300b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db0000", + .result = .invalid, + }, + .{ + .comment = "prepending 0's to integer", + .msg = "313233343030", + .sig = "3047022200002ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + .result = .invalid, + }, + .{ + .comment = "prepending 0's to integer", + .msg = "313233343030", + .sig = "304702202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180223000000b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + .result = .invalid, + }, + .{ + .comment = "appending unused 0's to integer", + .msg = "313233343030", + .sig = "304702202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180000022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + .result = .invalid, + }, + .{ + .comment = "appending null value to integer", + .msg = "313233343030", + .sig = "304702222ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180500022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + .result = .invalid, + }, + .{ + .comment = "appending null value to integer", + .msg = "313233343030", + .sig = "304702202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022300b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db0500", + .result = .invalid, + }, + .{ + .comment = "truncated length of integer", + .msg = "313233343030", + .sig = "30250281022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + .result = .invalid, + }, + .{ + .comment = "truncated length of integer", + .msg = "313233343030", + .sig = "302402202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180281", + .result = .invalid, + }, + .{ + .comment = "Replacing integer with NULL", + .msg = "313233343030", + .sig = "30250500022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + .result = .invalid, + }, + .{ + .comment = "Replacing integer with NULL", + .msg = "313233343030", + .sig = "302402202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180500", + .result = .invalid, + }, + .{ + .comment = "changing tag value of integer", + .msg = "313233343030", + .sig = "304500202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + .result = .invalid, + }, + .{ + .comment = "changing tag value of integer", + .msg = "313233343030", + .sig = "304501202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + .result = .invalid, + }, + .{ + .comment = "changing tag value of integer", + .msg = "313233343030", + .sig = "304503202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + .result = .invalid, + }, + .{ + .comment = "changing tag value of integer", + .msg = "313233343030", + .sig = "304504202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + .result = .invalid, + }, + .{ + .comment = "changing tag value of integer", + .msg = "313233343030", + .sig = "3045ff202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + .result = .invalid, + }, + .{ + .comment = "changing tag value of integer", + .msg = "313233343030", + .sig = "304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18002100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + .result = .invalid, + }, + .{ + .comment = "changing tag value of integer", + .msg = "313233343030", + .sig = "304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18012100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + .result = .invalid, + }, + .{ + .comment = "changing tag value of integer", + .msg = "313233343030", + .sig = "304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18032100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + .result = .invalid, + }, + .{ + .comment = "changing tag value of integer", + .msg = "313233343030", + .sig = "304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18042100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + .result = .invalid, + }, + .{ + .comment = "changing tag value of integer", + .msg = "313233343030", + .sig = "304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18ff2100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + .result = .invalid, + }, + .{ + .comment = "dropping value of integer", + .msg = "313233343030", + .sig = "30250200022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + .result = .invalid, + }, + .{ + .comment = "dropping value of integer", + .msg = "313233343030", + .sig = "302402202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180200", + .result = .invalid, + }, + .{ + .comment = "using composition for integer", + .msg = "313233343030", + .sig = "3049222402012b021fa3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + .result = .invalid, + }, + .{ + .comment = "using composition for integer", + .msg = "313233343030", + .sig = "304902202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e1822250201000220b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + .result = .invalid, + }, + .{ + .comment = "modify first byte of integer", + .msg = "313233343030", + .sig = "3045022029a3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + .result = .invalid, + }, + .{ + .comment = "modify first byte of integer", + .msg = "313233343030", + .sig = "304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022102b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + .result = .invalid, + }, + .{ + .comment = "modify last byte of integer", + .msg = "313233343030", + .sig = "304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e98022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + .result = .invalid, + }, + .{ + .comment = "modify last byte of integer", + .msg = "313233343030", + .sig = "304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b491568475b", + .result = .invalid, + }, + .{ + .comment = "truncated integer", + .msg = "313233343030", + .sig = "3044021f2ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + .result = .invalid, + }, + .{ + .comment = "truncated integer", + .msg = "313233343030", + .sig = "3044021fa3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + .result = .invalid, + }, + .{ + .comment = "truncated integer", + .msg = "313233343030", + .sig = "304402202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022000b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847", + .result = .invalid, + }, + .{ + .comment = "leading ff in integer", + .msg = "313233343030", + .sig = "30460221ff2ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + .result = .invalid, + }, + .{ + .comment = "leading ff in integer", + .msg = "313233343030", + .sig = "304602202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180222ff00b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + .result = .invalid, + }, + .{ + .comment = "replaced integer by infinity", + .msg = "313233343030", + .sig = "3026090180022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + .result = .invalid, + }, + .{ + .comment = "replaced integer by infinity", + .msg = "313233343030", + .sig = "302502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18090180", + .result = .invalid, + }, + .{ + .comment = "replacing integer with zero", + .msg = "313233343030", + .sig = "3026020100022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + .result = .invalid, + }, + .{ + .comment = "replacing integer with zero", + .msg = "313233343030", + .sig = "302502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18020100", + .result = .invalid, + }, + .{ + .comment = "Modified r or s, e.g. by adding or subtracting the order of the group", + .msg = "313233343030", + .sig = "30460221012ba3a8bd6b94d5ed80a6d9d1190a436ebccc0833490686deac8635bcb9bf5369022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + .result = .invalid, + }, + .{ + .comment = "Modified r or s, e.g. by adding or subtracting the order of the group", + .msg = "313233343030", + .sig = "30460221ff2ba3a8bf6b94d5eb80a6d9d1190a436f42fe12d7fad749d4c512a036c0f908c7022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + .result = .invalid, + }, + .{ + .comment = "Modified r or s, e.g. by adding or subtracting the order of the group", + .msg = "313233343030", + .sig = "30450220d45c5741946b2a137f59262ee6f5bc91001af27a5e1117a64733950642a3d1e8022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + .result = .invalid, + }, + .{ + .comment = "Modified r or s, e.g. by adding or subtracting the order of the group", + .msg = "313233343030", + .sig = "3046022100d45c5740946b2a147f59262ee6f5bc90bd01ed280528b62b3aed5fc93f06f739022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + .result = .invalid, + }, + .{ + .comment = "Modified r or s, e.g. by adding or subtracting the order of the group", + .msg = "313233343030", + .sig = "30460221fed45c5742946b2a127f59262ee6f5bc914333f7ccb6f979215379ca434640ac97022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + .result = .invalid, + }, + .{ + .comment = "Modified r or s, e.g. by adding or subtracting the order of the group", + .msg = "313233343030", + .sig = "30460221012ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + .result = .invalid, + }, + .{ + .comment = "Modified r or s, e.g. by adding or subtracting the order of the group", + .msg = "313233343030", + .sig = "3046022100d45c5741946b2a137f59262ee6f5bc91001af27a5e1117a64733950642a3d1e8022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + .result = .invalid, + }, + .{ + .comment = "Modified r or s, e.g. by adding or subtracting the order of the group", + .msg = "313233343030", + .sig = "304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022101b329f478a2bbd0a6c384ee1493b1f518276e0e4a5375928d6fcd160c11cb6d2c", + .result = .invalid, + }, + .{ + .comment = "Modified r or s, e.g. by adding or subtracting the order of the group", + .msg = "313233343030", + .sig = "304402202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180220b329f47aa2bbd0a4c384ee1493b1f518ada018ef05465583885980861905228a", + .result = .invalid, + }, + .{ + .comment = "Modified r or s, e.g. by adding or subtracting the order of the group", + .msg = "313233343030", + .sig = "304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180221ff4cd60b865d442f5a3c7b11eb6c4e0ae79578ec6353a20bf783ecb4b6ea97b825", + .result = .invalid, + }, + .{ + .comment = "Modified r or s, e.g. by adding or subtracting the order of the group", + .msg = "313233343030", + .sig = "304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180221fe4cd60b875d442f593c7b11eb6c4e0ae7d891f1b5ac8a6d729032e9f3ee3492d4", + .result = .invalid, + }, + .{ + .comment = "Modified r or s, e.g. by adding or subtracting the order of the group", + .msg = "313233343030", + .sig = "304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022101b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db", + .result = .invalid, + }, + .{ + .comment = "Modified r or s, e.g. by adding or subtracting the order of the group", + .msg = "313233343030", + .sig = "304402202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e1802204cd60b865d442f5a3c7b11eb6c4e0ae79578ec6353a20bf783ecb4b6ea97b825", + .result = .invalid, + }, + .{ + .comment = "Signature with special case values for r and s", + .msg = "313233343030", + .sig = "3006020100020100", + .result = .invalid, + }, + .{ + .comment = "Signature with special case values for r and s", + .msg = "313233343030", + .sig = "3006020100020101", + .result = .invalid, + }, + .{ + .comment = "Signature with special case values for r and s", + .msg = "313233343030", + .sig = "30060201000201ff", + .result = .invalid, + }, + .{ + .comment = "Signature with special case values for r and s", + .msg = "313233343030", + .sig = "3026020100022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551", + .result = .invalid, + }, + .{ + .comment = "Signature with special case values for r and s", + .msg = "313233343030", + .sig = "3026020100022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550", + .result = .invalid, + }, + .{ + .comment = "Signature with special case values for r and s", + .msg = "313233343030", + .sig = "3026020100022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552", + .result = .invalid, + }, + .{ + .comment = "Signature with special case values for r and s", + .msg = "313233343030", + .sig = "3026020100022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff", + .result = .invalid, + }, + .{ + .comment = "Signature with special case values for r and s", + .msg = "313233343030", + .sig = "3026020100022100ffffffff00000001000000000000000000000001000000000000000000000000", + .result = .invalid, + }, + .{ + .comment = "Signature with special case values for r and s", + .msg = "313233343030", + .sig = "3008020100090380fe01", + .result = .invalid, + }, + .{ + .comment = "Signature with special case values for r and s", + .msg = "313233343030", + .sig = "3006020100090142", + .result = .invalid, + }, + .{ + .comment = "Signature with special case values for r and s", + .msg = "313233343030", + .sig = "3006020101020100", + .result = .invalid, + }, + .{ + .comment = "Signature with special case values for r and s", + .msg = "313233343030", + .sig = "3006020101020101", + .result = .invalid, + }, + .{ + .comment = "Signature with special case values for r and s", + .msg = "313233343030", + .sig = "30060201010201ff", + .result = .invalid, + }, + .{ + .comment = "Signature with special case values for r and s", + .msg = "313233343030", + .sig = "3026020101022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551", + .result = .invalid, + }, + .{ + .comment = "Signature with special case values for r and s", + .msg = "313233343030", + .sig = "3026020101022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550", + .result = .invalid, + }, + .{ + .comment = "Signature with special case values for r and s", + .msg = "313233343030", + .sig = "3026020101022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552", + .result = .invalid, + }, + .{ + .comment = "Signature with special case values for r and s", + .msg = "313233343030", + .sig = "3026020101022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff", + .result = .invalid, + }, + .{ + .comment = "Signature with special case values for r and s", + .msg = "313233343030", + .sig = "3026020101022100ffffffff00000001000000000000000000000001000000000000000000000000", + .result = .invalid, + }, + .{ + .comment = "Signature with special case values for r and s", + .msg = "313233343030", + .sig = "3008020101090380fe01", + .result = .invalid, + }, + .{ + .comment = "Signature with special case values for r and s", + .msg = "313233343030", + .sig = "3006020101090142", + .result = .invalid, + }, + .{ + .comment = "Signature with special case values for r and s", + .msg = "313233343030", + .sig = "30060201ff020100", + .result = .invalid, + }, + .{ + .comment = "Signature with special case values for r and s", + .msg = "313233343030", + .sig = "30060201ff020101", + .result = .invalid, + }, + .{ + .comment = "Signature with special case values for r and s", + .msg = "313233343030", + .sig = "30060201ff0201ff", + .result = .invalid, + }, + .{ + .comment = "Signature with special case values for r and s", + .msg = "313233343030", + .sig = "30260201ff022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551", + .result = .invalid, + }, + .{ + .comment = "Signature with special case values for r and s", + .msg = "313233343030", + .sig = "30260201ff022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550", + .result = .invalid, + }, + .{ + .comment = "Signature with special case values for r and s", + .msg = "313233343030", + .sig = "30260201ff022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552", + .result = .invalid, + }, + .{ + .comment = "Signature with special case values for r and s", + .msg = "313233343030", + .sig = "30260201ff022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff", + .result = .invalid, + }, + .{ + .comment = "Signature with special case values for r and s", + .msg = "313233343030", + .sig = "30260201ff022100ffffffff00000001000000000000000000000001000000000000000000000000", + .result = .invalid, + }, + .{ + .comment = "Signature with special case values for r and s", + .msg = "313233343030", + .sig = "30080201ff090380fe01", + .result = .invalid, + }, + .{ + .comment = "Signature with special case values for r and s", + .msg = "313233343030", + .sig = "30060201ff090142", + .result = .invalid, + }, + .{ + .comment = "Signature with special case values for r and s", + .msg = "313233343030", + .sig = "3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551020100", + .result = .invalid, + }, + .{ + .comment = "Signature with special case values for r and s", + .msg = "313233343030", + .sig = "3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551020101", + .result = .invalid, + }, + .{ + .comment = "Signature with special case values for r and s", + .msg = "313233343030", + .sig = "3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325510201ff", + .result = .invalid, + }, + .{ + .comment = "Signature with special case values for r and s", + .msg = "313233343030", + .sig = "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551", + .result = .invalid, + }, + .{ + .comment = "Signature with special case values for r and s", + .msg = "313233343030", + .sig = "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550", + .result = .invalid, + }, + .{ + .comment = "Signature with special case values for r and s", + .msg = "313233343030", + .sig = "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552", + .result = .invalid, + }, + .{ + .comment = "Signature with special case values for r and s", + .msg = "313233343030", + .sig = "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff", + .result = .invalid, + }, + .{ + .comment = "Signature with special case values for r and s", + .msg = "313233343030", + .sig = "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551022100ffffffff00000001000000000000000000000001000000000000000000000000", + .result = .invalid, + }, + .{ + .comment = "Signature with special case values for r and s", + .msg = "313233343030", + .sig = "3028022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551090380fe01", + .result = .invalid, + }, + .{ + .comment = "Signature with special case values for r and s", + .msg = "313233343030", + .sig = "3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551090142", + .result = .invalid, + }, + .{ + .comment = "Signature with special case values for r and s", + .msg = "313233343030", + .sig = "3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550020100", + .result = .invalid, + }, + .{ + .comment = "Signature with special case values for r and s", + .msg = "313233343030", + .sig = "3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550020101", + .result = .invalid, + }, + .{ + .comment = "Signature with special case values for r and s", + .msg = "313233343030", + .sig = "3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325500201ff", + .result = .invalid, + }, + .{ + .comment = "Signature with special case values for r and s", + .msg = "313233343030", + .sig = "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551", + .result = .invalid, + }, + .{ + .comment = "Signature with special case values for r and s", + .msg = "313233343030", + .sig = "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550", + .result = .invalid, + }, + .{ + .comment = "Signature with special case values for r and s", + .msg = "313233343030", + .sig = "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552", + .result = .invalid, + }, + .{ + .comment = "Signature with special case values for r and s", + .msg = "313233343030", + .sig = "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff", + .result = .invalid, + }, + .{ + .comment = "Signature with special case values for r and s", + .msg = "313233343030", + .sig = "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550022100ffffffff00000001000000000000000000000001000000000000000000000000", + .result = .invalid, + }, + .{ + .comment = "Signature with special case values for r and s", + .msg = "313233343030", + .sig = "3028022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550090380fe01", + .result = .invalid, + }, + .{ + .comment = "Signature with special case values for r and s", + .msg = "313233343030", + .sig = "3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550090142", + .result = .invalid, + }, + .{ + .comment = "Signature with special case values for r and s", + .msg = "313233343030", + .sig = "3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552020100", + .result = .invalid, + }, + .{ + .comment = "Signature with special case values for r and s", + .msg = "313233343030", + .sig = "3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552020101", + .result = .invalid, + }, + .{ + .comment = "Signature with special case values for r and s", + .msg = "313233343030", + .sig = "3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325520201ff", + .result = .invalid, + }, + .{ + .comment = "Signature with special case values for r and s", + .msg = "313233343030", + .sig = "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551", + .result = .invalid, + }, + .{ + .comment = "Signature with special case values for r and s", + .msg = "313233343030", + .sig = "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550", + .result = .invalid, + }, + .{ + .comment = "Signature with special case values for r and s", + .msg = "313233343030", + .sig = "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552", + .result = .invalid, + }, + .{ + .comment = "Signature with special case values for r and s", + .msg = "313233343030", + .sig = "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff", + .result = .invalid, + }, + .{ + .comment = "Signature with special case values for r and s", + .msg = "313233343030", + .sig = "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552022100ffffffff00000001000000000000000000000001000000000000000000000000", + .result = .invalid, + }, + .{ + .comment = "Signature with special case values for r and s", + .msg = "313233343030", + .sig = "3028022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552090380fe01", + .result = .invalid, + }, + .{ + .comment = "Signature with special case values for r and s", + .msg = "313233343030", + .sig = "3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552090142", + .result = .invalid, + }, + .{ + .comment = "Signature with special case values for r and s", + .msg = "313233343030", + .sig = "3026022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff020100", + .result = .invalid, + }, + .{ + .comment = "Signature with special case values for r and s", + .msg = "313233343030", + .sig = "3026022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff020101", + .result = .invalid, + }, + .{ + .comment = "Signature with special case values for r and s", + .msg = "313233343030", + .sig = "3026022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff0201ff", + .result = .invalid, + }, + .{ + .comment = "Signature with special case values for r and s", + .msg = "313233343030", + .sig = "3046022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551", + .result = .invalid, + }, + .{ + .comment = "Signature with special case values for r and s", + .msg = "313233343030", + .sig = "3046022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550", + .result = .invalid, + }, + .{ + .comment = "Signature with special case values for r and s", + .msg = "313233343030", + .sig = "3046022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552", + .result = .invalid, + }, + .{ + .comment = "Signature with special case values for r and s", + .msg = "313233343030", + .sig = "3046022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff", + .result = .invalid, + }, + .{ + .comment = "Signature with special case values for r and s", + .msg = "313233343030", + .sig = "3046022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff022100ffffffff00000001000000000000000000000001000000000000000000000000", + .result = .invalid, + }, + .{ + .comment = "Signature with special case values for r and s", + .msg = "313233343030", + .sig = "3028022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff090380fe01", + .result = .invalid, + }, + .{ + .comment = "Signature with special case values for r and s", + .msg = "313233343030", + .sig = "3026022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff090142", + .result = .invalid, + }, + .{ + .comment = "Signature with special case values for r and s", + .msg = "313233343030", + .sig = "3026022100ffffffff00000001000000000000000000000001000000000000000000000000020100", + .result = .invalid, + }, + .{ + .comment = "Signature with special case values for r and s", + .msg = "313233343030", + .sig = "3026022100ffffffff00000001000000000000000000000001000000000000000000000000020101", + .result = .invalid, + }, + .{ + .comment = "Signature with special case values for r and s", + .msg = "313233343030", + .sig = "3026022100ffffffff000000010000000000000000000000010000000000000000000000000201ff", + .result = .invalid, + }, + .{ + .comment = "Signature with special case values for r and s", + .msg = "313233343030", + .sig = "3046022100ffffffff00000001000000000000000000000001000000000000000000000000022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551", + .result = .invalid, + }, + .{ + .comment = "Signature with special case values for r and s", + .msg = "313233343030", + .sig = "3046022100ffffffff00000001000000000000000000000001000000000000000000000000022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550", + .result = .invalid, + }, + .{ + .comment = "Signature with special case values for r and s", + .msg = "313233343030", + .sig = "3046022100ffffffff00000001000000000000000000000001000000000000000000000000022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552", + .result = .invalid, + }, + .{ + .comment = "Signature with special case values for r and s", + .msg = "313233343030", + .sig = "3046022100ffffffff00000001000000000000000000000001000000000000000000000000022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff", + .result = .invalid, + }, + .{ + .comment = "Signature with special case values for r and s", + .msg = "313233343030", + .sig = "3046022100ffffffff00000001000000000000000000000001000000000000000000000000022100ffffffff00000001000000000000000000000001000000000000000000000000", + .result = .invalid, + }, + .{ + .comment = "Signature with special case values for r and s", + .msg = "313233343030", + .sig = "3028022100ffffffff00000001000000000000000000000001000000000000000000000000090380fe01", + .result = .invalid, + }, + .{ + .comment = "Signature with special case values for r and s", + .msg = "313233343030", + .sig = "3026022100ffffffff00000001000000000000000000000001000000000000000000000000090142", + .result = .invalid, + }, + .{ + .comment = "Signature encoding contains wrong types.", + .msg = "313233343030", + .sig = "30060201010c0130", + .result = .invalid, + }, + .{ + .comment = "Signature encoding contains wrong types.", + .msg = "313233343030", + .sig = "30050201010c00", + .result = .invalid, + }, + .{ + .comment = "Signature encoding contains wrong types.", + .msg = "313233343030", + .sig = "30090c0225730c03732573", + .result = .invalid, + }, + .{ + .comment = "Signature encoding contains wrong types.", + .msg = "313233343030", + .sig = "30080201013003020100", + .result = .invalid, + }, + .{ + .comment = "Signature encoding contains wrong types.", + .msg = "313233343030", + .sig = "3003020101", + .result = .invalid, + }, + .{ + .comment = "Signature encoding contains wrong types.", + .msg = "313233343030", + .sig = "3006020101010100", + .result = .invalid, + }, + .{ + .comment = "Edge case for Shamir multiplication", + .msg = "3639383139", + .sig = "3044022064a1aab5000d0e804f3e2fc02bdee9be8ff312334e2ba16d11547c97711c898e02206af015971cc30be6d1a206d4e013e0997772a2f91d73286ffd683b9bb2cf4f1b", + .result = .valid, + }, + .{ + .comment = "special case hash", + .msg = "343236343739373234", + .sig = "3044022016aea964a2f6506d6f78c81c91fc7e8bded7d397738448de1e19a0ec580bf2660220252cd762130c6667cfe8b7bc47d27d78391e8e80c578d1cd38c3ff033be928e9", + .result = .valid, + }, + .{ + .comment = "special case hash", + .msg = "37313338363834383931", + .sig = "30450221009cc98be2347d469bf476dfc26b9b733df2d26d6ef524af917c665baccb23c8820220093496459effe2d8d70727b82462f61d0ec1b7847929d10ea631dacb16b56c32", + .result = .valid, + }, + .{ + .comment = "special case hash", + .msg = "3130333539333331363638", + .sig = "3044022073b3c90ecd390028058164524dde892703dce3dea0d53fa8093999f07ab8aa4302202f67b0b8e20636695bb7d8bf0a651c802ed25a395387b5f4188c0c4075c88634", + .result = .valid, + }, + .{ + .comment = "special case hash", + .msg = "33393439343031323135", + .sig = "3046022100bfab3098252847b328fadf2f89b95c851a7f0eb390763378f37e90119d5ba3dd022100bdd64e234e832b1067c2d058ccb44d978195ccebb65c2aaf1e2da9b8b4987e3b", + .result = .valid, + }, + .{ + .comment = "special case hash", + .msg = "31333434323933303739", + .sig = "30440220204a9784074b246d8bf8bf04a4ceb1c1f1c9aaab168b1596d17093c5cd21d2cd022051cce41670636783dc06a759c8847868a406c2506fe17975582fe648d1d88b52", + .result = .valid, + }, + .{ + .comment = "special case hash", + .msg = "33373036323131373132", + .sig = "3046022100ed66dc34f551ac82f63d4aa4f81fe2cb0031a91d1314f835027bca0f1ceeaa0302210099ca123aa09b13cd194a422e18d5fda167623c3f6e5d4d6abb8953d67c0c48c7", + .result = .valid, + }, + .{ + .comment = "special case hash", + .msg = "333433363838373132", + .sig = "30450220060b700bef665c68899d44f2356a578d126b062023ccc3c056bf0f60a237012b0221008d186c027832965f4fcc78a3366ca95dedbb410cbef3f26d6be5d581c11d3610", + .result = .valid, + }, + .{ + .comment = "special case hash", + .msg = "31333531353330333730", + .sig = "30460221009f6adfe8d5eb5b2c24d7aa7934b6cf29c93ea76cd313c9132bb0c8e38c96831d022100b26a9c9e40e55ee0890c944cf271756c906a33e66b5bd15e051593883b5e9902", + .result = .valid, + }, + .{ + .comment = "special case hash", + .msg = "36353533323033313236", + .sig = "3045022100a1af03ca91677b673ad2f33615e56174a1abf6da168cebfa8868f4ba273f16b7022020aa73ffe48afa6435cd258b173d0c2377d69022e7d098d75caf24c8c5e06b1c", + .result = .valid, + }, + .{ + .comment = "special case hash", + .msg = "31353634333436363033", + .sig = "3045022100fdc70602766f8eed11a6c99a71c973d5659355507b843da6e327a28c11893db902203df5349688a085b137b1eacf456a9e9e0f6d15ec0078ca60a7f83f2b10d21350", + .result = .valid, + }, + .{ + .comment = "special case hash", + .msg = "34343239353339313137", + .sig = "3046022100b516a314f2fce530d6537f6a6c49966c23456f63c643cf8e0dc738f7b876e675022100d39ffd033c92b6d717dd536fbc5efdf1967c4bd80954479ba66b0120cd16fff2", + .result = .valid, + }, + .{ + .comment = "special case hash", + .msg = "3130393533323631333531", + .sig = "304402203b2cbf046eac45842ecb7984d475831582717bebb6492fd0a485c101e29ff0a802204c9b7b47a98b0f82de512bc9313aaf51701099cac5f76e68c8595fc1c1d99258", + .result = .valid, + }, + .{ + .comment = "special case hash", + .msg = "35393837333530303431", + .sig = "3044022030c87d35e636f540841f14af54e2f9edd79d0312cfa1ab656c3fb15bfde48dcf022047c15a5a82d24b75c85a692bd6ecafeb71409ede23efd08e0db9abf6340677ed", + .result = .valid, + }, + .{ + .comment = "special case hash", + .msg = "33343633303036383738", + .sig = "3044022038686ff0fda2cef6bc43b58cfe6647b9e2e8176d168dec3c68ff262113760f520220067ec3b651f422669601662167fa8717e976e2db5e6a4cf7c2ddabb3fde9d67d", + .result = .valid, + }, + .{ + .comment = "special case hash", + .msg = "39383137333230323837", + .sig = "3044022044a3e23bf314f2b344fc25c7f2de8b6af3e17d27f5ee844b225985ab6e2775cf02202d48e223205e98041ddc87be532abed584f0411f5729500493c9cc3f4dd15e86", + .result = .valid, + }, + .{ + .comment = "special case hash", + .msg = "33323232303431303436", + .sig = "304402202ded5b7ec8e90e7bf11f967a3d95110c41b99db3b5aa8d330eb9d638781688e902207d5792c53628155e1bfc46fb1a67e3088de049c328ae1f44ec69238a009808f9", + .result = .valid, + }, + .{ + .comment = "special case hash", + .msg = "36363636333037313034", + .sig = "3046022100bdae7bcb580bf335efd3bc3d31870f923eaccafcd40ec2f605976f15137d8b8f022100f6dfa12f19e525270b0106eecfe257499f373a4fb318994f24838122ce7ec3c7", + .result = .valid, + }, + .{ + .comment = "special case hash", + .msg = "31303335393531383938", + .sig = "3045022050f9c4f0cd6940e162720957ffff513799209b78596956d21ece251c2401f1c6022100d7033a0a787d338e889defaaabb106b95a4355e411a59c32aa5167dfab244726", + .result = .valid, + }, + .{ + .comment = "special case hash", + .msg = "31383436353937313935", + .sig = "3045022100f612820687604fa01906066a378d67540982e29575d019aabe90924ead5c860d02203f9367702dd7dd4f75ea98afd20e328a1a99f4857b316525328230ce294b0fef", + .result = .valid, + }, + .{ + .comment = "special case hash", + .msg = "33313336303436313839", + .sig = "30460221009505e407657d6e8bc93db5da7aa6f5081f61980c1949f56b0f2f507da5782a7a022100c60d31904e3669738ffbeccab6c3656c08e0ed5cb92b3cfa5e7f71784f9c5021", + .result = .valid, + }, + .{ + .comment = "special case hash", + .msg = "32363633373834323534", + .sig = "3046022100bbd16fbbb656b6d0d83e6a7787cd691b08735aed371732723e1c68a40404517d0221009d8e35dba96028b7787d91315be675877d2d097be5e8ee34560e3e7fd25c0f00", + .result = .valid, + }, + .{ + .comment = "special case hash", + .msg = "31363532313030353234", + .sig = "304402202ec9760122db98fd06ea76848d35a6da442d2ceef7559a30cf57c61e92df327e02207ab271da90859479701fccf86e462ee3393fb6814c27b760c4963625c0a19878", + .result = .valid, + }, + .{ + .comment = "special case hash", + .msg = "35373438303831363936", + .sig = "3044022054e76b7683b6650baa6a7fc49b1c51eed9ba9dd463221f7a4f1005a89fe00c5902202ea076886c773eb937ec1cc8374b7915cfd11b1c1ae1166152f2f7806a31c8fd", + .result = .valid, + }, + .{ + .comment = "special case hash", + .msg = "36333433393133343638", + .sig = "304402205291deaf24659ffbbce6e3c26f6021097a74abdbb69be4fb10419c0c496c9466022065d6fcf336d27cc7cdb982bb4e4ecef5827f84742f29f10abf83469270a03dc3", + .result = .valid, + }, + .{ + .comment = "special case hash", + .msg = "31353431313033353938", + .sig = "30450220207a3241812d75d947419dc58efb05e8003b33fc17eb50f9d15166a88479f107022100cdee749f2e492b213ce80b32d0574f62f1c5d70793cf55e382d5caadf7592767", + .result = .valid, + }, + .{ + .comment = "special case hash", + .msg = "3130343738353830313238", + .sig = "304502206554e49f82a855204328ac94913bf01bbe84437a355a0a37c0dee3cf81aa7728022100aea00de2507ddaf5c94e1e126980d3df16250a2eaebc8be486effe7f22b4f929", + .result = .valid, + }, + .{ + .comment = "special case hash", + .msg = "3130353336323835353638", + .sig = "3046022100a54c5062648339d2bff06f71c88216c26c6e19b4d80a8c602990ac82707efdfc022100e99bbe7fcfafae3e69fd016777517aa01056317f467ad09aff09be73c9731b0d", + .result = .valid, + }, + .{ + .comment = "special case hash", + .msg = "393533393034313035", + .sig = "3045022100975bd7157a8d363b309f1f444012b1a1d23096593133e71b4ca8b059cff37eaf02207faa7a28b1c822baa241793f2abc930bd4c69840fe090f2aacc46786bf919622", + .result = .valid, + }, + .{ + .comment = "special case hash", + .msg = "393738383438303339", + .sig = "304402205694a6f84b8f875c276afd2ebcfe4d61de9ec90305afb1357b95b3e0da43885e02200dffad9ffd0b757d8051dec02ebdf70d8ee2dc5c7870c0823b6ccc7c679cbaa4", + .result = .valid, + }, + .{ + .comment = "special case hash", + .msg = "33363130363732343432", + .sig = "3045022100a0c30e8026fdb2b4b4968a27d16a6d08f7098f1a98d21620d7454ba9790f1ba602205e470453a8a399f15baf463f9deceb53acc5ca64459149688bd2760c65424339", + .result = .valid, + }, + .{ + .comment = "special case hash", + .msg = "31303534323430373035", + .sig = "30440220614ea84acf736527dd73602cd4bb4eea1dfebebd5ad8aca52aa0228cf7b99a880220737cc85f5f2d2f60d1b8183f3ed490e4de14368e96a9482c2a4dd193195c902f", + .result = .valid, + }, + .{ + .comment = "special case hash", + .msg = "35313734343438313937", + .sig = "3045022100bead6734ebe44b810d3fb2ea00b1732945377338febfd439a8d74dfbd0f942fa02206bb18eae36616a7d3cad35919fd21a8af4bbe7a10f73b3e036a46b103ef56e2a", + .result = .valid, + }, + .{ + .comment = "special case hash", + .msg = "31393637353631323531", + .sig = "30440220499625479e161dacd4db9d9ce64854c98d922cbf212703e9654fae182df9bad2022042c177cf37b8193a0131108d97819edd9439936028864ac195b64fca76d9d693", + .result = .valid, + }, + .{ + .comment = "special case hash", + .msg = "33343437323533333433", + .sig = "3045022008f16b8093a8fb4d66a2c8065b541b3d31e3bfe694f6b89c50fb1aaa6ff6c9b20221009d6455e2d5d1779748573b611cb95d4a21f967410399b39b535ba3e5af81ca2e", + .result = .valid, + }, + .{ + .comment = "special case hash", + .msg = "333638323634333138", + .sig = "3046022100be26231b6191658a19dd72ddb99ed8f8c579b6938d19bce8eed8dc2b338cb5f8022100e1d9a32ee56cffed37f0f22b2dcb57d5c943c14f79694a03b9c5e96952575c89", + .result = .valid, + }, + .{ + .comment = "special case hash", + .msg = "33323631313938363038", + .sig = "3045022015e76880898316b16204ac920a02d58045f36a229d4aa4f812638c455abe0443022100e74d357d3fcb5c8c5337bd6aba4178b455ca10e226e13f9638196506a1939123", + .result = .valid, + }, + .{ + .comment = "special case hash", + .msg = "39363738373831303934", + .sig = "30440220352ecb53f8df2c503a45f9846fc28d1d31e6307d3ddbffc1132315cc07f16dad02201348dfa9c482c558e1d05c5242ca1c39436726ecd28258b1899792887dd0a3c6", + .result = .valid, + }, + .{ + .comment = "special case hash", + .msg = "34393538383233383233", + .sig = "304402204a40801a7e606ba78a0da9882ab23c7677b8642349ed3d652c5bfa5f2a9558fb02203a49b64848d682ef7f605f2832f7384bdc24ed2925825bf8ea77dc5981725782", + .result = .valid, + }, + .{ + .comment = "special case hash", + .msg = "383234363337383337", + .sig = "3045022100eacc5e1a8304a74d2be412b078924b3bb3511bac855c05c9e5e9e44df3d61e9602207451cd8e18d6ed1885dd827714847f96ec4bb0ed4c36ce9808db8f714204f6d1", + .result = .valid, + }, + .{ + .comment = "special case hash", + .msg = "3131303230383333373736", + .sig = "304502202f7a5e9e5771d424f30f67fdab61e8ce4f8cd1214882adb65f7de94c31577052022100ac4e69808345809b44acb0b2bd889175fb75dd050c5a449ab9528f8f78daa10c", + .result = .valid, + }, + .{ + .comment = "special case hash", + .msg = "313333383731363438", + .sig = "3045022100ffcda40f792ce4d93e7e0f0e95e1a2147dddd7f6487621c30a03d710b3300219022079938b55f8a17f7ed7ba9ade8f2065a1fa77618f0b67add8d58c422c2453a49a", + .result = .valid, + }, + .{ + .comment = "special case hash", + .msg = "333232313434313632", + .sig = "304602210081f2359c4faba6b53d3e8c8c3fcc16a948350f7ab3a588b28c17603a431e39a8022100cd6f6a5cc3b55ead0ff695d06c6860b509e46d99fccefb9f7f9e101857f74300", + .result = .valid, + }, + .{ + .comment = "special case hash", + .msg = "3130363836363535353436", + .sig = "3045022100dfc8bf520445cbb8ee1596fb073ea283ea130251a6fdffa5c3f5f2aaf75ca8080220048e33efce147c9dd92823640e338e68bfd7d0dc7a4905b3a7ac711e577e90e7", + .result = .valid, + }, + .{ + .comment = "special case hash", + .msg = "3632313535323436", + .sig = "3046022100ad019f74c6941d20efda70b46c53db166503a0e393e932f688227688ba6a576202210093320eb7ca0710255346bdbb3102cdcf7964ef2e0988e712bc05efe16c199345", + .result = .valid, + }, + .{ + .comment = "special case hash", + .msg = "37303330383138373734", + .sig = "3046022100ac8096842e8add68c34e78ce11dd71e4b54316bd3ebf7fffdeb7bd5a3ebc1883022100f5ca2f4f23d674502d4caf85d187215d36e3ce9f0ce219709f21a3aac003b7a8", + .result = .valid, + }, + .{ + .comment = "special case hash", + .msg = "35393234353233373434", + .sig = "30440220677b2d3a59b18a5ff939b70ea002250889ddcd7b7b9d776854b4943693fb92f702206b4ba856ade7677bf30307b21f3ccda35d2f63aee81efd0bab6972cc0795db55", + .result = .valid, + }, + .{ + .comment = "special case hash", + .msg = "31343935353836363231", + .sig = "30450220479e1ded14bcaed0379ba8e1b73d3115d84d31d4b7c30e1f05e1fc0d5957cfb0022100918f79e35b3d89487cf634a4f05b2e0c30857ca879f97c771e877027355b2443", + .result = .valid, + }, + .{ + .comment = "special case hash", + .msg = "34303035333134343036", + .sig = "3044022043dfccd0edb9e280d9a58f01164d55c3d711e14b12ac5cf3b64840ead512a0a302201dbe33fa8ba84533cd5c4934365b3442ca1174899b78ef9a3199f49584389772", + .result = .valid, + }, + .{ + .comment = "special case hash", + .msg = "33303936343537353132", + .sig = "304402205b09ab637bd4caf0f4c7c7e4bca592fea20e9087c259d26a38bb4085f0bbff11022045b7eb467b6748af618e9d80d6fdcd6aa24964e5a13f885bca8101de08eb0d75", + .result = .valid, + }, + .{ + .comment = "special case hash", + .msg = "32373834303235363230", + .sig = "304502205e9b1c5a028070df5728c5c8af9b74e0667afa570a6cfa0114a5039ed15ee06f022100b1360907e2d9785ead362bb8d7bd661b6c29eeffd3c5037744edaeb9ad990c20", + .result = .valid, + }, + .{ + .comment = "special case hash", + .msg = "32363138373837343138", + .sig = "304502200671a0a85c2b72d54a2fb0990e34538b4890050f5a5712f6d1a7a5fb8578f32e022100db1846bab6b7361479ab9c3285ca41291808f27fd5bd4fdac720e5854713694c", + .result = .valid, + }, + .{ + .comment = "special case hash", + .msg = "31363432363235323632", + .sig = "304402207673f8526748446477dbbb0590a45492c5d7d69859d301abbaedb35b2095103a02203dc70ddf9c6b524d886bed9e6af02e0e4dec0d417a414fed3807ef4422913d7c", + .result = .valid, + }, + .{ + .comment = "special case hash", + .msg = "36383234313839343336", + .sig = "304402207f085441070ecd2bb21285089ebb1aa6450d1a06c36d3ff39dfd657a796d12b50220249712012029870a2459d18d47da9aa492a5e6cb4b2d8dafa9e4c5c54a2b9a8b", + .result = .valid, + }, + .{ + .comment = "special case hash", + .msg = "343834323435343235", + .sig = "3046022100914c67fb61dd1e27c867398ea7322d5ab76df04bc5aa6683a8e0f30a5d287348022100fa07474031481dda4953e3ac1959ee8cea7e66ec412b38d6c96d28f6d37304ea", + .result = .valid, + }, + }, + }, + .{ + .key = "040ad99500288d466940031d72a9f5445a4d43784640855bf0a69874d2de5fe103c5011e6ef2c42dcd50d5d3d29f99ae6eba2c80c9244f4c5422f0979ff0c3ba5e", + .tests = &[_]Test{ + .{ + .comment = "k*G has a large x-coordinate", + .msg = "313233343030", + .sig = "303502104319055358e8617b0c46353d039cdaab022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254e", + .result = .valid, + }, + .{ + .comment = "r too large", + .msg = "313233343030", + .sig = "3046022100ffffffff00000001000000000000000000000000fffffffffffffffffffffffc022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254e", + .result = .invalid, + }, + }, + }, + .{ + .key = "04ab05fd9d0de26b9ce6f4819652d9fc69193d0aa398f0fba8013e09c58220455419235271228c786759095d12b75af0692dd4103f19f6a8c32f49435a1e9b8d45", + .tests = &[_]Test{ + .{ + .comment = "r,s are large", + .msg = "313233343030", + .sig = "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254e", + .result = .valid, + }, + }, + }, + .{ + .key = "0480984f39a1ff38a86a68aa4201b6be5dfbfecf876219710b07badf6fdd4c6c5611feb97390d9826e7a06dfb41871c940d74415ed3cac2089f1445019bb55ed95", + .tests = &[_]Test{ + .{ + .comment = "r and s^-1 have a large Hamming weight", + .msg = "313233343030", + .sig = "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100909135bdb6799286170f5ead2de4f6511453fe50914f3df2de54a36383df8dd4", + .result = .valid, + }, + }, + }, + .{ + .key = "044201b4272944201c3294f5baa9a3232b6dd687495fcc19a70a95bc602b4f7c0595c37eba9ee8171c1bb5ac6feaf753bc36f463e3aef16629572c0c0a8fb0800e", + .tests = &[_]Test{ + .{ + .comment = "r and s^-1 have a large Hamming weight", + .msg = "313233343030", + .sig = "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022027b4577ca009376f71303fd5dd227dcef5deb773ad5f5a84360644669ca249a5", + .result = .valid, + }, + }, + }, + .{ + .key = "04a71af64de5126a4a4e02b7922d66ce9415ce88a4c9d25514d91082c8725ac9575d47723c8fbe580bb369fec9c2665d8e30a435b9932645482e7c9f11e872296b", + .tests = &[_]Test{ + .{ + .comment = "small r and s", + .msg = "313233343030", + .sig = "3006020105020101", + .result = .valid, + }, + }, + }, + .{ + .key = "046627cec4f0731ea23fc2931f90ebe5b7572f597d20df08fc2b31ee8ef16b15726170ed77d8d0a14fc5c9c3c4c9be7f0d3ee18f709bb275eaf2073e258fe694a5", + .tests = &[_]Test{ + .{ + .comment = "small r and s", + .msg = "313233343030", + .sig = "3006020105020103", + .result = .valid, + }, + }, + }, + .{ + .key = "045a7c8825e85691cce1f5e7544c54e73f14afc010cb731343262ca7ec5a77f5bfef6edf62a4497c1bd7b147fb6c3d22af3c39bfce95f30e13a16d3d7b2812f813", + .tests = &[_]Test{ + .{ + .comment = "small r and s", + .msg = "313233343030", + .sig = "3006020105020105", + .result = .valid, + }, + }, + }, + .{ + .key = "04cbe0c29132cd738364fedd603152990c048e5e2fff996d883fa6caca7978c73770af6a8ce44cb41224b2603606f4c04d188e80bff7cc31ad5189d4ab0d70e8c1", + .tests = &[_]Test{ + .{ + .comment = "small r and s", + .msg = "313233343030", + .sig = "3006020105020106", + .result = .valid, + }, + .{ + .comment = "r is larger than n", + .msg = "313233343030", + .sig = "3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632556020106", + .result = .invalid, + }, + }, + }, + .{ + .key = "044be4178097002f0deab68f0d9a130e0ed33a6795d02a20796db83444b037e13920f13051e0eecdcfce4dacea0f50d1f247caa669f193c1b4075b51ae296d2d56", + .tests = &[_]Test{ + .{ + .comment = "s is larger than n", + .msg = "313233343030", + .sig = "3026020105022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc75fbd8", + .result = .invalid, + }, + }, + }, + .{ + .key = "04d0f73792203716afd4be4329faa48d269f15313ebbba379d7783c97bf3e890d9971f4a3206605bec21782bf5e275c714417e8f566549e6bc68690d2363c89cc1", + .tests = &[_]Test{ + .{ + .comment = "small r and s^-1", + .msg = "313233343030", + .sig = "3027020201000221008f1e3c7862c58b16bb76eddbb76eddbb516af4f63f2d74d76e0d28c9bb75ea88", + .result = .valid, + }, + }, + }, + .{ + .key = "044838b2be35a6276a80ef9e228140f9d9b96ce83b7a254f71ccdebbb8054ce05ffa9cbc123c919b19e00238198d04069043bd660a828814051fcb8aac738a6c6b", + .tests = &[_]Test{ + .{ + .comment = "smallish r and s^-1", + .msg = "313233343030", + .sig = "302c02072d9b4d347952d6022100ef3043e7329581dbb3974497710ab11505ee1c87ff907beebadd195a0ffe6d7a", + .result = .valid, + }, + }, + }, + .{ + .key = "047393983ca30a520bbc4783dc9960746aab444ef520c0a8e771119aa4e74b0f64e9d7be1ab01a0bf626e709863e6a486dbaf32793afccf774e2c6cd27b1857526", + .tests = &[_]Test{ + .{ + .comment = "100-bit r and small s^-1", + .msg = "313233343030", + .sig = "3032020d1033e67e37b32b445580bf4eff0221008b748b74000000008b748b748b748b7466e769ad4a16d3dcd87129b8e91d1b4d", + .result = .valid, + }, + }, + }, + .{ + .key = "045ac331a1103fe966697379f356a937f350588a05477e308851b8a502d5dfcdc5fe9993df4b57939b2b8da095bf6d794265204cfe03be995a02e65d408c871c0b", + .tests = &[_]Test{ + .{ + .comment = "small r and 100 bit s^-1", + .msg = "313233343030", + .sig = "302702020100022100ef9f6ba4d97c09d03178fa20b4aaad83be3cf9cb824a879fec3270fc4b81ef5b", + .result = .valid, + }, + }, + }, + .{ + .key = "041d209be8de2de877095a399d3904c74cc458d926e27bb8e58e5eae5767c41509dd59e04c214f7b18dce351fc2a549893a6860e80163f38cc60a4f2c9d040d8c9", + .tests = &[_]Test{ + .{ + .comment = "100-bit r and s^-1", + .msg = "313233343030", + .sig = "3032020d062522bbd3ecbe7c39e93e7c25022100ef9f6ba4d97c09d03178fa20b4aaad83be3cf9cb824a879fec3270fc4b81ef5b", + .result = .valid, + }, + }, + }, + .{ + .key = "04083539fbee44625e3acaafa2fcb41349392cef0633a1b8fabecee0c133b10e99915c1ebe7bf00df8535196770a58047ae2a402f26326bb7d41d4d7616337911e", + .tests = &[_]Test{ + .{ + .comment = "r and s^-1 are close to n", + .msg = "313233343030", + .sig = "3045022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324d50220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70", + .result = .valid, + }, + }, + }, + .{ + .key = "048aeb368a7027a4d64abdea37390c0c1d6a26f399e2d9734de1eb3d0e1937387405bd13834715e1dbae9b875cf07bd55e1b6691c7f7536aef3b19bf7a4adf576d", + .tests = &[_]Test{ + .{ + .comment = "s == 1", + .msg = "313233343030", + .sig = "30250220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70020101", + .result = .valid, + }, + .{ + .comment = "s == 0", + .msg = "313233343030", + .sig = "30250220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70020100", + .result = .invalid, + }, + }, + }, + .{ + .key = "04b533d4695dd5b8c5e07757e55e6e516f7e2c88fa0239e23f60e8ec07dd70f2871b134ee58cc583278456863f33c3a85d881f7d4a39850143e29d4eaf009afe47", + .tests = &[_]Test{ + .{ + .comment = "point at infinity during verify", + .msg = "313233343030", + .sig = "304402207fffffff800000007fffffffffffffffde737d56d38bcf4279dce5617e3192a80220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70", + .result = .invalid, + }, + }, + }, + .{ + .key = "04f50d371b91bfb1d7d14e1323523bc3aa8cbf2c57f9e284de628c8b4536787b86f94ad887ac94d527247cd2e7d0c8b1291c553c9730405380b14cbb209f5fa2dd", + .tests = &[_]Test{ + .{ + .comment = "edge case for signature malleability", + .msg = "313233343030", + .sig = "304402207fffffff800000007fffffffffffffffde737d56d38bcf4279dce5617e3192a902207fffffff800000007fffffffffffffffde737d56d38bcf4279dce5617e3192a8", + .result = .valid, + }, + }, + }, + .{ + .key = "0468ec6e298eafe16539156ce57a14b04a7047c221bafc3a582eaeb0d857c4d94697bed1af17850117fdb39b2324f220a5698ed16c426a27335bb385ac8ca6fb30", + .tests = &[_]Test{ + .{ + .comment = "edge case for signature malleability", + .msg = "313233343030", + .sig = "304402207fffffff800000007fffffffffffffffde737d56d38bcf4279dce5617e3192a902207fffffff800000007fffffffffffffffde737d56d38bcf4279dce5617e3192a9", + .result = .valid, + }, + }, + }, + .{ + .key = "0469da0364734d2e530fece94019265fefb781a0f1b08f6c8897bdf6557927c8b866d2d3c7dcd518b23d726960f069ad71a933d86ef8abbcce8b20f71e2a847002", + .tests = &[_]Test{ + .{ + .comment = "u1 == 1", + .msg = "313233343030", + .sig = "30450220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70022100bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023", + .result = .valid, + }, + }, + }, + .{ + .key = "04d8adc00023a8edc02576e2b63e3e30621a471e2b2320620187bf067a1ac1ff3233e2b50ec09807accb36131fff95ed12a09a86b4ea9690aa32861576ba2362e1", + .tests = &[_]Test{ + .{ + .comment = "u1 == n - 1", + .msg = "313233343030", + .sig = "30440220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70022044a5ad0ad0636d9f12bc9e0a6bdd5e1cbcb012ea7bf091fcec15b0c43202d52e", + .result = .valid, + }, + }, + }, + .{ + .key = "043623ac973ced0a56fa6d882f03a7d5c7edca02cfc7b2401fab3690dbe75ab7858db06908e64b28613da7257e737f39793da8e713ba0643b92e9bb3252be7f8fe", + .tests = &[_]Test{ + .{ + .comment = "u2 == 1", + .msg = "313233343030", + .sig = "30440220555555550000000055555555555555553ef7a8e48d07df81a693439654210c700220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70", + .result = .valid, + }, + }, + }, + .{ + .key = "04cf04ea77e9622523d894b93ff52dc3027b31959503b6fa3890e5e04263f922f1e8528fb7c006b3983c8b8400e57b4ed71740c2f3975438821199bedeaecab2e9", + .tests = &[_]Test{ + .{ + .comment = "u2 == n - 1", + .msg = "313233343030", + .sig = "30450220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70022100aaaaaaaa00000000aaaaaaaaaaaaaaaa7def51c91a0fbf034d26872ca84218e1", + .result = .valid, + }, + }, + }, + .{ + .key = "04db7a2c8a1ab573e5929dc24077b508d7e683d49227996bda3e9f78dbeff773504f417f3bc9a88075c2e0aadd5a13311730cf7cc76a82f11a36eaf08a6c99a206", + .tests = &[_]Test{ + .{ + .comment = "edge case for u1", + .msg = "313233343030", + .sig = "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100e91e1ba60fdedb76a46bcb51dc0b8b4b7e019f0a28721885fa5d3a8196623397", + .result = .valid, + }, + }, + }, + .{ + .key = "04dead11c7a5b396862f21974dc4752fadeff994efe9bbd05ab413765ea80b6e1f1de3f0640e8ac6edcf89cff53c40e265bb94078a343736df07aa0318fc7fe1ff", + .tests = &[_]Test{ + .{ + .comment = "edge case for u1", + .msg = "313233343030", + .sig = "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100fdea5843ffeb73af94313ba4831b53fe24f799e525b1e8e8c87b59b95b430ad9", + .result = .valid, + }, + }, + }, + .{ + .key = "04d0bc472e0d7c81ebaed3a6ef96c18613bb1fea6f994326fbe80e00dfde67c7e9986c723ea4843d48389b946f64ad56c83ad70ff17ba85335667d1bb9fa619efd", + .tests = &[_]Test{ + .{ + .comment = "edge case for u1", + .msg = "313233343030", + .sig = "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022003ffcabf2f1b4d2a65190db1680d62bb994e41c5251cd73b3c3dfc5e5bafc035", + .result = .valid, + }, + }, + }, + .{ + .key = "04a0a44ca947d66a2acb736008b9c08d1ab2ad03776e02640f78495d458dd51c326337fe5cf8c4604b1f1c409dc2d872d4294a4762420df43a30a2392e40426add", + .tests = &[_]Test{ + .{ + .comment = "edge case for u1", + .msg = "313233343030", + .sig = "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02204dfbc401f971cd304b33dfdb17d0fed0fe4c1a88ae648e0d2847f74977534989", + .result = .valid, + }, + }, + }, + .{ + .key = "04c9c2115290d008b45fb65fad0f602389298c25420b775019d42b62c3ce8a96b73877d25a8080dc02d987ca730f0405c2c9dbefac46f9e601cc3f06e9713973fd", + .tests = &[_]Test{ + .{ + .comment = "edge case for u1", + .msg = "313233343030", + .sig = "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100bc4024761cd2ffd43dfdb17d0fed112b988977055cd3a8e54971eba9cda5ca71", + .result = .valid, + }, + }, + }, + .{ + .key = "045eca1ef4c287dddc66b8bccf1b88e8a24c0018962f3c5e7efa83bc1a5ff6033e5e79c4cb2c245b8c45abdce8a8e4da758d92a607c32cd407ecaef22f1c934a71", + .tests = &[_]Test{ + .{ + .comment = "edge case for u1", + .msg = "313233343030", + .sig = "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd0220788048ed39a5ffa77bfb62fa1fda2257742bf35d128fb3459f2a0c909ee86f91", + .result = .valid, + }, + }, + }, + .{ + .key = "045caaa030e7fdf0e4936bc7ab5a96353e0a01e4130c3f8bf22d473e317029a47adeb6adc462f7058f2a20d371e9702254e9b201642005b3ceda926b42b178bef9", + .tests = &[_]Test{ + .{ + .comment = "edge case for u1", + .msg = "313233343030", + .sig = "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd0220476d9131fd381bd917d0fed112bc9e0a5924b5ed5b11167edd8b23582b3cb15e", + .result = .valid, + }, + }, + }, + .{ + .key = "04c2fd20bac06e555bb8ac0ce69eb1ea20f83a1fc3501c8a66469b1a31f619b0986237050779f52b615bd7b8d76a25fc95ca2ed32525c75f27ffc87ac397e6cbaf", + .tests = &[_]Test{ + .{ + .comment = "edge case for u1", + .msg = "313233343030", + .sig = "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd0221008374253e3e21bd154448d0a8f640fe46fafa8b19ce78d538f6cc0a19662d3601", + .result = .valid, + }, + }, + }, + .{ + .key = "043fd6a1ca7f77fb3b0bbe726c372010068426e11ea6ae78ce17bedae4bba86ced03ce5516406bf8cfaab8745eac1cd69018ad6f50b5461872ddfc56e0db3c8ff4", + .tests = &[_]Test{ + .{ + .comment = "edge case for u1", + .msg = "313233343030", + .sig = "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd0220357cfd3be4d01d413c5b9ede36cba5452c11ee7fe14879e749ae6a2d897a52d6", + .result = .valid, + }, + }, + }, + .{ + .key = "049cb8e51e27a5ae3b624a60d6dc32734e4989db20e9bca3ede1edf7b086911114b4c104ab3c677e4b36d6556e8ad5f523410a19f2e277aa895fc57322b4427544", + .tests = &[_]Test{ + .{ + .comment = "edge case for u1", + .msg = "313233343030", + .sig = "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022029798c5c0ee287d4a5e8e6b799fd86b8df5225298e6ffc807cd2f2bc27a0a6d8", + .result = .valid, + }, + }, + }, + .{ + .key = "04a3e52c156dcaf10502620b7955bc2b40bc78ef3d569e1223c262512d8f49602a4a2039f31c1097024ad3cc86e57321de032355463486164cf192944977df147f", + .tests = &[_]Test{ + .{ + .comment = "edge case for u1", + .msg = "313233343030", + .sig = "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02200b70f22c781092452dca1a5711fa3a5a1f72add1bf52c2ff7cae4820b30078dd", + .result = .valid, + }, + }, + }, + .{ + .key = "04f19b78928720d5bee8e670fb90010fb15c37bf91b58a5157c3f3c059b2655e88cf701ec962fb4a11dcf273f5dc357e58468560c7cfeb942d074abd4329260509", + .tests = &[_]Test{ + .{ + .comment = "edge case for u1", + .msg = "313233343030", + .sig = "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022016e1e458f021248a5b9434ae23f474b43ee55ba37ea585fef95c90416600f1ba", + .result = .valid, + }, + }, + }, + .{ + .key = "0483a744459ecdfb01a5cf52b27a05bb7337482d242f235d7b4cb89345545c90a8c05d49337b9649813287de9ffe90355fd905df5f3c32945828121f37cc50de6e", + .tests = &[_]Test{ + .{ + .comment = "edge case for u1", + .msg = "313233343030", + .sig = "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02202252d6856831b6cf895e4f0535eeaf0e5e5809753df848fe760ad86219016a97", + .result = .valid, + }, + }, + }, + .{ + .key = "04dd13c6b34c56982ddae124f039dfd23f4b19bbe88cee8e528ae51e5d6f3a21d7bfad4c2e6f263fe5eb59ca974d039fc0e4c3345692fb5320bdae4bd3b42a45ff", + .tests = &[_]Test{ + .{ + .comment = "edge case for u1", + .msg = "313233343030", + .sig = "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02210081ffe55f178da695b28c86d8b406b15dab1a9e39661a3ae017fbe390ac0972c3", + .result = .valid, + }, + }, + }, + .{ + .key = "0467e6f659cdde869a2f65f094e94e5b4dfad636bbf95192feeed01b0f3deb7460a37e0a51f258b7aeb51dfe592f5cfd5685bbe58712c8d9233c62886437c38ba0", + .tests = &[_]Test{ + .{ + .comment = "edge case for u2", + .msg = "313233343030", + .sig = "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02207fffffffaaaaaaaaffffffffffffffffe9a2538f37b28a2c513dee40fecbb71a", + .result = .valid, + }, + }, + }, + .{ + .key = "042eb6412505aec05c6545f029932087e490d05511e8ec1f599617bb367f9ecaaf805f51efcc4803403f9b1ae0124890f06a43fedcddb31830f6669af292895cb0", + .tests = &[_]Test{ + .{ + .comment = "edge case for u2", + .msg = "313233343030", + .sig = "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100b62f26b5f2a2b26f6de86d42ad8a13da3ab3cccd0459b201de009e526adf21f2", + .result = .valid, + }, + }, + }, + .{ + .key = "0484db645868eab35e3a9fd80e056e2e855435e3a6b68d75a50a854625fe0d7f356d2589ac655edc9a11ef3e075eddda9abf92e72171570ef7bf43a2ee39338cfe", + .tests = &[_]Test{ + .{ + .comment = "edge case for u2", + .msg = "313233343030", + .sig = "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100bb1d9ac949dd748cd02bbbe749bd351cd57b38bb61403d700686aa7b4c90851e", + .result = .valid, + }, + }, + }, + .{ + .key = "0491b9e47c56278662d75c0983b22ca8ea6aa5059b7a2ff7637eb2975e386ad66349aa8ff283d0f77c18d6d11dc062165fd13c3c0310679c1408302a16854ecfbd", + .tests = &[_]Test{ + .{ + .comment = "edge case for u2", + .msg = "313233343030", + .sig = "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022066755a00638cdaec1c732513ca0234ece52545dac11f816e818f725b4f60aaf2", + .result = .valid, + }, + }, + }, + .{ + .key = "04f3ec2f13caf04d0192b47fb4c5311fb6d4dc6b0a9e802e5327f7ec5ee8e4834df97e3e468b7d0db867d6ecfe81e2b0f9531df87efdb47c1338ac321fefe5a432", + .tests = &[_]Test{ + .{ + .comment = "edge case for u2", + .msg = "313233343030", + .sig = "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022055a00c9fcdaebb6032513ca0234ecfffe98ebe492fdf02e48ca48e982beb3669", + .result = .valid, + }, + }, + }, + .{ + .key = "04d92b200aefcab6ac7dafd9acaf2fa10b3180235b8f46b4503e4693c670fccc885ef2f3aebf5b317475336256768f7c19efb7352d27e4cccadc85b6b8ab922c72", + .tests = &[_]Test{ + .{ + .comment = "edge case for u2", + .msg = "313233343030", + .sig = "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100ab40193f9b5d76c064a27940469d9fffd31d7c925fbe05c919491d3057d66cd2", + .result = .valid, + }, + }, + }, + .{ + .key = "040a88361eb92ecca2625b38e5f98bbabb96bf179b3d76fc48140a3bcd881523cde6bdf56033f84a5054035597375d90866aa2c96b86a41ccf6edebf47298ad489", + .tests = &[_]Test{ + .{ + .comment = "edge case for u2", + .msg = "313233343030", + .sig = "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100ca0234ebb5fdcb13ca0234ecffffffffcb0dadbbc7f549f8a26b4408d0dc8600", + .result = .valid, + }, + }, + }, + .{ + .key = "04d0fb17ccd8fafe827e0c1afc5d8d80366e2b20e7f14a563a2ba50469d84375e868612569d39e2bb9f554355564646de99ac602cc6349cf8c1e236a7de7637d93", + .tests = &[_]Test{ + .{ + .comment = "edge case for u2", + .msg = "313233343030", + .sig = "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100bfffffff3ea3677e082b9310572620ae19933a9e65b285598711c77298815ad3", + .result = .valid, + }, + }, + }, + .{ + .key = "04836f33bbc1dc0d3d3abbcef0d91f11e2ac4181076c9af0a22b1e4309d3edb2769ab443ff6f901e30c773867582997c2bec2b0cb8120d760236f3a95bbe881f75", + .tests = &[_]Test{ + .{ + .comment = "edge case for u2", + .msg = "313233343030", + .sig = "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd0220266666663bbbbbbbe6666666666666665b37902e023fab7c8f055d86e5cc41f4", + .result = .valid, + }, + }, + }, + .{ + .key = "0492f99fbe973ed4a299719baee4b432741237034dec8d72ba5103cb33e55feeb8033dd0e91134c734174889f3ebcf1b7a1ac05767289280ee7a794cebd6e69697", + .tests = &[_]Test{ + .{ + .comment = "edge case for u2", + .msg = "313233343030", + .sig = "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100bfffffff36db6db7a492492492492492146c573f4c6dfc8d08a443e258970b09", + .result = .valid, + }, + }, + }, + .{ + .key = "04d35ba58da30197d378e618ec0fa7e2e2d12cffd73ebbb2049d130bba434af09eff83986e6875e41ea432b7585a49b3a6c77cbb3c47919f8e82874c794635c1d2", + .tests = &[_]Test{ + .{ + .comment = "edge case for u2", + .msg = "313233343030", + .sig = "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100bfffffff2aaaaaab7fffffffffffffffc815d0e60b3e596ecb1ad3a27cfd49c4", + .result = .valid, + }, + }, + }, + .{ + .key = "048651ce490f1b46d73f3ff475149be29136697334a519d7ddab0725c8d0793224e11c65bd8ca92dc8bc9ae82911f0b52751ce21dd9003ae60900bd825f590cc28", + .tests = &[_]Test{ + .{ + .comment = "edge case for u2", + .msg = "313233343030", + .sig = "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02207fffffff55555555ffffffffffffffffd344a71e6f651458a27bdc81fd976e37", + .result = .valid, + }, + }, + }, + .{ + .key = "046d8e1b12c831a0da8795650ff95f101ed921d9e2f72b15b1cdaca9826b9cfc6def6d63e2bc5c089570394a4bc9f892d5e6c7a6a637b20469a58c106ad486bf37", + .tests = &[_]Test{ + .{ + .comment = "edge case for u2", + .msg = "313233343030", + .sig = "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02203fffffff800000007fffffffffffffffde737d56d38bcf4279dce5617e3192aa", + .result = .valid, + }, + }, + }, + .{ + .key = "040ae580bae933b4ef2997cbdbb0922328ca9a410f627a0f7dff24cb4d920e15428911e7f8cc365a8a88eb81421a361ccc2b99e309d8dcd9a98ba83c3949d893e3", + .tests = &[_]Test{ + .{ + .comment = "edge case for u2", + .msg = "313233343030", + .sig = "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02205d8ecd64a4eeba466815ddf3a4de9a8e6abd9c5db0a01eb80343553da648428f", + .result = .valid, + }, + }, + }, + .{ + .key = "045b812fd521aafa69835a849cce6fbdeb6983b442d2444fe70e134c027fc46963838a40f2a36092e9004e92d8d940cf5638550ce672ce8b8d4e15eba5499249e9", + .tests = &[_]Test{ + .{ + .comment = "point duplication during verification", + .msg = "313233343030", + .sig = "304502206f2347cab7dd76858fe0555ac3bc99048c4aacafdfb6bcbe05ea6c42c4934569022100bb726660235793aa9957a61e76e00c2c435109cf9a15dd624d53f4301047856b", + .result = .valid, + }, + }, + }, + .{ + .key = "045b812fd521aafa69835a849cce6fbdeb6983b442d2444fe70e134c027fc469637c75bf0c5c9f6d17ffb16d2726bf30a9c7aaf31a8d317472b1ea145ab66db616", + .tests = &[_]Test{ + .{ + .comment = "duplication bug", + .msg = "313233343030", + .sig = "304502206f2347cab7dd76858fe0555ac3bc99048c4aacafdfb6bcbe05ea6c42c4934569022100bb726660235793aa9957a61e76e00c2c435109cf9a15dd624d53f4301047856b", + .result = .invalid, + }, + }, + }, + .{ + .key = "046adda82b90261b0f319faa0d878665a6b6da497f09c903176222c34acfef72a647e6f50dcc40ad5d9b59f7602bb222fad71a41bf5e1f9df4959a364c62e488d9", + .tests = &[_]Test{ + .{ + .comment = "point with x-coordinate 0", + .msg = "313233343030", + .sig = "30250201010220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70", + .result = .invalid, + }, + }, + }, + .{ + .key = "042fca0d0a47914de77ed56e7eccc3276a601120c6df0069c825c8f6a01c9f382065f3450a1d17c6b24989a39beb1c7decfca8384fbdc294418e5d807b3c6ed7de", + .tests = &[_]Test{ + .{ + .comment = "point with x-coordinate 0", + .msg = "313233343030", + .sig = "3045022101000000000000000000000000000000000000000000000000000000000000000002203333333300000000333333333333333325c7cbbc549e52e763f1f55a327a3aa9", + .result = .invalid, + }, + }, + }, + .{ + .key = "04dd86d3b5f4a13e8511083b78002081c53ff467f11ebd98a51a633db76665d25045d5c8200c89f2fa10d849349226d21d8dfaed6ff8d5cb3e1b7e17474ebc18f7", + .tests = &[_]Test{ + .{ + .comment = "comparison with point at infinity ", + .msg = "313233343030", + .sig = "30440220555555550000000055555555555555553ef7a8e48d07df81a693439654210c7002203333333300000000333333333333333325c7cbbc549e52e763f1f55a327a3aa9", + .result = .invalid, + }, + }, + }, + .{ + .key = "044fea55b32cb32aca0c12c4cd0abfb4e64b0f5a516e578c016591a93f5a0fbcc5d7d3fd10b2be668c547b212f6bb14c88f0fecd38a8a4b2c785ed3be62ce4b280", + .tests = &[_]Test{ + .{ + .comment = "extreme value for k and edgecase s", + .msg = "313233343030", + .sig = "304402207cf27b188d034f7e8a52380304b51ac3c08969e277f21b35a60b48fc476699780220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70", + .result = .valid, + }, + }, + }, + .{ + .key = "04c6a771527024227792170a6f8eee735bf32b7f98af669ead299802e32d7c3107bc3b4b5e65ab887bbd343572b3e5619261fe3a073e2ffd78412f726867db589e", + .tests = &[_]Test{ + .{ + .comment = "extreme value for k and s^-1", + .msg = "313233343030", + .sig = "304502207cf27b188d034f7e8a52380304b51ac3c08969e277f21b35a60b48fc47669978022100b6db6db6249249254924924924924924625bd7a09bec4ca81bcdd9f8fd6b63cc", + .result = .valid, + }, + }, + }, + .{ + .key = "04851c2bbad08e54ec7a9af99f49f03644d6ec6d59b207fec98de85a7d15b956efcee9960283045075684b410be8d0f7494b91aa2379f60727319f10ddeb0fe9d6", + .tests = &[_]Test{ + .{ + .comment = "extreme value for k and s^-1", + .msg = "313233343030", + .sig = "304502207cf27b188d034f7e8a52380304b51ac3c08969e277f21b35a60b48fc47669978022100cccccccc00000000cccccccccccccccc971f2ef152794b9d8fc7d568c9e8eaa7", + .result = .valid, + }, + }, + }, + .{ + .key = "04f6417c8a670584e388676949e53da7fc55911ff68318d1bf3061205acb19c48f8f2b743df34ad0f72674acb7505929784779cd9ac916c3669ead43026ab6d43f", + .tests = &[_]Test{ + .{ + .comment = "extreme value for k and s^-1", + .msg = "313233343030", + .sig = "304402207cf27b188d034f7e8a52380304b51ac3c08969e277f21b35a60b48fc4766997802203333333300000000333333333333333325c7cbbc549e52e763f1f55a327a3aaa", + .result = .valid, + }, + }, + }, + .{ + .key = "04501421277be45a5eefec6c639930d636032565af420cf3373f557faa7f8a06438673d6cb6076e1cfcdc7dfe7384c8e5cac08d74501f2ae6e89cad195d0aa1371", + .tests = &[_]Test{ + .{ + .comment = "extreme value for k and s^-1", + .msg = "313233343030", + .sig = "304402207cf27b188d034f7e8a52380304b51ac3c08969e277f21b35a60b48fc47669978022049249248db6db6dbb6db6db6db6db6db5a8b230d0b2b51dcd7ebf0c9fef7c185", + .result = .valid, + }, + }, + }, + .{ + .key = "040d935bf9ffc115a527735f729ca8a4ca23ee01a4894adf0e3415ac84e808bb343195a3762fea29ed38912bd9ea6c4fde70c3050893a4375850ce61d82eba33c5", + .tests = &[_]Test{ + .{ + .comment = "extreme value for k", + .msg = "313233343030", + .sig = "304402207cf27b188d034f7e8a52380304b51ac3c08969e277f21b35a60b48fc47669978022016a4502e2781e11ac82cbc9d1edd8c981584d13e18411e2f6e0478c34416e3bb", + .result = .valid, + }, + }, + }, + .{ + .key = "045e59f50708646be8a589355014308e60b668fb670196206c41e748e64e4dca215de37fee5c97bcaf7144d5b459982f52eeeafbdf03aacbafef38e213624a01de", + .tests = &[_]Test{ + .{ + .comment = "extreme value for k and edgecase s", + .msg = "313233343030", + .sig = "304402206b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2960220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70", + .result = .valid, + }, + }, + }, + .{ + .key = "04169fb797325843faff2f7a5b5445da9e2fd6226f7ef90ef0bfe924104b02db8e7bbb8de662c7b9b1cf9b22f7a2e582bd46d581d68878efb2b861b131d8a1d667", + .tests = &[_]Test{ + .{ + .comment = "extreme value for k and s^-1", + .msg = "313233343030", + .sig = "304502206b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296022100b6db6db6249249254924924924924924625bd7a09bec4ca81bcdd9f8fd6b63cc", + .result = .valid, + }, + }, + }, + .{ + .key = "04271cd89c000143096b62d4e9e4ca885aef2f7023d18affdaf8b7b548981487540a1c6e954e32108435b55fa385b0f76481a609b9149ccb4b02b2ca47fe8e4da5", + .tests = &[_]Test{ + .{ + .comment = "extreme value for k and s^-1", + .msg = "313233343030", + .sig = "304502206b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296022100cccccccc00000000cccccccccccccccc971f2ef152794b9d8fc7d568c9e8eaa7", + .result = .valid, + }, + }, + }, + .{ + .key = "043d0bc7ed8f09d2cb7ddb46ebc1ed799ab1563a9ab84bf524587a220afe499c12e22dc3b3c103824a4f378d96adb0a408abf19ce7d68aa6244f78cb216fa3f8df", + .tests = &[_]Test{ + .{ + .comment = "extreme value for k and s^-1", + .msg = "313233343030", + .sig = "304402206b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29602203333333300000000333333333333333325c7cbbc549e52e763f1f55a327a3aaa", + .result = .valid, + }, + }, + }, + .{ + .key = "04a6c885ade1a4c566f9bb010d066974abb281797fa701288c721bcbd23663a9b72e424b690957168d193a6096fc77a2b004a9c7d467e007e1f2058458f98af316", + .tests = &[_]Test{ + .{ + .comment = "extreme value for k and s^-1", + .msg = "313233343030", + .sig = "304402206b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296022049249248db6db6dbb6db6db6db6db6db5a8b230d0b2b51dcd7ebf0c9fef7c185", + .result = .valid, + }, + }, + }, + .{ + .key = "048d3c2c2c3b765ba8289e6ac3812572a25bf75df62d87ab7330c3bdbad9ebfa5c4c6845442d66935b238578d43aec54f7caa1621d1af241d4632e0b780c423f5d", + .tests = &[_]Test{ + .{ + .comment = "extreme value for k", + .msg = "313233343030", + .sig = "304402206b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296022016a4502e2781e11ac82cbc9d1edd8c981584d13e18411e2f6e0478c34416e3bb", + .result = .valid, + }, + }, + }, + .{ + .key = "046b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2964fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5", + .tests = &[_]Test{ + .{ + .comment = "testing point duplication", + .msg = "313233343030", + .sig = "3045022100bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca6050230220249249246db6db6ddb6db6db6db6db6dad4591868595a8ee6bf5f864ff7be0c2", + .result = .invalid, + }, + .{ + .comment = "testing point duplication", + .msg = "313233343030", + .sig = "3044022044a5ad0ad0636d9f12bc9e0a6bdd5e1cbcb012ea7bf091fcec15b0c43202d52e0220249249246db6db6ddb6db6db6db6db6dad4591868595a8ee6bf5f864ff7be0c2", + .result = .invalid, + }, + }, + }, + .{ + .key = "046b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296b01cbd1c01e58065711814b583f061e9d431cca994cea1313449bf97c840ae0a", + .tests = &[_]Test{ + .{ + .comment = "testing point duplication", + .msg = "313233343030", + .sig = "3045022100bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca6050230220249249246db6db6ddb6db6db6db6db6dad4591868595a8ee6bf5f864ff7be0c2", + .result = .invalid, + }, + .{ + .comment = "testing point duplication", + .msg = "313233343030", + .sig = "3044022044a5ad0ad0636d9f12bc9e0a6bdd5e1cbcb012ea7bf091fcec15b0c43202d52e0220249249246db6db6ddb6db6db6db6db6dad4591868595a8ee6bf5f864ff7be0c2", + .result = .invalid, + }, + }, + }, + .{ + .key = "0404aaec73635726f213fb8a9e64da3b8632e41495a944d0045b522eba7240fad587d9315798aaa3a5ba01775787ced05eaaf7b4e09fc81d6d1aa546e8365d525d", + .tests = &[_]Test{ + .{ + .comment = "pseudorandom signature", + .msg = "", + .sig = "3045022100b292a619339f6e567a305c951c0dcbcc42d16e47f219f9e98e76e09d8770b34a02200177e60492c5a8242f76f07bfe3661bde59ec2a17ce5bd2dab2abebdf89a62e2", + .result = .valid, + }, + .{ + .comment = "pseudorandom signature", + .msg = "4d7367", + .sig = "30450220530bd6b0c9af2d69ba897f6b5fb59695cfbf33afe66dbadcf5b8d2a2a6538e23022100d85e489cb7a161fd55ededcedbf4cc0c0987e3e3f0f242cae934c72caa3f43e9", + .result = .valid, + }, + .{ + .comment = "pseudorandom signature", + .msg = "313233343030", + .sig = "3046022100a8ea150cb80125d7381c4c1f1da8e9de2711f9917060406a73d7904519e51388022100f3ab9fa68bd47973a73b2d40480c2ba50c22c9d76ec217257288293285449b86", + .result = .valid, + }, + .{ + .comment = "pseudorandom signature", + .msg = "0000000000000000000000000000000000000000", + .sig = "3045022100986e65933ef2ed4ee5aada139f52b70539aaf63f00a91f29c69178490d57fb7102203dafedfb8da6189d372308cbf1489bbbdabf0c0217d1c0ff0f701aaa7a694b9c", + .result = .valid, + }, + }, + }, + .{ + .key = "044f337ccfd67726a805e4f1600ae2849df3807eca117380239fbd816900000000ed9dea124cc8c396416411e988c30f427eb504af43a3146cd5df7ea60666d685", + .tests = &[_]Test{ + .{ + .comment = "x-coordinate of the public key has many trailing 0's", + .msg = "4d657373616765", + .sig = "3046022100d434e262a49eab7781e353a3565e482550dd0fd5defa013c7f29745eff3569f10221009b0c0a93f267fb6052fd8077be769c2b98953195d7bc10de844218305c6ba17a", + .result = .valid, + }, + .{ + .comment = "x-coordinate of the public key has many trailing 0's", + .msg = "4d657373616765", + .sig = "304402200fe774355c04d060f76d79fd7a772e421463489221bf0a33add0be9b1979110b0220500dcba1c69a8fbd43fa4f57f743ce124ca8b91a1f325f3fac6181175df55737", + .result = .valid, + }, + .{ + .comment = "x-coordinate of the public key has many trailing 0's", + .msg = "4d657373616765", + .sig = "3045022100bb40bf217bed3fb3950c7d39f03d36dc8e3b2cd79693f125bfd06595ee1135e30220541bf3532351ebb032710bdb6a1bf1bfc89a1e291ac692b3fa4780745bb55677", + .result = .valid, + }, + }, + }, + .{ + .key = "043cf03d614d8939cfd499a07873fac281618f06b8ff87e8015c3f49726500493584fa174d791c72bf2ce3880a8960dd2a7c7a1338a82f85a9e59cdbde80000000", + .tests = &[_]Test{ + .{ + .comment = "y-coordinate of the public key has many trailing 0's", + .msg = "4d657373616765", + .sig = "30440220664eb7ee6db84a34df3c86ea31389a5405badd5ca99231ff556d3e75a233e73a022059f3c752e52eca46137642490a51560ce0badc678754b8f72e51a2901426a1bd", + .result = .valid, + }, + .{ + .comment = "y-coordinate of the public key has many trailing 0's", + .msg = "4d657373616765", + .sig = "304502204cd0429bbabd2827009d6fcd843d4ce39c3e42e2d1631fd001985a79d1fd8b430221009638bf12dd682f60be7ef1d0e0d98f08b7bca77a1a2b869ae466189d2acdabe3", + .result = .valid, + }, + .{ + .comment = "y-coordinate of the public key has many trailing 0's", + .msg = "4d657373616765", + .sig = "3046022100e56c6ea2d1b017091c44d8b6cb62b9f460e3ce9aed5e5fd41e8added97c56c04022100a308ec31f281e955be20b457e463440b4fcf2b80258078207fc1378180f89b55", + .result = .valid, + }, + }, + }, + .{ + .key = "043cf03d614d8939cfd499a07873fac281618f06b8ff87e8015c3f4972650049357b05e8b186e38d41d31c77f5769f22d58385ecc857d07a561a6324217fffffff", + .tests = &[_]Test{ + .{ + .comment = "y-coordinate of the public key has many trailing 1's", + .msg = "4d657373616765", + .sig = "304402201158a08d291500b4cabed3346d891eee57c176356a2624fb011f8fbbf34668300220228a8c486a736006e082325b85290c5bc91f378b75d487dda46798c18f285519", + .result = .valid, + }, + .{ + .comment = "y-coordinate of the public key has many trailing 1's", + .msg = "4d657373616765", + .sig = "3045022100b1db9289649f59410ea36b0c0fc8d6aa2687b29176939dd23e0dde56d309fa9d02203e1535e4280559015b0dbd987366dcf43a6d1af5c23c7d584e1c3f48a1251336", + .result = .valid, + }, + .{ + .comment = "y-coordinate of the public key has many trailing 1's", + .msg = "4d657373616765", + .sig = "3046022100b7b16e762286cb96446aa8d4e6e7578b0a341a79f2dd1a220ac6f0ca4e24ed86022100ddc60a700a139b04661c547d07bbb0721780146df799ccf55e55234ecb8f12bc", + .result = .valid, + }, + }, + }, + .{ + .key = "042829c31faa2e400e344ed94bca3fcd0545956ebcfe8ad0f6dfa5ff8effffffffa01aafaf000e52585855afa7676ade284113099052df57e7eb3bd37ebeb9222e", + .tests = &[_]Test{ + .{ + .comment = "x-coordinate of the public key has many trailing 1's", + .msg = "4d657373616765", + .sig = "3045022100d82a7c2717261187c8e00d8df963ff35d796edad36bc6e6bd1c91c670d9105b402203dcabddaf8fcaa61f4603e7cbac0f3c0351ecd5988efb23f680d07debd139929", + .result = .valid, + }, + .{ + .comment = "x-coordinate of the public key has many trailing 1's", + .msg = "4d657373616765", + .sig = "304402205eb9c8845de68eb13d5befe719f462d77787802baff30ce96a5cba063254af7802202c026ae9be2e2a5e7ca0ff9bbd92fb6e44972186228ee9a62b87ddbe2ef66fb5", + .result = .valid, + }, + .{ + .comment = "x-coordinate of the public key has many trailing 1's", + .msg = "4d657373616765", + .sig = "304602210096843dd03c22abd2f3b782b170239f90f277921becc117d0404a8e4e36230c28022100f2be378f526f74a543f67165976de9ed9a31214eb4d7e6db19e1ede123dd991d", + .result = .valid, + }, + }, + }, + .{ + .key = "04fffffff948081e6a0458dd8f9e738f2665ff9059ad6aac0708318c4ca9a7a4f55a8abcba2dda8474311ee54149b973cae0c0fb89557ad0bf78e6529a1663bd73", + .tests = &[_]Test{ + .{ + .comment = "x-coordinate of the public key is large", + .msg = "4d657373616765", + .sig = "30440220766456dce1857c906f9996af729339464d27e9d98edc2d0e3b760297067421f60220402385ecadae0d8081dccaf5d19037ec4e55376eced699e93646bfbbf19d0b41", + .result = .valid, + }, + .{ + .comment = "x-coordinate of the public key is large", + .msg = "4d657373616765", + .sig = "3046022100c605c4b2edeab20419e6518a11b2dbc2b97ed8b07cced0b19c34f777de7b9fd9022100edf0f612c5f46e03c719647bc8af1b29b2cde2eda700fb1cff5e159d47326dba", + .result = .valid, + }, + .{ + .comment = "x-coordinate of the public key is large", + .msg = "4d657373616765", + .sig = "3046022100d48b68e6cabfe03cf6141c9ac54141f210e64485d9929ad7b732bfe3b7eb8a84022100feedae50c61bd00e19dc26f9b7e2265e4508c389109ad2f208f0772315b6c941", + .result = .valid, + }, + }, + }, + .{ + .key = "0400000003fa15f963949d5f03a6f5c7f86f9e0015eeb23aebbff1173937ba748e1099872070e8e87c555fa13659cca5d7fadcfcb0023ea889548ca48af2ba7e71", + .tests = &[_]Test{ + .{ + .comment = "x-coordinate of the public key is small", + .msg = "4d657373616765", + .sig = "3046022100b7c81457d4aeb6aa65957098569f0479710ad7f6595d5874c35a93d12a5dd4c7022100b7961a0b652878c2d568069a432ca18a1a9199f2ca574dad4b9e3a05c0a1cdb3", + .result = .valid, + }, + .{ + .comment = "x-coordinate of the public key is small", + .msg = "4d657373616765", + .sig = "304402206b01332ddb6edfa9a30a1321d5858e1ee3cf97e263e669f8de5e9652e76ff3f702205939545fced457309a6a04ace2bd0f70139c8f7d86b02cb1cc58f9e69e96cd5a", + .result = .valid, + }, + .{ + .comment = "x-coordinate of the public key is small", + .msg = "4d657373616765", + .sig = "3046022100efdb884720eaeadc349f9fc356b6c0344101cd2fd8436b7d0e6a4fb93f106361022100f24bee6ad5dc05f7613975473aadf3aacba9e77de7d69b6ce48cb60d8113385d", + .result = .valid, + }, + }, + }, + .{ + .key = "04bcbb2914c79f045eaa6ecbbc612816b3be5d2d6796707d8125e9f851c18af015000000001352bb4a0fa2ea4cceb9ab63dd684ade5a1127bcf300a698a7193bc2", + .tests = &[_]Test{ + .{ + .comment = "y-coordinate of the public key is small", + .msg = "4d657373616765", + .sig = "3044022031230428405560dcb88fb5a646836aea9b23a23dd973dcbe8014c87b8b20eb0702200f9344d6e812ce166646747694a41b0aaf97374e19f3c5fb8bd7ae3d9bd0beff", + .result = .valid, + }, + .{ + .comment = "y-coordinate of the public key is small", + .msg = "4d657373616765", + .sig = "3046022100caa797da65b320ab0d5c470cda0b36b294359c7db9841d679174db34c4855743022100cf543a62f23e212745391aaf7505f345123d2685ee3b941d3de6d9b36242e5a0", + .result = .valid, + }, + .{ + .comment = "y-coordinate of the public key is small", + .msg = "4d657373616765", + .sig = "304502207e5f0ab5d900d3d3d7867657e5d6d36519bc54084536e7d21c336ed8001859450221009450c07f201faec94b82dfb322e5ac676688294aad35aa72e727ff0b19b646aa", + .result = .valid, + }, + }, + }, + .{ + .key = "04bcbb2914c79f045eaa6ecbbc612816b3be5d2d6796707d8125e9f851c18af015fffffffeecad44b6f05d15b33146549c2297b522a5eed8430cff596758e6c43d", + .tests = &[_]Test{ + .{ + .comment = "y-coordinate of the public key is large", + .msg = "4d657373616765", + .sig = "3046022100d7d70c581ae9e3f66dc6a480bf037ae23f8a1e4a2136fe4b03aa69f0ca25b35602210089c460f8a5a5c2bbba962c8a3ee833a413e85658e62a59e2af41d9127cc47224", + .result = .valid, + }, + .{ + .comment = "y-coordinate of the public key is large", + .msg = "4d657373616765", + .sig = "30440220341c1b9ff3c83dd5e0dfa0bf68bcdf4bb7aa20c625975e5eeee34bb396266b34022072b69f061b750fd5121b22b11366fad549c634e77765a017902a67099e0a4469", + .result = .valid, + }, + .{ + .comment = "y-coordinate of the public key is large", + .msg = "4d657373616765", + .sig = "3045022070bebe684cdcb5ca72a42f0d873879359bd1781a591809947628d313a3814f67022100aec03aca8f5587a4d535fa31027bbe9cc0e464b1c3577f4c2dcde6b2094798a9", + .result = .valid, + }, + }, + }, +}; diff --git a/lib/std/crypto/testdata/id_rsa.der b/lib/std/crypto/testdata/id_rsa.der new file mode 100644 index 0000000000000000000000000000000000000000..9e4f1334d16264ca8accea1d9f7212da6a14554a GIT binary patch literal 1191 zcmV;Y1X%kpf&`-i0RRGm0RaHSfHnrY=SOP@lmzUjwvhxs_maFB?)!ao*QgBu9(zkV zO6Cvfz;XO@=K@R(y!5@%9XV^da7IcK=}P!L^Wh0uRC~!)`#~+Ec2W`H^W1lAs#7;^ z$~x@6!>YGCG1Y9gQk;O8yvg7w7~%`}_@Fxd7X(nA&Uw9`Iq~Xg>_?X_gAcXJmEM)1 z<^&?u?!HoaRH5g;iiY+^Z4I9ml^RU`K|Im+mAD~hY(e&`u&UtVtGUCd4b^x|AUT0|5X50)hbmVS71J9cG^gdO7qra{M0j{KnM;d)X4|Dh$$5 zpuK)<(|%N=kJIS5RL4bJb#zDd;>Vn{)X3fy;mX=(OjWQ=^8)r|>p{8`>I2BL7G&f4 zTJ9uTTbuWvdjpoOPq1k)g+g{=Rb*1Z;Uaedc>>;gWfTSv__%efoKYgOC)y9G5#U>) zX4nJos0`bTLHEODsw7TAd zZaNEJYbv|;_HfEL^^x7ZFckyx4;#r{Io*=6Z9}3uriSet?;rJ}1Dtq0BZU5Hi zQ2$bCHjw`G*=@EQ{sO+TQM3ZngpvmKZIi)B<^5nTWPodhAR8k0Hx zRF$oWcryh&arHHJi6s7g-`0Dx>>O0zV}G!2mkbOQ-yu{=4O|BV%p8Sr{rQ_^#~t`> zf?9e9bV^_}9}jMUVFxw}5)x&pGh02vD*60E<8!x0uv>GxJM5R&>2$QQ4Tt~%+};}5 z0)c=)%%UKzS~2V}a|gnxjvGVeIuV_4^!R_w=;DyFwofV-Q6uIo%d2X5fjbKeVWjqAX@$;2c6-1ooGbC%q?qgq z&ubOB)zcw4OL0tehSLK07lV!!1Rl;&ya=HJfq*-h@&u~`pTO^q@QyjGbrp)>GZQdH zcz7kX1Vj5y4#LIWXWtXaiHK{S62>>_jGa;(zih-YEkAhHYt}#X2GJeI?Z^wED){4A z(W%+sitXpW`9b2KDu2r)_+LLHh&*l-n*lh1Z!PcJ-#DyiQth7%Jy~5wD5a_T5y=1u F(f{FrO=AE6 literal 0 HcmV?d00001 diff --git a/lib/std/crypto/tls/Client.zig b/lib/std/crypto/tls/Client.zig index 682c1ffe0ebb..0d53f5a5095d 100644 --- a/lib/std/crypto/tls/Client.zig +++ b/lib/std/crypto/tls/Client.zig @@ -1,5 +1,6 @@ const std = @import("../../std.zig"); const tls = std.crypto.tls; +const rsa = std.crypto.rsa; const Client = @This(); const net = std.net; const mem = std.mem; @@ -89,50 +90,38 @@ pub const StreamInterface = struct { }; pub fn InitError(comptime Stream: type) type { - return std.mem.Allocator.Error || Stream.WriteError || Stream.ReadError || tls.AlertDescription.Error || error{ + return std.mem.Allocator.Error || Stream.WriteError || Stream.ReadError || tls.AlertDescription.Error || Certificate.Parsed.VerifyError || @import("../der.zig").Parser.Error || crypto.sign.ecdsa.EcdsaP256Sha256.Signature.FromDerError || error{ InsufficientEntropy, - DiskQuota, - LockViolation, - NotOpenForWriting, + TlsRecordOverflow, + TlsConnectionTruncated, + TlsDecodeError, TlsUnexpectedMessage, TlsIllegalParameter, TlsDecryptFailure, - TlsRecordOverflow, TlsBadRecordMac, - CertificateFieldHasInvalidLength, - CertificateHostMismatch, - CertificatePublicKeyInvalid, - CertificateExpired, - CertificateFieldHasWrongDataType, - CertificateIssuerMismatch, - CertificateNotYetValid, - CertificateSignatureAlgorithmMismatch, - CertificateSignatureAlgorithmUnsupported, - CertificateSignatureInvalid, - CertificateSignatureInvalidLength, - CertificateSignatureNamedCurveUnsupported, - CertificateSignatureUnsupportedBitCount, - TlsCertificateNotVerified, - TlsBadSignatureScheme, - TlsBadRsaSignatureBitCount, - InvalidEncoding, - IdentityElement, - SignatureVerificationFailed, TlsDecryptError, - TlsConnectionTruncated, - TlsDecodeError, UnsupportedCertificateVersion, CertificateTimeInvalid, CertificateHasUnrecognizedObjectId, CertificateHasInvalidBitString, - MessageTooLong, - NegativeIntoUnsigned, - TargetTooSmall, - BufferTooSmall, - InvalidSignature, - NotSquare, + CertificateHostMismatch, + TlsCertificateNotVerified, + TlsBadSignatureScheme, + InvalidEncoding, NonCanonical, + IdentityElement, + SignatureVerificationFailed, WeakPublicKey, + NotSquare, + Modulus, + EvenModulus, + ModulusTooSmall, + Exponent, + UnsupportedBitCount, + Inconsistent, + InvalidSignatureLength, + NullExponent, + InsecureBitCount, }; } @@ -609,20 +598,9 @@ pub fn init(stream: anytype, ca_bundle: Certificate.Bundle, host: []const u8) In return error.TlsBadSignatureScheme; const Hash = SchemeHash(comptime_scheme); - const rsa = Certificate.rsa; - const components = try rsa.PublicKey.parseDer(main_cert_pub_key); - const exponent = components.exponent; - const modulus = components.modulus; - switch (modulus.len) { - inline 128, 256, 512 => |modulus_len| { - const key = try rsa.PublicKey.fromBytes(exponent, modulus); - const sig = rsa.PSSSignature.fromBytes(modulus_len, encoded_sig); - try rsa.PSSSignature.verify(modulus_len, sig, verify_bytes, key, Hash); - }, - else => { - return error.TlsBadRsaSignatureBitCount; - }, - } + const pk = try rsa.PublicKey.fromDer(main_cert_pub_key); + const sig = rsa.Pss(Hash).Signature{ .bytes = encoded_sig }; + try sig.verify(verify_bytes, pk, null); }, inline .ed25519 => |comptime_scheme| { if (main_cert_pub_key_algo != .curveEd25519) return error.TlsBadSignatureScheme;