diff --git a/lib/src/base64.dart b/lib/src/base64.dart new file mode 100644 index 0000000..527fc02 --- /dev/null +++ b/lib/src/base64.dart @@ -0,0 +1,145 @@ +/// Base64 decoding as Go's encoding/base64, with its strict mode and the +/// offset of its errors (CorruptInputError): the alphabet of age, of the +/// DateKey and of the other encodings of the protocol is decoded with the +/// same acceptance and the same error texts as the Go reference. +/// +/// Internal: lib/datekeys.dart does not export it. +library; + +import 'dart:typed_data'; + +/// Bytes that Go's base64 rejects: its CorruptInputError, with the text +/// `illegal base64 data at input byte N`. +final class Base64Exception implements Exception { + /// The error at byte [offset] of the input. + const Base64Exception(this.offset); + + /// The offset that Go reports. + final int offset; + + /// The text of Go's error. + String get message => 'illegal base64 data at input byte $offset'; + + @override + String toString() => message; +} + +const _std = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; +const _url = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_'; + +Int16List _decodeMap(String alphabet) { + final m = Int16List(256)..fillRange(0, 256, -1); + for (var i = 0; i < alphabet.length; i++) { + m[alphabet.codeUnitAt(i)] = i; + } + return m; +} + +final Int16List _stdMap = _decodeMap(_std); +final Int16List _urlMap = _decodeMap(_url); + +bool _isNewline(int c) => c == 0x0a || c == 0x0d; + +/// Decodes [src] as Go's base64 Encoding of the standard alphabet, or the +/// URL one when [url], with `=` padding when [padded], and in Go's strict +/// mode, which rejects non-zero trailing bits, when [strict]. As in Go, CR +/// and LF anywhere are skipped. Throws a [Base64Exception] with Go's offset. +Uint8List goBase64Decode( + List src, { + bool url = false, + bool padded = true, + bool strict = false, +}) { + final map = url ? _urlMap : _stdMap; + final out = BytesBuilder(copy: false); + final q = Int32List(4); + var si = 0; + while (si < src.length) { + // Go's decodeQuantum. + var dlen = 4; + int? trailing; + var j = 0; + for (; j < 4; j++) { + if (si == src.length) { + if (j == 0) return out.takeBytes(); + if (j == 1 || padded) throw Base64Exception(si - j); + dlen = j; + break; + } + final c = src[si++]; + final v = c >= 0 && c < 256 ? map[c] : -1; + if (v >= 0) { + q[j] = v; + continue; + } + if (_isNewline(c)) { + j--; + continue; + } + if (!padded || c != 0x3d) throw Base64Exception(si - 1); + // The end, with padding. + if (j < 2) throw Base64Exception(si - 1); + if (j == 2) { + // "==" is expected, the first "=" is already consumed. + while (si < src.length && _isNewline(src[si])) { + si++; + } + if (si == src.length) throw Base64Exception(src.length); + if (src[si] != 0x3d) throw Base64Exception(si - 1); + si++; + } + while (si < src.length && _isNewline(src[si])) { + si++; + } + if (si < src.length) trailing = si; + dlen = j; + break; + } + for (var k = dlen; k < 4; k++) { + q[k] = 0; + } + final b0 = q[0] << 2 | q[1] >> 4; + final b1 = (q[1] & 15) << 4 | q[2] >> 2; + final b2 = (q[2] & 3) << 6 | q[3]; + if (strict && dlen == 3 && b2 != 0) throw Base64Exception(si - 1); + if (strict && dlen == 2 && (b1 != 0 || b2 != 0)) { + throw Base64Exception(si - 2); + } + final bytes = [b0, b1, b2]; + out.add(Uint8List.fromList(bytes.sublist(0, dlen - 1))); + if (trailing != null) throw Base64Exception(trailing); + } + return out.takeBytes(); +} + +/// Encodes [bytes] in Base64 as Go's Encoding: the standard alphabet, or the +/// URL one when [url], with `=` padding when [padded]. +String goBase64Encode(List bytes, {bool url = false, bool padded = true}) { + final alphabet = url ? _url : _std; + final out = StringBuffer(); + var i = 0; + for (; i + 3 <= bytes.length; i += 3) { + final v = bytes[i] << 16 | bytes[i + 1] << 8 | bytes[i + 2]; + out + ..write(alphabet[v >> 18]) + ..write(alphabet[v >> 12 & 63]) + ..write(alphabet[v >> 6 & 63]) + ..write(alphabet[v & 63]); + } + final rest = bytes.length - i; + if (rest == 1) { + final v = bytes[i] << 16; + out + ..write(alphabet[v >> 18]) + ..write(alphabet[v >> 12 & 63]); + if (padded) out.write('=='); + } else if (rest == 2) { + final v = bytes[i] << 16 | bytes[i + 1] << 8; + out + ..write(alphabet[v >> 18]) + ..write(alphabet[v >> 12 & 63]) + ..write(alphabet[v >> 6 & 63]); + if (padded) out.write('='); + } + return out.toString(); +} diff --git a/lib/src/bech32.dart b/lib/src/bech32.dart new file mode 100644 index 0000000..c2ebb18 --- /dev/null +++ b/lib/src/bech32.dart @@ -0,0 +1,192 @@ +/// Bech32 (BIP 173) as the internal/bech32 package of filippo.io/age v1.3.2, +/// which datekeys-go copies verbatim as codec/bech32: the encoding of the age +/// X25519 identities (AGE-SECRET-KEY-1…) and recipients (age1…). An +/// encoding, not cryptography. Like age, it accepts strings longer than the +/// 90 characters of BIP 173. +/// +/// Ported from internal/bech32 of filippo.io/age v1.3.2 +/// (https://github.com/FiloSottile/age), under its license: +/// +/// Copyright (c) 2017 Takatoshi Nakagawa +/// Copyright (c) 2019 The age Authors +/// +/// Permission is hereby granted, free of charge, to any person obtaining a +/// copy of this software and associated documentation files (the +/// "Software"), to deal in the Software without restriction, including +/// without limitation the rights to use, copy, modify, merge, publish, +/// distribute, sublicense, and/or sell copies of the Software, and to +/// permit persons to whom the Software is furnished to do so, subject to +/// the following conditions: +/// +/// The above copyright notice and this permission notice shall be included +/// in all copies or substantial portions of the Software. +/// +/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +/// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +/// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +/// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +/// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +/// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +/// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +/// +/// Go strings are bytes: the positions in the error texts are offsets in the +/// UTF-8 of the string, as in Go. The mixed-case check of a string to decode +/// folds it with the Unicode case mapping of the platform, as Go does with +/// its own tables; they differ only for the few characters whose case +/// mapping is not one to one, which Bech32 rejects anyway, maybe with +/// another text. +/// +/// Internal: lib/datekeys.dart does not export it. +library; + +import 'dart:typed_data'; + +import 'bytes.dart'; + +/// A string or data that Bech32 rejects, with the text of age's error. +final class Bech32Exception implements Exception { + /// An exception with age's [message]. + const Bech32Exception(this.message); + + /// The text of age's error. + final String message; + + @override + String toString() => message; +} + +const _charset = 'qpzry9x8gf2tvdw0s3jn54khce6mua7l'; +const _generator = [0x3b6a57b2, 0x26508e6d, 0x1ea119fa, 0x3d4233dd, 0x2a1462b3]; + +int _polymod(List values) { + var chk = 1; + for (final v in values) { + final top = chk >>> 25; + chk = ((chk & 0x1ffffff) << 5) ^ v; + for (var i = 0; i < 5; i++) { + if ((top >>> i) & 1 == 1) chk ^= _generator[i]; + } + } + return chk; +} + +String _lowerAscii(String s) => String.fromCharCodes([ + for (final c in s.codeUnits) c >= 0x41 && c <= 0x5a ? c + 0x20 : c, +]); + +String _upperAscii(String s) => String.fromCharCodes([ + for (final c in s.codeUnits) c >= 0x61 && c <= 0x7a ? c - 0x20 : c, +]); + +List _hrpExpand(String hrp) { + final h = utf8Bytes(_lowerAscii(hrp)); + return [for (final c in h) c >> 5, 0, for (final c in h) c & 31]; +} + +List _convertBits(List data, int from, int to, bool pad) { + final out = []; + var acc = 0; + var bits = 0; + final maxv = (1 << to) - 1; + for (var idx = 0; idx < data.length; idx++) { + final value = data[idx]; + if (value >> from != 0) { + throw Bech32Exception( + 'invalid data range: data[$idx]=$value (frombits=$from)', + ); + } + // Go keeps acc in a uint32; only its low bits are ever read. + acc = ((acc << from) | value) & 0xffffff; + bits += from; + while (bits >= to) { + bits -= to; + out.add((acc >> bits) & maxv); + } + } + if (pad) { + if (bits > 0) out.add((acc << (to - bits)) & maxv); + } else if (bits >= from) { + throw const Bech32Exception('illegal zero padding'); + } else if ((acc << (to - bits)) & maxv != 0) { + throw const Bech32Exception('non-zero padding'); + } + return out; +} + +/// Encodes [hrp] and [data] in Bech32, as age's bech32.Encode: an uppercase +/// HRP gives an uppercase string. +String bech32Encode(String hrp, List data) { + final values = _convertBits(data, 8, 5, true); + final h = utf8Bytes(hrp); + if (h.isEmpty) throw Bech32Exception('invalid HRP: ${goQuote(h)}'); + for (var p = 0; p < h.length;) { + final (c, size) = decodeRune(h, p); + if (c < 33 || c > 126) { + throw Bech32Exception('invalid HRP character: hrp[$p]=$c'); + } + p += size; + } + if (_upperAscii(hrp) != hrp && _lowerAscii(hrp) != hrp) { + throw Bech32Exception('mixed case HRP: ${goQuote(h)}'); + } + final lower = _lowerAscii(hrp) == hrp; + final lh = _lowerAscii(hrp); + final mod = _polymod([..._hrpExpand(lh), ...values, 0, 0, 0, 0, 0, 0]) ^ 1; + final out = StringBuffer(lh)..write('1'); + for (final v in values) { + out.write(_charset[v]); + } + for (var p = 0; p < 6; p++) { + out.write(_charset[(mod >>> (5 * (5 - p))) & 31]); + } + final s = out.toString(); + return lower ? s : _upperAscii(s); +} + +/// Decodes the Bech32 string [s], as age's bech32.Decode: the HRP keeps the +/// case of the string. +({String hrp, Uint8List data}) bech32Decode(String s) { + // Go compares the string with its Unicode lower and upper case. + if (s.toLowerCase() != s && s.toUpperCase() != s) { + throw const Bech32Exception('mixed case'); + } + final b = utf8Bytes(s); + final pos = b.lastIndexOf(0x31); + if (pos < 1 || pos + 7 > b.length) { + throw Bech32Exception( + "separator '1' at invalid position: pos=$pos, len=${b.length}", + ); + } + final hrp = Uint8List.sublistView(b, 0, pos); + for (var p = 0; p < hrp.length;) { + final (c, size) = decodeRune(hrp, p); + if (c < 33 || c > 126) { + throw Bech32Exception('invalid character human-readable part: s[$p]=$c'); + } + p += size; + } + final rest = Uint8List.sublistView(b, pos + 1); + final data = []; + for (var p = 0; p < rest.length;) { + var (c, size) = decodeRune(rest, p); + // Fold ASCII explicitly, as age does. + if (c >= 0x41 && c <= 0x5a) c += 0x20; + final d = c < 0x80 ? _charset.indexOf(String.fromCharCode(c)) : -1; + if (d == -1) { + throw Bech32Exception('invalid character data part: s[$p]=$c'); + } + data.add(d); + p += size; + } + if (data.length < 6) throw const Bech32Exception('data part too short'); + final hrpString = String.fromCharCodes(hrp); + if (_polymod([..._hrpExpand(hrpString), ...data]) != 1) { + throw const Bech32Exception('invalid checksum'); + } + return ( + hrp: hrpString, + data: Uint8List.fromList( + _convertBits(data.sublist(0, data.length - 6), 5, 8, false), + ), + ); +} diff --git a/lib/src/chacha20poly1305.dart b/lib/src/chacha20poly1305.dart new file mode 100644 index 0000000..353ceca --- /dev/null +++ b/lib/src/chacha20poly1305.dart @@ -0,0 +1,537 @@ +/// ChaCha20, Poly1305 and the AEAD ChaCha20-Poly1305 of RFC 8439, which age +/// uses to wrap file keys and for its STREAM. +/// +/// The arithmetic is exact on the VM and when compiled to JavaScript: +/// - ChaCha20 adds two 32-bit words at a time and masks the sum, and its +/// rotations are of 32-bit values, so that the 32-bit bit operators of the +/// web give what the 64-bit ones of the VM give; +/// - Poly1305 keeps its accumulator and r in ten limbs of 13 bits. A product +/// of a limb of h (below 2^15) and one of 5·r (below 2^16) is below 2^31, +/// and a sum of ten of them and a carry is below 2^35: far from 2^53, where +/// a double stops being exact. The carries of those sums, which may pass +/// 2^32, are taken with `~/` and the low bits with `&`, never with a shift +/// of a value above 2^32, which the web would truncate. +/// +/// The tag is compared in constant time. The rest is written without +/// branches or indexes that depend on secrets, but neither the VM nor a +/// JavaScript engine promises constant time. +/// +/// Internal: lib/datekeys.dart does not export it. +library; + +import 'dart:typed_data'; + +const _mask32 = 0xffffffff; + +/// The size of a ChaCha20 key. +const chachaKeySize = 32; + +/// The size of the nonce of ChaCha20-Poly1305 (RFC 8439). +const chachaNonceSize = 12; + +/// The size of a Poly1305 tag, the overhead of ChaCha20-Poly1305. +const poly1305TagSize = 16; + +// --------------------------------------------------------------------------- +// ChaCha20 + +int _le32(List b, int o) => + b[o] | b[o + 1] << 8 | b[o + 2] << 16 | (b[o + 3] << 24 & _mask32); + +/// The ChaCha20 keystream of RFC 8439, 2.4: [key] (32 bytes), [nonce] (12 +/// bytes) and the block counter from [counter]. +final class ChaCha20 { + /// The cipher of [key] and [nonce], from block [counter]. + ChaCha20(List key, List nonce, [int counter = 0]) { + if (key.length != chachaKeySize) { + throw ArgumentError.value(key.length, 'key', 'not 32 bytes'); + } + if (nonce.length != chachaNonceSize) { + throw ArgumentError.value(nonce.length, 'nonce', 'not 12 bytes'); + } + if (counter < 0 || counter > _mask32) { + throw RangeError.range(counter, 0, _mask32, 'counter'); + } + _input[0] = 0x61707865; + _input[1] = 0x3320646e; + _input[2] = 0x79622d32; + _input[3] = 0x6b206574; + for (var i = 0; i < 8; i++) { + _input[4 + i] = _le32(key, 4 * i); + } + _input[12] = counter; + for (var i = 0; i < 3; i++) { + _input[13 + i] = _le32(nonce, 4 * i); + } + } + + final Uint32List _input = Uint32List(16); + final Uint32List _x = Uint32List(16); + final Uint8List _stream = Uint8List(64); + int _used = 64; + bool _overflow = false; + + // The next 64 bytes of keystream into _stream, and the counter advanced. + void _block() { + // Go's chacha20 refuses a block past counter 2^32 - 1, which RFC 8439 + // leaves undefined. + if (_overflow) throw StateError('chacha20: counter overflow'); + final s = _input; + var x0 = s[0], x1 = s[1], x2 = s[2], x3 = s[3]; + var x4 = s[4], x5 = s[5], x6 = s[6], x7 = s[7]; + var x8 = s[8], x9 = s[9], x10 = s[10], x11 = s[11]; + var x12 = s[12], x13 = s[13], x14 = s[14], x15 = s[15]; + for (var i = 0; i < 10; i++) { + // Column rounds. + x0 = (x0 + x4) & _mask32; + x12 ^= x0; + x12 = (x12 << 16 & _mask32) | x12 >>> 16; + x8 = (x8 + x12) & _mask32; + x4 ^= x8; + x4 = (x4 << 12 & _mask32) | x4 >>> 20; + x0 = (x0 + x4) & _mask32; + x12 ^= x0; + x12 = (x12 << 8 & _mask32) | x12 >>> 24; + x8 = (x8 + x12) & _mask32; + x4 ^= x8; + x4 = (x4 << 7 & _mask32) | x4 >>> 25; + + x1 = (x1 + x5) & _mask32; + x13 ^= x1; + x13 = (x13 << 16 & _mask32) | x13 >>> 16; + x9 = (x9 + x13) & _mask32; + x5 ^= x9; + x5 = (x5 << 12 & _mask32) | x5 >>> 20; + x1 = (x1 + x5) & _mask32; + x13 ^= x1; + x13 = (x13 << 8 & _mask32) | x13 >>> 24; + x9 = (x9 + x13) & _mask32; + x5 ^= x9; + x5 = (x5 << 7 & _mask32) | x5 >>> 25; + + x2 = (x2 + x6) & _mask32; + x14 ^= x2; + x14 = (x14 << 16 & _mask32) | x14 >>> 16; + x10 = (x10 + x14) & _mask32; + x6 ^= x10; + x6 = (x6 << 12 & _mask32) | x6 >>> 20; + x2 = (x2 + x6) & _mask32; + x14 ^= x2; + x14 = (x14 << 8 & _mask32) | x14 >>> 24; + x10 = (x10 + x14) & _mask32; + x6 ^= x10; + x6 = (x6 << 7 & _mask32) | x6 >>> 25; + + x3 = (x3 + x7) & _mask32; + x15 ^= x3; + x15 = (x15 << 16 & _mask32) | x15 >>> 16; + x11 = (x11 + x15) & _mask32; + x7 ^= x11; + x7 = (x7 << 12 & _mask32) | x7 >>> 20; + x3 = (x3 + x7) & _mask32; + x15 ^= x3; + x15 = (x15 << 8 & _mask32) | x15 >>> 24; + x11 = (x11 + x15) & _mask32; + x7 ^= x11; + x7 = (x7 << 7 & _mask32) | x7 >>> 25; + + // Diagonal rounds. + x0 = (x0 + x5) & _mask32; + x15 ^= x0; + x15 = (x15 << 16 & _mask32) | x15 >>> 16; + x10 = (x10 + x15) & _mask32; + x5 ^= x10; + x5 = (x5 << 12 & _mask32) | x5 >>> 20; + x0 = (x0 + x5) & _mask32; + x15 ^= x0; + x15 = (x15 << 8 & _mask32) | x15 >>> 24; + x10 = (x10 + x15) & _mask32; + x5 ^= x10; + x5 = (x5 << 7 & _mask32) | x5 >>> 25; + + x1 = (x1 + x6) & _mask32; + x12 ^= x1; + x12 = (x12 << 16 & _mask32) | x12 >>> 16; + x11 = (x11 + x12) & _mask32; + x6 ^= x11; + x6 = (x6 << 12 & _mask32) | x6 >>> 20; + x1 = (x1 + x6) & _mask32; + x12 ^= x1; + x12 = (x12 << 8 & _mask32) | x12 >>> 24; + x11 = (x11 + x12) & _mask32; + x6 ^= x11; + x6 = (x6 << 7 & _mask32) | x6 >>> 25; + + x2 = (x2 + x7) & _mask32; + x13 ^= x2; + x13 = (x13 << 16 & _mask32) | x13 >>> 16; + x8 = (x8 + x13) & _mask32; + x7 ^= x8; + x7 = (x7 << 12 & _mask32) | x7 >>> 20; + x2 = (x2 + x7) & _mask32; + x13 ^= x2; + x13 = (x13 << 8 & _mask32) | x13 >>> 24; + x8 = (x8 + x13) & _mask32; + x7 ^= x8; + x7 = (x7 << 7 & _mask32) | x7 >>> 25; + + x3 = (x3 + x4) & _mask32; + x14 ^= x3; + x14 = (x14 << 16 & _mask32) | x14 >>> 16; + x9 = (x9 + x14) & _mask32; + x4 ^= x9; + x4 = (x4 << 12 & _mask32) | x4 >>> 20; + x3 = (x3 + x4) & _mask32; + x14 ^= x3; + x14 = (x14 << 8 & _mask32) | x14 >>> 24; + x9 = (x9 + x14) & _mask32; + x4 ^= x9; + x4 = (x4 << 7 & _mask32) | x4 >>> 25; + } + final x = _x; + x[0] = x0 + s[0]; + x[1] = x1 + s[1]; + x[2] = x2 + s[2]; + x[3] = x3 + s[3]; + x[4] = x4 + s[4]; + x[5] = x5 + s[5]; + x[6] = x6 + s[6]; + x[7] = x7 + s[7]; + x[8] = x8 + s[8]; + x[9] = x9 + s[9]; + x[10] = x10 + s[10]; + x[11] = x11 + s[11]; + x[12] = x12 + s[12]; + x[13] = x13 + s[13]; + x[14] = x14 + s[14]; + x[15] = x15 + s[15]; + // A Uint32List keeps the low 32 bits of each sum, on the VM and on the + // web alike. + final out = _stream; + for (var i = 0; i < 16; i++) { + final v = x[i]; + out[4 * i] = v & 0xff; + out[4 * i + 1] = v >>> 8 & 0xff; + out[4 * i + 2] = v >>> 16 & 0xff; + out[4 * i + 3] = v >>> 24; + } + if (s[12] == _mask32) { + _overflow = true; + } else { + s[12] = s[12] + 1; + } + _used = 0; + } + + /// XORs the keystream into [data] from [start] to [end], in place. + void xorInPlace(Uint8List data, [int start = 0, int? end]) { + final stop = end ?? data.length; + RangeError.checkValidRange(start, stop, data.length); + for (var i = start; i < stop; i++) { + if (_used == 64) _block(); + data[i] ^= _stream[_used++]; + } + } + + /// The next [n] bytes of keystream. + Uint8List keystream(int n) { + final out = Uint8List(n); + xorInPlace(out); + return out; + } + + /// Clears the key and the keystream. + void wipe() { + _input.fillRange(0, 16, 0); + _x.fillRange(0, 16, 0); + _stream.fillRange(0, 64, 0); + _used = 64; + } +} + +// --------------------------------------------------------------------------- +// Poly1305 + +const _limbBits = 13; +const _limbMask = 0x1fff; +const _limbRadix = 0x2000; +const _limbs = 10; + +// The ten 13-bit limbs of the little-endian integer in pad[0..16]; pad has +// at least 19 bytes, those above the integer zero. +void _limbsOf(Uint8List pad, Int32List out) { + for (var i = 0; i < _limbs; i++) { + final bit = _limbBits * i; + final byte = bit >>> 3; + final v = pad[byte] | pad[byte + 1] << 8 | pad[byte + 2] << 16; + out[i] = v >>> (bit & 7) & _limbMask; + } +} + +/// Poly1305 (RFC 8439, 2.5) with a one-time key of 32 bytes: r and s. +final class Poly1305 { + /// The MAC of the one-time [key], 32 bytes. + Poly1305(List key) { + if (key.length != 32) { + throw ArgumentError.value(key.length, 'key', 'not 32 bytes'); + } + final pad = _pad; + for (var i = 0; i < 16; i++) { + pad[i] = key[i]; + } + // Clamping, RFC 8439 2.5.1. + pad[3] &= 15; + pad[7] &= 15; + pad[11] &= 15; + pad[15] &= 15; + pad[4] &= 252; + pad[8] &= 252; + pad[12] &= 252; + _limbsOf(pad, _r); + for (var i = 0; i < 16; i++) { + _s[i] = key[16 + i]; + } + pad.fillRange(0, pad.length, 0); + } + + final Int32List _r = Int32List(_limbs); + final Int32List _h = Int32List(_limbs); + final Int32List _m = Int32List(_limbs); + final Uint8List _s = Uint8List(16); + final Uint8List _pad = Uint8List(20); + int _buffered = 0; + + /// Adds [data] to the message. + void add(List data, [int start = 0, int? end]) { + final stop = end ?? data.length; + RangeError.checkValidRange(start, stop, data.length); + var i = start; + final pad = _pad; + if (_buffered > 0) { + while (_buffered < 16 && i < stop) { + pad[_buffered++] = data[i++]; + } + if (_buffered < 16) return; + _block(16); + } + for (; i + 16 <= stop; i += 16) { + for (var k = 0; k < 16; k++) { + pad[k] = data[i + k]; + } + _block(16); + } + while (i < stop) { + pad[_buffered++] = data[i++]; + } + } + + // h = (h + the block of the first n bytes of _pad, with the byte 1 after + // them) · r mod 2^130 - 5. + void _block(int n) { + final pad = _pad; + pad[n] = 1; + pad.fillRange(n + 1, pad.length, 0); + final h = _h; + final r = _r; + final m = _m; + _limbsOf(pad, m); + pad.fillRange(0, pad.length, 0); + _buffered = 0; + for (var i = 0; i < _limbs; i++) { + h[i] += m[i]; + } + // d_i = the sum over j of h_j · r_(i-j), where a limb past 2^130 comes + // back multiplied by 5, as 2^130 = 5 mod p. Each d_i is below 2^35. + var carry = 0; + for (var i = 0; i < _limbs; i++) { + var d = carry; + for (var j = 0; j <= i; j++) { + d += h[j] * r[i - j]; + } + for (var j = i + 1; j < _limbs; j++) { + d += h[j] * 5 * r[i - j + _limbs]; + } + carry = d ~/ _limbRadix; + m[i] = d & _limbMask; + } + // The carry out of limb 9 is a multiple of 2^130: it comes back · 5. + final v = m[0] + carry * 5; + h[0] = v & _limbMask; + h[1] = m[1] + v ~/ _limbRadix; + for (var i = 2; i < _limbs; i++) { + h[i] = m[i]; + } + } + + /// The 16-byte tag of the message. The object is wiped and cannot be used + /// again. + Uint8List finish() { + if (_buffered > 0) _block(_buffered); + final h = _h; + // Two full carries: every limb below 2^13, but for h_1, which may reach + // 2^13 by one, and h below 2^130 + 2^26. + for (var round = 0; round < 2; round++) { + var c = 0; + for (var i = 0; i < _limbs; i++) { + final v = h[i] + c; + c = v ~/ _limbRadix; + h[i] = v & _limbMask; + } + final v = h[0] + c * 5; + h[0] = v & _limbMask; + h[1] += v ~/ _limbRadix; + } + // g = h + 5 - 2^130. The carry out of limb 9 is 1 exactly when + // h + 5 >= 2^130, that is h >= p, and then h mod p = g. + final g = _m; + var c = 5; + for (var i = 0; i < _limbs; i++) { + final v = h[i] + c; + c = v ~/ _limbRadix; + g[i] = v & _limbMask; + } + final keep = 1 - c; + for (var i = 0; i < _limbs; i++) { + h[i] = keep * h[i] + c * g[i]; + } + // (h + s) mod 2^128, little-endian. The limbs are added, not ORed, so + // that h_1 = 2^13 carries into the next one. + final tag = Uint8List(16); + var acc = 0; + var bits = 0; + var limb = 0; + var carry = 0; + for (var i = 0; i < 16; i++) { + while (bits < 8) { + acc += h[limb++] << bits; + bits += _limbBits; + } + final v = (acc & 0xff) + _s[i] + carry; + tag[i] = v & 0xff; + carry = v >>> 8; + acc >>>= 8; + bits -= 8; + } + wipe(); + return tag; + } + + /// Clears the key and the state. + void wipe() { + _r.fillRange(0, _limbs, 0); + _h.fillRange(0, _limbs, 0); + _m.fillRange(0, _limbs, 0); + _s.fillRange(0, 16, 0); + _pad.fillRange(0, _pad.length, 0); + _buffered = 0; + } +} + +/// The Poly1305 tag of [message] under the one-time [key]. +Uint8List poly1305(List key, List message) => + (Poly1305(key)..add(message)).finish(); + +/// Whether [a] and [b] are equal, in a time that depends only on their +/// lengths. +bool constantTimeEquals(List a, List b) { + if (a.length != b.length) return false; + var d = 0; + for (var i = 0; i < a.length; i++) { + d |= a[i] ^ b[i]; + } + return d == 0; +} + +// --------------------------------------------------------------------------- +// ChaCha20-Poly1305 + +final _zeros = Uint8List(16); + +Uint8List _tag( + ChaCha20 cipher, + List aad, + Uint8List ciphertext, + int start, + int end, +) => + // The one-time key is the first 32 bytes of block 0 (RFC 8439, 2.6); the + // rest of that block is discarded, and the message starts at block 1. + _tagWith(cipher.keystream(64), aad, ciphertext, start, end); + +// An int below 2^53 as 8 little-endian bytes, without a 64-bit shift. +Uint8List _le64(int v) { + final out = Uint8List(8); + var x = v; + for (var i = 0; i < 8; i++) { + out[i] = x & 0xff; + x = x ~/ 256; + } + return out; +} + +/// The AEAD ChaCha20-Poly1305 of RFC 8439, 2.8, as Go's chacha20poly1305: +/// the ciphertext followed by the 16-byte tag. +Uint8List chacha20Poly1305Seal( + List key, + List nonce, + List plaintext, [ + List aad = const [], +]) { + final cipher = ChaCha20(key, nonce); + final out = Uint8List(plaintext.length + poly1305TagSize); + out.setRange(0, plaintext.length, plaintext); + try { + // Block 0 gives the one-time key; the message starts at block 1. + final otk = cipher.keystream(64); + cipher.xorInPlace(out, 0, plaintext.length); + final tag = _tagWith(otk, aad, out, 0, plaintext.length); + out.setRange(plaintext.length, out.length, tag); + return out; + } finally { + cipher.wipe(); + } +} + +/// Opens the [ciphertext] (with its tag) of ChaCha20-Poly1305: the plaintext, +/// or null when the tag does not verify. The tag is compared in constant +/// time, and nothing is decrypted before it verifies. +Uint8List? chacha20Poly1305Open( + List key, + List nonce, + Uint8List ciphertext, [ + List aad = const [], +]) { + if (ciphertext.length < poly1305TagSize) return null; + final n = ciphertext.length - poly1305TagSize; + final cipher = ChaCha20(key, nonce); + try { + final want = _tag(cipher, aad, ciphertext, 0, n); + final got = Uint8List.sublistView(ciphertext, n); + if (!constantTimeEquals(want, got)) return null; + final out = Uint8List.fromList(Uint8List.sublistView(ciphertext, 0, n)); + cipher.xorInPlace(out); + return out; + } finally { + cipher.wipe(); + } +} + +Uint8List _tagWith( + Uint8List otk, + List aad, + Uint8List ciphertext, + int start, + int end, +) { + final mac = Poly1305(otk.sublist(0, 32)); + otk.fillRange(0, otk.length, 0); + final n = end - start; + mac + ..add(aad) + ..add(_zeros, 0, (16 - aad.length % 16) % 16) + ..add(ciphertext, start, end) + ..add(_zeros, 0, (16 - n % 16) % 16) + ..add(_le64(aad.length)) + ..add(_le64(n)); + return mac.finish(); +} diff --git a/lib/src/curve25519.dart b/lib/src/curve25519.dart new file mode 100644 index 0000000..0d15916 --- /dev/null +++ b/lib/src/curve25519.dart @@ -0,0 +1,583 @@ +/// X25519 (RFC 7748) and the strict verification of Ed25519 signatures of +/// the author signature (spec v0.11, §29.9), as the Go package +/// internal/ed25519strict. +/// +/// The field arithmetic modulo p = 2^255 - 19 is the one of TweetNaCl, in +/// its JavaScript port: an element is sixteen limbs of 16 bits in a +/// Float64List, a double that holds integers exactly below 2^53. The bounds +/// are TweetNaCl's: the limbs that enter a product are below 2^17 in +/// absolute value, a product below 2^34, a sum of sixteen of them below +/// 2^38, and folding the upper half (· 38) below 2^44. The carries divide by +/// 2^16 and round down, which is exact for those values. The same code runs +/// on the VM and on the web, and the conditional swaps of the ladder are +/// arithmetic, without branches on the secret scalar; neither platform +/// promises constant time, though. +/// +/// Ed25519 only verifies, over public values. The reduction of scalars +/// modulo the group order and the checks of [onCurve] use BigInt, which is +/// not constant time: they never see a secret. +/// +/// Internal: lib/datekeys.dart does not export it. +library; + +import 'dart:typed_data'; + +import 'package:crypto/crypto.dart' as crypto; + +import 'bytes.dart'; + +// --------------------------------------------------------------------------- +// The field GF(2^255 - 19) + +final BigInt _p = (BigInt.one << 255) - BigInt.from(19); + +Float64List _gf([List? init]) { + final r = Float64List(16); + if (init != null) { + for (var i = 0; i < init.length; i++) { + r[i] = init[i].toDouble(); + } + } + return r; +} + +// The element of a BigInt in 0..p-1. +Float64List _gfOf(BigInt v) { + final r = Float64List(16); + var x = v; + final mask = BigInt.from(0xffff); + for (var i = 0; i < 16; i++) { + r[i] = (x & mask).toInt().toDouble(); + x >>= 16; + } + return r; +} + +BigInt _bigOf(Uint8List le) { + var n = BigInt.zero; + for (var i = le.length - 1; i >= 0; i--) { + n = (n << 8) | BigInt.from(le[i]); + } + return n; +} + +Uint8List _leOf(BigInt v, int length) { + final out = Uint8List(length); + var x = v; + final mask = BigInt.from(0xff); + for (var i = 0; i < length; i++) { + out[i] = (x & mask).toInt(); + x >>= 8; + } + return out; +} + +void _set(Float64List r, Float64List a) { + for (var i = 0; i < 16; i++) { + r[i] = a[i]; + } +} + +// Carries every limb into the next, and the top one back into limb 0 · 38. +void _car(Float64List o) { + var c = 1.0; + for (var i = 0; i < 16; i++) { + final v = o[i] + c + 65535; + c = (v / 65536).floorToDouble(); + o[i] = v - c * 65536; + } + o[0] += c - 1 + 37 * (c - 1); +} + +// Swaps p and q when b is 1 and leaves them when it is 0, without a branch. +void _sel(Float64List p, Float64List q, int b) { + final f = b.toDouble(); + for (var i = 0; i < 16; i++) { + final t = f * (p[i] - q[i]); + p[i] -= t; + q[i] += t; + } +} + +// The canonical 32 little-endian bytes of n. +void _pack(Uint8List o, Float64List n) { + final t = _gf(); + _set(t, n); + _car(t); + _car(t); + _car(t); + final ti = Int32List(16); + for (var i = 0; i < 16; i++) { + ti[i] = t[i].toInt(); + } + final m = Int32List(16); + for (var j = 0; j < 2; j++) { + m[0] = ti[0] - 0xffed; + for (var i = 1; i < 15; i++) { + m[i] = ti[i] - 0xffff - ((m[i - 1] >> 16) & 1); + m[i - 1] &= 0xffff; + } + m[15] = ti[15] - 0x7fff - ((m[14] >> 16) & 1); + final b = (m[15] >> 16) & 1; + m[14] &= 0xffff; + // ti = m unless m borrowed (b = 1). + final keep = 1 - b; + for (var i = 0; i < 16; i++) { + ti[i] = ti[i] + keep * (m[i] - ti[i]); + } + } + for (var i = 0; i < 16; i++) { + o[2 * i] = ti[i] & 0xff; + o[2 * i + 1] = (ti[i] >> 8) & 0xff; + } +} + +bool _neq(Float64List a, Float64List b) { + final c = Uint8List(32); + final d = Uint8List(32); + _pack(c, a); + _pack(d, b); + return !equalBytes(c, d); +} + +int _par(Float64List a) { + final d = Uint8List(32); + _pack(d, a); + return d[0] & 1; +} + +// The element of 32 little-endian bytes, bit 255 ignored. +void _unpack(Float64List o, Uint8List n) { + for (var i = 0; i < 16; i++) { + o[i] = (n[2 * i] + (n[2 * i + 1] << 8)).toDouble(); + } + o[15] = (n[30] + ((n[31] & 0x7f) << 8)).toDouble(); +} + +void _add(Float64List o, Float64List a, Float64List b) { + for (var i = 0; i < 16; i++) { + o[i] = a[i] + b[i]; + } +} + +void _sub(Float64List o, Float64List a, Float64List b) { + for (var i = 0; i < 16; i++) { + o[i] = a[i] - b[i]; + } +} + +final Float64List _t = Float64List(31); + +// o = a · b. o may be a or b. +void _mul(Float64List o, Float64List a, Float64List b) { + final t = _t; + for (var i = 0; i < 31; i++) { + t[i] = 0; + } + for (var i = 0; i < 16; i++) { + final ai = a[i]; + for (var j = 0; j < 16; j++) { + t[i + j] += ai * b[j]; + } + } + // 2^256 = 38 mod p. + for (var i = 0; i < 15; i++) { + t[i] += 38 * t[i + 16]; + } + for (var round = 0; round < 2; round++) { + var c = 1.0; + for (var i = 0; i < 16; i++) { + final v = t[i] + c + 65535; + c = (v / 65536).floorToDouble(); + t[i] = v - c * 65536; + } + t[0] += c - 1 + 37 * (c - 1); + } + for (var i = 0; i < 16; i++) { + o[i] = t[i]; + } +} + +void _sq(Float64List o, Float64List a) => _mul(o, a, a); + +// o = i^(p - 2) = 1/i. +void _inv(Float64List o, Float64List i) { + final c = _gf(); + _set(c, i); + for (var a = 253; a >= 0; a--) { + _sq(c, c); + if (a != 2 && a != 4) _mul(c, c, i); + } + _set(o, c); +} + +// o = i^((p - 5) / 8). +void _pow2523(Float64List o, Float64List i) { + final c = _gf(); + _set(c, i); + for (var a = 250; a >= 0; a--) { + _sq(c, c); + if (a != 1) _mul(c, c, i); + } + _set(o, c); +} + +// --------------------------------------------------------------------------- +// X25519 + +/// The size of an X25519 scalar, of a u-coordinate and of a shared secret. +const x25519Size = 32; + +final Float64List _a24 = _gf(const [0xdb41, 1]); // 121665 + +/// The function X25519 of RFC 7748, 5: the u-coordinate of [scalar], clamped, +/// times the point of u-coordinate [u], whose bit 255 is ignored. It returns +/// the all-zero string for a point of low order; [x25519Agree] rejects it. +Uint8List x25519(List scalar, List u) { + if (scalar.length != x25519Size) { + throw ArgumentError.value(scalar.length, 'scalar', 'not 32 bytes'); + } + if (u.length != x25519Size) { + throw ArgumentError.value(u.length, 'u', 'not 32 bytes'); + } + final z = Uint8List.fromList(scalar); + z[31] = (z[31] & 127) | 64; + z[0] &= 248; + final x = _gf(); + _unpack(x, Uint8List.fromList(u)); + final a = _gf(), b = _gf(), c = _gf(), d = _gf(), e = _gf(), f = _gf(); + _set(b, x); + a[0] = 1; + d[0] = 1; + for (var i = 254; i >= 0; i--) { + final r = (z[i >>> 3] >>> (i & 7)) & 1; + _sel(a, b, r); + _sel(c, d, r); + _add(e, a, c); + _sub(a, a, c); + _add(c, b, d); + _sub(b, b, d); + _sq(d, e); + _sq(f, a); + _mul(a, c, a); + _mul(c, b, e); + _add(e, a, c); + _sub(a, a, c); + _sq(b, a); + _sub(c, d, f); + _mul(a, c, _a24); + _add(a, a, d); + _mul(c, c, a); + _mul(a, d, f); + _mul(d, b, x); + _sq(b, e); + _sel(a, b, r); + _sel(c, d, r); + } + _inv(c, c); + _mul(a, a, c); + final out = Uint8List(32); + _pack(out, a); + z.fillRange(0, 32, 0); + for (final v in [a, b, c, d, e, f, x]) { + v.fillRange(0, 16, 0); + } + return out; +} + +final Uint8List _basePointU = Uint8List(32)..[0] = 9; + +/// The public key of the X25519 [scalar]: X25519 of it and the base point, +/// u = 9. +Uint8List x25519PublicKey(List scalar) => x25519(scalar, _basePointU); + +/// A point of low order offered to X25519: the shared secret would be zero +/// whatever the scalar (RFC 7748, 6.1). The message is the one of Go's +/// crypto/ecdh, which age quotes. +final class X25519LowOrderException implements Exception { + /// The exception. + const X25519LowOrderException(); + + /// The text of Go's error. + String get message => + 'crypto/ecdh: bad X25519 remote ECDH input: low order point'; + + @override + String toString() => message; +} + +/// The shared secret of [scalar] and the public key [u], as Go's crypto/ecdh +/// X25519 ECDH: throws an [X25519LowOrderException] when it is all zeros. +/// The check reads every byte. +Uint8List x25519Agree(List scalar, List u) { + final s = x25519(scalar, u); + var acc = 0; + for (final b in s) { + acc |= b; + } + if (acc == 0) throw const X25519LowOrderException(); + return s; +} + +// --------------------------------------------------------------------------- +// Ed25519, strict verification + +/// The order of the prime subgroup of edwards25519, ℓ = 2^252 + +/// 27742317777372353535851937790883648493. +final BigInt ed25519Order = + (BigInt.one << 252) + + BigInt.parse('27742317777372353535851937790883648493'); + +// d = -121665/121666, 2d, sqrt(-1) and the base point B = (x, 4/5) with x +// even (RFC 8032, 5.1), computed rather than copied. +final BigInt _dBig = + (-BigInt.from(121665) * BigInt.from(121666).modInverse(_p)) % _p; +final Float64List _d = _gfOf(_dBig); +final Float64List _d2 = _gfOf((_dBig * BigInt.two) % _p); +final BigInt _sqrtM1Big = BigInt.two.modPow( + (_p - BigInt.one) ~/ BigInt.from(4), + _p, +); +final Float64List _sqrtM1 = _gfOf(_sqrtM1Big); +final List _base = () { + final y = (BigInt.from(4) * BigInt.from(5).modInverse(_p)) % _p; + final x = _recoverX(y, 0)!; + return [ + _gfOf(x), + _gfOf(y), + _gf(const [1]), + _gfOf((x * y) % _p), + ]; +}(); + +// The x of y on the curve whose low bit is [sign], or null: RFC 8032, 5.1.3. +BigInt? _recoverX(BigInt y, int sign) { + final y2 = (y * y) % _p; + final u = (y2 - BigInt.one) % _p; + final v = (_dBig * y2 + BigInt.one) % _p; + final v3 = (v * v % _p) * v % _p; + final v7 = (v3 * v3 % _p) * v % _p; + var x = + (u * v3 % _p) * + (u * v7 % _p).modPow((_p - BigInt.from(5)) ~/ BigInt.from(8), _p) % + _p; + final vx2 = v * x % _p * x % _p; + if (vx2 == u) { + // x is a root. + } else if (vx2 == (_p - u) % _p) { + x = x * _sqrtM1Big % _p; + } else { + return null; + } + if (x == BigInt.zero && sign == 1) return null; + if (x.isOdd != (sign == 1)) x = (_p - x) % _p; + return x; +} + +// A point in extended coordinates (X, Y, Z, T). +List _point() => [_gf(), _gf(), _gf(), _gf()]; + +// p = p + q, the unified addition of TweetNaCl (also a doubling). +void _padd(List p, List q) { + final a = _gf(), b = _gf(), c = _gf(), d = _gf(); + final e = _gf(), f = _gf(), g = _gf(), h = _gf(), t = _gf(); + _sub(a, p[1], p[0]); + _sub(t, q[1], q[0]); + _mul(a, a, t); + _add(b, p[0], p[1]); + _add(t, q[0], q[1]); + _mul(b, b, t); + _mul(c, p[3], q[3]); + _mul(c, c, _d2); + _mul(d, p[2], q[2]); + _add(d, d, d); + _sub(e, b, a); + _sub(f, d, c); + _add(g, d, c); + _add(h, b, a); + _mul(p[0], e, f); + _mul(p[1], h, g); + _mul(p[2], g, f); + _mul(p[3], e, h); +} + +void _cswap(List p, List q, int b) { + for (var i = 0; i < 4; i++) { + _sel(p[i], q[i], b); + } +} + +void _ppack(Uint8List r, List p) { + final tx = _gf(), ty = _gf(), zi = _gf(); + _inv(zi, p[2]); + _mul(tx, p[0], zi); + _mul(ty, p[1], zi); + _pack(r, ty); + r[31] ^= _par(tx) << 7; +} + +// p = [s]q, s 32 little-endian bytes; q is consumed. +void _scalarMult(List p, List q, Uint8List s) { + _set(p[0], _gf()); + _set(p[1], _gf(const [1])); + _set(p[2], _gf(const [1])); + _set(p[3], _gf()); + for (var i = 255; i >= 0; i--) { + final b = (s[i >>> 3] >>> (i & 7)) & 1; + _cswap(p, q, b); + _padd(q, p); + _padd(p, p); + _cswap(p, q, b); + } +} + +// r = -A for the encoding [a], or false when it is not a point of the curve. +// Non-canonical encodings decode reduced; the caller rejects them first. +bool _unpackNeg(List r, Uint8List a) { + final t = _gf(), chk = _gf(), num = _gf(), den = _gf(); + final den2 = _gf(), den4 = _gf(), den6 = _gf(); + _set(r[2], _gf(const [1])); + _unpack(r[1], a); + _sq(num, r[1]); + _mul(den, num, _d); + _sub(num, num, r[2]); + _add(den, r[2], den); + _sq(den2, den); + _sq(den4, den2); + _mul(den6, den4, den2); + _mul(t, den6, num); + _mul(t, t, den); + _pow2523(t, t); + _mul(t, t, num); + _mul(t, t, den); + _mul(t, t, den); + _mul(r[0], t, den); + _sq(chk, r[0]); + _mul(chk, chk, den); + if (_neq(chk, num)) _mul(r[0], r[0], _sqrtM1); + _sq(chk, r[0]); + _mul(chk, chk, den); + if (_neq(chk, num)) return false; + if (_par(r[0]) == (a[31] >>> 7)) _sub(r[0], _gf(), r[0]); + _mul(r[3], r[0], r[1]); + return true; +} + +/// The size of an Ed25519 public key. +const ed25519PublicKeySize = 32; + +/// The size of an Ed25519 signature. +const ed25519SignatureSize = 64; + +// The canonical encodings of the eight points of small order of +// edwards25519, as smallOrder of internal/ed25519strict of datekeys-go: the +// identity, the point of order 2, the two of order 4 and the four of order +// 8. The tests compute them again. +final List _smallOrder = [ + Uint8List(32), + Uint8List(32)..[31] = 0x80, + Uint8List(32)..[0] = 0x01, + fromHex('26e8958fc2b227b045c3f489f2ef98f0d5dfac05d3c63339b13802886d53fc05'), + fromHex('26e8958fc2b227b045c3f489f2ef98f0d5dfac05d3c63339b13802886d53fc85'), + fromHex('c7176a703d4dd84fba3c0b760d10670f2a2053fa2c39ccc64ec7fd7792ac037a'), + fromHex('c7176a703d4dd84fba3c0b760d10670f2a2053fa2c39ccc64ec7fd7792ac03fa'), + fromHex('ecffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f'), +]; + +/// The canonical encodings of the eight points of small order. +List smallOrderPoints() => [ + for (final p in _smallOrder) Uint8List.fromList(p), +]; + +/// Whether the 32 bytes [a] are a canonical encoding: their y, the low 255 +/// bits, is below p = 2^255 - 19, and their sign bit is clear when y is 1 or +/// p - 1, the two values whose x is 0 (spec §29.9, rule 1). It does not tell +/// whether y belongs to a point of the curve. Go's ed25519strict.Canonical. +bool canonical(List a) { + if (a.length != 32) return false; + final high = a[31] & 0x7f; + var ones = true; + for (var i = 1; i < 31; i++) { + if (a[i] != 0xff) { + ones = false; + break; + } + } + // y >= p: 7f ff…ff and a first byte of 0xed or more. + if (high == 0x7f && ones && a[0] >= 0xed) return false; + if (a[31] & 0x80 == 0) return true; + // x = 0: y = 1, 01 00…00, or y = p - 1, ec ff…ff 7f. + var zeros = high == 0; + for (var i = 1; i < 31; i++) { + if (a[i] != 0) { + zeros = false; + break; + } + } + final isOne = zeros && a[0] == 0x01; + final isMinusOne = high == 0x7f && ones && a[0] == 0xec; + return !isOne && !isMinusOne; +} + +/// Whether the canonical encoding [a] is one of the eight points of small +/// order (spec §29.9, rule 2). Go's ed25519strict.SmallOrder. +bool smallOrder(List a) { + if (a.length != 32) return false; + for (final s in _smallOrder) { + if (equalBytes(a, s)) return true; + } + return false; +} + +/// Whether the canonical encoding [a] is a point of the curve: whether x² = +/// (y² - 1)/(d·y² + 1) has a solution modulo p (RFC 8032, 5.1.3). Go's +/// ed25519strict.OnCurve, with BigInt as Go uses math/big. +bool onCurve(List a) { + if (a.length != 32) return false; + final b = Uint8List.fromList(a); + b[31] &= 0x7f; + final y = _bigOf(b); + final y2 = y * y; + final u = (y2 - BigInt.one) % _p; + final v = (_dBig * y2 + BigInt.one) % _p; + final x2 = u * v.modInverse(_p) % _p; + return x2 == BigInt.zero || + x2.modPow((_p - BigInt.one) >> 1, _p) == BigInt.one; +} + +/// Whether [sig] is a valid signature of [message] by the public key +/// [publicKey] under the strict profile of spec §29.9, as Go's +/// ed25519strict.Verify: [publicKey] canonical and not of small order, then +/// crypto/ed25519.Verify, which rejects sig[63] & 0xE0 != 0, S >= ℓ and A +/// not on the curve, and compares the encoding of [S]B - [k]A, k = +/// SHA-512(R || A || message) mod ℓ, with R: the equation without the +/// cofactor. A key or a signature of another length is not valid either. +bool verifyStrict(List publicKey, List message, List sig) { + if (publicKey.length != ed25519PublicKeySize || + sig.length != ed25519SignatureSize) { + return false; + } + if (!canonical(publicKey) || smallOrder(publicKey)) return false; + if (sig[63] & 0xe0 != 0) return false; + final pub = Uint8List.fromList(publicKey); + final negA = _point(); + if (!_unpackNeg(negA, pub)) return false; + final s = _bigOf(Uint8List.fromList(sig.sublist(32))); + if (s >= ed25519Order) return false; + final r = Uint8List.fromList(sig.sublist(0, 32)); + final digest = crypto.sha512.convert(concatBytes([r, pub, message])).bytes; + final k = _bigOf(Uint8List.fromList(digest)) % ed25519Order; + // [k](-A) + [S]B. + final p = _point(); + _scalarMult(p, negA, _leOf(k, 32)); + final q = _point(); + final b = _point(); + for (var i = 0; i < 4; i++) { + _set(b[i], _base[i]); + } + _scalarMult(q, b, _leOf(s, 32)); + _padd(p, q); + final got = Uint8List(32); + _ppack(got, p); + return equalBytes(got, r); +} diff --git a/lib/src/scrypt.dart b/lib/src/scrypt.dart new file mode 100644 index 0000000..69b7b90 --- /dev/null +++ b/lib/src/scrypt.dart @@ -0,0 +1,258 @@ +/// scrypt (RFC 7914), with Salsa20/8, BlockMix and ROMix as Go's +/// golang.org/x/crypto/scrypt: the key derivation of the scrypt stanza of +/// age, with which the file of an author key is encrypted (spec §29.12, +/// logN = 16). +/// +/// The words are 32 bits: sums of two words are masked and rotations are of +/// 32-bit values, exact on the VM and when compiled to JavaScript. The +/// memory is 128 · r · N bytes in one Uint32List: 64 MiB for logN = 16 and +/// r = 8. +/// +/// Internal: lib/datekeys.dart does not export it. +library; + +import 'dart:typed_data'; + +import 'sha256.dart'; + +const _mask32 = 0xffffffff; + +/// The error of Go's scrypt.Key for parameters it refuses. +final class ScryptParameterException implements Exception { + /// An exception with Go's [message]. + const ScryptParameterException(this.message); + + /// The text of Go's error. + final String message; + + @override + String toString() => message; +} + +/// scrypt of [password] and [salt] with cost [n], a power of two above 1, +/// block size [r] and parallelism [p], [length] bytes: Go's scrypt.Key, with +/// its checks and error texts. The p blocks are mixed one after the other. +Uint8List scrypt( + List password, + List salt, + int n, + int r, + int p, + int length, +) { + if (n <= 1 || n & (n - 1) != 0) { + throw const ScryptParameterException( + 'scrypt: N must be > 1 and a power of 2', + ); + } + if (r <= 0 || p <= 0) { + throw const ScryptParameterException('scrypt: parameters must be > 0'); + } + // Go's limits with maxInt = 2^53 - 1, the largest exact int of the web, + // instead of 2^63 - 1: memory runs out long before either. + const maxInt = 9007199254740991; + if (r * p >= 1 << 30 || + r > maxInt ~/ 128 ~/ p || + r > maxInt ~/ 256 || + n > maxInt ~/ 128 ~/ r) { + throw const ScryptParameterException('scrypt: parameters are too large'); + } + final blockWords = 32 * r; + final b = pbkdf2HmacSha256(password, salt, 1, p * 128 * r); + final xy = Uint32List(2 * blockWords); + final v = Uint32List(blockWords * n); + final tmp = Uint32List(16); + final x = Uint32List(16); + try { + for (var i = 0; i < p; i++) { + _smix(b, i * 128 * r, r, n, v, xy, tmp, x); + } + return pbkdf2HmacSha256(password, b, 1, length); + } finally { + b.fillRange(0, b.length, 0); + xy.fillRange(0, xy.length, 0); + v.fillRange(0, v.length, 0); + tmp.fillRange(0, 16, 0); + x.fillRange(0, 16, 0); + } +} + +// ROMix of the block of b at offset, in place. +void _smix( + Uint8List b, + int offset, + int r, + int n, + Uint32List v, + Uint32List xy, + Uint32List tmp, + Uint32List x, +) { + final words = 32 * r; + for (var i = 0; i < words; i++) { + final o = offset + 4 * i; + xy[i] = b[o] | b[o + 1] << 8 | b[o + 2] << 16 | (b[o + 3] << 24 & _mask32); + } + // X is xy[0..words), Y is xy[words..2·words). + for (var i = 0; i < n; i += 2) { + v.setRange(i * words, (i + 1) * words, xy); + _blockMix(tmp, x, xy, 0, xy, words, r); + v.setRange((i + 1) * words, (i + 2) * words, xy, words); + _blockMix(tmp, x, xy, words, xy, 0, r); + } + // Integerify: the first word of the last 64-byte block, below N ≤ 2^30, so + // the second word of the little-endian integer never counts. + final last = (2 * r - 1) * 16; + for (var i = 0; i < n; i += 2) { + var j = xy[last] & (n - 1); + _xorBlock(xy, 0, v, j * words, words); + _blockMix(tmp, x, xy, 0, xy, words, r); + j = xy[words + last] & (n - 1); + _xorBlock(xy, words, v, j * words, words); + _blockMix(tmp, x, xy, words, xy, 0, r); + } + for (var i = 0; i < words; i++) { + final w = xy[i]; + final o = offset + 4 * i; + b[o] = w & 0xff; + b[o + 1] = w >>> 8 & 0xff; + b[o + 2] = w >>> 16 & 0xff; + b[o + 3] = w >>> 24; + } +} + +void _xorBlock(Uint32List dst, int d, Uint32List src, int s, int n) { + for (var i = 0; i < n; i++) { + dst[d + i] ^= src[s + i]; + } +} + +// BlockMix with Salsa20/8 of the 2r blocks of 16 words at in[inOff..], into +// out[outOff..]: the even blocks first, then the odd ones, as RFC 7914 and +// Go's blockMix. +void _blockMix( + Uint32List tmp, + Uint32List x, + Uint32List input, + int inOff, + Uint32List out, + int outOff, + int r, +) { + tmp.setRange(0, 16, input, inOff + (2 * r - 1) * 16); + for (var i = 0; i < 2 * r; i += 2) { + _salsaXor(tmp, x, input, inOff + i * 16, out, outOff + i * 8); + _salsaXor(tmp, x, input, inOff + i * 16 + 16, out, outOff + i * 8 + r * 16); + } +} + +// tmp = Salsa20/8(tmp ^ in[inOff..+16]), also written to out[outOff..+16]. +void _salsaXor( + Uint32List tmp, + Uint32List w, + Uint32List input, + int inOff, + Uint32List out, + int outOff, +) { + for (var i = 0; i < 16; i++) { + w[i] = tmp[i] ^ input[inOff + i]; + } + var x0 = w[0], x1 = w[1], x2 = w[2], x3 = w[3]; + var x4 = w[4], x5 = w[5], x6 = w[6], x7 = w[7]; + var x8 = w[8], x9 = w[9], x10 = w[10], x11 = w[11]; + var x12 = w[12], x13 = w[13], x14 = w[14], x15 = w[15]; + for (var i = 0; i < 8; i += 2) { + // Columns. + var u = (x0 + x12) & _mask32; + x4 ^= (u << 7 & _mask32) | u >>> 25; + u = (x4 + x0) & _mask32; + x8 ^= (u << 9 & _mask32) | u >>> 23; + u = (x8 + x4) & _mask32; + x12 ^= (u << 13 & _mask32) | u >>> 19; + u = (x12 + x8) & _mask32; + x0 ^= (u << 18 & _mask32) | u >>> 14; + + u = (x5 + x1) & _mask32; + x9 ^= (u << 7 & _mask32) | u >>> 25; + u = (x9 + x5) & _mask32; + x13 ^= (u << 9 & _mask32) | u >>> 23; + u = (x13 + x9) & _mask32; + x1 ^= (u << 13 & _mask32) | u >>> 19; + u = (x1 + x13) & _mask32; + x5 ^= (u << 18 & _mask32) | u >>> 14; + + u = (x10 + x6) & _mask32; + x14 ^= (u << 7 & _mask32) | u >>> 25; + u = (x14 + x10) & _mask32; + x2 ^= (u << 9 & _mask32) | u >>> 23; + u = (x2 + x14) & _mask32; + x6 ^= (u << 13 & _mask32) | u >>> 19; + u = (x6 + x2) & _mask32; + x10 ^= (u << 18 & _mask32) | u >>> 14; + + u = (x15 + x11) & _mask32; + x3 ^= (u << 7 & _mask32) | u >>> 25; + u = (x3 + x15) & _mask32; + x7 ^= (u << 9 & _mask32) | u >>> 23; + u = (x7 + x3) & _mask32; + x11 ^= (u << 13 & _mask32) | u >>> 19; + u = (x11 + x7) & _mask32; + x15 ^= (u << 18 & _mask32) | u >>> 14; + + // Rows. + u = (x0 + x3) & _mask32; + x1 ^= (u << 7 & _mask32) | u >>> 25; + u = (x1 + x0) & _mask32; + x2 ^= (u << 9 & _mask32) | u >>> 23; + u = (x2 + x1) & _mask32; + x3 ^= (u << 13 & _mask32) | u >>> 19; + u = (x3 + x2) & _mask32; + x0 ^= (u << 18 & _mask32) | u >>> 14; + + u = (x5 + x4) & _mask32; + x6 ^= (u << 7 & _mask32) | u >>> 25; + u = (x6 + x5) & _mask32; + x7 ^= (u << 9 & _mask32) | u >>> 23; + u = (x7 + x6) & _mask32; + x4 ^= (u << 13 & _mask32) | u >>> 19; + u = (x4 + x7) & _mask32; + x5 ^= (u << 18 & _mask32) | u >>> 14; + + u = (x10 + x9) & _mask32; + x11 ^= (u << 7 & _mask32) | u >>> 25; + u = (x11 + x10) & _mask32; + x8 ^= (u << 9 & _mask32) | u >>> 23; + u = (x8 + x11) & _mask32; + x9 ^= (u << 13 & _mask32) | u >>> 19; + u = (x9 + x8) & _mask32; + x10 ^= (u << 18 & _mask32) | u >>> 14; + + u = (x15 + x14) & _mask32; + x12 ^= (u << 7 & _mask32) | u >>> 25; + u = (x12 + x15) & _mask32; + x13 ^= (u << 9 & _mask32) | u >>> 23; + u = (x13 + x12) & _mask32; + x14 ^= (u << 13 & _mask32) | u >>> 19; + u = (x14 + x13) & _mask32; + x15 ^= (u << 18 & _mask32) | u >>> 14; + } + // A Uint32List keeps the low 32 bits of each sum. + tmp[0] = x0 + w[0]; + tmp[1] = x1 + w[1]; + tmp[2] = x2 + w[2]; + tmp[3] = x3 + w[3]; + tmp[4] = x4 + w[4]; + tmp[5] = x5 + w[5]; + tmp[6] = x6 + w[6]; + tmp[7] = x7 + w[7]; + tmp[8] = x8 + w[8]; + tmp[9] = x9 + w[9]; + tmp[10] = x10 + w[10]; + tmp[11] = x11 + w[11]; + tmp[12] = x12 + w[12]; + tmp[13] = x13 + w[13]; + tmp[14] = x14 + w[14]; + tmp[15] = x15 + w[15]; + out.setRange(outOff, outOff + 16, tmp); +} diff --git a/lib/src/sha256.dart b/lib/src/sha256.dart new file mode 100644 index 0000000..92c304b --- /dev/null +++ b/lib/src/sha256.dart @@ -0,0 +1,423 @@ +/// SHA-256 with a compression function of its own, and on it HMAC-SHA256, +/// HKDF-SHA256 (RFC 5869) and PBKDF2-HMAC-SHA256 (RFC 8018). +/// +/// package:crypto has SHA-256 and HMAC, but its HMAC computes the states of +/// the two keys again for every message and allocates for every call. The +/// word key of spec §38.1 runs PBKDF2 with 600 000 iterations, two HMACs per +/// iteration: here the inner and outer states of the key are computed once, +/// and each iteration is two compressions over 32-bit words in buffers that +/// are reused, without bytes in between. The app still calls it in an +/// Isolate (docs/PLAN_dart.md, «Rendimiento»). +/// +/// The arithmetic is exact on the VM and when compiled to JavaScript: words +/// are kept in 0..2^32-1, sums are of at most five words (below 2^35, exact +/// in a double), and every shift, rotation and mask is of a 32-bit value, so +/// that the 32-bit bit operators of the web give the same result as the +/// 64-bit ones of the VM. +/// +/// Internal: lib/datekeys.dart does not export it. +library; + +import 'dart:typed_data'; + +const _mask32 = 0xffffffff; + +/// The size of a SHA-256 digest, of an HMAC-SHA256 tag and of a PRK of HKDF. +const sha256Size = 32; + +/// The size of a SHA-256 block. +const sha256BlockSize = 64; + +// The round constants of FIPS 180-4, 4.2.2. +final Uint32List _k = Uint32List.fromList(const [ + 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, // + 0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, + 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, 0xe49b69c1, 0xefbe4786, + 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, + 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, + 0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, + 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, 0xa2bfe8a1, 0xa81a664b, + 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, + 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, + 0x5b9cca4f, 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, + 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2, +]); + +// The initial hash value of FIPS 180-4, 5.3.3. +const _iv = [ + 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, // + 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19, +]; + +/// Compresses the 16 words of [w] (big-endian words of one block, w[0..15]; +/// w[16..63] are scratch) into the eight words of [state]. +void _compress(Uint32List state, Uint32List w) { + for (var t = 16; t < 64; t++) { + final x = w[t - 15]; + final y = w[t - 2]; + final s0 = + ((x >>> 7) | (x << 25) & _mask32) ^ + ((x >>> 18) | (x << 14) & _mask32) ^ + (x >>> 3); + final s1 = + ((y >>> 17) | (y << 15) & _mask32) ^ + ((y >>> 19) | (y << 13) & _mask32) ^ + (y >>> 10); + w[t] = (w[t - 16] + s0 + w[t - 7] + s1) & _mask32; + } + var a = state[0]; + var b = state[1]; + var c = state[2]; + var d = state[3]; + var e = state[4]; + var f = state[5]; + var g = state[6]; + var h = state[7]; + for (var t = 0; t < 64; t++) { + final s1 = + ((e >>> 6) | (e << 26) & _mask32) ^ + ((e >>> 11) | (e << 21) & _mask32) ^ + ((e >>> 25) | (e << 7) & _mask32); + // Ch(e, f, g) = (e & f) ^ (~e & g), with ~e as 32 bits on the VM too. + final ch = (e & f) ^ ((e ^ _mask32) & g); + final t1 = (h + s1 + ch + _k[t] + w[t]) & _mask32; + final s0 = + ((a >>> 2) | (a << 30) & _mask32) ^ + ((a >>> 13) | (a << 19) & _mask32) ^ + ((a >>> 22) | (a << 10) & _mask32); + final maj = (a & b) ^ (a & c) ^ (b & c); + final t2 = (s0 + maj) & _mask32; + h = g; + g = f; + f = e; + e = (d + t1) & _mask32; + d = c; + c = b; + b = a; + a = (t1 + t2) & _mask32; + } + state[0] = (state[0] + a) & _mask32; + state[1] = (state[1] + b) & _mask32; + state[2] = (state[2] + c) & _mask32; + state[3] = (state[3] + d) & _mask32; + state[4] = (state[4] + e) & _mask32; + state[5] = (state[5] + f) & _mask32; + state[6] = (state[6] + g) & _mask32; + state[7] = (state[7] + h) & _mask32; +} + +/// Loads the block of [bytes] at [offset] into w[0..15], big-endian. +void _load(Uint32List w, List bytes, int offset) { + for (var i = 0; i < 16; i++) { + final o = offset + 4 * i; + w[i] = + bytes[o] << 24 & _mask32 | + bytes[o + 1] << 16 | + bytes[o + 2] << 8 | + bytes[o + 3]; + } +} + +/// Writes the eight words of [state] big-endian into [out] at [offset]. +void _store(Uint32List state, Uint8List out, int offset) { + for (var i = 0; i < 8; i++) { + final v = state[i]; + out[offset + 4 * i] = v >>> 24; + out[offset + 4 * i + 1] = v >>> 16 & 0xff; + out[offset + 4 * i + 2] = v >>> 8 & 0xff; + out[offset + 4 * i + 3] = v & 0xff; + } +} + +/// An incremental SHA-256 (FIPS 180-4). After [finish] it must not be used +/// again. +final class Sha256 { + /// A hash of nothing yet. + Sha256() : _state = Uint32List.fromList(_iv); + + // A hash that continues from [state] after [length] bytes, all of them + // whole blocks: the precomputed states of HMAC. + Sha256._from(Uint32List state, this._length) + : _state = Uint32List.fromList(state); + + final Uint32List _state; + final Uint32List _w = Uint32List(64); + final Uint8List _block = Uint8List(sha256BlockSize); + int _buffered = 0; + // The number of bytes hashed: an int, exact up to 2^53 - 1, far beyond any + // input of this library. + int _length = 0; + + /// Hashes [data], or its bytes from [start] to [end]. + void add(List data, [int start = 0, int? end]) { + final stop = end ?? data.length; + RangeError.checkValidRange(start, stop, data.length); + var i = start; + _length += stop - start; + if (_buffered > 0) { + while (_buffered < sha256BlockSize && i < stop) { + _block[_buffered++] = data[i++]; + } + if (_buffered < sha256BlockSize) return; + _load(_w, _block, 0); + _compress(_state, _w); + _buffered = 0; + } + for (; i + sha256BlockSize <= stop; i += sha256BlockSize) { + _load(_w, data, i); + _compress(_state, _w); + } + while (i < stop) { + _block[_buffered++] = data[i++]; + } + } + + /// The digest of everything added: 32 bytes. + Uint8List finish() { + final out = Uint8List(sha256Size); + finishInto(out, 0); + return out; + } + + /// Writes the digest into [out] at [offset]. + void finishInto(Uint8List out, int offset) { + // The length in bits, as two 32-bit halves without a 64-bit shift. + final bits = _length * 8; + final high = bits ~/ 0x100000000; + final low = bits - high * 0x100000000; + _block[_buffered++] = 0x80; + if (_buffered > 56) { + _block.fillRange(_buffered, sha256BlockSize, 0); + _load(_w, _block, 0); + _compress(_state, _w); + _buffered = 0; + } + _block.fillRange(_buffered, 56, 0); + _load(_w, _block, 0); + _w[14] = high; + _w[15] = low; + _compress(_state, _w); + _store(_state, out, offset); + _block.fillRange(0, sha256BlockSize, 0); + _w.fillRange(0, 64, 0); + } +} + +/// The SHA-256 digest of [data]. +Uint8List sha256(List data) => (Sha256()..add(data)).finish(); + +/// HMAC-SHA256 (RFC 2104) with a key fixed once: the states after the +/// blocks of the key XOR ipad and XOR opad are computed in the constructor, +/// so that each tag costs only the compressions of the message and two of +/// the padding. [wipe] clears them. +final class HmacSha256 { + /// The HMAC of [key], of any length: a key longer than a block is hashed + /// first, as RFC 2104 says. + HmacSha256(List key) { + final k = Uint8List(sha256BlockSize); + if (key.length > sha256BlockSize) { + k.setAll(0, sha256(key)); + } else { + k.setAll(0, key); + } + final w = Uint32List(64); + for (var i = 0; i < sha256BlockSize; i++) { + k[i] ^= 0x36; + } + _load(w, k, 0); + _inner.setAll(0, _iv); + _compress(_inner, w); + for (var i = 0; i < sha256BlockSize; i++) { + k[i] ^= 0x36 ^ 0x5c; + } + _load(w, k, 0); + _outer.setAll(0, _iv); + _compress(_outer, w); + k.fillRange(0, sha256BlockSize, 0); + w.fillRange(0, 64, 0); + } + + final Uint32List _inner = Uint32List(8); + final Uint32List _outer = Uint32List(8); + + /// The tag of [message]: 32 bytes. + Uint8List mac(List message) { + final h = Sha256._from(_inner, sha256BlockSize)..add(message); + final inner = h.finish(); + final o = Sha256._from(_outer, sha256BlockSize)..add(inner); + inner.fillRange(0, sha256Size, 0); + return o.finish(); + } + + /// The tag of the concatenation of [parts]. + Uint8List macAll(Iterable> parts) { + final h = Sha256._from(_inner, sha256BlockSize); + for (final p in parts) { + h.add(p); + } + final inner = h.finish(); + final o = Sha256._from(_outer, sha256BlockSize)..add(inner); + inner.fillRange(0, sha256Size, 0); + return o.finish(); + } + + /// Clears the states of the key. + void wipe() { + _inner.fillRange(0, 8, 0); + _outer.fillRange(0, 8, 0); + } +} + +/// The HMAC-SHA256 of [message] under [key]. +Uint8List hmacSha256(List key, List message) { + final h = HmacSha256(key); + try { + return h.mac(message); + } finally { + h.wipe(); + } +} + +/// HKDF-Extract of RFC 5869 with SHA-256: the PRK of [ikm]. An empty or null +/// [salt] is the string of 32 zero bytes, as the RFC says and as Go's +/// hkdf.Extract does. +Uint8List hkdfExtract(List ikm, List? salt) { + final s = salt == null || salt.isEmpty ? Uint8List(sha256Size) : salt; + return hmacSha256(s, ikm); +} + +/// HKDF-Expand of RFC 5869 with SHA-256: [length] bytes, at most 255 · 32, +/// from [prk] and [info]. +Uint8List hkdfExpand(List prk, List info, int length) { + if (length < 0 || length > 255 * sha256Size) { + throw RangeError.range(length, 0, 255 * sha256Size, 'length'); + } + final h = HmacSha256(prk); + final out = Uint8List(length); + var t = Uint8List(0); + try { + for (var i = 1, o = 0; o < length; i++) { + final next = h.macAll([ + t, + info, + [i], + ]); + t.fillRange(0, t.length, 0); + t = next; + final n = length - o < sha256Size ? length - o : sha256Size; + out.setRange(o, o + n, t); + o += n; + } + } finally { + t.fillRange(0, t.length, 0); + h.wipe(); + } + return out; +} + +/// HKDF-SHA256 of RFC 5869, Extract then Expand, as Go's hkdf.New read for +/// [length] bytes. +Uint8List hkdfSha256( + List ikm, + List? salt, + List info, + int length, +) { + final prk = hkdfExtract(ikm, salt); + try { + return hkdfExpand(prk, info, length); + } finally { + prk.fillRange(0, prk.length, 0); + } +} + +/// PBKDF2 of RFC 8018 with HMAC-SHA256: [length] bytes of [password] and +/// [salt] after [iterations] iterations, at least 1. Each iteration is two +/// compressions from the precomputed states of the key, over words; spec +/// §38.1 runs it with 600 000 iterations. +Uint8List pbkdf2HmacSha256( + List password, + List salt, + int iterations, + int length, +) { + if (iterations < 1) { + throw RangeError.range(iterations, 1, null, 'iterations'); + } + if (length < 0) throw RangeError.range(length, 0, null, 'length'); + final h = HmacSha256(password); + final out = Uint8List(length); + // The block of the inner and of the outer hash of a 32-byte message after + // the 64 bytes of the key: the message, 0x80, zeros and the length in bits, + // (64 + 32) · 8 = 768. + final w = Uint32List(64); + final u = Uint32List(8); + final acc = Uint32List(8); + final state = Uint32List(8); + final block = Uint8List(sha256Size); + try { + for (var i = 1, o = 0; o < length; i++) { + // U1 = HMAC(P, S || INT(i)), through the general path. + final u1 = h.macAll([ + salt, + [i >>> 24 & 0xff, i >>> 16 & 0xff, i >>> 8 & 0xff, i & 0xff], + ]); + _load16(u, u1); + u1.fillRange(0, sha256Size, 0); + acc.setAll(0, u); + for (var j = 1; j < iterations; j++) { + // The inner hash of U, then the outer hash of that. + _hmacWords(h._inner, u, w, state); + _hmacWords(h._outer, state, w, u); + for (var k = 0; k < 8; k++) { + acc[k] ^= u[k]; + } + } + _store(acc, block, 0); + final n = length - o < sha256Size ? length - o : sha256Size; + out.setRange(o, o + n, block); + o += n; + } + } finally { + h.wipe(); + w.fillRange(0, 64, 0); + u.fillRange(0, 8, 0); + acc.fillRange(0, 8, 0); + state.fillRange(0, 8, 0); + block.fillRange(0, sha256Size, 0); + } + return out; +} + +// The eight big-endian words of a 32-byte digest. +void _load16(Uint32List words, Uint8List digest) { + for (var i = 0; i < 8; i++) { + words[i] = + digest[4 * i] << 24 & _mask32 | + digest[4 * i + 1] << 16 | + digest[4 * i + 2] << 8 | + digest[4 * i + 3]; + } +} + +// out = the compression, from the precomputed state [from], of the block of +// the eight words of [message] and the padding of a 96-byte input. +void _hmacWords( + Uint32List from, + Uint32List message, + Uint32List w, + Uint32List out, +) { + for (var i = 0; i < 8; i++) { + w[i] = message[i]; + } + w[8] = 0x80000000; + for (var i = 9; i < 15; i++) { + w[i] = 0; + } + w[15] = 768; + for (var i = 0; i < 8; i++) { + out[i] = from[i]; + } + _compress(out, w); +} diff --git a/test/primitives_test.dart b/test/primitives_test.dart new file mode 100644 index 0000000..1396900 --- /dev/null +++ b/test/primitives_test.dart @@ -0,0 +1,400 @@ +// The primitives of stage 2 against test/vectors/primitives.json, whose +// expected values Go computed (tool/gen_primitive_vectors.go): SHA-256, +// HMAC, HKDF, PBKDF2, scrypt, ChaCha20, Poly1305, ChaCha20-Poly1305, X25519, +// strict Ed25519, Go's Base64 and age's Bech32. The vectors come from a Dart +// constant, so that these tests also run compiled to JavaScript, where the +// integers are doubles and the bit operators 32-bit; there the cases that +// would take too long (PBKDF2 at 600 000 iterations, scrypt with logN 16) +// are left out. + +import 'dart:convert'; +import 'dart:math'; +import 'dart:typed_data'; + +import 'package:crypto/crypto.dart' as crypto; +import 'package:datekeys/datekeys.dart' show fromHex, toHex; +import 'package:datekeys/src/base64.dart'; +import 'package:datekeys/src/bech32.dart'; +import 'package:datekeys/src/chacha20poly1305.dart'; +import 'package:datekeys/src/curve25519.dart'; +import 'package:datekeys/src/scrypt.dart'; +import 'package:datekeys/src/sha256.dart'; +import 'package:test/test.dart'; + +import 'vectors/primitives.g.dart'; + +/// Whether the tests run compiled to JavaScript. +const isWeb = identical(0, 0.0); + +final Map vectors = + jsonDecode(primitivesJson) as Map; + +List> cases(String name) => + (vectors[name]! as List).cast>(); + +Uint8List hx(Object? v) => fromHex(v! as String); + +/// Whether a case is cheap enough for the platform. +bool affordable(Map c) => !isWeb || c['node'] != false; + +void main() { + group('SHA-256 and HMAC', () { + test('the digests of Go', () { + for (final c in cases('sha256')) { + expect(toHex(sha256(hx(c['message']))), c['digest']); + } + }); + + test('the digest of a message added in pieces', () { + final r = Random(1); + for (var n = 0; n < 300; n += 7) { + final m = Uint8List.fromList([ + for (var i = 0; i < n; i++) r.nextInt(256), + ]); + final h = Sha256(); + for (var i = 0; i < n;) { + final step = 1 + r.nextInt(70); + final end = min(n, i + step); + h.add(m, i, end); + i = end; + } + expect(toHex(h.finish()), crypto.sha256.convert(m).toString()); + } + }); + + test('the tags of Go, and those of package:crypto', () { + for (final c in cases('hmac_sha256')) { + expect(toHex(hmacSha256(hx(c['key']), hx(c['message']))), c['mac']); + } + final r = Random(2); + for (var n = 0; n < 200; n += 13) { + final k = [for (var i = 0; i < n; i++) r.nextInt(256)]; + final m = [for (var i = 0; i < 2 * n; i++) r.nextInt(256)]; + final h = HmacSha256(k); + expect( + toHex(h.mac(m)), + crypto.Hmac(crypto.sha256, k).convert(m).toString(), + ); + expect( + toHex(h.macAll([m.sublist(0, n), m.sublist(n)])), + toHex(h.mac(m)), + ); + } + }); + }); + + test('HKDF-SHA256: RFC 5869 and the labels of age', () { + for (final c in cases('hkdf_sha256')) { + final salt = c['salt'] == null ? null : hx(c['salt']); + expect( + toHex( + hkdfSha256(hx(c['ikm']), salt, hx(c['info']), c['length']! as int), + ), + c['okm'], + reason: c['name'] as String?, + ); + } + expect(() => hkdfExpand(Uint8List(32), [], 255 * 32 + 1), throwsRangeError); + }); + + test( + 'PBKDF2-HMAC-SHA256${isWeb ? ', without the 600 000 iterations' : ''}', + () { + var run = 0; + for (final c in cases('pbkdf2_sha256').where(affordable)) { + final k = pbkdf2HmacSha256( + hx(c['password']), + hx(c['salt']), + c['iterations']! as int, + c['length']! as int, + ); + expect(toHex(k), c['key'], reason: c['name'] as String?); + run++; + } + expect(run, isWeb ? 6 : 7); + expect(() => pbkdf2HmacSha256([1], [2], 0, 32), throwsRangeError); + }, + ); + + test( + 'scrypt: RFC 7914 and the parameters of age${isWeb ? ', without logN 16' : ''}', + () { + var run = 0; + for (final c in cases('scrypt').where(affordable)) { + final k = scrypt( + hx(c['password']), + hx(c['salt']), + c['n']! as int, + c['r']! as int, + c['p']! as int, + c['length']! as int, + ); + expect(toHex(k), c['key'], reason: c['name'] as String?); + run++; + } + expect(run, isWeb ? 6 : 7); + for (final c in cases('scrypt_errors')) { + expect( + () => scrypt( + [1], + [2], + c['n']! as int, + c['r']! as int, + c['p']! as int, + 32, + ), + throwsA( + isA().having( + (e) => e.message, + 'message', + c['error'], + ), + ), + ); + } + }, + ); + + group('ChaCha20-Poly1305', () { + test('ChaCha20: RFC 8439 and the end of the counter', () { + for (final c in cases('chacha20')) { + final data = hx(c['input']); + ChaCha20( + hx(c['key']), + hx(c['nonce']), + c['counter']! as int, + ).xorInPlace(data); + expect(toHex(data), c['output'], reason: c['name'] as String?); + } + // A block past counter 2^32 - 1 is refused, as Go refuses it. + final s = ChaCha20(Uint8List(32), Uint8List(12), 0xffffffff) + ..keystream(64); + expect(() => s.keystream(1), throwsStateError); + }); + + test('Poly1305: RFC 8439 and keys and messages that reach p', () { + for (final c in cases('poly1305')) { + expect( + toHex(poly1305(hx(c['key']), hx(c['message']))), + c['tag'], + reason: c['name'] as String?, + ); + // The same tag with the message in pieces of every size. + final m = hx(c['message']); + for (final step in [1, 7, 16, 33]) { + final p = Poly1305(hx(c['key'])); + for (var i = 0; i < m.length; i += step) { + p.add(m, i, min(m.length, i + step)); + } + expect(toHex(p.finish()), c['tag']); + } + } + }); + + test('the AEAD: RFC 8439 and Go, both ways, and every tampering fails', () { + for (final c in cases('chacha20poly1305')) { + final key = hx(c['key']); + final nonce = hx(c['nonce']); + final aad = hx(c['aad']); + final ct = hx(c['ciphertext']); + expect( + toHex(chacha20Poly1305Seal(key, nonce, hx(c['plaintext']), aad)), + c['ciphertext'], + reason: c['name'] as String?, + ); + expect( + toHex(chacha20Poly1305Open(key, nonce, ct, aad)!), + c['plaintext'], + ); + for (var i = 0; i < ct.length; i += 1 + ct.length ~/ 9) { + final bad = Uint8List.fromList(ct)..[i] ^= 0x10; + expect(chacha20Poly1305Open(key, nonce, bad, aad), isNull); + } + expect( + chacha20Poly1305Open(key, nonce, Uint8List.sublistView(ct, 1), aad), + isNull, + ); + final badAad = [...aad, 0]; + expect(chacha20Poly1305Open(key, nonce, ct, badAad), isNull); + } + expect( + chacha20Poly1305Open(Uint8List(32), Uint8List(12), Uint8List(15)), + isNull, + ); + }); + + test('constantTimeEquals', () { + expect(constantTimeEquals([1, 2], [1, 2]), isTrue); + expect(constantTimeEquals([1, 2], [1, 3]), isFalse); + expect(constantTimeEquals([1, 2], [1]), isFalse); + expect(constantTimeEquals([], []), isTrue); + }); + }); + + group('X25519', () { + test('RFC 7748, BoringSSL, and the points of low order', () { + for (final c in cases('x25519')) { + final scalar = hx(c['scalar']); + final u = hx(c['u']); + expect( + toHex(x25519(scalar, u)), + c['output'], + reason: c['name'] as String?, + ); + if (c['error'] != null) { + expect( + () => x25519Agree(scalar, u), + throwsA( + isA().having( + (e) => e.message, + 'message', + c['error'], + ), + ), + reason: c['name'] as String?, + ); + } else { + expect(toHex(x25519Agree(scalar, u)), c['output']); + } + } + }); + + test( + 'the iterated function of RFC 7748${isWeb ? ', once' : ', 1000 times'}', + () { + final it = vectors['x25519_iterated']! as Map; + var k = Uint8List(32)..[0] = 9; + var u = Uint8List.fromList(k); + for (var i = 1; i <= (isWeb ? 1 : 1000); i++) { + final out = x25519(k, u); + u = k; + k = out; + if (i == 1) expect(toHex(k), it['1']); + } + if (!isWeb) expect(toHex(k), it['1000']); + }, + ); + + test('lengths other than 32 are refused', () { + expect(() => x25519(Uint8List(31), Uint8List(32)), throwsArgumentError); + expect(() => x25519(Uint8List(32), Uint8List(33)), throwsArgumentError); + }); + }); + + group('Ed25519, strict', () { + test('sign.input of Go, its mutations, S + ℓ and the small order', () { + for (final c in cases('ed25519')) { + expect( + verifyStrict( + hx(c['public_key']), + hx(c['message']), + hx(c['signature']), + ), + c['valid'], + reason: c['name'] as String?, + ); + } + }); + + test('Canonical, OnCurve and SmallOrder of ed25519strict', () { + for (final c in cases('ed25519_encodings')) { + final a = hx(c['encoding']); + expect(canonical(a), c['canonical'], reason: '${c['name']}'); + expect(onCurve(a), c['on_curve'], reason: '${c['name']}'); + expect(smallOrder(a), c['small_order'], reason: '${c['name']}'); + } + }); + + test('lengths other than 32 and 64 are not valid', () { + final c = cases('ed25519').first; + final pub = hx(c['public_key']); + final sig = hx(c['signature']); + final m = hx(c['message']); + expect(verifyStrict(pub, m, sig), isTrue); + expect(verifyStrict(pub.sublist(1), m, sig), isFalse); + expect(verifyStrict(pub, m, sig.sublist(1)), isFalse); + expect(verifyStrict(pub, m, [...sig, 0]), isFalse); + expect(canonical(Uint8List(31)), isFalse); + expect(onCurve(Uint8List(33)), isFalse); + expect(smallOrder(Uint8List(31)), isFalse); + }); + + test('the eight points of small order are canonical points', () { + // primitives.json checks smallOrder against Go's table; here, that the + // table holds eight canonical points of the curve. + final points = smallOrderPoints(); + expect(points, hasLength(8)); + for (final p in points) { + expect(canonical(p), isTrue); + expect(onCurve(p), isTrue); + expect(smallOrder(p), isTrue); + } + }); + }); + + test("Go's Base64, with the offsets of its errors", () { + for (final c in cases('base64')) { + final input = hx(c['input']); + Object result; + try { + result = toHex( + goBase64Decode( + input, + url: c['url']! as bool, + padded: c['padded']! as bool, + strict: c['strict']! as bool, + ), + ); + } on Base64Exception catch (e) { + result = e.message; + } + expect( + result, + c['error'] ?? c['output'], + reason: '${c['encoding']}: ${c['input']}', + ); + if (c['error'] == null && + !(c['padded']! as bool) && + c['strict']! as bool) { + // A canonical unpadded encoding encodes back to itself. + final s = String.fromCharCodes(input); + if (!s.contains('\n') && !s.contains('\r')) { + expect( + goBase64Encode( + fromHex(c['output']! as String), + url: c['url']! as bool, + padded: false, + ), + s, + ); + } + } + } + }); + + test("age's Bech32, with its error texts", () { + for (final c in cases('bech32')) { + Object result; + if (c['op'] == 'decode') { + try { + final d = bech32Decode(c['input']! as String); + result = '${d.hrp} ${toHex(d.data)}'; + } on Bech32Exception catch (e) { + result = e.message; + } + expect( + result, + c['error'] ?? '${c['hrp']} ${c['data']}', + reason: c['input'] as String?, + ); + } else { + try { + result = bech32Encode(c['hrp']! as String, hx(c['data'])); + } on Bech32Exception catch (e) { + result = e.message; + } + expect(result, c['error'] ?? c['output'], reason: '${c['hrp']}'); + } + } + }); +} diff --git a/test/primitives_vm_test.dart b/test/primitives_vm_test.dart new file mode 100644 index 0000000..8726cab --- /dev/null +++ b/test/primitives_vm_test.dart @@ -0,0 +1,18 @@ +// The copy of test/vectors/primitives.json that primitives_test.dart reads, +// a Dart constant for the tests compiled to JavaScript, is the JSON file +// byte for byte: tool/gen_primitive_vectors.go writes both. +@TestOn('vm') +library; + +import 'dart:io'; + +import 'package:test/test.dart'; + +import 'vectors/primitives.g.dart'; + +void main() { + test('primitives.g.dart holds primitives.json', () { + final file = File('test/vectors/primitives.json').readAsStringSync(); + expect(primitivesJson, file); + }); +} diff --git a/test/vectors/primitives.g.dart b/test/vectors/primitives.g.dart new file mode 100644 index 0000000..389635c --- /dev/null +++ b/test/vectors/primitives.g.dart @@ -0,0 +1,5192 @@ +// Generated by tool/gen_primitive_vectors.go from primitives.json, for the +// tests that also run compiled to JavaScript, where no file can be read. Do +// not edit. + +/// The text of test/vectors/primitives.json. +const primitivesJson = r''' +{ + "base64": [ + { + "encoding": "std raw strict (age)", + "input": "", + "output": "", + "padded": false, + "strict": true, + "url": false + }, + { + "encoding": "std raw strict (age)", + "error": "illegal base64 data at input byte 0", + "input": "41", + "padded": false, + "strict": true, + "url": false + }, + { + "encoding": "std raw strict (age)", + "input": "4141", + "output": "00", + "padded": false, + "strict": true, + "url": false + }, + { + "encoding": "std raw strict (age)", + "error": "illegal base64 data at input byte 0", + "input": "4142", + "padded": false, + "strict": true, + "url": false + }, + { + "encoding": "std raw strict (age)", + "input": "414141", + "output": "0000", + "padded": false, + "strict": true, + "url": false + }, + { + "encoding": "std raw strict (age)", + "error": "illegal base64 data at input byte 2", + "input": "414142", + "padded": false, + "strict": true, + "url": false + }, + { + "encoding": "std raw strict (age)", + "input": "41414141", + "output": "000000", + "padded": false, + "strict": true, + "url": false + }, + { + "encoding": "std raw strict (age)", + "error": "illegal base64 data at input byte 2", + "input": "41413d3d", + "padded": false, + "strict": true, + "url": false + }, + { + "encoding": "std raw strict (age)", + "error": "illegal base64 data at input byte 3", + "input": "4141413d", + "padded": false, + "strict": true, + "url": false + }, + { + "encoding": "std raw strict (age)", + "error": "illegal base64 data at input byte 1", + "input": "413d3d3d", + "padded": false, + "strict": true, + "url": false + }, + { + "encoding": "std raw strict (age)", + "error": "illegal base64 data at input byte 2", + "input": "41423d3d", + "padded": false, + "strict": true, + "url": false + }, + { + "encoding": "std raw strict (age)", + "error": "illegal base64 data at input byte 3", + "input": "4141423d", + "padded": false, + "strict": true, + "url": false + }, + { + "encoding": "std raw strict (age)", + "error": "illegal base64 data at input byte 0", + "input": "3d", + "padded": false, + "strict": true, + "url": false + }, + { + "encoding": "std raw strict (age)", + "error": "illegal base64 data at input byte 0", + "input": "3d3d", + "padded": false, + "strict": true, + "url": false + }, + { + "encoding": "std raw strict (age)", + "error": "illegal base64 data at input byte 2", + "input": "41413d", + "padded": false, + "strict": true, + "url": false + }, + { + "encoding": "std raw strict (age)", + "error": "illegal base64 data at input byte 2", + "input": "41413d41", + "padded": false, + "strict": true, + "url": false + }, + { + "encoding": "std raw strict (age)", + "error": "illegal base64 data at input byte 2", + "input": "41413d3d41", + "padded": false, + "strict": true, + "url": false + }, + { + "encoding": "std raw strict (age)", + "input": "41410a", + "output": "00", + "padded": false, + "strict": true, + "url": false + }, + { + "encoding": "std raw strict (age)", + "input": "410a41", + "output": "00", + "padded": false, + "strict": true, + "url": false + }, + { + "encoding": "std raw strict (age)", + "input": "41410d0a", + "output": "00", + "padded": false, + "strict": true, + "url": false + }, + { + "encoding": "std raw strict (age)", + "input": "0a41414141", + "output": "000000", + "padded": false, + "strict": true, + "url": false + }, + { + "encoding": "std raw strict (age)", + "input": "5a6d3976", + "output": "666f6f", + "padded": false, + "strict": true, + "url": false + }, + { + "encoding": "std raw strict (age)", + "error": "illegal base64 data at input byte 2", + "input": "5a6d39", + "padded": false, + "strict": true, + "url": false + }, + { + "encoding": "std raw strict (age)", + "input": "5a6d38", + "output": "666f", + "padded": false, + "strict": true, + "url": false + }, + { + "encoding": "std raw strict (age)", + "error": "illegal base64 data at input byte 0", + "input": "5a6d", + "padded": false, + "strict": true, + "url": false + }, + { + "encoding": "std raw strict (age)", + "input": "5a67", + "output": "66", + "padded": false, + "strict": true, + "url": false + }, + { + "encoding": "std raw strict (age)", + "error": "illegal base64 data at input byte 0", + "input": "5a68", + "padded": false, + "strict": true, + "url": false + }, + { + "encoding": "std raw strict (age)", + "error": "illegal base64 data at input byte 0", + "input": "5a", + "padded": false, + "strict": true, + "url": false + }, + { + "encoding": "std raw strict (age)", + "error": "illegal base64 data at input byte 4", + "input": "5a6d39763d", + "padded": false, + "strict": true, + "url": false + }, + { + "encoding": "std raw strict (age)", + "error": "illegal base64 data at input byte 2", + "input": "5a6d8076", + "padded": false, + "strict": true, + "url": false + }, + { + "encoding": "std raw strict (age)", + "error": "illegal base64 data at input byte 0", + "input": "205a6d3976", + "padded": false, + "strict": true, + "url": false + }, + { + "encoding": "std raw strict (age)", + "error": "illegal base64 data at input byte 2", + "input": "5a6d2d76", + "padded": false, + "strict": true, + "url": false + }, + { + "encoding": "std raw strict (age)", + "error": "illegal base64 data at input byte 2", + "input": "5a6d5f76", + "padded": false, + "strict": true, + "url": false + }, + { + "encoding": "std raw strict (age)", + "input": "5a6d2b76", + "output": "666faf", + "padded": false, + "strict": true, + "url": false + }, + { + "encoding": "std raw strict (age)", + "input": "5a6d2f76", + "output": "666fef", + "padded": false, + "strict": true, + "url": false + }, + { + "encoding": "std raw strict (age)", + "input": "5a6d3976596d4679", + "output": "666f6f626172", + "padded": false, + "strict": true, + "url": false + }, + { + "encoding": "std raw strict (age)", + "error": "illegal base64 data at input byte 12", + "input": "5a6d3976596d46795a6d3976216d4679", + "padded": false, + "strict": true, + "url": false + }, + { + "encoding": "std raw strict (age)", + "error": "illegal base64 data at input byte 14", + "input": "5a6d3976596d46795a6d3976596d46", + "padded": false, + "strict": true, + "url": false + }, + { + "encoding": "std raw strict (age)", + "input": "5a6d3976596d46795a6d3976596d45", + "output": "666f6f626172666f6f6261", + "padded": false, + "strict": true, + "url": false + }, + { + "encoding": "std raw strict (age)", + "error": "illegal base64 data at input byte 15", + "input": "5a6d3976596d46795a6d3976596d453d", + "padded": false, + "strict": true, + "url": false + }, + { + "encoding": "std raw strict (age)", + "error": "illegal base64 data at input byte 14", + "input": "5a6d3976596d46795a6d3976596d3d3d", + "padded": false, + "strict": true, + "url": false + }, + { + "encoding": "std raw strict (age)", + "error": "illegal base64 data at input byte 12", + "input": "5a6d3976596d46795a6d3976596d", + "padded": false, + "strict": true, + "url": false + }, + { + "encoding": "std raw strict (age)", + "error": "illegal base64 data at input byte 40", + "input": "5a6d3976596d46795a6d3976596d46795a6d3976596d46795a6d3976596d46795a6d3976596d46792a", + "padded": false, + "strict": true, + "url": false + }, + { + "encoding": "std raw strict (age)", + "error": "illegal base64 data at input byte 4", + "input": "4141414100414141", + "padded": false, + "strict": true, + "url": false + }, + { + "encoding": "std raw strict (age)", + "input": "41414141414141414141414141414141414141414141414141414141414141414141414141414141414141", + "output": "0000000000000000000000000000000000000000000000000000000000000000", + "padded": false, + "strict": true, + "url": false + }, + { + "encoding": "std raw strict (age)", + "error": "illegal base64 data at input byte 42", + "input": "41414141414141414141414141414141414141414141414141414141414141414141414141414141414142", + "padded": false, + "strict": true, + "url": false + }, + { + "encoding": "std padded strict", + "input": "", + "output": "", + "padded": true, + "strict": true, + "url": false + }, + { + "encoding": "std padded strict", + "error": "illegal base64 data at input byte 0", + "input": "41", + "padded": true, + "strict": true, + "url": false + }, + { + "encoding": "std padded strict", + "error": "illegal base64 data at input byte 0", + "input": "4141", + "padded": true, + "strict": true, + "url": false + }, + { + "encoding": "std padded strict", + "error": "illegal base64 data at input byte 0", + "input": "4142", + "padded": true, + "strict": true, + "url": false + }, + { + "encoding": "std padded strict", + "error": "illegal base64 data at input byte 0", + "input": "414141", + "padded": true, + "strict": true, + "url": false + }, + { + "encoding": "std padded strict", + "error": "illegal base64 data at input byte 0", + "input": "414142", + "padded": true, + "strict": true, + "url": false + }, + { + "encoding": "std padded strict", + "input": "41414141", + "output": "000000", + "padded": true, + "strict": true, + "url": false + }, + { + "encoding": "std padded strict", + "input": "41413d3d", + "output": "00", + "padded": true, + "strict": true, + "url": false + }, + { + "encoding": "std padded strict", + "input": "4141413d", + "output": "0000", + "padded": true, + "strict": true, + "url": false + }, + { + "encoding": "std padded strict", + "error": "illegal base64 data at input byte 1", + "input": "413d3d3d", + "padded": true, + "strict": true, + "url": false + }, + { + "encoding": "std padded strict", + "error": "illegal base64 data at input byte 2", + "input": "41423d3d", + "padded": true, + "strict": true, + "url": false + }, + { + "encoding": "std padded strict", + "error": "illegal base64 data at input byte 3", + "input": "4141423d", + "padded": true, + "strict": true, + "url": false + }, + { + "encoding": "std padded strict", + "error": "illegal base64 data at input byte 0", + "input": "3d", + "padded": true, + "strict": true, + "url": false + }, + { + "encoding": "std padded strict", + "error": "illegal base64 data at input byte 0", + "input": "3d3d", + "padded": true, + "strict": true, + "url": false + }, + { + "encoding": "std padded strict", + "error": "illegal base64 data at input byte 3", + "input": "41413d", + "padded": true, + "strict": true, + "url": false + }, + { + "encoding": "std padded strict", + "error": "illegal base64 data at input byte 2", + "input": "41413d41", + "padded": true, + "strict": true, + "url": false + }, + { + "encoding": "std padded strict", + "error": "illegal base64 data at input byte 4", + "input": "41413d3d41", + "padded": true, + "strict": true, + "url": false + }, + { + "encoding": "std padded strict", + "error": "illegal base64 data at input byte 1", + "input": "41410a", + "padded": true, + "strict": true, + "url": false + }, + { + "encoding": "std padded strict", + "error": "illegal base64 data at input byte 1", + "input": "410a41", + "padded": true, + "strict": true, + "url": false + }, + { + "encoding": "std padded strict", + "error": "illegal base64 data at input byte 2", + "input": "41410d0a", + "padded": true, + "strict": true, + "url": false + }, + { + "encoding": "std padded strict", + "input": "0a41414141", + "output": "000000", + "padded": true, + "strict": true, + "url": false + }, + { + "encoding": "std padded strict", + "input": "5a6d3976", + "output": "666f6f", + "padded": true, + "strict": true, + "url": false + }, + { + "encoding": "std padded strict", + "error": "illegal base64 data at input byte 0", + "input": "5a6d39", + "padded": true, + "strict": true, + "url": false + }, + { + "encoding": "std padded strict", + "error": "illegal base64 data at input byte 0", + "input": "5a6d38", + "padded": true, + "strict": true, + "url": false + }, + { + "encoding": "std padded strict", + "error": "illegal base64 data at input byte 0", + "input": "5a6d", + "padded": true, + "strict": true, + "url": false + }, + { + "encoding": "std padded strict", + "error": "illegal base64 data at input byte 0", + "input": "5a67", + "padded": true, + "strict": true, + "url": false + }, + { + "encoding": "std padded strict", + "error": "illegal base64 data at input byte 0", + "input": "5a68", + "padded": true, + "strict": true, + "url": false + }, + { + "encoding": "std padded strict", + "error": "illegal base64 data at input byte 0", + "input": "5a", + "padded": true, + "strict": true, + "url": false + }, + { + "encoding": "std padded strict", + "error": "illegal base64 data at input byte 4", + "input": "5a6d39763d", + "padded": true, + "strict": true, + "url": false + }, + { + "encoding": "std padded strict", + "error": "illegal base64 data at input byte 2", + "input": "5a6d8076", + "padded": true, + "strict": true, + "url": false + }, + { + "encoding": "std padded strict", + "error": "illegal base64 data at input byte 0", + "input": "205a6d3976", + "padded": true, + "strict": true, + "url": false + }, + { + "encoding": "std padded strict", + "error": "illegal base64 data at input byte 2", + "input": "5a6d2d76", + "padded": true, + "strict": true, + "url": false + }, + { + "encoding": "std padded strict", + "error": "illegal base64 data at input byte 2", + "input": "5a6d5f76", + "padded": true, + "strict": true, + "url": false + }, + { + "encoding": "std padded strict", + "input": "5a6d2b76", + "output": "666faf", + "padded": true, + "strict": true, + "url": false + }, + { + "encoding": "std padded strict", + "input": "5a6d2f76", + "output": "666fef", + "padded": true, + "strict": true, + "url": false + }, + { + "encoding": "std padded strict", + "input": "5a6d3976596d4679", + "output": "666f6f626172", + "padded": true, + "strict": true, + "url": false + }, + { + "encoding": "std padded strict", + "error": "illegal base64 data at input byte 12", + "input": "5a6d3976596d46795a6d3976216d4679", + "padded": true, + "strict": true, + "url": false + }, + { + "encoding": "std padded strict", + "error": "illegal base64 data at input byte 12", + "input": "5a6d3976596d46795a6d3976596d46", + "padded": true, + "strict": true, + "url": false + }, + { + "encoding": "std padded strict", + "error": "illegal base64 data at input byte 12", + "input": "5a6d3976596d46795a6d3976596d45", + "padded": true, + "strict": true, + "url": false + }, + { + "encoding": "std padded strict", + "input": "5a6d3976596d46795a6d3976596d453d", + "output": "666f6f626172666f6f6261", + "padded": true, + "strict": true, + "url": false + }, + { + "encoding": "std padded strict", + "error": "illegal base64 data at input byte 14", + "input": "5a6d3976596d46795a6d3976596d3d3d", + "padded": true, + "strict": true, + "url": false + }, + { + "encoding": "std padded strict", + "error": "illegal base64 data at input byte 12", + "input": "5a6d3976596d46795a6d3976596d", + "padded": true, + "strict": true, + "url": false + }, + { + "encoding": "std padded strict", + "error": "illegal base64 data at input byte 40", + "input": "5a6d3976596d46795a6d3976596d46795a6d3976596d46795a6d3976596d46795a6d3976596d46792a", + "padded": true, + "strict": true, + "url": false + }, + { + "encoding": "std padded strict", + "error": "illegal base64 data at input byte 4", + "input": "4141414100414141", + "padded": true, + "strict": true, + "url": false + }, + { + "encoding": "std padded strict", + "error": "illegal base64 data at input byte 40", + "input": "41414141414141414141414141414141414141414141414141414141414141414141414141414141414141", + "padded": true, + "strict": true, + "url": false + }, + { + "encoding": "std padded strict", + "error": "illegal base64 data at input byte 40", + "input": "41414141414141414141414141414141414141414141414141414141414141414141414141414141414142", + "padded": true, + "strict": true, + "url": false + }, + { + "encoding": "url raw strict", + "input": "", + "output": "", + "padded": false, + "strict": true, + "url": true + }, + { + "encoding": "url raw strict", + "error": "illegal base64 data at input byte 0", + "input": "41", + "padded": false, + "strict": true, + "url": true + }, + { + "encoding": "url raw strict", + "input": "4141", + "output": "00", + "padded": false, + "strict": true, + "url": true + }, + { + "encoding": "url raw strict", + "error": "illegal base64 data at input byte 0", + "input": "4142", + "padded": false, + "strict": true, + "url": true + }, + { + "encoding": "url raw strict", + "input": "414141", + "output": "0000", + "padded": false, + "strict": true, + "url": true + }, + { + "encoding": "url raw strict", + "error": "illegal base64 data at input byte 2", + "input": "414142", + "padded": false, + "strict": true, + "url": true + }, + { + "encoding": "url raw strict", + "input": "41414141", + "output": "000000", + "padded": false, + "strict": true, + "url": true + }, + { + "encoding": "url raw strict", + "error": "illegal base64 data at input byte 2", + "input": "41413d3d", + "padded": false, + "strict": true, + "url": true + }, + { + "encoding": "url raw strict", + "error": "illegal base64 data at input byte 3", + "input": "4141413d", + "padded": false, + "strict": true, + "url": true + }, + { + "encoding": "url raw strict", + "error": "illegal base64 data at input byte 1", + "input": "413d3d3d", + "padded": false, + "strict": true, + "url": true + }, + { + "encoding": "url raw strict", + "error": "illegal base64 data at input byte 2", + "input": "41423d3d", + "padded": false, + "strict": true, + "url": true + }, + { + "encoding": "url raw strict", + "error": "illegal base64 data at input byte 3", + "input": "4141423d", + "padded": false, + "strict": true, + "url": true + }, + { + "encoding": "url raw strict", + "error": "illegal base64 data at input byte 0", + "input": "3d", + "padded": false, + "strict": true, + "url": true + }, + { + "encoding": "url raw strict", + "error": "illegal base64 data at input byte 0", + "input": "3d3d", + "padded": false, + "strict": true, + "url": true + }, + { + "encoding": "url raw strict", + "error": "illegal base64 data at input byte 2", + "input": "41413d", + "padded": false, + "strict": true, + "url": true + }, + { + "encoding": "url raw strict", + "error": "illegal base64 data at input byte 2", + "input": "41413d41", + "padded": false, + "strict": true, + "url": true + }, + { + "encoding": "url raw strict", + "error": "illegal base64 data at input byte 2", + "input": "41413d3d41", + "padded": false, + "strict": true, + "url": true + }, + { + "encoding": "url raw strict", + "input": "41410a", + "output": "00", + "padded": false, + "strict": true, + "url": true + }, + { + "encoding": "url raw strict", + "input": "410a41", + "output": "00", + "padded": false, + "strict": true, + "url": true + }, + { + "encoding": "url raw strict", + "input": "41410d0a", + "output": "00", + "padded": false, + "strict": true, + "url": true + }, + { + "encoding": "url raw strict", + "input": "0a41414141", + "output": "000000", + "padded": false, + "strict": true, + "url": true + }, + { + "encoding": "url raw strict", + "input": "5a6d3976", + "output": "666f6f", + "padded": false, + "strict": true, + "url": true + }, + { + "encoding": "url raw strict", + "error": "illegal base64 data at input byte 2", + "input": "5a6d39", + "padded": false, + "strict": true, + "url": true + }, + { + "encoding": "url raw strict", + "input": "5a6d38", + "output": "666f", + "padded": false, + "strict": true, + "url": true + }, + { + "encoding": "url raw strict", + "error": "illegal base64 data at input byte 0", + "input": "5a6d", + "padded": false, + "strict": true, + "url": true + }, + { + "encoding": "url raw strict", + "input": "5a67", + "output": "66", + "padded": false, + "strict": true, + "url": true + }, + { + "encoding": "url raw strict", + "error": "illegal base64 data at input byte 0", + "input": "5a68", + "padded": false, + "strict": true, + "url": true + }, + { + "encoding": "url raw strict", + "error": "illegal base64 data at input byte 0", + "input": "5a", + "padded": false, + "strict": true, + "url": true + }, + { + "encoding": "url raw strict", + "error": "illegal base64 data at input byte 4", + "input": "5a6d39763d", + "padded": false, + "strict": true, + "url": true + }, + { + "encoding": "url raw strict", + "error": "illegal base64 data at input byte 2", + "input": "5a6d8076", + "padded": false, + "strict": true, + "url": true + }, + { + "encoding": "url raw strict", + "error": "illegal base64 data at input byte 0", + "input": "205a6d3976", + "padded": false, + "strict": true, + "url": true + }, + { + "encoding": "url raw strict", + "input": "5a6d2d76", + "output": "666faf", + "padded": false, + "strict": true, + "url": true + }, + { + "encoding": "url raw strict", + "input": "5a6d5f76", + "output": "666fef", + "padded": false, + "strict": true, + "url": true + }, + { + "encoding": "url raw strict", + "error": "illegal base64 data at input byte 2", + "input": "5a6d2b76", + "padded": false, + "strict": true, + "url": true + }, + { + "encoding": "url raw strict", + "error": "illegal base64 data at input byte 2", + "input": "5a6d2f76", + "padded": false, + "strict": true, + "url": true + }, + { + "encoding": "url raw strict", + "input": "5a6d3976596d4679", + "output": "666f6f626172", + "padded": false, + "strict": true, + "url": true + }, + { + "encoding": "url raw strict", + "error": "illegal base64 data at input byte 12", + "input": "5a6d3976596d46795a6d3976216d4679", + "padded": false, + "strict": true, + "url": true + }, + { + "encoding": "url raw strict", + "error": "illegal base64 data at input byte 14", + "input": "5a6d3976596d46795a6d3976596d46", + "padded": false, + "strict": true, + "url": true + }, + { + "encoding": "url raw strict", + "input": "5a6d3976596d46795a6d3976596d45", + "output": "666f6f626172666f6f6261", + "padded": false, + "strict": true, + "url": true + }, + { + "encoding": "url raw strict", + "error": "illegal base64 data at input byte 15", + "input": "5a6d3976596d46795a6d3976596d453d", + "padded": false, + "strict": true, + "url": true + }, + { + "encoding": "url raw strict", + "error": "illegal base64 data at input byte 14", + "input": "5a6d3976596d46795a6d3976596d3d3d", + "padded": false, + "strict": true, + "url": true + }, + { + "encoding": "url raw strict", + "error": "illegal base64 data at input byte 12", + "input": "5a6d3976596d46795a6d3976596d", + "padded": false, + "strict": true, + "url": true + }, + { + "encoding": "url raw strict", + "error": "illegal base64 data at input byte 40", + "input": "5a6d3976596d46795a6d3976596d46795a6d3976596d46795a6d3976596d46795a6d3976596d46792a", + "padded": false, + "strict": true, + "url": true + }, + { + "encoding": "url raw strict", + "error": "illegal base64 data at input byte 4", + "input": "4141414100414141", + "padded": false, + "strict": true, + "url": true + }, + { + "encoding": "url raw strict", + "input": "41414141414141414141414141414141414141414141414141414141414141414141414141414141414141", + "output": "0000000000000000000000000000000000000000000000000000000000000000", + "padded": false, + "strict": true, + "url": true + }, + { + "encoding": "url raw strict", + "error": "illegal base64 data at input byte 42", + "input": "41414141414141414141414141414141414141414141414141414141414141414141414141414141414142", + "padded": false, + "strict": true, + "url": true + }, + { + "encoding": "std padded", + "input": "", + "output": "", + "padded": true, + "strict": false, + "url": false + }, + { + "encoding": "std padded", + "error": "illegal base64 data at input byte 0", + "input": "41", + "padded": true, + "strict": false, + "url": false + }, + { + "encoding": "std padded", + "error": "illegal base64 data at input byte 0", + "input": "4141", + "padded": true, + "strict": false, + "url": false + }, + { + "encoding": "std padded", + "error": "illegal base64 data at input byte 0", + "input": "4142", + "padded": true, + "strict": false, + "url": false + }, + { + "encoding": "std padded", + "error": "illegal base64 data at input byte 0", + "input": "414141", + "padded": true, + "strict": false, + "url": false + }, + { + "encoding": "std padded", + "error": "illegal base64 data at input byte 0", + "input": "414142", + "padded": true, + "strict": false, + "url": false + }, + { + "encoding": "std padded", + "input": "41414141", + "output": "000000", + "padded": true, + "strict": false, + "url": false + }, + { + "encoding": "std padded", + "input": "41413d3d", + "output": "00", + "padded": true, + "strict": false, + "url": false + }, + { + "encoding": "std padded", + "input": "4141413d", + "output": "0000", + "padded": true, + "strict": false, + "url": false + }, + { + "encoding": "std padded", + "error": "illegal base64 data at input byte 1", + "input": "413d3d3d", + "padded": true, + "strict": false, + "url": false + }, + { + "encoding": "std padded", + "input": "41423d3d", + "output": "00", + "padded": true, + "strict": false, + "url": false + }, + { + "encoding": "std padded", + "input": "4141423d", + "output": "0000", + "padded": true, + "strict": false, + "url": false + }, + { + "encoding": "std padded", + "error": "illegal base64 data at input byte 0", + "input": "3d", + "padded": true, + "strict": false, + "url": false + }, + { + "encoding": "std padded", + "error": "illegal base64 data at input byte 0", + "input": "3d3d", + "padded": true, + "strict": false, + "url": false + }, + { + "encoding": "std padded", + "error": "illegal base64 data at input byte 3", + "input": "41413d", + "padded": true, + "strict": false, + "url": false + }, + { + "encoding": "std padded", + "error": "illegal base64 data at input byte 2", + "input": "41413d41", + "padded": true, + "strict": false, + "url": false + }, + { + "encoding": "std padded", + "error": "illegal base64 data at input byte 4", + "input": "41413d3d41", + "padded": true, + "strict": false, + "url": false + }, + { + "encoding": "std padded", + "error": "illegal base64 data at input byte 1", + "input": "41410a", + "padded": true, + "strict": false, + "url": false + }, + { + "encoding": "std padded", + "error": "illegal base64 data at input byte 1", + "input": "410a41", + "padded": true, + "strict": false, + "url": false + }, + { + "encoding": "std padded", + "error": "illegal base64 data at input byte 2", + "input": "41410d0a", + "padded": true, + "strict": false, + "url": false + }, + { + "encoding": "std padded", + "input": "0a41414141", + "output": "000000", + "padded": true, + "strict": false, + "url": false + }, + { + "encoding": "std padded", + "input": "5a6d3976", + "output": "666f6f", + "padded": true, + "strict": false, + "url": false + }, + { + "encoding": "std padded", + "error": "illegal base64 data at input byte 0", + "input": "5a6d39", + "padded": true, + "strict": false, + "url": false + }, + { + "encoding": "std padded", + "error": "illegal base64 data at input byte 0", + "input": "5a6d38", + "padded": true, + "strict": false, + "url": false + }, + { + "encoding": "std padded", + "error": "illegal base64 data at input byte 0", + "input": "5a6d", + "padded": true, + "strict": false, + "url": false + }, + { + "encoding": "std padded", + "error": "illegal base64 data at input byte 0", + "input": "5a67", + "padded": true, + "strict": false, + "url": false + }, + { + "encoding": "std padded", + "error": "illegal base64 data at input byte 0", + "input": "5a68", + "padded": true, + "strict": false, + "url": false + }, + { + "encoding": "std padded", + "error": "illegal base64 data at input byte 0", + "input": "5a", + "padded": true, + "strict": false, + "url": false + }, + { + "encoding": "std padded", + "error": "illegal base64 data at input byte 4", + "input": "5a6d39763d", + "padded": true, + "strict": false, + "url": false + }, + { + "encoding": "std padded", + "error": "illegal base64 data at input byte 2", + "input": "5a6d8076", + "padded": true, + "strict": false, + "url": false + }, + { + "encoding": "std padded", + "error": "illegal base64 data at input byte 0", + "input": "205a6d3976", + "padded": true, + "strict": false, + "url": false + }, + { + "encoding": "std padded", + "error": "illegal base64 data at input byte 2", + "input": "5a6d2d76", + "padded": true, + "strict": false, + "url": false + }, + { + "encoding": "std padded", + "error": "illegal base64 data at input byte 2", + "input": "5a6d5f76", + "padded": true, + "strict": false, + "url": false + }, + { + "encoding": "std padded", + "input": "5a6d2b76", + "output": "666faf", + "padded": true, + "strict": false, + "url": false + }, + { + "encoding": "std padded", + "input": "5a6d2f76", + "output": "666fef", + "padded": true, + "strict": false, + "url": false + }, + { + "encoding": "std padded", + "input": "5a6d3976596d4679", + "output": "666f6f626172", + "padded": true, + "strict": false, + "url": false + }, + { + "encoding": "std padded", + "error": "illegal base64 data at input byte 12", + "input": "5a6d3976596d46795a6d3976216d4679", + "padded": true, + "strict": false, + "url": false + }, + { + "encoding": "std padded", + "error": "illegal base64 data at input byte 12", + "input": "5a6d3976596d46795a6d3976596d46", + "padded": true, + "strict": false, + "url": false + }, + { + "encoding": "std padded", + "error": "illegal base64 data at input byte 12", + "input": "5a6d3976596d46795a6d3976596d45", + "padded": true, + "strict": false, + "url": false + }, + { + "encoding": "std padded", + "input": "5a6d3976596d46795a6d3976596d453d", + "output": "666f6f626172666f6f6261", + "padded": true, + "strict": false, + "url": false + }, + { + "encoding": "std padded", + "input": "5a6d3976596d46795a6d3976596d3d3d", + "output": "666f6f626172666f6f62", + "padded": true, + "strict": false, + "url": false + }, + { + "encoding": "std padded", + "error": "illegal base64 data at input byte 12", + "input": "5a6d3976596d46795a6d3976596d", + "padded": true, + "strict": false, + "url": false + }, + { + "encoding": "std padded", + "error": "illegal base64 data at input byte 40", + "input": "5a6d3976596d46795a6d3976596d46795a6d3976596d46795a6d3976596d46795a6d3976596d46792a", + "padded": true, + "strict": false, + "url": false + }, + { + "encoding": "std padded", + "error": "illegal base64 data at input byte 4", + "input": "4141414100414141", + "padded": true, + "strict": false, + "url": false + }, + { + "encoding": "std padded", + "error": "illegal base64 data at input byte 40", + "input": "41414141414141414141414141414141414141414141414141414141414141414141414141414141414141", + "padded": true, + "strict": false, + "url": false + }, + { + "encoding": "std padded", + "error": "illegal base64 data at input byte 40", + "input": "41414141414141414141414141414141414141414141414141414141414141414141414141414141414142", + "padded": true, + "strict": false, + "url": false + }, + { + "encoding": "url raw", + "input": "", + "output": "", + "padded": false, + "strict": false, + "url": true + }, + { + "encoding": "url raw", + "error": "illegal base64 data at input byte 0", + "input": "41", + "padded": false, + "strict": false, + "url": true + }, + { + "encoding": "url raw", + "input": "4141", + "output": "00", + "padded": false, + "strict": false, + "url": true + }, + { + "encoding": "url raw", + "input": "4142", + "output": "00", + "padded": false, + "strict": false, + "url": true + }, + { + "encoding": "url raw", + "input": "414141", + "output": "0000", + "padded": false, + "strict": false, + "url": true + }, + { + "encoding": "url raw", + "input": "414142", + "output": "0000", + "padded": false, + "strict": false, + "url": true + }, + { + "encoding": "url raw", + "input": "41414141", + "output": "000000", + "padded": false, + "strict": false, + "url": true + }, + { + "encoding": "url raw", + "error": "illegal base64 data at input byte 2", + "input": "41413d3d", + "padded": false, + "strict": false, + "url": true + }, + { + "encoding": "url raw", + "error": "illegal base64 data at input byte 3", + "input": "4141413d", + "padded": false, + "strict": false, + "url": true + }, + { + "encoding": "url raw", + "error": "illegal base64 data at input byte 1", + "input": "413d3d3d", + "padded": false, + "strict": false, + "url": true + }, + { + "encoding": "url raw", + "error": "illegal base64 data at input byte 2", + "input": "41423d3d", + "padded": false, + "strict": false, + "url": true + }, + { + "encoding": "url raw", + "error": "illegal base64 data at input byte 3", + "input": "4141423d", + "padded": false, + "strict": false, + "url": true + }, + { + "encoding": "url raw", + "error": "illegal base64 data at input byte 0", + "input": "3d", + "padded": false, + "strict": false, + "url": true + }, + { + "encoding": "url raw", + "error": "illegal base64 data at input byte 0", + "input": "3d3d", + "padded": false, + "strict": false, + "url": true + }, + { + "encoding": "url raw", + "error": "illegal base64 data at input byte 2", + "input": "41413d", + "padded": false, + "strict": false, + "url": true + }, + { + "encoding": "url raw", + "error": "illegal base64 data at input byte 2", + "input": "41413d41", + "padded": false, + "strict": false, + "url": true + }, + { + "encoding": "url raw", + "error": "illegal base64 data at input byte 2", + "input": "41413d3d41", + "padded": false, + "strict": false, + "url": true + }, + { + "encoding": "url raw", + "input": "41410a", + "output": "00", + "padded": false, + "strict": false, + "url": true + }, + { + "encoding": "url raw", + "input": "410a41", + "output": "00", + "padded": false, + "strict": false, + "url": true + }, + { + "encoding": "url raw", + "input": "41410d0a", + "output": "00", + "padded": false, + "strict": false, + "url": true + }, + { + "encoding": "url raw", + "input": "0a41414141", + "output": "000000", + "padded": false, + "strict": false, + "url": true + }, + { + "encoding": "url raw", + "input": "5a6d3976", + "output": "666f6f", + "padded": false, + "strict": false, + "url": true + }, + { + "encoding": "url raw", + "input": "5a6d39", + "output": "666f", + "padded": false, + "strict": false, + "url": true + }, + { + "encoding": "url raw", + "input": "5a6d38", + "output": "666f", + "padded": false, + "strict": false, + "url": true + }, + { + "encoding": "url raw", + "input": "5a6d", + "output": "66", + "padded": false, + "strict": false, + "url": true + }, + { + "encoding": "url raw", + "input": "5a67", + "output": "66", + "padded": false, + "strict": false, + "url": true + }, + { + "encoding": "url raw", + "input": "5a68", + "output": "66", + "padded": false, + "strict": false, + "url": true + }, + { + "encoding": "url raw", + "error": "illegal base64 data at input byte 0", + "input": "5a", + "padded": false, + "strict": false, + "url": true + }, + { + "encoding": "url raw", + "error": "illegal base64 data at input byte 4", + "input": "5a6d39763d", + "padded": false, + "strict": false, + "url": true + }, + { + "encoding": "url raw", + "error": "illegal base64 data at input byte 2", + "input": "5a6d8076", + "padded": false, + "strict": false, + "url": true + }, + { + "encoding": "url raw", + "error": "illegal base64 data at input byte 0", + "input": "205a6d3976", + "padded": false, + "strict": false, + "url": true + }, + { + "encoding": "url raw", + "input": "5a6d2d76", + "output": "666faf", + "padded": false, + "strict": false, + "url": true + }, + { + "encoding": "url raw", + "input": "5a6d5f76", + "output": "666fef", + "padded": false, + "strict": false, + "url": true + }, + { + "encoding": "url raw", + "error": "illegal base64 data at input byte 2", + "input": "5a6d2b76", + "padded": false, + "strict": false, + "url": true + }, + { + "encoding": "url raw", + "error": "illegal base64 data at input byte 2", + "input": "5a6d2f76", + "padded": false, + "strict": false, + "url": true + }, + { + "encoding": "url raw", + "input": "5a6d3976596d4679", + "output": "666f6f626172", + "padded": false, + "strict": false, + "url": true + }, + { + "encoding": "url raw", + "error": "illegal base64 data at input byte 12", + "input": "5a6d3976596d46795a6d3976216d4679", + "padded": false, + "strict": false, + "url": true + }, + { + "encoding": "url raw", + "input": "5a6d3976596d46795a6d3976596d46", + "output": "666f6f626172666f6f6261", + "padded": false, + "strict": false, + "url": true + }, + { + "encoding": "url raw", + "input": "5a6d3976596d46795a6d3976596d45", + "output": "666f6f626172666f6f6261", + "padded": false, + "strict": false, + "url": true + }, + { + "encoding": "url raw", + "error": "illegal base64 data at input byte 15", + "input": "5a6d3976596d46795a6d3976596d453d", + "padded": false, + "strict": false, + "url": true + }, + { + "encoding": "url raw", + "error": "illegal base64 data at input byte 14", + "input": "5a6d3976596d46795a6d3976596d3d3d", + "padded": false, + "strict": false, + "url": true + }, + { + "encoding": "url raw", + "input": "5a6d3976596d46795a6d3976596d", + "output": "666f6f626172666f6f62", + "padded": false, + "strict": false, + "url": true + }, + { + "encoding": "url raw", + "error": "illegal base64 data at input byte 40", + "input": "5a6d3976596d46795a6d3976596d46795a6d3976596d46795a6d3976596d46795a6d3976596d46792a", + "padded": false, + "strict": false, + "url": true + }, + { + "encoding": "url raw", + "error": "illegal base64 data at input byte 4", + "input": "4141414100414141", + "padded": false, + "strict": false, + "url": true + }, + { + "encoding": "url raw", + "input": "41414141414141414141414141414141414141414141414141414141414141414141414141414141414141", + "output": "0000000000000000000000000000000000000000000000000000000000000000", + "padded": false, + "strict": false, + "url": true + }, + { + "encoding": "url raw", + "input": "41414141414141414141414141414141414141414141414141414141414141414141414141414141414142", + "output": "0000000000000000000000000000000000000000000000000000000000000000", + "padded": false, + "strict": false, + "url": true + } + ], + "bech32": [ + { + "data": "", + "hrp": "age", + "op": "encode", + "output": "age19l388n" + }, + { + "data": "", + "hrp": "AGE-SECRET-KEY-", + "op": "encode", + "output": "AGE-SECRET-KEY-1X8YL4H" + }, + { + "data": "00", + "hrp": "age", + "op": "encode", + "output": "age1qqpexly5" + }, + { + "data": "00", + "hrp": "AGE-SECRET-KEY-", + "op": "encode", + "output": "AGE-SECRET-KEY-1QQW6FGJS" + }, + { + "data": "ff", + "hrp": "age", + "op": "encode", + "output": "age1luyvfgxs" + }, + { + "data": "ff", + "hrp": "AGE-SECRET-KEY-", + "op": "encode", + "output": "AGE-SECRET-KEY-1LUT0XLS5" + }, + { + "data": "acb00892a2", + "hrp": "age", + "op": "encode", + "output": "age14jcq3y4z9rn4zt" + }, + { + "data": "acb00892a2", + "hrp": "AGE-SECRET-KEY-", + "op": "encode", + "output": "AGE-SECRET-KEY-14JCQ3Y4ZDY9V9J" + }, + { + "data": "d5ff28f819d6efb50bb7df5feced132110a02446e570534f39e3d87445300d54", + "hrp": "age", + "op": "encode", + "output": "age16hlj37qe6mhm2zahma07emgnyyg2qfzxu4c9xneeu0v8g3fsp42q88kp02" + }, + { + "data": "d5ff28f819d6efb50bb7df5feced132110a02446e570534f39e3d87445300d54", + "hrp": "AGE-SECRET-KEY-", + "op": "encode", + "output": "AGE-SECRET-KEY-16HLJ37QE6MHM2ZAHMA07EMGNYYG2QFZXU4C9XNEEU0V8G3FSP42Q5G9MLE" + }, + { + "data": "400399fe3238d8f4646714fb3fe3666ead65cec35d522101fea78f07d2c368aaee7fa91f74eebb3deba0a5471e07e782f4d1bddc4cd9781cb6c39bd0", + "hrp": "age", + "op": "encode", + "output": "age1gqpenl3j8rv0ger8znanlcmxd6kktnkrt4fzzq07578s05krdz4wulafra6waweaaws223c7qlnc9ax3hhwyektcrjmv8x7slxztma" + }, + { + "data": "400399fe3238d8f4646714fb3fe3666ead65cec35d522101fea78f07d2c368aaee7fa91f74eebb3deba0a5471e07e782f4d1bddc4cd9781cb6c39bd0", + "hrp": "AGE-SECRET-KEY-", + "op": "encode", + "output": "AGE-SECRET-KEY-1GQPENL3J8RV0GER8ZNANLCMXD6KKTNKRT4FZZQ07578S05KRDZ4WULAFRA6WAWEAAWS223C7QLNC9AX3HHWYEKTCRJMV8X7SQ4MNND" + }, + { + "data": "d5ff28f819d6efb50bb7df5feced132110a02446e570534f39e3d87445300d54", + "error": "invalid HRP: \"\"", + "hrp": "", + "op": "encode" + }, + { + "data": "d5ff28f819d6efb50bb7df5feced132110a02446e570534f39e3d87445300d54", + "error": "mixed case HRP: \"Age\"", + "hrp": "Age", + "op": "encode" + }, + { + "data": "d5ff28f819d6efb50bb7df5feced132110a02446e570534f39e3d87445300d54", + "error": "invalid HRP character: hrp[1]=32", + "hrp": "a b", + "op": "encode" + }, + { + "data": "d5ff28f819d6efb50bb7df5feced132110a02446e570534f39e3d87445300d54", + "error": "invalid HRP character: hrp[0]=233", + "hrp": "é", + "op": "encode" + }, + { + "data": "d5ff28f819d6efb50bb7df5feced132110a02446e570534f39e3d87445300d54", + "hrp": "AGE-SECRET-KEY-", + "input": "AGE-SECRET-KEY-16HLJ37QE6MHM2ZAHMA07EMGNYYG2QFZXU4C9XNEEU0V8G3FSP42Q5G9MLE", + "op": "decode" + }, + { + "data": "d5ff28f819d6efb50bb7df5feced132110a02446e570534f39e3d87445300d54", + "hrp": "age-secret-key-", + "input": "age-secret-key-16hlj37qe6mhm2zahma07emgnyyg2qfzxu4c9xneeu0v8g3fsp42q5g9mle", + "op": "decode" + }, + { + "data": "48220129b64a84db368d4bc4acfbccc5113414d97011f840b68893d53e0d63cf", + "hrp": "age", + "input": "age1fq3qz2dkf2zdkd5df0z2e77vc5gng9xewqglss9k3zfa20sdv08slmnfpg", + "op": "decode" + }, + { + "data": "48220129b64a84db368d4bc4acfbccc5113414d97011f840b68893d53e0d63cf", + "hrp": "AGE", + "input": "AGE1FQ3QZ2DKF2ZDKD5DF0Z2E77VC5GNG9XEWQGLSS9K3ZFA20SDV08SLMNFPG", + "op": "decode" + }, + { + "error": "invalid checksum", + "input": "AGE-SECRET-KEY-16HLJ37QE6MHM2ZAHMA07EMGNYYG2QFZXU4C9XNEEU0V8G3FSP42Q5G9MLQ", + "op": "decode" + }, + { + "error": "invalid checksum", + "input": "AGE-SECRET-KEY-16HLJ37QE6MHM2ZAHMA07EMGNYYG2QFZXU4C9XNEEU0V8G3FSP42Q5G9ML", + "op": "decode" + }, + { + "error": "mixed case", + "input": "AGE-SECRET-KEY-16HLJ37QE6MHM2ZAHMA07EMGNYYG2QFZXU4C9XNEEU0V8G3FSP42Q5G9MLEq", + "op": "decode" + }, + { + "error": "separator '1' at invalid position: pos=-1, len=73", + "input": "AGE-SECRET-KEY-6HLJ37QE6MHM2ZAHMA07EMGNYYG2QFZXU4C9XNEEU0V8G3FSP42Q5G9MLE", + "op": "decode" + }, + { + "error": "separator '1' at invalid position: pos=0, len=59", + "input": "16HLJ37QE6MHM2ZAHMA07EMGNYYG2QFZXU4C9XNEEU0V8G3FSP42Q5G9MLE", + "op": "decode" + }, + { + "error": "invalid checksum", + "input": "A1QQQQQQ", + "op": "decode" + }, + { + "error": "invalid checksum", + "input": "a1qqqqqq", + "op": "decode" + }, + { + "error": "separator '1' at invalid position: pos=1, len=7", + "input": "a1qqqqq", + "op": "decode" + }, + { + "error": "invalid character data part: s[5]=98", + "input": "a1qqqqqb", + "op": "decode" + }, + { + "error": "invalid checksum", + "input": "a1qqqqqqqq", + "op": "decode" + }, + { + "error": "invalid character human-readable part: s[0]=127", + "input": "1qqqqqq", + "op": "decode" + }, + { + "error": "mixed case", + "input": "x1Ẁqqqqqq", + "op": "decode" + }, + { + "error": "invalid character human-readable part: s[0]=233", + "input": "é1qqqqqq", + "op": "decode" + }, + { + "error": "mixed case", + "input": "AGE-SECRET-KEY-1Qa", + "op": "decode" + }, + { + "error": "mixed case", + "input": "age1Bq3qz2dkf2zdkd5df0z2e77vc5gng9xewqglss9k3zfa20sdv08slmnfpg", + "op": "decode" + }, + { + "error": "invalid checksum", + "input": "age1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq", + "op": "decode" + }, + { + "error": "invalid checksum", + "input": "age1qyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgp", + "op": "decode" + }, + { + "error": "illegal zero padding", + "input": "age1psm9pam", + "op": "decode" + }, + { + "error": "non-zero padding", + "input": "age1qpu0j2ex", + "op": "decode" + }, + { + "error": "illegal zero padding", + "input": "age1qqpexly4p", + "op": "decode" + }, + { + "error": "non-zero padding", + "input": "age1ll2lu7g0", + "op": "decode" + } + ], + "chacha20": [ + { + "counter": 1, + "input": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "key": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f", + "name": "RFC 8439 2.3.2", + "nonce": "000000090000004a00000000", + "output": "10f1e7e4d13b5915500fdd1fa32071c4c7d1f4c733c068030422aa9ac3d46c4ed2826446079faa0914c2d705d98b02a2b5129cd1de164eb9cbd083e8a2503c4e" + }, + { + "counter": 1, + "input": "4c616469657320616e642047656e746c656d656e206f662074686520636c617373206f66202739393a204966204920636f756c64206f6666657220796f75206f6e6c79206f6e652074697020666f7220746865206675747572652c2073756e73637265656e20776f756c642062652069742e", + "key": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f", + "name": "RFC 8439 2.4.2", + "nonce": "000000000000004a00000000", + "output": "6e2e359a2568f98041ba0728dd0d6981e97e7aec1d4360c20a27afccfd9fae0bf91b65c5524733ab8f593dabcd62b3571639d624e65152ab8f530c359f0861d807ca0dbf500d6a6156a38e088a22b65e52bc514d16ccf806818ce91ab77937365af90bbf74a35be6b40b8eedf2785e42874d" + }, + { + "counter": 0, + "input": "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "key": "6cf9ba2352ddf19a50ee8d17e94ebedb361b7ebb40ade7c7841f710fc25d5c15", + "name": "counter 0, 3 blocks and a half", + "nonce": "bb341455ff9a8779d2885c9c", + "output": "8ac0ff5fb6381db9ec493048add334e0b74c19e87d897e696195867353356a78ec007deeb1764aa6dee4a9d9cd3cf007fcc7ceb4b6a3c8707bb27ef6118410a513aa0e26aeb7625e267b07b6b76ca1f78f2dccc024812be00691de4ffa49909587e340f21ebbbf0fb1cfba4a61439e3a576dbef763db7d2ce5fdfae329d1bd90dbc856b3bb0d395fd9e64a85ce51ebd1189a63537f0d486ec37405a414e4983621bc101c52a70d69b603f5bc6d0ebba946505a37221d42ad8cf064eb977098c52c8963c44fe47072c346a28bc17dffe968ccc877bfa7b83aecc947e8af2aea0d" + }, + { + "counter": 4294967294, + "input": "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "key": "1527a3454445f1fe40d48cd3113d58188c93528be0284aa3b61ce4e7992f81a4", + "name": "counter near 2^32", + "nonce": "438269dfc886d8ea8c00a5af", + "output": "703b07fe186dbc21269470b35351f9880a1d7425783cd382d41315d87d44a2a156d0536e1f2e43e2cc427e943d085b73fca010c5e554066ed42a6d6917f2e1c5bd8fe12feb26fc412f87c6bf610121f4ab101b2b119c78179d98fe3f2420361e1c99cb83a920332ec690acdc9a48e5b0ae77c8d6863b6b146ff2337e01495020" + } + ], + "chacha20poly1305": [ + { + "aad": "50515253c0c1c2c3c4c5c6c7", + "ciphertext": "d31a8d34648e60db7b86afbc53ef7ec2a4aded51296e08fea9e2b5a736ee62d63dbea45e8ca9671282fafb69da92728b1a71de0a9e060b2905d6a5b67ecd3b3692ddbd7f2d778b8c9803aee328091b58fab324e4fad675945585808b4831d7bc3ff4def08e4b7a9de576d26586cec64b61161ae10b594f09e26a7e902ecbd0600691", + "key": "808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f", + "name": "RFC 8439 2.8.2", + "nonce": "070000004041424344454647", + "plaintext": "4c616469657320616e642047656e746c656d656e206f662074686520636c617373206f66202739393a204966204920636f756c64206f6666657220796f75206f6e6c79206f6e652074697020666f7220746865206675747572652c2073756e73637265656e20776f756c642062652069742e" + }, + { + "aad": "", + "ciphertext": "85824e12b3e65743911078ec9e1934212b629674e4cd1a5ac3af5b952fe2f4b4", + "key": "e587701657fd47ef7c61ec417a119bfd8172050f2cfbc78b9330636907a021bf", + "name": "age: a file key under a zero nonce", + "nonce": "000000000000000000000000", + "plaintext": "8dbfca7bf5d10f3f55da1d728a938929" + }, + { + "aad": "93e2ce43e61cc5a886297470c90737714f73b5aac35a9c182847eda4a3e3f64d10ddaafa", + "ciphertext": "e8d43db85de4a2cbd3d2b0a18f487aed", + "key": "cc04ef49c6fdf826ab66c183f2f75518387bf12c0b3e562131035f79d2ea6dff", + "name": "random, 0 bytes", + "nonce": "1a7f376aa8e27858f2b6b2cd", + "plaintext": "" + }, + { + "aad": "b8731f71a13300b3d4c530c1", + "ciphertext": "86c855e0a6fa5371789010cdbf9515e86d", + "key": "8ab5883b2921461f55892ad33d3da94be4fbae812d61d40d559fc22745bc3316", + "name": "random, 1 bytes", + "nonce": "b690bffa023a9c7a8599de12", + "plaintext": "86" + }, + { + "aad": "b50eed30556437", + "ciphertext": "c461add111f3b11b6d463997c4c9ac4fd4bb31f06187b8f2238b26600bcab8", + "key": "660228c04d84661e344264225d7d7840e0262cad7b877bf3d55bd711b1458919", + "name": "random, 15 bytes", + "nonce": "8d89b139fb41b9b3c788c230", + "plaintext": "59f9bd962fa7bec993d7d18ac96d12" + }, + { + "aad": "5b0340024726fa15234a5ab3c3c67b0b369acdf99299231b3e7b71eccf72d2b1a4bef9", + "ciphertext": "ee68755f2f1d84d4318b0578d79661a7d38c97e3808e18fa5460c488f3af9e64", + "key": "c7405289b88b667cabe6b7555c89876c36902267b6f6305a91ee954d38c26a7c", + "name": "random, 16 bytes", + "nonce": "f3f6fd3411e2e32f7cd09a00", + "plaintext": "5fcf9eb4cd941acea3a1ffbe2c39b257" + }, + { + "aad": "001549eedbb700b9", + "ciphertext": "d231cfd33b6bb7dfdf2cee68beb4023e1a959f9b3aaa1e71cb63e3719ddb73625c", + "key": "99f6581561298f33589a804cdcc6cb4604d0a7d75ac0d1b1c093426cea8c5dcd", + "name": "random, 17 bytes", + "nonce": "9bb49f2dcef2c68ebbb99b84", + "plaintext": "7f5e9c03051711e05ef40c23a7bf3cfbc7" + }, + { + "aad": "66ad25cda8840bfb2fe497b9ad83501f7dd2264b5f8522ee8f48a88560", + "ciphertext": "391e35359912703d6b2e2082a9216ff1d2aa6fc746b48b01bcd27bdeac1e85a5ab20004b809d379b9f9d08a81e123ececa910708f5a046649d8ba6bb57e041b766aaa75c49ff965063f7af4981dba0", + "key": "4c51ec1e7043578d13d60fea012ae98da5aa76adbf5408ac296add63e49203cc", + "name": "random, 63 bytes", + "nonce": "c29bda32cce6e1c06cd97266", + "plaintext": "bdba0a21c8c15d80c4266ffbd4ec28a8dbad0517fb62b657ae8b2d1243699ab107401c526be221bb4f20fa2c63ccacad8e791d89cf8076ef199fe5362a1639" + }, + { + "aad": "", + "ciphertext": "91a7a288b8d6baf643da7e0246fbbaf6e25352e781494b554c994909b1364b0871e71828e840bd9356cdbbb356603ffc5de9be6dabdad6bf8eb78bac42dafb518fdabed6f1000f667e878cab1c189805", + "key": "278944cd0d7c772491d903652458634b6b90cf340d1e3d2a61803981bc74f583", + "name": "random, 64 bytes", + "nonce": "a81c188325e708a8955963f1", + "plaintext": "92fb6e7cde920f10dd28d301f7360b145c7871bc9b9239b660b85305ef077e76b121ebc8e15ad2e606ac2425b248108ceac204badb7fbc5e909a5c9eed86727b" + }, + { + "aad": "65", + "ciphertext": "430901170938440a035914b6d5b44724d26f5edf0c567ee9941122532d723263b4f174fae9688431c00bef37ca5809855c6048aef660ad58a74f95afd941eb0daaad8ce4672678400d1c81800e12bb75c5", + "key": "b502e74ee4926eedab02bc4a9217082b0de882f473b4cf02d14a1c2ecf5c6574", + "name": "random, 65 bytes", + "nonce": "0acad45d18ebd6df3e5e5bcc", + "plaintext": "f7bb513ddb837b9554d91228f689072e4300846efa02ee387b08351e3377c0ece202490dd485744eedbd22faa4744e2ad21c3a5925f53655eaed1a3b76f32a8d5a" + }, + { + "aad": "875616ed550fa39b2286f8c4789ee4f6", + "ciphertext": "7eedf90d044f6d0eb844ea6b8e29d50e3957d4bf98f12d7d71548592a4a60b78d207d21dc760c333e0914f62adcb7f896800e0f5964f00506896e481bddf4c9f84650696a57d6729fc2db491a3f152b5bec6f67f8703b29d37f3f0d4100eff240a494416a44638d34f7af8ce40414ae05320734773338b5ea1a28986e8d3caf9eb64253c635d22d868bdc50998c8b2", + "key": "be9a87860a3055ce90d4aadb558e40c155a5ebb85185b172e6e7f84147971b28", + "name": "random, 127 bytes", + "nonce": "b4f0643a512362f304b0b9bb", + "plaintext": "38acadd9003994230043ae745c308e75c7af983e4eb0f310f61a7f944a39405582684ee1df593c2014f9a6cb67713d289ce496ed7cde95f3636219d7ff90dcd1f8ad665d5d8de60ba1259e9ea8223d73cec9293531e40aea27aebfdd85d7d94857e0192b47c6206e547efac1cc6925c4356a9e6a546a668e0e81dd6f2fb321" + }, + { + "aad": "82d0a9a2350c8058a3a541af24b9e3dae1a9bc6efe9efd83bd7ec4e24e5ac69bfd85c03a", + "ciphertext": "4ed5ccfb374450aa8bb19f99cb6dd56660ca81038b9a1f9ee21ca12aec78619ffaeae62caff711c1f8d0178e5a4cd9871435e2c665c02b0522f913cdb98b00b561333e6cf8876a3023c6e3e7a544cbf3eb7fb6cbbdf1037e9097bb7fa7565775f2d3c28c79572a3dee41c1b7bdc76a449ba0b395b12f7601504a76be848db4be86de2ed54a537e0129d47afcb8c94bee", + "key": "270ae3e0591c199e7e48f76e4e334c0311d7593f1002c3fd19a347e9c589ce29", + "name": "random, 128 bytes", + "nonce": "79e9d8999b84d59461acc26e", + "plaintext": "564acd3f870d09ed871287a613addd994f77223dcd33a556948a2da264aa7e8af118d78fad84835b7e325cc694afeaad2c33023414ed88ec322b3d1a7cd3fcc36eb5f9c29628da5099269607f0f149366bdb8b9e4147e76a9673344c0e8791bae7dd11b298248327f259f1c1e318ba097f34a547fe25eac3e187ff28d54304b2" + }, + { + "aad": "df3274b338d0b6a21dbc1e973d48b571d95d71f89895485f214aa255c7b9b8ceca8f496ffc97be", + "ciphertext": "802aa91f730a0dd1b35206e4b4d49c210180645a8031a3d5e415c7a5b380d54bb474836efa55a1c11474e375b92dac4b6167bf437434fabf60aed63d75195790328b68835f28cbdef4df5d960525fa2c8d43126b213e9e8ec69ae75f3ea15eab547c62168a67b98ba1423139fb91cee7cbc47bbe538e289b3ed92b25aff6d1d1857e38b0dc1f4f6612f3c1c658acc1e159", + "key": "0e90a2204efe54bb0f0c2c0c98f61e0f57bd175bd9d08d68c64746fd4b723a1e", + "name": "random, 129 bytes", + "nonce": "171ccc27231ff8bf07e87690", + "plaintext": "ab7b1d1ec61eb45ce961725a8581ee475316aeb1aa621da836ef8596740e92f8a32df6829b4b483448d03934e8848676101d8189711dd17a3dca37e79d14a8c34ef490717e417a8339e97b58cd90399c3d5e61c9f0e7eda0ee5d9370d6d1f5c30d6eb3e42f6534fbdf6270921ccf8506ade5dbfaf144a55848c1f0a415fa55d754" + }, + { + "aad": "7793f86a24603c7639a68e4b3b5eecff833061", + "ciphertext": "a8acbc758259f3aa4083c7bec101f589a1539ca77f303c1f177ce6451b386918c5642a323987fc28e59cdc1c5a7a7fd3e987fada050f6b67ba7b4ff874c27050ce0659f14f9377a843bd308d103ab1248a071c93e78c4abaaeaf5c309d76d6388880da6f5922a34f3253e3b55046d638306d8587c9733658385d209cc3ef79c8227c0b2afc115345561c4b181db1019b9c9e6de453a0c2eb0324199f898f440f3d23c4dfee9f4eb12ba81fcedb44d9431e8511944285a84219979fb3f80033ce4c55c948207a589add3d83f92bc3ca3cc158b53d0a08c0433c2aed2706e571db4d68958ad7432e1a7e6d1a01d104678a2c80c517d7abf853773a6659b78c9513c2a96d5d54f738b9f513bb6c10ad2bf06ee00b02aadd14322d21c67ba9ad9c3640f6fd32bfa2e4e9c26e509e6ce6e0f8ac47efe23666a15b4dff801f", + "key": "472a5ab07b15d6816f3d13d41c823a60542486961846425b0ede56adad22035d", + "name": "random, 300 bytes", + "nonce": "6c4e4642dc72b7b42c5aa412", + "plaintext": "9ed006dd0b1af799b9ac9c4febd6b4e458810628b864ff46686e2301c1595838e07b537e776b7fed7b16ecebe9d9653448ae6bedd9f8c2b0a322cae441c61eefd4905623cb16f11c47eb9f30e0cec76338185b5369e801279579ea88cceba526fc6098c53f23c6ea5074f7806fa9f0f98485e92c1e0b88e6e47255a6082481e9443dad66e255acf3e6790f3c08f8dc112ca12e41df0cab627bec73b96ce4aaa35f7950d245587a2c8c4e43ed81313731ef2d545307f85e1e9a23605ad9dc1e70e7d987cb2b12c14ee1d4c953d15ddaa1e5d83efb6fff18fc4ed68053bd492ae978cdf99628ebf23f3a960a89ce6f5c881d2f66710349eaa09b6cf0e6eb5442a86d34fc3c9ecf04c396be6badbf230dfca73659384242290ccbecb5b348112c26cb48438fd485812fce40f1e3" + }, + { + "aad": "442dd1f053621ad6b4f4ec6725be7548e93c7d31aa3566694917969bf009cf88a95370057657", + "ciphertext": "169cbdc9322d82615b87636a7aacae7529d8cea0b980f5fc157e4bd4c7b38c6437c6b67845a33b59287a1e5edfd1c0f8a1f5fc89a9204c35c3d3134c236438270082186d30bbbe40fa15fba4e5e76dc2269f68146d009776aac7363f90e7bc4d25bda3ddfdfb0df9cacfc02414a36e38559e4a02b1500a5b77822b5a8ba4312bfcd205bcd9484e6f41ccfad488ee50fe84528443cb2a7bc173f1679fe998ce0f5d0a1352fab1073c6cf19659ab39573781d85fd354b3736e5b509cc1f92cd8b6b957eec87f32c5a553e43ca608eb0acf798b20533f3c36f8b00fa438605b03af5114d2124306ab80cd203d5553b5446d21c559b5d97421798be066f5ca4b742a84a2f466230b49bf84778e6b3785e6b84e2fe31bb36b094269ca0581f8bd315b4151a6e6aeb5e2ac140f48566c398f1b0d75a0868968624dab31fee4f7876ca0f02b1f4010fd1f6113e400e2ac877779241d5adbe99a5ec26edd6a973037b4c9245572f40c2bd5a484c0e153617c986b16df60b0f7f53e87d2ca7d78e40c2e02b067038c610c38b50e84968fd1da3c14715d5e0a0fc3d84dc7bf5dafe82355b5bfed90a038c61158ca08891b3281cc15e9e529bee9ee63c55daa801fbf0ccc6fed737a64f3e6a35251e8132e2a36ef0c262a0c42277f0789f5827715965e7624050b55c58ffc657942a2aa1df5dc34a1c7923407730ef0db91a2699c62e878fbbe6a3510487bb435627baefadc3ab6e9d803d39cc5737819c3d1d8d0f4b4a423dde7542705521983628856f1dcbe722f8c08d049b1d35d4c813576a11ef22d4b144624d2bc925ee85c4add5421a92e2842e65f2153a68ba3d161c1251e793b660667f8dc434646ad918d208bea96630dad5458db47a8f1852bc5978cc352e8c828aab1159f8e3f58875fb9b946e0bd9ff7c9bf87e19a3cd4a5d21468302c98907e2e20c0d70021ba7d21089b73e935282b350e31819eb0187c11dce1ea13b56c10e14923548b19a3b27d36c5213efbdc2dbfa0934703d40cbdb0fdee7351caefe485d6a8e5786f46dbaae93cafb27226dff326b1412245c06640c8c4b74c25c52f045e32abd446b338722266b001c70ec13e77ae7794ca9144ee6722a4e04893874a4f94792c9a777979c6a9926d7a6b14c18aca2eef98ca92ac906df3e663801535f78c18544bba4d01ac6c731bfac39fa3a4a59342cad4b806f0265cf0937e371400298915335322988ae420d160790960a3574a420c6551752cde9d67e959c94d1f1845694f02de2452065fdd9656fe3425fba74a555d9ab175913906a8a56aeabe88c2cec5399b68b26141141c6edb31e0b524804d470685bbe1f4470aaff8b2bd35ce78f44e83a46b277c3a78bd6bd46f191515f024b767d02e592ebcaddc6fdc84b86d3e07b12db274950fdf482deed1921fcca126", + "key": "5d24d21f5ecc1c4b3c1054fc1acadb67e732983e082f8b0e620fc60ea6448baf", + "name": "random, 1000 bytes", + "nonce": "454e6f5a569780e5fd9bf02b", + "plaintext": "a5869cd013ebd813e8da704d295198ace99e038e11bec729faabeaf2180d1eff9a8d64dfaaafe8c7ea3ca2b810eaf451c87f15ffbc4a9546f98ec83eb59620842b60a79a835f6e99913ef5b1592774232f168192b2a289fd2e34b77c8788b6221616228a13d3d7bd882ff30727e6f09ac0574ec882335a531243715028a029f69e948951e2b4bc490f08588772542bbec0489ecea3013549424a4ad8b2b317d0b2d9ef17763c95e8819ba8df08a93db85bb9e66d4bf0fcc3ee6c2aea64b5544f65f132f0db8fcd0e1814c8a64b860218eb99f700767d2f1750ef111dd7415703ccee72e9ae2033ae0d17ac12443157f879211c51f0cb629ea127bcd0267fef925f4189cac52d269ab5db25efdd128d68b6360a32434ba2779eacae7e0934feaafec7ff02b44f291f80c5049d46f847c8c0ad2a35911d1985f8f26a6c228af3d77e4158d866f951a54abae2e1c945738cb0bbe4eedd6ffddcca1ddbdbf10c5700325b159728728ae1130b5490bf7200497a16c465e20b6c9f5746954a955dde1a40c1f8312777171c779932da6bc329764e08949c4afac05db55cffdc6a740e3967e5a178b519a5eec73e7d885ea9c5764a5aa55ef20a6139bcc2c0942ba87a2d61e874af926a40930c97a91483c1e467c80860ff7956454953718903cf104c564fe30d20619d4ed63218a8f3d9eb6b86579a52c103be646fbfe2399370d8c114d9d30d4d869b72b52bd9c0234ac056ae1d32d5cfab9d89f2d724007cdef738850d82315e5f919479c0d9e400ac5959480d878409ae6bb032ddc1bd1b856b04223c988c6af05321de8132f0cdf30ea3f8e0a9ee0df31f9a157ec08b9b845eddd3a64742cab203d972b44886b5e2e082be19bc2d7adde19a2dd81379997b0257b06bf0f055bb3ac3d626358e0d898c57085ca6311974253ec687499be73191c26ce36a9c6862812b74ebc996dfc8470674306e3d2957428caf929e2d9247257ca20f1a76265948edcd6714eeeb1747660e85c2497730a7a364c0babbc335807aeaca8a5ee128f43cb14ad86158c5c0257ee41f881b3b420b25554a2c688baaafccaf53bcbf7c8d06d98550520200d40d482fbbd6edc35b9c51f76d7c68a797f6cde1a7aaac747a0c7e56a512af60115e8a2d14c09a9a253455173d3a4608adc5d7602b710d669e7c9ebe57735901b83c9a23136a77045c680d9dfab23e4808660b5eed9d14e5f933cbff000a200c9725a2bda74e2c59613d390435e86298480f7e24db9f477d41a5ffa693c8686ad0128d323dafb1fdeeb846b226ed13fcb0cd23a5bb8d467cace77dc9b8df13ff5da8332681b8949bc61b1061a819bb29bc2826c3b8a8cfef56d2b2fe48e4907d2340f61256109beab68462ef0995248afc305f8bf98628480591ab" + } + ], + "description": "Vectors of the primitives of stage 2 of datekeys-dart. Every expected value is computed by tool/gen_primitive_vectors.go with Go go1.26.8, golang.org/x/crypto v0.57.0 and codec/bech32 of datekeys-go; the inputs are those of the RFCs, taken from the tests of Go and x/crypto where they are, plus edge cases and seeded random ones. Binary values are lowercase hex. `node` marks the cases cheap enough to run compiled to JavaScript.", + "ed25519": [ + { + "message": "", + "name": "sign.input line 0", + "public_key": "d75a980182b10ab7d54bfed3c964073a0ee172f3daa62325af021a68f707511a", + "signature": "e5564300c360ac729086e2cc806e828a84877f1eb8e5d974d873e065224901555fb8821590a33bacc61e39701cf9b46bd25bf5f0595bbe24655141438e7a100b", + "stdlib": true, + "valid": true + }, + { + "message": "", + "name": "sign.input line 0, R changed", + "public_key": "d75a980182b10ab7d54bfed3c964073a0ee172f3daa62325af021a68f707511a", + "signature": "e4564300c360ac729086e2cc806e828a84877f1eb8e5d974d873e065224901555fb8821590a33bacc61e39701cf9b46bd25bf5f0595bbe24655141438e7a100b", + "stdlib": false, + "valid": false + }, + { + "message": "", + "name": "sign.input line 0, S changed", + "public_key": "d75a980182b10ab7d54bfed3c964073a0ee172f3daa62325af021a68f707511a", + "signature": "e5564300c360ac729086e2cc806e828a84877f1eb8e5d974d873e065224901555eb8821590a33bacc61e39701cf9b46bd25bf5f0595bbe24655141438e7a100b", + "stdlib": false, + "valid": false + }, + { + "message": "", + "name": "sign.input line 0, S top byte changed", + "public_key": "d75a980182b10ab7d54bfed3c964073a0ee172f3daa62325af021a68f707511a", + "signature": "e5564300c360ac729086e2cc806e828a84877f1eb8e5d974d873e065224901555fb8821590a33bacc61e39701cf9b46bd25bf5f0595bbe24655141438e7a100a", + "stdlib": false, + "valid": false + }, + { + "message": "", + "name": "sign.input line 0, A changed", + "public_key": "d75a980182b00ab7d54bfed3c964073a0ee172f3daa62325af021a68f707511a", + "signature": "e5564300c360ac729086e2cc806e828a84877f1eb8e5d974d873e065224901555fb8821590a33bacc61e39701cf9b46bd25bf5f0595bbe24655141438e7a100b", + "stdlib": false, + "valid": false + }, + { + "message": "72", + "name": "sign.input line 1", + "public_key": "3d4017c3e843895a92b70aa74d1b7ebc9c982ccf2ec4968cc0cd55f12af4660c", + "signature": "92a009a9f0d4cab8720e820b5f642540a2b27b5416503f8fb3762223ebdb69da085ac1e43e15996e458f3613d0f11d8c387b2eaeb4302aeeb00d291612bb0c00", + "stdlib": true, + "valid": true + }, + { + "message": "af82", + "name": "sign.input line 2", + "public_key": "fc51cd8e6218a1a38da47ed00230f0580816ed13ba3303ac5deb911548908025", + "signature": "6291d657deec24024827e69c3abe01a30ce548a284743a445e3680d7db5ac3ac18ff9b538d16f290ae67f760984dc6594a7c15e9716ed28dc027beceea1ec40a", + "stdlib": true, + "valid": true + }, + { + "message": "cbc77b", + "name": "sign.input line 3", + "public_key": "e61a185bcef2613a6c7cb79763ce945d3b245d76114dd440bcf5f2dc1aa57057", + "signature": "d9868d52c2bebce5f3fa5a79891970f309cb6591e3e1702a70276fa97c24b3a8e58606c38c9758529da50ee31b8219cba45271c689afa60b0ea26c99db19b00c", + "stdlib": true, + "valid": true + }, + { + "message": "5f4c8989", + "name": "sign.input line 4", + "public_key": "c0dac102c4533186e25dc43128472353eaabdb878b152aeb8e001f92d90233a7", + "signature": "124f6fc6b0d100842769e71bd530664d888df8507df6c56dedfdb509aeb93416e26b918d38aa06305df3095697c18b2aa832eaa52edc0ae49fbae5a85e150c07", + "stdlib": true, + "valid": true + }, + { + "message": "18b6bec097", + "name": "sign.input line 5", + "public_key": "e253af0766804b869bb1595be9765b534886bbaab8305bf50dbc7f899bfb5f01", + "signature": "b2fc46ad47af464478c199e1f8be169f1be6327c7f9a0a6689371ca94caf04064a01b22aff1520abd58951341603faed768cf78ce97ae7b038abfe456aa17c09", + "stdlib": true, + "valid": true + }, + { + "message": "89010d855972", + "name": "sign.input line 6", + "public_key": "fbcfbfa40505d7f2be444a33d185cc54e16d615260e1640b2b5087b83ee3643d", + "signature": "6ed629fc1d9ce9e1468755ff636d5a3f40a5d9c91afd93b79d241830f7e5fa29854b8f20cc6eecbb248dbd8d16d14e99752194e4904d09c74d639518839d2300", + "stdlib": true, + "valid": true + }, + { + "message": "b4a8f381e70e7a", + "name": "sign.input line 7", + "public_key": "98a5e3a36e67aaba89888bf093de1ad963e774013b3902bfab356d8b90178a63", + "signature": "6e0af2fe55ae377a6b7a7278edfb419bd321e06d0df5e27037db8812e7e3529810fa5552f6c0020985ca17a0e02e036d7b222a24f99b77b75fdd16cb05568107", + "stdlib": true, + "valid": true + }, + { + "message": "4284abc51bb67235", + "name": "sign.input line 8", + "public_key": "f81fb54a825fced95eb033afcd64314075abfb0abd20a970892503436f34b863", + "signature": "d6addec5afb0528ac17bb178d3e7f2887f9adbb1ad16e110545ef3bc57f9de2314a5c8388f723b8907be0f3ac90c6259bbe885ecc17645df3db7d488f805fa08", + "stdlib": true, + "valid": true + }, + { + "message": "4284abc51bb67235", + "name": "sign.input line 8, R changed", + "public_key": "f81fb54a825fced95eb033afcd64314075abfb0abd20a970892503436f34b863", + "signature": "d7addec5afb0528ac17bb178d3e7f2887f9adbb1ad16e110545ef3bc57f9de2314a5c8388f723b8907be0f3ac90c6259bbe885ecc17645df3db7d488f805fa08", + "stdlib": false, + "valid": false + }, + { + "message": "4284abc51bb67235", + "name": "sign.input line 8, S changed", + "public_key": "f81fb54a825fced95eb033afcd64314075abfb0abd20a970892503436f34b863", + "signature": "d6addec5afb0528ac17bb178d3e7f2887f9adbb1ad16e110545ef3bc57f9de2315a5c8388f723b8907be0f3ac90c6259bbe885ecc17645df3db7d488f805fa08", + "stdlib": false, + "valid": false + }, + { + "message": "4284abc51bb67235", + "name": "sign.input line 8, S top byte changed", + "public_key": "f81fb54a825fced95eb033afcd64314075abfb0abd20a970892503436f34b863", + "signature": "d6addec5afb0528ac17bb178d3e7f2887f9adbb1ad16e110545ef3bc57f9de2314a5c8388f723b8907be0f3ac90c6259bbe885ecc17645df3db7d488f805fa09", + "stdlib": false, + "valid": false + }, + { + "message": "4284abc51bb67235", + "name": "sign.input line 8, A changed", + "public_key": "f81fb54a825eced95eb033afcd64314075abfb0abd20a970892503436f34b863", + "signature": "d6addec5afb0528ac17bb178d3e7f2887f9adbb1ad16e110545ef3bc57f9de2314a5c8388f723b8907be0f3ac90c6259bbe885ecc17645df3db7d488f805fa08", + "stdlib": false, + "valid": false + }, + { + "message": "4384abc51bb67235", + "name": "sign.input line 8, message changed", + "public_key": "f81fb54a825fced95eb033afcd64314075abfb0abd20a970892503436f34b863", + "signature": "d6addec5afb0528ac17bb178d3e7f2887f9adbb1ad16e110545ef3bc57f9de2314a5c8388f723b8907be0f3ac90c6259bbe885ecc17645df3db7d488f805fa08", + "stdlib": false, + "valid": false + }, + { + "message": "672bf8965d04bc5146", + "name": "sign.input line 9", + "public_key": "c1a49c66e617f9ef5ec66bc4c6564ca33de2a5fb5e1464062e6d6c6219155efd", + "signature": "2c76a04af2391c147082e33faacdbe56642a1e134bd388620b852b901a6bc16ff6c9cc9404c41dea12ed281da067a1513866f9d964f8bdd24953856c50042901", + "stdlib": true, + "valid": true + }, + { + "message": "33d7a786aded8c1bf691", + "name": "sign.input line 10", + "public_key": "31b2524b8348f7ab1dfafa675cc538e9a84e3fe5819e27c12ad8bbc1a36e4dff", + "signature": "28e4598c415ae9de01f03f9f3fab4e919e8bf537dd2b0cdf6e79b9e6559c9409d9151a4c40f083193937627c369488259e99da5a9f0a87497fa6696a5dd6ce08", + "stdlib": true, + "valid": true + }, + { + "message": "3486f68848a65a0eb5507d", + "name": "sign.input line 11", + "public_key": "44b57ee30cdb55829d0a5d4f046baef078f1e97a7f21b62d75f8e96ea139c35f", + "signature": "77d389e599630d934076329583cd4105a649a9292abc44cd28c40000c8e2f5ac7660a81c85b72af8452d7d25c070861dae91601c7803d656531650dd4e5c4100", + "stdlib": true, + "valid": true + }, + { + "message": "5a8d9d0a22357e6655f9c785", + "name": "sign.input line 12", + "public_key": "6fe83693d011d111131c4f3fbaaa40a9d3d76b30012ff73bb0e39ec27ab18257", + "signature": "0f9ad9793033a2fa06614b277d37381e6d94f65ac2a5a94558d09ed6ce922258c1a567952e863ac94297aec3c0d0c8ddf71084e504860bb6ba27449b55adc40e", + "stdlib": true, + "valid": true + }, + { + "message": "b87d3813e03f58cf19fd0b6395", + "name": "sign.input line 13", + "public_key": "a2eb8c0501e30bae0cf842d2bde8dec7386f6b7fc3981b8c57c9792bb94cf2dd", + "signature": "d8bb64aad8c9955a115a793addd24f7f2b077648714f49c4694ec995b330d09d640df310f447fd7b6cb5c14f9fe9f490bcf8cfadbfd2169c8ac20d3b8af49a0c", + "stdlib": true, + "valid": true + }, + { + "message": "55c7fa434f5ed8cdec2b7aeac173", + "name": "sign.input line 14", + "public_key": "cf3af898467a5b7a52d33d53bc037e2642a8da996903fc252217e9c033e2f291", + "signature": "6ee3fe81e23c60eb2312b2006b3b25e6838e02106623f844c44edb8dafd66ab0671087fd195df5b8f58a1d6e52af42908053d55c7321010092748795ef94cf06", + "stdlib": true, + "valid": true + }, + { + "message": "0a688e79be24f866286d4646b5d81c", + "name": "sign.input line 15", + "public_key": "fd2a565723163e29f53c9de3d5e8fbe36a7ab66e1439ec4eae9c0a604af291a5", + "signature": "f68d04847e5b249737899c014d31c805c5007a62c0a10d50bb1538c5f35503951fbc1e08682f2cc0c92efe8f4985dec61dcbd54d4b94a22547d24451271c8b00", + "stdlib": true, + "valid": true + }, + { + "message": "c942fa7ac6b23ab7ff612fdc8e68ef39", + "name": "sign.input line 16", + "public_key": "34e5a8508c4743746962c066e4badea2201b8ab484de5c4f94476ccd2143955b", + "signature": "2a3d27dc40d0a8127949a3b7f908b3688f63b7f14f651aacd715940bdbe27a0809aac142f47ab0e1e44fa490ba87ce5392f33a891539caf1ef4c367cae54500c", + "stdlib": true, + "valid": true + }, + { + "message": "c942fa7ac6b23ab7ff612fdc8e68ef39", + "name": "sign.input line 16, R changed", + "public_key": "34e5a8508c4743746962c066e4badea2201b8ab484de5c4f94476ccd2143955b", + "signature": "2b3d27dc40d0a8127949a3b7f908b3688f63b7f14f651aacd715940bdbe27a0809aac142f47ab0e1e44fa490ba87ce5392f33a891539caf1ef4c367cae54500c", + "stdlib": false, + "valid": false + }, + { + "message": "c942fa7ac6b23ab7ff612fdc8e68ef39", + "name": "sign.input line 16, S changed", + "public_key": "34e5a8508c4743746962c066e4badea2201b8ab484de5c4f94476ccd2143955b", + "signature": "2a3d27dc40d0a8127949a3b7f908b3688f63b7f14f651aacd715940bdbe27a0808aac142f47ab0e1e44fa490ba87ce5392f33a891539caf1ef4c367cae54500c", + "stdlib": false, + "valid": false + }, + { + "message": "c942fa7ac6b23ab7ff612fdc8e68ef39", + "name": "sign.input line 16, S top byte changed", + "public_key": "34e5a8508c4743746962c066e4badea2201b8ab484de5c4f94476ccd2143955b", + "signature": "2a3d27dc40d0a8127949a3b7f908b3688f63b7f14f651aacd715940bdbe27a0809aac142f47ab0e1e44fa490ba87ce5392f33a891539caf1ef4c367cae54500d", + "stdlib": false, + "valid": false + }, + { + "message": "c942fa7ac6b23ab7ff612fdc8e68ef39", + "name": "sign.input line 16, A changed", + "public_key": "34e5a8508c4643746962c066e4badea2201b8ab484de5c4f94476ccd2143955b", + "signature": "2a3d27dc40d0a8127949a3b7f908b3688f63b7f14f651aacd715940bdbe27a0809aac142f47ab0e1e44fa490ba87ce5392f33a891539caf1ef4c367cae54500c", + "stdlib": false, + "valid": false + }, + { + "message": "c842fa7ac6b23ab7ff612fdc8e68ef39", + "name": "sign.input line 16, message changed", + "public_key": "34e5a8508c4743746962c066e4badea2201b8ab484de5c4f94476ccd2143955b", + "signature": "2a3d27dc40d0a8127949a3b7f908b3688f63b7f14f651aacd715940bdbe27a0809aac142f47ab0e1e44fa490ba87ce5392f33a891539caf1ef4c367cae54500c", + "stdlib": false, + "valid": false + }, + { + "message": "7368724a5b0efb57d28d97622dbde725af", + "name": "sign.input line 17", + "public_key": "0445e456dacc7d5b0bbed23c8200cdb74bdcb03e4c7b73f0a2b9b46eac5d4372", + "signature": "3653ccb21219202b8436fb41a32ba2618c4a133431e6e63463ceb3b6106c4d56e1d2ba165ba76eaad3dc39bffb130f1de3d8e6427db5b71938db4e272bc3e20b", + "stdlib": true, + "valid": true + }, + { + "message": "bd8e05033f3a8bcdcbf4beceb70901c82e31", + "name": "sign.input line 18", + "public_key": "74d29127f199d86a8676aec33b4ce3f225ccb191f52c191ccd1e8cca65213a6b", + "signature": "fbe929d743a03c17910575492f3092ee2a2bf14a60a3fcacec74a58c7334510fc262db582791322d6c8c41f1700adb80027ecabc14270b703444ae3ee7623e0a", + "stdlib": true, + "valid": true + }, + { + "message": "8171456f8b907189b1d779e26bc5afbb08c67a", + "name": "sign.input line 19", + "public_key": "5b96dca497875bf9664c5e75facf3f9bc54bae913d66ca15ee85f1491ca24d2c", + "signature": "73bca64e9dd0db88138eedfafcea8f5436cfb74bfb0e7733cf349baa0c49775c56d5934e1d38e36f39b7c5beb0a836510c45126f8ec4b6810519905b0ca07c09", + "stdlib": true, + "valid": true + }, + { + "message": "8ba6a4c9a15a244a9c26bb2a59b1026f21348b49", + "name": "sign.input line 20", + "public_key": "1ca281938529896535a7714e3584085b86ef9fec723f42819fc8dd5d8c00817f", + "signature": "a1adc2bc6a2d980662677e7fdff6424de7dba50f5795ca90fdf3e96e256f3285cac71d3360482e993d0294ba4ec7440c61affdf35fe83e6e04263937db93f105", + "stdlib": true, + "valid": true + }, + { + "message": "1d566a6232bbaab3e6d8804bb518a498ed0f904986", + "name": "sign.input line 21", + "public_key": "7fae45dd0a05971026d410bc497af5be7d0827a82a145c203f625dfcb8b03ba8", + "signature": "bb61cf84de61862207c6a455258bc4db4e15eea0317ff88718b882a06b5cf6ec6fd20c5a269e5d5c805bafbcc579e2590af414c7c227273c102a10070cdfe80f", + "stdlib": true, + "valid": true + }, + { + "message": "1b0afb0ac4ba9ab7b7172cddc9eb42bba1a64bce47d4", + "name": "sign.input line 22", + "public_key": "48359b850d23f0715d94bb8bb75e7e14322eaf14f06f28a805403fbda002fc85", + "signature": "b6dcd09989dfbac54322a3ce87876e1d62134da998c79d24b50bd7a6a797d86a0e14dc9d7491d6c14a673c652cfbec9f962a38c945da3b2f0879d0b68a921300", + "stdlib": true, + "valid": true + }, + { + "message": "507c94c8820d2a5793cbf3442b3d71936f35fe3afef316", + "name": "sign.input line 23", + "public_key": "fdb30673402faf1c8033714f3517e47cc0f91fe70cf3836d6c23636e3fd2287c", + "signature": "7ef66e5e86f2360848e0014e94880ae2920ad8a3185a46b35d1e07dea8fa8ae4f6b843ba174d99fa7986654a0891c12a794455669375bf92af4cc2770b579e0c", + "stdlib": true, + "valid": true + }, + { + "message": "d3d615a8472d9962bb70c5b5466a3d983a4811046e2a0ef5", + "name": "sign.input line 24", + "public_key": "b1d39801892027d58a8c64335163195893bfc1b61dbeca3260497e1f30371107", + "signature": "836afa764d9c48aa4770a4388b654e97b3c16f082967febca27f2fc47ddfd9244b03cfc729698acf5109704346b60b230f255430089ddc56912399d1122de70a", + "stdlib": true, + "valid": true + }, + { + "message": "d3d615a8472d9962bb70c5b5466a3d983a4811046e2a0ef5", + "name": "sign.input line 24, R changed", + "public_key": "b1d39801892027d58a8c64335163195893bfc1b61dbeca3260497e1f30371107", + "signature": "826afa764d9c48aa4770a4388b654e97b3c16f082967febca27f2fc47ddfd9244b03cfc729698acf5109704346b60b230f255430089ddc56912399d1122de70a", + "stdlib": false, + "valid": false + }, + { + "message": "d3d615a8472d9962bb70c5b5466a3d983a4811046e2a0ef5", + "name": "sign.input line 24, S changed", + "public_key": "b1d39801892027d58a8c64335163195893bfc1b61dbeca3260497e1f30371107", + "signature": "836afa764d9c48aa4770a4388b654e97b3c16f082967febca27f2fc47ddfd9244a03cfc729698acf5109704346b60b230f255430089ddc56912399d1122de70a", + "stdlib": false, + "valid": false + }, + { + "message": "d3d615a8472d9962bb70c5b5466a3d983a4811046e2a0ef5", + "name": "sign.input line 24, S top byte changed", + "public_key": "b1d39801892027d58a8c64335163195893bfc1b61dbeca3260497e1f30371107", + "signature": "836afa764d9c48aa4770a4388b654e97b3c16f082967febca27f2fc47ddfd9244b03cfc729698acf5109704346b60b230f255430089ddc56912399d1122de70b", + "stdlib": false, + "valid": false + }, + { + "message": "d3d615a8472d9962bb70c5b5466a3d983a4811046e2a0ef5", + "name": "sign.input line 24, A changed", + "public_key": "b1d39801892127d58a8c64335163195893bfc1b61dbeca3260497e1f30371107", + "signature": "836afa764d9c48aa4770a4388b654e97b3c16f082967febca27f2fc47ddfd9244b03cfc729698acf5109704346b60b230f255430089ddc56912399d1122de70a", + "stdlib": false, + "valid": false + }, + { + "message": "d2d615a8472d9962bb70c5b5466a3d983a4811046e2a0ef5", + "name": "sign.input line 24, message changed", + "public_key": "b1d39801892027d58a8c64335163195893bfc1b61dbeca3260497e1f30371107", + "signature": "836afa764d9c48aa4770a4388b654e97b3c16f082967febca27f2fc47ddfd9244b03cfc729698acf5109704346b60b230f255430089ddc56912399d1122de70a", + "stdlib": false, + "valid": false + }, + { + "message": "6ada80b6fa84f7034920789e8536b82d5e4678059aed27f71c", + "name": "sign.input line 25", + "public_key": "d0c846f97fe28585c0ee159015d64c56311c886eddcc185d296dbb165d2625d6", + "signature": "16e462a29a6dd498685a3718b3eed00cc1598601ee47820486032d6b9acc9bf89f57684e08d8c0f05589cda2882a05dc4c63f9d0431d6552710812433003bc08", + "stdlib": true, + "valid": true + }, + { + "message": "82cb53c4d5a013bae5070759ec06c3c6955ab7a4050958ec328c", + "name": "sign.input line 26", + "public_key": "2bf32ba142ba4622d8f3e29ecd85eea07b9c47be9d64412c9b510b27dd218b23", + "signature": "881f5b8c5a030df0f75b6634b070dd27bd1ee3c08738ae349338b3ee6469bbf9760b13578a237d5182535ede121283027a90b5f865d63a6537dca07b44049a0f", + "stdlib": true, + "valid": true + }, + { + "message": "a9a8cbb0ad585124e522abbfb40533bdd6f49347b55b18e8558cb0", + "name": "sign.input line 27", + "public_key": "94d23d977c33e49e5e4992c68f25ec99a27c41ce6b91f2bfa0cd8292fe962835", + "signature": "3acd39bec8c3cd2b44299722b5850a0400c1443590fd4861d59aae7496acb3df73fc3fdf7969ae5f50ba47dddc435246e5fd376f6b891cd4c2caf5d614b6170c", + "stdlib": true, + "valid": true + }, + { + "message": "5cb6f9aa59b80eca14f6a68fb40cf07b794e75171fba96262c1c6adc", + "name": "sign.input line 28", + "public_key": "9d084aa8b97a6b9bafa496dbc6f76f3306a116c9d917e681520a0f914369427e", + "signature": "f5875423781b66216cb5e8998de5d9ffc29d1d67107054ace3374503a9c3ef811577f269de81296744bd706f1ac478caf09b54cdf871b3f802bd57f9a6cb9101", + "stdlib": true, + "valid": true + }, + { + "message": "32fe27994124202153b5c70d3813fdee9c2aa6e7dc743d4d535f1840a5", + "name": "sign.input line 29", + "public_key": "16cee8a3f2631834c88b670897ff0b08ce90cc147b4593b3f1f403727f7e7ad5", + "signature": "d834197c1a3080614e0a5fa0aaaa808824f21c38d692e6ffbd200f7dfb3c8f44402a7382180b98ad0afc8eec1a02acecf3cb7fde627b9f18111f260ab1db9a07", + "stdlib": true, + "valid": true + }, + { + "message": "bb3172795710fe00054d3b5dfef8a11623582da68bf8e46d72d27cece2aa", + "name": "sign.input line 30", + "public_key": "23be323c562dfd71ce65f5bba56a74a3a6dfc36b573d2f94f635c7f9b4fd5a5b", + "signature": "0f8fad1e6bde771b4f5420eac75c378bae6db5ac6650cd2bc210c1823b432b48e016b10595458ffab92f7a8989b293ceb8dfed6c243a2038fc06652aaaf16f02", + "stdlib": true, + "valid": true + }, + { + "message": "7cf34f75c3dac9a804d0fcd09eba9b29c9484e8a018fa9e073042df88e3c56", + "name": "sign.input line 31", + "public_key": "3f60c7541afa76c019cf5aa82dcdb088ed9e4ed9780514aefb379dabc844f31a", + "signature": "be71ef4806cb041d885effd9e6b0fbb73d65d7cdec47a89c8a994892f4e55a568c4cc78d61f901e80dbb628b86a23ccd594e712b57fa94c2d67ec26634878507", + "stdlib": true, + "valid": true + }, + { + "message": "a750c232933dc14b1184d86d8b4ce72e16d69744ba69818b6ac33b1d823bb2c3", + "name": "sign.input line 32", + "public_key": "b49f3a78b1c6a7fca8f3466f33bc0e929f01fba04306c2a7465f46c3759316d9", + "signature": "04266c033b91c1322ceb3446c901ffcf3cc40c4034e887c9597ca1893ba7330becbbd8b48142ef35c012c6ba51a66df9308cb6268ad6b1e4b03e70102495790b", + "stdlib": true, + "valid": true + }, + { + "message": "a750c232933dc14b1184d86d8b4ce72e16d69744ba69818b6ac33b1d823bb2c3", + "name": "sign.input line 32, R changed", + "public_key": "b49f3a78b1c6a7fca8f3466f33bc0e929f01fba04306c2a7465f46c3759316d9", + "signature": "05266c033b91c1322ceb3446c901ffcf3cc40c4034e887c9597ca1893ba7330becbbd8b48142ef35c012c6ba51a66df9308cb6268ad6b1e4b03e70102495790b", + "stdlib": false, + "valid": false + }, + { + "message": "a750c232933dc14b1184d86d8b4ce72e16d69744ba69818b6ac33b1d823bb2c3", + "name": "sign.input line 32, S changed", + "public_key": "b49f3a78b1c6a7fca8f3466f33bc0e929f01fba04306c2a7465f46c3759316d9", + "signature": "04266c033b91c1322ceb3446c901ffcf3cc40c4034e887c9597ca1893ba7330bedbbd8b48142ef35c012c6ba51a66df9308cb6268ad6b1e4b03e70102495790b", + "stdlib": false, + "valid": false + }, + { + "message": "a750c232933dc14b1184d86d8b4ce72e16d69744ba69818b6ac33b1d823bb2c3", + "name": "sign.input line 32, S top byte changed", + "public_key": "b49f3a78b1c6a7fca8f3466f33bc0e929f01fba04306c2a7465f46c3759316d9", + "signature": "04266c033b91c1322ceb3446c901ffcf3cc40c4034e887c9597ca1893ba7330becbbd8b48142ef35c012c6ba51a66df9308cb6268ad6b1e4b03e70102495790a", + "stdlib": false, + "valid": false + }, + { + "message": "a750c232933dc14b1184d86d8b4ce72e16d69744ba69818b6ac33b1d823bb2c3", + "name": "sign.input line 32, A changed", + "public_key": "b49f3a78b1c7a7fca8f3466f33bc0e929f01fba04306c2a7465f46c3759316d9", + "signature": "04266c033b91c1322ceb3446c901ffcf3cc40c4034e887c9597ca1893ba7330becbbd8b48142ef35c012c6ba51a66df9308cb6268ad6b1e4b03e70102495790b", + "stdlib": false, + "valid": false + }, + { + "message": "a650c232933dc14b1184d86d8b4ce72e16d69744ba69818b6ac33b1d823bb2c3", + "name": "sign.input line 32, message changed", + "public_key": "b49f3a78b1c6a7fca8f3466f33bc0e929f01fba04306c2a7465f46c3759316d9", + "signature": "04266c033b91c1322ceb3446c901ffcf3cc40c4034e887c9597ca1893ba7330becbbd8b48142ef35c012c6ba51a66df9308cb6268ad6b1e4b03e70102495790b", + "stdlib": false, + "valid": false + }, + { + "message": "5a44e34b746c5fd1898d552ab354d28fb4713856d7697dd63eb9bd6b99c280e187", + "name": "sign.input line 33", + "public_key": "8ea074245159a116aa7122a25ec16b891d625a68f33660423908f6bdc44f8c1b", + "signature": "a06a23d982d81ab883aae230adbc368a6a9977f003cebb00d4c2e4018490191a84d3a282fdbfb2fc88046e62de43e15fb575336b3c8b77d19ce6a009ce51f50c", + "stdlib": true, + "valid": true + }, + { + "message": "8bc4185e50e57d5f87f47515fe2b1837d585f0aae9e1ca383b3ec908884bb900ff27", + "name": "sign.input line 34", + "public_key": "af6b7145474dc9954b9af93a9cdb34449d5b7c651c824d24e230b90033ce59c0", + "signature": "16dc1e2b9fa909eefdc277ba16ebe207b8da5e91143cde78c5047a89f681c33c4e4e3428d5c928095903a811ec002d52a39ed7f8b3fe1927200c6dd0b9ab3e04", + "stdlib": true, + "valid": true + }, + { + "message": "95872d5f789f95484e30cbb0e114028953b16f5c6a8d9f65c003a83543beaa46b38645", + "name": "sign.input line 35", + "public_key": "f85b80e050a1b9620db138bfc9e100327e25c257c59217b601f1f6ac9a413d3f", + "signature": "ea855d781cbea4682e350173cb89e8619ccfddb97cdce16f9a2f6f6892f46dbe68e04b12b8d88689a7a31670cdff409af98a93b49a34537b6aa009d2eb8b4701", + "stdlib": true, + "valid": true + }, + { + "message": "e05f71e4e49a72ec550c44a3b85aca8f20ff26c3ee94a80f1b431c7d154ec9603ee02531", + "name": "sign.input line 36", + "public_key": "017370c879090a81c7f272c2fc80e3aac2bc603fcb379afc98691160ab745b26", + "signature": "ac957f82335aa7141e96b59d63e3ccee95c3a2c47d026540c2af42dc9533d5fd81827d1679ad187aeaf37834915e75b147a9286806c8017516ba43dd051a5e0c", + "stdlib": true, + "valid": true + }, + { + "message": "938f0e77621bf3ea52c7c4911c5157c2d8a2a858093ef16aa9b107e69d98037ba139a3c382", + "name": "sign.input line 37", + "public_key": "f30162bac98447c4042fac05da448034629be2c6a58d30dfd578ba9fb5e3930b", + "signature": "5efe7a92ff9623089b3e3b78f352115366e26ba3fb1a416209bc029e9cadccd9f4affa333555a8f3a35a9d0f7c34b292cae77ec96fa3adfcaadee2d9ced8f805", + "stdlib": true, + "valid": true + }, + { + "message": "838367471183c71f7e717724f89d401c3ad9863fd9cc7aa3cf33d3c529860cb581f3093d87da", + "name": "sign.input line 38", + "public_key": "34ad0fbdb2566507a81c2b1f8aa8f53dccaa64cc87ada91b903e900d07eee930", + "signature": "2ab255169c489c54c732232e37c87349d486b1eba20509dbabe7fed329ef08fd75ba1cd145e67b2ea26cb5cc51cab343eeb085fe1fd7b0ec4c6afcd9b979f905", + "stdlib": true, + "valid": true + }, + { + "message": "33e5918b66d33d55fe717ca34383eae78f0af82889caf6696e1ac9d95d1ffb32cba755f9e3503e", + "name": "sign.input line 39", + "public_key": "94e5eb4d5024f49d7ebf79817c8de11497dc2b55622a51ae123ffc749dbb16e0", + "signature": "58271d44236f3b98c58fd7ae0d2f49ef2b6e3affdb225aa3ba555f0e11cc53c23ad19baf24346590d05d7d5390582082cf94d39cad6530ab93d13efb39279506", + "stdlib": true, + "valid": true + }, + { + "message": "da9c5559d0ea51d255b6bd9d7638b876472f942b330fc0e2b30aea68d77368fce4948272991d257e", + "name": "sign.input line 40", + "public_key": "1772c5abc2d23fd2f9d1c3257be7bc3c1cd79cee40844b749b3a7743d2f964b8", + "signature": "6828cd7624e793b8a4ceb96d3c2a975bf773e5ff6645f353614058621e58835289e7f31f42dfe6af6d736f2644511e320c0fa698582a79778d18730ed3e8cb08", + "stdlib": true, + "valid": true + }, + { + "message": "da9c5559d0ea51d255b6bd9d7638b876472f942b330fc0e2b30aea68d77368fce4948272991d257e", + "name": "sign.input line 40, R changed", + "public_key": "1772c5abc2d23fd2f9d1c3257be7bc3c1cd79cee40844b749b3a7743d2f964b8", + "signature": "6928cd7624e793b8a4ceb96d3c2a975bf773e5ff6645f353614058621e58835289e7f31f42dfe6af6d736f2644511e320c0fa698582a79778d18730ed3e8cb08", + "stdlib": false, + "valid": false + }, + { + "message": "da9c5559d0ea51d255b6bd9d7638b876472f942b330fc0e2b30aea68d77368fce4948272991d257e", + "name": "sign.input line 40, S changed", + "public_key": "1772c5abc2d23fd2f9d1c3257be7bc3c1cd79cee40844b749b3a7743d2f964b8", + "signature": "6828cd7624e793b8a4ceb96d3c2a975bf773e5ff6645f353614058621e58835288e7f31f42dfe6af6d736f2644511e320c0fa698582a79778d18730ed3e8cb08", + "stdlib": false, + "valid": false + }, + { + "message": "da9c5559d0ea51d255b6bd9d7638b876472f942b330fc0e2b30aea68d77368fce4948272991d257e", + "name": "sign.input line 40, S top byte changed", + "public_key": "1772c5abc2d23fd2f9d1c3257be7bc3c1cd79cee40844b749b3a7743d2f964b8", + "signature": "6828cd7624e793b8a4ceb96d3c2a975bf773e5ff6645f353614058621e58835289e7f31f42dfe6af6d736f2644511e320c0fa698582a79778d18730ed3e8cb09", + "stdlib": false, + "valid": false + }, + { + "message": "da9c5559d0ea51d255b6bd9d7638b876472f942b330fc0e2b30aea68d77368fce4948272991d257e", + "name": "sign.input line 40, A changed", + "public_key": "1772c5abc2d33fd2f9d1c3257be7bc3c1cd79cee40844b749b3a7743d2f964b8", + "signature": "6828cd7624e793b8a4ceb96d3c2a975bf773e5ff6645f353614058621e58835289e7f31f42dfe6af6d736f2644511e320c0fa698582a79778d18730ed3e8cb08", + "stdlib": false, + "valid": false + }, + { + "message": "db9c5559d0ea51d255b6bd9d7638b876472f942b330fc0e2b30aea68d77368fce4948272991d257e", + "name": "sign.input line 40, message changed", + "public_key": "1772c5abc2d23fd2f9d1c3257be7bc3c1cd79cee40844b749b3a7743d2f964b8", + "signature": "6828cd7624e793b8a4ceb96d3c2a975bf773e5ff6645f353614058621e58835289e7f31f42dfe6af6d736f2644511e320c0fa698582a79778d18730ed3e8cb08", + "stdlib": false, + "valid": false + }, + { + "message": "c59d0862ec1c9746abcc3cf83c9eeba2c7082a036a8cb57ce487e763492796d47e6e063a0c1feccc2d", + "name": "sign.input line 41", + "public_key": "299ebd1f13177dbdb66a912bbf712038fdf73b06c3ac020c7b19126755d47f61", + "signature": "d59e6dfcc6d7e3e2c58dec81e985d245e681acf6594a23c59214f7bed8015d813c7682b60b3583440311e72a8665ba2c96dec23ce826e160127e18132b030404", + "stdlib": true, + "valid": true + }, + { + "message": "56f1329d9a6be25a6159c72f12688dc8314e85dd9e7e4dc05bbecb7729e023c86f8e0937353f27c7ede9", + "name": "sign.input line 42", + "public_key": "da768b20c437dd3aa5f84bb6a077ffa34ab68501c5352b5cc3fdce7fe6c2398d", + "signature": "1c723a20c6772426a670e4d5c4a97c6ebe9147f71bb0a415631e44406e290322e4ca977d348fe7856a8edc235d0fe95f7ed91aefddf28a77e2c7dbfd8f552f0a", + "stdlib": true, + "valid": true + }, + { + "message": "a7c04e8ba75d0a03d8b166ad7a1d77e1b91c7aaf7befdd99311fc3c54a684ddd971d5b3211c3eeaff1e54e", + "name": "sign.input line 43", + "public_key": "6791d8ce50a44689fc178727c5c3a1c959fbeed74ef7d8e7bd3c1ab4da31c51f", + "signature": "ebf10d9ac7c96108140e7def6fe9533d727646ff5b3af273c1df95762a66f32b65a09634d013f54b5dd6011f91bc336ca8b355ce33f8cfbec2535a4c427f8205", + "stdlib": true, + "valid": true + }, + { + "message": "63b80b7956acbecf0c35e9ab06b914b0c7014fe1a4bbc0217240c1a33095d707953ed77b15d211adaf9b97dc", + "name": "sign.input line 44", + "public_key": "ecfb6a2bd42f31b61250ba5de7e46b4719afdfbc660db71a7bd1df7b0a3abe37", + "signature": "9af885344cc7239498f712df80bc01b80638291ed4a1d28baa5545017a72e2f65649ccf9603da6eb5bfab9f5543a6ca4a7af3866153c76bf66bf95def615b00c", + "stdlib": true, + "valid": true + }, + { + "message": "65641cd402add8bf3d1d67dbeb6d41debfbef67e4317c35b0a6d5bbbae0e034de7d670ba1413d056f2d6f1de12", + "name": "sign.input line 45", + "public_key": "588ddadcbcedf40df0e9697d8bb277c7bb1498fa1d26ce0a835a760b92ca7c85", + "signature": "c179c09456e235fe24105afa6e8ec04637f8f943817cd098ba95387f9653b2add181a31447d92d1a1ddf1ceb0db62118de9dffb7dcd2424057cbdff5d41d0403", + "stdlib": true, + "valid": true + }, + { + "message": "4f1846dd7ad50e545d4cfbffbb1dc2ff145dc123754d08af4e44ecc0bc8c91411388bc7653e2d893d1eac2107d05", + "name": "sign.input line 46", + "public_key": "aba3e795aab2012acceadd7b3bd9daeeed6ff5258bdcd7c93699c2a3836e3832", + "signature": "2c691fa8d487ce20d5d2fa41559116e0bbf4397cf5240e152556183541d66cf753582401a4388d390339dbef4d384743caa346f55f8daba68ba7b9131a8a6e0b", + "stdlib": true, + "valid": true + }, + { + "message": "4c8274d0ed1f74e2c86c08d955bde55b2d54327e82062a1f71f70d536fdc8722cdead7d22aaead2bfaa1ad00b82957", + "name": "sign.input line 47", + "public_key": "72e409937e0610eb5c20b326dc6ea1bbbc0406701c5cd67d1fbde09192b07c01", + "signature": "87f7fdf46095201e877a588fe3e5aaf476bd63138d8a878b89d6ac60631b3458b9d41a3c61a588e1db8d29a5968981b018776c588780922f5aa732ba6379dd05", + "stdlib": true, + "valid": true + }, + { + "message": "783e33c3acbdbb36e819f544a7781d83fc283d3309f5d3d12c8dcd6b0b3d0e89e38cfd3b4d0885661ca547fb9764abff", + "name": "sign.input line 48", + "public_key": "90d2efbba4d43e6b2b992ca16083dbcfa2b322383907b0ee75f3e95845d3c47f", + "signature": "fa2e994421aef1d5856674813d05cbd2cf84ef5eb424af6ecd0dc6fdbdc2fe605fe985883312ecf34f59bfb2f1c9149e5b9cc9ecda05b2731130f3ed28ddae0b", + "stdlib": true, + "valid": true + }, + { + "message": "783e33c3acbdbb36e819f544a7781d83fc283d3309f5d3d12c8dcd6b0b3d0e89e38cfd3b4d0885661ca547fb9764abff", + "name": "sign.input line 48, R changed", + "public_key": "90d2efbba4d43e6b2b992ca16083dbcfa2b322383907b0ee75f3e95845d3c47f", + "signature": "fb2e994421aef1d5856674813d05cbd2cf84ef5eb424af6ecd0dc6fdbdc2fe605fe985883312ecf34f59bfb2f1c9149e5b9cc9ecda05b2731130f3ed28ddae0b", + "stdlib": false, + "valid": false + }, + { + "message": "783e33c3acbdbb36e819f544a7781d83fc283d3309f5d3d12c8dcd6b0b3d0e89e38cfd3b4d0885661ca547fb9764abff", + "name": "sign.input line 48, S changed", + "public_key": "90d2efbba4d43e6b2b992ca16083dbcfa2b322383907b0ee75f3e95845d3c47f", + "signature": "fa2e994421aef1d5856674813d05cbd2cf84ef5eb424af6ecd0dc6fdbdc2fe605ee985883312ecf34f59bfb2f1c9149e5b9cc9ecda05b2731130f3ed28ddae0b", + "stdlib": false, + "valid": false + }, + { + "message": "783e33c3acbdbb36e819f544a7781d83fc283d3309f5d3d12c8dcd6b0b3d0e89e38cfd3b4d0885661ca547fb9764abff", + "name": "sign.input line 48, S top byte changed", + "public_key": "90d2efbba4d43e6b2b992ca16083dbcfa2b322383907b0ee75f3e95845d3c47f", + "signature": "fa2e994421aef1d5856674813d05cbd2cf84ef5eb424af6ecd0dc6fdbdc2fe605fe985883312ecf34f59bfb2f1c9149e5b9cc9ecda05b2731130f3ed28ddae0a", + "stdlib": false, + "valid": false + }, + { + "message": "783e33c3acbdbb36e819f544a7781d83fc283d3309f5d3d12c8dcd6b0b3d0e89e38cfd3b4d0885661ca547fb9764abff", + "name": "sign.input line 48, A changed", + "public_key": "90d2efbba4d53e6b2b992ca16083dbcfa2b322383907b0ee75f3e95845d3c47f", + "signature": "fa2e994421aef1d5856674813d05cbd2cf84ef5eb424af6ecd0dc6fdbdc2fe605fe985883312ecf34f59bfb2f1c9149e5b9cc9ecda05b2731130f3ed28ddae0b", + "stdlib": false, + "valid": false + }, + { + "message": "793e33c3acbdbb36e819f544a7781d83fc283d3309f5d3d12c8dcd6b0b3d0e89e38cfd3b4d0885661ca547fb9764abff", + "name": "sign.input line 48, message changed", + "public_key": "90d2efbba4d43e6b2b992ca16083dbcfa2b322383907b0ee75f3e95845d3c47f", + "signature": "fa2e994421aef1d5856674813d05cbd2cf84ef5eb424af6ecd0dc6fdbdc2fe605fe985883312ecf34f59bfb2f1c9149e5b9cc9ecda05b2731130f3ed28ddae0b", + "stdlib": false, + "valid": false + }, + { + "message": "29d77acfd99c7a0070a88feb6247a2bce9984fe3e6fbf19d4045042a21ab26cbd771e184a9a75f316b648c6920db92b87b", + "name": "sign.input line 49", + "public_key": "fd711dc7dd3b1dfb9df9704be3e6b26f587fe7dd7ba456a91ba43fe51aec09ad", + "signature": "58832bdeb26feafc31b46277cf3fb5d7a17dfb7ccd9b1f58ecbe6feb979666828f239ba4d75219260ecac0acf40f0e5e2590f4caa16bbbcd8a155d347967a607", + "stdlib": true, + "valid": true + }, + { + "message": "f3992cde6493e671f1e129ddca8038b0abdb77bb9035f9f8be54bd5d68c1aeff724ff47d29344391dc536166b8671cbbf123", + "name": "sign.input line 50", + "public_key": "2c50f870ee48b36b0ac2f8a5f336fb090b113050dbcc25e078200a6e16153eea", + "signature": "69e6a4491a63837316e86a5f4ba7cd0d731ecc58f1d0a264c67c89befdd8d3829d8de13b33cc0bf513931715c7809657e2bfb960e5c764c971d733746093e500", + "stdlib": true, + "valid": true + }, + { + "message": "19f1bf5dcf1750c611f1c4a2865200504d82298edd72671f62a7b1471ac3d4a30f7de9e5da4108c52a4ce70a3e114a52a3b3c5", + "name": "sign.input line 51", + "public_key": "eb2bcadfd3eec2986baff32b98e7c4dbf03ff95d8ad5ff9aa9506e5472ff845f", + "signature": "c7b55137317ca21e33489ff6a9bfab97c855dc6f85684a70a9125a261b56d5e6f149c5774d734f2d8debfc77b721896a8267c23768e9badb910eef83ec258802", + "stdlib": true, + "valid": true + }, + { + "message": "f8b21962447b0a8f2e4279de411bea128e0be44b6915e6cda88341a68a0d818357db938eac73e0af6d31206b3948f8c48a447308", + "name": "sign.input line 52", + "public_key": "5e3c19f2415acf729f829a4ebd5c40e1a6bc9fbca95703a9376087ed0937e51a", + "signature": "27d4c3a1811ef9d4360b3bdd133c2ccc30d02c2f248215776cb07ee4177f9b13fc42dd70a6c2fed8f225c7663c7f182e7ee8eccff20dc7b0e1d5834ec5b1ea01", + "stdlib": true, + "valid": true + }, + { + "message": "99e3d00934003ebafc3e9fdb687b0f5ff9d5782a4b1f56b9700046c077915602c3134e22fc90ed7e690fddd4433e2034dcb2dc99ab", + "name": "sign.input line 53", + "public_key": "9ef27608961ac711de71a6e2d4d4663ea3ecd42fb7e4e8627c39622df4af0bbc", + "signature": "18dc56d7bd9acd4f4daa78540b4ac8ff7aa9815f45a0bba370731a14eaabe96df8b5f37dbf8eae4cb15a64b244651e59d6a3d6761d9e3c50f2d0cbb09c05ec06", + "stdlib": true, + "valid": true + }, + { + "message": "e07241dbd3adbe610bbe4d005dd46732a4c25086ecb8ec29cd7bca116e1bf9f53bfbf3e11fa49018d39ff1154a06668ef7df5c678e6a", + "name": "sign.input line 54", + "public_key": "65a99c3e16fea894ec33c6b20d9105e2a04e2764a4769d9bbd4d8bacfeab4a2e", + "signature": "01bb901d83b8b682d3614af46a807ba2691358feb775325d3423f549ff0aa5757e4e1a74e9c70f9721d8f354b319d4f4a1d91445c870fd0ffb94fed64664730d", + "stdlib": true, + "valid": true + }, + { + "message": "331da7a9c1f87b2ac91ee3b86d06c29163c05ed6f8d8a9725b471b7db0d6acec7f0f702487163f5eda020ca5b493f399e1c8d308c3c0c2", + "name": "sign.input line 55", + "public_key": "7fc88b1f7b3f11c629be671c21621f5c10672fafc8492da885742059ee6774cf", + "signature": "4b229951ef262f16978f7914bc672e7226c5f8379d2778c5a2dc0a2650869f7acfbd0bcd30fdb0619bb44fc1ae5939b87cc318133009c20395b6c7eb98107701", + "stdlib": true, + "valid": true + }, + { + "message": "7f318dbd121c08bfddfeff4f6aff4e45793251f8abf658403358238984360054f2a862c5bb83ed89025d2014a7a0cee50da3cb0e76bbb6bf", + "name": "sign.input line 56", + "public_key": "57a04c7a5113cddfe49a4c124691d46c1f9cdc8f343f9dcb72a1330aeca71fda", + "signature": "a6cbc947f9c87d1455cf1a708528c090f11ecee4855d1dbaadf47454a4de55fa4ce84b36d73a5b5f8f59298ccf21992df492ef34163d87753b7e9d32f2c3660b", + "stdlib": true, + "valid": true + }, + { + "message": "7f318dbd121c08bfddfeff4f6aff4e45793251f8abf658403358238984360054f2a862c5bb83ed89025d2014a7a0cee50da3cb0e76bbb6bf", + "name": "sign.input line 56, R changed", + "public_key": "57a04c7a5113cddfe49a4c124691d46c1f9cdc8f343f9dcb72a1330aeca71fda", + "signature": "a7cbc947f9c87d1455cf1a708528c090f11ecee4855d1dbaadf47454a4de55fa4ce84b36d73a5b5f8f59298ccf21992df492ef34163d87753b7e9d32f2c3660b", + "stdlib": false, + "valid": false + }, + { + "message": "7f318dbd121c08bfddfeff4f6aff4e45793251f8abf658403358238984360054f2a862c5bb83ed89025d2014a7a0cee50da3cb0e76bbb6bf", + "name": "sign.input line 56, S changed", + "public_key": "57a04c7a5113cddfe49a4c124691d46c1f9cdc8f343f9dcb72a1330aeca71fda", + "signature": "a6cbc947f9c87d1455cf1a708528c090f11ecee4855d1dbaadf47454a4de55fa4de84b36d73a5b5f8f59298ccf21992df492ef34163d87753b7e9d32f2c3660b", + "stdlib": false, + "valid": false + }, + { + "message": "7f318dbd121c08bfddfeff4f6aff4e45793251f8abf658403358238984360054f2a862c5bb83ed89025d2014a7a0cee50da3cb0e76bbb6bf", + "name": "sign.input line 56, S top byte changed", + "public_key": "57a04c7a5113cddfe49a4c124691d46c1f9cdc8f343f9dcb72a1330aeca71fda", + "signature": "a6cbc947f9c87d1455cf1a708528c090f11ecee4855d1dbaadf47454a4de55fa4ce84b36d73a5b5f8f59298ccf21992df492ef34163d87753b7e9d32f2c3660a", + "stdlib": false, + "valid": false + }, + { + "message": "7f318dbd121c08bfddfeff4f6aff4e45793251f8abf658403358238984360054f2a862c5bb83ed89025d2014a7a0cee50da3cb0e76bbb6bf", + "name": "sign.input line 56, A changed", + "public_key": "57a04c7a5112cddfe49a4c124691d46c1f9cdc8f343f9dcb72a1330aeca71fda", + "signature": "a6cbc947f9c87d1455cf1a708528c090f11ecee4855d1dbaadf47454a4de55fa4ce84b36d73a5b5f8f59298ccf21992df492ef34163d87753b7e9d32f2c3660b", + "stdlib": false, + "valid": false + }, + { + "message": "7e318dbd121c08bfddfeff4f6aff4e45793251f8abf658403358238984360054f2a862c5bb83ed89025d2014a7a0cee50da3cb0e76bbb6bf", + "name": "sign.input line 56, message changed", + "public_key": "57a04c7a5113cddfe49a4c124691d46c1f9cdc8f343f9dcb72a1330aeca71fda", + "signature": "a6cbc947f9c87d1455cf1a708528c090f11ecee4855d1dbaadf47454a4de55fa4ce84b36d73a5b5f8f59298ccf21992df492ef34163d87753b7e9d32f2c3660b", + "stdlib": false, + "valid": false + }, + { + "message": "ce497c5ff5a77990b7d8f8699eb1f5d8c0582f70cb7ac5c54d9d924913278bc654d37ea227590e15202217fc98dac4c0f3be2183d133315739", + "name": "sign.input line 57", + "public_key": "a3f527a1c1f17dfeed92277347c9f98ab475de1755b0ab546b8a15d01b9bd0be", + "signature": "4e8c318343c306adbba60c92b75cb0569b9219d8a86e5d57752ed235fc109a43c2cf4e942cacf297279fbb28675347e08027722a4eb7395e00a17495d32edf0b", + "stdlib": true, + "valid": true + }, + { + "message": "8ddcd63043f55ec3bfc83dceae69d8f8b32f4cdb6e2aebd94b4314f8fe7287dcb62732c9052e7557fe63534338efb5b6254c5d41d2690cf5144f", + "name": "sign.input line 58", + "public_key": "0f7eda091499625e2bae8536ea35cda5483bd16a9c7e416b341d6f2c83343612", + "signature": "efbd41f26a5d62685516f882b6ec74e0d5a71830d203c231248f26e99a9c6578ec900d68cdb8fa7216ad0d24f9ecbc9ffa655351666582f626645395a31fa704", + "stdlib": true, + "valid": true + }, + { + "message": "a6d4d0542cfe0d240a90507debacabce7cbbd48732353f4fad82c7bb7dbd9df8e7d9a16980a45186d8786c5ef65445bcc5b2ad5f660ffc7c8eaac0", + "name": "sign.input line 59", + "public_key": "0ecb2601d5f7047428e9f909883a12420085f04ee2a88b6d95d3d7f2c932bd76", + "signature": "32d22904d3e7012d6f5a441b0b4228064a5cf95b723a66b048a087ecd55920c31c204c3f2006891a85dd1932e3f1d614cfd633b5e63291c6d8166f3011431e09", + "stdlib": true, + "valid": true + }, + { + "message": "3a53594f3fba03029318f512b084a071ebd60baec7f55b028dc73bfc9c74e0ca496bf819dd92ab61cd8b74be3c0d6dcd128efc5ed3342cba124f726c", + "name": "sign.input line 60", + "public_key": "788de540544d3feb0c919240b390729be487e94b64ad973eb65b4669ecf23501", + "signature": "d2fde02791e720852507faa7c3789040d9ef86646321f313ac557f4002491542dd67d05c6990cdb0d495501fbc5d5188bfbb84dc1bf6098bee0603a47fc2690f", + "stdlib": true, + "valid": true + }, + { + "message": "20e1d05a0d5b32cc8150b8116cef39659dd5fb443ab15600f78e5b49c45326d9323f2850a63c3808859495ae273f58a51e9de9a145d774b40ba9d753d3", + "name": "sign.input line 61", + "public_key": "52a00d96a3148b4726692d9eff89160ea9f99a5cc4389f361fed0bb16a42d521", + "signature": "22c99aa946ead39ac7997562810c01c20b46bd610645bd2d56dcdcbaacc5452c74fbf4b8b1813b0e94c30d808ce5498e61d4f7ccbb4cc5f04dfc6140825a9600", + "stdlib": true, + "valid": true + }, + { + "message": "54e0caa8e63919ca614b2bfd308ccfe50c9ea888e1ee4446d682cb5034627f97b05392c04e835556c31c52816a48e4fb196693206b8afb4408662b3cb575", + "name": "sign.input line 62", + "public_key": "0510eaf57d7301b0e1d527039bf4c6e292300a3a61b4765434f3203c100351b1", + "signature": "06e5d8436ac7705b3a90f1631cdd38ec1a3fa49778a9b9f2fa5ebea4e7d560ada7dd26ff42fafa8ba420323742761aca6904940dc21bbef63ff72daab45d430b", + "stdlib": true, + "valid": true + }, + { + "message": "16152c2e037b1c0d3219ced8e0674aee6b57834b55106c5344625322da638ecea2fc9a424a05ee9512d48fcf75dd8bd4691b3c10c28ec98ee1afa5b863d1c36795ed18105db3a9aabd9d2b4c1747adbaf1a56ffcc0c533c1c0faef331cdb79d961fa39f880a1b8b1164741822efb15a7259a465bef212855751fab66a897bfa211abe0ea2f2e1cd8a11d80e142cde1263eec267a3138ae1fcf4099db0ab53d64f336f4bcd7a363f6db112c0a2453051a0006f813aaf4ae948a2090619374fa58052409c28ef76225687df3cb2d1b0bfb43b09f47f1232f790e6d8dea759e57942099f4c4bd3390f28afc2098244961465c643fc8b29766af2bcbc5440b86e83608cfc937be98bb4827fd5e6b689adc2e26513db531076a6564396255a09975b7034dac06461b255642e3a7ed75fa9fc265011f5f6250382a84ac268d63ba64", + "name": "sign.input line 63", + "public_key": "1be034f813017b900d8990af45fad5b5214b573bd303ef7a75ef4b8c5c5b9842", + "signature": "279cace6fdaf3945e3837df474b28646143747632bede93e7a66f5ca291d2c24978512ca0cb8827c8c322685bd605503a5ec94dbae61bbdcae1e49650602bc07", + "stdlib": true, + "valid": true + }, + { + "message": "446174654b657973", + "name": "S + 7237005577332262213973186563042994240857116359379907606001950938285454250989", + "public_key": "6e9a1744b47b95f65ab8255d71d05c6a9c8a3b21026883c2ef78da5363dfe4bc", + "signature": "20ebdb41c7c4f6d4cb847c59947880d1dfd28f1f30c9cc5019d04aa23251e00848e466062e7dc8c2946e849a095fa6bb0af720cad77636fdd8ce3c8f16056217", + "stdlib": false, + "valid": false + }, + { + "message": "446174654b657973", + "name": "S + 14474011154664524427946373126085988481658748083205070504932198000989141204992", + "public_key": "6e9a1744b47b95f65ab8255d71d05c6a9c8a3b21026883c2ef78da5363dfe4bc", + "signature": "20ebdb41c7c4f6d4cb847c59947880d1dfd28f1f30c9cc5019d04aa23251e0085b1071a9131ab66abed18cf72a65c7a60af720cad77636fdd8ce3c8f16056227", + "stdlib": false, + "valid": false + }, + { + "message": "446174654b657973", + "name": "S + 14474011154664524427946373126085988481714232718759815212003901876570908501978", + "public_key": "6e9a1744b47b95f65ab8255d71d05c6a9c8a3b21026883c2ef78da5363dfe4bc", + "signature": "20ebdb41c7c4f6d4cb847c59947880d1dfd28f1f30c9cc5019d04aa23251e00835b85c6348e0da1a6b0b7c3de85885d00af720cad77636fdd8ce3c8f16056227", + "stdlib": false, + "valid": false + }, + { + "message": "0000", + "name": "small order point 0, R = identity, S = 0, message 0", + "public_key": "0000000000000000000000000000000000000000000000000000000000000000", + "signature": "01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "stdlib": true, + "valid": false + }, + { + "message": "0001", + "name": "small order point 0, R = identity, S = 0, message 1", + "public_key": "0000000000000000000000000000000000000000000000000000000000000000", + "signature": "01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "stdlib": false, + "valid": false + }, + { + "message": "0002", + "name": "small order point 0, R = identity, S = 0, message 2", + "public_key": "0000000000000000000000000000000000000000000000000000000000000000", + "signature": "01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "stdlib": false, + "valid": false + }, + { + "message": "0003", + "name": "small order point 0, R = identity, S = 0, message 3", + "public_key": "0000000000000000000000000000000000000000000000000000000000000000", + "signature": "01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "stdlib": false, + "valid": false + }, + { + "message": "0100", + "name": "small order point 1, R = identity, S = 0, message 0", + "public_key": "0000000000000000000000000000000000000000000000000000000000000080", + "signature": "01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "stdlib": false, + "valid": false + }, + { + "message": "0101", + "name": "small order point 1, R = identity, S = 0, message 1", + "public_key": "0000000000000000000000000000000000000000000000000000000000000080", + "signature": "01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "stdlib": true, + "valid": false + }, + { + "message": "0102", + "name": "small order point 1, R = identity, S = 0, message 2", + "public_key": "0000000000000000000000000000000000000000000000000000000000000080", + "signature": "01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "stdlib": false, + "valid": false + }, + { + "message": "0103", + "name": "small order point 1, R = identity, S = 0, message 3", + "public_key": "0000000000000000000000000000000000000000000000000000000000000080", + "signature": "01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "stdlib": true, + "valid": false + }, + { + "message": "0200", + "name": "small order point 2, R = identity, S = 0, message 0", + "public_key": "0100000000000000000000000000000000000000000000000000000000000000", + "signature": "01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "stdlib": true, + "valid": false + }, + { + "message": "0201", + "name": "small order point 2, R = identity, S = 0, message 1", + "public_key": "0100000000000000000000000000000000000000000000000000000000000000", + "signature": "01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "stdlib": true, + "valid": false + }, + { + "message": "0202", + "name": "small order point 2, R = identity, S = 0, message 2", + "public_key": "0100000000000000000000000000000000000000000000000000000000000000", + "signature": "01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "stdlib": true, + "valid": false + }, + { + "message": "0203", + "name": "small order point 2, R = identity, S = 0, message 3", + "public_key": "0100000000000000000000000000000000000000000000000000000000000000", + "signature": "01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "stdlib": true, + "valid": false + }, + { + "message": "0300", + "name": "small order point 3, R = identity, S = 0, message 0", + "public_key": "26e8958fc2b227b045c3f489f2ef98f0d5dfac05d3c63339b13802886d53fc05", + "signature": "01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "stdlib": false, + "valid": false + }, + { + "message": "0301", + "name": "small order point 3, R = identity, S = 0, message 1", + "public_key": "26e8958fc2b227b045c3f489f2ef98f0d5dfac05d3c63339b13802886d53fc05", + "signature": "01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "stdlib": false, + "valid": false + }, + { + "message": "0302", + "name": "small order point 3, R = identity, S = 0, message 2", + "public_key": "26e8958fc2b227b045c3f489f2ef98f0d5dfac05d3c63339b13802886d53fc05", + "signature": "01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "stdlib": false, + "valid": false + }, + { + "message": "0303", + "name": "small order point 3, R = identity, S = 0, message 3", + "public_key": "26e8958fc2b227b045c3f489f2ef98f0d5dfac05d3c63339b13802886d53fc05", + "signature": "01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "stdlib": false, + "valid": false + }, + { + "message": "0400", + "name": "small order point 4, R = identity, S = 0, message 0", + "public_key": "26e8958fc2b227b045c3f489f2ef98f0d5dfac05d3c63339b13802886d53fc85", + "signature": "01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "stdlib": false, + "valid": false + }, + { + "message": "0401", + "name": "small order point 4, R = identity, S = 0, message 1", + "public_key": "26e8958fc2b227b045c3f489f2ef98f0d5dfac05d3c63339b13802886d53fc85", + "signature": "01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "stdlib": false, + "valid": false + }, + { + "message": "0402", + "name": "small order point 4, R = identity, S = 0, message 2", + "public_key": "26e8958fc2b227b045c3f489f2ef98f0d5dfac05d3c63339b13802886d53fc85", + "signature": "01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "stdlib": false, + "valid": false + }, + { + "message": "0403", + "name": "small order point 4, R = identity, S = 0, message 3", + "public_key": "26e8958fc2b227b045c3f489f2ef98f0d5dfac05d3c63339b13802886d53fc85", + "signature": "01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "stdlib": false, + "valid": false + }, + { + "message": "0500", + "name": "small order point 5, R = identity, S = 0, message 0", + "public_key": "c7176a703d4dd84fba3c0b760d10670f2a2053fa2c39ccc64ec7fd7792ac037a", + "signature": "01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "stdlib": false, + "valid": false + }, + { + "message": "0501", + "name": "small order point 5, R = identity, S = 0, message 1", + "public_key": "c7176a703d4dd84fba3c0b760d10670f2a2053fa2c39ccc64ec7fd7792ac037a", + "signature": "01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "stdlib": false, + "valid": false + }, + { + "message": "0502", + "name": "small order point 5, R = identity, S = 0, message 2", + "public_key": "c7176a703d4dd84fba3c0b760d10670f2a2053fa2c39ccc64ec7fd7792ac037a", + "signature": "01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "stdlib": false, + "valid": false + }, + { + "message": "0503", + "name": "small order point 5, R = identity, S = 0, message 3", + "public_key": "c7176a703d4dd84fba3c0b760d10670f2a2053fa2c39ccc64ec7fd7792ac037a", + "signature": "01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "stdlib": true, + "valid": false + }, + { + "message": "0600", + "name": "small order point 6, R = identity, S = 0, message 0", + "public_key": "c7176a703d4dd84fba3c0b760d10670f2a2053fa2c39ccc64ec7fd7792ac03fa", + "signature": "01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "stdlib": false, + "valid": false + }, + { + "message": "0601", + "name": "small order point 6, R = identity, S = 0, message 1", + "public_key": "c7176a703d4dd84fba3c0b760d10670f2a2053fa2c39ccc64ec7fd7792ac03fa", + "signature": "01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "stdlib": false, + "valid": false + }, + { + "message": "0602", + "name": "small order point 6, R = identity, S = 0, message 2", + "public_key": "c7176a703d4dd84fba3c0b760d10670f2a2053fa2c39ccc64ec7fd7792ac03fa", + "signature": "01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "stdlib": false, + "valid": false + }, + { + "message": "0603", + "name": "small order point 6, R = identity, S = 0, message 3", + "public_key": "c7176a703d4dd84fba3c0b760d10670f2a2053fa2c39ccc64ec7fd7792ac03fa", + "signature": "01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "stdlib": false, + "valid": false + }, + { + "message": "0700", + "name": "small order point 7, R = identity, S = 0, message 0", + "public_key": "ecffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f", + "signature": "01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "stdlib": false, + "valid": false + }, + { + "message": "0701", + "name": "small order point 7, R = identity, S = 0, message 1", + "public_key": "ecffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f", + "signature": "01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "stdlib": false, + "valid": false + }, + { + "message": "0702", + "name": "small order point 7, R = identity, S = 0, message 2", + "public_key": "ecffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f", + "signature": "01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "stdlib": true, + "valid": false + }, + { + "message": "0703", + "name": "small order point 7, R = identity, S = 0, message 3", + "public_key": "ecffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f", + "signature": "01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "stdlib": true, + "valid": false + } + ], + "ed25519_encodings": [ + { + "canonical": false, + "encoding": "edffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f", + "name": "y = p + 0, sign 0", + "on_curve": true, + "small_order": false + }, + { + "canonical": true, + "encoding": "0000000000000000000000000000000000000000000000000000000000000000", + "name": "y = 0, sign 0", + "on_curve": true, + "small_order": true + }, + { + "canonical": false, + "encoding": "edffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "name": "y = p + 0, sign 1", + "on_curve": true, + "small_order": false + }, + { + "canonical": true, + "encoding": "0000000000000000000000000000000000000000000000000000000000000080", + "name": "y = 0, sign 1", + "on_curve": true, + "small_order": true + }, + { + "canonical": false, + "encoding": "eeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f", + "name": "y = p + 1, sign 0", + "on_curve": true, + "small_order": false + }, + { + "canonical": true, + "encoding": "0100000000000000000000000000000000000000000000000000000000000000", + "name": "y = 1, sign 0", + "on_curve": true, + "small_order": true + }, + { + "canonical": false, + "encoding": "eeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "name": "y = p + 1, sign 1", + "on_curve": true, + "small_order": false + }, + { + "canonical": false, + "encoding": "0100000000000000000000000000000000000000000000000000000000000080", + "name": "y = 1, sign 1", + "on_curve": true, + "small_order": false + }, + { + "canonical": false, + "encoding": "efffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f", + "name": "y = p + 2, sign 0", + "on_curve": false, + "small_order": false + }, + { + "canonical": true, + "encoding": "0200000000000000000000000000000000000000000000000000000000000000", + "name": "y = 2, sign 0", + "on_curve": false, + "small_order": false + }, + { + "canonical": false, + "encoding": "efffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "name": "y = p + 2, sign 1", + "on_curve": false, + "small_order": false + }, + { + "canonical": true, + "encoding": "0200000000000000000000000000000000000000000000000000000000000080", + "name": "y = 2, sign 1", + "on_curve": false, + "small_order": false + }, + { + "canonical": false, + "encoding": "f0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f", + "name": "y = p + 3, sign 0", + "on_curve": true, + "small_order": false + }, + { + "canonical": true, + "encoding": "0300000000000000000000000000000000000000000000000000000000000000", + "name": "y = 3, sign 0", + "on_curve": true, + "small_order": false + }, + { + "canonical": false, + "encoding": "f0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "name": "y = p + 3, sign 1", + "on_curve": true, + "small_order": false + }, + { + "canonical": true, + "encoding": "0300000000000000000000000000000000000000000000000000000000000080", + "name": "y = 3, sign 1", + "on_curve": true, + "small_order": false + }, + { + "canonical": false, + "encoding": "f1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f", + "name": "y = p + 4, sign 0", + "on_curve": true, + "small_order": false + }, + { + "canonical": true, + "encoding": "0400000000000000000000000000000000000000000000000000000000000000", + "name": "y = 4, sign 0", + "on_curve": true, + "small_order": false + }, + { + "canonical": false, + "encoding": "f1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "name": "y = p + 4, sign 1", + "on_curve": true, + "small_order": false + }, + { + "canonical": true, + "encoding": "0400000000000000000000000000000000000000000000000000000000000080", + "name": "y = 4, sign 1", + "on_curve": true, + "small_order": false + }, + { + "canonical": false, + "encoding": "f2ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f", + "name": "y = p + 5, sign 0", + "on_curve": true, + "small_order": false + }, + { + "canonical": true, + "encoding": "0500000000000000000000000000000000000000000000000000000000000000", + "name": "y = 5, sign 0", + "on_curve": true, + "small_order": false + }, + { + "canonical": false, + "encoding": "f2ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "name": "y = p + 5, sign 1", + "on_curve": true, + "small_order": false + }, + { + "canonical": true, + "encoding": "0500000000000000000000000000000000000000000000000000000000000080", + "name": "y = 5, sign 1", + "on_curve": true, + "small_order": false + }, + { + "canonical": false, + "encoding": "f3ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f", + "name": "y = p + 6, sign 0", + "on_curve": true, + "small_order": false + }, + { + "canonical": true, + "encoding": "0600000000000000000000000000000000000000000000000000000000000000", + "name": "y = 6, sign 0", + "on_curve": true, + "small_order": false + }, + { + "canonical": false, + "encoding": "f3ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "name": "y = p + 6, sign 1", + "on_curve": true, + "small_order": false + }, + { + "canonical": true, + "encoding": "0600000000000000000000000000000000000000000000000000000000000080", + "name": "y = 6, sign 1", + "on_curve": true, + "small_order": false + }, + { + "canonical": false, + "encoding": "f4ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f", + "name": "y = p + 7, sign 0", + "on_curve": false, + "small_order": false + }, + { + "canonical": true, + "encoding": "0700000000000000000000000000000000000000000000000000000000000000", + "name": "y = 7, sign 0", + "on_curve": false, + "small_order": false + }, + { + "canonical": false, + "encoding": "f4ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "name": "y = p + 7, sign 1", + "on_curve": false, + "small_order": false + }, + { + "canonical": true, + "encoding": "0700000000000000000000000000000000000000000000000000000000000080", + "name": "y = 7, sign 1", + "on_curve": false, + "small_order": false + }, + { + "canonical": false, + "encoding": "f5ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f", + "name": "y = p + 8, sign 0", + "on_curve": false, + "small_order": false + }, + { + "canonical": true, + "encoding": "0800000000000000000000000000000000000000000000000000000000000000", + "name": "y = 8, sign 0", + "on_curve": false, + "small_order": false + }, + { + "canonical": false, + "encoding": "f5ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "name": "y = p + 8, sign 1", + "on_curve": false, + "small_order": false + }, + { + "canonical": true, + "encoding": "0800000000000000000000000000000000000000000000000000000000000080", + "name": "y = 8, sign 1", + "on_curve": false, + "small_order": false + }, + { + "canonical": false, + "encoding": "f6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f", + "name": "y = p + 9, sign 0", + "on_curve": true, + "small_order": false + }, + { + "canonical": true, + "encoding": "0900000000000000000000000000000000000000000000000000000000000000", + "name": "y = 9, sign 0", + "on_curve": true, + "small_order": false + }, + { + "canonical": false, + "encoding": "f6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "name": "y = p + 9, sign 1", + "on_curve": true, + "small_order": false + }, + { + "canonical": true, + "encoding": "0900000000000000000000000000000000000000000000000000000000000080", + "name": "y = 9, sign 1", + "on_curve": true, + "small_order": false + }, + { + "canonical": false, + "encoding": "f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f", + "name": "y = p + 10, sign 0", + "on_curve": true, + "small_order": false + }, + { + "canonical": true, + "encoding": "0a00000000000000000000000000000000000000000000000000000000000000", + "name": "y = 10, sign 0", + "on_curve": true, + "small_order": false + }, + { + "canonical": false, + "encoding": "f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "name": "y = p + 10, sign 1", + "on_curve": true, + "small_order": false + }, + { + "canonical": true, + "encoding": "0a00000000000000000000000000000000000000000000000000000000000080", + "name": "y = 10, sign 1", + "on_curve": true, + "small_order": false + }, + { + "canonical": false, + "encoding": "f8ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f", + "name": "y = p + 11, sign 0", + "on_curve": false, + "small_order": false + }, + { + "canonical": true, + "encoding": "0b00000000000000000000000000000000000000000000000000000000000000", + "name": "y = 11, sign 0", + "on_curve": false, + "small_order": false + }, + { + "canonical": false, + "encoding": "f8ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "name": "y = p + 11, sign 1", + "on_curve": false, + "small_order": false + }, + { + "canonical": true, + "encoding": "0b00000000000000000000000000000000000000000000000000000000000080", + "name": "y = 11, sign 1", + "on_curve": false, + "small_order": false + }, + { + "canonical": false, + "encoding": "f9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f", + "name": "y = p + 12, sign 0", + "on_curve": false, + "small_order": false + }, + { + "canonical": true, + "encoding": "0c00000000000000000000000000000000000000000000000000000000000000", + "name": "y = 12, sign 0", + "on_curve": false, + "small_order": false + }, + { + "canonical": false, + "encoding": "f9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "name": "y = p + 12, sign 1", + "on_curve": false, + "small_order": false + }, + { + "canonical": true, + "encoding": "0c00000000000000000000000000000000000000000000000000000000000080", + "name": "y = 12, sign 1", + "on_curve": false, + "small_order": false + }, + { + "canonical": false, + "encoding": "faffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f", + "name": "y = p + 13, sign 0", + "on_curve": false, + "small_order": false + }, + { + "canonical": true, + "encoding": "0d00000000000000000000000000000000000000000000000000000000000000", + "name": "y = 13, sign 0", + "on_curve": false, + "small_order": false + }, + { + "canonical": false, + "encoding": "faffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "name": "y = p + 13, sign 1", + "on_curve": false, + "small_order": false + }, + { + "canonical": true, + "encoding": "0d00000000000000000000000000000000000000000000000000000000000080", + "name": "y = 13, sign 1", + "on_curve": false, + "small_order": false + }, + { + "canonical": false, + "encoding": "fbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f", + "name": "y = p + 14, sign 0", + "on_curve": true, + "small_order": false + }, + { + "canonical": true, + "encoding": "0e00000000000000000000000000000000000000000000000000000000000000", + "name": "y = 14, sign 0", + "on_curve": true, + "small_order": false + }, + { + "canonical": false, + "encoding": "fbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "name": "y = p + 14, sign 1", + "on_curve": true, + "small_order": false + }, + { + "canonical": true, + "encoding": "0e00000000000000000000000000000000000000000000000000000000000080", + "name": "y = 14, sign 1", + "on_curve": true, + "small_order": false + }, + { + "canonical": false, + "encoding": "fcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f", + "name": "y = p + 15, sign 0", + "on_curve": true, + "small_order": false + }, + { + "canonical": true, + "encoding": "0f00000000000000000000000000000000000000000000000000000000000000", + "name": "y = 15, sign 0", + "on_curve": true, + "small_order": false + }, + { + "canonical": false, + "encoding": "fcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "name": "y = p + 15, sign 1", + "on_curve": true, + "small_order": false + }, + { + "canonical": true, + "encoding": "0f00000000000000000000000000000000000000000000000000000000000080", + "name": "y = 15, sign 1", + "on_curve": true, + "small_order": false + }, + { + "canonical": false, + "encoding": "fdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f", + "name": "y = p + 16, sign 0", + "on_curve": true, + "small_order": false + }, + { + "canonical": true, + "encoding": "1000000000000000000000000000000000000000000000000000000000000000", + "name": "y = 16, sign 0", + "on_curve": true, + "small_order": false + }, + { + "canonical": false, + "encoding": "fdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "name": "y = p + 16, sign 1", + "on_curve": true, + "small_order": false + }, + { + "canonical": true, + "encoding": "1000000000000000000000000000000000000000000000000000000000000080", + "name": "y = 16, sign 1", + "on_curve": true, + "small_order": false + }, + { + "canonical": false, + "encoding": "feffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f", + "name": "y = p + 17, sign 0", + "on_curve": false, + "small_order": false + }, + { + "canonical": true, + "encoding": "1100000000000000000000000000000000000000000000000000000000000000", + "name": "y = 17, sign 0", + "on_curve": false, + "small_order": false + }, + { + "canonical": false, + "encoding": "feffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "name": "y = p + 17, sign 1", + "on_curve": false, + "small_order": false + }, + { + "canonical": true, + "encoding": "1100000000000000000000000000000000000000000000000000000000000080", + "name": "y = 17, sign 1", + "on_curve": false, + "small_order": false + }, + { + "canonical": false, + "encoding": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f", + "name": "y = p + 18, sign 0", + "on_curve": true, + "small_order": false + }, + { + "canonical": true, + "encoding": "1200000000000000000000000000000000000000000000000000000000000000", + "name": "y = 18, sign 0", + "on_curve": true, + "small_order": false + }, + { + "canonical": false, + "encoding": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "name": "y = p + 18, sign 1", + "on_curve": true, + "small_order": false + }, + { + "canonical": true, + "encoding": "1200000000000000000000000000000000000000000000000000000000000080", + "name": "y = 18, sign 1", + "on_curve": true, + "small_order": false + }, + { + "canonical": true, + "encoding": "0000000000000000000000000000000000000000000000000000000000000080", + "name": "y = p + 19, sign 0", + "on_curve": true, + "small_order": true + }, + { + "canonical": true, + "encoding": "1300000000000000000000000000000000000000000000000000000000000000", + "name": "y = 19, sign 0", + "on_curve": true, + "small_order": false + }, + { + "canonical": true, + "encoding": "0000000000000000000000000000000000000000000000000000000000000080", + "name": "y = p + 19, sign 1", + "on_curve": true, + "small_order": true + }, + { + "canonical": true, + "encoding": "1300000000000000000000000000000000000000000000000000000000000080", + "name": "y = 19, sign 1", + "on_curve": true, + "small_order": false + }, + { + "canonical": true, + "encoding": "ecffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f", + "name": "y = p - 1, sign 0", + "on_curve": true, + "small_order": true + }, + { + "canonical": false, + "encoding": "ecffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "name": "y = p - 1, sign 1", + "on_curve": true, + "small_order": false + }, + { + "canonical": true, + "encoding": "0000000000000000000000000000000000000000000000000000000000000000", + "name": "small order 0", + "on_curve": true, + "small_order": true + }, + { + "canonical": true, + "encoding": "0000000000000000000000000000000000000000000000000000000000000080", + "name": "small order 0, sign flipped", + "on_curve": true, + "small_order": true + }, + { + "canonical": true, + "encoding": "0000000000000000000000000000000000000000000000000000000000000080", + "name": "small order 1", + "on_curve": true, + "small_order": true + }, + { + "canonical": true, + "encoding": "0000000000000000000000000000000000000000000000000000000000000000", + "name": "small order 1, sign flipped", + "on_curve": true, + "small_order": true + }, + { + "canonical": true, + "encoding": "0100000000000000000000000000000000000000000000000000000000000000", + "name": "small order 2", + "on_curve": true, + "small_order": true + }, + { + "canonical": false, + "encoding": "0100000000000000000000000000000000000000000000000000000000000080", + "name": "small order 2, sign flipped", + "on_curve": true, + "small_order": false + }, + { + "canonical": true, + "encoding": "26e8958fc2b227b045c3f489f2ef98f0d5dfac05d3c63339b13802886d53fc05", + "name": "small order 3", + "on_curve": true, + "small_order": true + }, + { + "canonical": true, + "encoding": "26e8958fc2b227b045c3f489f2ef98f0d5dfac05d3c63339b13802886d53fc85", + "name": "small order 3, sign flipped", + "on_curve": true, + "small_order": true + }, + { + "canonical": true, + "encoding": "26e8958fc2b227b045c3f489f2ef98f0d5dfac05d3c63339b13802886d53fc85", + "name": "small order 4", + "on_curve": true, + "small_order": true + }, + { + "canonical": true, + "encoding": "26e8958fc2b227b045c3f489f2ef98f0d5dfac05d3c63339b13802886d53fc05", + "name": "small order 4, sign flipped", + "on_curve": true, + "small_order": true + }, + { + "canonical": true, + "encoding": "c7176a703d4dd84fba3c0b760d10670f2a2053fa2c39ccc64ec7fd7792ac037a", + "name": "small order 5", + "on_curve": true, + "small_order": true + }, + { + "canonical": true, + "encoding": "c7176a703d4dd84fba3c0b760d10670f2a2053fa2c39ccc64ec7fd7792ac03fa", + "name": "small order 5, sign flipped", + "on_curve": true, + "small_order": true + }, + { + "canonical": true, + "encoding": "c7176a703d4dd84fba3c0b760d10670f2a2053fa2c39ccc64ec7fd7792ac03fa", + "name": "small order 6", + "on_curve": true, + "small_order": true + }, + { + "canonical": true, + "encoding": "c7176a703d4dd84fba3c0b760d10670f2a2053fa2c39ccc64ec7fd7792ac037a", + "name": "small order 6, sign flipped", + "on_curve": true, + "small_order": true + }, + { + "canonical": true, + "encoding": "ecffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f", + "name": "small order 7", + "on_curve": true, + "small_order": true + }, + { + "canonical": false, + "encoding": "ecffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "name": "small order 7, sign flipped", + "on_curve": true, + "small_order": false + }, + { + "canonical": true, + "encoding": "cbf41157dce4f224e7b1c39ec12ae03f3c65ad79c057109fce9233a204e5ce72", + "name": "random 0", + "on_curve": false, + "small_order": false + }, + { + "canonical": true, + "encoding": "aacfebffae8f8ff17cdc9d66d7da507149439443bee3be9a4759dd457cd17149", + "name": "random 1", + "on_curve": true, + "small_order": false + }, + { + "canonical": true, + "encoding": "9767bb60eb0487dc27c4812462857c5e97d2f29060f2339f6db6c16d3d9545f3", + "name": "random 2", + "on_curve": true, + "small_order": false + }, + { + "canonical": true, + "encoding": "2299fbc61bc67349c1e28ab567e21042e5f4c70f74a57a4be884558a0d638a3b", + "name": "random 3", + "on_curve": true, + "small_order": false + }, + { + "canonical": true, + "encoding": "4c524d794c782e64eb02aa546a1db86253ea07d49905842713007450ebaddf54", + "name": "random 4", + "on_curve": false, + "small_order": false + }, + { + "canonical": true, + "encoding": "a4b3e5b3c9ac302e6cac23af3319369b637fdafd66da9aba5c0e4ba118170475", + "name": "random 5", + "on_curve": true, + "small_order": false + }, + { + "canonical": true, + "encoding": "96acf42a9fba92ce585c111f0a5cf25dfa20e96e2c2b4589bd305ecb6248d619", + "name": "random 6", + "on_curve": true, + "small_order": false + }, + { + "canonical": true, + "encoding": "1640bd405f7aabe9e873726842abaf22f584f9ce85833f4eb1493f714a5ed528", + "name": "random 7", + "on_curve": false, + "small_order": false + }, + { + "canonical": true, + "encoding": "5dd5ed84043881393d565e621bee681198d5c1dcea7298b663aee2c55e362d91", + "name": "random 8", + "on_curve": false, + "small_order": false + }, + { + "canonical": true, + "encoding": "6149e22c875a3b5bced6f786a1d3cd00caa9f541a3981e946b7f2ba572744c42", + "name": "random 9", + "on_curve": false, + "small_order": false + }, + { + "canonical": true, + "encoding": "a9e37903815ad788999cb6efd255068b57e308f92203ffd52f8b22ea059e673a", + "name": "random 10", + "on_curve": false, + "small_order": false + }, + { + "canonical": true, + "encoding": "d1438f21a7b2840292a8e4252993e928b750245eb453378b0470384413e44efe", + "name": "random 11", + "on_curve": false, + "small_order": false + }, + { + "canonical": true, + "encoding": "2cb8b1856b7d347e7067343b873cc4df260700e2af01fec598d94d328f20888c", + "name": "random 12", + "on_curve": false, + "small_order": false + }, + { + "canonical": true, + "encoding": "3da1aab2b6de4ed54448bda08c4d1ca1fb3b5807c669bcb4dac6e2d2d58c08a6", + "name": "random 13", + "on_curve": false, + "small_order": false + }, + { + "canonical": true, + "encoding": "17cf2c9b619501b8711f370c4de84c1b30f79a48d83941534a3c4a0457db2b81", + "name": "random 14", + "on_curve": true, + "small_order": false + }, + { + "canonical": true, + "encoding": "b4a39858022dd7438994cd1ef4fbc6fa36fb7ba63c9d162be2b12f49ee3ca853", + "name": "random 15", + "on_curve": false, + "small_order": false + }, + { + "canonical": true, + "encoding": "d5fb620c065490e5fb6bfddc4374ff2f558b1a03e6df1d97cfb05b1dfeddbf89", + "name": "random 16", + "on_curve": false, + "small_order": false + }, + { + "canonical": true, + "encoding": "877f0cac6f31fc3977f8f9eda9b8b5c0fdc19e4a2c8b5f015f4661a3eabd5c0d", + "name": "random 17", + "on_curve": false, + "small_order": false + }, + { + "canonical": true, + "encoding": "e082e1a02a409b8222f103ec2ea4014d842ad8f78990233bbd053fdfeac14e43", + "name": "random 18", + "on_curve": true, + "small_order": false + }, + { + "canonical": true, + "encoding": "78422a9e3fb2e175d331857331cfdb6b57711114be465d3e2633c199fbe7f66e", + "name": "random 19", + "on_curve": true, + "small_order": false + }, + { + "canonical": true, + "encoding": "39ca87ba7e1b0eb74e1536ada37e9cec2079bb06132980bb3194c2fa024ad494", + "name": "random 20", + "on_curve": false, + "small_order": false + }, + { + "canonical": true, + "encoding": "68fb79aa349395cd63c0b6011290ff491cad4affc4e56557075ba1bd5af707ec", + "name": "random 21", + "on_curve": true, + "small_order": false + }, + { + "canonical": true, + "encoding": "b852d5999455fea2f2e6ee315c0371dc7b9aa222a51f4db6979023b46aea7326", + "name": "random 22", + "on_curve": false, + "small_order": false + }, + { + "canonical": true, + "encoding": "9b5846d9f7fbdc780e736193f80f98bbd65726ddff434c83100171f800c15e5d", + "name": "random 23", + "on_curve": false, + "small_order": false + }, + { + "canonical": true, + "encoding": "6e9a1744b47b95f65ab8255d71d05c6a9c8a3b21026883c2ef78da5363dfe4bc", + "name": "a public key", + "on_curve": true, + "small_order": false + } + ], + "generator": "tool/gen_primitive_vectors.go", + "hkdf_sha256": [ + { + "ikm": "0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b", + "info": "f0f1f2f3f4f5f6f7f8f9", + "length": 42, + "name": "RFC 5869 A.1", + "okm": "3cb25f25faacd57a90434f64d0362f2a2d2d0a90cf1a5a4c5db02d56ecc4c5bf34007208d5b887185865", + "salt": "000102030405060708090a0b0c" + }, + { + "ikm": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f", + "info": "b0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff", + "length": 82, + "name": "RFC 5869 A.2", + "okm": "b11e398dc80327a1c8e7f78c596a49344f012eda2d4efad8a050cc4c19afa97c59045a99cac7827271cb41c65e590e09da3275600c2f09b8367793a9aca3db71cc30c58179ec3e87c14c01d5c1f3434f1d87", + "salt": "606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeaf" + }, + { + "ikm": "0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b", + "info": "", + "length": 42, + "name": "RFC 5869 A.3", + "okm": "8da4e775a563c18f715f802a063c5a31b8a11f5c5ee1879ec3454e5f3c738d2d9d201395faa4b61a96c8", + "salt": "" + }, + { + "ikm": "dee12d58e1d45943b6c13b50b00d1772", + "info": "686561646572", + "length": 32, + "name": "nil salt, age header label", + "okm": "2baf1be47442b0fcbc61eba5d78cb5fd43a061a6f01bc3c3f50d8d89410aece8", + "salt": null + }, + { + "ikm": "951a5f85df65993583145bc201b1829c", + "info": "7061796c6f6164", + "length": 32, + "name": "age payload label", + "okm": "18527becd0900001a7e14280de72932d6a4a5267e7272a108f877f2c65080af0", + "salt": "e37888641ccfa586ab39058a5b29aebf" + }, + { + "ikm": "c9494b4c4443c1eb2a8f3f928b3abe627401703d8b1db1632a43b14aabd30046", + "info": "2fbc07063b80727e89d1", + "length": 8160, + "name": "255 blocks", + "okm": "6ea09dccaba0f8c90b8394df445d17b72bec135a2c7fb46154d0e2912709c92c2201fa52db2f9ff6a07f04e8f87df601a77d996b1191c2f99face8203250c30fb9a98c9b41e651cf14b2e655e4805b095c5184f4ba57d830d2af5a8972a48c1a7e938cacd7d790243237b5f6db1ee6de8b620a32ddc4c66eb5a987f4a34a36530b9983810ecd4bb5144308e4db3b11a4c774fdb35ccee40369cd33a7c35839b81d4db518d0b1348644d29a70a02b4ced4ffdcf16b810cfba51918d574fd2ba7828dad0b3a159ba3719d832e7a28fd27f574d8ad97e81d1f36dda2e092bacd576cb4b2665304566d4e774515fbba4b93e0f617dbc1f631d0f7da837e06e15f1bae3cde3d5f138a1fdafcfc4a8ec9b36731ddf91e7518f698e8b4388111d74bdbf0f2c45a4cedeef785876a2034f893660f3d083039132051941df4802d48dbbd245a3a168c771acae7876527ccfd8741adf3c27669fbbc9d03438e7c544985fefa1e933e82f68b8ff1fd4aba5c95bf3e74838382a237f97407f17c279c0b3fceef695967c07ed2852484b8effc85b662760de7c6954bb1decb7a13c90c7828503f88d72457dc481b7ce0541597d6c30dee54b31269eac99f61f757d007173173d986f0e5e1109ea5d7274b9af43c95706bc8bfcec439380555d31652edd599e78952464c9f3ead869dd9ba01235154ec2334d9b8104cbd7522bd9487107c2eafe31c7d1b630d3580fd136a0e4aa9a38b1a90e52d2e89004320b0e30ef6581b35db042b55ae488b02dd3bd22dac1181716ad615be44eb82a1b60e70c01366b9ecbe16e5878bae658fc201d330e695f1ed749990e68f70a2623686ab41bca47c62941a7d968b2f8c17e744d8a4164f9f601984fa2f3f3f1c2fbac1b90991d87d4ebdccda62623dbfad9002cee129bef4ea7caad44368fa6c86aa870ca9e9256c5c74c5aa14cf532bb000d8af10d3d3cb800921b2ac267569c6c7051ce49a0f030b11e83fc540cee9da340662014d86514b0df8349559aa05f3b54f702bd21c887dd89f47d13f6ae3fa5e7288e6ea3d4fd6110ebd4688b732e890d2e6d768ecc4c6b7a2315c5dc25c283bbf7aa6e290058fe33c5e133bb2f2bf8ed7f088a90b160d6353a82a347773f3ba847e5b60f53f420ccfaefa5c5918756bb7c78b2d9dac0aa72469de3da36d204c856261339a56d128f51171434cda656395b5cf4762f8c0b179026de86abeef31239e4d16e870062a889c7ffea6a3d8bb9a4f0458e05b4d35455f5bbee3976bf36bdbd581f3742b32c2a646abe9b03fc8df01796836b59b720a8336754fb0b77f6708bf037d5cbcee16d0a9d11b7e60e3b7ffd042c29041ca504b42a77353fcb79e3faa0c5a6b11f525e7d192390ff66cb67a83520c03137028c2860f16844caea789152a07637eee6ee047368b19c6548dc2907fb52364aa5c65872652b33685e3802808e68d34fd737bf870580bb55470486b1e2a30d385f93dd50426616c2057bd9dabe22d643acb62558b1aad5691f0834ec69ee74ba8dfd0d1ecbfa113bf1521afe68d45a4ebf12e50d1b6c967f4a917de32deffb3e49d89155f3f954e498685272cb988e1a2aa7cebaed351d528bfe3b24a0f8dcb2531ea890d8de2d328ccff7cd8c200833ffe421a840e014cb21c26d3f14702abd714e3672834c79473ef362f9b2ab9c17e6673e47fe7015cc2a0e216959a69bbe976cb13afb4b71e9eccc4c3e6e8564f31d54363db5bfa258b4f224933cdd4dfde684cfbc5ce0ac542202f8fe4dea030a03067848d8015d5499fec79a63e21c5b5e1512b9155be1cfc6445042511f2618213f1f6362168ce38c24fb3d8acaaf09d793353455f28eb48b5482cc2a8732457e0acd088e36f7eea5cb275adb7d15c6815ff19a5b0c072c7c5baef2dd52fe9dd52cfdcf0e63f01fab75611746795112fc598460a9071b57acea3bbe06e3e67eb9d022f64344e8c59b0034cff055473638eb9a984ab55e0eb2d58d9ec7f772d0c70e0dab3886ab93cb1cbc104518ee6572b550c38c132a65bf3c74d0300f666f730c6345958edc6fcf2972319fcf0f27bcbec035ebdf86d3e0f2f0937c2fdf43ee9b1561e094737df8a7d3d14d7749e12db3d570aef781ad7ee4154383f309796193d3b4f8707e6dee3dabcbf954983911e5cc73c6ee2f53e13c5983689fdc6a7001216c896ee42f1b66d28425683cccc5d49d4ff4c7c259d2f40611dd9664b3685ea9e77f3fa7d3d364997135a5bcd05d31ddbf8e474bedf32ea5abd02eb04217476bf989e1c130ebe1a96a8d5276c24498f3782a771a17156b8eaf0428e9e54e4641e709bae794fff57568a734647bd9c5b6be289c147000550f4d50e0be0c56dd14467f92b32de863bbb9788111f443dd9123520085689b9bd906bb88d7a1293ff61765dd86725c27615dd44eb08231b83e85623adece12aae909b4f10e50e34025ea9699dc5326742f5d563df9033ba7ed4fd871069c714e5028fdbf8a985458b0a1a41cdd9725fa72a0d6c1fdd067df893b540a4fdb4bd7c0140f1db3fa1f05b1f57968409a002c50b45964b2933df89814123d8dfde0de991912499b74e2017b13fe5626871f0750966121215741c065365ec599663db0942275cb461d52831627b1e3fe841459aaee236c6de42dd292646f415a5c1da26bf21b655d238bd8e8631208ccf763f7fdf7c4fb36739915b2ea9d1a02fb5c014c46a1af3ce32f5e1a31d512dc2061054a2cb490691d20e068dbc6d1517eaf23fc6dc84156ac7620b37d6da5e1c150feeb9b3380f9c5947643b15bb1850f40abe88e34108f849f953efa2d876e3676d41fc0d9492313b30ca29f5705288bfead7da60f93b8cfd68ebd2ae1d3e457f49a4dadfaaf48f88781f2f45d79fa49909694a3cd145d29ad976a79af9be66f2821a48894d68910a7128500f9d6dd19c78b025ad9d5783c793368785b120a86a319a031829cc1beca2e9e8b0c9d50545aa86c593b3dd6e9550c2b74b6f528d0db704884b069fc665e0dcd48224e7bc43662d5548c4ab9248d695196e5d96da958c8fdcd1f21329c0f7203d400952a15096becf2ab46cb6396ca74a5b6b337960e648af088e7b7d29904f6a9e6d0d616d842a60ed3d9c5058305293cdfb7e23185cef6d9be0fe2f3a58941104fdedad372567322ae9696b317a65beea2ba74c7b5908c5390395c4086ea71b338fd7c9fe6ea435356898314d29222aacaf2626d3347c5db5b77a5acd6f9199c7fb5d23c4393a0d28b05b3e751ff13b01542847ce96cc2222e2d403acdb839686891a38c3f4d5c2cae541943dc8fb6f8a325d639b49edadbc76188ea95194495043880dd3df65f5ed8a308432e0d8c519265489d55909f8ad102c9c0049a06cf1980fe2756137648e859080e4c4e2954aec82710cefb66786793e09d483324087ead031a90a2869208dfcf62b9426f69fa9e777b535bbac1b0a427568d45019d4ed36d910e5b5c1cedc853dc9884cac9a3bdd9607f9a90528d33b82b2921b3c67f26fc4b315ffca76a0fbc949e6c705b7d2ac7513ded08f4d8bd64a51c8f5f21118e186eee87ed4c7350a117f3972f85dfee086d7e50d9dc968858edf3f8c80362590671d1ed00efd7c6a6dcf4b0a0b8ba71c57a0e4f75ca0439b0bd6c9aca51b1f7332d3e79c2ab557a929342740ae167bb0d2b236d3327a299f0cbdb9da94e9b27abb192db6f22fc746a5b81d59b6b682f3d4e97c54759cec8c73886ad36cdb0e0c34de5e20b7ed9b1a89361ff4495bf178274ed55ed9439d98b9a1150924854283d8e66e05547b70c54ced1f4f5f831835bc0f5e15c07cc08558cfe581931e54828850b367719497045af4a38ccb95bab6bce40abeee187670609d13ae00a8d3dae206b9dbe7759ae3bdba254d77ace2dcf1e746e0a771eefcbd6c404592da92245e3f53d0c230796115c15b3f1e1ab7af6adbe8b8656c98e40e14c146f12dded8172db478df5cf48eaaac14aa5c1e60853b7adb77e71007317eadb7522a0f9a1ee84176375838ad5cb5e1a9e52ee5213c02b631098c26c20a3dd13e0d6b6212e91fccb492a2739af22497376ad8c236ee23e77f6886b4c7428d81ba2d56eb045b7149eab954e1c73c2025266d0b7f51f8a84e801e71bb3ab768687337788ced49c79427330e2e8b5999cd6a95321c87bd085e2f889882039942ae564b8e0d22e5131cdc5668e1e2dbcca0431a30d4d85a1225ae87d6d3bc46f7aacb315e011102dd14626d46628a8fb39f974012a911dd42878068d53256fccddb8f9a61419da0678b71d829a1b40cae7b04faa1d1da43ae3781586aba6121224adfb0065a4201709030cf32ea6ae52c94a58ad89f091b4f704c922f85b900d8c262b0bf7d226626f2502df54e88c36b74615c690a086869da52706537c58d3fe6d5e942568394969911bdc71d732952f2d62393c2f71e6f2f2de07a436d592700efb76995b734ea43fd59929fdbda10190eb98a4f5657624efc96da207195b63356192526d7c8fe7fe0a1b3018d0d7db49bfcc7dd26932b57e3f0cd7d39aeaa5de927ecf60adbf69c9bcd9be447568a35371820f0111624dbacfa25dfb34bb7db42e4908701e334d2909d3b20915e73c4ae5e6bee60a627b16c1cacde3ba484480b870dc3b0c03e0e571cfdfd8c112b42d8c136f2ccea02c0e3bf47d134c0a8ea43e21ad5b8d41d2ac75ce513af7104972e2fd45852e7302a22b9949e570dd0b65eb9a093c947a4bf4e9884ad97c6585cbf8ead4a24d35787cb79d7f4fe99a83da2b0bd3c74af89a66754d38d541adce2411cd990a022d1cd629911493ef6283f474f62f3a62c7a543548b063e9cce0e044cafc38baf3b9dce95bee1eca20a934847e512430084b7e8f5b3fc2a6c2e5a1f54cb4db2535b03db372bcc8a56061b137a93bb02323467ef715de7b848bfdcb25526b493c844c86972b1da5c83e4b30cf84857e8cce79aae69f219324219f83de05bd7b5bed258b005cdfca9296d9f9ae356c0bb44e29a343474e928e9e9415238a7e5d6d2c9826ddff5802eddf4dac75ba21c8ecbb6f4240c5213aad9a367b2cb8ec6fa24a1701f3e709510780e1a372df0d5314cb378d844340382ca5d6f79ad410b0e4b8753bc5b0a9db003fecb8a2bb1e0aca6701e051e78c95fd026f6dae70ff3818db105deaa15a354d3112b729c6791cb2259928b8fb38d380f561215854aa39f5a2358c7108d6db8c4bde42a099709608a6ceafb51a6fc97477eea7c75db056a94cd3e98b5979199545bcf954bca5e483d4b46a66b42f3f5c1dabb36755e7c7bd1d3fa0bd457cc436ef977205eb21cf6f799dfa4c729994440fc9b5c5c783d5082bec6072a9d803e503495c949f70906c528998a3c9d5d5da7bf7e78adb9b709673eb5fe8fda344c3ae06c48dd83581413d6618280968f8e004dfd5b8f3bdbafffa15db7599d8faab80d9b7d41ddd5d9bbf8025f9bb64515f1eb8157b61971de7026f2451dc668f300b40d73d95cc52df83b86eae6f3e1cc63781b70f63d8183b624311365f53257d988b1a78aa1d91069d6a3015e8606eba9d7aa06c7a71b1ddec68c88aff2310ca8e74b0f8e8d67559ef7511058be5a853ff3851bbbf0ca996d61d5151c2c31d525b311a848e002046bec4493a7eb7d3974d56bff2cbe07d755e5a9ea9866efe2af23c3806ccca5b59b87ffc410298fd2f815b5a1b31544f45a1633117eb367e0e6d32272f55ab081ee0f34b0de73f60e963e8d0be86b5bd7f8e99695cf78574108aa9fb04174d99e756c35ca21dae7b0d6a604794f909484abf3f58e50846245e4a253ef7072ff67030b3ea687f20299c40381936ce30970e852b04873365b0f01a59a39af4f2d2eaacd001c79fe55c5edb2a2ffaa0336bce2e20086575e1907a43649d445ad214d71a6772ab70996153a2a45a876020728b1abcc4a81a9bfa06461bf39ff82274a1dfd3fff82c44a97385de8db443ffdca11184a59602b775bd3815275eac2e2eef31d6d69aa6ba8dbce1ddbcbfbd95083d5e731bdb60c6ba47a0b010ad6475e5972cd5f201e7e43c1acbe478c759e145f9aa2c32c46660456459bfd2749ad4fc963345070a2449cb2e4313d519047879055f8f3cc499063beb402563fedfb655949aea39da7778666cc67f2efec2e6cb8dfd71104d4eef78eae8c45ab6edae88aec7150deca20ae6847791f89962d7b012b5b58cd4ce3c6e5a17b7da96826c6b0af1fb24f6a37583dbcc5c4813a8141d372470f27fc23599e58f54e679467d6c0f9dfe672567f0babba04eaeaafc52d1bd1c2418e690b366525a594380ae5b38f944a56133ecfcc12befad876583823eeb7be04fb82e514ec5d82190969b2aee84a317f8bae89cba43958e2f28e5f75f152a4f54fdef415b80716da9d5cf2a5445bb5603806af029519fa8816e9450b469c163108b82002b1b24f01931f274afab99dd09ef3dc653a902969351cb0a10dcf93c60db532ca7cc37507f0f20af0cd2fc5d929942f37e8cbec69859c8462e13eeec5de8f0221f697bd9cefd55383c3f8fe0c8dda6faf58c9c65deea7ff0d1db52145df91c295e310fb7ea034fef3d40afa9e65719c4127b53733865a213f584e643e14e488e516fa967524f36d2126562944d5b1d932ce64fb0a14417226861f6d18f6eaceb345da7edae363720c461c38dfa8d204a793f9de22e91ace29e91a919b958bc2faefd5175c906918b3cb75e433ec488098d17da9d650db68fcf37b4fffb2f6f1a67edbe390732fab40bcfbe7d57867b01d4821f2c3d56b398d3878872dfeed122c7ff1a6a502371ef6ce34040a94a9714120a91c0613bfa1e8f7158cfc0928ef0f9fef680e735f0a5996d47f23f222244653bc6cb44cfbf71144fb128db7afd6d3493ac2dc34426fcb352dfeafffdc9ff652d5506942b6c4bb3307e7e1eb50378cf85650a8ebd6467ff53c56380da38b25fcd783e4e75c403344fa7bf03aadac7cd8c7efb26b7a7b3c732633755416f3da14c2ffb55f05f2205b716cc0fe2dbe59d50d2a3fdd43af415cc50fc7ee22bb016b3b14e053bd2df3a51c0fbf239c7f1d5169cbe351e8870913dc61d63dd16fac2b9f891dd935018bd9f86f126be3f3feb3f326481f81ed0a746fff41da3fe43aad3b27efae6ffafb28e262e5052f379090fd4180420d95b608e56536d9fa9cb67ae8af0019a0e67b848c78b7dbecc0b318d4b059a3031757f992fcd3c4cb0b214bd937e88867da8731a72092a087a81ddb061f45ab47688e42cc989063ad985a7ae55189eaf5065dce85d8c9d7823e01ea4fbb825266c4071d2e85645f10c4b6118bf2638726d729ade5ad205b3b5c8f1b1760f44f97f3a7063c39891f475e6166719b442c1af418f1ce8a723b05822a52c3757172bab435f19c8b068833e4476428d7a49077c40fdcbe07aa4b0a2b15bd74acacf872a0255a15a3b75fa4050a89c84c4416fe0b74a9a499f49c99bdef7d638588e6c4c7269d7716950f6948a5269cfab510ad6612b02b3a638e6387b3950fac06c72d941cd63ae7e3b7212fd7b3734c915f9630ff6f47958c713c2a188313b25f76def1a2a9073aa867a479b9cc63e45891f04357812f295a753c01c154ee8e12d0e1403f1a6baf878c3e289ff173bd2ed70706958e598ae1fede6d25bd714a9a78f9bbb1123ac304903269c2ec06164997663655973aaef4aeddab0dad4f16dd386824eb69dd42dbc749e72065d93b34bb388ad63353f94c847ea38844f5cd11e19b93271ca722917bd0a3fa415bcb6e11279a1a28f2f75a05f24a3ce811a386b37830297e75edf34e57eda39127d8fdfae97b67332691b9123405cd4dce3f74d85f870d40e6af9b7c20a5dfd075156649a036cb075287789d644ed061ac7cc607328cf9012dcc7ed6c202f5887828f1b5332baacf223fba3bc7ae0e39d0182d8f018c221aa0506c2f73cf37d04c74d231986236445e5c68b9f12c8f833479a7d9b8f32a945fb921bc070fb4ca93736403c06fda22b50352baf67f34b8406fb57dd185e2d5a74d33540ee984a909c044b66da56ced4252ebf32ee38bdb702089b5cb7b9dee69bb9184469d3844e1819bf1705812b1aa6f4667652a3bd7ce8df1a79c6f0801c188f0ad3543ed52e8d7d2c64510cfdfac1ef581bdaeee8e185146737511bbd50b233e8fe3aa263df05a01246b7617ff190d5b8734766855d96a3a4166699e44653eb7f35078da6796728aa71622d30c4395851bf4a0c8926b398072731d69d3d9d9fc63ec9c660ae04af441fb79667616cb0dcef97aecf01957663309806d48bb78f047a52f528e39409c75a921b36c89c73c9a0b7f5f0f3ff4e1378ed998ec17400916c792824d46ec77ccce4bacb2b29da2354f6c5471af704a28dc40c8a9e0074f73592ec6f7defbfabe409b4a19f4e0b8a28162e9448e10982c03b05ea1410433cfee84661672f616962fb45cb851c867aa6a3f96d69e000e0f9aa9d58255f4c14b65e934f18f004767ecb588cd34d3caa4778529dc0ee13cdc39851e55133ffbad2104228ac9817e28e06ce47f231bd2d73ce2eb6105a820c241ce3310e62e7fa69a71f75b766f80b0c377b2a9c1b911d1e3b76f1a2b9f4f10a81385d52f5abd44d3991afc1a6722a42adcfc6fe207116f291d2a5c05e046e09c095e660aa6734ed0b2a14920b2449df7ab3d946d9396d9a5bf7d61a7452ce69964bd0b7a1709e9452f228896c77d85d0feb8fc28f3bb4ca73d71a227a4b7e7c76f5a9fcf49a4821a7defba3fb6c6360fe6619473110152afe23c113f35d65dd707099f6eec7b6732bb046a73c96e41d618fbb68ac7fb360481d92f4cd3f0d61a163590c4d23fb91d1429b3a7f57edf099fbfc7fadf2b217a766de931a349bccaa19b121cf04ccf567267667dbe4ae69601f7cda7433ae9040196895822af002632c20b0fa5020f29d30c33b0f3af051ebc60966ace8006434719f6d31de6357d820499ed53cea0b1999ec85ae9579bc10015933bebbe2972ea168ee9a01b6cccba036075e966a6c5b88410f316df60db44a50162fd58bf2dbee91ab818411539c2d4b5e1d35860e95eb7828c38ca88017893a286543758d5df3b73fc102a7096edac5411f751dc3611a43bbb3cd1f6f7d98d855eb294597b8b2d54622c6296bee487c58f42722d161093171f47d5ac79561459fbf24888c98e357ae2d3fe8e91b65d39230c15ffae4e097bdda3884f8ed592e5d49ab278cfbd07d4817212ec0310600ca28e1b999bb1daf67da2d055652a781341dbdba9cc926ea66034694cc2268a8226fa39a1242e43b6aea5a8305281275e1e79fd907deda9b655847ff40aefcfbebdd4d9a148cf56f76c88a04b8ea5044570f77f6f1c669b876cd3caf20f3e4f97af69f976c92020a70e6b1f8729f0f1288ee2b22d8332c730c9e56803df32a99effc8269c3444594bd153edf43dfc702d3f0b2539411e0d727d555e65f2380eb076aebbafb4dbb9e87c30f279f36ed751a06cd5a88d16a2ed16fff43b4ea96efd5234e949528a898621512f5a2c67c1ea06d118eddec9ef1a81c3b294e579404856c4617962e518d599822cfece528f46abe410624e87deeccce7a738987fca45d42e8567a2d1bb49a9bed924b85afce98726a746961e44e9f496e69a831fccb4e857f8110a3b53ed6ddce71c4334826863986b87a8e6c6b4fcf59c252008a48bab2030ef26a7c7bc7f50a527c4b48c81a7226628920d49ba1639bc071c57613ec06cefb874653206d0e3e303785029160469d6dfcea71e878d72cdd411d560aef977d7cd8c33c81e5c432744eb24f5a315d96fa9a96514c4763a755ee4fa4b877dea22483642c1f3a41ac0babf7ce1ba14c52f1aab3bfc8bec02eafa0572e036650db5bac6bc4549313dd86d36fe0d2694f86566869e6be2e73bf22ee23b11b2a7925ff2286903779bd45e4e9ea5fc79cc5a8a045933b0d43f9ab84cb37a4275a24ca2b766d85262f0721d7b8a5103f52fccf447aae028e1734b1e7b17f014d6ef7a041a18584f77fe01dfabe76696989c27ca0757ee62b6d42f77132d860b4aac3c6c82919aaaf6826b1c359542a60012c9e44f9ccbcff988db78e95cb5916681466540ae57c4e4ddf0d2a0bfe2c1cff52022b58fc8e90bdedb6e94916bdc5895cf900c412fef7a2bfe8f272da8903959eb355faf14350a61ce99b2ca4c1a8ebba2b55b82becb45d3d39015ade418be18a8a5939d001b6e71a14ed945f6110da8f98c84aedfd58f2c8070316df7424e48dba639dc23013d5ba476482ba54242822164c79601c52074158ab2a807990c1d47c10a068c11ab14f29eaf87216dfc5e31859ec07f47debfd6ce9ed315249fd022d4d7d75d6eb4871a2c0e68b9347899bfeef11ce41f58e254f4ae6f80e8ebc5d3f17ef245c9aa73c366caceda3c49ab782e5c50e05f1184c3930d5ab686e3a79440e95bf5b3bd38c36bd79037bc103a390e1a4f4930036fdc5daf7858b266f315a59690d504932d9df54f18c02e024f6f0ff67960a659826a1f0e35b92727ad680db705bd20cf5ca86cd5e030723c6695d7c1e1b28d7328b8473c486c9683533fa99a4d516866ab86111ff4769672768139f2843a48bf32473dda0f6482034da13ce5b5e7a371b12ca5743baa69795a6ce0ba4605a06815dff182ab29af2e7cad85be3fb534d66cde1ded614eacfb1d62ee333bbf698bf4e0a5f354e9daf8168ace6aaf56f49b12ee0acde6edab2ed0521006cc7867e4d9db444f148881719f6e279b341b37d4d616fcba5d8c9b9cb789d19caa9f93473b1cc88f04227d588754ef1a88402e2c26e493afddd6c41c2e735263bc2158d7c1792fb82fa86ed647c24efb9d98bad2a47622142935b5ff80758a446d5e6c96035cd03092131e79f6067fcfebce784a5b3eb08fbc2e3dc7d7276b52bd92482c1849624ab4196d003db85cbedfb65c4cb9ef7ba0de7d875e5b5553e64df540949b82152890c7fa0a1d27248877005ee03c5d69d529fb84faf0708d386f8f7ab0c3ff4ce52e72b4ad569cc31b0830f3c49a1e5500fd58a51c470cf7e6acc89bf2bbf3ae0f5a6ed4c4bd7bdaf4cb8ce7e911c46172f8e68a9675d5d9ba0b8045bf09c1f39840498ce5d3cea440df80c8f0876fca93e80f6f1cbdbbef6599a696a864f0f1ded5ffae666df238f0e0ac08f7849773190919924d0a148e1be7df720535bb8d3a8129ae27c77df9d42b9f4c378a7c8019fd876baad22eb28e175e2acde26cd639475c3f63351a57054e14f1969581a5557f88a3e4fe456b34e8a64b768aa5e1952a8014a317013dff3db78fb833c23c81259fd74585bd23597695d0aada9d93258f2ada17c09c548a373570adab3730405d712734a36903d7d36ebc6a94b40a87839268f978c05f291fc44c29aff5e08f34b0bad95e4c21f269a8bdbb1e935ece62e4b8eaef27836726c600f269b55333ad6b97df15727f6bc7e195d7a5da0be626578735f24c1c451db0c61ea13c21", + "salt": "69da88eca2eb3d9ed5e5c76798ac1d414ccba7c132a492c16cd73ee06f8b37a1" + } + ], + "hmac_sha256": [ + { + "key": "", + "mac": "b613679a0814d9ec772f95d778c35fc5ff1697c493715653c6c712144292c5ad", + "message": "" + }, + { + "key": "", + "mac": "2fdd928e298568da7dbd85de38991312979ba04779474b909e32f4f8deefe7ab", + "message": "f0f2cc66567caef59275c16c7f61abff712a1f86c0e363bc6662affd411303bd" + }, + { + "key": "", + "mac": "8e8c5be4d33112713420e2a2ad09fa924def34397724029e3e73b5f81d842eaa", + "message": "fe66c9c83b67c14668d135cf23256bc23b0b91a954c1c4a22db2d9686ac046103d16e619920952823d8cfac54c83ad6d1578b3518cf2f06cc358b342981152abad85031245a18942524d99fc3ccfb0d09add9dca8dd7c7bb58ed02561a1a69d1fc2b66cf" + }, + { + "key": "13", + "mac": "a783088eb43ab9f38d89ca0fe4b503a7f2974707648582d36f4596288363da4a", + "message": "" + }, + { + "key": "cf", + "mac": "1fe42c490c61122610cd95ef3482132ca67c4cadeadf1f60273ef955a39a4b66", + "message": "87cacbae7b60aa1cf2551dd125dc13d2b55c517571f0ca4ed1c63230d437501f" + }, + { + "key": "2b", + "mac": "9f139dbe75ffa78e8406572ccac9c5c84730bb5f2219857405623697c373b789", + "message": "b6895a7f692d4ef61e1fff2550766c268a8f526b5aaf06b8562dd0568d994781cd9815e59e53b2a708d6deb5cf00018502941e74e926eafc666f668bda0528c0022dfff65de1d235fb470561ce586436f3a3ae5eea218bfa1b1ff4af74639e9c5268089c" + }, + { + "key": "ccf83946344c80d8c1f44da5c35c5414c9fb10af", + "mac": "29e5453198ab76d39f13ef371ec7dcae215e8e80e2331c78cb2c4c95875ab9ee", + "message": "" + }, + { + "key": "d53380ef6ae7bcb062aa586797706ca5a5394da0", + "mac": "0f78ef255599ccf02c1959fddd5d6faef484517cd2e50ee233b3a6b255463a11", + "message": "8bfa41824926bc9bb559ca597f308b88341443be46a4bdf4ca0666759f3c4194" + }, + { + "key": "31de96b3dff46d096f2ae29cb17c9f3bf83bc2e6", + "mac": "3cb0dd801ae9218f0a2c3636d3f13ebf068230189a948e5ad184d3ec98b1a6ce", + "message": "3ca2061cf9b10b32da95658d80ac0e5ad493975df999a4d5d1dc9b8cfc2dc583997f2a5ae4e1a7dccd1ddb386cc4577e4ba9597f47f11ec2a4f8015caa3a6cb41e8da528d0f34c01b2bdadc0e0488031d07af8684b5d2cded546997689756e29bf4fd024" + }, + { + "key": "591aaff840629d45570bc9e0ca208c5436e0af8d6a239e05d251e3f068918caa", + "mac": "bac2f9516f6e81a45ba0f49fe6ab61d24942814cb0cdda9595f6625b993d0675", + "message": "" + }, + { + "key": "2656b155eb98168db5976f2284023613fd8859a4492defbc2c705bc0ab64fc92", + "mac": "20b3ed1764b97b77e61c7af20677ee72e1f0ac42a46968a22f79cc05eb06cecf", + "message": "ae11166dacfee8e3095cf3c8156cf44a3dcaae6b1426450672201c9bfa452464" + }, + { + "key": "c0700b00b30cd9b488b961046c6d3ccd052ac7959eed3e87f4ba1f2e9a5f998e", + "mac": "211bb6577575e33e6b92336d1d66b23653092e745b2115110ce8c29edb1d0481", + "message": "3b7a1051ca10f3f7f6bc654924693add2840e23b6a8076f6c70b54dde0c3faeefb18683d41fcd441c8aad51c0e1b0739d4469954dc63fa60d85d955edbe1d2aabb1eb41d3319100aae89eb9fa1d6d459794232ee1f8519c5f60f5987280a5c85b46efbb7" + }, + { + "key": "bc28d2047b5fc6e399445f828100a42c8acee1b9a218f9813ea4dc8522faaf0a57910f7bd38d01caacf31e97f98f80704cb1b07cf4ad68489d1a3cb9c8b190", + "mac": "a1004c38d903d89702e0a43fe53baafab81376c3ddb42e6d92f9c86b7718578d", + "message": "" + }, + { + "key": "3d0002b7cf8d76598b5e6bb5e2eecf12bd7843d36eefc6d459a81d5bc62f4415163af935c73647292d6f241bb4f00037e45684cbce5dae79258d47332036e9", + "mac": "4b61c4a2246c00933ac9ea1a7a18af3dc1a40a1e347c30800fc6ca727c63d85f", + "message": "62ecd0928106e35fb3080d1eac2c77384efedbc617c9e2ae3f28d49ed0001776" + }, + { + "key": "22ae885f006d458192f7347265c9d620a9f55710827ad79fcabd96f178a79d1d04b51ae279cea0ecc8227e41925b9b2f32a3a26dcbb25f169a499014b0e1a7", + "mac": "420ae1c441499fcd319a4f5d4d0d684cc9e7cfee541a6cdb9f78dcc937d4c5bb", + "message": "f1be5bbe97a3d93419c726179611bc75884dca1886d3b40b868bc3e3813e8854ec692ec809928a7ef17dcd4aa1f00c0f3d44810120b00affd6399fe619ee336780c89814e2a2a5f16a5579e80efd17480c04c303a9475478c11e43370d7fe9a0ef3f649c" + }, + { + "key": "b79da64e016871fed0e9119f6528ebc9b0f9960fa8bfd21336d897fef4ca07953f0b379efb1fd3b64c0041a90ef84c9a320de31f6059aa3e6f12cc3573ab6497", + "mac": "b433514f60b17968a1cfe7f6b1a4f63b381a1c945bf78b4503eb5158ce244e48", + "message": "" + }, + { + "key": "3956e6e79a25a35f7effdb7c08c5e35539328a7631d1bf6e48ff84be2af03ba197c49bf2b463c8e913f9b5bf512d61c571ca8fcbf5be973b84891c12948c966c", + "mac": "0b37813739efde560fda3074a6c0bdc305b3ecbfba390d801a2a222e4e85cc9a", + "message": "c9e561dea2ac539fe30fdcb9a9e321c19b867f5f869322c14b7c18adee6615c5" + }, + { + "key": "090b3c1d3ba392c7cbcf7e0a4fe9552c4c9a6ff0afa265e07d58b3c9822511ece1a3ec32cfcd2e8454fa28408fceac8e5f6e4825475ab932c9eeadc09fb004f8", + "mac": "fe88d0cb788154729d81289da8014492e7bccc381796e2cf64eb4756664de63a", + "message": "d82e163cf604ec42e8ac71fe5a836fd508d76805e4baa63067b83671642e4c6760ccced2a517c5bbabbc3edeb6b352d8cb7eb8279e5c5757cef93e443455aa18b00182d9211eef57d5d5e7d4335ecd3028fddcb248a41759c157e026ea7615653f3d52ca" + }, + { + "key": "59f7f2265460d3d33c9313c219816d4716e73dee187d4d1d2d1fb73044107222ffb87f93dd5c259ae43d51dfec698c39de6ca05a1dbb43c5e625ff707e3f5e1877", + "mac": "f1af2b7da739562cbe1c9b79d88b421d85622c44d47b62ac90838215264a053e", + "message": "" + }, + { + "key": "4a9f20e6a83983966adb60221a1666b4a31094d64a7c1772df983517c9ea4b4a43014e6bfb8dc2213022608872323a8f8536add3a509616f5e34d15e81878db0dc", + "mac": "13374292a8359e6491fa5dcc6d9a17deba19f81530ee30a87529a2404a426883", + "message": "cb69f7728814a9535d92dcbb72e24dbccf91fa34d30ec7b5634fc05c7e24e46d" + }, + { + "key": "7bc1c6e442bde5b533db9465e2cc07f0f4e2e011c8a4d4c052563134e3691183d79861eec1adb7269ba582aa5bee6ee355eef33ad443dce959bc5fd0929ecda8e7", + "mac": "14cd8dd5474accd132e2c2587ae5538bc9e120e9fc528e78dbd3ea12e2070334", + "message": "b777b3d21261fb9117107d5f79ecd618b799790492f8788219ddf96796a13518c73288c1a87176f0db085afbddba233f399bb296c51b8099ad7bc79dcc19f9a9c10e9512f6ba1aa81a9b07c8f47df02beeb41f95198c70b4265cda3923f6765837f449f0" + }, + { + "key": "d52dd34360f9a7ee000db12c8e4fbda5ce36ada587af012408cfaf242e0140db24a225c3775c1b35e61fd27a61743f8b268f51165d4feed0754126795ec2d0c9b17d285ed45ae41e55f4b65db6068e305dd43f3509b0c740418d98c831cae5ef2f7438a8bffd7dd5a73dabfc657020725f3b39b0d0e62ab05eb62ea9375c41496f9a54", + "mac": "02a14417ca6efa6b5f071bc37d1e316214daa7612374ff062bff2608a28b30e4", + "message": "" + }, + { + "key": "1520f7df95c0f9ca95a428c26eb702ecd1ad0f95a12e9339e57e9fae49977ff0f0741fed9b3c1992676316b97a834762586d284a0502c99b37fe71bb71f6e513bb216d2b5e6422a154347f26b350e0f051a2fe21b7a651e44384e9cd15c76c93345b23e0ab65c8b638545730cdddbc11867fda294ce12764bf9c07b439101f99c36b70", + "mac": "23b0133545daab148260ff14a0c490dbad3ae91ad298136425331ffb60772513", + "message": "7cc6b5cb2365cec5acd2d8e6b66688880a921edb4e4e7cf1b8894885c41d220f" + }, + { + "key": "6467752713f4e26106a75d8ccf956581f1dfd53546a8731a4f5c8a6f302106ba9d90881aa252282f9723656118b1a599a4acd9e92188a9ec01c1308eb02661c6c6eb2043116a4a57d1e1a7b26a0ec30ab9aa1f7ef9100a47838533b94f179d9bc10ce678d2740504b1bc3441d5faed8fa74115610a43a01635edb8c5e71dc758e622d8", + "mac": "eafce2aaa2f17f7c922d681b8e65283a1ef96b3f56b0519e36bbb4a0ffbceab0", + "message": "1000f8e899ea107baa42758aff5d1d87c60874eb809fb840604f3adfdefa1d06b4d770c75d2025450a5748ba6c778b21b67cbcb2b53943c69fa0bf3bf9259884e89edc9b9c2e683636de39010d0a00f60941b5a3eb9139a6521e1c3daad6e791e5757f58" + } + ], + "pbkdf2_sha256": [ + { + "iterations": 1, + "key": "120fb6cffcf8b32c43e7225256c4f837a86548c92ccc35480805987cb70be17b", + "length": 32, + "name": "RFC 6070 inputs, c = 1", + "node": true, + "password": "70617373776f7264", + "salt": "73616c74" + }, + { + "iterations": 2, + "key": "ae4d0c95af6b46d32d0adff928f06dd02a303f8ef3c251dfd6e2d85a95474c43", + "length": 32, + "name": "RFC 6070 inputs, c = 2", + "node": true, + "password": "70617373776f7264", + "salt": "73616c74" + }, + { + "iterations": 4096, + "key": "c5e478d59288c841aa530db6845c4c8d962893a001ce4e11a4963873aa98134a", + "length": 32, + "name": "RFC 6070 inputs, c = 4096", + "node": true, + "password": "70617373776f7264", + "salt": "73616c74" + }, + { + "iterations": 4096, + "key": "348c89dbcbd32b2f32d814b8116e84cf2b17347ebc1800181c4e2a1fb8dd53e1c635518c7dac47e9", + "length": 40, + "name": "RFC 6070 inputs, 40 bytes", + "node": true, + "password": "70617373776f726450415353574f524470617373776f7264", + "salt": "73616c7453414c5473616c7453414c5473616c7453414c5473616c7453414c5473616c74" + }, + { + "iterations": 4096, + "key": "89b69d0516f829893c696226650a8687", + "length": 16, + "name": "RFC 6070 inputs, NUL", + "node": true, + "password": "7061737300776f7264", + "salt": "7361006c74" + }, + { + "iterations": 3, + "key": "1183f5095e71c8124d60a19e3dee1ea1287a0953e236fc0ec7fe48bbce93ec20df63c0f10bba0feca3166cb722f478599a9aeb152339376c6f67898a946429507d7716885916", + "length": 70, + "name": "a password of 100 bytes, 3 blocks", + "node": true, + "password": "30313233343536373839303132333435363738393031323334353637383930313233343536373839303132333435363738393031323334353637383930313233343536373839303132333435363738393031323334353637383930313233343536373839", + "salt": "73616c74" + }, + { + "iterations": 600000, + "key": "fceec4d8ca8de86c85a1f26ed49f82a2b38431bd0ce36db995ae7dfd49b96e41", + "length": 32, + "name": "spec §38.1: perro luna casa verde tren mar", + "node": false, + "password": "706572726f206c756e612063617361207665726465207472656e206d6172", + "salt": "446174654b657973206c6c6176652064652070616c61627261732076327c353264623962613730653063633066366561663738303364643037343437613166353437373733356664336636363137393262613934363030633834653937317c313030307c3030303130323033303430353036303730383039306130623063306430653066" + } + ], + "poly1305": [ + { + "key": "85d6be7857556d337f4452fe42d506a80103808afb0db2fd4abff6af4149f51b", + "message": "43727970746f6772617068696320466f72756d2052657365617263682047726f7570", + "name": "RFC 8439 2.5.2", + "tag": "a8061dc1305136c6c22b8baf0c0127a9" + }, + { + "key": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "message": "", + "name": "r and s all ones, 0 bytes of 0xff", + "tag": "ffffffffffffffffffffffffffffffff" + }, + { + "key": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "message": "ff", + "name": "r and s all ones, 1 bytes of 0xff", + "tag": "23feffef23f8ffef23f8ffef23f8ffef" + }, + { + "key": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "message": "ffffffffffffffffffffffffffffff", + "name": "r and s all ones, 15 bytes of 0xff", + "tag": "fbff27e6030028e6030028e6030028ee" + }, + { + "key": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "message": "ffffffffffffffffffffffffffffffff", + "name": "r and s all ones, 16 bytes of 0xff", + "tag": "fbffff17faffff17faffff17faffff17" + }, + { + "key": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "message": "ffffffffffffffffffffffffffffffffff", + "name": "r and s all ones, 17 bytes of 0xff", + "tag": "7cfe7ff768f81f2763f8bf565df85f86" + }, + { + "key": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "message": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "name": "r and s all ones, 31 bytes of 0xff", + "tag": "5400a8ed4800481d4300e84c3d008884" + }, + { + "key": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "message": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "name": "r and s all ones, 32 bytes of 0xff", + "tag": "5400801f3f00204f3900c07e330060ae" + }, + { + "key": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "message": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "name": "r and s all ones, 33 bytes of 0xff", + "tag": "86fa6a437bf4ec24a274504dc37495bc" + }, + { + "key": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "message": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "name": "r and s all ones, 64 bytes of 0xff", + "tag": "900fe32bc15fa8d7bca8efe4c7e37eb1" + }, + { + "key": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "message": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "name": "r and s all ones, 100 bytes of 0xff", + "tag": "b99c030d7ce939bb6607393e68656f22" + }, + { + "key": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "message": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "name": "r and s all ones, 257 bytes of 0xff", + "tag": "2d5d96b08bcdc7a0a2dd87a44f5222c1" + }, + { + "key": "ffffffffffffffffffffffffffffffff00000000000000000000000000000000", + "message": "ffffffffffffffffffffffffffffffff", + "name": "s zero, 16 bytes of 0xff", + "tag": "fcffff17faffff17faffff17faffff17" + }, + { + "key": "00000000000000000000000000000000ffffffffffffffffffffffffffffffff", + "message": "00000000000000000000000000000000", + "name": "s all ones, 16 zero bytes", + "tag": "ffffffffffffffffffffffffffffffff" + }, + { + "key": "ffffffffffffffffffffffffffffffff00000000000000000000000000000000", + "message": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "name": "s zero, 48 bytes of 0xff", + "tag": "5ffc6a6b51fcec4c787c5075997c95e4" + }, + { + "key": "00000000000000000000000000000000ffffffffffffffffffffffffffffffff", + "message": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "name": "s all ones, 48 zero bytes", + "tag": "ffffffffffffffffffffffffffffffff" + }, + { + "key": "0100000000000000000000000000000000000000000000000000000000000000", + "message": "ffffffffffffffffffffffffffffffff", + "name": "r = 1, 1 blocks of 0xff", + "tag": "ffffffffffffffffffffffffffffffff" + }, + { + "key": "0100000000000000000000000000000000000000000000000000000000000000", + "message": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "name": "r = 1, 2 blocks of 0xff", + "tag": "03000000000000000000000000000000" + }, + { + "key": "0100000000000000000000000000000000000000000000000000000000000000", + "message": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "name": "r = 1, 3 blocks of 0xff", + "tag": "02000000000000000000000000000000" + }, + { + "key": "364b918562983401ab38ff4ba80ad9a8b32f428f19ac406007acd34abe423253", + "message": "98122f4be94c1a0c29f104247e1e45c21a93df4728340c72551df5a549ffdce1ddfe161fb8b83215432a491ea72d42c3ec199e568531170f92a640ab03a81254f8803856651ea928a1c39bf645645b94f6396f8b51e9a81a2b3f4874cb02d274958fdc", + "name": "random 0", + "tag": "45977c98012ec23aa9f1fef5f528d431" + }, + { + "key": "dddb7b26f22dcb06737e0069ab17f40d2100a15970423cf275b90225885454d8", + "message": "504b59", + "name": "random 1", + "tag": "c0faabf643aca88046362e7f5815fe98" + }, + { + "key": "11656c2416f927e20e98ff7aa9819315a5cf0668a942964e27db10e7e063b6f1", + "message": "621f4e4bc6cf948cf9b9531d809cc347a3e7cbbee77b7a4a602ceafc7b6ab513130c9b201dd646163ee0cedef9432042ac6af89f64d9ec485b9acbdb3c65a934fefec9986fa008185b016126769de64cde54b3e3a971fcd762b4b689db5bc4d59d1f18b75ab1b3b71e2534cb14699a2209ec05e11b5bff0075b62df50b14763028dc6d3e4622eb3e8d3d01c15d7c9980582d9435eaa7b4441c7db0d4e7749c1e77325e785bc80b", + "name": "random 2", + "tag": "8274833134fbde493b4517b2caaff562" + }, + { + "key": "73e55d9af984aeeaaa77ad83f0c49e55490735af1bae87d80bb2355437a76d21", + "message": "9986b2601582a650f873fea9f0de4dae330fdb7be4382a16781991160105b8d98da8fa1ba8845deaf471da2b5e80a2dabbac62ce4dae4d956cfd12e1f5a016acb33349a6b18d5dfb27e9ce9ce60fe01703ee27301c22971b173de07c8eafbbbf8be5402f75f2bd7512c616a43e9602fb6de3967d5a7973a50ba773c96aeac4ee99c8c7ba6c493feb41b1f930c5b12411d566e972605a6e43f1b54317625e5113f04370b5fed0d83bce7a830e0a2f7698e00fbd4951b712f7", + "name": "random 3", + "tag": "fe08e95a80d5371763b063db08f1df88" + }, + { + "key": "76e8e5f3d04f41d596295baa987d824a750fcf581762ed856d277bfc53da3d00", + "message": "1dad6af724d54807f69b783a88a62c76dc2392e7a89442adfb2756c4ce5e4c20a675e97edab7baceb7d019cbb249537dee5c07244a8464dea5b35884ea402dd96ea5e59d876256b717d6212af3919667d456626f471d78f8f1218337e4e6848d6447fd75a9bd1b25b9cc43c77e80b882fc541532", + "name": "random 4", + "tag": "80236805aa95e9537d3b84f5a8a0396a" + }, + { + "key": "c7dca18659b447124fd1e57ae7a9bbe608e6e311b1b3cb8fb035f99e7048143f", + "message": "282d3c72f0c1ae0268697e225065e1b5", + "name": "random 5", + "tag": "9b65f873165e71161a80d62f196bc780" + }, + { + "key": "070b609a6b591d93795b6a1458223b3c2a4c940bfb8d28082586b18e686cc0f8", + "message": "9f3f0d57f182c1015efc8619128c384f418829ad6ad5b0f82d6010224576d526b5ecf675fe55bdcf", + "name": "random 6", + "tag": "57fc49de05ac7844ae57a28e24ffbb0a" + }, + { + "key": "710c1bf52675cf59be69c0c720ae82451df1f5413580d6a4eb3aef3d926eb00d", + "message": "67aaf0102beaf12ef6f17f7c1dedada22ce260f6e5b3ffefce37e939a11fa5836253a25e8d088f8d8e7b3efed20b2ac2416e681ced4b6e369f", + "name": "random 7", + "tag": "bcdcd91105233ab451fbe0a6ebb5bf29" + }, + { + "key": "4712499c986e7f12de80a2ed84fce84aae268a74f9925f172d2b5f009ad8f5e5", + "message": "4ee5fc28fdf692feec44666cc8d074db8a1794a8016221e81d725116091bd7b86e96a6f2de44666ada9bae74834023ca053dbc567ea8a911be4266c677eff95760748f82a52cc7b73d557944282154ba578deae41d5dce30e260104c1b", + "name": "random 8", + "tag": "85508015a13d5687258ee88af3ca87a8" + }, + { + "key": "af388a28dd98f5308c56c9ffa177a0aa55e14e258e62e2521b695769a80aaaa4", + "message": "8abaeaf1a30a409d799ef1388938", + "name": "random 9", + "tag": "5a0a583d5c12ef6845c7530ce93be77f" + }, + { + "key": "b0e5611f69de9efa2f4266d8376c6bdad49d719f615fabfeb3f92042b7c92e15", + "message": "dc68738e1987ffc987be33ae1e617ca532d06ef21762adf26b4d2dfb971d7b19ed1fddd80539a59f7a127e6c65281cbeb72afc8596a335a2940d34eb884dee5ed20356e50143cf5880ad5a14f9", + "name": "random 10", + "tag": "0fa415d30d6125f2fd0639e8ec1d162a" + }, + { + "key": "6eb7317d2e085ff2273544cb7a3697d29cb1a9aeb699bbab03d2215d03da7d60", + "message": "dabae4b2e0622522ef1d1a05aa87d9bbbdbb46c757d70b8febea5ad51b076f759b13440109951604b4e799c86007b2702bb321a98f904d4b30df2a795a795b070e3e1414c67b49ddcd2fb2bcfcc665276aa0", + "name": "random 11", + "tag": "fcf85c210bb34e950206336e67c1affa" + }, + { + "key": "b035ec6073f0df1f720d93e0256ccb2b52719fbf26704246fbed564907bb0aa3", + "message": "cb16977e52cc707ae4651a2efbf07ab65c0ee0c4f3479509280495c22c0050a6b1f6038f511cb4cd4207a282ffce629499e6c08ba90d82dd8c97376d50a993c343430ad90d03638cda12f022fde42ad86039592a2861127449e0ebb5", + "name": "random 12", + "tag": "ba0c5a2c8eac58de3b6a35a6c50db129" + }, + { + "key": "ec322484d3323741e6bbc99e6bf4958ae7ef7b6e9d1b7d72d23ac2e8007afe2d", + "message": "214f47d162bffd634bc1c9c1e14279e878769e280d0660c04de9846085e594fa2e38a53d84b620bece5efb23082a89f104", + "name": "random 13", + "tag": "083f639549ba789166089d65763fd273" + }, + { + "key": "a38d92f6c866a9c1eec4391dee45ac454a415c2d0d985e06c411003fda14af1b", + "message": "c43fcccbc4fe7b916f64bd836094f4e065c039f2d1ff30024d4010f5315786d327728bcdfa955dea69a6a7281a06ff064c9de700aae27bebe1739af155287efaf1a824a0fe8df0f2c4c2d1940cfeb9e4559a7faf092662aa4b63d1e6de6a2ad21fa8c5e67a910798587bf3d1b4ad9f", + "name": "random 14", + "tag": "7216fafe549d56bf48e89f9a3b4aecc9" + }, + { + "key": "9fb6f071d543c65d62ae90d8fb916dd9f6a14a37831503ec82587ba98209205d", + "message": "ca823dcfa8141fdd745d39d873813baa037428", + "name": "random 15", + "tag": "8203e7d2ac5815ed780d9ce47574a2c8" + }, + { + "key": "4ce6d398fc2e520f5ecbefb3ad7f0caab8c6a845be9b707f592fd8e1432322bc", + "message": "ef5079c10b5239c3f94f2940a978176159c4066b4281b29353a82648dca8805333b599f72e61e4e8c30806d339c698b5b5caf8618aa3c195bd43a14a77ff8bdef86f465ab09b6cb5778320c88566ef1852205e83c0a839ea23dd3eef935bd7de3859a4ad76e0ccba83284a4152b78c3df871bb4085aa93b3b7b06abb1bb5f66727cc08f78d9ebc77ddb1e8693c3433d8", + "name": "random 16", + "tag": "36f0f77d1423d537bc6f340bc4b0fbd0" + }, + { + "key": "420f3bb2d4ffffb665c6db221d5b513075f26304d8b0c9190078e3ae5487fddf", + "message": "db123703dc72be8f4b728553ac8b6d3679ece90f18285e", + "name": "random 17", + "tag": "2a3898d8437e1e064957aa2016528afa" + }, + { + "key": "7a0330ce187894483c9cca758cb85b91b652cadac252cb9ce4528ec3d98914f9", + "message": "225c", + "name": "random 18", + "tag": "38a3e4013ef9c39387aed8f4516421d6" + }, + { + "key": "bdef67ae0d5217eb8348c2bb5d4096d68d50af3fbbe045f6be71bfec79c965c7", + "message": "25053f816f7aff424213b1ce2a43087392fc90e79620584334366bba4444a412d77889ddd2d2349b8c707a646e9ce5fe5f7e5b23637ba8b671aa6c78a6f4d3feba9a5496f5b5fe577b6c98519c84115b1ef3e1e171c384e9f92f171997a22896e3a2bec655d0a10b0b7b2f63875e4acb997e3e3b17cc9fbcf68f3c059ac1741769f7598512988f2c926bf30b72df1495bea9c41aeea808d86ac367d7eec7428e2bf5d7cb0988ca786b72", + "name": "random 19", + "tag": "4dad17ac26f8445f3ccb3c8da7d1920c" + }, + { + "key": "46ff7ed7b969fd97bcbc683f833d11ce621b001994248658438e147381e57b3e", + "message": "d5d6d16a1664e4bc7420b319a76cc28262cb2e31398ef522b99c4f4738aa2a61e17e7b749a8fcb731428227479cf62aca0595ef51cb8fe9061904cfc30c920362feb486d6005d52f82fc19c045f2fab118705ed33f8764f983969ac3a671e2fac7e03a5b3afe3b7cbfcc30f350608789399cb8e15e2f7a91c9f3f78efccbe7d63a437a667619a6a75158be22db9a7accabb2859b3160d4806ae7521fd61f09569e2c083d8417ab978ea3941bd66d4727", + "name": "random 20", + "tag": "ee9fd00272a41c74e56086c5a59ba644" + }, + { + "key": "453058edc6ff4d4487c62369b4eff01e1d99e765257251651b51f783df3b1edb", + "message": "1a29", + "name": "random 21", + "tag": "c8a2dc108adff75282a3e8f2c272aee5" + }, + { + "key": "efaf2f6846aebfa27feaf0fb8b1a116bc2a4bc48b5520c634ea217599b4632c1", + "message": "e51c5c055c04a8586069dcbaa11ec1b3622d6709e641c224604ad04a6d23a6112d6de90c22220b82e3897943419ff3e1028f0dea7f123ebd626a208d348e91df198ee5174cf398de1af6461edd754d4119b12f6e7bea538a04568a5bb96a1636f7236e63353d7dbc10fe6a6e1f5cf8307f40bd6090b5eec46ef7c753720f7f89711d267e042c183975ccc4a168b390d771912e97aee04bf597e1b1f8", + "name": "random 22", + "tag": "db0c3a0dce0aa0f68b347718fcc95633" + }, + { + "key": "a45f31a208c4e743c516f20496eec1dcd467239c09d4f9a5f260c666fc6427b2", + "message": "378d48b5f718fcfd05bad3f052ed39171b1a495eecfecee93f647aa221471550b8b8a51d344985c80787aaf2cc36c40898861017d1864e1920d17aafe929f80499d78256bfef07834158c07d36e143d4e8f9a611787f123a25bc2a68ba4f3cd389bda452fb29a51333267419c83b", + "name": "random 23", + "tag": "6d5cf1388600d473b539ba18503e43c7" + } + ], + "scrypt": [ + { + "key": "77d6576238657b203b19ca42c18a0497f16b4844e3074ae8dfdffa3fede21442fcd0069ded0948f8326a753a0fc81f17e8d3e0fb2e0d3628cf35e20c38d18906", + "length": 64, + "n": 16, + "name": "RFC 7914 §12, N = 16", + "node": true, + "p": 1, + "password": "", + "r": 1, + "salt": "" + }, + { + "key": "fdbabe1c9d3472007856e7190d01e9fe7c6ad7cbc8237830e77376634b3731622eaf30d92e22a3886ff109279d9830dac727afb94a83ee6d8360cbdfa2cc0640", + "length": 64, + "n": 1024, + "name": "RFC 7914 §12, N = 1024, p = 16", + "node": true, + "p": 16, + "password": "70617373776f7264", + "r": 8, + "salt": "4e61436c" + }, + { + "key": "7023bdcb3afd7348461c06cd81fd38ebfda8fbba904f8e3ea9b543f6545da1f2d5432955613f0fcf62d49705242a9af9e61e85dc0d651e40dfcf017b45575887", + "length": 64, + "n": 16384, + "name": "RFC 7914 §12, N = 16384", + "node": true, + "p": 1, + "password": "706c656173656c65746d65696e", + "r": 8, + "salt": "536f6469756d43686c6f72696465" + }, + { + "key": "48b0d2a8a3272611984c50ebd630af52e187db3433930c3b74d0889935944cf3", + "length": 32, + "n": 2, + "name": "N = 2, r = 1, p = 1", + "node": true, + "p": 1, + "password": "70", + "r": 1, + "salt": "73" + }, + { + "key": "ddd6413d68edd0396460588e4377b17e5ca46569ac2c8bfe7a91927a202ef49ff218070b234a7496fe8907741e10f2b025f6a10e9b371b2a83d9deb845683ce084e5eaef2ef0", + "length": 70, + "n": 4, + "name": "N = 4, r = 2, p = 3", + "node": true, + "p": 3, + "password": "70617373776f7264", + "r": 2, + "salt": "73616c74" + }, + { + "key": "8a4fdfaca07efc58d564e468800b0784e1706b5c72b56627a819f588051464b6", + "length": 32, + "n": 1024, + "name": "age, logN = 10", + "node": true, + "p": 1, + "password": "70617373706872617365", + "r": 8, + "salt": "6167652d656e6372797074696f6e2e6f72672f76312f736372797074000102030405060708090a0b0c0d0e0f" + }, + { + "key": "1824aa17e3524c120b46a245856386af3672ae7ef5e14a1a5623a77b4cfc0283", + "length": 32, + "n": 65536, + "name": "age, logN = 16 (spec §29.12)", + "node": false, + "p": 1, + "password": "70617373706872617365", + "r": 8, + "salt": "6167652d656e6372797074696f6e2e6f72672f76312f736372797074101112131415161718191a1b1c1d1e1f" + } + ], + "scrypt_errors": [ + { + "error": "scrypt: N must be > 1 and a power of 2", + "n": 1, + "p": 1, + "r": 8 + }, + { + "error": "scrypt: N must be > 1 and a power of 2", + "n": 0, + "p": 1, + "r": 8 + }, + { + "error": "scrypt: N must be > 1 and a power of 2", + "n": 3, + "p": 1, + "r": 8 + }, + { + "error": "scrypt: parameters must be > 0", + "n": 1024, + "p": 1, + "r": 0 + }, + { + "error": "scrypt: parameters must be > 0", + "n": 1024, + "p": 0, + "r": 8 + }, + { + "error": "scrypt: parameters are too large", + "n": 1024, + "p": 1024, + "r": 1048576 + } + ], + "sha256": [ + { + "digest": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "message": "" + }, + { + "digest": "8e35c2cd3bf6641bdb0e2050b76932cbb2e6034a0ddacc1d9bea82a6ba57f7cf", + "message": "71" + }, + { + "digest": "6ab7b47e13810c9c739b90fa2b2874a23cc2bede712724aad6de134c7aa80b8d", + "message": "af183d" + }, + { + "digest": "35879a7beb5642cda3a2961e6a9243713b6f2a892d269778dc5d06e893cfe472", + "message": "53c998fdbbe01f4a8ab24537fd00b4fbbc7548488c73f6c53eb9c562e092a453f8ee3a8270c188b0c3e5d7c71c80cc2df5bed8f19f68f2" + }, + { + "digest": "8e208ac6b8830217429225e111222d8bd4d33c673ad7d1264e1dc8d97a373880", + "message": "08e91b6ef3ab137e80aa8bc393b0581fdf54d0a0b05479ac424d3c035b4a67c8613caa1e26c8f9564d95481bb01db7b0aa6492d3bc591dd5" + }, + { + "digest": "72b3c6a29b2460c75dcb9b808f42a857dd8cc709ed5b29a02a27182d11c12947", + "message": "0a500b5d104159e875719dea73a5f4420253d9ed3b2a8eb08262bd4f87e8491d556e4ecd521a75850c43d641a48176dda32744bf011893bb85" + }, + { + "digest": "c7da1c27a302970da291977e0d8526daab8d6c0c7662069caed154db700b2dbc", + "message": "4499556864d79e902445005600071b5bd10222324cf1e24667786845730167c4c80fb5096985773b5743034852faab408576b18d39674800ccd792441fe741" + }, + { + "digest": "abfa7d689f615e14dbe7b47cdaecba22ce5b6e7b997bd790a02b1c8029e0a461", + "message": "26250fb8896e987e69660bc1034ae3c67b142e970f3a0d052a8f9583a39346ffd10d52a58127e48f07eb7224317e6d16b5334cfc03da7c116d5213b74bc372d8" + }, + { + "digest": "5cdfd750ada90057e2a631516251c3649cce33d99511e64963bd9743f4d4ed68", + "message": "daf2ff9cab2f1ccdab5176cac5e455330379cf55dabc4657b468e939f773f1fa2f962ba1eca754ac56ea1f8fb30fe538a96831bdbced4183a4b7cf6dd6a24042e8" + }, + { + "digest": "d38074c0c286a37460c504f12f9b1fd9927b241877bc9daad1274a9594a78881", + "message": "c8f888e5139c3efc201441fca55f4cfcfd19ff4066b428d528b151d431c6e6a83ffc66cc031e04e1e71884c5206ba92ebdf705247b6e203a28f12e7e8cfc3893550e362600583c6c6cdeee4b8bacff92a930810daaefccd85dcfb3b9d16596a2a039c7dc0e72dbc5d69370f5cf382d1dd2d76bb8e48195" + }, + { + "digest": "c2b1a93c56deb6665fcf8917b0a65f74144ada957ea90cdf64063a4b1f318644", + "message": "8aafdee7c9cd47d18fadc0025869946bc88abc89c63bc22106f692d06409d51db00c8c49c658d59c00e9f3bcb03a1d31ed442f8f7025ea0075cf4f84211b5eef4ca566dfccbfb175e05249ed7caf708aa03a92a6dcce57cd840459d6ac3d48775de13b3790e69ecd726875722e510d9d43bc17024775405c" + }, + { + "digest": "370649ff5a3bc8bcb584cea3873c035974674688f61fe3fbf1caad248baa8bf8", + "message": "eca07b79e42a8a617cf4734eb2c9f1710caf6f06689eca45d3e96872e18faf6d797e9b5b5aa8f9f8b60f51d65db396809aa29efb628ce40823136c5be8c225f264621f0d60c33fccd368a9b6868c589b9a08f9499d354a8a364622a4133bcdb085cdfc8b25d49553c15c04d038843a212437eea81e2513ad5ad6fbc82bf01dae" + }, + { + "digest": "b2db6436d984ea4efe3bf744fb8f315f102c37476fd1f23501fa27fcad9753b0", + "message": "9c3dc308961163bd400390d2ee856eaab4a10ebd802884a5dc6a3100c688c04618b939a63ee56771eab8b06a59ccfb769996d91b33532848f90cdf70e357f34ace00552f68c01634dccba7e862bf4794f3c8ca106598cea60b77b332dce575375d9d91ca6cec962a9076f7c87dd668fe8d856259a5c1c1ca79293b81a59a5d0ea54b5e377cc3adb915acda0f491345a461cdda803c4ebaa56f76ac7f9f463ae85b9a85676c6c28d92f1ea9177cc93ffb3cb2fec4882bd83cd2a0a266b37616fb5c42744fb691e3e5a72692af59f387028c443222bd9529bfd41819d56bf58467b08706040218babddfe1de5007c3ad226a64219ba83e43ddbbfb01c15b623c4d21a594cdd82cc104cc658c4feb571dbd2a4e1658fa0517fe2c90cf43520774a51472a6e9bc249b40339d64237e86be3d61e90e4ae18098b9f21bd2d3470be0d6786eeca472a9ae32efe042373cff1120ee266326f2d72125f30b23f3e963a0f17e296ab018c2dad513fc1a8cb54303b385d0c503b32dbf192d474fc2b0ea9330b94265e2b4f614c20d7e2461e90fb8dce6cbc8f5df7268a02055c802100081c751c0ecc5274fbcae8f3fd436afa34155453023c9024f908666d615dd46d81ed04cf2923fc9063eb58896ac97e45e04aa42acf015aabc56feb177d532460f7a563e842007dec077f39031c5b3f74116ecec7acff030eaa310e02d215da40aa4458261595067d714cca30a3143c4b07d078d479ead28344b3db8044b7ce0d4e61017bebe3998d1eb092ffbc7de19554c719353e4b717b02a81ae925f0a0bcd4f3122f2b6a0e75af53f101724b2a44cb139970620f2e864aeaf9798deda0c7149143f8791c81796a78c8a789278d489e310d5425e8b7db11f77e474ad2fa8f195daa7c6ecc3b1e26bd11041853f56af05ed44813e1d2fbe9ce4e4922b48e7de5ce7d16f94f199373494635a8cac8c49ccede960dac2c70c9f975ac850baf1fc462db8bc4bd9f2002dd1cc78f088673cd8ba18c11da9876beddb862432e6d9fabfeeb1fff64d0bfdbfb6b3a17c8efc4951d01b6197774e75c0a76497e5d93c1891ae06e352d477dbbf9bb84ae43e3cdb72c5b7aa1949ca169eb1d88adef65353da0f6d64c1ef1371ff16a54b5ec774b4cdfc09b276da8194b175d5c3f45ef8baef3c0e11ce4f6a22bb3989035f75bd81836375139e813dd1f8f13765775664602a668bd6f552d96c532746b68003c2eb7310c4976b86a229f30d561ab8229f94e813154bf95a6d8eea6869d250fa5937ca87affad55a1aa63ae577d7dc1d2f54bd6f89cc536bee807b060b14cf819e3f91bc049a83495edf6c25b1e8b74f77097eda2e715fad93674c4f7861d6cb072fa9f7208c6d3bc242cfc33fe7e4ccf1f5249c0d6d6f51253d37c1" + } + ], + "x25519": [ + { + "name": "RFC 7748 5.2, first", + "output": "c3da55379de9c6908e94ea4df28d084f32eccf03491c71f754b4075577a28552", + "scalar": "a546e36bf0527c9d3b16154b82465edd62144c0ac1fc5a18506a2244ba449ac4", + "u": "e6db6867583030db3594c1a424b15f7c726624ec26b3353b10a903a6d0ab1c4c" + }, + { + "name": "RFC 7748 5.2, second", + "output": "95cbde9476e8907d7aade45cb4b873f88b595a68799fa152e6f8f7647aac7957", + "scalar": "4b66e9d4d1b4673c5ad22691957d6af5c11b6421e0ea01d42ca4169e7918ba0d", + "u": "e5210f12786811d3f4b7959d0538ae2c31dbe7106fc03c3efc4cd549c715a493" + }, + { + "name": "RFC 7748 6.1, Alice's public key", + "output": "8520f0098930a754748b7ddcb43ef75a0dbf3a0d26381af4eba4a98eaa9b4e6a", + "scalar": "77076d0a7318a57d3c16c17251b26645df4c2f87ebc0992ab177fba51db92c2a", + "u": "0900000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "RFC 7748 6.1, the shared secret", + "output": "4a5d9d5ba4ce2de1728e3bf480350f25e07e21c947d19e3376f09b3c1e161742", + "scalar": "77076d0a7318a57d3c16c17251b26645df4c2f87ebc0992ab177fba51db92c2a", + "u": "de9edb7d7b7dc1b4d35b61c2ece435373f8343c85b78674dadfc7e146f882b4f" + }, + { + "name": "BoringSSL 0", + "output": "090d85e599ea8e2beeb61304d37be10ec5c905f9927d32f42a9a0afb3e0b4074", + "scalar": "668fb9f76ad971c81ac900071a1560bce2ca00cac7e67af99348913761434014", + "u": "db5f32b7f841e7a1a00968effded12735fc47a3eb13b579aacadeae80939a7dd" + }, + { + "name": "BoringSSL 1", + "output": "bf26ec7ec413061733d44070ea67cab02a85dc1be8cfe1ff73d541cc08325506", + "scalar": "636695e34f75b9a279c8706fad1289f2c0b1e22e16f8b8861729c10a582958af", + "u": "090d0701f8fde28f70043b83f2346225419b18a7f27e9e3d2bfd04e10f3d213e" + }, + { + "name": "BoringSSL 2", + "output": "1176d01681f2cf929da2c7a3df66b5d7729fd422226fd6374216bf7e02fd0f62", + "scalar": "734181cd1a9406522a56fe25e43ecbf0295db5ddd0609b3c2b4e79c06f8bd46d", + "u": "f8a8421c7d21a92db3ede979e1fa6acb062b56b1885c71c51153ccb880ac7315" + }, + { + "name": "BoringSSL 3", + "output": "f8482f2e9e58bb067e86b28724b3c0a3bbb5073e4c6acd93df545effdbba505f", + "scalar": "1f70391f6ba858129413bd801b12acbf662362825ca2509c8187590a2b0e6172", + "u": "d3ead07a0008f44502d5808bffc8979f25a859d5adf4312ea487489c30e01b3b" + }, + { + "name": "BoringSSL 4", + "output": "47b356d5818de8efac774b714c42c44be68523dd57dbd73962d5a52631876237", + "scalar": "3a7ae6cf8b889d2b7a60a470ad6ad999206bf57d9030ddf7f8680c8b1a645daa", + "u": "4d254c8083d87f1a9b3ea731efcff8a6f2312d6fed680ef829185161c8fc5060" + }, + { + "name": "BoringSSL 5", + "output": "11edaedc95ff78f563a1c8f15591c071dea092b4d7ecaac8e0387b5a160c4e5d", + "scalar": "203161c3159a876a2beaec29d2427fb0c7c30d382cd013d27cc3d393db0daf6f", + "u": "6ab95d1abe68c09b005c3db9042cc91ac849f7e94a2a4a9b893678970b7b95bf" + }, + { + "name": "BoringSSL 6", + "output": "563e8c9adaa7d73101b0f2ead3cae1ea5d8fcd5cd36080bb8e6ec03d61450917", + "scalar": "13d65491fe75f203a008b4415abc60d532e695dbd2f1e803accb34b2b72c3d70", + "u": "2e784e04ca0073336256a839255ed2f7d4796a64cdc37f1eb0e5c4c8d1d1e0f5" + }, + { + "name": "BoringSSL 7", + "output": "01476965426b6171749a8add9235025ce5f557fe4009f7393044ebbb8ae95279", + "scalar": "686f7da93bf268e588069831f047163f33589989d0826e9808fb678ed57e6749", + "u": "8b549b2df642d3b25fe8380f8cc4375f99b7bb4d275f779f3b7c81b8a2bbc129" + }, + { + "name": "BoringSSL 8", + "output": "9c49941f9c4f1871fa4091fed716d34999c95234edf2fdfba6d14a5afe9e0558", + "scalar": "82d61ccedc806a6060a3349a5e87cbc7ac115e4f87776250ae256098a7c44959", + "u": "8b6b9d08f61fc91fe8b32953c42340f007b571dcb0a56d10724ecef9950cfb25" + }, + { + "name": "BoringSSL 9", + "output": "00f43c022e94ea3819b036ae2b36b2a76136af628a751fe5d01e030d44258859", + "scalar": "7dc76404831397d5884fdf6f97e1744c9eb118a31a7b23f8d79f48ce9cad154b", + "u": "1acd292784f47919d455f887448358610bb9459670eb99dee46005f689ca5fb6" + }, + { + "name": "BoringSSL 10", + "output": "ae39d816532345794d2691e0801caa525fc3634d402ce9580b3338b46f8bb972", + "scalar": "fbc4511d23a682ae4efd08c8179c1c067f9c8be79bbc4eff5ce296c6bc1ff445", + "u": "55caff2181f2136b0ed0e1e2994448e16cc970646a983d140dc4eab3d94c284e" + }, + { + "name": "BoringSSL 11", + "output": "a61e74552cce75f5e972e424f2ccb09c83bc1b67014748f02c371a209ef2fb2c", + "scalar": "4e060ce10cebf095098716c86619eb9f7df66524698ba7988c3b9095d9f50134", + "u": "57733f2d869690d0d2edaec9523daa2da95445f44f5783c1faec6c3a982818f3" + }, + { + "name": "BoringSSL 12", + "output": "fcf307dfbc19020b28a6618c6c622f317e45967dacf4ae4a0a699a10769fde14", + "scalar": "5c492cba2cc892488a9ceb9186c2aac22f015bf3ef8d3ecc9c4176976261aab1", + "u": "6797c2e7dc92ccbe7c056bec350ab6d3bd2a2c6bc5a807bbcae1f6c2af803644" + }, + { + "name": "BoringSSL 13", + "output": "5dcab68973f95bd3ae4b34fab949fb7fb15af1d8cae28cd699f9c1aa3337342f", + "scalar": "ea33349296055a4e8b192e3c23c5f4c844282a3bfc19ecc9dc646a42c38dc248", + "u": "2c75d85142ecad3e69447004540c1c23548fc8f486251b8a19463f3df6f8ac61" + }, + { + "name": "BoringSSL 14", + "output": "e4e634ebb4fb664fe8b2cfa1615f00e6466fff732ce1f8a0c8d2727431d16f14", + "scalar": "4f2979b1ec8619e45c0a0b2b520934541ab94407b64d190a76f32314efe184e7", + "u": "f7cae18d8d36a7f56117b8b70e2552277ffc99df8756b5e138bf6368bc87f74c" + }, + { + "name": "BoringSSL 15", + "output": "ab9515ab14af9d270e1dae0c5680cbc8880bd8a8e7eb67b4da42a661961efc0b", + "scalar": "f5d8a927901d4fa4249086b7ffec24f5297d80118e4ac9d3fc9a8237951e3b7f", + "u": "3c235edc02f9115641dbf516d5de8a735d6e53e22aa2ac143656045ff2e95249" + }, + { + "error": "crypto/ecdh: bad X25519 remote ECDH input: low order point", + "name": "low order 0", + "output": "0000000000000000000000000000000000000000000000000000000000000000", + "scalar": "23e339961a557df7df74749a1c22b35ff756603829f80346d30eb954b5f6dfa3", + "u": "0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "error": "crypto/ecdh: bad X25519 remote ECDH input: low order point", + "name": "low order 0, bit 255 set", + "output": "0000000000000000000000000000000000000000000000000000000000000000", + "scalar": "d2f01795507a8a23a11eb047fba0f88b789224e7787427e0ff030eefd507c52e", + "u": "0000000000000000000000000000000000000000000000000000000000000080" + }, + { + "error": "crypto/ecdh: bad X25519 remote ECDH input: low order point", + "name": "low order 1", + "output": "0000000000000000000000000000000000000000000000000000000000000000", + "scalar": "99a46865d474f8d29d0229b553dd22992a7449cd05a8cb3f1cf34767766a5f18", + "u": "0100000000000000000000000000000000000000000000000000000000000000" + }, + { + "error": "crypto/ecdh: bad X25519 remote ECDH input: low order point", + "name": "low order 1, bit 255 set", + "output": "0000000000000000000000000000000000000000000000000000000000000000", + "scalar": "5865a8286d35a092918588a6862f329de9d1450f8e80e54f1734fa9ecee16429", + "u": "0100000000000000000000000000000000000000000000000000000000000080" + }, + { + "error": "crypto/ecdh: bad X25519 remote ECDH input: low order point", + "name": "low order 2", + "output": "0000000000000000000000000000000000000000000000000000000000000000", + "scalar": "b0f1b453531e5161d64ef42ac7c5a7071dfcbb7a17faebc40d692698a4009400", + "u": "e0eb7a7c3b41b8ae1656e3faf19fc46ada098deb9c32b1fd866205165f49b800" + }, + { + "error": "crypto/ecdh: bad X25519 remote ECDH input: low order point", + "name": "low order 2, bit 255 set", + "output": "0000000000000000000000000000000000000000000000000000000000000000", + "scalar": "70f89dbd428bc3aeb680d4fe9bc425b8fe50adff965732c1c7c544b12663ea42", + "u": "e0eb7a7c3b41b8ae1656e3faf19fc46ada098deb9c32b1fd866205165f49b880" + }, + { + "error": "crypto/ecdh: bad X25519 remote ECDH input: low order point", + "name": "low order 3", + "output": "0000000000000000000000000000000000000000000000000000000000000000", + "scalar": "880be5a3eb3741e7623edc230187918963611408ebe6107b096fc8e242eccbfc", + "u": "5f9c95bca3508c24b1d0b1559c83ef5b04445cc4581c8e86d8224eddd09f1157" + }, + { + "error": "crypto/ecdh: bad X25519 remote ECDH input: low order point", + "name": "low order 3, bit 255 set", + "output": "0000000000000000000000000000000000000000000000000000000000000000", + "scalar": "681ac4de693d7b97f00959a3c1c38803ceb585edfc926470580cda15ed4b0467", + "u": "5f9c95bca3508c24b1d0b1559c83ef5b04445cc4581c8e86d8224eddd09f11d7" + }, + { + "error": "crypto/ecdh: bad X25519 remote ECDH input: low order point", + "name": "low order 4", + "output": "0000000000000000000000000000000000000000000000000000000000000000", + "scalar": "7643068d328156792c5a0e6a80f51b75831643941a790f9e53271dd146fded1c", + "u": "ecffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f" + }, + { + "error": "crypto/ecdh: bad X25519 remote ECDH input: low order point", + "name": "low order 4, bit 255 set", + "output": "0000000000000000000000000000000000000000000000000000000000000000", + "scalar": "8cd90e3cefd1c45f436235a8f97c17f077bb50e61e409c12162e772ca5f04796", + "u": "ecffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + }, + { + "error": "crypto/ecdh: bad X25519 remote ECDH input: low order point", + "name": "low order 5", + "output": "0000000000000000000000000000000000000000000000000000000000000000", + "scalar": "6e9c62bad6a29375b2603e5f35b90592ac2ed932f84ca2bd9ca7e23435766a75", + "u": "edffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f" + }, + { + "error": "crypto/ecdh: bad X25519 remote ECDH input: low order point", + "name": "low order 5, bit 255 set", + "output": "0000000000000000000000000000000000000000000000000000000000000000", + "scalar": "2f962e7c5ad196448240ce181a9d313fcaaf8766c636e6790a7a6242adc1a231", + "u": "edffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + }, + { + "error": "crypto/ecdh: bad X25519 remote ECDH input: low order point", + "name": "low order 6", + "output": "0000000000000000000000000000000000000000000000000000000000000000", + "scalar": "43aff1925d003c51cb0fc070a0a7875a9ca0743119c3c2ef52b61991f3fbeb7b", + "u": "eeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f" + }, + { + "error": "crypto/ecdh: bad X25519 remote ECDH input: low order point", + "name": "low order 6, bit 255 set", + "output": "0000000000000000000000000000000000000000000000000000000000000000", + "scalar": "3479ab3f4a815ceb27a7a5d93db68c8c6400239fa6f94b13e890a5f419191ae6", + "u": "eeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + }, + { + "error": "crypto/ecdh: bad X25519 remote ECDH input: low order point", + "name": "u = p + 0 mod 2^255", + "output": "0000000000000000000000000000000000000000000000000000000000000000", + "scalar": "7910dac61350955dcd4b881b4232aa536f204324e509954804de410c2e7b6648", + "u": "edffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f" + }, + { + "error": "crypto/ecdh: bad X25519 remote ECDH input: low order point", + "name": "u = p + 1 mod 2^255", + "output": "0000000000000000000000000000000000000000000000000000000000000000", + "scalar": "46f0354dcffba979c845e49aec844741d7a7e568422ddc86f67011948af4c7f6", + "u": "eeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f" + }, + { + "name": "u = p + 2 mod 2^255", + "output": "624974b45dac90685249cde40261cc7b4a950dc10f960facf1e95ea8c8f3146f", + "scalar": "c2051a2424ff2c213c465be4b0aad2defd5ab2630621d46cae764ed8830a391f", + "u": "efffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f" + }, + { + "name": "u = p + 18 mod 2^255", + "output": "f129fe54b826f6fdc8d0301f5a22256be9bede985d29c4ef00770df0608bf750", + "scalar": "e5924ff2a6a213b41df4978a09d155e4d7125d912c5f41978ba00f3626d87e5a", + "u": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f" + }, + { + "error": "crypto/ecdh: bad X25519 remote ECDH input: low order point", + "name": "u = p + 19 mod 2^255", + "output": "0000000000000000000000000000000000000000000000000000000000000000", + "scalar": "0d2863f408d895693ebba76261822abd75c60c355131f16ff49c6c2b815cc034", + "u": "0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "error": "crypto/ecdh: bad X25519 remote ECDH input: low order point", + "name": "u = p + 20 mod 2^255", + "output": "0000000000000000000000000000000000000000000000000000000000000000", + "scalar": "ff7b0c0a03c4e5fbf16f3cc2a2b14e469482233e5d4e2ec9a87e41969b24767a", + "u": "0100000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "u = p + 30 mod 2^255", + "output": "d467c36d4047e751e49f4eb90ed9caf575b4c80e0cde7935ca3daeb7c9fc5064", + "scalar": "5425bf939beb9b0aa683afffd5da1fdb26dca64e4e2ee2cadfcf4cdfa42d98b1", + "u": "0b00000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random 0", + "output": "cd2816e2d50e6b6d55a33d38f8ed8a341f8f0382aa5fc29503b3c7e5bcb21f66", + "scalar": "a55560c829f30e9028e6aa124caa050cf6252846f8ebd28978cbfa2f69dec3a3", + "u": "fe9474520e80ecff98a6279e4bd8f8a9b4d52daea109f6d77998984978ecf61d" + }, + { + "name": "random 1", + "output": "db73da1d7ed5f4313b8f390c6a18b4bcb8b19efb0e35cc5356ecfa53aa851153", + "scalar": "c562ccdc2f6a719a43b0a3c848efb3141196f675e6dc6b471928942328aeb6e4", + "u": "c066b06efb1741a9b9c0ca31d85d0b9ee111ee995b8958964890b1885c32750d" + }, + { + "name": "random 2", + "output": "7fb68e60ebedd24ccffa27ca6e9fd089884f22a1d358c5a30feab9872973ef06", + "scalar": "d3e71abb9f8f788884602201eff1240510e5500490278630ca306753c811ee1f", + "u": "88cd7ad7b66d975f921bcaee82779eeab62562e32dd1df7c2a7b4c3eb164bad2" + }, + { + "name": "random 3", + "output": "91acbce245c6251c25139fa348e2fba215b6db7efce0915f5a44a8a0a6882d1e", + "scalar": "c1d443418feb812fdf78a577add3ca68abf29ed5b5e48de88ebb98892d296c49", + "u": "b62b66b8299a7b7515be9e7e5b6a5665b6d2a1292fa91f341d1f40a2c391b258" + }, + { + "name": "random 4", + "output": "9794d5bdbfc86fdb53d74c56bec4c2f72c33527602a8ce14afe2a67a3c8b5c31", + "scalar": "92c35689256d9561901d6b6904a88333222fe2bd72e76bcd3edd0bde0f1d5c0e", + "u": "08d6804d525583bf24233409ee32c610193352e598ff7197173337f1644d5730" + }, + { + "name": "random 5", + "output": "255991ba5e2cd67e9b372b32f0cb07d82bf99e88216c73bea5dfb73afeabfa7b", + "scalar": "acf1cbb8cbc46b1321c5f81cf18abab812ffe02ab0bb422467272a2d4be8b48e", + "u": "27ac0c1426895a58ea0c51644d9f77bc5bce900aca8e121683f8bda046420c73" + }, + { + "name": "random 6", + "output": "0c6a0549be518b06d7413324d8de328ab9a70539b46c065e61f2944a9566cc31", + "scalar": "218a0bf30a546fab0fb20298aa63f3f73db4f6fa8528563327bd0e1c333d23c9", + "u": "b81cdf2afbdcdab3ee8f0edf2abdaa9e42395f5b42d99df67199b6546d460042" + }, + { + "name": "random 7", + "output": "f9111087b2095bded3f53378145781afdf8595220a34964c5c47b23dd6d0a520", + "scalar": "83f257ed52fc0f2a187556a14a5f81cea1b2c36826e3f9201d2c16649e7adc94", + "u": "12d14c17b27b05646d2aee1086d273b774686109ddf2a9caa93b3efc52c46e69" + } + ], + "x25519_iterated": { + "1": "422c8e7a6227d7bca1350b3e2bb7279f7897b87bb6854b783c60e80311ae3079", + "1000": "684cf59ba83309552800ef566f2f4d3c1c3887c49360e3875f2eb94d99532c51", + "description": "RFC 7748 5.2: k = u = 9, then k, u = X25519(k, u), k n times" + } +} +'''; diff --git a/test/vectors/primitives.json b/test/vectors/primitives.json new file mode 100644 index 0000000..1191520 --- /dev/null +++ b/test/vectors/primitives.json @@ -0,0 +1,5185 @@ +{ + "base64": [ + { + "encoding": "std raw strict (age)", + "input": "", + "output": "", + "padded": false, + "strict": true, + "url": false + }, + { + "encoding": "std raw strict (age)", + "error": "illegal base64 data at input byte 0", + "input": "41", + "padded": false, + "strict": true, + "url": false + }, + { + "encoding": "std raw strict (age)", + "input": "4141", + "output": "00", + "padded": false, + "strict": true, + "url": false + }, + { + "encoding": "std raw strict (age)", + "error": "illegal base64 data at input byte 0", + "input": "4142", + "padded": false, + "strict": true, + "url": false + }, + { + "encoding": "std raw strict (age)", + "input": "414141", + "output": "0000", + "padded": false, + "strict": true, + "url": false + }, + { + "encoding": "std raw strict (age)", + "error": "illegal base64 data at input byte 2", + "input": "414142", + "padded": false, + "strict": true, + "url": false + }, + { + "encoding": "std raw strict (age)", + "input": "41414141", + "output": "000000", + "padded": false, + "strict": true, + "url": false + }, + { + "encoding": "std raw strict (age)", + "error": "illegal base64 data at input byte 2", + "input": "41413d3d", + "padded": false, + "strict": true, + "url": false + }, + { + "encoding": "std raw strict (age)", + "error": "illegal base64 data at input byte 3", + "input": "4141413d", + "padded": false, + "strict": true, + "url": false + }, + { + "encoding": "std raw strict (age)", + "error": "illegal base64 data at input byte 1", + "input": "413d3d3d", + "padded": false, + "strict": true, + "url": false + }, + { + "encoding": "std raw strict (age)", + "error": "illegal base64 data at input byte 2", + "input": "41423d3d", + "padded": false, + "strict": true, + "url": false + }, + { + "encoding": "std raw strict (age)", + "error": "illegal base64 data at input byte 3", + "input": "4141423d", + "padded": false, + "strict": true, + "url": false + }, + { + "encoding": "std raw strict (age)", + "error": "illegal base64 data at input byte 0", + "input": "3d", + "padded": false, + "strict": true, + "url": false + }, + { + "encoding": "std raw strict (age)", + "error": "illegal base64 data at input byte 0", + "input": "3d3d", + "padded": false, + "strict": true, + "url": false + }, + { + "encoding": "std raw strict (age)", + "error": "illegal base64 data at input byte 2", + "input": "41413d", + "padded": false, + "strict": true, + "url": false + }, + { + "encoding": "std raw strict (age)", + "error": "illegal base64 data at input byte 2", + "input": "41413d41", + "padded": false, + "strict": true, + "url": false + }, + { + "encoding": "std raw strict (age)", + "error": "illegal base64 data at input byte 2", + "input": "41413d3d41", + "padded": false, + "strict": true, + "url": false + }, + { + "encoding": "std raw strict (age)", + "input": "41410a", + "output": "00", + "padded": false, + "strict": true, + "url": false + }, + { + "encoding": "std raw strict (age)", + "input": "410a41", + "output": "00", + "padded": false, + "strict": true, + "url": false + }, + { + "encoding": "std raw strict (age)", + "input": "41410d0a", + "output": "00", + "padded": false, + "strict": true, + "url": false + }, + { + "encoding": "std raw strict (age)", + "input": "0a41414141", + "output": "000000", + "padded": false, + "strict": true, + "url": false + }, + { + "encoding": "std raw strict (age)", + "input": "5a6d3976", + "output": "666f6f", + "padded": false, + "strict": true, + "url": false + }, + { + "encoding": "std raw strict (age)", + "error": "illegal base64 data at input byte 2", + "input": "5a6d39", + "padded": false, + "strict": true, + "url": false + }, + { + "encoding": "std raw strict (age)", + "input": "5a6d38", + "output": "666f", + "padded": false, + "strict": true, + "url": false + }, + { + "encoding": "std raw strict (age)", + "error": "illegal base64 data at input byte 0", + "input": "5a6d", + "padded": false, + "strict": true, + "url": false + }, + { + "encoding": "std raw strict (age)", + "input": "5a67", + "output": "66", + "padded": false, + "strict": true, + "url": false + }, + { + "encoding": "std raw strict (age)", + "error": "illegal base64 data at input byte 0", + "input": "5a68", + "padded": false, + "strict": true, + "url": false + }, + { + "encoding": "std raw strict (age)", + "error": "illegal base64 data at input byte 0", + "input": "5a", + "padded": false, + "strict": true, + "url": false + }, + { + "encoding": "std raw strict (age)", + "error": "illegal base64 data at input byte 4", + "input": "5a6d39763d", + "padded": false, + "strict": true, + "url": false + }, + { + "encoding": "std raw strict (age)", + "error": "illegal base64 data at input byte 2", + "input": "5a6d8076", + "padded": false, + "strict": true, + "url": false + }, + { + "encoding": "std raw strict (age)", + "error": "illegal base64 data at input byte 0", + "input": "205a6d3976", + "padded": false, + "strict": true, + "url": false + }, + { + "encoding": "std raw strict (age)", + "error": "illegal base64 data at input byte 2", + "input": "5a6d2d76", + "padded": false, + "strict": true, + "url": false + }, + { + "encoding": "std raw strict (age)", + "error": "illegal base64 data at input byte 2", + "input": "5a6d5f76", + "padded": false, + "strict": true, + "url": false + }, + { + "encoding": "std raw strict (age)", + "input": "5a6d2b76", + "output": "666faf", + "padded": false, + "strict": true, + "url": false + }, + { + "encoding": "std raw strict (age)", + "input": "5a6d2f76", + "output": "666fef", + "padded": false, + "strict": true, + "url": false + }, + { + "encoding": "std raw strict (age)", + "input": "5a6d3976596d4679", + "output": "666f6f626172", + "padded": false, + "strict": true, + "url": false + }, + { + "encoding": "std raw strict (age)", + "error": "illegal base64 data at input byte 12", + "input": "5a6d3976596d46795a6d3976216d4679", + "padded": false, + "strict": true, + "url": false + }, + { + "encoding": "std raw strict (age)", + "error": "illegal base64 data at input byte 14", + "input": "5a6d3976596d46795a6d3976596d46", + "padded": false, + "strict": true, + "url": false + }, + { + "encoding": "std raw strict (age)", + "input": "5a6d3976596d46795a6d3976596d45", + "output": "666f6f626172666f6f6261", + "padded": false, + "strict": true, + "url": false + }, + { + "encoding": "std raw strict (age)", + "error": "illegal base64 data at input byte 15", + "input": "5a6d3976596d46795a6d3976596d453d", + "padded": false, + "strict": true, + "url": false + }, + { + "encoding": "std raw strict (age)", + "error": "illegal base64 data at input byte 14", + "input": "5a6d3976596d46795a6d3976596d3d3d", + "padded": false, + "strict": true, + "url": false + }, + { + "encoding": "std raw strict (age)", + "error": "illegal base64 data at input byte 12", + "input": "5a6d3976596d46795a6d3976596d", + "padded": false, + "strict": true, + "url": false + }, + { + "encoding": "std raw strict (age)", + "error": "illegal base64 data at input byte 40", + "input": "5a6d3976596d46795a6d3976596d46795a6d3976596d46795a6d3976596d46795a6d3976596d46792a", + "padded": false, + "strict": true, + "url": false + }, + { + "encoding": "std raw strict (age)", + "error": "illegal base64 data at input byte 4", + "input": "4141414100414141", + "padded": false, + "strict": true, + "url": false + }, + { + "encoding": "std raw strict (age)", + "input": "41414141414141414141414141414141414141414141414141414141414141414141414141414141414141", + "output": "0000000000000000000000000000000000000000000000000000000000000000", + "padded": false, + "strict": true, + "url": false + }, + { + "encoding": "std raw strict (age)", + "error": "illegal base64 data at input byte 42", + "input": "41414141414141414141414141414141414141414141414141414141414141414141414141414141414142", + "padded": false, + "strict": true, + "url": false + }, + { + "encoding": "std padded strict", + "input": "", + "output": "", + "padded": true, + "strict": true, + "url": false + }, + { + "encoding": "std padded strict", + "error": "illegal base64 data at input byte 0", + "input": "41", + "padded": true, + "strict": true, + "url": false + }, + { + "encoding": "std padded strict", + "error": "illegal base64 data at input byte 0", + "input": "4141", + "padded": true, + "strict": true, + "url": false + }, + { + "encoding": "std padded strict", + "error": "illegal base64 data at input byte 0", + "input": "4142", + "padded": true, + "strict": true, + "url": false + }, + { + "encoding": "std padded strict", + "error": "illegal base64 data at input byte 0", + "input": "414141", + "padded": true, + "strict": true, + "url": false + }, + { + "encoding": "std padded strict", + "error": "illegal base64 data at input byte 0", + "input": "414142", + "padded": true, + "strict": true, + "url": false + }, + { + "encoding": "std padded strict", + "input": "41414141", + "output": "000000", + "padded": true, + "strict": true, + "url": false + }, + { + "encoding": "std padded strict", + "input": "41413d3d", + "output": "00", + "padded": true, + "strict": true, + "url": false + }, + { + "encoding": "std padded strict", + "input": "4141413d", + "output": "0000", + "padded": true, + "strict": true, + "url": false + }, + { + "encoding": "std padded strict", + "error": "illegal base64 data at input byte 1", + "input": "413d3d3d", + "padded": true, + "strict": true, + "url": false + }, + { + "encoding": "std padded strict", + "error": "illegal base64 data at input byte 2", + "input": "41423d3d", + "padded": true, + "strict": true, + "url": false + }, + { + "encoding": "std padded strict", + "error": "illegal base64 data at input byte 3", + "input": "4141423d", + "padded": true, + "strict": true, + "url": false + }, + { + "encoding": "std padded strict", + "error": "illegal base64 data at input byte 0", + "input": "3d", + "padded": true, + "strict": true, + "url": false + }, + { + "encoding": "std padded strict", + "error": "illegal base64 data at input byte 0", + "input": "3d3d", + "padded": true, + "strict": true, + "url": false + }, + { + "encoding": "std padded strict", + "error": "illegal base64 data at input byte 3", + "input": "41413d", + "padded": true, + "strict": true, + "url": false + }, + { + "encoding": "std padded strict", + "error": "illegal base64 data at input byte 2", + "input": "41413d41", + "padded": true, + "strict": true, + "url": false + }, + { + "encoding": "std padded strict", + "error": "illegal base64 data at input byte 4", + "input": "41413d3d41", + "padded": true, + "strict": true, + "url": false + }, + { + "encoding": "std padded strict", + "error": "illegal base64 data at input byte 1", + "input": "41410a", + "padded": true, + "strict": true, + "url": false + }, + { + "encoding": "std padded strict", + "error": "illegal base64 data at input byte 1", + "input": "410a41", + "padded": true, + "strict": true, + "url": false + }, + { + "encoding": "std padded strict", + "error": "illegal base64 data at input byte 2", + "input": "41410d0a", + "padded": true, + "strict": true, + "url": false + }, + { + "encoding": "std padded strict", + "input": "0a41414141", + "output": "000000", + "padded": true, + "strict": true, + "url": false + }, + { + "encoding": "std padded strict", + "input": "5a6d3976", + "output": "666f6f", + "padded": true, + "strict": true, + "url": false + }, + { + "encoding": "std padded strict", + "error": "illegal base64 data at input byte 0", + "input": "5a6d39", + "padded": true, + "strict": true, + "url": false + }, + { + "encoding": "std padded strict", + "error": "illegal base64 data at input byte 0", + "input": "5a6d38", + "padded": true, + "strict": true, + "url": false + }, + { + "encoding": "std padded strict", + "error": "illegal base64 data at input byte 0", + "input": "5a6d", + "padded": true, + "strict": true, + "url": false + }, + { + "encoding": "std padded strict", + "error": "illegal base64 data at input byte 0", + "input": "5a67", + "padded": true, + "strict": true, + "url": false + }, + { + "encoding": "std padded strict", + "error": "illegal base64 data at input byte 0", + "input": "5a68", + "padded": true, + "strict": true, + "url": false + }, + { + "encoding": "std padded strict", + "error": "illegal base64 data at input byte 0", + "input": "5a", + "padded": true, + "strict": true, + "url": false + }, + { + "encoding": "std padded strict", + "error": "illegal base64 data at input byte 4", + "input": "5a6d39763d", + "padded": true, + "strict": true, + "url": false + }, + { + "encoding": "std padded strict", + "error": "illegal base64 data at input byte 2", + "input": "5a6d8076", + "padded": true, + "strict": true, + "url": false + }, + { + "encoding": "std padded strict", + "error": "illegal base64 data at input byte 0", + "input": "205a6d3976", + "padded": true, + "strict": true, + "url": false + }, + { + "encoding": "std padded strict", + "error": "illegal base64 data at input byte 2", + "input": "5a6d2d76", + "padded": true, + "strict": true, + "url": false + }, + { + "encoding": "std padded strict", + "error": "illegal base64 data at input byte 2", + "input": "5a6d5f76", + "padded": true, + "strict": true, + "url": false + }, + { + "encoding": "std padded strict", + "input": "5a6d2b76", + "output": "666faf", + "padded": true, + "strict": true, + "url": false + }, + { + "encoding": "std padded strict", + "input": "5a6d2f76", + "output": "666fef", + "padded": true, + "strict": true, + "url": false + }, + { + "encoding": "std padded strict", + "input": "5a6d3976596d4679", + "output": "666f6f626172", + "padded": true, + "strict": true, + "url": false + }, + { + "encoding": "std padded strict", + "error": "illegal base64 data at input byte 12", + "input": "5a6d3976596d46795a6d3976216d4679", + "padded": true, + "strict": true, + "url": false + }, + { + "encoding": "std padded strict", + "error": "illegal base64 data at input byte 12", + "input": "5a6d3976596d46795a6d3976596d46", + "padded": true, + "strict": true, + "url": false + }, + { + "encoding": "std padded strict", + "error": "illegal base64 data at input byte 12", + "input": "5a6d3976596d46795a6d3976596d45", + "padded": true, + "strict": true, + "url": false + }, + { + "encoding": "std padded strict", + "input": "5a6d3976596d46795a6d3976596d453d", + "output": "666f6f626172666f6f6261", + "padded": true, + "strict": true, + "url": false + }, + { + "encoding": "std padded strict", + "error": "illegal base64 data at input byte 14", + "input": "5a6d3976596d46795a6d3976596d3d3d", + "padded": true, + "strict": true, + "url": false + }, + { + "encoding": "std padded strict", + "error": "illegal base64 data at input byte 12", + "input": "5a6d3976596d46795a6d3976596d", + "padded": true, + "strict": true, + "url": false + }, + { + "encoding": "std padded strict", + "error": "illegal base64 data at input byte 40", + "input": "5a6d3976596d46795a6d3976596d46795a6d3976596d46795a6d3976596d46795a6d3976596d46792a", + "padded": true, + "strict": true, + "url": false + }, + { + "encoding": "std padded strict", + "error": "illegal base64 data at input byte 4", + "input": "4141414100414141", + "padded": true, + "strict": true, + "url": false + }, + { + "encoding": "std padded strict", + "error": "illegal base64 data at input byte 40", + "input": "41414141414141414141414141414141414141414141414141414141414141414141414141414141414141", + "padded": true, + "strict": true, + "url": false + }, + { + "encoding": "std padded strict", + "error": "illegal base64 data at input byte 40", + "input": "41414141414141414141414141414141414141414141414141414141414141414141414141414141414142", + "padded": true, + "strict": true, + "url": false + }, + { + "encoding": "url raw strict", + "input": "", + "output": "", + "padded": false, + "strict": true, + "url": true + }, + { + "encoding": "url raw strict", + "error": "illegal base64 data at input byte 0", + "input": "41", + "padded": false, + "strict": true, + "url": true + }, + { + "encoding": "url raw strict", + "input": "4141", + "output": "00", + "padded": false, + "strict": true, + "url": true + }, + { + "encoding": "url raw strict", + "error": "illegal base64 data at input byte 0", + "input": "4142", + "padded": false, + "strict": true, + "url": true + }, + { + "encoding": "url raw strict", + "input": "414141", + "output": "0000", + "padded": false, + "strict": true, + "url": true + }, + { + "encoding": "url raw strict", + "error": "illegal base64 data at input byte 2", + "input": "414142", + "padded": false, + "strict": true, + "url": true + }, + { + "encoding": "url raw strict", + "input": "41414141", + "output": "000000", + "padded": false, + "strict": true, + "url": true + }, + { + "encoding": "url raw strict", + "error": "illegal base64 data at input byte 2", + "input": "41413d3d", + "padded": false, + "strict": true, + "url": true + }, + { + "encoding": "url raw strict", + "error": "illegal base64 data at input byte 3", + "input": "4141413d", + "padded": false, + "strict": true, + "url": true + }, + { + "encoding": "url raw strict", + "error": "illegal base64 data at input byte 1", + "input": "413d3d3d", + "padded": false, + "strict": true, + "url": true + }, + { + "encoding": "url raw strict", + "error": "illegal base64 data at input byte 2", + "input": "41423d3d", + "padded": false, + "strict": true, + "url": true + }, + { + "encoding": "url raw strict", + "error": "illegal base64 data at input byte 3", + "input": "4141423d", + "padded": false, + "strict": true, + "url": true + }, + { + "encoding": "url raw strict", + "error": "illegal base64 data at input byte 0", + "input": "3d", + "padded": false, + "strict": true, + "url": true + }, + { + "encoding": "url raw strict", + "error": "illegal base64 data at input byte 0", + "input": "3d3d", + "padded": false, + "strict": true, + "url": true + }, + { + "encoding": "url raw strict", + "error": "illegal base64 data at input byte 2", + "input": "41413d", + "padded": false, + "strict": true, + "url": true + }, + { + "encoding": "url raw strict", + "error": "illegal base64 data at input byte 2", + "input": "41413d41", + "padded": false, + "strict": true, + "url": true + }, + { + "encoding": "url raw strict", + "error": "illegal base64 data at input byte 2", + "input": "41413d3d41", + "padded": false, + "strict": true, + "url": true + }, + { + "encoding": "url raw strict", + "input": "41410a", + "output": "00", + "padded": false, + "strict": true, + "url": true + }, + { + "encoding": "url raw strict", + "input": "410a41", + "output": "00", + "padded": false, + "strict": true, + "url": true + }, + { + "encoding": "url raw strict", + "input": "41410d0a", + "output": "00", + "padded": false, + "strict": true, + "url": true + }, + { + "encoding": "url raw strict", + "input": "0a41414141", + "output": "000000", + "padded": false, + "strict": true, + "url": true + }, + { + "encoding": "url raw strict", + "input": "5a6d3976", + "output": "666f6f", + "padded": false, + "strict": true, + "url": true + }, + { + "encoding": "url raw strict", + "error": "illegal base64 data at input byte 2", + "input": "5a6d39", + "padded": false, + "strict": true, + "url": true + }, + { + "encoding": "url raw strict", + "input": "5a6d38", + "output": "666f", + "padded": false, + "strict": true, + "url": true + }, + { + "encoding": "url raw strict", + "error": "illegal base64 data at input byte 0", + "input": "5a6d", + "padded": false, + "strict": true, + "url": true + }, + { + "encoding": "url raw strict", + "input": "5a67", + "output": "66", + "padded": false, + "strict": true, + "url": true + }, + { + "encoding": "url raw strict", + "error": "illegal base64 data at input byte 0", + "input": "5a68", + "padded": false, + "strict": true, + "url": true + }, + { + "encoding": "url raw strict", + "error": "illegal base64 data at input byte 0", + "input": "5a", + "padded": false, + "strict": true, + "url": true + }, + { + "encoding": "url raw strict", + "error": "illegal base64 data at input byte 4", + "input": "5a6d39763d", + "padded": false, + "strict": true, + "url": true + }, + { + "encoding": "url raw strict", + "error": "illegal base64 data at input byte 2", + "input": "5a6d8076", + "padded": false, + "strict": true, + "url": true + }, + { + "encoding": "url raw strict", + "error": "illegal base64 data at input byte 0", + "input": "205a6d3976", + "padded": false, + "strict": true, + "url": true + }, + { + "encoding": "url raw strict", + "input": "5a6d2d76", + "output": "666faf", + "padded": false, + "strict": true, + "url": true + }, + { + "encoding": "url raw strict", + "input": "5a6d5f76", + "output": "666fef", + "padded": false, + "strict": true, + "url": true + }, + { + "encoding": "url raw strict", + "error": "illegal base64 data at input byte 2", + "input": "5a6d2b76", + "padded": false, + "strict": true, + "url": true + }, + { + "encoding": "url raw strict", + "error": "illegal base64 data at input byte 2", + "input": "5a6d2f76", + "padded": false, + "strict": true, + "url": true + }, + { + "encoding": "url raw strict", + "input": "5a6d3976596d4679", + "output": "666f6f626172", + "padded": false, + "strict": true, + "url": true + }, + { + "encoding": "url raw strict", + "error": "illegal base64 data at input byte 12", + "input": "5a6d3976596d46795a6d3976216d4679", + "padded": false, + "strict": true, + "url": true + }, + { + "encoding": "url raw strict", + "error": "illegal base64 data at input byte 14", + "input": "5a6d3976596d46795a6d3976596d46", + "padded": false, + "strict": true, + "url": true + }, + { + "encoding": "url raw strict", + "input": "5a6d3976596d46795a6d3976596d45", + "output": "666f6f626172666f6f6261", + "padded": false, + "strict": true, + "url": true + }, + { + "encoding": "url raw strict", + "error": "illegal base64 data at input byte 15", + "input": "5a6d3976596d46795a6d3976596d453d", + "padded": false, + "strict": true, + "url": true + }, + { + "encoding": "url raw strict", + "error": "illegal base64 data at input byte 14", + "input": "5a6d3976596d46795a6d3976596d3d3d", + "padded": false, + "strict": true, + "url": true + }, + { + "encoding": "url raw strict", + "error": "illegal base64 data at input byte 12", + "input": "5a6d3976596d46795a6d3976596d", + "padded": false, + "strict": true, + "url": true + }, + { + "encoding": "url raw strict", + "error": "illegal base64 data at input byte 40", + "input": "5a6d3976596d46795a6d3976596d46795a6d3976596d46795a6d3976596d46795a6d3976596d46792a", + "padded": false, + "strict": true, + "url": true + }, + { + "encoding": "url raw strict", + "error": "illegal base64 data at input byte 4", + "input": "4141414100414141", + "padded": false, + "strict": true, + "url": true + }, + { + "encoding": "url raw strict", + "input": "41414141414141414141414141414141414141414141414141414141414141414141414141414141414141", + "output": "0000000000000000000000000000000000000000000000000000000000000000", + "padded": false, + "strict": true, + "url": true + }, + { + "encoding": "url raw strict", + "error": "illegal base64 data at input byte 42", + "input": "41414141414141414141414141414141414141414141414141414141414141414141414141414141414142", + "padded": false, + "strict": true, + "url": true + }, + { + "encoding": "std padded", + "input": "", + "output": "", + "padded": true, + "strict": false, + "url": false + }, + { + "encoding": "std padded", + "error": "illegal base64 data at input byte 0", + "input": "41", + "padded": true, + "strict": false, + "url": false + }, + { + "encoding": "std padded", + "error": "illegal base64 data at input byte 0", + "input": "4141", + "padded": true, + "strict": false, + "url": false + }, + { + "encoding": "std padded", + "error": "illegal base64 data at input byte 0", + "input": "4142", + "padded": true, + "strict": false, + "url": false + }, + { + "encoding": "std padded", + "error": "illegal base64 data at input byte 0", + "input": "414141", + "padded": true, + "strict": false, + "url": false + }, + { + "encoding": "std padded", + "error": "illegal base64 data at input byte 0", + "input": "414142", + "padded": true, + "strict": false, + "url": false + }, + { + "encoding": "std padded", + "input": "41414141", + "output": "000000", + "padded": true, + "strict": false, + "url": false + }, + { + "encoding": "std padded", + "input": "41413d3d", + "output": "00", + "padded": true, + "strict": false, + "url": false + }, + { + "encoding": "std padded", + "input": "4141413d", + "output": "0000", + "padded": true, + "strict": false, + "url": false + }, + { + "encoding": "std padded", + "error": "illegal base64 data at input byte 1", + "input": "413d3d3d", + "padded": true, + "strict": false, + "url": false + }, + { + "encoding": "std padded", + "input": "41423d3d", + "output": "00", + "padded": true, + "strict": false, + "url": false + }, + { + "encoding": "std padded", + "input": "4141423d", + "output": "0000", + "padded": true, + "strict": false, + "url": false + }, + { + "encoding": "std padded", + "error": "illegal base64 data at input byte 0", + "input": "3d", + "padded": true, + "strict": false, + "url": false + }, + { + "encoding": "std padded", + "error": "illegal base64 data at input byte 0", + "input": "3d3d", + "padded": true, + "strict": false, + "url": false + }, + { + "encoding": "std padded", + "error": "illegal base64 data at input byte 3", + "input": "41413d", + "padded": true, + "strict": false, + "url": false + }, + { + "encoding": "std padded", + "error": "illegal base64 data at input byte 2", + "input": "41413d41", + "padded": true, + "strict": false, + "url": false + }, + { + "encoding": "std padded", + "error": "illegal base64 data at input byte 4", + "input": "41413d3d41", + "padded": true, + "strict": false, + "url": false + }, + { + "encoding": "std padded", + "error": "illegal base64 data at input byte 1", + "input": "41410a", + "padded": true, + "strict": false, + "url": false + }, + { + "encoding": "std padded", + "error": "illegal base64 data at input byte 1", + "input": "410a41", + "padded": true, + "strict": false, + "url": false + }, + { + "encoding": "std padded", + "error": "illegal base64 data at input byte 2", + "input": "41410d0a", + "padded": true, + "strict": false, + "url": false + }, + { + "encoding": "std padded", + "input": "0a41414141", + "output": "000000", + "padded": true, + "strict": false, + "url": false + }, + { + "encoding": "std padded", + "input": "5a6d3976", + "output": "666f6f", + "padded": true, + "strict": false, + "url": false + }, + { + "encoding": "std padded", + "error": "illegal base64 data at input byte 0", + "input": "5a6d39", + "padded": true, + "strict": false, + "url": false + }, + { + "encoding": "std padded", + "error": "illegal base64 data at input byte 0", + "input": "5a6d38", + "padded": true, + "strict": false, + "url": false + }, + { + "encoding": "std padded", + "error": "illegal base64 data at input byte 0", + "input": "5a6d", + "padded": true, + "strict": false, + "url": false + }, + { + "encoding": "std padded", + "error": "illegal base64 data at input byte 0", + "input": "5a67", + "padded": true, + "strict": false, + "url": false + }, + { + "encoding": "std padded", + "error": "illegal base64 data at input byte 0", + "input": "5a68", + "padded": true, + "strict": false, + "url": false + }, + { + "encoding": "std padded", + "error": "illegal base64 data at input byte 0", + "input": "5a", + "padded": true, + "strict": false, + "url": false + }, + { + "encoding": "std padded", + "error": "illegal base64 data at input byte 4", + "input": "5a6d39763d", + "padded": true, + "strict": false, + "url": false + }, + { + "encoding": "std padded", + "error": "illegal base64 data at input byte 2", + "input": "5a6d8076", + "padded": true, + "strict": false, + "url": false + }, + { + "encoding": "std padded", + "error": "illegal base64 data at input byte 0", + "input": "205a6d3976", + "padded": true, + "strict": false, + "url": false + }, + { + "encoding": "std padded", + "error": "illegal base64 data at input byte 2", + "input": "5a6d2d76", + "padded": true, + "strict": false, + "url": false + }, + { + "encoding": "std padded", + "error": "illegal base64 data at input byte 2", + "input": "5a6d5f76", + "padded": true, + "strict": false, + "url": false + }, + { + "encoding": "std padded", + "input": "5a6d2b76", + "output": "666faf", + "padded": true, + "strict": false, + "url": false + }, + { + "encoding": "std padded", + "input": "5a6d2f76", + "output": "666fef", + "padded": true, + "strict": false, + "url": false + }, + { + "encoding": "std padded", + "input": "5a6d3976596d4679", + "output": "666f6f626172", + "padded": true, + "strict": false, + "url": false + }, + { + "encoding": "std padded", + "error": "illegal base64 data at input byte 12", + "input": "5a6d3976596d46795a6d3976216d4679", + "padded": true, + "strict": false, + "url": false + }, + { + "encoding": "std padded", + "error": "illegal base64 data at input byte 12", + "input": "5a6d3976596d46795a6d3976596d46", + "padded": true, + "strict": false, + "url": false + }, + { + "encoding": "std padded", + "error": "illegal base64 data at input byte 12", + "input": "5a6d3976596d46795a6d3976596d45", + "padded": true, + "strict": false, + "url": false + }, + { + "encoding": "std padded", + "input": "5a6d3976596d46795a6d3976596d453d", + "output": "666f6f626172666f6f6261", + "padded": true, + "strict": false, + "url": false + }, + { + "encoding": "std padded", + "input": "5a6d3976596d46795a6d3976596d3d3d", + "output": "666f6f626172666f6f62", + "padded": true, + "strict": false, + "url": false + }, + { + "encoding": "std padded", + "error": "illegal base64 data at input byte 12", + "input": "5a6d3976596d46795a6d3976596d", + "padded": true, + "strict": false, + "url": false + }, + { + "encoding": "std padded", + "error": "illegal base64 data at input byte 40", + "input": "5a6d3976596d46795a6d3976596d46795a6d3976596d46795a6d3976596d46795a6d3976596d46792a", + "padded": true, + "strict": false, + "url": false + }, + { + "encoding": "std padded", + "error": "illegal base64 data at input byte 4", + "input": "4141414100414141", + "padded": true, + "strict": false, + "url": false + }, + { + "encoding": "std padded", + "error": "illegal base64 data at input byte 40", + "input": "41414141414141414141414141414141414141414141414141414141414141414141414141414141414141", + "padded": true, + "strict": false, + "url": false + }, + { + "encoding": "std padded", + "error": "illegal base64 data at input byte 40", + "input": "41414141414141414141414141414141414141414141414141414141414141414141414141414141414142", + "padded": true, + "strict": false, + "url": false + }, + { + "encoding": "url raw", + "input": "", + "output": "", + "padded": false, + "strict": false, + "url": true + }, + { + "encoding": "url raw", + "error": "illegal base64 data at input byte 0", + "input": "41", + "padded": false, + "strict": false, + "url": true + }, + { + "encoding": "url raw", + "input": "4141", + "output": "00", + "padded": false, + "strict": false, + "url": true + }, + { + "encoding": "url raw", + "input": "4142", + "output": "00", + "padded": false, + "strict": false, + "url": true + }, + { + "encoding": "url raw", + "input": "414141", + "output": "0000", + "padded": false, + "strict": false, + "url": true + }, + { + "encoding": "url raw", + "input": "414142", + "output": "0000", + "padded": false, + "strict": false, + "url": true + }, + { + "encoding": "url raw", + "input": "41414141", + "output": "000000", + "padded": false, + "strict": false, + "url": true + }, + { + "encoding": "url raw", + "error": "illegal base64 data at input byte 2", + "input": "41413d3d", + "padded": false, + "strict": false, + "url": true + }, + { + "encoding": "url raw", + "error": "illegal base64 data at input byte 3", + "input": "4141413d", + "padded": false, + "strict": false, + "url": true + }, + { + "encoding": "url raw", + "error": "illegal base64 data at input byte 1", + "input": "413d3d3d", + "padded": false, + "strict": false, + "url": true + }, + { + "encoding": "url raw", + "error": "illegal base64 data at input byte 2", + "input": "41423d3d", + "padded": false, + "strict": false, + "url": true + }, + { + "encoding": "url raw", + "error": "illegal base64 data at input byte 3", + "input": "4141423d", + "padded": false, + "strict": false, + "url": true + }, + { + "encoding": "url raw", + "error": "illegal base64 data at input byte 0", + "input": "3d", + "padded": false, + "strict": false, + "url": true + }, + { + "encoding": "url raw", + "error": "illegal base64 data at input byte 0", + "input": "3d3d", + "padded": false, + "strict": false, + "url": true + }, + { + "encoding": "url raw", + "error": "illegal base64 data at input byte 2", + "input": "41413d", + "padded": false, + "strict": false, + "url": true + }, + { + "encoding": "url raw", + "error": "illegal base64 data at input byte 2", + "input": "41413d41", + "padded": false, + "strict": false, + "url": true + }, + { + "encoding": "url raw", + "error": "illegal base64 data at input byte 2", + "input": "41413d3d41", + "padded": false, + "strict": false, + "url": true + }, + { + "encoding": "url raw", + "input": "41410a", + "output": "00", + "padded": false, + "strict": false, + "url": true + }, + { + "encoding": "url raw", + "input": "410a41", + "output": "00", + "padded": false, + "strict": false, + "url": true + }, + { + "encoding": "url raw", + "input": "41410d0a", + "output": "00", + "padded": false, + "strict": false, + "url": true + }, + { + "encoding": "url raw", + "input": "0a41414141", + "output": "000000", + "padded": false, + "strict": false, + "url": true + }, + { + "encoding": "url raw", + "input": "5a6d3976", + "output": "666f6f", + "padded": false, + "strict": false, + "url": true + }, + { + "encoding": "url raw", + "input": "5a6d39", + "output": "666f", + "padded": false, + "strict": false, + "url": true + }, + { + "encoding": "url raw", + "input": "5a6d38", + "output": "666f", + "padded": false, + "strict": false, + "url": true + }, + { + "encoding": "url raw", + "input": "5a6d", + "output": "66", + "padded": false, + "strict": false, + "url": true + }, + { + "encoding": "url raw", + "input": "5a67", + "output": "66", + "padded": false, + "strict": false, + "url": true + }, + { + "encoding": "url raw", + "input": "5a68", + "output": "66", + "padded": false, + "strict": false, + "url": true + }, + { + "encoding": "url raw", + "error": "illegal base64 data at input byte 0", + "input": "5a", + "padded": false, + "strict": false, + "url": true + }, + { + "encoding": "url raw", + "error": "illegal base64 data at input byte 4", + "input": "5a6d39763d", + "padded": false, + "strict": false, + "url": true + }, + { + "encoding": "url raw", + "error": "illegal base64 data at input byte 2", + "input": "5a6d8076", + "padded": false, + "strict": false, + "url": true + }, + { + "encoding": "url raw", + "error": "illegal base64 data at input byte 0", + "input": "205a6d3976", + "padded": false, + "strict": false, + "url": true + }, + { + "encoding": "url raw", + "input": "5a6d2d76", + "output": "666faf", + "padded": false, + "strict": false, + "url": true + }, + { + "encoding": "url raw", + "input": "5a6d5f76", + "output": "666fef", + "padded": false, + "strict": false, + "url": true + }, + { + "encoding": "url raw", + "error": "illegal base64 data at input byte 2", + "input": "5a6d2b76", + "padded": false, + "strict": false, + "url": true + }, + { + "encoding": "url raw", + "error": "illegal base64 data at input byte 2", + "input": "5a6d2f76", + "padded": false, + "strict": false, + "url": true + }, + { + "encoding": "url raw", + "input": "5a6d3976596d4679", + "output": "666f6f626172", + "padded": false, + "strict": false, + "url": true + }, + { + "encoding": "url raw", + "error": "illegal base64 data at input byte 12", + "input": "5a6d3976596d46795a6d3976216d4679", + "padded": false, + "strict": false, + "url": true + }, + { + "encoding": "url raw", + "input": "5a6d3976596d46795a6d3976596d46", + "output": "666f6f626172666f6f6261", + "padded": false, + "strict": false, + "url": true + }, + { + "encoding": "url raw", + "input": "5a6d3976596d46795a6d3976596d45", + "output": "666f6f626172666f6f6261", + "padded": false, + "strict": false, + "url": true + }, + { + "encoding": "url raw", + "error": "illegal base64 data at input byte 15", + "input": "5a6d3976596d46795a6d3976596d453d", + "padded": false, + "strict": false, + "url": true + }, + { + "encoding": "url raw", + "error": "illegal base64 data at input byte 14", + "input": "5a6d3976596d46795a6d3976596d3d3d", + "padded": false, + "strict": false, + "url": true + }, + { + "encoding": "url raw", + "input": "5a6d3976596d46795a6d3976596d", + "output": "666f6f626172666f6f62", + "padded": false, + "strict": false, + "url": true + }, + { + "encoding": "url raw", + "error": "illegal base64 data at input byte 40", + "input": "5a6d3976596d46795a6d3976596d46795a6d3976596d46795a6d3976596d46795a6d3976596d46792a", + "padded": false, + "strict": false, + "url": true + }, + { + "encoding": "url raw", + "error": "illegal base64 data at input byte 4", + "input": "4141414100414141", + "padded": false, + "strict": false, + "url": true + }, + { + "encoding": "url raw", + "input": "41414141414141414141414141414141414141414141414141414141414141414141414141414141414141", + "output": "0000000000000000000000000000000000000000000000000000000000000000", + "padded": false, + "strict": false, + "url": true + }, + { + "encoding": "url raw", + "input": "41414141414141414141414141414141414141414141414141414141414141414141414141414141414142", + "output": "0000000000000000000000000000000000000000000000000000000000000000", + "padded": false, + "strict": false, + "url": true + } + ], + "bech32": [ + { + "data": "", + "hrp": "age", + "op": "encode", + "output": "age19l388n" + }, + { + "data": "", + "hrp": "AGE-SECRET-KEY-", + "op": "encode", + "output": "AGE-SECRET-KEY-1X8YL4H" + }, + { + "data": "00", + "hrp": "age", + "op": "encode", + "output": "age1qqpexly5" + }, + { + "data": "00", + "hrp": "AGE-SECRET-KEY-", + "op": "encode", + "output": "AGE-SECRET-KEY-1QQW6FGJS" + }, + { + "data": "ff", + "hrp": "age", + "op": "encode", + "output": "age1luyvfgxs" + }, + { + "data": "ff", + "hrp": "AGE-SECRET-KEY-", + "op": "encode", + "output": "AGE-SECRET-KEY-1LUT0XLS5" + }, + { + "data": "acb00892a2", + "hrp": "age", + "op": "encode", + "output": "age14jcq3y4z9rn4zt" + }, + { + "data": "acb00892a2", + "hrp": "AGE-SECRET-KEY-", + "op": "encode", + "output": "AGE-SECRET-KEY-14JCQ3Y4ZDY9V9J" + }, + { + "data": "d5ff28f819d6efb50bb7df5feced132110a02446e570534f39e3d87445300d54", + "hrp": "age", + "op": "encode", + "output": "age16hlj37qe6mhm2zahma07emgnyyg2qfzxu4c9xneeu0v8g3fsp42q88kp02" + }, + { + "data": "d5ff28f819d6efb50bb7df5feced132110a02446e570534f39e3d87445300d54", + "hrp": "AGE-SECRET-KEY-", + "op": "encode", + "output": "AGE-SECRET-KEY-16HLJ37QE6MHM2ZAHMA07EMGNYYG2QFZXU4C9XNEEU0V8G3FSP42Q5G9MLE" + }, + { + "data": "400399fe3238d8f4646714fb3fe3666ead65cec35d522101fea78f07d2c368aaee7fa91f74eebb3deba0a5471e07e782f4d1bddc4cd9781cb6c39bd0", + "hrp": "age", + "op": "encode", + "output": "age1gqpenl3j8rv0ger8znanlcmxd6kktnkrt4fzzq07578s05krdz4wulafra6waweaaws223c7qlnc9ax3hhwyektcrjmv8x7slxztma" + }, + { + "data": "400399fe3238d8f4646714fb3fe3666ead65cec35d522101fea78f07d2c368aaee7fa91f74eebb3deba0a5471e07e782f4d1bddc4cd9781cb6c39bd0", + "hrp": "AGE-SECRET-KEY-", + "op": "encode", + "output": "AGE-SECRET-KEY-1GQPENL3J8RV0GER8ZNANLCMXD6KKTNKRT4FZZQ07578S05KRDZ4WULAFRA6WAWEAAWS223C7QLNC9AX3HHWYEKTCRJMV8X7SQ4MNND" + }, + { + "data": "d5ff28f819d6efb50bb7df5feced132110a02446e570534f39e3d87445300d54", + "error": "invalid HRP: \"\"", + "hrp": "", + "op": "encode" + }, + { + "data": "d5ff28f819d6efb50bb7df5feced132110a02446e570534f39e3d87445300d54", + "error": "mixed case HRP: \"Age\"", + "hrp": "Age", + "op": "encode" + }, + { + "data": "d5ff28f819d6efb50bb7df5feced132110a02446e570534f39e3d87445300d54", + "error": "invalid HRP character: hrp[1]=32", + "hrp": "a b", + "op": "encode" + }, + { + "data": "d5ff28f819d6efb50bb7df5feced132110a02446e570534f39e3d87445300d54", + "error": "invalid HRP character: hrp[0]=233", + "hrp": "é", + "op": "encode" + }, + { + "data": "d5ff28f819d6efb50bb7df5feced132110a02446e570534f39e3d87445300d54", + "hrp": "AGE-SECRET-KEY-", + "input": "AGE-SECRET-KEY-16HLJ37QE6MHM2ZAHMA07EMGNYYG2QFZXU4C9XNEEU0V8G3FSP42Q5G9MLE", + "op": "decode" + }, + { + "data": "d5ff28f819d6efb50bb7df5feced132110a02446e570534f39e3d87445300d54", + "hrp": "age-secret-key-", + "input": "age-secret-key-16hlj37qe6mhm2zahma07emgnyyg2qfzxu4c9xneeu0v8g3fsp42q5g9mle", + "op": "decode" + }, + { + "data": "48220129b64a84db368d4bc4acfbccc5113414d97011f840b68893d53e0d63cf", + "hrp": "age", + "input": "age1fq3qz2dkf2zdkd5df0z2e77vc5gng9xewqglss9k3zfa20sdv08slmnfpg", + "op": "decode" + }, + { + "data": "48220129b64a84db368d4bc4acfbccc5113414d97011f840b68893d53e0d63cf", + "hrp": "AGE", + "input": "AGE1FQ3QZ2DKF2ZDKD5DF0Z2E77VC5GNG9XEWQGLSS9K3ZFA20SDV08SLMNFPG", + "op": "decode" + }, + { + "error": "invalid checksum", + "input": "AGE-SECRET-KEY-16HLJ37QE6MHM2ZAHMA07EMGNYYG2QFZXU4C9XNEEU0V8G3FSP42Q5G9MLQ", + "op": "decode" + }, + { + "error": "invalid checksum", + "input": "AGE-SECRET-KEY-16HLJ37QE6MHM2ZAHMA07EMGNYYG2QFZXU4C9XNEEU0V8G3FSP42Q5G9ML", + "op": "decode" + }, + { + "error": "mixed case", + "input": "AGE-SECRET-KEY-16HLJ37QE6MHM2ZAHMA07EMGNYYG2QFZXU4C9XNEEU0V8G3FSP42Q5G9MLEq", + "op": "decode" + }, + { + "error": "separator '1' at invalid position: pos=-1, len=73", + "input": "AGE-SECRET-KEY-6HLJ37QE6MHM2ZAHMA07EMGNYYG2QFZXU4C9XNEEU0V8G3FSP42Q5G9MLE", + "op": "decode" + }, + { + "error": "separator '1' at invalid position: pos=0, len=59", + "input": "16HLJ37QE6MHM2ZAHMA07EMGNYYG2QFZXU4C9XNEEU0V8G3FSP42Q5G9MLE", + "op": "decode" + }, + { + "error": "invalid checksum", + "input": "A1QQQQQQ", + "op": "decode" + }, + { + "error": "invalid checksum", + "input": "a1qqqqqq", + "op": "decode" + }, + { + "error": "separator '1' at invalid position: pos=1, len=7", + "input": "a1qqqqq", + "op": "decode" + }, + { + "error": "invalid character data part: s[5]=98", + "input": "a1qqqqqb", + "op": "decode" + }, + { + "error": "invalid checksum", + "input": "a1qqqqqqqq", + "op": "decode" + }, + { + "error": "invalid character human-readable part: s[0]=127", + "input": "1qqqqqq", + "op": "decode" + }, + { + "error": "mixed case", + "input": "x1Ẁqqqqqq", + "op": "decode" + }, + { + "error": "invalid character human-readable part: s[0]=233", + "input": "é1qqqqqq", + "op": "decode" + }, + { + "error": "mixed case", + "input": "AGE-SECRET-KEY-1Qa", + "op": "decode" + }, + { + "error": "mixed case", + "input": "age1Bq3qz2dkf2zdkd5df0z2e77vc5gng9xewqglss9k3zfa20sdv08slmnfpg", + "op": "decode" + }, + { + "error": "invalid checksum", + "input": "age1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq", + "op": "decode" + }, + { + "error": "invalid checksum", + "input": "age1qyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgp", + "op": "decode" + }, + { + "error": "illegal zero padding", + "input": "age1psm9pam", + "op": "decode" + }, + { + "error": "non-zero padding", + "input": "age1qpu0j2ex", + "op": "decode" + }, + { + "error": "illegal zero padding", + "input": "age1qqpexly4p", + "op": "decode" + }, + { + "error": "non-zero padding", + "input": "age1ll2lu7g0", + "op": "decode" + } + ], + "chacha20": [ + { + "counter": 1, + "input": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "key": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f", + "name": "RFC 8439 2.3.2", + "nonce": "000000090000004a00000000", + "output": "10f1e7e4d13b5915500fdd1fa32071c4c7d1f4c733c068030422aa9ac3d46c4ed2826446079faa0914c2d705d98b02a2b5129cd1de164eb9cbd083e8a2503c4e" + }, + { + "counter": 1, + "input": "4c616469657320616e642047656e746c656d656e206f662074686520636c617373206f66202739393a204966204920636f756c64206f6666657220796f75206f6e6c79206f6e652074697020666f7220746865206675747572652c2073756e73637265656e20776f756c642062652069742e", + "key": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f", + "name": "RFC 8439 2.4.2", + "nonce": "000000000000004a00000000", + "output": "6e2e359a2568f98041ba0728dd0d6981e97e7aec1d4360c20a27afccfd9fae0bf91b65c5524733ab8f593dabcd62b3571639d624e65152ab8f530c359f0861d807ca0dbf500d6a6156a38e088a22b65e52bc514d16ccf806818ce91ab77937365af90bbf74a35be6b40b8eedf2785e42874d" + }, + { + "counter": 0, + "input": "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "key": "6cf9ba2352ddf19a50ee8d17e94ebedb361b7ebb40ade7c7841f710fc25d5c15", + "name": "counter 0, 3 blocks and a half", + "nonce": "bb341455ff9a8779d2885c9c", + "output": "8ac0ff5fb6381db9ec493048add334e0b74c19e87d897e696195867353356a78ec007deeb1764aa6dee4a9d9cd3cf007fcc7ceb4b6a3c8707bb27ef6118410a513aa0e26aeb7625e267b07b6b76ca1f78f2dccc024812be00691de4ffa49909587e340f21ebbbf0fb1cfba4a61439e3a576dbef763db7d2ce5fdfae329d1bd90dbc856b3bb0d395fd9e64a85ce51ebd1189a63537f0d486ec37405a414e4983621bc101c52a70d69b603f5bc6d0ebba946505a37221d42ad8cf064eb977098c52c8963c44fe47072c346a28bc17dffe968ccc877bfa7b83aecc947e8af2aea0d" + }, + { + "counter": 4294967294, + "input": "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "key": "1527a3454445f1fe40d48cd3113d58188c93528be0284aa3b61ce4e7992f81a4", + "name": "counter near 2^32", + "nonce": "438269dfc886d8ea8c00a5af", + "output": "703b07fe186dbc21269470b35351f9880a1d7425783cd382d41315d87d44a2a156d0536e1f2e43e2cc427e943d085b73fca010c5e554066ed42a6d6917f2e1c5bd8fe12feb26fc412f87c6bf610121f4ab101b2b119c78179d98fe3f2420361e1c99cb83a920332ec690acdc9a48e5b0ae77c8d6863b6b146ff2337e01495020" + } + ], + "chacha20poly1305": [ + { + "aad": "50515253c0c1c2c3c4c5c6c7", + "ciphertext": "d31a8d34648e60db7b86afbc53ef7ec2a4aded51296e08fea9e2b5a736ee62d63dbea45e8ca9671282fafb69da92728b1a71de0a9e060b2905d6a5b67ecd3b3692ddbd7f2d778b8c9803aee328091b58fab324e4fad675945585808b4831d7bc3ff4def08e4b7a9de576d26586cec64b61161ae10b594f09e26a7e902ecbd0600691", + "key": "808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f", + "name": "RFC 8439 2.8.2", + "nonce": "070000004041424344454647", + "plaintext": "4c616469657320616e642047656e746c656d656e206f662074686520636c617373206f66202739393a204966204920636f756c64206f6666657220796f75206f6e6c79206f6e652074697020666f7220746865206675747572652c2073756e73637265656e20776f756c642062652069742e" + }, + { + "aad": "", + "ciphertext": "85824e12b3e65743911078ec9e1934212b629674e4cd1a5ac3af5b952fe2f4b4", + "key": "e587701657fd47ef7c61ec417a119bfd8172050f2cfbc78b9330636907a021bf", + "name": "age: a file key under a zero nonce", + "nonce": "000000000000000000000000", + "plaintext": "8dbfca7bf5d10f3f55da1d728a938929" + }, + { + "aad": "93e2ce43e61cc5a886297470c90737714f73b5aac35a9c182847eda4a3e3f64d10ddaafa", + "ciphertext": "e8d43db85de4a2cbd3d2b0a18f487aed", + "key": "cc04ef49c6fdf826ab66c183f2f75518387bf12c0b3e562131035f79d2ea6dff", + "name": "random, 0 bytes", + "nonce": "1a7f376aa8e27858f2b6b2cd", + "plaintext": "" + }, + { + "aad": "b8731f71a13300b3d4c530c1", + "ciphertext": "86c855e0a6fa5371789010cdbf9515e86d", + "key": "8ab5883b2921461f55892ad33d3da94be4fbae812d61d40d559fc22745bc3316", + "name": "random, 1 bytes", + "nonce": "b690bffa023a9c7a8599de12", + "plaintext": "86" + }, + { + "aad": "b50eed30556437", + "ciphertext": "c461add111f3b11b6d463997c4c9ac4fd4bb31f06187b8f2238b26600bcab8", + "key": "660228c04d84661e344264225d7d7840e0262cad7b877bf3d55bd711b1458919", + "name": "random, 15 bytes", + "nonce": "8d89b139fb41b9b3c788c230", + "plaintext": "59f9bd962fa7bec993d7d18ac96d12" + }, + { + "aad": "5b0340024726fa15234a5ab3c3c67b0b369acdf99299231b3e7b71eccf72d2b1a4bef9", + "ciphertext": "ee68755f2f1d84d4318b0578d79661a7d38c97e3808e18fa5460c488f3af9e64", + "key": "c7405289b88b667cabe6b7555c89876c36902267b6f6305a91ee954d38c26a7c", + "name": "random, 16 bytes", + "nonce": "f3f6fd3411e2e32f7cd09a00", + "plaintext": "5fcf9eb4cd941acea3a1ffbe2c39b257" + }, + { + "aad": "001549eedbb700b9", + "ciphertext": "d231cfd33b6bb7dfdf2cee68beb4023e1a959f9b3aaa1e71cb63e3719ddb73625c", + "key": "99f6581561298f33589a804cdcc6cb4604d0a7d75ac0d1b1c093426cea8c5dcd", + "name": "random, 17 bytes", + "nonce": "9bb49f2dcef2c68ebbb99b84", + "plaintext": "7f5e9c03051711e05ef40c23a7bf3cfbc7" + }, + { + "aad": "66ad25cda8840bfb2fe497b9ad83501f7dd2264b5f8522ee8f48a88560", + "ciphertext": "391e35359912703d6b2e2082a9216ff1d2aa6fc746b48b01bcd27bdeac1e85a5ab20004b809d379b9f9d08a81e123ececa910708f5a046649d8ba6bb57e041b766aaa75c49ff965063f7af4981dba0", + "key": "4c51ec1e7043578d13d60fea012ae98da5aa76adbf5408ac296add63e49203cc", + "name": "random, 63 bytes", + "nonce": "c29bda32cce6e1c06cd97266", + "plaintext": "bdba0a21c8c15d80c4266ffbd4ec28a8dbad0517fb62b657ae8b2d1243699ab107401c526be221bb4f20fa2c63ccacad8e791d89cf8076ef199fe5362a1639" + }, + { + "aad": "", + "ciphertext": "91a7a288b8d6baf643da7e0246fbbaf6e25352e781494b554c994909b1364b0871e71828e840bd9356cdbbb356603ffc5de9be6dabdad6bf8eb78bac42dafb518fdabed6f1000f667e878cab1c189805", + "key": "278944cd0d7c772491d903652458634b6b90cf340d1e3d2a61803981bc74f583", + "name": "random, 64 bytes", + "nonce": "a81c188325e708a8955963f1", + "plaintext": "92fb6e7cde920f10dd28d301f7360b145c7871bc9b9239b660b85305ef077e76b121ebc8e15ad2e606ac2425b248108ceac204badb7fbc5e909a5c9eed86727b" + }, + { + "aad": "65", + "ciphertext": "430901170938440a035914b6d5b44724d26f5edf0c567ee9941122532d723263b4f174fae9688431c00bef37ca5809855c6048aef660ad58a74f95afd941eb0daaad8ce4672678400d1c81800e12bb75c5", + "key": "b502e74ee4926eedab02bc4a9217082b0de882f473b4cf02d14a1c2ecf5c6574", + "name": "random, 65 bytes", + "nonce": "0acad45d18ebd6df3e5e5bcc", + "plaintext": "f7bb513ddb837b9554d91228f689072e4300846efa02ee387b08351e3377c0ece202490dd485744eedbd22faa4744e2ad21c3a5925f53655eaed1a3b76f32a8d5a" + }, + { + "aad": "875616ed550fa39b2286f8c4789ee4f6", + "ciphertext": "7eedf90d044f6d0eb844ea6b8e29d50e3957d4bf98f12d7d71548592a4a60b78d207d21dc760c333e0914f62adcb7f896800e0f5964f00506896e481bddf4c9f84650696a57d6729fc2db491a3f152b5bec6f67f8703b29d37f3f0d4100eff240a494416a44638d34f7af8ce40414ae05320734773338b5ea1a28986e8d3caf9eb64253c635d22d868bdc50998c8b2", + "key": "be9a87860a3055ce90d4aadb558e40c155a5ebb85185b172e6e7f84147971b28", + "name": "random, 127 bytes", + "nonce": "b4f0643a512362f304b0b9bb", + "plaintext": "38acadd9003994230043ae745c308e75c7af983e4eb0f310f61a7f944a39405582684ee1df593c2014f9a6cb67713d289ce496ed7cde95f3636219d7ff90dcd1f8ad665d5d8de60ba1259e9ea8223d73cec9293531e40aea27aebfdd85d7d94857e0192b47c6206e547efac1cc6925c4356a9e6a546a668e0e81dd6f2fb321" + }, + { + "aad": "82d0a9a2350c8058a3a541af24b9e3dae1a9bc6efe9efd83bd7ec4e24e5ac69bfd85c03a", + "ciphertext": "4ed5ccfb374450aa8bb19f99cb6dd56660ca81038b9a1f9ee21ca12aec78619ffaeae62caff711c1f8d0178e5a4cd9871435e2c665c02b0522f913cdb98b00b561333e6cf8876a3023c6e3e7a544cbf3eb7fb6cbbdf1037e9097bb7fa7565775f2d3c28c79572a3dee41c1b7bdc76a449ba0b395b12f7601504a76be848db4be86de2ed54a537e0129d47afcb8c94bee", + "key": "270ae3e0591c199e7e48f76e4e334c0311d7593f1002c3fd19a347e9c589ce29", + "name": "random, 128 bytes", + "nonce": "79e9d8999b84d59461acc26e", + "plaintext": "564acd3f870d09ed871287a613addd994f77223dcd33a556948a2da264aa7e8af118d78fad84835b7e325cc694afeaad2c33023414ed88ec322b3d1a7cd3fcc36eb5f9c29628da5099269607f0f149366bdb8b9e4147e76a9673344c0e8791bae7dd11b298248327f259f1c1e318ba097f34a547fe25eac3e187ff28d54304b2" + }, + { + "aad": "df3274b338d0b6a21dbc1e973d48b571d95d71f89895485f214aa255c7b9b8ceca8f496ffc97be", + "ciphertext": "802aa91f730a0dd1b35206e4b4d49c210180645a8031a3d5e415c7a5b380d54bb474836efa55a1c11474e375b92dac4b6167bf437434fabf60aed63d75195790328b68835f28cbdef4df5d960525fa2c8d43126b213e9e8ec69ae75f3ea15eab547c62168a67b98ba1423139fb91cee7cbc47bbe538e289b3ed92b25aff6d1d1857e38b0dc1f4f6612f3c1c658acc1e159", + "key": "0e90a2204efe54bb0f0c2c0c98f61e0f57bd175bd9d08d68c64746fd4b723a1e", + "name": "random, 129 bytes", + "nonce": "171ccc27231ff8bf07e87690", + "plaintext": "ab7b1d1ec61eb45ce961725a8581ee475316aeb1aa621da836ef8596740e92f8a32df6829b4b483448d03934e8848676101d8189711dd17a3dca37e79d14a8c34ef490717e417a8339e97b58cd90399c3d5e61c9f0e7eda0ee5d9370d6d1f5c30d6eb3e42f6534fbdf6270921ccf8506ade5dbfaf144a55848c1f0a415fa55d754" + }, + { + "aad": "7793f86a24603c7639a68e4b3b5eecff833061", + "ciphertext": "a8acbc758259f3aa4083c7bec101f589a1539ca77f303c1f177ce6451b386918c5642a323987fc28e59cdc1c5a7a7fd3e987fada050f6b67ba7b4ff874c27050ce0659f14f9377a843bd308d103ab1248a071c93e78c4abaaeaf5c309d76d6388880da6f5922a34f3253e3b55046d638306d8587c9733658385d209cc3ef79c8227c0b2afc115345561c4b181db1019b9c9e6de453a0c2eb0324199f898f440f3d23c4dfee9f4eb12ba81fcedb44d9431e8511944285a84219979fb3f80033ce4c55c948207a589add3d83f92bc3ca3cc158b53d0a08c0433c2aed2706e571db4d68958ad7432e1a7e6d1a01d104678a2c80c517d7abf853773a6659b78c9513c2a96d5d54f738b9f513bb6c10ad2bf06ee00b02aadd14322d21c67ba9ad9c3640f6fd32bfa2e4e9c26e509e6ce6e0f8ac47efe23666a15b4dff801f", + "key": "472a5ab07b15d6816f3d13d41c823a60542486961846425b0ede56adad22035d", + "name": "random, 300 bytes", + "nonce": "6c4e4642dc72b7b42c5aa412", + "plaintext": "9ed006dd0b1af799b9ac9c4febd6b4e458810628b864ff46686e2301c1595838e07b537e776b7fed7b16ecebe9d9653448ae6bedd9f8c2b0a322cae441c61eefd4905623cb16f11c47eb9f30e0cec76338185b5369e801279579ea88cceba526fc6098c53f23c6ea5074f7806fa9f0f98485e92c1e0b88e6e47255a6082481e9443dad66e255acf3e6790f3c08f8dc112ca12e41df0cab627bec73b96ce4aaa35f7950d245587a2c8c4e43ed81313731ef2d545307f85e1e9a23605ad9dc1e70e7d987cb2b12c14ee1d4c953d15ddaa1e5d83efb6fff18fc4ed68053bd492ae978cdf99628ebf23f3a960a89ce6f5c881d2f66710349eaa09b6cf0e6eb5442a86d34fc3c9ecf04c396be6badbf230dfca73659384242290ccbecb5b348112c26cb48438fd485812fce40f1e3" + }, + { + "aad": "442dd1f053621ad6b4f4ec6725be7548e93c7d31aa3566694917969bf009cf88a95370057657", + "ciphertext": "169cbdc9322d82615b87636a7aacae7529d8cea0b980f5fc157e4bd4c7b38c6437c6b67845a33b59287a1e5edfd1c0f8a1f5fc89a9204c35c3d3134c236438270082186d30bbbe40fa15fba4e5e76dc2269f68146d009776aac7363f90e7bc4d25bda3ddfdfb0df9cacfc02414a36e38559e4a02b1500a5b77822b5a8ba4312bfcd205bcd9484e6f41ccfad488ee50fe84528443cb2a7bc173f1679fe998ce0f5d0a1352fab1073c6cf19659ab39573781d85fd354b3736e5b509cc1f92cd8b6b957eec87f32c5a553e43ca608eb0acf798b20533f3c36f8b00fa438605b03af5114d2124306ab80cd203d5553b5446d21c559b5d97421798be066f5ca4b742a84a2f466230b49bf84778e6b3785e6b84e2fe31bb36b094269ca0581f8bd315b4151a6e6aeb5e2ac140f48566c398f1b0d75a0868968624dab31fee4f7876ca0f02b1f4010fd1f6113e400e2ac877779241d5adbe99a5ec26edd6a973037b4c9245572f40c2bd5a484c0e153617c986b16df60b0f7f53e87d2ca7d78e40c2e02b067038c610c38b50e84968fd1da3c14715d5e0a0fc3d84dc7bf5dafe82355b5bfed90a038c61158ca08891b3281cc15e9e529bee9ee63c55daa801fbf0ccc6fed737a64f3e6a35251e8132e2a36ef0c262a0c42277f0789f5827715965e7624050b55c58ffc657942a2aa1df5dc34a1c7923407730ef0db91a2699c62e878fbbe6a3510487bb435627baefadc3ab6e9d803d39cc5737819c3d1d8d0f4b4a423dde7542705521983628856f1dcbe722f8c08d049b1d35d4c813576a11ef22d4b144624d2bc925ee85c4add5421a92e2842e65f2153a68ba3d161c1251e793b660667f8dc434646ad918d208bea96630dad5458db47a8f1852bc5978cc352e8c828aab1159f8e3f58875fb9b946e0bd9ff7c9bf87e19a3cd4a5d21468302c98907e2e20c0d70021ba7d21089b73e935282b350e31819eb0187c11dce1ea13b56c10e14923548b19a3b27d36c5213efbdc2dbfa0934703d40cbdb0fdee7351caefe485d6a8e5786f46dbaae93cafb27226dff326b1412245c06640c8c4b74c25c52f045e32abd446b338722266b001c70ec13e77ae7794ca9144ee6722a4e04893874a4f94792c9a777979c6a9926d7a6b14c18aca2eef98ca92ac906df3e663801535f78c18544bba4d01ac6c731bfac39fa3a4a59342cad4b806f0265cf0937e371400298915335322988ae420d160790960a3574a420c6551752cde9d67e959c94d1f1845694f02de2452065fdd9656fe3425fba74a555d9ab175913906a8a56aeabe88c2cec5399b68b26141141c6edb31e0b524804d470685bbe1f4470aaff8b2bd35ce78f44e83a46b277c3a78bd6bd46f191515f024b767d02e592ebcaddc6fdc84b86d3e07b12db274950fdf482deed1921fcca126", + "key": "5d24d21f5ecc1c4b3c1054fc1acadb67e732983e082f8b0e620fc60ea6448baf", + "name": "random, 1000 bytes", + "nonce": "454e6f5a569780e5fd9bf02b", + "plaintext": "a5869cd013ebd813e8da704d295198ace99e038e11bec729faabeaf2180d1eff9a8d64dfaaafe8c7ea3ca2b810eaf451c87f15ffbc4a9546f98ec83eb59620842b60a79a835f6e99913ef5b1592774232f168192b2a289fd2e34b77c8788b6221616228a13d3d7bd882ff30727e6f09ac0574ec882335a531243715028a029f69e948951e2b4bc490f08588772542bbec0489ecea3013549424a4ad8b2b317d0b2d9ef17763c95e8819ba8df08a93db85bb9e66d4bf0fcc3ee6c2aea64b5544f65f132f0db8fcd0e1814c8a64b860218eb99f700767d2f1750ef111dd7415703ccee72e9ae2033ae0d17ac12443157f879211c51f0cb629ea127bcd0267fef925f4189cac52d269ab5db25efdd128d68b6360a32434ba2779eacae7e0934feaafec7ff02b44f291f80c5049d46f847c8c0ad2a35911d1985f8f26a6c228af3d77e4158d866f951a54abae2e1c945738cb0bbe4eedd6ffddcca1ddbdbf10c5700325b159728728ae1130b5490bf7200497a16c465e20b6c9f5746954a955dde1a40c1f8312777171c779932da6bc329764e08949c4afac05db55cffdc6a740e3967e5a178b519a5eec73e7d885ea9c5764a5aa55ef20a6139bcc2c0942ba87a2d61e874af926a40930c97a91483c1e467c80860ff7956454953718903cf104c564fe30d20619d4ed63218a8f3d9eb6b86579a52c103be646fbfe2399370d8c114d9d30d4d869b72b52bd9c0234ac056ae1d32d5cfab9d89f2d724007cdef738850d82315e5f919479c0d9e400ac5959480d878409ae6bb032ddc1bd1b856b04223c988c6af05321de8132f0cdf30ea3f8e0a9ee0df31f9a157ec08b9b845eddd3a64742cab203d972b44886b5e2e082be19bc2d7adde19a2dd81379997b0257b06bf0f055bb3ac3d626358e0d898c57085ca6311974253ec687499be73191c26ce36a9c6862812b74ebc996dfc8470674306e3d2957428caf929e2d9247257ca20f1a76265948edcd6714eeeb1747660e85c2497730a7a364c0babbc335807aeaca8a5ee128f43cb14ad86158c5c0257ee41f881b3b420b25554a2c688baaafccaf53bcbf7c8d06d98550520200d40d482fbbd6edc35b9c51f76d7c68a797f6cde1a7aaac747a0c7e56a512af60115e8a2d14c09a9a253455173d3a4608adc5d7602b710d669e7c9ebe57735901b83c9a23136a77045c680d9dfab23e4808660b5eed9d14e5f933cbff000a200c9725a2bda74e2c59613d390435e86298480f7e24db9f477d41a5ffa693c8686ad0128d323dafb1fdeeb846b226ed13fcb0cd23a5bb8d467cace77dc9b8df13ff5da8332681b8949bc61b1061a819bb29bc2826c3b8a8cfef56d2b2fe48e4907d2340f61256109beab68462ef0995248afc305f8bf98628480591ab" + } + ], + "description": "Vectors of the primitives of stage 2 of datekeys-dart. Every expected value is computed by tool/gen_primitive_vectors.go with Go go1.26.8, golang.org/x/crypto v0.57.0 and codec/bech32 of datekeys-go; the inputs are those of the RFCs, taken from the tests of Go and x/crypto where they are, plus edge cases and seeded random ones. Binary values are lowercase hex. `node` marks the cases cheap enough to run compiled to JavaScript.", + "ed25519": [ + { + "message": "", + "name": "sign.input line 0", + "public_key": "d75a980182b10ab7d54bfed3c964073a0ee172f3daa62325af021a68f707511a", + "signature": "e5564300c360ac729086e2cc806e828a84877f1eb8e5d974d873e065224901555fb8821590a33bacc61e39701cf9b46bd25bf5f0595bbe24655141438e7a100b", + "stdlib": true, + "valid": true + }, + { + "message": "", + "name": "sign.input line 0, R changed", + "public_key": "d75a980182b10ab7d54bfed3c964073a0ee172f3daa62325af021a68f707511a", + "signature": "e4564300c360ac729086e2cc806e828a84877f1eb8e5d974d873e065224901555fb8821590a33bacc61e39701cf9b46bd25bf5f0595bbe24655141438e7a100b", + "stdlib": false, + "valid": false + }, + { + "message": "", + "name": "sign.input line 0, S changed", + "public_key": "d75a980182b10ab7d54bfed3c964073a0ee172f3daa62325af021a68f707511a", + "signature": "e5564300c360ac729086e2cc806e828a84877f1eb8e5d974d873e065224901555eb8821590a33bacc61e39701cf9b46bd25bf5f0595bbe24655141438e7a100b", + "stdlib": false, + "valid": false + }, + { + "message": "", + "name": "sign.input line 0, S top byte changed", + "public_key": "d75a980182b10ab7d54bfed3c964073a0ee172f3daa62325af021a68f707511a", + "signature": "e5564300c360ac729086e2cc806e828a84877f1eb8e5d974d873e065224901555fb8821590a33bacc61e39701cf9b46bd25bf5f0595bbe24655141438e7a100a", + "stdlib": false, + "valid": false + }, + { + "message": "", + "name": "sign.input line 0, A changed", + "public_key": "d75a980182b00ab7d54bfed3c964073a0ee172f3daa62325af021a68f707511a", + "signature": "e5564300c360ac729086e2cc806e828a84877f1eb8e5d974d873e065224901555fb8821590a33bacc61e39701cf9b46bd25bf5f0595bbe24655141438e7a100b", + "stdlib": false, + "valid": false + }, + { + "message": "72", + "name": "sign.input line 1", + "public_key": "3d4017c3e843895a92b70aa74d1b7ebc9c982ccf2ec4968cc0cd55f12af4660c", + "signature": "92a009a9f0d4cab8720e820b5f642540a2b27b5416503f8fb3762223ebdb69da085ac1e43e15996e458f3613d0f11d8c387b2eaeb4302aeeb00d291612bb0c00", + "stdlib": true, + "valid": true + }, + { + "message": "af82", + "name": "sign.input line 2", + "public_key": "fc51cd8e6218a1a38da47ed00230f0580816ed13ba3303ac5deb911548908025", + "signature": "6291d657deec24024827e69c3abe01a30ce548a284743a445e3680d7db5ac3ac18ff9b538d16f290ae67f760984dc6594a7c15e9716ed28dc027beceea1ec40a", + "stdlib": true, + "valid": true + }, + { + "message": "cbc77b", + "name": "sign.input line 3", + "public_key": "e61a185bcef2613a6c7cb79763ce945d3b245d76114dd440bcf5f2dc1aa57057", + "signature": "d9868d52c2bebce5f3fa5a79891970f309cb6591e3e1702a70276fa97c24b3a8e58606c38c9758529da50ee31b8219cba45271c689afa60b0ea26c99db19b00c", + "stdlib": true, + "valid": true + }, + { + "message": "5f4c8989", + "name": "sign.input line 4", + "public_key": "c0dac102c4533186e25dc43128472353eaabdb878b152aeb8e001f92d90233a7", + "signature": "124f6fc6b0d100842769e71bd530664d888df8507df6c56dedfdb509aeb93416e26b918d38aa06305df3095697c18b2aa832eaa52edc0ae49fbae5a85e150c07", + "stdlib": true, + "valid": true + }, + { + "message": "18b6bec097", + "name": "sign.input line 5", + "public_key": "e253af0766804b869bb1595be9765b534886bbaab8305bf50dbc7f899bfb5f01", + "signature": "b2fc46ad47af464478c199e1f8be169f1be6327c7f9a0a6689371ca94caf04064a01b22aff1520abd58951341603faed768cf78ce97ae7b038abfe456aa17c09", + "stdlib": true, + "valid": true + }, + { + "message": "89010d855972", + "name": "sign.input line 6", + "public_key": "fbcfbfa40505d7f2be444a33d185cc54e16d615260e1640b2b5087b83ee3643d", + "signature": "6ed629fc1d9ce9e1468755ff636d5a3f40a5d9c91afd93b79d241830f7e5fa29854b8f20cc6eecbb248dbd8d16d14e99752194e4904d09c74d639518839d2300", + "stdlib": true, + "valid": true + }, + { + "message": "b4a8f381e70e7a", + "name": "sign.input line 7", + "public_key": "98a5e3a36e67aaba89888bf093de1ad963e774013b3902bfab356d8b90178a63", + "signature": "6e0af2fe55ae377a6b7a7278edfb419bd321e06d0df5e27037db8812e7e3529810fa5552f6c0020985ca17a0e02e036d7b222a24f99b77b75fdd16cb05568107", + "stdlib": true, + "valid": true + }, + { + "message": "4284abc51bb67235", + "name": "sign.input line 8", + "public_key": "f81fb54a825fced95eb033afcd64314075abfb0abd20a970892503436f34b863", + "signature": "d6addec5afb0528ac17bb178d3e7f2887f9adbb1ad16e110545ef3bc57f9de2314a5c8388f723b8907be0f3ac90c6259bbe885ecc17645df3db7d488f805fa08", + "stdlib": true, + "valid": true + }, + { + "message": "4284abc51bb67235", + "name": "sign.input line 8, R changed", + "public_key": "f81fb54a825fced95eb033afcd64314075abfb0abd20a970892503436f34b863", + "signature": "d7addec5afb0528ac17bb178d3e7f2887f9adbb1ad16e110545ef3bc57f9de2314a5c8388f723b8907be0f3ac90c6259bbe885ecc17645df3db7d488f805fa08", + "stdlib": false, + "valid": false + }, + { + "message": "4284abc51bb67235", + "name": "sign.input line 8, S changed", + "public_key": "f81fb54a825fced95eb033afcd64314075abfb0abd20a970892503436f34b863", + "signature": "d6addec5afb0528ac17bb178d3e7f2887f9adbb1ad16e110545ef3bc57f9de2315a5c8388f723b8907be0f3ac90c6259bbe885ecc17645df3db7d488f805fa08", + "stdlib": false, + "valid": false + }, + { + "message": "4284abc51bb67235", + "name": "sign.input line 8, S top byte changed", + "public_key": "f81fb54a825fced95eb033afcd64314075abfb0abd20a970892503436f34b863", + "signature": "d6addec5afb0528ac17bb178d3e7f2887f9adbb1ad16e110545ef3bc57f9de2314a5c8388f723b8907be0f3ac90c6259bbe885ecc17645df3db7d488f805fa09", + "stdlib": false, + "valid": false + }, + { + "message": "4284abc51bb67235", + "name": "sign.input line 8, A changed", + "public_key": "f81fb54a825eced95eb033afcd64314075abfb0abd20a970892503436f34b863", + "signature": "d6addec5afb0528ac17bb178d3e7f2887f9adbb1ad16e110545ef3bc57f9de2314a5c8388f723b8907be0f3ac90c6259bbe885ecc17645df3db7d488f805fa08", + "stdlib": false, + "valid": false + }, + { + "message": "4384abc51bb67235", + "name": "sign.input line 8, message changed", + "public_key": "f81fb54a825fced95eb033afcd64314075abfb0abd20a970892503436f34b863", + "signature": "d6addec5afb0528ac17bb178d3e7f2887f9adbb1ad16e110545ef3bc57f9de2314a5c8388f723b8907be0f3ac90c6259bbe885ecc17645df3db7d488f805fa08", + "stdlib": false, + "valid": false + }, + { + "message": "672bf8965d04bc5146", + "name": "sign.input line 9", + "public_key": "c1a49c66e617f9ef5ec66bc4c6564ca33de2a5fb5e1464062e6d6c6219155efd", + "signature": "2c76a04af2391c147082e33faacdbe56642a1e134bd388620b852b901a6bc16ff6c9cc9404c41dea12ed281da067a1513866f9d964f8bdd24953856c50042901", + "stdlib": true, + "valid": true + }, + { + "message": "33d7a786aded8c1bf691", + "name": "sign.input line 10", + "public_key": "31b2524b8348f7ab1dfafa675cc538e9a84e3fe5819e27c12ad8bbc1a36e4dff", + "signature": "28e4598c415ae9de01f03f9f3fab4e919e8bf537dd2b0cdf6e79b9e6559c9409d9151a4c40f083193937627c369488259e99da5a9f0a87497fa6696a5dd6ce08", + "stdlib": true, + "valid": true + }, + { + "message": "3486f68848a65a0eb5507d", + "name": "sign.input line 11", + "public_key": "44b57ee30cdb55829d0a5d4f046baef078f1e97a7f21b62d75f8e96ea139c35f", + "signature": "77d389e599630d934076329583cd4105a649a9292abc44cd28c40000c8e2f5ac7660a81c85b72af8452d7d25c070861dae91601c7803d656531650dd4e5c4100", + "stdlib": true, + "valid": true + }, + { + "message": "5a8d9d0a22357e6655f9c785", + "name": "sign.input line 12", + "public_key": "6fe83693d011d111131c4f3fbaaa40a9d3d76b30012ff73bb0e39ec27ab18257", + "signature": "0f9ad9793033a2fa06614b277d37381e6d94f65ac2a5a94558d09ed6ce922258c1a567952e863ac94297aec3c0d0c8ddf71084e504860bb6ba27449b55adc40e", + "stdlib": true, + "valid": true + }, + { + "message": "b87d3813e03f58cf19fd0b6395", + "name": "sign.input line 13", + "public_key": "a2eb8c0501e30bae0cf842d2bde8dec7386f6b7fc3981b8c57c9792bb94cf2dd", + "signature": "d8bb64aad8c9955a115a793addd24f7f2b077648714f49c4694ec995b330d09d640df310f447fd7b6cb5c14f9fe9f490bcf8cfadbfd2169c8ac20d3b8af49a0c", + "stdlib": true, + "valid": true + }, + { + "message": "55c7fa434f5ed8cdec2b7aeac173", + "name": "sign.input line 14", + "public_key": "cf3af898467a5b7a52d33d53bc037e2642a8da996903fc252217e9c033e2f291", + "signature": "6ee3fe81e23c60eb2312b2006b3b25e6838e02106623f844c44edb8dafd66ab0671087fd195df5b8f58a1d6e52af42908053d55c7321010092748795ef94cf06", + "stdlib": true, + "valid": true + }, + { + "message": "0a688e79be24f866286d4646b5d81c", + "name": "sign.input line 15", + "public_key": "fd2a565723163e29f53c9de3d5e8fbe36a7ab66e1439ec4eae9c0a604af291a5", + "signature": "f68d04847e5b249737899c014d31c805c5007a62c0a10d50bb1538c5f35503951fbc1e08682f2cc0c92efe8f4985dec61dcbd54d4b94a22547d24451271c8b00", + "stdlib": true, + "valid": true + }, + { + "message": "c942fa7ac6b23ab7ff612fdc8e68ef39", + "name": "sign.input line 16", + "public_key": "34e5a8508c4743746962c066e4badea2201b8ab484de5c4f94476ccd2143955b", + "signature": "2a3d27dc40d0a8127949a3b7f908b3688f63b7f14f651aacd715940bdbe27a0809aac142f47ab0e1e44fa490ba87ce5392f33a891539caf1ef4c367cae54500c", + "stdlib": true, + "valid": true + }, + { + "message": "c942fa7ac6b23ab7ff612fdc8e68ef39", + "name": "sign.input line 16, R changed", + "public_key": "34e5a8508c4743746962c066e4badea2201b8ab484de5c4f94476ccd2143955b", + "signature": "2b3d27dc40d0a8127949a3b7f908b3688f63b7f14f651aacd715940bdbe27a0809aac142f47ab0e1e44fa490ba87ce5392f33a891539caf1ef4c367cae54500c", + "stdlib": false, + "valid": false + }, + { + "message": "c942fa7ac6b23ab7ff612fdc8e68ef39", + "name": "sign.input line 16, S changed", + "public_key": "34e5a8508c4743746962c066e4badea2201b8ab484de5c4f94476ccd2143955b", + "signature": "2a3d27dc40d0a8127949a3b7f908b3688f63b7f14f651aacd715940bdbe27a0808aac142f47ab0e1e44fa490ba87ce5392f33a891539caf1ef4c367cae54500c", + "stdlib": false, + "valid": false + }, + { + "message": "c942fa7ac6b23ab7ff612fdc8e68ef39", + "name": "sign.input line 16, S top byte changed", + "public_key": "34e5a8508c4743746962c066e4badea2201b8ab484de5c4f94476ccd2143955b", + "signature": "2a3d27dc40d0a8127949a3b7f908b3688f63b7f14f651aacd715940bdbe27a0809aac142f47ab0e1e44fa490ba87ce5392f33a891539caf1ef4c367cae54500d", + "stdlib": false, + "valid": false + }, + { + "message": "c942fa7ac6b23ab7ff612fdc8e68ef39", + "name": "sign.input line 16, A changed", + "public_key": "34e5a8508c4643746962c066e4badea2201b8ab484de5c4f94476ccd2143955b", + "signature": "2a3d27dc40d0a8127949a3b7f908b3688f63b7f14f651aacd715940bdbe27a0809aac142f47ab0e1e44fa490ba87ce5392f33a891539caf1ef4c367cae54500c", + "stdlib": false, + "valid": false + }, + { + "message": "c842fa7ac6b23ab7ff612fdc8e68ef39", + "name": "sign.input line 16, message changed", + "public_key": "34e5a8508c4743746962c066e4badea2201b8ab484de5c4f94476ccd2143955b", + "signature": "2a3d27dc40d0a8127949a3b7f908b3688f63b7f14f651aacd715940bdbe27a0809aac142f47ab0e1e44fa490ba87ce5392f33a891539caf1ef4c367cae54500c", + "stdlib": false, + "valid": false + }, + { + "message": "7368724a5b0efb57d28d97622dbde725af", + "name": "sign.input line 17", + "public_key": "0445e456dacc7d5b0bbed23c8200cdb74bdcb03e4c7b73f0a2b9b46eac5d4372", + "signature": "3653ccb21219202b8436fb41a32ba2618c4a133431e6e63463ceb3b6106c4d56e1d2ba165ba76eaad3dc39bffb130f1de3d8e6427db5b71938db4e272bc3e20b", + "stdlib": true, + "valid": true + }, + { + "message": "bd8e05033f3a8bcdcbf4beceb70901c82e31", + "name": "sign.input line 18", + "public_key": "74d29127f199d86a8676aec33b4ce3f225ccb191f52c191ccd1e8cca65213a6b", + "signature": "fbe929d743a03c17910575492f3092ee2a2bf14a60a3fcacec74a58c7334510fc262db582791322d6c8c41f1700adb80027ecabc14270b703444ae3ee7623e0a", + "stdlib": true, + "valid": true + }, + { + "message": "8171456f8b907189b1d779e26bc5afbb08c67a", + "name": "sign.input line 19", + "public_key": "5b96dca497875bf9664c5e75facf3f9bc54bae913d66ca15ee85f1491ca24d2c", + "signature": "73bca64e9dd0db88138eedfafcea8f5436cfb74bfb0e7733cf349baa0c49775c56d5934e1d38e36f39b7c5beb0a836510c45126f8ec4b6810519905b0ca07c09", + "stdlib": true, + "valid": true + }, + { + "message": "8ba6a4c9a15a244a9c26bb2a59b1026f21348b49", + "name": "sign.input line 20", + "public_key": "1ca281938529896535a7714e3584085b86ef9fec723f42819fc8dd5d8c00817f", + "signature": "a1adc2bc6a2d980662677e7fdff6424de7dba50f5795ca90fdf3e96e256f3285cac71d3360482e993d0294ba4ec7440c61affdf35fe83e6e04263937db93f105", + "stdlib": true, + "valid": true + }, + { + "message": "1d566a6232bbaab3e6d8804bb518a498ed0f904986", + "name": "sign.input line 21", + "public_key": "7fae45dd0a05971026d410bc497af5be7d0827a82a145c203f625dfcb8b03ba8", + "signature": "bb61cf84de61862207c6a455258bc4db4e15eea0317ff88718b882a06b5cf6ec6fd20c5a269e5d5c805bafbcc579e2590af414c7c227273c102a10070cdfe80f", + "stdlib": true, + "valid": true + }, + { + "message": "1b0afb0ac4ba9ab7b7172cddc9eb42bba1a64bce47d4", + "name": "sign.input line 22", + "public_key": "48359b850d23f0715d94bb8bb75e7e14322eaf14f06f28a805403fbda002fc85", + "signature": "b6dcd09989dfbac54322a3ce87876e1d62134da998c79d24b50bd7a6a797d86a0e14dc9d7491d6c14a673c652cfbec9f962a38c945da3b2f0879d0b68a921300", + "stdlib": true, + "valid": true + }, + { + "message": "507c94c8820d2a5793cbf3442b3d71936f35fe3afef316", + "name": "sign.input line 23", + "public_key": "fdb30673402faf1c8033714f3517e47cc0f91fe70cf3836d6c23636e3fd2287c", + "signature": "7ef66e5e86f2360848e0014e94880ae2920ad8a3185a46b35d1e07dea8fa8ae4f6b843ba174d99fa7986654a0891c12a794455669375bf92af4cc2770b579e0c", + "stdlib": true, + "valid": true + }, + { + "message": "d3d615a8472d9962bb70c5b5466a3d983a4811046e2a0ef5", + "name": "sign.input line 24", + "public_key": "b1d39801892027d58a8c64335163195893bfc1b61dbeca3260497e1f30371107", + "signature": "836afa764d9c48aa4770a4388b654e97b3c16f082967febca27f2fc47ddfd9244b03cfc729698acf5109704346b60b230f255430089ddc56912399d1122de70a", + "stdlib": true, + "valid": true + }, + { + "message": "d3d615a8472d9962bb70c5b5466a3d983a4811046e2a0ef5", + "name": "sign.input line 24, R changed", + "public_key": "b1d39801892027d58a8c64335163195893bfc1b61dbeca3260497e1f30371107", + "signature": "826afa764d9c48aa4770a4388b654e97b3c16f082967febca27f2fc47ddfd9244b03cfc729698acf5109704346b60b230f255430089ddc56912399d1122de70a", + "stdlib": false, + "valid": false + }, + { + "message": "d3d615a8472d9962bb70c5b5466a3d983a4811046e2a0ef5", + "name": "sign.input line 24, S changed", + "public_key": "b1d39801892027d58a8c64335163195893bfc1b61dbeca3260497e1f30371107", + "signature": "836afa764d9c48aa4770a4388b654e97b3c16f082967febca27f2fc47ddfd9244a03cfc729698acf5109704346b60b230f255430089ddc56912399d1122de70a", + "stdlib": false, + "valid": false + }, + { + "message": "d3d615a8472d9962bb70c5b5466a3d983a4811046e2a0ef5", + "name": "sign.input line 24, S top byte changed", + "public_key": "b1d39801892027d58a8c64335163195893bfc1b61dbeca3260497e1f30371107", + "signature": "836afa764d9c48aa4770a4388b654e97b3c16f082967febca27f2fc47ddfd9244b03cfc729698acf5109704346b60b230f255430089ddc56912399d1122de70b", + "stdlib": false, + "valid": false + }, + { + "message": "d3d615a8472d9962bb70c5b5466a3d983a4811046e2a0ef5", + "name": "sign.input line 24, A changed", + "public_key": "b1d39801892127d58a8c64335163195893bfc1b61dbeca3260497e1f30371107", + "signature": "836afa764d9c48aa4770a4388b654e97b3c16f082967febca27f2fc47ddfd9244b03cfc729698acf5109704346b60b230f255430089ddc56912399d1122de70a", + "stdlib": false, + "valid": false + }, + { + "message": "d2d615a8472d9962bb70c5b5466a3d983a4811046e2a0ef5", + "name": "sign.input line 24, message changed", + "public_key": "b1d39801892027d58a8c64335163195893bfc1b61dbeca3260497e1f30371107", + "signature": "836afa764d9c48aa4770a4388b654e97b3c16f082967febca27f2fc47ddfd9244b03cfc729698acf5109704346b60b230f255430089ddc56912399d1122de70a", + "stdlib": false, + "valid": false + }, + { + "message": "6ada80b6fa84f7034920789e8536b82d5e4678059aed27f71c", + "name": "sign.input line 25", + "public_key": "d0c846f97fe28585c0ee159015d64c56311c886eddcc185d296dbb165d2625d6", + "signature": "16e462a29a6dd498685a3718b3eed00cc1598601ee47820486032d6b9acc9bf89f57684e08d8c0f05589cda2882a05dc4c63f9d0431d6552710812433003bc08", + "stdlib": true, + "valid": true + }, + { + "message": "82cb53c4d5a013bae5070759ec06c3c6955ab7a4050958ec328c", + "name": "sign.input line 26", + "public_key": "2bf32ba142ba4622d8f3e29ecd85eea07b9c47be9d64412c9b510b27dd218b23", + "signature": "881f5b8c5a030df0f75b6634b070dd27bd1ee3c08738ae349338b3ee6469bbf9760b13578a237d5182535ede121283027a90b5f865d63a6537dca07b44049a0f", + "stdlib": true, + "valid": true + }, + { + "message": "a9a8cbb0ad585124e522abbfb40533bdd6f49347b55b18e8558cb0", + "name": "sign.input line 27", + "public_key": "94d23d977c33e49e5e4992c68f25ec99a27c41ce6b91f2bfa0cd8292fe962835", + "signature": "3acd39bec8c3cd2b44299722b5850a0400c1443590fd4861d59aae7496acb3df73fc3fdf7969ae5f50ba47dddc435246e5fd376f6b891cd4c2caf5d614b6170c", + "stdlib": true, + "valid": true + }, + { + "message": "5cb6f9aa59b80eca14f6a68fb40cf07b794e75171fba96262c1c6adc", + "name": "sign.input line 28", + "public_key": "9d084aa8b97a6b9bafa496dbc6f76f3306a116c9d917e681520a0f914369427e", + "signature": "f5875423781b66216cb5e8998de5d9ffc29d1d67107054ace3374503a9c3ef811577f269de81296744bd706f1ac478caf09b54cdf871b3f802bd57f9a6cb9101", + "stdlib": true, + "valid": true + }, + { + "message": "32fe27994124202153b5c70d3813fdee9c2aa6e7dc743d4d535f1840a5", + "name": "sign.input line 29", + "public_key": "16cee8a3f2631834c88b670897ff0b08ce90cc147b4593b3f1f403727f7e7ad5", + "signature": "d834197c1a3080614e0a5fa0aaaa808824f21c38d692e6ffbd200f7dfb3c8f44402a7382180b98ad0afc8eec1a02acecf3cb7fde627b9f18111f260ab1db9a07", + "stdlib": true, + "valid": true + }, + { + "message": "bb3172795710fe00054d3b5dfef8a11623582da68bf8e46d72d27cece2aa", + "name": "sign.input line 30", + "public_key": "23be323c562dfd71ce65f5bba56a74a3a6dfc36b573d2f94f635c7f9b4fd5a5b", + "signature": "0f8fad1e6bde771b4f5420eac75c378bae6db5ac6650cd2bc210c1823b432b48e016b10595458ffab92f7a8989b293ceb8dfed6c243a2038fc06652aaaf16f02", + "stdlib": true, + "valid": true + }, + { + "message": "7cf34f75c3dac9a804d0fcd09eba9b29c9484e8a018fa9e073042df88e3c56", + "name": "sign.input line 31", + "public_key": "3f60c7541afa76c019cf5aa82dcdb088ed9e4ed9780514aefb379dabc844f31a", + "signature": "be71ef4806cb041d885effd9e6b0fbb73d65d7cdec47a89c8a994892f4e55a568c4cc78d61f901e80dbb628b86a23ccd594e712b57fa94c2d67ec26634878507", + "stdlib": true, + "valid": true + }, + { + "message": "a750c232933dc14b1184d86d8b4ce72e16d69744ba69818b6ac33b1d823bb2c3", + "name": "sign.input line 32", + "public_key": "b49f3a78b1c6a7fca8f3466f33bc0e929f01fba04306c2a7465f46c3759316d9", + "signature": "04266c033b91c1322ceb3446c901ffcf3cc40c4034e887c9597ca1893ba7330becbbd8b48142ef35c012c6ba51a66df9308cb6268ad6b1e4b03e70102495790b", + "stdlib": true, + "valid": true + }, + { + "message": "a750c232933dc14b1184d86d8b4ce72e16d69744ba69818b6ac33b1d823bb2c3", + "name": "sign.input line 32, R changed", + "public_key": "b49f3a78b1c6a7fca8f3466f33bc0e929f01fba04306c2a7465f46c3759316d9", + "signature": "05266c033b91c1322ceb3446c901ffcf3cc40c4034e887c9597ca1893ba7330becbbd8b48142ef35c012c6ba51a66df9308cb6268ad6b1e4b03e70102495790b", + "stdlib": false, + "valid": false + }, + { + "message": "a750c232933dc14b1184d86d8b4ce72e16d69744ba69818b6ac33b1d823bb2c3", + "name": "sign.input line 32, S changed", + "public_key": "b49f3a78b1c6a7fca8f3466f33bc0e929f01fba04306c2a7465f46c3759316d9", + "signature": "04266c033b91c1322ceb3446c901ffcf3cc40c4034e887c9597ca1893ba7330bedbbd8b48142ef35c012c6ba51a66df9308cb6268ad6b1e4b03e70102495790b", + "stdlib": false, + "valid": false + }, + { + "message": "a750c232933dc14b1184d86d8b4ce72e16d69744ba69818b6ac33b1d823bb2c3", + "name": "sign.input line 32, S top byte changed", + "public_key": "b49f3a78b1c6a7fca8f3466f33bc0e929f01fba04306c2a7465f46c3759316d9", + "signature": "04266c033b91c1322ceb3446c901ffcf3cc40c4034e887c9597ca1893ba7330becbbd8b48142ef35c012c6ba51a66df9308cb6268ad6b1e4b03e70102495790a", + "stdlib": false, + "valid": false + }, + { + "message": "a750c232933dc14b1184d86d8b4ce72e16d69744ba69818b6ac33b1d823bb2c3", + "name": "sign.input line 32, A changed", + "public_key": "b49f3a78b1c7a7fca8f3466f33bc0e929f01fba04306c2a7465f46c3759316d9", + "signature": "04266c033b91c1322ceb3446c901ffcf3cc40c4034e887c9597ca1893ba7330becbbd8b48142ef35c012c6ba51a66df9308cb6268ad6b1e4b03e70102495790b", + "stdlib": false, + "valid": false + }, + { + "message": "a650c232933dc14b1184d86d8b4ce72e16d69744ba69818b6ac33b1d823bb2c3", + "name": "sign.input line 32, message changed", + "public_key": "b49f3a78b1c6a7fca8f3466f33bc0e929f01fba04306c2a7465f46c3759316d9", + "signature": "04266c033b91c1322ceb3446c901ffcf3cc40c4034e887c9597ca1893ba7330becbbd8b48142ef35c012c6ba51a66df9308cb6268ad6b1e4b03e70102495790b", + "stdlib": false, + "valid": false + }, + { + "message": "5a44e34b746c5fd1898d552ab354d28fb4713856d7697dd63eb9bd6b99c280e187", + "name": "sign.input line 33", + "public_key": "8ea074245159a116aa7122a25ec16b891d625a68f33660423908f6bdc44f8c1b", + "signature": "a06a23d982d81ab883aae230adbc368a6a9977f003cebb00d4c2e4018490191a84d3a282fdbfb2fc88046e62de43e15fb575336b3c8b77d19ce6a009ce51f50c", + "stdlib": true, + "valid": true + }, + { + "message": "8bc4185e50e57d5f87f47515fe2b1837d585f0aae9e1ca383b3ec908884bb900ff27", + "name": "sign.input line 34", + "public_key": "af6b7145474dc9954b9af93a9cdb34449d5b7c651c824d24e230b90033ce59c0", + "signature": "16dc1e2b9fa909eefdc277ba16ebe207b8da5e91143cde78c5047a89f681c33c4e4e3428d5c928095903a811ec002d52a39ed7f8b3fe1927200c6dd0b9ab3e04", + "stdlib": true, + "valid": true + }, + { + "message": "95872d5f789f95484e30cbb0e114028953b16f5c6a8d9f65c003a83543beaa46b38645", + "name": "sign.input line 35", + "public_key": "f85b80e050a1b9620db138bfc9e100327e25c257c59217b601f1f6ac9a413d3f", + "signature": "ea855d781cbea4682e350173cb89e8619ccfddb97cdce16f9a2f6f6892f46dbe68e04b12b8d88689a7a31670cdff409af98a93b49a34537b6aa009d2eb8b4701", + "stdlib": true, + "valid": true + }, + { + "message": "e05f71e4e49a72ec550c44a3b85aca8f20ff26c3ee94a80f1b431c7d154ec9603ee02531", + "name": "sign.input line 36", + "public_key": "017370c879090a81c7f272c2fc80e3aac2bc603fcb379afc98691160ab745b26", + "signature": "ac957f82335aa7141e96b59d63e3ccee95c3a2c47d026540c2af42dc9533d5fd81827d1679ad187aeaf37834915e75b147a9286806c8017516ba43dd051a5e0c", + "stdlib": true, + "valid": true + }, + { + "message": "938f0e77621bf3ea52c7c4911c5157c2d8a2a858093ef16aa9b107e69d98037ba139a3c382", + "name": "sign.input line 37", + "public_key": "f30162bac98447c4042fac05da448034629be2c6a58d30dfd578ba9fb5e3930b", + "signature": "5efe7a92ff9623089b3e3b78f352115366e26ba3fb1a416209bc029e9cadccd9f4affa333555a8f3a35a9d0f7c34b292cae77ec96fa3adfcaadee2d9ced8f805", + "stdlib": true, + "valid": true + }, + { + "message": "838367471183c71f7e717724f89d401c3ad9863fd9cc7aa3cf33d3c529860cb581f3093d87da", + "name": "sign.input line 38", + "public_key": "34ad0fbdb2566507a81c2b1f8aa8f53dccaa64cc87ada91b903e900d07eee930", + "signature": "2ab255169c489c54c732232e37c87349d486b1eba20509dbabe7fed329ef08fd75ba1cd145e67b2ea26cb5cc51cab343eeb085fe1fd7b0ec4c6afcd9b979f905", + "stdlib": true, + "valid": true + }, + { + "message": "33e5918b66d33d55fe717ca34383eae78f0af82889caf6696e1ac9d95d1ffb32cba755f9e3503e", + "name": "sign.input line 39", + "public_key": "94e5eb4d5024f49d7ebf79817c8de11497dc2b55622a51ae123ffc749dbb16e0", + "signature": "58271d44236f3b98c58fd7ae0d2f49ef2b6e3affdb225aa3ba555f0e11cc53c23ad19baf24346590d05d7d5390582082cf94d39cad6530ab93d13efb39279506", + "stdlib": true, + "valid": true + }, + { + "message": "da9c5559d0ea51d255b6bd9d7638b876472f942b330fc0e2b30aea68d77368fce4948272991d257e", + "name": "sign.input line 40", + "public_key": "1772c5abc2d23fd2f9d1c3257be7bc3c1cd79cee40844b749b3a7743d2f964b8", + "signature": "6828cd7624e793b8a4ceb96d3c2a975bf773e5ff6645f353614058621e58835289e7f31f42dfe6af6d736f2644511e320c0fa698582a79778d18730ed3e8cb08", + "stdlib": true, + "valid": true + }, + { + "message": "da9c5559d0ea51d255b6bd9d7638b876472f942b330fc0e2b30aea68d77368fce4948272991d257e", + "name": "sign.input line 40, R changed", + "public_key": "1772c5abc2d23fd2f9d1c3257be7bc3c1cd79cee40844b749b3a7743d2f964b8", + "signature": "6928cd7624e793b8a4ceb96d3c2a975bf773e5ff6645f353614058621e58835289e7f31f42dfe6af6d736f2644511e320c0fa698582a79778d18730ed3e8cb08", + "stdlib": false, + "valid": false + }, + { + "message": "da9c5559d0ea51d255b6bd9d7638b876472f942b330fc0e2b30aea68d77368fce4948272991d257e", + "name": "sign.input line 40, S changed", + "public_key": "1772c5abc2d23fd2f9d1c3257be7bc3c1cd79cee40844b749b3a7743d2f964b8", + "signature": "6828cd7624e793b8a4ceb96d3c2a975bf773e5ff6645f353614058621e58835288e7f31f42dfe6af6d736f2644511e320c0fa698582a79778d18730ed3e8cb08", + "stdlib": false, + "valid": false + }, + { + "message": "da9c5559d0ea51d255b6bd9d7638b876472f942b330fc0e2b30aea68d77368fce4948272991d257e", + "name": "sign.input line 40, S top byte changed", + "public_key": "1772c5abc2d23fd2f9d1c3257be7bc3c1cd79cee40844b749b3a7743d2f964b8", + "signature": "6828cd7624e793b8a4ceb96d3c2a975bf773e5ff6645f353614058621e58835289e7f31f42dfe6af6d736f2644511e320c0fa698582a79778d18730ed3e8cb09", + "stdlib": false, + "valid": false + }, + { + "message": "da9c5559d0ea51d255b6bd9d7638b876472f942b330fc0e2b30aea68d77368fce4948272991d257e", + "name": "sign.input line 40, A changed", + "public_key": "1772c5abc2d33fd2f9d1c3257be7bc3c1cd79cee40844b749b3a7743d2f964b8", + "signature": "6828cd7624e793b8a4ceb96d3c2a975bf773e5ff6645f353614058621e58835289e7f31f42dfe6af6d736f2644511e320c0fa698582a79778d18730ed3e8cb08", + "stdlib": false, + "valid": false + }, + { + "message": "db9c5559d0ea51d255b6bd9d7638b876472f942b330fc0e2b30aea68d77368fce4948272991d257e", + "name": "sign.input line 40, message changed", + "public_key": "1772c5abc2d23fd2f9d1c3257be7bc3c1cd79cee40844b749b3a7743d2f964b8", + "signature": "6828cd7624e793b8a4ceb96d3c2a975bf773e5ff6645f353614058621e58835289e7f31f42dfe6af6d736f2644511e320c0fa698582a79778d18730ed3e8cb08", + "stdlib": false, + "valid": false + }, + { + "message": "c59d0862ec1c9746abcc3cf83c9eeba2c7082a036a8cb57ce487e763492796d47e6e063a0c1feccc2d", + "name": "sign.input line 41", + "public_key": "299ebd1f13177dbdb66a912bbf712038fdf73b06c3ac020c7b19126755d47f61", + "signature": "d59e6dfcc6d7e3e2c58dec81e985d245e681acf6594a23c59214f7bed8015d813c7682b60b3583440311e72a8665ba2c96dec23ce826e160127e18132b030404", + "stdlib": true, + "valid": true + }, + { + "message": "56f1329d9a6be25a6159c72f12688dc8314e85dd9e7e4dc05bbecb7729e023c86f8e0937353f27c7ede9", + "name": "sign.input line 42", + "public_key": "da768b20c437dd3aa5f84bb6a077ffa34ab68501c5352b5cc3fdce7fe6c2398d", + "signature": "1c723a20c6772426a670e4d5c4a97c6ebe9147f71bb0a415631e44406e290322e4ca977d348fe7856a8edc235d0fe95f7ed91aefddf28a77e2c7dbfd8f552f0a", + "stdlib": true, + "valid": true + }, + { + "message": "a7c04e8ba75d0a03d8b166ad7a1d77e1b91c7aaf7befdd99311fc3c54a684ddd971d5b3211c3eeaff1e54e", + "name": "sign.input line 43", + "public_key": "6791d8ce50a44689fc178727c5c3a1c959fbeed74ef7d8e7bd3c1ab4da31c51f", + "signature": "ebf10d9ac7c96108140e7def6fe9533d727646ff5b3af273c1df95762a66f32b65a09634d013f54b5dd6011f91bc336ca8b355ce33f8cfbec2535a4c427f8205", + "stdlib": true, + "valid": true + }, + { + "message": "63b80b7956acbecf0c35e9ab06b914b0c7014fe1a4bbc0217240c1a33095d707953ed77b15d211adaf9b97dc", + "name": "sign.input line 44", + "public_key": "ecfb6a2bd42f31b61250ba5de7e46b4719afdfbc660db71a7bd1df7b0a3abe37", + "signature": "9af885344cc7239498f712df80bc01b80638291ed4a1d28baa5545017a72e2f65649ccf9603da6eb5bfab9f5543a6ca4a7af3866153c76bf66bf95def615b00c", + "stdlib": true, + "valid": true + }, + { + "message": "65641cd402add8bf3d1d67dbeb6d41debfbef67e4317c35b0a6d5bbbae0e034de7d670ba1413d056f2d6f1de12", + "name": "sign.input line 45", + "public_key": "588ddadcbcedf40df0e9697d8bb277c7bb1498fa1d26ce0a835a760b92ca7c85", + "signature": "c179c09456e235fe24105afa6e8ec04637f8f943817cd098ba95387f9653b2add181a31447d92d1a1ddf1ceb0db62118de9dffb7dcd2424057cbdff5d41d0403", + "stdlib": true, + "valid": true + }, + { + "message": "4f1846dd7ad50e545d4cfbffbb1dc2ff145dc123754d08af4e44ecc0bc8c91411388bc7653e2d893d1eac2107d05", + "name": "sign.input line 46", + "public_key": "aba3e795aab2012acceadd7b3bd9daeeed6ff5258bdcd7c93699c2a3836e3832", + "signature": "2c691fa8d487ce20d5d2fa41559116e0bbf4397cf5240e152556183541d66cf753582401a4388d390339dbef4d384743caa346f55f8daba68ba7b9131a8a6e0b", + "stdlib": true, + "valid": true + }, + { + "message": "4c8274d0ed1f74e2c86c08d955bde55b2d54327e82062a1f71f70d536fdc8722cdead7d22aaead2bfaa1ad00b82957", + "name": "sign.input line 47", + "public_key": "72e409937e0610eb5c20b326dc6ea1bbbc0406701c5cd67d1fbde09192b07c01", + "signature": "87f7fdf46095201e877a588fe3e5aaf476bd63138d8a878b89d6ac60631b3458b9d41a3c61a588e1db8d29a5968981b018776c588780922f5aa732ba6379dd05", + "stdlib": true, + "valid": true + }, + { + "message": "783e33c3acbdbb36e819f544a7781d83fc283d3309f5d3d12c8dcd6b0b3d0e89e38cfd3b4d0885661ca547fb9764abff", + "name": "sign.input line 48", + "public_key": "90d2efbba4d43e6b2b992ca16083dbcfa2b322383907b0ee75f3e95845d3c47f", + "signature": "fa2e994421aef1d5856674813d05cbd2cf84ef5eb424af6ecd0dc6fdbdc2fe605fe985883312ecf34f59bfb2f1c9149e5b9cc9ecda05b2731130f3ed28ddae0b", + "stdlib": true, + "valid": true + }, + { + "message": "783e33c3acbdbb36e819f544a7781d83fc283d3309f5d3d12c8dcd6b0b3d0e89e38cfd3b4d0885661ca547fb9764abff", + "name": "sign.input line 48, R changed", + "public_key": "90d2efbba4d43e6b2b992ca16083dbcfa2b322383907b0ee75f3e95845d3c47f", + "signature": "fb2e994421aef1d5856674813d05cbd2cf84ef5eb424af6ecd0dc6fdbdc2fe605fe985883312ecf34f59bfb2f1c9149e5b9cc9ecda05b2731130f3ed28ddae0b", + "stdlib": false, + "valid": false + }, + { + "message": "783e33c3acbdbb36e819f544a7781d83fc283d3309f5d3d12c8dcd6b0b3d0e89e38cfd3b4d0885661ca547fb9764abff", + "name": "sign.input line 48, S changed", + "public_key": "90d2efbba4d43e6b2b992ca16083dbcfa2b322383907b0ee75f3e95845d3c47f", + "signature": "fa2e994421aef1d5856674813d05cbd2cf84ef5eb424af6ecd0dc6fdbdc2fe605ee985883312ecf34f59bfb2f1c9149e5b9cc9ecda05b2731130f3ed28ddae0b", + "stdlib": false, + "valid": false + }, + { + "message": "783e33c3acbdbb36e819f544a7781d83fc283d3309f5d3d12c8dcd6b0b3d0e89e38cfd3b4d0885661ca547fb9764abff", + "name": "sign.input line 48, S top byte changed", + "public_key": "90d2efbba4d43e6b2b992ca16083dbcfa2b322383907b0ee75f3e95845d3c47f", + "signature": "fa2e994421aef1d5856674813d05cbd2cf84ef5eb424af6ecd0dc6fdbdc2fe605fe985883312ecf34f59bfb2f1c9149e5b9cc9ecda05b2731130f3ed28ddae0a", + "stdlib": false, + "valid": false + }, + { + "message": "783e33c3acbdbb36e819f544a7781d83fc283d3309f5d3d12c8dcd6b0b3d0e89e38cfd3b4d0885661ca547fb9764abff", + "name": "sign.input line 48, A changed", + "public_key": "90d2efbba4d53e6b2b992ca16083dbcfa2b322383907b0ee75f3e95845d3c47f", + "signature": "fa2e994421aef1d5856674813d05cbd2cf84ef5eb424af6ecd0dc6fdbdc2fe605fe985883312ecf34f59bfb2f1c9149e5b9cc9ecda05b2731130f3ed28ddae0b", + "stdlib": false, + "valid": false + }, + { + "message": "793e33c3acbdbb36e819f544a7781d83fc283d3309f5d3d12c8dcd6b0b3d0e89e38cfd3b4d0885661ca547fb9764abff", + "name": "sign.input line 48, message changed", + "public_key": "90d2efbba4d43e6b2b992ca16083dbcfa2b322383907b0ee75f3e95845d3c47f", + "signature": "fa2e994421aef1d5856674813d05cbd2cf84ef5eb424af6ecd0dc6fdbdc2fe605fe985883312ecf34f59bfb2f1c9149e5b9cc9ecda05b2731130f3ed28ddae0b", + "stdlib": false, + "valid": false + }, + { + "message": "29d77acfd99c7a0070a88feb6247a2bce9984fe3e6fbf19d4045042a21ab26cbd771e184a9a75f316b648c6920db92b87b", + "name": "sign.input line 49", + "public_key": "fd711dc7dd3b1dfb9df9704be3e6b26f587fe7dd7ba456a91ba43fe51aec09ad", + "signature": "58832bdeb26feafc31b46277cf3fb5d7a17dfb7ccd9b1f58ecbe6feb979666828f239ba4d75219260ecac0acf40f0e5e2590f4caa16bbbcd8a155d347967a607", + "stdlib": true, + "valid": true + }, + { + "message": "f3992cde6493e671f1e129ddca8038b0abdb77bb9035f9f8be54bd5d68c1aeff724ff47d29344391dc536166b8671cbbf123", + "name": "sign.input line 50", + "public_key": "2c50f870ee48b36b0ac2f8a5f336fb090b113050dbcc25e078200a6e16153eea", + "signature": "69e6a4491a63837316e86a5f4ba7cd0d731ecc58f1d0a264c67c89befdd8d3829d8de13b33cc0bf513931715c7809657e2bfb960e5c764c971d733746093e500", + "stdlib": true, + "valid": true + }, + { + "message": "19f1bf5dcf1750c611f1c4a2865200504d82298edd72671f62a7b1471ac3d4a30f7de9e5da4108c52a4ce70a3e114a52a3b3c5", + "name": "sign.input line 51", + "public_key": "eb2bcadfd3eec2986baff32b98e7c4dbf03ff95d8ad5ff9aa9506e5472ff845f", + "signature": "c7b55137317ca21e33489ff6a9bfab97c855dc6f85684a70a9125a261b56d5e6f149c5774d734f2d8debfc77b721896a8267c23768e9badb910eef83ec258802", + "stdlib": true, + "valid": true + }, + { + "message": "f8b21962447b0a8f2e4279de411bea128e0be44b6915e6cda88341a68a0d818357db938eac73e0af6d31206b3948f8c48a447308", + "name": "sign.input line 52", + "public_key": "5e3c19f2415acf729f829a4ebd5c40e1a6bc9fbca95703a9376087ed0937e51a", + "signature": "27d4c3a1811ef9d4360b3bdd133c2ccc30d02c2f248215776cb07ee4177f9b13fc42dd70a6c2fed8f225c7663c7f182e7ee8eccff20dc7b0e1d5834ec5b1ea01", + "stdlib": true, + "valid": true + }, + { + "message": "99e3d00934003ebafc3e9fdb687b0f5ff9d5782a4b1f56b9700046c077915602c3134e22fc90ed7e690fddd4433e2034dcb2dc99ab", + "name": "sign.input line 53", + "public_key": "9ef27608961ac711de71a6e2d4d4663ea3ecd42fb7e4e8627c39622df4af0bbc", + "signature": "18dc56d7bd9acd4f4daa78540b4ac8ff7aa9815f45a0bba370731a14eaabe96df8b5f37dbf8eae4cb15a64b244651e59d6a3d6761d9e3c50f2d0cbb09c05ec06", + "stdlib": true, + "valid": true + }, + { + "message": "e07241dbd3adbe610bbe4d005dd46732a4c25086ecb8ec29cd7bca116e1bf9f53bfbf3e11fa49018d39ff1154a06668ef7df5c678e6a", + "name": "sign.input line 54", + "public_key": "65a99c3e16fea894ec33c6b20d9105e2a04e2764a4769d9bbd4d8bacfeab4a2e", + "signature": "01bb901d83b8b682d3614af46a807ba2691358feb775325d3423f549ff0aa5757e4e1a74e9c70f9721d8f354b319d4f4a1d91445c870fd0ffb94fed64664730d", + "stdlib": true, + "valid": true + }, + { + "message": "331da7a9c1f87b2ac91ee3b86d06c29163c05ed6f8d8a9725b471b7db0d6acec7f0f702487163f5eda020ca5b493f399e1c8d308c3c0c2", + "name": "sign.input line 55", + "public_key": "7fc88b1f7b3f11c629be671c21621f5c10672fafc8492da885742059ee6774cf", + "signature": "4b229951ef262f16978f7914bc672e7226c5f8379d2778c5a2dc0a2650869f7acfbd0bcd30fdb0619bb44fc1ae5939b87cc318133009c20395b6c7eb98107701", + "stdlib": true, + "valid": true + }, + { + "message": "7f318dbd121c08bfddfeff4f6aff4e45793251f8abf658403358238984360054f2a862c5bb83ed89025d2014a7a0cee50da3cb0e76bbb6bf", + "name": "sign.input line 56", + "public_key": "57a04c7a5113cddfe49a4c124691d46c1f9cdc8f343f9dcb72a1330aeca71fda", + "signature": "a6cbc947f9c87d1455cf1a708528c090f11ecee4855d1dbaadf47454a4de55fa4ce84b36d73a5b5f8f59298ccf21992df492ef34163d87753b7e9d32f2c3660b", + "stdlib": true, + "valid": true + }, + { + "message": "7f318dbd121c08bfddfeff4f6aff4e45793251f8abf658403358238984360054f2a862c5bb83ed89025d2014a7a0cee50da3cb0e76bbb6bf", + "name": "sign.input line 56, R changed", + "public_key": "57a04c7a5113cddfe49a4c124691d46c1f9cdc8f343f9dcb72a1330aeca71fda", + "signature": "a7cbc947f9c87d1455cf1a708528c090f11ecee4855d1dbaadf47454a4de55fa4ce84b36d73a5b5f8f59298ccf21992df492ef34163d87753b7e9d32f2c3660b", + "stdlib": false, + "valid": false + }, + { + "message": "7f318dbd121c08bfddfeff4f6aff4e45793251f8abf658403358238984360054f2a862c5bb83ed89025d2014a7a0cee50da3cb0e76bbb6bf", + "name": "sign.input line 56, S changed", + "public_key": "57a04c7a5113cddfe49a4c124691d46c1f9cdc8f343f9dcb72a1330aeca71fda", + "signature": "a6cbc947f9c87d1455cf1a708528c090f11ecee4855d1dbaadf47454a4de55fa4de84b36d73a5b5f8f59298ccf21992df492ef34163d87753b7e9d32f2c3660b", + "stdlib": false, + "valid": false + }, + { + "message": "7f318dbd121c08bfddfeff4f6aff4e45793251f8abf658403358238984360054f2a862c5bb83ed89025d2014a7a0cee50da3cb0e76bbb6bf", + "name": "sign.input line 56, S top byte changed", + "public_key": "57a04c7a5113cddfe49a4c124691d46c1f9cdc8f343f9dcb72a1330aeca71fda", + "signature": "a6cbc947f9c87d1455cf1a708528c090f11ecee4855d1dbaadf47454a4de55fa4ce84b36d73a5b5f8f59298ccf21992df492ef34163d87753b7e9d32f2c3660a", + "stdlib": false, + "valid": false + }, + { + "message": "7f318dbd121c08bfddfeff4f6aff4e45793251f8abf658403358238984360054f2a862c5bb83ed89025d2014a7a0cee50da3cb0e76bbb6bf", + "name": "sign.input line 56, A changed", + "public_key": "57a04c7a5112cddfe49a4c124691d46c1f9cdc8f343f9dcb72a1330aeca71fda", + "signature": "a6cbc947f9c87d1455cf1a708528c090f11ecee4855d1dbaadf47454a4de55fa4ce84b36d73a5b5f8f59298ccf21992df492ef34163d87753b7e9d32f2c3660b", + "stdlib": false, + "valid": false + }, + { + "message": "7e318dbd121c08bfddfeff4f6aff4e45793251f8abf658403358238984360054f2a862c5bb83ed89025d2014a7a0cee50da3cb0e76bbb6bf", + "name": "sign.input line 56, message changed", + "public_key": "57a04c7a5113cddfe49a4c124691d46c1f9cdc8f343f9dcb72a1330aeca71fda", + "signature": "a6cbc947f9c87d1455cf1a708528c090f11ecee4855d1dbaadf47454a4de55fa4ce84b36d73a5b5f8f59298ccf21992df492ef34163d87753b7e9d32f2c3660b", + "stdlib": false, + "valid": false + }, + { + "message": "ce497c5ff5a77990b7d8f8699eb1f5d8c0582f70cb7ac5c54d9d924913278bc654d37ea227590e15202217fc98dac4c0f3be2183d133315739", + "name": "sign.input line 57", + "public_key": "a3f527a1c1f17dfeed92277347c9f98ab475de1755b0ab546b8a15d01b9bd0be", + "signature": "4e8c318343c306adbba60c92b75cb0569b9219d8a86e5d57752ed235fc109a43c2cf4e942cacf297279fbb28675347e08027722a4eb7395e00a17495d32edf0b", + "stdlib": true, + "valid": true + }, + { + "message": "8ddcd63043f55ec3bfc83dceae69d8f8b32f4cdb6e2aebd94b4314f8fe7287dcb62732c9052e7557fe63534338efb5b6254c5d41d2690cf5144f", + "name": "sign.input line 58", + "public_key": "0f7eda091499625e2bae8536ea35cda5483bd16a9c7e416b341d6f2c83343612", + "signature": "efbd41f26a5d62685516f882b6ec74e0d5a71830d203c231248f26e99a9c6578ec900d68cdb8fa7216ad0d24f9ecbc9ffa655351666582f626645395a31fa704", + "stdlib": true, + "valid": true + }, + { + "message": "a6d4d0542cfe0d240a90507debacabce7cbbd48732353f4fad82c7bb7dbd9df8e7d9a16980a45186d8786c5ef65445bcc5b2ad5f660ffc7c8eaac0", + "name": "sign.input line 59", + "public_key": "0ecb2601d5f7047428e9f909883a12420085f04ee2a88b6d95d3d7f2c932bd76", + "signature": "32d22904d3e7012d6f5a441b0b4228064a5cf95b723a66b048a087ecd55920c31c204c3f2006891a85dd1932e3f1d614cfd633b5e63291c6d8166f3011431e09", + "stdlib": true, + "valid": true + }, + { + "message": "3a53594f3fba03029318f512b084a071ebd60baec7f55b028dc73bfc9c74e0ca496bf819dd92ab61cd8b74be3c0d6dcd128efc5ed3342cba124f726c", + "name": "sign.input line 60", + "public_key": "788de540544d3feb0c919240b390729be487e94b64ad973eb65b4669ecf23501", + "signature": "d2fde02791e720852507faa7c3789040d9ef86646321f313ac557f4002491542dd67d05c6990cdb0d495501fbc5d5188bfbb84dc1bf6098bee0603a47fc2690f", + "stdlib": true, + "valid": true + }, + { + "message": "20e1d05a0d5b32cc8150b8116cef39659dd5fb443ab15600f78e5b49c45326d9323f2850a63c3808859495ae273f58a51e9de9a145d774b40ba9d753d3", + "name": "sign.input line 61", + "public_key": "52a00d96a3148b4726692d9eff89160ea9f99a5cc4389f361fed0bb16a42d521", + "signature": "22c99aa946ead39ac7997562810c01c20b46bd610645bd2d56dcdcbaacc5452c74fbf4b8b1813b0e94c30d808ce5498e61d4f7ccbb4cc5f04dfc6140825a9600", + "stdlib": true, + "valid": true + }, + { + "message": "54e0caa8e63919ca614b2bfd308ccfe50c9ea888e1ee4446d682cb5034627f97b05392c04e835556c31c52816a48e4fb196693206b8afb4408662b3cb575", + "name": "sign.input line 62", + "public_key": "0510eaf57d7301b0e1d527039bf4c6e292300a3a61b4765434f3203c100351b1", + "signature": "06e5d8436ac7705b3a90f1631cdd38ec1a3fa49778a9b9f2fa5ebea4e7d560ada7dd26ff42fafa8ba420323742761aca6904940dc21bbef63ff72daab45d430b", + "stdlib": true, + "valid": true + }, + { + "message": "16152c2e037b1c0d3219ced8e0674aee6b57834b55106c5344625322da638ecea2fc9a424a05ee9512d48fcf75dd8bd4691b3c10c28ec98ee1afa5b863d1c36795ed18105db3a9aabd9d2b4c1747adbaf1a56ffcc0c533c1c0faef331cdb79d961fa39f880a1b8b1164741822efb15a7259a465bef212855751fab66a897bfa211abe0ea2f2e1cd8a11d80e142cde1263eec267a3138ae1fcf4099db0ab53d64f336f4bcd7a363f6db112c0a2453051a0006f813aaf4ae948a2090619374fa58052409c28ef76225687df3cb2d1b0bfb43b09f47f1232f790e6d8dea759e57942099f4c4bd3390f28afc2098244961465c643fc8b29766af2bcbc5440b86e83608cfc937be98bb4827fd5e6b689adc2e26513db531076a6564396255a09975b7034dac06461b255642e3a7ed75fa9fc265011f5f6250382a84ac268d63ba64", + "name": "sign.input line 63", + "public_key": "1be034f813017b900d8990af45fad5b5214b573bd303ef7a75ef4b8c5c5b9842", + "signature": "279cace6fdaf3945e3837df474b28646143747632bede93e7a66f5ca291d2c24978512ca0cb8827c8c322685bd605503a5ec94dbae61bbdcae1e49650602bc07", + "stdlib": true, + "valid": true + }, + { + "message": "446174654b657973", + "name": "S + 7237005577332262213973186563042994240857116359379907606001950938285454250989", + "public_key": "6e9a1744b47b95f65ab8255d71d05c6a9c8a3b21026883c2ef78da5363dfe4bc", + "signature": "20ebdb41c7c4f6d4cb847c59947880d1dfd28f1f30c9cc5019d04aa23251e00848e466062e7dc8c2946e849a095fa6bb0af720cad77636fdd8ce3c8f16056217", + "stdlib": false, + "valid": false + }, + { + "message": "446174654b657973", + "name": "S + 14474011154664524427946373126085988481658748083205070504932198000989141204992", + "public_key": "6e9a1744b47b95f65ab8255d71d05c6a9c8a3b21026883c2ef78da5363dfe4bc", + "signature": "20ebdb41c7c4f6d4cb847c59947880d1dfd28f1f30c9cc5019d04aa23251e0085b1071a9131ab66abed18cf72a65c7a60af720cad77636fdd8ce3c8f16056227", + "stdlib": false, + "valid": false + }, + { + "message": "446174654b657973", + "name": "S + 14474011154664524427946373126085988481714232718759815212003901876570908501978", + "public_key": "6e9a1744b47b95f65ab8255d71d05c6a9c8a3b21026883c2ef78da5363dfe4bc", + "signature": "20ebdb41c7c4f6d4cb847c59947880d1dfd28f1f30c9cc5019d04aa23251e00835b85c6348e0da1a6b0b7c3de85885d00af720cad77636fdd8ce3c8f16056227", + "stdlib": false, + "valid": false + }, + { + "message": "0000", + "name": "small order point 0, R = identity, S = 0, message 0", + "public_key": "0000000000000000000000000000000000000000000000000000000000000000", + "signature": "01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "stdlib": true, + "valid": false + }, + { + "message": "0001", + "name": "small order point 0, R = identity, S = 0, message 1", + "public_key": "0000000000000000000000000000000000000000000000000000000000000000", + "signature": "01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "stdlib": false, + "valid": false + }, + { + "message": "0002", + "name": "small order point 0, R = identity, S = 0, message 2", + "public_key": "0000000000000000000000000000000000000000000000000000000000000000", + "signature": "01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "stdlib": false, + "valid": false + }, + { + "message": "0003", + "name": "small order point 0, R = identity, S = 0, message 3", + "public_key": "0000000000000000000000000000000000000000000000000000000000000000", + "signature": "01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "stdlib": false, + "valid": false + }, + { + "message": "0100", + "name": "small order point 1, R = identity, S = 0, message 0", + "public_key": "0000000000000000000000000000000000000000000000000000000000000080", + "signature": "01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "stdlib": false, + "valid": false + }, + { + "message": "0101", + "name": "small order point 1, R = identity, S = 0, message 1", + "public_key": "0000000000000000000000000000000000000000000000000000000000000080", + "signature": "01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "stdlib": true, + "valid": false + }, + { + "message": "0102", + "name": "small order point 1, R = identity, S = 0, message 2", + "public_key": "0000000000000000000000000000000000000000000000000000000000000080", + "signature": "01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "stdlib": false, + "valid": false + }, + { + "message": "0103", + "name": "small order point 1, R = identity, S = 0, message 3", + "public_key": "0000000000000000000000000000000000000000000000000000000000000080", + "signature": "01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "stdlib": true, + "valid": false + }, + { + "message": "0200", + "name": "small order point 2, R = identity, S = 0, message 0", + "public_key": "0100000000000000000000000000000000000000000000000000000000000000", + "signature": "01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "stdlib": true, + "valid": false + }, + { + "message": "0201", + "name": "small order point 2, R = identity, S = 0, message 1", + "public_key": "0100000000000000000000000000000000000000000000000000000000000000", + "signature": "01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "stdlib": true, + "valid": false + }, + { + "message": "0202", + "name": "small order point 2, R = identity, S = 0, message 2", + "public_key": "0100000000000000000000000000000000000000000000000000000000000000", + "signature": "01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "stdlib": true, + "valid": false + }, + { + "message": "0203", + "name": "small order point 2, R = identity, S = 0, message 3", + "public_key": "0100000000000000000000000000000000000000000000000000000000000000", + "signature": "01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "stdlib": true, + "valid": false + }, + { + "message": "0300", + "name": "small order point 3, R = identity, S = 0, message 0", + "public_key": "26e8958fc2b227b045c3f489f2ef98f0d5dfac05d3c63339b13802886d53fc05", + "signature": "01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "stdlib": false, + "valid": false + }, + { + "message": "0301", + "name": "small order point 3, R = identity, S = 0, message 1", + "public_key": "26e8958fc2b227b045c3f489f2ef98f0d5dfac05d3c63339b13802886d53fc05", + "signature": "01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "stdlib": false, + "valid": false + }, + { + "message": "0302", + "name": "small order point 3, R = identity, S = 0, message 2", + "public_key": "26e8958fc2b227b045c3f489f2ef98f0d5dfac05d3c63339b13802886d53fc05", + "signature": "01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "stdlib": false, + "valid": false + }, + { + "message": "0303", + "name": "small order point 3, R = identity, S = 0, message 3", + "public_key": "26e8958fc2b227b045c3f489f2ef98f0d5dfac05d3c63339b13802886d53fc05", + "signature": "01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "stdlib": false, + "valid": false + }, + { + "message": "0400", + "name": "small order point 4, R = identity, S = 0, message 0", + "public_key": "26e8958fc2b227b045c3f489f2ef98f0d5dfac05d3c63339b13802886d53fc85", + "signature": "01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "stdlib": false, + "valid": false + }, + { + "message": "0401", + "name": "small order point 4, R = identity, S = 0, message 1", + "public_key": "26e8958fc2b227b045c3f489f2ef98f0d5dfac05d3c63339b13802886d53fc85", + "signature": "01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "stdlib": false, + "valid": false + }, + { + "message": "0402", + "name": "small order point 4, R = identity, S = 0, message 2", + "public_key": "26e8958fc2b227b045c3f489f2ef98f0d5dfac05d3c63339b13802886d53fc85", + "signature": "01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "stdlib": false, + "valid": false + }, + { + "message": "0403", + "name": "small order point 4, R = identity, S = 0, message 3", + "public_key": "26e8958fc2b227b045c3f489f2ef98f0d5dfac05d3c63339b13802886d53fc85", + "signature": "01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "stdlib": false, + "valid": false + }, + { + "message": "0500", + "name": "small order point 5, R = identity, S = 0, message 0", + "public_key": "c7176a703d4dd84fba3c0b760d10670f2a2053fa2c39ccc64ec7fd7792ac037a", + "signature": "01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "stdlib": false, + "valid": false + }, + { + "message": "0501", + "name": "small order point 5, R = identity, S = 0, message 1", + "public_key": "c7176a703d4dd84fba3c0b760d10670f2a2053fa2c39ccc64ec7fd7792ac037a", + "signature": "01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "stdlib": false, + "valid": false + }, + { + "message": "0502", + "name": "small order point 5, R = identity, S = 0, message 2", + "public_key": "c7176a703d4dd84fba3c0b760d10670f2a2053fa2c39ccc64ec7fd7792ac037a", + "signature": "01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "stdlib": false, + "valid": false + }, + { + "message": "0503", + "name": "small order point 5, R = identity, S = 0, message 3", + "public_key": "c7176a703d4dd84fba3c0b760d10670f2a2053fa2c39ccc64ec7fd7792ac037a", + "signature": "01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "stdlib": true, + "valid": false + }, + { + "message": "0600", + "name": "small order point 6, R = identity, S = 0, message 0", + "public_key": "c7176a703d4dd84fba3c0b760d10670f2a2053fa2c39ccc64ec7fd7792ac03fa", + "signature": "01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "stdlib": false, + "valid": false + }, + { + "message": "0601", + "name": "small order point 6, R = identity, S = 0, message 1", + "public_key": "c7176a703d4dd84fba3c0b760d10670f2a2053fa2c39ccc64ec7fd7792ac03fa", + "signature": "01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "stdlib": false, + "valid": false + }, + { + "message": "0602", + "name": "small order point 6, R = identity, S = 0, message 2", + "public_key": "c7176a703d4dd84fba3c0b760d10670f2a2053fa2c39ccc64ec7fd7792ac03fa", + "signature": "01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "stdlib": false, + "valid": false + }, + { + "message": "0603", + "name": "small order point 6, R = identity, S = 0, message 3", + "public_key": "c7176a703d4dd84fba3c0b760d10670f2a2053fa2c39ccc64ec7fd7792ac03fa", + "signature": "01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "stdlib": false, + "valid": false + }, + { + "message": "0700", + "name": "small order point 7, R = identity, S = 0, message 0", + "public_key": "ecffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f", + "signature": "01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "stdlib": false, + "valid": false + }, + { + "message": "0701", + "name": "small order point 7, R = identity, S = 0, message 1", + "public_key": "ecffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f", + "signature": "01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "stdlib": false, + "valid": false + }, + { + "message": "0702", + "name": "small order point 7, R = identity, S = 0, message 2", + "public_key": "ecffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f", + "signature": "01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "stdlib": true, + "valid": false + }, + { + "message": "0703", + "name": "small order point 7, R = identity, S = 0, message 3", + "public_key": "ecffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f", + "signature": "01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "stdlib": true, + "valid": false + } + ], + "ed25519_encodings": [ + { + "canonical": false, + "encoding": "edffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f", + "name": "y = p + 0, sign 0", + "on_curve": true, + "small_order": false + }, + { + "canonical": true, + "encoding": "0000000000000000000000000000000000000000000000000000000000000000", + "name": "y = 0, sign 0", + "on_curve": true, + "small_order": true + }, + { + "canonical": false, + "encoding": "edffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "name": "y = p + 0, sign 1", + "on_curve": true, + "small_order": false + }, + { + "canonical": true, + "encoding": "0000000000000000000000000000000000000000000000000000000000000080", + "name": "y = 0, sign 1", + "on_curve": true, + "small_order": true + }, + { + "canonical": false, + "encoding": "eeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f", + "name": "y = p + 1, sign 0", + "on_curve": true, + "small_order": false + }, + { + "canonical": true, + "encoding": "0100000000000000000000000000000000000000000000000000000000000000", + "name": "y = 1, sign 0", + "on_curve": true, + "small_order": true + }, + { + "canonical": false, + "encoding": "eeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "name": "y = p + 1, sign 1", + "on_curve": true, + "small_order": false + }, + { + "canonical": false, + "encoding": "0100000000000000000000000000000000000000000000000000000000000080", + "name": "y = 1, sign 1", + "on_curve": true, + "small_order": false + }, + { + "canonical": false, + "encoding": "efffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f", + "name": "y = p + 2, sign 0", + "on_curve": false, + "small_order": false + }, + { + "canonical": true, + "encoding": "0200000000000000000000000000000000000000000000000000000000000000", + "name": "y = 2, sign 0", + "on_curve": false, + "small_order": false + }, + { + "canonical": false, + "encoding": "efffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "name": "y = p + 2, sign 1", + "on_curve": false, + "small_order": false + }, + { + "canonical": true, + "encoding": "0200000000000000000000000000000000000000000000000000000000000080", + "name": "y = 2, sign 1", + "on_curve": false, + "small_order": false + }, + { + "canonical": false, + "encoding": "f0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f", + "name": "y = p + 3, sign 0", + "on_curve": true, + "small_order": false + }, + { + "canonical": true, + "encoding": "0300000000000000000000000000000000000000000000000000000000000000", + "name": "y = 3, sign 0", + "on_curve": true, + "small_order": false + }, + { + "canonical": false, + "encoding": "f0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "name": "y = p + 3, sign 1", + "on_curve": true, + "small_order": false + }, + { + "canonical": true, + "encoding": "0300000000000000000000000000000000000000000000000000000000000080", + "name": "y = 3, sign 1", + "on_curve": true, + "small_order": false + }, + { + "canonical": false, + "encoding": "f1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f", + "name": "y = p + 4, sign 0", + "on_curve": true, + "small_order": false + }, + { + "canonical": true, + "encoding": "0400000000000000000000000000000000000000000000000000000000000000", + "name": "y = 4, sign 0", + "on_curve": true, + "small_order": false + }, + { + "canonical": false, + "encoding": "f1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "name": "y = p + 4, sign 1", + "on_curve": true, + "small_order": false + }, + { + "canonical": true, + "encoding": "0400000000000000000000000000000000000000000000000000000000000080", + "name": "y = 4, sign 1", + "on_curve": true, + "small_order": false + }, + { + "canonical": false, + "encoding": "f2ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f", + "name": "y = p + 5, sign 0", + "on_curve": true, + "small_order": false + }, + { + "canonical": true, + "encoding": "0500000000000000000000000000000000000000000000000000000000000000", + "name": "y = 5, sign 0", + "on_curve": true, + "small_order": false + }, + { + "canonical": false, + "encoding": "f2ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "name": "y = p + 5, sign 1", + "on_curve": true, + "small_order": false + }, + { + "canonical": true, + "encoding": "0500000000000000000000000000000000000000000000000000000000000080", + "name": "y = 5, sign 1", + "on_curve": true, + "small_order": false + }, + { + "canonical": false, + "encoding": "f3ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f", + "name": "y = p + 6, sign 0", + "on_curve": true, + "small_order": false + }, + { + "canonical": true, + "encoding": "0600000000000000000000000000000000000000000000000000000000000000", + "name": "y = 6, sign 0", + "on_curve": true, + "small_order": false + }, + { + "canonical": false, + "encoding": "f3ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "name": "y = p + 6, sign 1", + "on_curve": true, + "small_order": false + }, + { + "canonical": true, + "encoding": "0600000000000000000000000000000000000000000000000000000000000080", + "name": "y = 6, sign 1", + "on_curve": true, + "small_order": false + }, + { + "canonical": false, + "encoding": "f4ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f", + "name": "y = p + 7, sign 0", + "on_curve": false, + "small_order": false + }, + { + "canonical": true, + "encoding": "0700000000000000000000000000000000000000000000000000000000000000", + "name": "y = 7, sign 0", + "on_curve": false, + "small_order": false + }, + { + "canonical": false, + "encoding": "f4ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "name": "y = p + 7, sign 1", + "on_curve": false, + "small_order": false + }, + { + "canonical": true, + "encoding": "0700000000000000000000000000000000000000000000000000000000000080", + "name": "y = 7, sign 1", + "on_curve": false, + "small_order": false + }, + { + "canonical": false, + "encoding": "f5ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f", + "name": "y = p + 8, sign 0", + "on_curve": false, + "small_order": false + }, + { + "canonical": true, + "encoding": "0800000000000000000000000000000000000000000000000000000000000000", + "name": "y = 8, sign 0", + "on_curve": false, + "small_order": false + }, + { + "canonical": false, + "encoding": "f5ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "name": "y = p + 8, sign 1", + "on_curve": false, + "small_order": false + }, + { + "canonical": true, + "encoding": "0800000000000000000000000000000000000000000000000000000000000080", + "name": "y = 8, sign 1", + "on_curve": false, + "small_order": false + }, + { + "canonical": false, + "encoding": "f6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f", + "name": "y = p + 9, sign 0", + "on_curve": true, + "small_order": false + }, + { + "canonical": true, + "encoding": "0900000000000000000000000000000000000000000000000000000000000000", + "name": "y = 9, sign 0", + "on_curve": true, + "small_order": false + }, + { + "canonical": false, + "encoding": "f6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "name": "y = p + 9, sign 1", + "on_curve": true, + "small_order": false + }, + { + "canonical": true, + "encoding": "0900000000000000000000000000000000000000000000000000000000000080", + "name": "y = 9, sign 1", + "on_curve": true, + "small_order": false + }, + { + "canonical": false, + "encoding": "f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f", + "name": "y = p + 10, sign 0", + "on_curve": true, + "small_order": false + }, + { + "canonical": true, + "encoding": "0a00000000000000000000000000000000000000000000000000000000000000", + "name": "y = 10, sign 0", + "on_curve": true, + "small_order": false + }, + { + "canonical": false, + "encoding": "f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "name": "y = p + 10, sign 1", + "on_curve": true, + "small_order": false + }, + { + "canonical": true, + "encoding": "0a00000000000000000000000000000000000000000000000000000000000080", + "name": "y = 10, sign 1", + "on_curve": true, + "small_order": false + }, + { + "canonical": false, + "encoding": "f8ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f", + "name": "y = p + 11, sign 0", + "on_curve": false, + "small_order": false + }, + { + "canonical": true, + "encoding": "0b00000000000000000000000000000000000000000000000000000000000000", + "name": "y = 11, sign 0", + "on_curve": false, + "small_order": false + }, + { + "canonical": false, + "encoding": "f8ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "name": "y = p + 11, sign 1", + "on_curve": false, + "small_order": false + }, + { + "canonical": true, + "encoding": "0b00000000000000000000000000000000000000000000000000000000000080", + "name": "y = 11, sign 1", + "on_curve": false, + "small_order": false + }, + { + "canonical": false, + "encoding": "f9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f", + "name": "y = p + 12, sign 0", + "on_curve": false, + "small_order": false + }, + { + "canonical": true, + "encoding": "0c00000000000000000000000000000000000000000000000000000000000000", + "name": "y = 12, sign 0", + "on_curve": false, + "small_order": false + }, + { + "canonical": false, + "encoding": "f9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "name": "y = p + 12, sign 1", + "on_curve": false, + "small_order": false + }, + { + "canonical": true, + "encoding": "0c00000000000000000000000000000000000000000000000000000000000080", + "name": "y = 12, sign 1", + "on_curve": false, + "small_order": false + }, + { + "canonical": false, + "encoding": "faffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f", + "name": "y = p + 13, sign 0", + "on_curve": false, + "small_order": false + }, + { + "canonical": true, + "encoding": "0d00000000000000000000000000000000000000000000000000000000000000", + "name": "y = 13, sign 0", + "on_curve": false, + "small_order": false + }, + { + "canonical": false, + "encoding": "faffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "name": "y = p + 13, sign 1", + "on_curve": false, + "small_order": false + }, + { + "canonical": true, + "encoding": "0d00000000000000000000000000000000000000000000000000000000000080", + "name": "y = 13, sign 1", + "on_curve": false, + "small_order": false + }, + { + "canonical": false, + "encoding": "fbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f", + "name": "y = p + 14, sign 0", + "on_curve": true, + "small_order": false + }, + { + "canonical": true, + "encoding": "0e00000000000000000000000000000000000000000000000000000000000000", + "name": "y = 14, sign 0", + "on_curve": true, + "small_order": false + }, + { + "canonical": false, + "encoding": "fbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "name": "y = p + 14, sign 1", + "on_curve": true, + "small_order": false + }, + { + "canonical": true, + "encoding": "0e00000000000000000000000000000000000000000000000000000000000080", + "name": "y = 14, sign 1", + "on_curve": true, + "small_order": false + }, + { + "canonical": false, + "encoding": "fcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f", + "name": "y = p + 15, sign 0", + "on_curve": true, + "small_order": false + }, + { + "canonical": true, + "encoding": "0f00000000000000000000000000000000000000000000000000000000000000", + "name": "y = 15, sign 0", + "on_curve": true, + "small_order": false + }, + { + "canonical": false, + "encoding": "fcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "name": "y = p + 15, sign 1", + "on_curve": true, + "small_order": false + }, + { + "canonical": true, + "encoding": "0f00000000000000000000000000000000000000000000000000000000000080", + "name": "y = 15, sign 1", + "on_curve": true, + "small_order": false + }, + { + "canonical": false, + "encoding": "fdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f", + "name": "y = p + 16, sign 0", + "on_curve": true, + "small_order": false + }, + { + "canonical": true, + "encoding": "1000000000000000000000000000000000000000000000000000000000000000", + "name": "y = 16, sign 0", + "on_curve": true, + "small_order": false + }, + { + "canonical": false, + "encoding": "fdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "name": "y = p + 16, sign 1", + "on_curve": true, + "small_order": false + }, + { + "canonical": true, + "encoding": "1000000000000000000000000000000000000000000000000000000000000080", + "name": "y = 16, sign 1", + "on_curve": true, + "small_order": false + }, + { + "canonical": false, + "encoding": "feffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f", + "name": "y = p + 17, sign 0", + "on_curve": false, + "small_order": false + }, + { + "canonical": true, + "encoding": "1100000000000000000000000000000000000000000000000000000000000000", + "name": "y = 17, sign 0", + "on_curve": false, + "small_order": false + }, + { + "canonical": false, + "encoding": "feffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "name": "y = p + 17, sign 1", + "on_curve": false, + "small_order": false + }, + { + "canonical": true, + "encoding": "1100000000000000000000000000000000000000000000000000000000000080", + "name": "y = 17, sign 1", + "on_curve": false, + "small_order": false + }, + { + "canonical": false, + "encoding": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f", + "name": "y = p + 18, sign 0", + "on_curve": true, + "small_order": false + }, + { + "canonical": true, + "encoding": "1200000000000000000000000000000000000000000000000000000000000000", + "name": "y = 18, sign 0", + "on_curve": true, + "small_order": false + }, + { + "canonical": false, + "encoding": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "name": "y = p + 18, sign 1", + "on_curve": true, + "small_order": false + }, + { + "canonical": true, + "encoding": "1200000000000000000000000000000000000000000000000000000000000080", + "name": "y = 18, sign 1", + "on_curve": true, + "small_order": false + }, + { + "canonical": true, + "encoding": "0000000000000000000000000000000000000000000000000000000000000080", + "name": "y = p + 19, sign 0", + "on_curve": true, + "small_order": true + }, + { + "canonical": true, + "encoding": "1300000000000000000000000000000000000000000000000000000000000000", + "name": "y = 19, sign 0", + "on_curve": true, + "small_order": false + }, + { + "canonical": true, + "encoding": "0000000000000000000000000000000000000000000000000000000000000080", + "name": "y = p + 19, sign 1", + "on_curve": true, + "small_order": true + }, + { + "canonical": true, + "encoding": "1300000000000000000000000000000000000000000000000000000000000080", + "name": "y = 19, sign 1", + "on_curve": true, + "small_order": false + }, + { + "canonical": true, + "encoding": "ecffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f", + "name": "y = p - 1, sign 0", + "on_curve": true, + "small_order": true + }, + { + "canonical": false, + "encoding": "ecffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "name": "y = p - 1, sign 1", + "on_curve": true, + "small_order": false + }, + { + "canonical": true, + "encoding": "0000000000000000000000000000000000000000000000000000000000000000", + "name": "small order 0", + "on_curve": true, + "small_order": true + }, + { + "canonical": true, + "encoding": "0000000000000000000000000000000000000000000000000000000000000080", + "name": "small order 0, sign flipped", + "on_curve": true, + "small_order": true + }, + { + "canonical": true, + "encoding": "0000000000000000000000000000000000000000000000000000000000000080", + "name": "small order 1", + "on_curve": true, + "small_order": true + }, + { + "canonical": true, + "encoding": "0000000000000000000000000000000000000000000000000000000000000000", + "name": "small order 1, sign flipped", + "on_curve": true, + "small_order": true + }, + { + "canonical": true, + "encoding": "0100000000000000000000000000000000000000000000000000000000000000", + "name": "small order 2", + "on_curve": true, + "small_order": true + }, + { + "canonical": false, + "encoding": "0100000000000000000000000000000000000000000000000000000000000080", + "name": "small order 2, sign flipped", + "on_curve": true, + "small_order": false + }, + { + "canonical": true, + "encoding": "26e8958fc2b227b045c3f489f2ef98f0d5dfac05d3c63339b13802886d53fc05", + "name": "small order 3", + "on_curve": true, + "small_order": true + }, + { + "canonical": true, + "encoding": "26e8958fc2b227b045c3f489f2ef98f0d5dfac05d3c63339b13802886d53fc85", + "name": "small order 3, sign flipped", + "on_curve": true, + "small_order": true + }, + { + "canonical": true, + "encoding": "26e8958fc2b227b045c3f489f2ef98f0d5dfac05d3c63339b13802886d53fc85", + "name": "small order 4", + "on_curve": true, + "small_order": true + }, + { + "canonical": true, + "encoding": "26e8958fc2b227b045c3f489f2ef98f0d5dfac05d3c63339b13802886d53fc05", + "name": "small order 4, sign flipped", + "on_curve": true, + "small_order": true + }, + { + "canonical": true, + "encoding": "c7176a703d4dd84fba3c0b760d10670f2a2053fa2c39ccc64ec7fd7792ac037a", + "name": "small order 5", + "on_curve": true, + "small_order": true + }, + { + "canonical": true, + "encoding": "c7176a703d4dd84fba3c0b760d10670f2a2053fa2c39ccc64ec7fd7792ac03fa", + "name": "small order 5, sign flipped", + "on_curve": true, + "small_order": true + }, + { + "canonical": true, + "encoding": "c7176a703d4dd84fba3c0b760d10670f2a2053fa2c39ccc64ec7fd7792ac03fa", + "name": "small order 6", + "on_curve": true, + "small_order": true + }, + { + "canonical": true, + "encoding": "c7176a703d4dd84fba3c0b760d10670f2a2053fa2c39ccc64ec7fd7792ac037a", + "name": "small order 6, sign flipped", + "on_curve": true, + "small_order": true + }, + { + "canonical": true, + "encoding": "ecffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f", + "name": "small order 7", + "on_curve": true, + "small_order": true + }, + { + "canonical": false, + "encoding": "ecffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "name": "small order 7, sign flipped", + "on_curve": true, + "small_order": false + }, + { + "canonical": true, + "encoding": "cbf41157dce4f224e7b1c39ec12ae03f3c65ad79c057109fce9233a204e5ce72", + "name": "random 0", + "on_curve": false, + "small_order": false + }, + { + "canonical": true, + "encoding": "aacfebffae8f8ff17cdc9d66d7da507149439443bee3be9a4759dd457cd17149", + "name": "random 1", + "on_curve": true, + "small_order": false + }, + { + "canonical": true, + "encoding": "9767bb60eb0487dc27c4812462857c5e97d2f29060f2339f6db6c16d3d9545f3", + "name": "random 2", + "on_curve": true, + "small_order": false + }, + { + "canonical": true, + "encoding": "2299fbc61bc67349c1e28ab567e21042e5f4c70f74a57a4be884558a0d638a3b", + "name": "random 3", + "on_curve": true, + "small_order": false + }, + { + "canonical": true, + "encoding": "4c524d794c782e64eb02aa546a1db86253ea07d49905842713007450ebaddf54", + "name": "random 4", + "on_curve": false, + "small_order": false + }, + { + "canonical": true, + "encoding": "a4b3e5b3c9ac302e6cac23af3319369b637fdafd66da9aba5c0e4ba118170475", + "name": "random 5", + "on_curve": true, + "small_order": false + }, + { + "canonical": true, + "encoding": "96acf42a9fba92ce585c111f0a5cf25dfa20e96e2c2b4589bd305ecb6248d619", + "name": "random 6", + "on_curve": true, + "small_order": false + }, + { + "canonical": true, + "encoding": "1640bd405f7aabe9e873726842abaf22f584f9ce85833f4eb1493f714a5ed528", + "name": "random 7", + "on_curve": false, + "small_order": false + }, + { + "canonical": true, + "encoding": "5dd5ed84043881393d565e621bee681198d5c1dcea7298b663aee2c55e362d91", + "name": "random 8", + "on_curve": false, + "small_order": false + }, + { + "canonical": true, + "encoding": "6149e22c875a3b5bced6f786a1d3cd00caa9f541a3981e946b7f2ba572744c42", + "name": "random 9", + "on_curve": false, + "small_order": false + }, + { + "canonical": true, + "encoding": "a9e37903815ad788999cb6efd255068b57e308f92203ffd52f8b22ea059e673a", + "name": "random 10", + "on_curve": false, + "small_order": false + }, + { + "canonical": true, + "encoding": "d1438f21a7b2840292a8e4252993e928b750245eb453378b0470384413e44efe", + "name": "random 11", + "on_curve": false, + "small_order": false + }, + { + "canonical": true, + "encoding": "2cb8b1856b7d347e7067343b873cc4df260700e2af01fec598d94d328f20888c", + "name": "random 12", + "on_curve": false, + "small_order": false + }, + { + "canonical": true, + "encoding": "3da1aab2b6de4ed54448bda08c4d1ca1fb3b5807c669bcb4dac6e2d2d58c08a6", + "name": "random 13", + "on_curve": false, + "small_order": false + }, + { + "canonical": true, + "encoding": "17cf2c9b619501b8711f370c4de84c1b30f79a48d83941534a3c4a0457db2b81", + "name": "random 14", + "on_curve": true, + "small_order": false + }, + { + "canonical": true, + "encoding": "b4a39858022dd7438994cd1ef4fbc6fa36fb7ba63c9d162be2b12f49ee3ca853", + "name": "random 15", + "on_curve": false, + "small_order": false + }, + { + "canonical": true, + "encoding": "d5fb620c065490e5fb6bfddc4374ff2f558b1a03e6df1d97cfb05b1dfeddbf89", + "name": "random 16", + "on_curve": false, + "small_order": false + }, + { + "canonical": true, + "encoding": "877f0cac6f31fc3977f8f9eda9b8b5c0fdc19e4a2c8b5f015f4661a3eabd5c0d", + "name": "random 17", + "on_curve": false, + "small_order": false + }, + { + "canonical": true, + "encoding": "e082e1a02a409b8222f103ec2ea4014d842ad8f78990233bbd053fdfeac14e43", + "name": "random 18", + "on_curve": true, + "small_order": false + }, + { + "canonical": true, + "encoding": "78422a9e3fb2e175d331857331cfdb6b57711114be465d3e2633c199fbe7f66e", + "name": "random 19", + "on_curve": true, + "small_order": false + }, + { + "canonical": true, + "encoding": "39ca87ba7e1b0eb74e1536ada37e9cec2079bb06132980bb3194c2fa024ad494", + "name": "random 20", + "on_curve": false, + "small_order": false + }, + { + "canonical": true, + "encoding": "68fb79aa349395cd63c0b6011290ff491cad4affc4e56557075ba1bd5af707ec", + "name": "random 21", + "on_curve": true, + "small_order": false + }, + { + "canonical": true, + "encoding": "b852d5999455fea2f2e6ee315c0371dc7b9aa222a51f4db6979023b46aea7326", + "name": "random 22", + "on_curve": false, + "small_order": false + }, + { + "canonical": true, + "encoding": "9b5846d9f7fbdc780e736193f80f98bbd65726ddff434c83100171f800c15e5d", + "name": "random 23", + "on_curve": false, + "small_order": false + }, + { + "canonical": true, + "encoding": "6e9a1744b47b95f65ab8255d71d05c6a9c8a3b21026883c2ef78da5363dfe4bc", + "name": "a public key", + "on_curve": true, + "small_order": false + } + ], + "generator": "tool/gen_primitive_vectors.go", + "hkdf_sha256": [ + { + "ikm": "0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b", + "info": "f0f1f2f3f4f5f6f7f8f9", + "length": 42, + "name": "RFC 5869 A.1", + "okm": "3cb25f25faacd57a90434f64d0362f2a2d2d0a90cf1a5a4c5db02d56ecc4c5bf34007208d5b887185865", + "salt": "000102030405060708090a0b0c" + }, + { + "ikm": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f", + "info": "b0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff", + "length": 82, + "name": "RFC 5869 A.2", + "okm": "b11e398dc80327a1c8e7f78c596a49344f012eda2d4efad8a050cc4c19afa97c59045a99cac7827271cb41c65e590e09da3275600c2f09b8367793a9aca3db71cc30c58179ec3e87c14c01d5c1f3434f1d87", + "salt": "606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeaf" + }, + { + "ikm": "0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b", + "info": "", + "length": 42, + "name": "RFC 5869 A.3", + "okm": "8da4e775a563c18f715f802a063c5a31b8a11f5c5ee1879ec3454e5f3c738d2d9d201395faa4b61a96c8", + "salt": "" + }, + { + "ikm": "dee12d58e1d45943b6c13b50b00d1772", + "info": "686561646572", + "length": 32, + "name": "nil salt, age header label", + "okm": "2baf1be47442b0fcbc61eba5d78cb5fd43a061a6f01bc3c3f50d8d89410aece8", + "salt": null + }, + { + "ikm": "951a5f85df65993583145bc201b1829c", + "info": "7061796c6f6164", + "length": 32, + "name": "age payload label", + "okm": "18527becd0900001a7e14280de72932d6a4a5267e7272a108f877f2c65080af0", + "salt": "e37888641ccfa586ab39058a5b29aebf" + }, + { + "ikm": "c9494b4c4443c1eb2a8f3f928b3abe627401703d8b1db1632a43b14aabd30046", + "info": "2fbc07063b80727e89d1", + "length": 8160, + "name": "255 blocks", + "okm": "6ea09dccaba0f8c90b8394df445d17b72bec135a2c7fb46154d0e2912709c92c2201fa52db2f9ff6a07f04e8f87df601a77d996b1191c2f99face8203250c30fb9a98c9b41e651cf14b2e655e4805b095c5184f4ba57d830d2af5a8972a48c1a7e938cacd7d790243237b5f6db1ee6de8b620a32ddc4c66eb5a987f4a34a36530b9983810ecd4bb5144308e4db3b11a4c774fdb35ccee40369cd33a7c35839b81d4db518d0b1348644d29a70a02b4ced4ffdcf16b810cfba51918d574fd2ba7828dad0b3a159ba3719d832e7a28fd27f574d8ad97e81d1f36dda2e092bacd576cb4b2665304566d4e774515fbba4b93e0f617dbc1f631d0f7da837e06e15f1bae3cde3d5f138a1fdafcfc4a8ec9b36731ddf91e7518f698e8b4388111d74bdbf0f2c45a4cedeef785876a2034f893660f3d083039132051941df4802d48dbbd245a3a168c771acae7876527ccfd8741adf3c27669fbbc9d03438e7c544985fefa1e933e82f68b8ff1fd4aba5c95bf3e74838382a237f97407f17c279c0b3fceef695967c07ed2852484b8effc85b662760de7c6954bb1decb7a13c90c7828503f88d72457dc481b7ce0541597d6c30dee54b31269eac99f61f757d007173173d986f0e5e1109ea5d7274b9af43c95706bc8bfcec439380555d31652edd599e78952464c9f3ead869dd9ba01235154ec2334d9b8104cbd7522bd9487107c2eafe31c7d1b630d3580fd136a0e4aa9a38b1a90e52d2e89004320b0e30ef6581b35db042b55ae488b02dd3bd22dac1181716ad615be44eb82a1b60e70c01366b9ecbe16e5878bae658fc201d330e695f1ed749990e68f70a2623686ab41bca47c62941a7d968b2f8c17e744d8a4164f9f601984fa2f3f3f1c2fbac1b90991d87d4ebdccda62623dbfad9002cee129bef4ea7caad44368fa6c86aa870ca9e9256c5c74c5aa14cf532bb000d8af10d3d3cb800921b2ac267569c6c7051ce49a0f030b11e83fc540cee9da340662014d86514b0df8349559aa05f3b54f702bd21c887dd89f47d13f6ae3fa5e7288e6ea3d4fd6110ebd4688b732e890d2e6d768ecc4c6b7a2315c5dc25c283bbf7aa6e290058fe33c5e133bb2f2bf8ed7f088a90b160d6353a82a347773f3ba847e5b60f53f420ccfaefa5c5918756bb7c78b2d9dac0aa72469de3da36d204c856261339a56d128f51171434cda656395b5cf4762f8c0b179026de86abeef31239e4d16e870062a889c7ffea6a3d8bb9a4f0458e05b4d35455f5bbee3976bf36bdbd581f3742b32c2a646abe9b03fc8df01796836b59b720a8336754fb0b77f6708bf037d5cbcee16d0a9d11b7e60e3b7ffd042c29041ca504b42a77353fcb79e3faa0c5a6b11f525e7d192390ff66cb67a83520c03137028c2860f16844caea789152a07637eee6ee047368b19c6548dc2907fb52364aa5c65872652b33685e3802808e68d34fd737bf870580bb55470486b1e2a30d385f93dd50426616c2057bd9dabe22d643acb62558b1aad5691f0834ec69ee74ba8dfd0d1ecbfa113bf1521afe68d45a4ebf12e50d1b6c967f4a917de32deffb3e49d89155f3f954e498685272cb988e1a2aa7cebaed351d528bfe3b24a0f8dcb2531ea890d8de2d328ccff7cd8c200833ffe421a840e014cb21c26d3f14702abd714e3672834c79473ef362f9b2ab9c17e6673e47fe7015cc2a0e216959a69bbe976cb13afb4b71e9eccc4c3e6e8564f31d54363db5bfa258b4f224933cdd4dfde684cfbc5ce0ac542202f8fe4dea030a03067848d8015d5499fec79a63e21c5b5e1512b9155be1cfc6445042511f2618213f1f6362168ce38c24fb3d8acaaf09d793353455f28eb48b5482cc2a8732457e0acd088e36f7eea5cb275adb7d15c6815ff19a5b0c072c7c5baef2dd52fe9dd52cfdcf0e63f01fab75611746795112fc598460a9071b57acea3bbe06e3e67eb9d022f64344e8c59b0034cff055473638eb9a984ab55e0eb2d58d9ec7f772d0c70e0dab3886ab93cb1cbc104518ee6572b550c38c132a65bf3c74d0300f666f730c6345958edc6fcf2972319fcf0f27bcbec035ebdf86d3e0f2f0937c2fdf43ee9b1561e094737df8a7d3d14d7749e12db3d570aef781ad7ee4154383f309796193d3b4f8707e6dee3dabcbf954983911e5cc73c6ee2f53e13c5983689fdc6a7001216c896ee42f1b66d28425683cccc5d49d4ff4c7c259d2f40611dd9664b3685ea9e77f3fa7d3d364997135a5bcd05d31ddbf8e474bedf32ea5abd02eb04217476bf989e1c130ebe1a96a8d5276c24498f3782a771a17156b8eaf0428e9e54e4641e709bae794fff57568a734647bd9c5b6be289c147000550f4d50e0be0c56dd14467f92b32de863bbb9788111f443dd9123520085689b9bd906bb88d7a1293ff61765dd86725c27615dd44eb08231b83e85623adece12aae909b4f10e50e34025ea9699dc5326742f5d563df9033ba7ed4fd871069c714e5028fdbf8a985458b0a1a41cdd9725fa72a0d6c1fdd067df893b540a4fdb4bd7c0140f1db3fa1f05b1f57968409a002c50b45964b2933df89814123d8dfde0de991912499b74e2017b13fe5626871f0750966121215741c065365ec599663db0942275cb461d52831627b1e3fe841459aaee236c6de42dd292646f415a5c1da26bf21b655d238bd8e8631208ccf763f7fdf7c4fb36739915b2ea9d1a02fb5c014c46a1af3ce32f5e1a31d512dc2061054a2cb490691d20e068dbc6d1517eaf23fc6dc84156ac7620b37d6da5e1c150feeb9b3380f9c5947643b15bb1850f40abe88e34108f849f953efa2d876e3676d41fc0d9492313b30ca29f5705288bfead7da60f93b8cfd68ebd2ae1d3e457f49a4dadfaaf48f88781f2f45d79fa49909694a3cd145d29ad976a79af9be66f2821a48894d68910a7128500f9d6dd19c78b025ad9d5783c793368785b120a86a319a031829cc1beca2e9e8b0c9d50545aa86c593b3dd6e9550c2b74b6f528d0db704884b069fc665e0dcd48224e7bc43662d5548c4ab9248d695196e5d96da958c8fdcd1f21329c0f7203d400952a15096becf2ab46cb6396ca74a5b6b337960e648af088e7b7d29904f6a9e6d0d616d842a60ed3d9c5058305293cdfb7e23185cef6d9be0fe2f3a58941104fdedad372567322ae9696b317a65beea2ba74c7b5908c5390395c4086ea71b338fd7c9fe6ea435356898314d29222aacaf2626d3347c5db5b77a5acd6f9199c7fb5d23c4393a0d28b05b3e751ff13b01542847ce96cc2222e2d403acdb839686891a38c3f4d5c2cae541943dc8fb6f8a325d639b49edadbc76188ea95194495043880dd3df65f5ed8a308432e0d8c519265489d55909f8ad102c9c0049a06cf1980fe2756137648e859080e4c4e2954aec82710cefb66786793e09d483324087ead031a90a2869208dfcf62b9426f69fa9e777b535bbac1b0a427568d45019d4ed36d910e5b5c1cedc853dc9884cac9a3bdd9607f9a90528d33b82b2921b3c67f26fc4b315ffca76a0fbc949e6c705b7d2ac7513ded08f4d8bd64a51c8f5f21118e186eee87ed4c7350a117f3972f85dfee086d7e50d9dc968858edf3f8c80362590671d1ed00efd7c6a6dcf4b0a0b8ba71c57a0e4f75ca0439b0bd6c9aca51b1f7332d3e79c2ab557a929342740ae167bb0d2b236d3327a299f0cbdb9da94e9b27abb192db6f22fc746a5b81d59b6b682f3d4e97c54759cec8c73886ad36cdb0e0c34de5e20b7ed9b1a89361ff4495bf178274ed55ed9439d98b9a1150924854283d8e66e05547b70c54ced1f4f5f831835bc0f5e15c07cc08558cfe581931e54828850b367719497045af4a38ccb95bab6bce40abeee187670609d13ae00a8d3dae206b9dbe7759ae3bdba254d77ace2dcf1e746e0a771eefcbd6c404592da92245e3f53d0c230796115c15b3f1e1ab7af6adbe8b8656c98e40e14c146f12dded8172db478df5cf48eaaac14aa5c1e60853b7adb77e71007317eadb7522a0f9a1ee84176375838ad5cb5e1a9e52ee5213c02b631098c26c20a3dd13e0d6b6212e91fccb492a2739af22497376ad8c236ee23e77f6886b4c7428d81ba2d56eb045b7149eab954e1c73c2025266d0b7f51f8a84e801e71bb3ab768687337788ced49c79427330e2e8b5999cd6a95321c87bd085e2f889882039942ae564b8e0d22e5131cdc5668e1e2dbcca0431a30d4d85a1225ae87d6d3bc46f7aacb315e011102dd14626d46628a8fb39f974012a911dd42878068d53256fccddb8f9a61419da0678b71d829a1b40cae7b04faa1d1da43ae3781586aba6121224adfb0065a4201709030cf32ea6ae52c94a58ad89f091b4f704c922f85b900d8c262b0bf7d226626f2502df54e88c36b74615c690a086869da52706537c58d3fe6d5e942568394969911bdc71d732952f2d62393c2f71e6f2f2de07a436d592700efb76995b734ea43fd59929fdbda10190eb98a4f5657624efc96da207195b63356192526d7c8fe7fe0a1b3018d0d7db49bfcc7dd26932b57e3f0cd7d39aeaa5de927ecf60adbf69c9bcd9be447568a35371820f0111624dbacfa25dfb34bb7db42e4908701e334d2909d3b20915e73c4ae5e6bee60a627b16c1cacde3ba484480b870dc3b0c03e0e571cfdfd8c112b42d8c136f2ccea02c0e3bf47d134c0a8ea43e21ad5b8d41d2ac75ce513af7104972e2fd45852e7302a22b9949e570dd0b65eb9a093c947a4bf4e9884ad97c6585cbf8ead4a24d35787cb79d7f4fe99a83da2b0bd3c74af89a66754d38d541adce2411cd990a022d1cd629911493ef6283f474f62f3a62c7a543548b063e9cce0e044cafc38baf3b9dce95bee1eca20a934847e512430084b7e8f5b3fc2a6c2e5a1f54cb4db2535b03db372bcc8a56061b137a93bb02323467ef715de7b848bfdcb25526b493c844c86972b1da5c83e4b30cf84857e8cce79aae69f219324219f83de05bd7b5bed258b005cdfca9296d9f9ae356c0bb44e29a343474e928e9e9415238a7e5d6d2c9826ddff5802eddf4dac75ba21c8ecbb6f4240c5213aad9a367b2cb8ec6fa24a1701f3e709510780e1a372df0d5314cb378d844340382ca5d6f79ad410b0e4b8753bc5b0a9db003fecb8a2bb1e0aca6701e051e78c95fd026f6dae70ff3818db105deaa15a354d3112b729c6791cb2259928b8fb38d380f561215854aa39f5a2358c7108d6db8c4bde42a099709608a6ceafb51a6fc97477eea7c75db056a94cd3e98b5979199545bcf954bca5e483d4b46a66b42f3f5c1dabb36755e7c7bd1d3fa0bd457cc436ef977205eb21cf6f799dfa4c729994440fc9b5c5c783d5082bec6072a9d803e503495c949f70906c528998a3c9d5d5da7bf7e78adb9b709673eb5fe8fda344c3ae06c48dd83581413d6618280968f8e004dfd5b8f3bdbafffa15db7599d8faab80d9b7d41ddd5d9bbf8025f9bb64515f1eb8157b61971de7026f2451dc668f300b40d73d95cc52df83b86eae6f3e1cc63781b70f63d8183b624311365f53257d988b1a78aa1d91069d6a3015e8606eba9d7aa06c7a71b1ddec68c88aff2310ca8e74b0f8e8d67559ef7511058be5a853ff3851bbbf0ca996d61d5151c2c31d525b311a848e002046bec4493a7eb7d3974d56bff2cbe07d755e5a9ea9866efe2af23c3806ccca5b59b87ffc410298fd2f815b5a1b31544f45a1633117eb367e0e6d32272f55ab081ee0f34b0de73f60e963e8d0be86b5bd7f8e99695cf78574108aa9fb04174d99e756c35ca21dae7b0d6a604794f909484abf3f58e50846245e4a253ef7072ff67030b3ea687f20299c40381936ce30970e852b04873365b0f01a59a39af4f2d2eaacd001c79fe55c5edb2a2ffaa0336bce2e20086575e1907a43649d445ad214d71a6772ab70996153a2a45a876020728b1abcc4a81a9bfa06461bf39ff82274a1dfd3fff82c44a97385de8db443ffdca11184a59602b775bd3815275eac2e2eef31d6d69aa6ba8dbce1ddbcbfbd95083d5e731bdb60c6ba47a0b010ad6475e5972cd5f201e7e43c1acbe478c759e145f9aa2c32c46660456459bfd2749ad4fc963345070a2449cb2e4313d519047879055f8f3cc499063beb402563fedfb655949aea39da7778666cc67f2efec2e6cb8dfd71104d4eef78eae8c45ab6edae88aec7150deca20ae6847791f89962d7b012b5b58cd4ce3c6e5a17b7da96826c6b0af1fb24f6a37583dbcc5c4813a8141d372470f27fc23599e58f54e679467d6c0f9dfe672567f0babba04eaeaafc52d1bd1c2418e690b366525a594380ae5b38f944a56133ecfcc12befad876583823eeb7be04fb82e514ec5d82190969b2aee84a317f8bae89cba43958e2f28e5f75f152a4f54fdef415b80716da9d5cf2a5445bb5603806af029519fa8816e9450b469c163108b82002b1b24f01931f274afab99dd09ef3dc653a902969351cb0a10dcf93c60db532ca7cc37507f0f20af0cd2fc5d929942f37e8cbec69859c8462e13eeec5de8f0221f697bd9cefd55383c3f8fe0c8dda6faf58c9c65deea7ff0d1db52145df91c295e310fb7ea034fef3d40afa9e65719c4127b53733865a213f584e643e14e488e516fa967524f36d2126562944d5b1d932ce64fb0a14417226861f6d18f6eaceb345da7edae363720c461c38dfa8d204a793f9de22e91ace29e91a919b958bc2faefd5175c906918b3cb75e433ec488098d17da9d650db68fcf37b4fffb2f6f1a67edbe390732fab40bcfbe7d57867b01d4821f2c3d56b398d3878872dfeed122c7ff1a6a502371ef6ce34040a94a9714120a91c0613bfa1e8f7158cfc0928ef0f9fef680e735f0a5996d47f23f222244653bc6cb44cfbf71144fb128db7afd6d3493ac2dc34426fcb352dfeafffdc9ff652d5506942b6c4bb3307e7e1eb50378cf85650a8ebd6467ff53c56380da38b25fcd783e4e75c403344fa7bf03aadac7cd8c7efb26b7a7b3c732633755416f3da14c2ffb55f05f2205b716cc0fe2dbe59d50d2a3fdd43af415cc50fc7ee22bb016b3b14e053bd2df3a51c0fbf239c7f1d5169cbe351e8870913dc61d63dd16fac2b9f891dd935018bd9f86f126be3f3feb3f326481f81ed0a746fff41da3fe43aad3b27efae6ffafb28e262e5052f379090fd4180420d95b608e56536d9fa9cb67ae8af0019a0e67b848c78b7dbecc0b318d4b059a3031757f992fcd3c4cb0b214bd937e88867da8731a72092a087a81ddb061f45ab47688e42cc989063ad985a7ae55189eaf5065dce85d8c9d7823e01ea4fbb825266c4071d2e85645f10c4b6118bf2638726d729ade5ad205b3b5c8f1b1760f44f97f3a7063c39891f475e6166719b442c1af418f1ce8a723b05822a52c3757172bab435f19c8b068833e4476428d7a49077c40fdcbe07aa4b0a2b15bd74acacf872a0255a15a3b75fa4050a89c84c4416fe0b74a9a499f49c99bdef7d638588e6c4c7269d7716950f6948a5269cfab510ad6612b02b3a638e6387b3950fac06c72d941cd63ae7e3b7212fd7b3734c915f9630ff6f47958c713c2a188313b25f76def1a2a9073aa867a479b9cc63e45891f04357812f295a753c01c154ee8e12d0e1403f1a6baf878c3e289ff173bd2ed70706958e598ae1fede6d25bd714a9a78f9bbb1123ac304903269c2ec06164997663655973aaef4aeddab0dad4f16dd386824eb69dd42dbc749e72065d93b34bb388ad63353f94c847ea38844f5cd11e19b93271ca722917bd0a3fa415bcb6e11279a1a28f2f75a05f24a3ce811a386b37830297e75edf34e57eda39127d8fdfae97b67332691b9123405cd4dce3f74d85f870d40e6af9b7c20a5dfd075156649a036cb075287789d644ed061ac7cc607328cf9012dcc7ed6c202f5887828f1b5332baacf223fba3bc7ae0e39d0182d8f018c221aa0506c2f73cf37d04c74d231986236445e5c68b9f12c8f833479a7d9b8f32a945fb921bc070fb4ca93736403c06fda22b50352baf67f34b8406fb57dd185e2d5a74d33540ee984a909c044b66da56ced4252ebf32ee38bdb702089b5cb7b9dee69bb9184469d3844e1819bf1705812b1aa6f4667652a3bd7ce8df1a79c6f0801c188f0ad3543ed52e8d7d2c64510cfdfac1ef581bdaeee8e185146737511bbd50b233e8fe3aa263df05a01246b7617ff190d5b8734766855d96a3a4166699e44653eb7f35078da6796728aa71622d30c4395851bf4a0c8926b398072731d69d3d9d9fc63ec9c660ae04af441fb79667616cb0dcef97aecf01957663309806d48bb78f047a52f528e39409c75a921b36c89c73c9a0b7f5f0f3ff4e1378ed998ec17400916c792824d46ec77ccce4bacb2b29da2354f6c5471af704a28dc40c8a9e0074f73592ec6f7defbfabe409b4a19f4e0b8a28162e9448e10982c03b05ea1410433cfee84661672f616962fb45cb851c867aa6a3f96d69e000e0f9aa9d58255f4c14b65e934f18f004767ecb588cd34d3caa4778529dc0ee13cdc39851e55133ffbad2104228ac9817e28e06ce47f231bd2d73ce2eb6105a820c241ce3310e62e7fa69a71f75b766f80b0c377b2a9c1b911d1e3b76f1a2b9f4f10a81385d52f5abd44d3991afc1a6722a42adcfc6fe207116f291d2a5c05e046e09c095e660aa6734ed0b2a14920b2449df7ab3d946d9396d9a5bf7d61a7452ce69964bd0b7a1709e9452f228896c77d85d0feb8fc28f3bb4ca73d71a227a4b7e7c76f5a9fcf49a4821a7defba3fb6c6360fe6619473110152afe23c113f35d65dd707099f6eec7b6732bb046a73c96e41d618fbb68ac7fb360481d92f4cd3f0d61a163590c4d23fb91d1429b3a7f57edf099fbfc7fadf2b217a766de931a349bccaa19b121cf04ccf567267667dbe4ae69601f7cda7433ae9040196895822af002632c20b0fa5020f29d30c33b0f3af051ebc60966ace8006434719f6d31de6357d820499ed53cea0b1999ec85ae9579bc10015933bebbe2972ea168ee9a01b6cccba036075e966a6c5b88410f316df60db44a50162fd58bf2dbee91ab818411539c2d4b5e1d35860e95eb7828c38ca88017893a286543758d5df3b73fc102a7096edac5411f751dc3611a43bbb3cd1f6f7d98d855eb294597b8b2d54622c6296bee487c58f42722d161093171f47d5ac79561459fbf24888c98e357ae2d3fe8e91b65d39230c15ffae4e097bdda3884f8ed592e5d49ab278cfbd07d4817212ec0310600ca28e1b999bb1daf67da2d055652a781341dbdba9cc926ea66034694cc2268a8226fa39a1242e43b6aea5a8305281275e1e79fd907deda9b655847ff40aefcfbebdd4d9a148cf56f76c88a04b8ea5044570f77f6f1c669b876cd3caf20f3e4f97af69f976c92020a70e6b1f8729f0f1288ee2b22d8332c730c9e56803df32a99effc8269c3444594bd153edf43dfc702d3f0b2539411e0d727d555e65f2380eb076aebbafb4dbb9e87c30f279f36ed751a06cd5a88d16a2ed16fff43b4ea96efd5234e949528a898621512f5a2c67c1ea06d118eddec9ef1a81c3b294e579404856c4617962e518d599822cfece528f46abe410624e87deeccce7a738987fca45d42e8567a2d1bb49a9bed924b85afce98726a746961e44e9f496e69a831fccb4e857f8110a3b53ed6ddce71c4334826863986b87a8e6c6b4fcf59c252008a48bab2030ef26a7c7bc7f50a527c4b48c81a7226628920d49ba1639bc071c57613ec06cefb874653206d0e3e303785029160469d6dfcea71e878d72cdd411d560aef977d7cd8c33c81e5c432744eb24f5a315d96fa9a96514c4763a755ee4fa4b877dea22483642c1f3a41ac0babf7ce1ba14c52f1aab3bfc8bec02eafa0572e036650db5bac6bc4549313dd86d36fe0d2694f86566869e6be2e73bf22ee23b11b2a7925ff2286903779bd45e4e9ea5fc79cc5a8a045933b0d43f9ab84cb37a4275a24ca2b766d85262f0721d7b8a5103f52fccf447aae028e1734b1e7b17f014d6ef7a041a18584f77fe01dfabe76696989c27ca0757ee62b6d42f77132d860b4aac3c6c82919aaaf6826b1c359542a60012c9e44f9ccbcff988db78e95cb5916681466540ae57c4e4ddf0d2a0bfe2c1cff52022b58fc8e90bdedb6e94916bdc5895cf900c412fef7a2bfe8f272da8903959eb355faf14350a61ce99b2ca4c1a8ebba2b55b82becb45d3d39015ade418be18a8a5939d001b6e71a14ed945f6110da8f98c84aedfd58f2c8070316df7424e48dba639dc23013d5ba476482ba54242822164c79601c52074158ab2a807990c1d47c10a068c11ab14f29eaf87216dfc5e31859ec07f47debfd6ce9ed315249fd022d4d7d75d6eb4871a2c0e68b9347899bfeef11ce41f58e254f4ae6f80e8ebc5d3f17ef245c9aa73c366caceda3c49ab782e5c50e05f1184c3930d5ab686e3a79440e95bf5b3bd38c36bd79037bc103a390e1a4f4930036fdc5daf7858b266f315a59690d504932d9df54f18c02e024f6f0ff67960a659826a1f0e35b92727ad680db705bd20cf5ca86cd5e030723c6695d7c1e1b28d7328b8473c486c9683533fa99a4d516866ab86111ff4769672768139f2843a48bf32473dda0f6482034da13ce5b5e7a371b12ca5743baa69795a6ce0ba4605a06815dff182ab29af2e7cad85be3fb534d66cde1ded614eacfb1d62ee333bbf698bf4e0a5f354e9daf8168ace6aaf56f49b12ee0acde6edab2ed0521006cc7867e4d9db444f148881719f6e279b341b37d4d616fcba5d8c9b9cb789d19caa9f93473b1cc88f04227d588754ef1a88402e2c26e493afddd6c41c2e735263bc2158d7c1792fb82fa86ed647c24efb9d98bad2a47622142935b5ff80758a446d5e6c96035cd03092131e79f6067fcfebce784a5b3eb08fbc2e3dc7d7276b52bd92482c1849624ab4196d003db85cbedfb65c4cb9ef7ba0de7d875e5b5553e64df540949b82152890c7fa0a1d27248877005ee03c5d69d529fb84faf0708d386f8f7ab0c3ff4ce52e72b4ad569cc31b0830f3c49a1e5500fd58a51c470cf7e6acc89bf2bbf3ae0f5a6ed4c4bd7bdaf4cb8ce7e911c46172f8e68a9675d5d9ba0b8045bf09c1f39840498ce5d3cea440df80c8f0876fca93e80f6f1cbdbbef6599a696a864f0f1ded5ffae666df238f0e0ac08f7849773190919924d0a148e1be7df720535bb8d3a8129ae27c77df9d42b9f4c378a7c8019fd876baad22eb28e175e2acde26cd639475c3f63351a57054e14f1969581a5557f88a3e4fe456b34e8a64b768aa5e1952a8014a317013dff3db78fb833c23c81259fd74585bd23597695d0aada9d93258f2ada17c09c548a373570adab3730405d712734a36903d7d36ebc6a94b40a87839268f978c05f291fc44c29aff5e08f34b0bad95e4c21f269a8bdbb1e935ece62e4b8eaef27836726c600f269b55333ad6b97df15727f6bc7e195d7a5da0be626578735f24c1c451db0c61ea13c21", + "salt": "69da88eca2eb3d9ed5e5c76798ac1d414ccba7c132a492c16cd73ee06f8b37a1" + } + ], + "hmac_sha256": [ + { + "key": "", + "mac": "b613679a0814d9ec772f95d778c35fc5ff1697c493715653c6c712144292c5ad", + "message": "" + }, + { + "key": "", + "mac": "2fdd928e298568da7dbd85de38991312979ba04779474b909e32f4f8deefe7ab", + "message": "f0f2cc66567caef59275c16c7f61abff712a1f86c0e363bc6662affd411303bd" + }, + { + "key": "", + "mac": "8e8c5be4d33112713420e2a2ad09fa924def34397724029e3e73b5f81d842eaa", + "message": "fe66c9c83b67c14668d135cf23256bc23b0b91a954c1c4a22db2d9686ac046103d16e619920952823d8cfac54c83ad6d1578b3518cf2f06cc358b342981152abad85031245a18942524d99fc3ccfb0d09add9dca8dd7c7bb58ed02561a1a69d1fc2b66cf" + }, + { + "key": "13", + "mac": "a783088eb43ab9f38d89ca0fe4b503a7f2974707648582d36f4596288363da4a", + "message": "" + }, + { + "key": "cf", + "mac": "1fe42c490c61122610cd95ef3482132ca67c4cadeadf1f60273ef955a39a4b66", + "message": "87cacbae7b60aa1cf2551dd125dc13d2b55c517571f0ca4ed1c63230d437501f" + }, + { + "key": "2b", + "mac": "9f139dbe75ffa78e8406572ccac9c5c84730bb5f2219857405623697c373b789", + "message": "b6895a7f692d4ef61e1fff2550766c268a8f526b5aaf06b8562dd0568d994781cd9815e59e53b2a708d6deb5cf00018502941e74e926eafc666f668bda0528c0022dfff65de1d235fb470561ce586436f3a3ae5eea218bfa1b1ff4af74639e9c5268089c" + }, + { + "key": "ccf83946344c80d8c1f44da5c35c5414c9fb10af", + "mac": "29e5453198ab76d39f13ef371ec7dcae215e8e80e2331c78cb2c4c95875ab9ee", + "message": "" + }, + { + "key": "d53380ef6ae7bcb062aa586797706ca5a5394da0", + "mac": "0f78ef255599ccf02c1959fddd5d6faef484517cd2e50ee233b3a6b255463a11", + "message": "8bfa41824926bc9bb559ca597f308b88341443be46a4bdf4ca0666759f3c4194" + }, + { + "key": "31de96b3dff46d096f2ae29cb17c9f3bf83bc2e6", + "mac": "3cb0dd801ae9218f0a2c3636d3f13ebf068230189a948e5ad184d3ec98b1a6ce", + "message": "3ca2061cf9b10b32da95658d80ac0e5ad493975df999a4d5d1dc9b8cfc2dc583997f2a5ae4e1a7dccd1ddb386cc4577e4ba9597f47f11ec2a4f8015caa3a6cb41e8da528d0f34c01b2bdadc0e0488031d07af8684b5d2cded546997689756e29bf4fd024" + }, + { + "key": "591aaff840629d45570bc9e0ca208c5436e0af8d6a239e05d251e3f068918caa", + "mac": "bac2f9516f6e81a45ba0f49fe6ab61d24942814cb0cdda9595f6625b993d0675", + "message": "" + }, + { + "key": "2656b155eb98168db5976f2284023613fd8859a4492defbc2c705bc0ab64fc92", + "mac": "20b3ed1764b97b77e61c7af20677ee72e1f0ac42a46968a22f79cc05eb06cecf", + "message": "ae11166dacfee8e3095cf3c8156cf44a3dcaae6b1426450672201c9bfa452464" + }, + { + "key": "c0700b00b30cd9b488b961046c6d3ccd052ac7959eed3e87f4ba1f2e9a5f998e", + "mac": "211bb6577575e33e6b92336d1d66b23653092e745b2115110ce8c29edb1d0481", + "message": "3b7a1051ca10f3f7f6bc654924693add2840e23b6a8076f6c70b54dde0c3faeefb18683d41fcd441c8aad51c0e1b0739d4469954dc63fa60d85d955edbe1d2aabb1eb41d3319100aae89eb9fa1d6d459794232ee1f8519c5f60f5987280a5c85b46efbb7" + }, + { + "key": "bc28d2047b5fc6e399445f828100a42c8acee1b9a218f9813ea4dc8522faaf0a57910f7bd38d01caacf31e97f98f80704cb1b07cf4ad68489d1a3cb9c8b190", + "mac": "a1004c38d903d89702e0a43fe53baafab81376c3ddb42e6d92f9c86b7718578d", + "message": "" + }, + { + "key": "3d0002b7cf8d76598b5e6bb5e2eecf12bd7843d36eefc6d459a81d5bc62f4415163af935c73647292d6f241bb4f00037e45684cbce5dae79258d47332036e9", + "mac": "4b61c4a2246c00933ac9ea1a7a18af3dc1a40a1e347c30800fc6ca727c63d85f", + "message": "62ecd0928106e35fb3080d1eac2c77384efedbc617c9e2ae3f28d49ed0001776" + }, + { + "key": "22ae885f006d458192f7347265c9d620a9f55710827ad79fcabd96f178a79d1d04b51ae279cea0ecc8227e41925b9b2f32a3a26dcbb25f169a499014b0e1a7", + "mac": "420ae1c441499fcd319a4f5d4d0d684cc9e7cfee541a6cdb9f78dcc937d4c5bb", + "message": "f1be5bbe97a3d93419c726179611bc75884dca1886d3b40b868bc3e3813e8854ec692ec809928a7ef17dcd4aa1f00c0f3d44810120b00affd6399fe619ee336780c89814e2a2a5f16a5579e80efd17480c04c303a9475478c11e43370d7fe9a0ef3f649c" + }, + { + "key": "b79da64e016871fed0e9119f6528ebc9b0f9960fa8bfd21336d897fef4ca07953f0b379efb1fd3b64c0041a90ef84c9a320de31f6059aa3e6f12cc3573ab6497", + "mac": "b433514f60b17968a1cfe7f6b1a4f63b381a1c945bf78b4503eb5158ce244e48", + "message": "" + }, + { + "key": "3956e6e79a25a35f7effdb7c08c5e35539328a7631d1bf6e48ff84be2af03ba197c49bf2b463c8e913f9b5bf512d61c571ca8fcbf5be973b84891c12948c966c", + "mac": "0b37813739efde560fda3074a6c0bdc305b3ecbfba390d801a2a222e4e85cc9a", + "message": "c9e561dea2ac539fe30fdcb9a9e321c19b867f5f869322c14b7c18adee6615c5" + }, + { + "key": "090b3c1d3ba392c7cbcf7e0a4fe9552c4c9a6ff0afa265e07d58b3c9822511ece1a3ec32cfcd2e8454fa28408fceac8e5f6e4825475ab932c9eeadc09fb004f8", + "mac": "fe88d0cb788154729d81289da8014492e7bccc381796e2cf64eb4756664de63a", + "message": "d82e163cf604ec42e8ac71fe5a836fd508d76805e4baa63067b83671642e4c6760ccced2a517c5bbabbc3edeb6b352d8cb7eb8279e5c5757cef93e443455aa18b00182d9211eef57d5d5e7d4335ecd3028fddcb248a41759c157e026ea7615653f3d52ca" + }, + { + "key": "59f7f2265460d3d33c9313c219816d4716e73dee187d4d1d2d1fb73044107222ffb87f93dd5c259ae43d51dfec698c39de6ca05a1dbb43c5e625ff707e3f5e1877", + "mac": "f1af2b7da739562cbe1c9b79d88b421d85622c44d47b62ac90838215264a053e", + "message": "" + }, + { + "key": "4a9f20e6a83983966adb60221a1666b4a31094d64a7c1772df983517c9ea4b4a43014e6bfb8dc2213022608872323a8f8536add3a509616f5e34d15e81878db0dc", + "mac": "13374292a8359e6491fa5dcc6d9a17deba19f81530ee30a87529a2404a426883", + "message": "cb69f7728814a9535d92dcbb72e24dbccf91fa34d30ec7b5634fc05c7e24e46d" + }, + { + "key": "7bc1c6e442bde5b533db9465e2cc07f0f4e2e011c8a4d4c052563134e3691183d79861eec1adb7269ba582aa5bee6ee355eef33ad443dce959bc5fd0929ecda8e7", + "mac": "14cd8dd5474accd132e2c2587ae5538bc9e120e9fc528e78dbd3ea12e2070334", + "message": "b777b3d21261fb9117107d5f79ecd618b799790492f8788219ddf96796a13518c73288c1a87176f0db085afbddba233f399bb296c51b8099ad7bc79dcc19f9a9c10e9512f6ba1aa81a9b07c8f47df02beeb41f95198c70b4265cda3923f6765837f449f0" + }, + { + "key": "d52dd34360f9a7ee000db12c8e4fbda5ce36ada587af012408cfaf242e0140db24a225c3775c1b35e61fd27a61743f8b268f51165d4feed0754126795ec2d0c9b17d285ed45ae41e55f4b65db6068e305dd43f3509b0c740418d98c831cae5ef2f7438a8bffd7dd5a73dabfc657020725f3b39b0d0e62ab05eb62ea9375c41496f9a54", + "mac": "02a14417ca6efa6b5f071bc37d1e316214daa7612374ff062bff2608a28b30e4", + "message": "" + }, + { + "key": "1520f7df95c0f9ca95a428c26eb702ecd1ad0f95a12e9339e57e9fae49977ff0f0741fed9b3c1992676316b97a834762586d284a0502c99b37fe71bb71f6e513bb216d2b5e6422a154347f26b350e0f051a2fe21b7a651e44384e9cd15c76c93345b23e0ab65c8b638545730cdddbc11867fda294ce12764bf9c07b439101f99c36b70", + "mac": "23b0133545daab148260ff14a0c490dbad3ae91ad298136425331ffb60772513", + "message": "7cc6b5cb2365cec5acd2d8e6b66688880a921edb4e4e7cf1b8894885c41d220f" + }, + { + "key": "6467752713f4e26106a75d8ccf956581f1dfd53546a8731a4f5c8a6f302106ba9d90881aa252282f9723656118b1a599a4acd9e92188a9ec01c1308eb02661c6c6eb2043116a4a57d1e1a7b26a0ec30ab9aa1f7ef9100a47838533b94f179d9bc10ce678d2740504b1bc3441d5faed8fa74115610a43a01635edb8c5e71dc758e622d8", + "mac": "eafce2aaa2f17f7c922d681b8e65283a1ef96b3f56b0519e36bbb4a0ffbceab0", + "message": "1000f8e899ea107baa42758aff5d1d87c60874eb809fb840604f3adfdefa1d06b4d770c75d2025450a5748ba6c778b21b67cbcb2b53943c69fa0bf3bf9259884e89edc9b9c2e683636de39010d0a00f60941b5a3eb9139a6521e1c3daad6e791e5757f58" + } + ], + "pbkdf2_sha256": [ + { + "iterations": 1, + "key": "120fb6cffcf8b32c43e7225256c4f837a86548c92ccc35480805987cb70be17b", + "length": 32, + "name": "RFC 6070 inputs, c = 1", + "node": true, + "password": "70617373776f7264", + "salt": "73616c74" + }, + { + "iterations": 2, + "key": "ae4d0c95af6b46d32d0adff928f06dd02a303f8ef3c251dfd6e2d85a95474c43", + "length": 32, + "name": "RFC 6070 inputs, c = 2", + "node": true, + "password": "70617373776f7264", + "salt": "73616c74" + }, + { + "iterations": 4096, + "key": "c5e478d59288c841aa530db6845c4c8d962893a001ce4e11a4963873aa98134a", + "length": 32, + "name": "RFC 6070 inputs, c = 4096", + "node": true, + "password": "70617373776f7264", + "salt": "73616c74" + }, + { + "iterations": 4096, + "key": "348c89dbcbd32b2f32d814b8116e84cf2b17347ebc1800181c4e2a1fb8dd53e1c635518c7dac47e9", + "length": 40, + "name": "RFC 6070 inputs, 40 bytes", + "node": true, + "password": "70617373776f726450415353574f524470617373776f7264", + "salt": "73616c7453414c5473616c7453414c5473616c7453414c5473616c7453414c5473616c74" + }, + { + "iterations": 4096, + "key": "89b69d0516f829893c696226650a8687", + "length": 16, + "name": "RFC 6070 inputs, NUL", + "node": true, + "password": "7061737300776f7264", + "salt": "7361006c74" + }, + { + "iterations": 3, + "key": "1183f5095e71c8124d60a19e3dee1ea1287a0953e236fc0ec7fe48bbce93ec20df63c0f10bba0feca3166cb722f478599a9aeb152339376c6f67898a946429507d7716885916", + "length": 70, + "name": "a password of 100 bytes, 3 blocks", + "node": true, + "password": "30313233343536373839303132333435363738393031323334353637383930313233343536373839303132333435363738393031323334353637383930313233343536373839303132333435363738393031323334353637383930313233343536373839", + "salt": "73616c74" + }, + { + "iterations": 600000, + "key": "fceec4d8ca8de86c85a1f26ed49f82a2b38431bd0ce36db995ae7dfd49b96e41", + "length": 32, + "name": "spec §38.1: perro luna casa verde tren mar", + "node": false, + "password": "706572726f206c756e612063617361207665726465207472656e206d6172", + "salt": "446174654b657973206c6c6176652064652070616c61627261732076327c353264623962613730653063633066366561663738303364643037343437613166353437373733356664336636363137393262613934363030633834653937317c313030307c3030303130323033303430353036303730383039306130623063306430653066" + } + ], + "poly1305": [ + { + "key": "85d6be7857556d337f4452fe42d506a80103808afb0db2fd4abff6af4149f51b", + "message": "43727970746f6772617068696320466f72756d2052657365617263682047726f7570", + "name": "RFC 8439 2.5.2", + "tag": "a8061dc1305136c6c22b8baf0c0127a9" + }, + { + "key": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "message": "", + "name": "r and s all ones, 0 bytes of 0xff", + "tag": "ffffffffffffffffffffffffffffffff" + }, + { + "key": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "message": "ff", + "name": "r and s all ones, 1 bytes of 0xff", + "tag": "23feffef23f8ffef23f8ffef23f8ffef" + }, + { + "key": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "message": "ffffffffffffffffffffffffffffff", + "name": "r and s all ones, 15 bytes of 0xff", + "tag": "fbff27e6030028e6030028e6030028ee" + }, + { + "key": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "message": "ffffffffffffffffffffffffffffffff", + "name": "r and s all ones, 16 bytes of 0xff", + "tag": "fbffff17faffff17faffff17faffff17" + }, + { + "key": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "message": "ffffffffffffffffffffffffffffffffff", + "name": "r and s all ones, 17 bytes of 0xff", + "tag": "7cfe7ff768f81f2763f8bf565df85f86" + }, + { + "key": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "message": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "name": "r and s all ones, 31 bytes of 0xff", + "tag": "5400a8ed4800481d4300e84c3d008884" + }, + { + "key": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "message": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "name": "r and s all ones, 32 bytes of 0xff", + "tag": "5400801f3f00204f3900c07e330060ae" + }, + { + "key": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "message": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "name": "r and s all ones, 33 bytes of 0xff", + "tag": "86fa6a437bf4ec24a274504dc37495bc" + }, + { + "key": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "message": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "name": "r and s all ones, 64 bytes of 0xff", + "tag": "900fe32bc15fa8d7bca8efe4c7e37eb1" + }, + { + "key": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "message": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "name": "r and s all ones, 100 bytes of 0xff", + "tag": "b99c030d7ce939bb6607393e68656f22" + }, + { + "key": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "message": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "name": "r and s all ones, 257 bytes of 0xff", + "tag": "2d5d96b08bcdc7a0a2dd87a44f5222c1" + }, + { + "key": "ffffffffffffffffffffffffffffffff00000000000000000000000000000000", + "message": "ffffffffffffffffffffffffffffffff", + "name": "s zero, 16 bytes of 0xff", + "tag": "fcffff17faffff17faffff17faffff17" + }, + { + "key": "00000000000000000000000000000000ffffffffffffffffffffffffffffffff", + "message": "00000000000000000000000000000000", + "name": "s all ones, 16 zero bytes", + "tag": "ffffffffffffffffffffffffffffffff" + }, + { + "key": "ffffffffffffffffffffffffffffffff00000000000000000000000000000000", + "message": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "name": "s zero, 48 bytes of 0xff", + "tag": "5ffc6a6b51fcec4c787c5075997c95e4" + }, + { + "key": "00000000000000000000000000000000ffffffffffffffffffffffffffffffff", + "message": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "name": "s all ones, 48 zero bytes", + "tag": "ffffffffffffffffffffffffffffffff" + }, + { + "key": "0100000000000000000000000000000000000000000000000000000000000000", + "message": "ffffffffffffffffffffffffffffffff", + "name": "r = 1, 1 blocks of 0xff", + "tag": "ffffffffffffffffffffffffffffffff" + }, + { + "key": "0100000000000000000000000000000000000000000000000000000000000000", + "message": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "name": "r = 1, 2 blocks of 0xff", + "tag": "03000000000000000000000000000000" + }, + { + "key": "0100000000000000000000000000000000000000000000000000000000000000", + "message": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "name": "r = 1, 3 blocks of 0xff", + "tag": "02000000000000000000000000000000" + }, + { + "key": "364b918562983401ab38ff4ba80ad9a8b32f428f19ac406007acd34abe423253", + "message": "98122f4be94c1a0c29f104247e1e45c21a93df4728340c72551df5a549ffdce1ddfe161fb8b83215432a491ea72d42c3ec199e568531170f92a640ab03a81254f8803856651ea928a1c39bf645645b94f6396f8b51e9a81a2b3f4874cb02d274958fdc", + "name": "random 0", + "tag": "45977c98012ec23aa9f1fef5f528d431" + }, + { + "key": "dddb7b26f22dcb06737e0069ab17f40d2100a15970423cf275b90225885454d8", + "message": "504b59", + "name": "random 1", + "tag": "c0faabf643aca88046362e7f5815fe98" + }, + { + "key": "11656c2416f927e20e98ff7aa9819315a5cf0668a942964e27db10e7e063b6f1", + "message": "621f4e4bc6cf948cf9b9531d809cc347a3e7cbbee77b7a4a602ceafc7b6ab513130c9b201dd646163ee0cedef9432042ac6af89f64d9ec485b9acbdb3c65a934fefec9986fa008185b016126769de64cde54b3e3a971fcd762b4b689db5bc4d59d1f18b75ab1b3b71e2534cb14699a2209ec05e11b5bff0075b62df50b14763028dc6d3e4622eb3e8d3d01c15d7c9980582d9435eaa7b4441c7db0d4e7749c1e77325e785bc80b", + "name": "random 2", + "tag": "8274833134fbde493b4517b2caaff562" + }, + { + "key": "73e55d9af984aeeaaa77ad83f0c49e55490735af1bae87d80bb2355437a76d21", + "message": "9986b2601582a650f873fea9f0de4dae330fdb7be4382a16781991160105b8d98da8fa1ba8845deaf471da2b5e80a2dabbac62ce4dae4d956cfd12e1f5a016acb33349a6b18d5dfb27e9ce9ce60fe01703ee27301c22971b173de07c8eafbbbf8be5402f75f2bd7512c616a43e9602fb6de3967d5a7973a50ba773c96aeac4ee99c8c7ba6c493feb41b1f930c5b12411d566e972605a6e43f1b54317625e5113f04370b5fed0d83bce7a830e0a2f7698e00fbd4951b712f7", + "name": "random 3", + "tag": "fe08e95a80d5371763b063db08f1df88" + }, + { + "key": "76e8e5f3d04f41d596295baa987d824a750fcf581762ed856d277bfc53da3d00", + "message": "1dad6af724d54807f69b783a88a62c76dc2392e7a89442adfb2756c4ce5e4c20a675e97edab7baceb7d019cbb249537dee5c07244a8464dea5b35884ea402dd96ea5e59d876256b717d6212af3919667d456626f471d78f8f1218337e4e6848d6447fd75a9bd1b25b9cc43c77e80b882fc541532", + "name": "random 4", + "tag": "80236805aa95e9537d3b84f5a8a0396a" + }, + { + "key": "c7dca18659b447124fd1e57ae7a9bbe608e6e311b1b3cb8fb035f99e7048143f", + "message": "282d3c72f0c1ae0268697e225065e1b5", + "name": "random 5", + "tag": "9b65f873165e71161a80d62f196bc780" + }, + { + "key": "070b609a6b591d93795b6a1458223b3c2a4c940bfb8d28082586b18e686cc0f8", + "message": "9f3f0d57f182c1015efc8619128c384f418829ad6ad5b0f82d6010224576d526b5ecf675fe55bdcf", + "name": "random 6", + "tag": "57fc49de05ac7844ae57a28e24ffbb0a" + }, + { + "key": "710c1bf52675cf59be69c0c720ae82451df1f5413580d6a4eb3aef3d926eb00d", + "message": "67aaf0102beaf12ef6f17f7c1dedada22ce260f6e5b3ffefce37e939a11fa5836253a25e8d088f8d8e7b3efed20b2ac2416e681ced4b6e369f", + "name": "random 7", + "tag": "bcdcd91105233ab451fbe0a6ebb5bf29" + }, + { + "key": "4712499c986e7f12de80a2ed84fce84aae268a74f9925f172d2b5f009ad8f5e5", + "message": "4ee5fc28fdf692feec44666cc8d074db8a1794a8016221e81d725116091bd7b86e96a6f2de44666ada9bae74834023ca053dbc567ea8a911be4266c677eff95760748f82a52cc7b73d557944282154ba578deae41d5dce30e260104c1b", + "name": "random 8", + "tag": "85508015a13d5687258ee88af3ca87a8" + }, + { + "key": "af388a28dd98f5308c56c9ffa177a0aa55e14e258e62e2521b695769a80aaaa4", + "message": "8abaeaf1a30a409d799ef1388938", + "name": "random 9", + "tag": "5a0a583d5c12ef6845c7530ce93be77f" + }, + { + "key": "b0e5611f69de9efa2f4266d8376c6bdad49d719f615fabfeb3f92042b7c92e15", + "message": "dc68738e1987ffc987be33ae1e617ca532d06ef21762adf26b4d2dfb971d7b19ed1fddd80539a59f7a127e6c65281cbeb72afc8596a335a2940d34eb884dee5ed20356e50143cf5880ad5a14f9", + "name": "random 10", + "tag": "0fa415d30d6125f2fd0639e8ec1d162a" + }, + { + "key": "6eb7317d2e085ff2273544cb7a3697d29cb1a9aeb699bbab03d2215d03da7d60", + "message": "dabae4b2e0622522ef1d1a05aa87d9bbbdbb46c757d70b8febea5ad51b076f759b13440109951604b4e799c86007b2702bb321a98f904d4b30df2a795a795b070e3e1414c67b49ddcd2fb2bcfcc665276aa0", + "name": "random 11", + "tag": "fcf85c210bb34e950206336e67c1affa" + }, + { + "key": "b035ec6073f0df1f720d93e0256ccb2b52719fbf26704246fbed564907bb0aa3", + "message": "cb16977e52cc707ae4651a2efbf07ab65c0ee0c4f3479509280495c22c0050a6b1f6038f511cb4cd4207a282ffce629499e6c08ba90d82dd8c97376d50a993c343430ad90d03638cda12f022fde42ad86039592a2861127449e0ebb5", + "name": "random 12", + "tag": "ba0c5a2c8eac58de3b6a35a6c50db129" + }, + { + "key": "ec322484d3323741e6bbc99e6bf4958ae7ef7b6e9d1b7d72d23ac2e8007afe2d", + "message": "214f47d162bffd634bc1c9c1e14279e878769e280d0660c04de9846085e594fa2e38a53d84b620bece5efb23082a89f104", + "name": "random 13", + "tag": "083f639549ba789166089d65763fd273" + }, + { + "key": "a38d92f6c866a9c1eec4391dee45ac454a415c2d0d985e06c411003fda14af1b", + "message": "c43fcccbc4fe7b916f64bd836094f4e065c039f2d1ff30024d4010f5315786d327728bcdfa955dea69a6a7281a06ff064c9de700aae27bebe1739af155287efaf1a824a0fe8df0f2c4c2d1940cfeb9e4559a7faf092662aa4b63d1e6de6a2ad21fa8c5e67a910798587bf3d1b4ad9f", + "name": "random 14", + "tag": "7216fafe549d56bf48e89f9a3b4aecc9" + }, + { + "key": "9fb6f071d543c65d62ae90d8fb916dd9f6a14a37831503ec82587ba98209205d", + "message": "ca823dcfa8141fdd745d39d873813baa037428", + "name": "random 15", + "tag": "8203e7d2ac5815ed780d9ce47574a2c8" + }, + { + "key": "4ce6d398fc2e520f5ecbefb3ad7f0caab8c6a845be9b707f592fd8e1432322bc", + "message": "ef5079c10b5239c3f94f2940a978176159c4066b4281b29353a82648dca8805333b599f72e61e4e8c30806d339c698b5b5caf8618aa3c195bd43a14a77ff8bdef86f465ab09b6cb5778320c88566ef1852205e83c0a839ea23dd3eef935bd7de3859a4ad76e0ccba83284a4152b78c3df871bb4085aa93b3b7b06abb1bb5f66727cc08f78d9ebc77ddb1e8693c3433d8", + "name": "random 16", + "tag": "36f0f77d1423d537bc6f340bc4b0fbd0" + }, + { + "key": "420f3bb2d4ffffb665c6db221d5b513075f26304d8b0c9190078e3ae5487fddf", + "message": "db123703dc72be8f4b728553ac8b6d3679ece90f18285e", + "name": "random 17", + "tag": "2a3898d8437e1e064957aa2016528afa" + }, + { + "key": "7a0330ce187894483c9cca758cb85b91b652cadac252cb9ce4528ec3d98914f9", + "message": "225c", + "name": "random 18", + "tag": "38a3e4013ef9c39387aed8f4516421d6" + }, + { + "key": "bdef67ae0d5217eb8348c2bb5d4096d68d50af3fbbe045f6be71bfec79c965c7", + "message": "25053f816f7aff424213b1ce2a43087392fc90e79620584334366bba4444a412d77889ddd2d2349b8c707a646e9ce5fe5f7e5b23637ba8b671aa6c78a6f4d3feba9a5496f5b5fe577b6c98519c84115b1ef3e1e171c384e9f92f171997a22896e3a2bec655d0a10b0b7b2f63875e4acb997e3e3b17cc9fbcf68f3c059ac1741769f7598512988f2c926bf30b72df1495bea9c41aeea808d86ac367d7eec7428e2bf5d7cb0988ca786b72", + "name": "random 19", + "tag": "4dad17ac26f8445f3ccb3c8da7d1920c" + }, + { + "key": "46ff7ed7b969fd97bcbc683f833d11ce621b001994248658438e147381e57b3e", + "message": "d5d6d16a1664e4bc7420b319a76cc28262cb2e31398ef522b99c4f4738aa2a61e17e7b749a8fcb731428227479cf62aca0595ef51cb8fe9061904cfc30c920362feb486d6005d52f82fc19c045f2fab118705ed33f8764f983969ac3a671e2fac7e03a5b3afe3b7cbfcc30f350608789399cb8e15e2f7a91c9f3f78efccbe7d63a437a667619a6a75158be22db9a7accabb2859b3160d4806ae7521fd61f09569e2c083d8417ab978ea3941bd66d4727", + "name": "random 20", + "tag": "ee9fd00272a41c74e56086c5a59ba644" + }, + { + "key": "453058edc6ff4d4487c62369b4eff01e1d99e765257251651b51f783df3b1edb", + "message": "1a29", + "name": "random 21", + "tag": "c8a2dc108adff75282a3e8f2c272aee5" + }, + { + "key": "efaf2f6846aebfa27feaf0fb8b1a116bc2a4bc48b5520c634ea217599b4632c1", + "message": "e51c5c055c04a8586069dcbaa11ec1b3622d6709e641c224604ad04a6d23a6112d6de90c22220b82e3897943419ff3e1028f0dea7f123ebd626a208d348e91df198ee5174cf398de1af6461edd754d4119b12f6e7bea538a04568a5bb96a1636f7236e63353d7dbc10fe6a6e1f5cf8307f40bd6090b5eec46ef7c753720f7f89711d267e042c183975ccc4a168b390d771912e97aee04bf597e1b1f8", + "name": "random 22", + "tag": "db0c3a0dce0aa0f68b347718fcc95633" + }, + { + "key": "a45f31a208c4e743c516f20496eec1dcd467239c09d4f9a5f260c666fc6427b2", + "message": "378d48b5f718fcfd05bad3f052ed39171b1a495eecfecee93f647aa221471550b8b8a51d344985c80787aaf2cc36c40898861017d1864e1920d17aafe929f80499d78256bfef07834158c07d36e143d4e8f9a611787f123a25bc2a68ba4f3cd389bda452fb29a51333267419c83b", + "name": "random 23", + "tag": "6d5cf1388600d473b539ba18503e43c7" + } + ], + "scrypt": [ + { + "key": "77d6576238657b203b19ca42c18a0497f16b4844e3074ae8dfdffa3fede21442fcd0069ded0948f8326a753a0fc81f17e8d3e0fb2e0d3628cf35e20c38d18906", + "length": 64, + "n": 16, + "name": "RFC 7914 §12, N = 16", + "node": true, + "p": 1, + "password": "", + "r": 1, + "salt": "" + }, + { + "key": "fdbabe1c9d3472007856e7190d01e9fe7c6ad7cbc8237830e77376634b3731622eaf30d92e22a3886ff109279d9830dac727afb94a83ee6d8360cbdfa2cc0640", + "length": 64, + "n": 1024, + "name": "RFC 7914 §12, N = 1024, p = 16", + "node": true, + "p": 16, + "password": "70617373776f7264", + "r": 8, + "salt": "4e61436c" + }, + { + "key": "7023bdcb3afd7348461c06cd81fd38ebfda8fbba904f8e3ea9b543f6545da1f2d5432955613f0fcf62d49705242a9af9e61e85dc0d651e40dfcf017b45575887", + "length": 64, + "n": 16384, + "name": "RFC 7914 §12, N = 16384", + "node": true, + "p": 1, + "password": "706c656173656c65746d65696e", + "r": 8, + "salt": "536f6469756d43686c6f72696465" + }, + { + "key": "48b0d2a8a3272611984c50ebd630af52e187db3433930c3b74d0889935944cf3", + "length": 32, + "n": 2, + "name": "N = 2, r = 1, p = 1", + "node": true, + "p": 1, + "password": "70", + "r": 1, + "salt": "73" + }, + { + "key": "ddd6413d68edd0396460588e4377b17e5ca46569ac2c8bfe7a91927a202ef49ff218070b234a7496fe8907741e10f2b025f6a10e9b371b2a83d9deb845683ce084e5eaef2ef0", + "length": 70, + "n": 4, + "name": "N = 4, r = 2, p = 3", + "node": true, + "p": 3, + "password": "70617373776f7264", + "r": 2, + "salt": "73616c74" + }, + { + "key": "8a4fdfaca07efc58d564e468800b0784e1706b5c72b56627a819f588051464b6", + "length": 32, + "n": 1024, + "name": "age, logN = 10", + "node": true, + "p": 1, + "password": "70617373706872617365", + "r": 8, + "salt": "6167652d656e6372797074696f6e2e6f72672f76312f736372797074000102030405060708090a0b0c0d0e0f" + }, + { + "key": "1824aa17e3524c120b46a245856386af3672ae7ef5e14a1a5623a77b4cfc0283", + "length": 32, + "n": 65536, + "name": "age, logN = 16 (spec §29.12)", + "node": false, + "p": 1, + "password": "70617373706872617365", + "r": 8, + "salt": "6167652d656e6372797074696f6e2e6f72672f76312f736372797074101112131415161718191a1b1c1d1e1f" + } + ], + "scrypt_errors": [ + { + "error": "scrypt: N must be > 1 and a power of 2", + "n": 1, + "p": 1, + "r": 8 + }, + { + "error": "scrypt: N must be > 1 and a power of 2", + "n": 0, + "p": 1, + "r": 8 + }, + { + "error": "scrypt: N must be > 1 and a power of 2", + "n": 3, + "p": 1, + "r": 8 + }, + { + "error": "scrypt: parameters must be > 0", + "n": 1024, + "p": 1, + "r": 0 + }, + { + "error": "scrypt: parameters must be > 0", + "n": 1024, + "p": 0, + "r": 8 + }, + { + "error": "scrypt: parameters are too large", + "n": 1024, + "p": 1024, + "r": 1048576 + } + ], + "sha256": [ + { + "digest": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "message": "" + }, + { + "digest": "8e35c2cd3bf6641bdb0e2050b76932cbb2e6034a0ddacc1d9bea82a6ba57f7cf", + "message": "71" + }, + { + "digest": "6ab7b47e13810c9c739b90fa2b2874a23cc2bede712724aad6de134c7aa80b8d", + "message": "af183d" + }, + { + "digest": "35879a7beb5642cda3a2961e6a9243713b6f2a892d269778dc5d06e893cfe472", + "message": "53c998fdbbe01f4a8ab24537fd00b4fbbc7548488c73f6c53eb9c562e092a453f8ee3a8270c188b0c3e5d7c71c80cc2df5bed8f19f68f2" + }, + { + "digest": "8e208ac6b8830217429225e111222d8bd4d33c673ad7d1264e1dc8d97a373880", + "message": "08e91b6ef3ab137e80aa8bc393b0581fdf54d0a0b05479ac424d3c035b4a67c8613caa1e26c8f9564d95481bb01db7b0aa6492d3bc591dd5" + }, + { + "digest": "72b3c6a29b2460c75dcb9b808f42a857dd8cc709ed5b29a02a27182d11c12947", + "message": "0a500b5d104159e875719dea73a5f4420253d9ed3b2a8eb08262bd4f87e8491d556e4ecd521a75850c43d641a48176dda32744bf011893bb85" + }, + { + "digest": "c7da1c27a302970da291977e0d8526daab8d6c0c7662069caed154db700b2dbc", + "message": "4499556864d79e902445005600071b5bd10222324cf1e24667786845730167c4c80fb5096985773b5743034852faab408576b18d39674800ccd792441fe741" + }, + { + "digest": "abfa7d689f615e14dbe7b47cdaecba22ce5b6e7b997bd790a02b1c8029e0a461", + "message": "26250fb8896e987e69660bc1034ae3c67b142e970f3a0d052a8f9583a39346ffd10d52a58127e48f07eb7224317e6d16b5334cfc03da7c116d5213b74bc372d8" + }, + { + "digest": "5cdfd750ada90057e2a631516251c3649cce33d99511e64963bd9743f4d4ed68", + "message": "daf2ff9cab2f1ccdab5176cac5e455330379cf55dabc4657b468e939f773f1fa2f962ba1eca754ac56ea1f8fb30fe538a96831bdbced4183a4b7cf6dd6a24042e8" + }, + { + "digest": "d38074c0c286a37460c504f12f9b1fd9927b241877bc9daad1274a9594a78881", + "message": "c8f888e5139c3efc201441fca55f4cfcfd19ff4066b428d528b151d431c6e6a83ffc66cc031e04e1e71884c5206ba92ebdf705247b6e203a28f12e7e8cfc3893550e362600583c6c6cdeee4b8bacff92a930810daaefccd85dcfb3b9d16596a2a039c7dc0e72dbc5d69370f5cf382d1dd2d76bb8e48195" + }, + { + "digest": "c2b1a93c56deb6665fcf8917b0a65f74144ada957ea90cdf64063a4b1f318644", + "message": "8aafdee7c9cd47d18fadc0025869946bc88abc89c63bc22106f692d06409d51db00c8c49c658d59c00e9f3bcb03a1d31ed442f8f7025ea0075cf4f84211b5eef4ca566dfccbfb175e05249ed7caf708aa03a92a6dcce57cd840459d6ac3d48775de13b3790e69ecd726875722e510d9d43bc17024775405c" + }, + { + "digest": "370649ff5a3bc8bcb584cea3873c035974674688f61fe3fbf1caad248baa8bf8", + "message": "eca07b79e42a8a617cf4734eb2c9f1710caf6f06689eca45d3e96872e18faf6d797e9b5b5aa8f9f8b60f51d65db396809aa29efb628ce40823136c5be8c225f264621f0d60c33fccd368a9b6868c589b9a08f9499d354a8a364622a4133bcdb085cdfc8b25d49553c15c04d038843a212437eea81e2513ad5ad6fbc82bf01dae" + }, + { + "digest": "b2db6436d984ea4efe3bf744fb8f315f102c37476fd1f23501fa27fcad9753b0", + "message": "9c3dc308961163bd400390d2ee856eaab4a10ebd802884a5dc6a3100c688c04618b939a63ee56771eab8b06a59ccfb769996d91b33532848f90cdf70e357f34ace00552f68c01634dccba7e862bf4794f3c8ca106598cea60b77b332dce575375d9d91ca6cec962a9076f7c87dd668fe8d856259a5c1c1ca79293b81a59a5d0ea54b5e377cc3adb915acda0f491345a461cdda803c4ebaa56f76ac7f9f463ae85b9a85676c6c28d92f1ea9177cc93ffb3cb2fec4882bd83cd2a0a266b37616fb5c42744fb691e3e5a72692af59f387028c443222bd9529bfd41819d56bf58467b08706040218babddfe1de5007c3ad226a64219ba83e43ddbbfb01c15b623c4d21a594cdd82cc104cc658c4feb571dbd2a4e1658fa0517fe2c90cf43520774a51472a6e9bc249b40339d64237e86be3d61e90e4ae18098b9f21bd2d3470be0d6786eeca472a9ae32efe042373cff1120ee266326f2d72125f30b23f3e963a0f17e296ab018c2dad513fc1a8cb54303b385d0c503b32dbf192d474fc2b0ea9330b94265e2b4f614c20d7e2461e90fb8dce6cbc8f5df7268a02055c802100081c751c0ecc5274fbcae8f3fd436afa34155453023c9024f908666d615dd46d81ed04cf2923fc9063eb58896ac97e45e04aa42acf015aabc56feb177d532460f7a563e842007dec077f39031c5b3f74116ecec7acff030eaa310e02d215da40aa4458261595067d714cca30a3143c4b07d078d479ead28344b3db8044b7ce0d4e61017bebe3998d1eb092ffbc7de19554c719353e4b717b02a81ae925f0a0bcd4f3122f2b6a0e75af53f101724b2a44cb139970620f2e864aeaf9798deda0c7149143f8791c81796a78c8a789278d489e310d5425e8b7db11f77e474ad2fa8f195daa7c6ecc3b1e26bd11041853f56af05ed44813e1d2fbe9ce4e4922b48e7de5ce7d16f94f199373494635a8cac8c49ccede960dac2c70c9f975ac850baf1fc462db8bc4bd9f2002dd1cc78f088673cd8ba18c11da9876beddb862432e6d9fabfeeb1fff64d0bfdbfb6b3a17c8efc4951d01b6197774e75c0a76497e5d93c1891ae06e352d477dbbf9bb84ae43e3cdb72c5b7aa1949ca169eb1d88adef65353da0f6d64c1ef1371ff16a54b5ec774b4cdfc09b276da8194b175d5c3f45ef8baef3c0e11ce4f6a22bb3989035f75bd81836375139e813dd1f8f13765775664602a668bd6f552d96c532746b68003c2eb7310c4976b86a229f30d561ab8229f94e813154bf95a6d8eea6869d250fa5937ca87affad55a1aa63ae577d7dc1d2f54bd6f89cc536bee807b060b14cf819e3f91bc049a83495edf6c25b1e8b74f77097eda2e715fad93674c4f7861d6cb072fa9f7208c6d3bc242cfc33fe7e4ccf1f5249c0d6d6f51253d37c1" + } + ], + "x25519": [ + { + "name": "RFC 7748 5.2, first", + "output": "c3da55379de9c6908e94ea4df28d084f32eccf03491c71f754b4075577a28552", + "scalar": "a546e36bf0527c9d3b16154b82465edd62144c0ac1fc5a18506a2244ba449ac4", + "u": "e6db6867583030db3594c1a424b15f7c726624ec26b3353b10a903a6d0ab1c4c" + }, + { + "name": "RFC 7748 5.2, second", + "output": "95cbde9476e8907d7aade45cb4b873f88b595a68799fa152e6f8f7647aac7957", + "scalar": "4b66e9d4d1b4673c5ad22691957d6af5c11b6421e0ea01d42ca4169e7918ba0d", + "u": "e5210f12786811d3f4b7959d0538ae2c31dbe7106fc03c3efc4cd549c715a493" + }, + { + "name": "RFC 7748 6.1, Alice's public key", + "output": "8520f0098930a754748b7ddcb43ef75a0dbf3a0d26381af4eba4a98eaa9b4e6a", + "scalar": "77076d0a7318a57d3c16c17251b26645df4c2f87ebc0992ab177fba51db92c2a", + "u": "0900000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "RFC 7748 6.1, the shared secret", + "output": "4a5d9d5ba4ce2de1728e3bf480350f25e07e21c947d19e3376f09b3c1e161742", + "scalar": "77076d0a7318a57d3c16c17251b26645df4c2f87ebc0992ab177fba51db92c2a", + "u": "de9edb7d7b7dc1b4d35b61c2ece435373f8343c85b78674dadfc7e146f882b4f" + }, + { + "name": "BoringSSL 0", + "output": "090d85e599ea8e2beeb61304d37be10ec5c905f9927d32f42a9a0afb3e0b4074", + "scalar": "668fb9f76ad971c81ac900071a1560bce2ca00cac7e67af99348913761434014", + "u": "db5f32b7f841e7a1a00968effded12735fc47a3eb13b579aacadeae80939a7dd" + }, + { + "name": "BoringSSL 1", + "output": "bf26ec7ec413061733d44070ea67cab02a85dc1be8cfe1ff73d541cc08325506", + "scalar": "636695e34f75b9a279c8706fad1289f2c0b1e22e16f8b8861729c10a582958af", + "u": "090d0701f8fde28f70043b83f2346225419b18a7f27e9e3d2bfd04e10f3d213e" + }, + { + "name": "BoringSSL 2", + "output": "1176d01681f2cf929da2c7a3df66b5d7729fd422226fd6374216bf7e02fd0f62", + "scalar": "734181cd1a9406522a56fe25e43ecbf0295db5ddd0609b3c2b4e79c06f8bd46d", + "u": "f8a8421c7d21a92db3ede979e1fa6acb062b56b1885c71c51153ccb880ac7315" + }, + { + "name": "BoringSSL 3", + "output": "f8482f2e9e58bb067e86b28724b3c0a3bbb5073e4c6acd93df545effdbba505f", + "scalar": "1f70391f6ba858129413bd801b12acbf662362825ca2509c8187590a2b0e6172", + "u": "d3ead07a0008f44502d5808bffc8979f25a859d5adf4312ea487489c30e01b3b" + }, + { + "name": "BoringSSL 4", + "output": "47b356d5818de8efac774b714c42c44be68523dd57dbd73962d5a52631876237", + "scalar": "3a7ae6cf8b889d2b7a60a470ad6ad999206bf57d9030ddf7f8680c8b1a645daa", + "u": "4d254c8083d87f1a9b3ea731efcff8a6f2312d6fed680ef829185161c8fc5060" + }, + { + "name": "BoringSSL 5", + "output": "11edaedc95ff78f563a1c8f15591c071dea092b4d7ecaac8e0387b5a160c4e5d", + "scalar": "203161c3159a876a2beaec29d2427fb0c7c30d382cd013d27cc3d393db0daf6f", + "u": "6ab95d1abe68c09b005c3db9042cc91ac849f7e94a2a4a9b893678970b7b95bf" + }, + { + "name": "BoringSSL 6", + "output": "563e8c9adaa7d73101b0f2ead3cae1ea5d8fcd5cd36080bb8e6ec03d61450917", + "scalar": "13d65491fe75f203a008b4415abc60d532e695dbd2f1e803accb34b2b72c3d70", + "u": "2e784e04ca0073336256a839255ed2f7d4796a64cdc37f1eb0e5c4c8d1d1e0f5" + }, + { + "name": "BoringSSL 7", + "output": "01476965426b6171749a8add9235025ce5f557fe4009f7393044ebbb8ae95279", + "scalar": "686f7da93bf268e588069831f047163f33589989d0826e9808fb678ed57e6749", + "u": "8b549b2df642d3b25fe8380f8cc4375f99b7bb4d275f779f3b7c81b8a2bbc129" + }, + { + "name": "BoringSSL 8", + "output": "9c49941f9c4f1871fa4091fed716d34999c95234edf2fdfba6d14a5afe9e0558", + "scalar": "82d61ccedc806a6060a3349a5e87cbc7ac115e4f87776250ae256098a7c44959", + "u": "8b6b9d08f61fc91fe8b32953c42340f007b571dcb0a56d10724ecef9950cfb25" + }, + { + "name": "BoringSSL 9", + "output": "00f43c022e94ea3819b036ae2b36b2a76136af628a751fe5d01e030d44258859", + "scalar": "7dc76404831397d5884fdf6f97e1744c9eb118a31a7b23f8d79f48ce9cad154b", + "u": "1acd292784f47919d455f887448358610bb9459670eb99dee46005f689ca5fb6" + }, + { + "name": "BoringSSL 10", + "output": "ae39d816532345794d2691e0801caa525fc3634d402ce9580b3338b46f8bb972", + "scalar": "fbc4511d23a682ae4efd08c8179c1c067f9c8be79bbc4eff5ce296c6bc1ff445", + "u": "55caff2181f2136b0ed0e1e2994448e16cc970646a983d140dc4eab3d94c284e" + }, + { + "name": "BoringSSL 11", + "output": "a61e74552cce75f5e972e424f2ccb09c83bc1b67014748f02c371a209ef2fb2c", + "scalar": "4e060ce10cebf095098716c86619eb9f7df66524698ba7988c3b9095d9f50134", + "u": "57733f2d869690d0d2edaec9523daa2da95445f44f5783c1faec6c3a982818f3" + }, + { + "name": "BoringSSL 12", + "output": "fcf307dfbc19020b28a6618c6c622f317e45967dacf4ae4a0a699a10769fde14", + "scalar": "5c492cba2cc892488a9ceb9186c2aac22f015bf3ef8d3ecc9c4176976261aab1", + "u": "6797c2e7dc92ccbe7c056bec350ab6d3bd2a2c6bc5a807bbcae1f6c2af803644" + }, + { + "name": "BoringSSL 13", + "output": "5dcab68973f95bd3ae4b34fab949fb7fb15af1d8cae28cd699f9c1aa3337342f", + "scalar": "ea33349296055a4e8b192e3c23c5f4c844282a3bfc19ecc9dc646a42c38dc248", + "u": "2c75d85142ecad3e69447004540c1c23548fc8f486251b8a19463f3df6f8ac61" + }, + { + "name": "BoringSSL 14", + "output": "e4e634ebb4fb664fe8b2cfa1615f00e6466fff732ce1f8a0c8d2727431d16f14", + "scalar": "4f2979b1ec8619e45c0a0b2b520934541ab94407b64d190a76f32314efe184e7", + "u": "f7cae18d8d36a7f56117b8b70e2552277ffc99df8756b5e138bf6368bc87f74c" + }, + { + "name": "BoringSSL 15", + "output": "ab9515ab14af9d270e1dae0c5680cbc8880bd8a8e7eb67b4da42a661961efc0b", + "scalar": "f5d8a927901d4fa4249086b7ffec24f5297d80118e4ac9d3fc9a8237951e3b7f", + "u": "3c235edc02f9115641dbf516d5de8a735d6e53e22aa2ac143656045ff2e95249" + }, + { + "error": "crypto/ecdh: bad X25519 remote ECDH input: low order point", + "name": "low order 0", + "output": "0000000000000000000000000000000000000000000000000000000000000000", + "scalar": "23e339961a557df7df74749a1c22b35ff756603829f80346d30eb954b5f6dfa3", + "u": "0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "error": "crypto/ecdh: bad X25519 remote ECDH input: low order point", + "name": "low order 0, bit 255 set", + "output": "0000000000000000000000000000000000000000000000000000000000000000", + "scalar": "d2f01795507a8a23a11eb047fba0f88b789224e7787427e0ff030eefd507c52e", + "u": "0000000000000000000000000000000000000000000000000000000000000080" + }, + { + "error": "crypto/ecdh: bad X25519 remote ECDH input: low order point", + "name": "low order 1", + "output": "0000000000000000000000000000000000000000000000000000000000000000", + "scalar": "99a46865d474f8d29d0229b553dd22992a7449cd05a8cb3f1cf34767766a5f18", + "u": "0100000000000000000000000000000000000000000000000000000000000000" + }, + { + "error": "crypto/ecdh: bad X25519 remote ECDH input: low order point", + "name": "low order 1, bit 255 set", + "output": "0000000000000000000000000000000000000000000000000000000000000000", + "scalar": "5865a8286d35a092918588a6862f329de9d1450f8e80e54f1734fa9ecee16429", + "u": "0100000000000000000000000000000000000000000000000000000000000080" + }, + { + "error": "crypto/ecdh: bad X25519 remote ECDH input: low order point", + "name": "low order 2", + "output": "0000000000000000000000000000000000000000000000000000000000000000", + "scalar": "b0f1b453531e5161d64ef42ac7c5a7071dfcbb7a17faebc40d692698a4009400", + "u": "e0eb7a7c3b41b8ae1656e3faf19fc46ada098deb9c32b1fd866205165f49b800" + }, + { + "error": "crypto/ecdh: bad X25519 remote ECDH input: low order point", + "name": "low order 2, bit 255 set", + "output": "0000000000000000000000000000000000000000000000000000000000000000", + "scalar": "70f89dbd428bc3aeb680d4fe9bc425b8fe50adff965732c1c7c544b12663ea42", + "u": "e0eb7a7c3b41b8ae1656e3faf19fc46ada098deb9c32b1fd866205165f49b880" + }, + { + "error": "crypto/ecdh: bad X25519 remote ECDH input: low order point", + "name": "low order 3", + "output": "0000000000000000000000000000000000000000000000000000000000000000", + "scalar": "880be5a3eb3741e7623edc230187918963611408ebe6107b096fc8e242eccbfc", + "u": "5f9c95bca3508c24b1d0b1559c83ef5b04445cc4581c8e86d8224eddd09f1157" + }, + { + "error": "crypto/ecdh: bad X25519 remote ECDH input: low order point", + "name": "low order 3, bit 255 set", + "output": "0000000000000000000000000000000000000000000000000000000000000000", + "scalar": "681ac4de693d7b97f00959a3c1c38803ceb585edfc926470580cda15ed4b0467", + "u": "5f9c95bca3508c24b1d0b1559c83ef5b04445cc4581c8e86d8224eddd09f11d7" + }, + { + "error": "crypto/ecdh: bad X25519 remote ECDH input: low order point", + "name": "low order 4", + "output": "0000000000000000000000000000000000000000000000000000000000000000", + "scalar": "7643068d328156792c5a0e6a80f51b75831643941a790f9e53271dd146fded1c", + "u": "ecffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f" + }, + { + "error": "crypto/ecdh: bad X25519 remote ECDH input: low order point", + "name": "low order 4, bit 255 set", + "output": "0000000000000000000000000000000000000000000000000000000000000000", + "scalar": "8cd90e3cefd1c45f436235a8f97c17f077bb50e61e409c12162e772ca5f04796", + "u": "ecffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + }, + { + "error": "crypto/ecdh: bad X25519 remote ECDH input: low order point", + "name": "low order 5", + "output": "0000000000000000000000000000000000000000000000000000000000000000", + "scalar": "6e9c62bad6a29375b2603e5f35b90592ac2ed932f84ca2bd9ca7e23435766a75", + "u": "edffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f" + }, + { + "error": "crypto/ecdh: bad X25519 remote ECDH input: low order point", + "name": "low order 5, bit 255 set", + "output": "0000000000000000000000000000000000000000000000000000000000000000", + "scalar": "2f962e7c5ad196448240ce181a9d313fcaaf8766c636e6790a7a6242adc1a231", + "u": "edffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + }, + { + "error": "crypto/ecdh: bad X25519 remote ECDH input: low order point", + "name": "low order 6", + "output": "0000000000000000000000000000000000000000000000000000000000000000", + "scalar": "43aff1925d003c51cb0fc070a0a7875a9ca0743119c3c2ef52b61991f3fbeb7b", + "u": "eeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f" + }, + { + "error": "crypto/ecdh: bad X25519 remote ECDH input: low order point", + "name": "low order 6, bit 255 set", + "output": "0000000000000000000000000000000000000000000000000000000000000000", + "scalar": "3479ab3f4a815ceb27a7a5d93db68c8c6400239fa6f94b13e890a5f419191ae6", + "u": "eeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + }, + { + "error": "crypto/ecdh: bad X25519 remote ECDH input: low order point", + "name": "u = p + 0 mod 2^255", + "output": "0000000000000000000000000000000000000000000000000000000000000000", + "scalar": "7910dac61350955dcd4b881b4232aa536f204324e509954804de410c2e7b6648", + "u": "edffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f" + }, + { + "error": "crypto/ecdh: bad X25519 remote ECDH input: low order point", + "name": "u = p + 1 mod 2^255", + "output": "0000000000000000000000000000000000000000000000000000000000000000", + "scalar": "46f0354dcffba979c845e49aec844741d7a7e568422ddc86f67011948af4c7f6", + "u": "eeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f" + }, + { + "name": "u = p + 2 mod 2^255", + "output": "624974b45dac90685249cde40261cc7b4a950dc10f960facf1e95ea8c8f3146f", + "scalar": "c2051a2424ff2c213c465be4b0aad2defd5ab2630621d46cae764ed8830a391f", + "u": "efffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f" + }, + { + "name": "u = p + 18 mod 2^255", + "output": "f129fe54b826f6fdc8d0301f5a22256be9bede985d29c4ef00770df0608bf750", + "scalar": "e5924ff2a6a213b41df4978a09d155e4d7125d912c5f41978ba00f3626d87e5a", + "u": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f" + }, + { + "error": "crypto/ecdh: bad X25519 remote ECDH input: low order point", + "name": "u = p + 19 mod 2^255", + "output": "0000000000000000000000000000000000000000000000000000000000000000", + "scalar": "0d2863f408d895693ebba76261822abd75c60c355131f16ff49c6c2b815cc034", + "u": "0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "error": "crypto/ecdh: bad X25519 remote ECDH input: low order point", + "name": "u = p + 20 mod 2^255", + "output": "0000000000000000000000000000000000000000000000000000000000000000", + "scalar": "ff7b0c0a03c4e5fbf16f3cc2a2b14e469482233e5d4e2ec9a87e41969b24767a", + "u": "0100000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "u = p + 30 mod 2^255", + "output": "d467c36d4047e751e49f4eb90ed9caf575b4c80e0cde7935ca3daeb7c9fc5064", + "scalar": "5425bf939beb9b0aa683afffd5da1fdb26dca64e4e2ee2cadfcf4cdfa42d98b1", + "u": "0b00000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random 0", + "output": "cd2816e2d50e6b6d55a33d38f8ed8a341f8f0382aa5fc29503b3c7e5bcb21f66", + "scalar": "a55560c829f30e9028e6aa124caa050cf6252846f8ebd28978cbfa2f69dec3a3", + "u": "fe9474520e80ecff98a6279e4bd8f8a9b4d52daea109f6d77998984978ecf61d" + }, + { + "name": "random 1", + "output": "db73da1d7ed5f4313b8f390c6a18b4bcb8b19efb0e35cc5356ecfa53aa851153", + "scalar": "c562ccdc2f6a719a43b0a3c848efb3141196f675e6dc6b471928942328aeb6e4", + "u": "c066b06efb1741a9b9c0ca31d85d0b9ee111ee995b8958964890b1885c32750d" + }, + { + "name": "random 2", + "output": "7fb68e60ebedd24ccffa27ca6e9fd089884f22a1d358c5a30feab9872973ef06", + "scalar": "d3e71abb9f8f788884602201eff1240510e5500490278630ca306753c811ee1f", + "u": "88cd7ad7b66d975f921bcaee82779eeab62562e32dd1df7c2a7b4c3eb164bad2" + }, + { + "name": "random 3", + "output": "91acbce245c6251c25139fa348e2fba215b6db7efce0915f5a44a8a0a6882d1e", + "scalar": "c1d443418feb812fdf78a577add3ca68abf29ed5b5e48de88ebb98892d296c49", + "u": "b62b66b8299a7b7515be9e7e5b6a5665b6d2a1292fa91f341d1f40a2c391b258" + }, + { + "name": "random 4", + "output": "9794d5bdbfc86fdb53d74c56bec4c2f72c33527602a8ce14afe2a67a3c8b5c31", + "scalar": "92c35689256d9561901d6b6904a88333222fe2bd72e76bcd3edd0bde0f1d5c0e", + "u": "08d6804d525583bf24233409ee32c610193352e598ff7197173337f1644d5730" + }, + { + "name": "random 5", + "output": "255991ba5e2cd67e9b372b32f0cb07d82bf99e88216c73bea5dfb73afeabfa7b", + "scalar": "acf1cbb8cbc46b1321c5f81cf18abab812ffe02ab0bb422467272a2d4be8b48e", + "u": "27ac0c1426895a58ea0c51644d9f77bc5bce900aca8e121683f8bda046420c73" + }, + { + "name": "random 6", + "output": "0c6a0549be518b06d7413324d8de328ab9a70539b46c065e61f2944a9566cc31", + "scalar": "218a0bf30a546fab0fb20298aa63f3f73db4f6fa8528563327bd0e1c333d23c9", + "u": "b81cdf2afbdcdab3ee8f0edf2abdaa9e42395f5b42d99df67199b6546d460042" + }, + { + "name": "random 7", + "output": "f9111087b2095bded3f53378145781afdf8595220a34964c5c47b23dd6d0a520", + "scalar": "83f257ed52fc0f2a187556a14a5f81cea1b2c36826e3f9201d2c16649e7adc94", + "u": "12d14c17b27b05646d2aee1086d273b774686109ddf2a9caa93b3efc52c46e69" + } + ], + "x25519_iterated": { + "1": "422c8e7a6227d7bca1350b3e2bb7279f7897b87bb6854b783c60e80311ae3079", + "1000": "684cf59ba83309552800ef566f2f4d3c1c3887c49360e3875f2eb94d99532c51", + "description": "RFC 7748 5.2: k = u = 9, then k, u = X25519(k, u), k n times" + } +} diff --git a/tool/gen_primitive_vectors.go b/tool/gen_primitive_vectors.go new file mode 100644 index 0000000..3df9755 --- /dev/null +++ b/tool/gen_primitive_vectors.go @@ -0,0 +1,774 @@ +//go:build ignore + +// gen_primitive_vectors writes test/vectors/primitives.json: the vectors of +// the primitives of stage 2 of datekeys-dart, every expected value computed +// here with the Go libraries that datekeys-go and filippo.io/age use, never +// written by hand. The inputs are those of the RFCs (5869, 7748, 7914, 8032, +// 8439), taken from the tests and test data of Go and golang.org/x/crypto in +// the module cache where they are there, plus edge cases and seeded random +// ones. +// +// It needs the module context of datekeys-go, for golang.org/x/crypto +// v0.57.0 and the codec/bech32 and profile packages, and changes nothing +// there: +// +// cd ../datekeys-go && go run ../datekeys-dart/tool/gen_primitive_vectors.go -out ../datekeys-dart/test/vectors +// +// The output is deterministic: running it again writes the same bytes. +package main + +import ( + "bufio" + "bytes" + "compress/gzip" + "crypto/ed25519" + "crypto/hmac" + "crypto/sha256" + "encoding/base64" + "encoding/hex" + "encoding/json" + "flag" + "fmt" + "io" + "log" + "math/big" + "math/rand/v2" + "os" + "os/exec" + "path/filepath" + "regexp" + "runtime" + "slices" + "strconv" + "strings" + + "golang.org/x/crypto/chacha20" + "golang.org/x/crypto/chacha20poly1305" + "golang.org/x/crypto/curve25519" + "golang.org/x/crypto/hkdf" + "golang.org/x/crypto/pbkdf2" + "golang.org/x/crypto/poly1305" + "golang.org/x/crypto/scrypt" + + "g.activething.com/go/DateKeys/codec/bech32" + "g.activething.com/go/DateKeys/profile" +) + +type obj = map[string]any + +var rng = rand.New(rand.NewChaCha8([32]byte([]byte("datekeys-dart stage 2 primitives")))) + +func randBytes(n int) []byte { + b := make([]byte, n) + for i := range b { + b[i] = byte(rng.Uint32()) + } + return b +} + +func seq(from, n int) []byte { + b := make([]byte, n) + for i := range b { + b[i] = byte(from + i) + } + return b +} + +func h(b []byte) string { return hex.EncodeToString(b) } + +func mustHex(s string) []byte { + b, err := hex.DecodeString(s) + if err != nil { + log.Fatal(err) + } + return b +} + +func modDir(path string) string { + out, err := exec.Command("go", "list", "-m", "-f", "{{.Dir}}", path).Output() + if err != nil { + log.Fatalf("go list %s: %v", path, err) + } + return strings.TrimSpace(string(out)) +} + +// byteArrays returns the [32]byte or []byte literals {0x.., ...} after the +// first occurrence of marker in a Go source file. +func byteArrays(src, marker, end string) [][]byte { + i := strings.Index(src, marker) + if i < 0 { + log.Fatalf("marker %q not found", marker) + } + src = src[i:] + if j := strings.Index(src, end); j >= 0 { + src = src[:j] + } + var out [][]byte + for _, m := range regexp.MustCompile(`\{(0x[0-9a-fA-F]+(?:,\s*0x[0-9a-fA-F]+)*),?\s*\}`).FindAllStringSubmatch(src, -1) { + var b []byte + for _, f := range strings.Split(m[1], ",") { + v, err := strconv.ParseUint(strings.TrimSpace(f), 0, 8) + if err != nil { + log.Fatal(err) + } + b = append(b, byte(v)) + } + out = append(out, b) + } + return out +} + +func main() { + outDir := flag.String("out", "", "directory of the vectors") + flag.Parse() + if *outDir == "" { + log.Fatal("-out is required") + } + xcrypto := modDir("golang.org/x/crypto") + + doc := obj{ + "description": "Vectors of the primitives of stage 2 of datekeys-dart. Every expected value is computed by tool/gen_primitive_vectors.go with Go " + runtime.Version() + ", golang.org/x/crypto v0.57.0 and codec/bech32 of datekeys-go; the inputs are those of the RFCs, taken from the tests of Go and x/crypto where they are, plus edge cases and seeded random ones. Binary values are lowercase hex. `node` marks the cases cheap enough to run compiled to JavaScript.", + "generator": "tool/gen_primitive_vectors.go", + } + + // SHA-256 and HMAC-SHA256: around the block and padding boundaries. + var shaCases, hmacCases []obj + for _, n := range []int{0, 1, 3, 55, 56, 57, 63, 64, 65, 119, 120, 128, 1000} { + m := randBytes(n) + d := sha256.Sum256(m) + shaCases = append(shaCases, obj{"message": h(m), "digest": h(d[:])}) + } + for _, kn := range []int{0, 1, 20, 32, 63, 64, 65, 131} { + for _, mn := range []int{0, 32, 100} { + k, m := randBytes(kn), randBytes(mn) + mac := hmac.New(sha256.New, k) + mac.Write(m) + hmacCases = append(hmacCases, obj{"key": h(k), "message": h(m), "mac": h(mac.Sum(nil))}) + } + } + doc["sha256"] = shaCases + doc["hmac_sha256"] = hmacCases + + // HKDF-SHA256: RFC 5869 A.1 to A.3 (the inputs of hkdf_test.go of + // x/crypto), a nil salt, and the age labels. + hkdfInputs := []struct { + name string + ikm, salt, info []byte + length int + }{ + {"RFC 5869 A.1", bytes.Repeat([]byte{0x0b}, 22), seq(0x00, 13), seq(0xf0, 10), 42}, + {"RFC 5869 A.2", seq(0x00, 80), seq(0x60, 80), seq(0xb0, 80), 82}, + {"RFC 5869 A.3", bytes.Repeat([]byte{0x0b}, 22), []byte{}, []byte{}, 42}, + {"nil salt, age header label", randBytes(16), nil, []byte("header"), 32}, + {"age payload label", randBytes(16), randBytes(16), []byte("payload"), 32}, + {"255 blocks", randBytes(32), randBytes(32), randBytes(10), 255 * 32}, + } + var hkdfCases []obj + for _, c := range hkdfInputs { + out := make([]byte, c.length) + if _, err := io.ReadFull(hkdf.New(sha256.New, c.ikm, c.salt, c.info), out); err != nil { + log.Fatal(err) + } + salt := any(h(c.salt)) + if c.salt == nil { + salt = nil + } + hkdfCases = append(hkdfCases, obj{"name": c.name, "ikm": h(c.ikm), "salt": salt, "info": h(c.info), "length": c.length, "okm": h(out)}) + } + doc["hkdf_sha256"] = hkdfCases + + // PBKDF2-HMAC-SHA256: the inputs of RFC 6070 (written for SHA-1) with + // SHA-256, a password longer than a block, and the word key of spec + // §38.1 with 600 000 iterations. + qn := profile.Quicknet() + wordSalt := "DateKeys llave de palabras v2|" + qn.ChainHashHex() + "|1000|000102030405060708090a0b0c0d0e0f" + pbkdf2Inputs := []struct { + name, password, salt string + iter, length int + node bool + }{ + {"RFC 6070 inputs, c = 1", "password", "salt", 1, 32, true}, + {"RFC 6070 inputs, c = 2", "password", "salt", 2, 32, true}, + {"RFC 6070 inputs, c = 4096", "password", "salt", 4096, 32, true}, + {"RFC 6070 inputs, 40 bytes", "passwordPASSWORDpassword", "saltSALTsaltSALTsaltSALTsaltSALTsalt", 4096, 40, true}, + {"RFC 6070 inputs, NUL", "pass\x00word", "sa\x00lt", 4096, 16, true}, + {"a password of 100 bytes, 3 blocks", strings.Repeat("0123456789", 10), "salt", 3, 70, true}, + {"spec §38.1: perro luna casa verde tren mar", "perro luna casa verde tren mar", wordSalt, 600000, 32, false}, + } + var pbkdf2Cases []obj + for _, c := range pbkdf2Inputs { + k := pbkdf2.Key([]byte(c.password), []byte(c.salt), c.iter, c.length, sha256.New) + pbkdf2Cases = append(pbkdf2Cases, obj{"name": c.name, "password": h([]byte(c.password)), "salt": h([]byte(c.salt)), "iterations": c.iter, "length": c.length, "key": h(k), "node": c.node}) + } + doc["pbkdf2_sha256"] = pbkdf2Cases + + // scrypt: RFC 7914 §12 (the inputs of scrypt_test.go of x/crypto, but + // for N = 2^20, 1 GiB), and the parameters of age with logN 10 and 16. + scryptInputs := []struct { + name, password, salt string + n, r, p, length int + node bool + }{ + {"RFC 7914 §12, N = 16", "", "", 16, 1, 1, 64, true}, + {"RFC 7914 §12, N = 1024, p = 16", "password", "NaCl", 1024, 8, 16, 64, true}, + {"RFC 7914 §12, N = 16384", "pleaseletmein", "SodiumChloride", 16384, 8, 1, 64, true}, + {"N = 2, r = 1, p = 1", "p", "s", 2, 1, 1, 32, true}, + {"N = 4, r = 2, p = 3", "password", "salt", 4, 2, 3, 70, true}, + {"age, logN = 10", "passphrase", "age-encryption.org/v1/scrypt" + string(seq(0, 16)), 1 << 10, 8, 1, 32, true}, + {"age, logN = 16 (spec §29.12)", "passphrase", "age-encryption.org/v1/scrypt" + string(seq(16, 16)), 1 << 16, 8, 1, 32, false}, + } + var scryptCases []obj + for _, c := range scryptInputs { + k, err := scrypt.Key([]byte(c.password), []byte(c.salt), c.n, c.r, c.p, c.length) + if err != nil { + log.Fatal(err) + } + scryptCases = append(scryptCases, obj{"name": c.name, "password": h([]byte(c.password)), "salt": h([]byte(c.salt)), "n": c.n, "r": c.r, "p": c.p, "length": c.length, "key": h(k), "node": c.node}) + } + var scryptErrors []obj + for _, c := range []struct{ n, r, p int }{{1, 8, 1}, {0, 8, 1}, {3, 8, 1}, {1 << 10, 0, 1}, {1 << 10, 8, 0}, {1 << 10, 1 << 20, 1 << 10}} { + _, err := scrypt.Key([]byte("p"), []byte("s"), c.n, c.r, c.p, 32) + scryptErrors = append(scryptErrors, obj{"n": c.n, "r": c.r, "p": c.p, "error": err.Error()}) + } + doc["scrypt"] = scryptCases + doc["scrypt_errors"] = scryptErrors + + // ChaCha20 (RFC 8439 2.3.2 and 2.4.2), Poly1305 (2.5.2 and edge keys) + // and ChaCha20-Poly1305 (2.8.2 and seeded random cases). + vecSrc, err := os.ReadFile(filepath.Join(xcrypto, "chacha20poly1305", "chacha20poly1305_vectors_test.go")) + if err != nil { + log.Fatal(err) + } + // The plaintext of RFC 8439 2.4.2 and 2.8.2, as the vectors of x/crypto + // hold it. + m := regexp.MustCompile(`"(4c616469657320616e642047656e746c656d656e[0-9a-f]*)"`).FindSubmatch(vecSrc) + if m == nil { + log.Fatal("the sunscreen plaintext is not in the vectors of x/crypto") + } + sunscreen := mustHex(string(m[1])) + var chachaCases []obj + for _, c := range []struct { + name string + key, nonce []byte + counter uint32 + length int + plaintext []byte + }{ + {"RFC 8439 2.3.2", seq(0, 32), mustHex("000000090000004a00000000"), 1, 64, nil}, + {"RFC 8439 2.4.2", seq(0, 32), mustHex("000000000000004a00000000"), 1, 0, sunscreen}, + {"counter 0, 3 blocks and a half", randBytes(32), randBytes(12), 0, 224, nil}, + {"counter near 2^32", randBytes(32), randBytes(12), 0xfffffffe, 128, nil}, + } { + s, err := chacha20.NewUnauthenticatedCipher(c.key, c.nonce) + if err != nil { + log.Fatal(err) + } + s.SetCounter(c.counter) + in := c.plaintext + if in == nil { + in = make([]byte, c.length) + } + out := make([]byte, len(in)) + s.XORKeyStream(out, in) + chachaCases = append(chachaCases, obj{"name": c.name, "key": h(c.key), "nonce": h(c.nonce), "counter": c.counter, "input": h(in), "output": h(out)}) + } + doc["chacha20"] = chachaCases + + var polyCases []obj + addPoly := func(name string, key, msg []byte) { + var k [32]byte + copy(k[:], key) + var tag [16]byte + poly1305.Sum(&tag, msg, &k) + polyCases = append(polyCases, obj{"name": name, "key": h(key), "message": h(msg), "tag": h(tag[:])}) + } + addPoly("RFC 8439 2.5.2", mustHex("85d6be7857556d337f4452fe42d506a80103808afb0db2fd4abff6af4149f51b"), []byte("Cryptographic Forum Research Group")) + ff := bytes.Repeat([]byte{0xff}, 32) + for _, n := range []int{0, 1, 15, 16, 17, 31, 32, 33, 64, 100, 257} { + addPoly(fmt.Sprintf("r and s all ones, %d bytes of 0xff", n), ff, bytes.Repeat([]byte{0xff}, n)) + } + for _, n := range []int{16, 48} { + // r = 2 · (p - 5)… : a key whose r makes h approach p. + k := append(bytes.Repeat([]byte{0xff}, 16), make([]byte, 16)...) + addPoly(fmt.Sprintf("s zero, %d bytes of 0xff", n), k, bytes.Repeat([]byte{0xff}, n)) + addPoly(fmt.Sprintf("s all ones, %d zero bytes", n), append(make([]byte, 16), bytes.Repeat([]byte{0xff}, 16)...), make([]byte, n)) + } + // r = 1 and s = 0: the tag is the sum of the blocks, so that blocks of + // 0xff take h across p. + r1 := append([]byte{1}, make([]byte, 31)...) + for _, n := range []int{1, 2, 3} { + addPoly(fmt.Sprintf("r = 1, %d blocks of 0xff", n), r1, bytes.Repeat([]byte{0xff}, 16*n)) + } + for i := 0; i < 24; i++ { + addPoly(fmt.Sprintf("random %d", i), randBytes(32), randBytes(int(rng.Uint32()%200))) + } + doc["poly1305"] = polyCases + + var aeadCases []obj + addAEAD := func(name string, key, nonce, aad, pt []byte) { + a, err := chacha20poly1305.New(key) + if err != nil { + log.Fatal(err) + } + aeadCases = append(aeadCases, obj{"name": name, "key": h(key), "nonce": h(nonce), "aad": h(aad), "plaintext": h(pt), "ciphertext": h(a.Seal(nil, nonce, pt, aad))}) + } + addAEAD("RFC 8439 2.8.2", seq(0x80, 32), mustHex("070000004041424344454647"), mustHex("50515253c0c1c2c3c4c5c6c7"), sunscreen) + addAEAD("age: a file key under a zero nonce", randBytes(32), make([]byte, 12), nil, randBytes(16)) + for _, n := range []int{0, 1, 15, 16, 17, 63, 64, 65, 127, 128, 129, 300, 1000} { + addAEAD(fmt.Sprintf("random, %d bytes", n), randBytes(32), randBytes(12), randBytes(int(rng.Uint32()%40)), randBytes(n)) + } + doc["chacha20poly1305"] = aeadCases + + // X25519: RFC 7748 5.2 and 6.1, the iterated function from u = 9, the + // BoringSSL vectors and the points of low order of x/crypto's tests. + cvSrc, err := os.ReadFile(filepath.Join(xcrypto, "curve25519", "vectors_test.go")) + if err != nil { + log.Fatal(err) + } + src := string(cvSrc) + lowOrder := byteArrays(src, "var lowOrderPoints", "// testVectors") + tv := byteArrays(src, "var testVectors", "\n}\n") + if len(lowOrder) != 7 || len(tv)%3 != 0 || len(tv) == 0 { + log.Fatalf("unexpected vectors: %d low order, %d arrays", len(lowOrder), len(tv)) + } + var xCases []obj + addX := func(name string, scalar, u []byte) { + out, err := curve25519.X25519(scalar, u) + c := obj{"name": name, "scalar": h(scalar), "u": h(u)} + if err != nil { + c["error"] = err.Error() + // The value of the function itself, before the check. + var dst, s, p [32]byte + copy(s[:], scalar) + copy(p[:], u) + curve25519.ScalarMult(&dst, &s, &p) + c["output"] = h(dst[:]) + } else { + c["output"] = h(out) + } + xCases = append(xCases, c) + } + addX("RFC 7748 5.2, first", mustHex("a546e36bf0527c9d3b16154b82465edd62144c0ac1fc5a18506a2244ba449ac4"), mustHex("e6db6867583030db3594c1a424b15f7c726624ec26b3353b10a903a6d0ab1c4c")) + addX("RFC 7748 5.2, second", mustHex("4b66e9d4d1b4673c5ad22691957d6af5c11b6421e0ea01d42ca4169e7918ba0d"), mustHex("e5210f12786811d3f4b7959d0538ae2c31dbe7106fc03c3efc4cd549c715a493")) + alice := mustHex("77076d0a7318a57d3c16c17251b26645df4c2f87ebc0992ab177fba51db92c2a") + addX("RFC 7748 6.1, Alice's public key", alice, curve25519.Basepoint) + addX("RFC 7748 6.1, the shared secret", alice, mustHex("de9edb7d7b7dc1b4d35b61c2ece435373f8343c85b78674dadfc7e146f882b4f")) + for i := 0; i < len(tv); i += 3 { + addX(fmt.Sprintf("BoringSSL %d", i/3), tv[i], tv[i+1]) + } + for i, lo := range lowOrder { + addX(fmt.Sprintf("low order %d", i), randBytes(32), lo) + hi := slices.Clone(lo) + hi[31] |= 0x80 + addX(fmt.Sprintf("low order %d, bit 255 set", i), randBytes(32), hi) + } + // u not below p: reduced, and bit 255 ignored. + for _, d := range []int{0, 1, 2, 18, 19, 20, 30} { + p := new(big.Int).Sub(new(big.Int).Lsh(big.NewInt(1), 255), big.NewInt(19)) + v := new(big.Int).Add(p, big.NewInt(int64(d))) + v.Mod(v, new(big.Int).Lsh(big.NewInt(1), 255)) + le := make([]byte, 32) + v.FillBytes(le) + slices.Reverse(le) + addX(fmt.Sprintf("u = p + %d mod 2^255", d), randBytes(32), le) + } + for i := 0; i < 8; i++ { + addX(fmt.Sprintf("random %d", i), randBytes(32), randBytes(32)) + } + doc["x25519"] = xCases + + iter := func(n int) string { + k := append([]byte{9}, make([]byte, 31)...) + u := slices.Clone(k) + for i := 0; i < n; i++ { + out, err := curve25519.X25519(k, u) + if err != nil { + log.Fatal(err) + } + u, k = k, out + } + return h(k) + } + doc["x25519_iterated"] = obj{"description": "RFC 7748 5.2: k = u = 9, then k, u = X25519(k, u), k n times", "1": iter(1), "1000": iter(1000)} + + // Ed25519: the first 64 lines of sign.input of Go's crypto/ed25519 (SUPERCOP; + // the first three are RFC 8032 7.1 TEST 1 to 3), checked here with + // crypto/ed25519 and the strict profile. + f, err := os.Open(filepath.Join(runtime.GOROOT(), "src", "crypto", "ed25519", "testdata", "sign.input.gz")) + if err != nil { + log.Fatal(err) + } + gz, err := gzip.NewReader(f) + if err != nil { + log.Fatal(err) + } + var edCases []obj + sc := bufio.NewScanner(gz) + sc.Buffer(make([]byte, 1<<20), 1<<20) + for line := 0; line < 64 && sc.Scan(); line++ { + parts := strings.Split(sc.Text(), ":") + pub, msg, sm := mustHex(parts[1]), mustHex(parts[2]), mustHex(parts[3]) + sig := sm[:64] + priv := ed25519.NewKeyFromSeed(mustHex(parts[0])[:32]) + if !bytes.Equal(ed25519.Sign(priv, msg), sig) || !ed25519.Verify(pub, msg, sig) { + log.Fatalf("sign.input line %d does not verify", line) + } + edCases = append(edCases, obj{"name": fmt.Sprintf("sign.input line %d", line), "public_key": h(pub), "message": h(msg), "signature": h(sig), "valid": strictVerify(pub, msg, sig), "stdlib": true}) + if line%8 == 0 { + // Mutations of every eighth line: the result of the strict + // profile and of crypto/ed25519. + for _, mut := range []struct { + what string + which int + pos int + }{{"R", 1, 0}, {"S", 1, 32}, {"S top byte", 1, 63}, {"A", 0, 5}, {"message", 2, 0}} { + p2, m2, s2 := slices.Clone(pub), slices.Clone(msg), slices.Clone(sig) + target := [][]byte{p2, s2, m2}[mut.which] + if len(target) == 0 { + continue + } + target[mut.pos%len(target)] ^= 1 << (line % 8) + edCases = append(edCases, obj{"name": fmt.Sprintf("sign.input line %d, %s changed", line, mut.what), "public_key": h(p2), "message": h(m2), "signature": h(s2), "valid": strictVerify(p2, m2, s2), "stdlib": ed25519.Verify(p2, m2, s2)}) + } + } + } + if err := sc.Err(); err != nil { + log.Fatal(err) + } + // The copy of the strict profile below gives the results of + // testdata/vectors/ed25519_strict.json of datekeys-go. + var strictFile struct { + Vectors []struct { + Name, Message, PublicKey, Signature string + Valid bool + } + } + raw, err := os.ReadFile(filepath.Join("testdata", "vectors", "ed25519_strict.json")) + if err != nil { + log.Fatal(err) + } + if err := json.Unmarshal(bytes.ReplaceAll(raw, []byte(`"public_key"`), []byte(`"publickey"`)), &strictFile); err != nil { + log.Fatal(err) + } + for _, v := range strictFile.Vectors { + if strictVerify(mustHex(v.PublicKey), mustHex(v.Message), mustHex(v.Signature)) != v.Valid { + log.Fatalf("the copy of ed25519strict disagrees on %q", v.Name) + } + } + if len(strictFile.Vectors) == 0 { + log.Fatal("no vectors in ed25519_strict.json") + } + // S + ℓ and S + 2^253 on a valid signature, and keys of small order. + l := new(big.Int).Add(new(big.Int).Lsh(big.NewInt(1), 252), mustBig("27742317777372353535851937790883648493")) + seed := randBytes(32) + priv := ed25519.NewKeyFromSeed(seed) + pub := priv.Public().(ed25519.PublicKey) + msg := []byte("DateKeys") + sig := ed25519.Sign(priv, msg) + for _, add := range []*big.Int{l, new(big.Int).Lsh(big.NewInt(1), 253), new(big.Int).Lsh(l, 1)} { + s := leBig(sig[32:]) + s.Add(s, add) + if s.BitLen() > 256 { + continue + } + s2 := slices.Clone(sig) + copy(s2[32:], leBytes(s, 32)) + edCases = append(edCases, obj{"name": "S + " + add.String(), "public_key": h(pub), "message": h(msg), "signature": h(s2), "valid": strictVerify(pub, msg, s2), "stdlib": ed25519.Verify(pub, msg, s2)}) + } + for i, so := range smallOrder { + // R = the identity and S = 0: [0]B - [k]A = -[k]A, the identity when + // A has an order that divides k. + s2 := make([]byte, 64) + s2[0] = 1 + for j := 0; j < 4; j++ { + m2 := []byte{byte(i), byte(j)} + edCases = append(edCases, obj{"name": fmt.Sprintf("small order point %d, R = identity, S = 0, message %d", i, j), "public_key": h(so[:]), "message": h(m2), "signature": h(s2), "valid": strictVerify(so[:], m2, s2), "stdlib": ed25519.Verify(so[:], m2, s2)}) + } + } + doc["ed25519"] = edCases + + // The encodings of points: Canonical, OnCurve and SmallOrder of the + // strict profile. + var encCases []obj + addEnc := func(name string, a []byte) { + encCases = append(encCases, obj{"name": name, "encoding": h(a), "canonical": canonical(a), "on_curve": onCurve(a), "small_order": isSmallOrder(a)}) + } + pBig := new(big.Int).Sub(new(big.Int).Lsh(big.NewInt(1), 255), big.NewInt(19)) + for d := 0; d < 20; d++ { + for _, sign := range []byte{0, 0x80} { + v := new(big.Int).Add(pBig, big.NewInt(int64(d))) + e := leBytes(v, 32) + e[31] |= sign + addEnc(fmt.Sprintf("y = p + %d, sign %d", d, sign>>7), e) + e2 := leBytes(big.NewInt(int64(d)), 32) + e2[31] |= sign + addEnc(fmt.Sprintf("y = %d, sign %d", d, sign>>7), e2) + } + } + v := new(big.Int).Sub(pBig, big.NewInt(1)) + for _, sign := range []byte{0, 0x80} { + e := leBytes(v, 32) + e[31] |= sign + addEnc(fmt.Sprintf("y = p - 1, sign %d", sign>>7), e) + } + for i, so := range smallOrder { + addEnc(fmt.Sprintf("small order %d", i), so[:]) + e := slices.Clone(so[:]) + e[31] ^= 0x80 + addEnc(fmt.Sprintf("small order %d, sign flipped", i), e) + } + for i := 0; i < 24; i++ { + addEnc(fmt.Sprintf("random %d", i), randBytes(32)) + } + addEnc("a public key", pub) + doc["ed25519_encodings"] = encCases + + // Base64 as Go decodes it, with the offsets of its errors, in the + // encodings that the protocol uses. + encodings := []struct { + name string + enc *base64.Encoding + url, padded, strict bool + }{ + {"std raw strict (age)", base64.RawStdEncoding.Strict(), false, false, true}, + {"std padded strict", base64.StdEncoding.Strict(), false, true, true}, + {"url raw strict", base64.RawURLEncoding.Strict(), true, false, true}, + {"std padded", base64.StdEncoding, false, true, false}, + {"url raw", base64.RawURLEncoding, true, false, false}, + } + inputs := []string{"", "A", "AA", "AB", "AAA", "AAB", "AAAA", "AA==", "AAA=", "A===", "AB==", "AAB=", "=", "==", "AA=", "AA=A", "AA==A", "AA\n", "A\nA", "AA\r\n", "\nAAAA", "Zm9v", "Zm9", "Zm8", "Zm", "Zg", "Zh", "Z", "Zm9v=", "Zm\x80v", " Zm9v", "Zm-v", "Zm_v", "Zm+v", "Zm/v", "Zm9vYmFy", "Zm9vYmFyZm9v!mFy", "Zm9vYmFyZm9vYmF", "Zm9vYmFyZm9vYmE", "Zm9vYmFyZm9vYmE=", "Zm9vYmFyZm9vYm==", "Zm9vYmFyZm9vYm", "Zm9vYmFyZm9vYmFyZm9vYmFyZm9vYmFyZm9vYmFy*", "AAAA\x00AAA", "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB"} + var b64Cases []obj + for _, e := range encodings { + for _, in := range inputs { + c := obj{"encoding": e.name, "url": e.url, "padded": e.padded, "strict": e.strict, "input": h([]byte(in))} + out, err := e.enc.DecodeString(in) + if err != nil { + c["error"] = err.Error() + } else { + c["output"] = h(out) + } + b64Cases = append(b64Cases, c) + } + } + doc["base64"] = b64Cases + + // Bech32 as age's internal/bech32, copied by datekeys-go as codec/bech32. + var bechCases []obj + addDecode := func(s string) { + hrp, data, err := bech32.Decode(s) + c := obj{"op": "decode", "input": s} + if err != nil { + c["error"] = err.Error() + } else { + c["hrp"], c["data"] = hrp, h(data) + } + bechCases = append(bechCases, c) + } + addEncode := func(hrp string, data []byte) { + s, err := bech32.Encode(hrp, data) + c := obj{"op": "encode", "hrp": hrp, "data": h(data)} + if err != nil { + c["error"] = err.Error() + } else { + c["output"] = s + } + bechCases = append(bechCases, c) + } + key := randBytes(32) + id, _ := bech32.Encode("AGE-SECRET-KEY-", key) + rec, _ := bech32.Encode("age", randBytes(32)) + for _, d := range [][]byte{nil, {0}, {0xff}, randBytes(5), key, randBytes(60)} { + addEncode("age", d) + addEncode("AGE-SECRET-KEY-", d) + } + addEncode("", key) + addEncode("Age", key) + addEncode("a b", key) + addEncode("é", key) + for _, s := range []string{id, strings.ToLower(id), rec, strings.ToUpper(rec), id[:len(id)-1] + "Q", id[:len(id)-1], id + "q", strings.Replace(id, "1", "", 1), "1" + id[16:], "A1QQQQQQ", "a1qqqqqq", "a1qqqqq", "a1qqqqqb", "a1qqqqqqqq", "\x7f1qqqqqq", "x1Ẁqqqqqq", "é1qqqqqq", "AGE-SECRET-KEY-1Qa", rec[:4] + "B" + rec[5:], "age1" + strings.Repeat("q", 100), "age1qyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgp"} { + addDecode(s) + } + // Non-zero padding and illegal zero padding, with a valid checksum. + for _, data := range [][]byte{{1}, {0, 1}, {0, 0, 1}, {31, 31}} { + values := data + s := "age1" + for _, v := range values { + s += string("qpzry9x8gf2tvdw0s3jn54khce6mua7l"[v]) + } + s += checksum("age", values) + addDecode(s) + } + doc["bech32"] = bechCases + + path := filepath.Join(*outDir, "primitives.json") + var buf bytes.Buffer + enc := json.NewEncoder(&buf) + enc.SetEscapeHTML(false) + enc.SetIndent("", " ") + if err := enc.Encode(doc); err != nil { + log.Fatal(err) + } + if err := os.WriteFile(path, buf.Bytes(), 0o644); err != nil { + log.Fatal(err) + } + fmt.Printf("wrote %s, %d bytes\n", path, buf.Len()) + // The same JSON as a Dart constant, for the tests compiled to + // JavaScript, which cannot read files. + if bytes.Contains(buf.Bytes(), []byte("'''")) { + log.Fatal("the JSON holds three quotes") + } + dart := "// Generated by tool/gen_primitive_vectors.go from primitives.json, for the\n" + + "// tests that also run compiled to JavaScript, where no file can be read. Do\n" + + "// not edit.\n\n" + + "/// The text of test/vectors/primitives.json.\n" + + "const primitivesJson = r'''\n" + buf.String() + "''';\n" + dpath := filepath.Join(*outDir, "primitives.g.dart") + if err := os.WriteFile(dpath, []byte(dart), 0o644); err != nil { + log.Fatal(err) + } + fmt.Printf("wrote %s\n", dpath) +} + +func mustBig(s string) *big.Int { + v, ok := new(big.Int).SetString(s, 10) + if !ok { + log.Fatal(s) + } + return v +} + +func leBig(b []byte) *big.Int { + be := slices.Clone(b) + slices.Reverse(be) + return new(big.Int).SetBytes(be) +} + +func leBytes(v *big.Int, n int) []byte { + b := make([]byte, n) + v.FillBytes(b) + slices.Reverse(b) + return b +} + +// checksum is the Bech32 checksum of hrp and the 5-bit values. +func checksum(hrp string, values []byte) string { + gen := []uint32{0x3b6a57b2, 0x26508e6d, 0x1ea119fa, 0x3d4233dd, 0x2a1462b3} + var v []byte + for _, c := range []byte(hrp) { + v = append(v, c>>5) + } + v = append(v, 0) + for _, c := range []byte(hrp) { + v = append(v, c&31) + } + v = append(v, values...) + v = append(v, 0, 0, 0, 0, 0, 0) + chk := uint32(1) + for _, x := range v { + top := chk >> 25 + chk = (chk&0x1ffffff)<<5 ^ uint32(x) + for i := range 5 { + if top>>i&1 == 1 { + chk ^= gen[i] + } + } + } + chk ^= 1 + s := "" + for p := range 6 { + s += string("qpzry9x8gf2tvdw0s3jn54khce6mua7l"[chk>>(5*(5-p))&31]) + } + return s +} + +// --------------------------------------------------------------------------- +// A verbatim copy of the functions of internal/ed25519strict of datekeys-go +// (v0.12 branch), which a program outside that module cannot import. + +var smallOrder = [8][32]byte{ + {0x00}, + {31: 0x80}, + {0x01}, + {0x26, 0xe8, 0x95, 0x8f, 0xc2, 0xb2, 0x27, 0xb0, 0x45, 0xc3, 0xf4, 0x89, 0xf2, 0xef, 0x98, 0xf0, 0xd5, 0xdf, 0xac, 0x05, 0xd3, 0xc6, 0x33, 0x39, 0xb1, 0x38, 0x02, 0x88, 0x6d, 0x53, 0xfc, 0x05}, + {0x26, 0xe8, 0x95, 0x8f, 0xc2, 0xb2, 0x27, 0xb0, 0x45, 0xc3, 0xf4, 0x89, 0xf2, 0xef, 0x98, 0xf0, 0xd5, 0xdf, 0xac, 0x05, 0xd3, 0xc6, 0x33, 0x39, 0xb1, 0x38, 0x02, 0x88, 0x6d, 0x53, 0xfc, 0x85}, + {0xc7, 0x17, 0x6a, 0x70, 0x3d, 0x4d, 0xd8, 0x4f, 0xba, 0x3c, 0x0b, 0x76, 0x0d, 0x10, 0x67, 0x0f, 0x2a, 0x20, 0x53, 0xfa, 0x2c, 0x39, 0xcc, 0xc6, 0x4e, 0xc7, 0xfd, 0x77, 0x92, 0xac, 0x03, 0x7a}, + {0xc7, 0x17, 0x6a, 0x70, 0x3d, 0x4d, 0xd8, 0x4f, 0xba, 0x3c, 0x0b, 0x76, 0x0d, 0x10, 0x67, 0x0f, 0x2a, 0x20, 0x53, 0xfa, 0x2c, 0x39, 0xcc, 0xc6, 0x4e, 0xc7, 0xfd, 0x77, 0x92, 0xac, 0x03, 0xfa}, + {0xec, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f}, +} + +func strictVerify(pub, msg, sig []byte) bool { + if len(pub) != ed25519.PublicKeySize || len(sig) != ed25519.SignatureSize { + return false + } + if !canonical(pub) || isSmallOrder(pub) { + return false + } + return ed25519.Verify(ed25519.PublicKey(pub), msg, sig) +} + +func canonical(a []byte) bool { + if len(a) != 32 { + return false + } + high := a[31] & 0x7f + ones := true + for _, b := range a[1:31] { + if b != 0xff { + ones = false + break + } + } + if high == 0x7f && ones && a[0] >= 0xed { + return false + } + if a[31]&0x80 == 0 { + return true + } + zeros := high == 0 + for _, b := range a[1:31] { + if b != 0 { + zeros = false + break + } + } + isOne := zeros && a[0] == 0x01 + isMinusOne := high == 0x7f && ones && a[0] == 0xec + return !isOne && !isMinusOne +} + +var curveP, curveD, halfP = func() (p, d, h *big.Int) { + p = new(big.Int).Sub(new(big.Int).Lsh(big.NewInt(1), 255), big.NewInt(19)) + d = new(big.Int).ModInverse(big.NewInt(121666), p) + d.Mul(d, big.NewInt(-121665)).Mod(d, p) + h = new(big.Int).Rsh(new(big.Int).Sub(p, big.NewInt(1)), 1) + return p, d, h +}() + +func onCurve(a []byte) bool { + if len(a) != 32 { + return false + } + be := slices.Clone(a) + be[31] &= 0x7f + slices.Reverse(be) + y := new(big.Int).SetBytes(be) + y2 := new(big.Int).Mul(y, y) + u := new(big.Int).Sub(y2, big.NewInt(1)) + v := new(big.Int).Mul(curveD, y2) + v.Add(v, big.NewInt(1)).Mod(v, curveP) + x2 := u.Mul(u, v.ModInverse(v, curveP)) + x2.Mod(x2, curveP) + return x2.Sign() == 0 || new(big.Int).Exp(x2, halfP, curveP).Cmp(big.NewInt(1)) == 0 +} + +func isSmallOrder(a []byte) bool { + if len(a) != 32 { + return false + } + for _, s := range smallOrder { + if [32]byte(a) == s { + return true + } + } + return false +}