Files
precompile/p3q/kat_vectors_test.go
zeekay a466c21334 crypto precompiles: a halt from calldata, two forgeries, and free calls
ring's lsagVerify halted the chain from calldata. A scalar of 0 or >= N makes
ScalarMult return a nil point and curve.Add dereferences it; geth's dispatch
has no recover, so one transaction stops every validator. Its parser also left
scalars unvalidated, and the two builds disagree about them -- cgo refuses an
out-of-range scalar, pure-Go reduces it silently -- so the same calldata
produced different verdicts depending on how the node was compiled.

frost's Schnorr check was a total forgery. An unliftable x-only key fell
through to the identity, collapsing z*G == R + c*Y to z*G == R, so choosing any
z and publishing R = z*G verifies under every off-curve x. cggmp21 forges the
same way if either coordinate comparison is dropped: one coordinate does not
identify a secp256k1 point, since (P, -P) share x and (P, lambda*P,
lambda^2*P) share y through the GLV endomorphism.

pulsar returned the full supplied gas on four exits -- work done, nothing
billed -- and ring had three arms returning zero. Corona quoted base + n*10000
with n an unbounded uint32 off the wire, up to 4.29e13 gas. Capping the charger
alone would have left the exported EstimateGas disagreeing with the fee, so
quote and charge are now one function.

corona's deserializePoly ignored the count from bytes.Reader.Read, which
returns a short read with a nil error, so a truncated blob was zero-filled and
fabricated coefficients were accepted as signed material. Its exported
ExpectedSignatureSize said 4096 against a real 163840 -- it omitted the A
matrix and bTilde that its own parser reads -- so any caller sizing calldata by
it built a call that could only be rejected.

Per-party gas prices nothing: corona's verifier never referenced t or n (dead
parameters, now gone), and frost and cggmp21 use totalSigners only for a
structural check. All three charge a variable fee for constant work. The cap
contains it; the schedule is consensus-visible and left alone.

Vectors are frozen hex with the generators deleted, because a fresh-key round
trip passes when signer and verifier are uniformly wrong together. Each carries
a genuine signature by the same key over the same message under a sibling
slot's context, which must be refused -- domain separation tested against a
real signature rather than corrupted bytes.

189 mutations, one at a time with restore-and-reverify. Five survivors, each
proven equivalent by a downstream check reaching the identical verdict.
2026-08-28 11:22:18 -07:00

39 lines
41 KiB
Go

// Copyright (C) 2025-2026, Lux Industries, Inc. All rights reserved.
// See the file LICENSE for licensing terms.
package p3q
// Frozen FIPS 204 known-answer vectors for the remaining two P3Q
// parameter sets. The ML-DSA-44 vector lives in kat_test.go; these
// extend the same discipline to ML-DSA-65 (the Lux production target)
// and ML-DSA-87, so no parameter set is covered only by a round trip
// that checks the implementation against itself.
//
// Each set carries THREE blobs. katNNPub and katNNSig are a signature
// over katExtMsg under this precompile's own context, PrecompileCtx
// ("lux-evm-precompile-p3q-v1"), and must verify. katNNForeignSig is a
// signature by the SAME key over the SAME message under the SIBLING
// slot's context ("lux-evm-precompile-pulsar-v1", precompile 0x012204)
// and must NOT verify here. That third blob is what makes the
// domain-separation claim testable against a genuine signature instead
// of a corrupted one: without context binding it would be replayable
// from 0x012204 to 0x012205 verbatim.
//
// Provenance: mldsa.GenerateKey + SignCtx, self-checked in both
// directions at generation time.
const (
katExtMsgHex = "a0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebf"
kat65PubHex = "08a6631597cdf66e339ed562510d710a8dfdd8a92953d670ea987c9ad365c0b3b553156a5122eb3add023319d581551d400bfcab76592059e9fa9152bc5a0c5c68ac4187645fcd8550065b5ebd64a7fdf6cb76518a472314ff6715b967d19c5b9ec1ea432999882c356192c538f2ad342c906d994cb2e0f6071d0b475e6a6694558dacd35fd5e835cfea7b1d02dc371c05376b517d756315c7989b4ff29acf9f69fea3295da896748feefcd0d426aeead9e85786e2a45fbcd65a1b7225fa04d2fa6e4dd274594896663698334effa23235934339512a6d27e47d260d223df72a4d9afdff05ea3f6e608e7b09c74a68ea0a5444b7bfd8e3a043cb27d543d1efd46f9311cb5d0ab2f8682c777f56e0256ce289ee0e7b5136611510b065da7b06548b250afced18dc0fa1fce471f7a99e01c39d54164fc24dfc3b75bee2e59fb0c899ad5a24b4a663155f940d138a74476529026e1504e34cd4e780cc2c147d5a9849e3cc033acd81225ac336ce97c44d23d19f279301f6508588b595f75f9305d3bae28ffd387547504e67160477a3083918ce333b24b177531b1fb9c5f2a76eade36f5e301210d2d1d40fbceea6dd9f778231701e8e9210ff6f35bd559fec9067e3acd9ea36bb279fc3acd65f04e58de8237cffc764e0da66a48a9f5d382eaede16502f02ffe5438d538ad810f973f7d40b74ece585f480cf35d120ffa85bf2d85f82b0cfddd443aff519c77e77059cb128f1dc8a2f8b9b824d17814c35b46b827dec480726ae725c8ef6c9a0fe2ba50c137deccb6a6d2cba176eba98ce2fbecfb380038915456f5b90627324772013ecb7e52e71dc7005d443211064aee5591b825fbcb5fadfd5a7f1cf5e38e98c830166015d6082bdd771abeb4f8cbee578f8c1a3af956bc647adbe21fb3adb130261325ef4c59df22019a81bc0a6431eb24f6f2757880279c87b7a800e59ba3cdae0d614bb61f40f83be13ba9e90b8ebbe457a1d03cc32afbf6b05eb404a2a9a832f81281538bc0754c0d29db672f1fad2483a421d6fc73472fefb90bce57baff0ee653cc3a97479030b3e9db5666d34f0dad136925acd951f605e241894affbc507338161d96a808fde2095d10bf4b893605baffd4572b9862fccc0ecf10ced58936122abf641a17ad3276d5104be9eb057f8c4e63abff4f22b652298b2869e8dc4f5e997aca36ef0145de10fd89723a015e1587990e95448351b52fd4b554f00ec316a9a5e6ee41cfcb97f0b2e572ca7f9a16fc31fcf20cacab67d5c6ad58f5e49723f01427040cdffa1a8a67fcb181d3abbebe5532a618a5543087763f50912d8a9072372da800e6f87e2a469ac9fac7695b706ba54dd280bd03f902c9d92cb4135cab653415af329f539e85f98536dc1d5cf2ba6384fc240e31ff6d808393725a3a98ad536c997005f45278decc444f55cc3421877e1f84d259bdac6380069840fbc39fb5f53a4f81a6387658cb8d5eac5c9d469d796f88cd18588afd0876c4a36112a57e8e69d32288e887704f3118bdda4ca51db1524eb62c7c3d56d84dd6e03b61d5b615e7d845f93dc050eba45fdb2f1f5735fdfa341151e8067effb34e26179fe726cd7a91c27fc14efc24d3de17b71dabbff3cce358f5961140d378e87300f30df011ab7cd5c2656252dc717bd836474d0f7348be3814233426688d61eb1c1e528a162c31603151451574a5eef52db7f899aa55f350b59c9866aa4f4b28359e248dd6a4e76cb67cddc02c7394e1daaeb17db27a1e1d03ac1407f10c2f54f46fa90738911530ba371aadca7ad7ad687edd040f404dec70782805eac72df08ee599e3e46b04a8f860ce01456775586cbdcf1f92945f5c81c09a284eeb2ffcafdb2e7984dbd861de43c2d4055a05cbd457108e9755eb9b552cc30fb5ec54062f860b3551a37d3f0c14a0b9c26e80bc2733740cbc69e1f3f9fc997905a147ae6127183f389ab4f3ba4a1977bba8ab8d979314710644a92f05bbf5d4d944652dfe8ae15ba0e029654c13299d840dab2f01fa1ecf26bc384c50d29cf4b35469dd3330c4bc11feaea7310be531b73ce68f182aa29a5ee1cfb1d4866859b0925c84b3953ff290602dcc2e4798a9595b1a2a051fe7d920971a95cbd58e3a94441a1dca6204e8a3438e2c355ae2e758a4082bf259dfd43c643b2f5b2d239e7fd9d6bb5a7d1a1b752dd557d033019a823afdd5c576f53b865d8710ed4e886a34a9987fc2599f0457bb00dc7ed78a91a010f72f5e5065bcdcde6ff3a0933360f59b4e9a95e4b45bbd8b3611be0e92c7d8c4bd2627cdb103e5fd4ee31d4b918a613330add2d435eab94e5001967e0e110ef2d168a8fea39e510173b45c7e55cf65c05d3585d326855fecd2caf470fa5073d760c830bfd7280d05fb87ab4f33e423c1a5c78e083c3f86493eeca146ea3807b87bf2ae6293c2e3936836939924c388ca8cbeb3dc175e4e6b972afa72773015319f321266369eb4dc8666e9eec1620311b753c2cf00fd2812db8d76dc9894d4e5909049b5d7d71d4b01c35033b0a6c898d6f16fa761a010914e2eabbcdc55433f43ea84258882bdb97201a04ef01a5c4e62946f02e7d8e63b098f6b1a4c5aa9797c89e005d6df11153eb90c7a3e57bdd5bed9d5109a9e2a9115d93ef3ed3fb9b53e2fa2e6f87178ec9dfb3f3e28667765817e38332b424a5399b7319051c7e6cc901e13ad175a9448e5568ab63cf3074ecbfd66057c23cff52c8d79a926141db4cce"
kat65SigHex = "85f7bb151045a839423a9667db566b4b067e38c0bff3003702ebcd12740c06efdafddfee530ecae632e165cdb023511eabc770ff578ee9b442fb48ee43406b63c08489110cdcb4fcf597c553954266fdd1cfbce1f887f58c14764c5a733f96012c48cf5c028e354e3d05c0468d60614bcc138d89a6c33fa95ec5ee087cc93a1e872b6973bbf7cdbd7f46be42c01f9d338165fcfac57ac04c11e07b4e3476540925876e8ef33b8fc547b3d028936cb6afa9bea76814b2be50898cdb3b53e497bee38605d154914c0b0d7e7c4e1cdf5c6c30f217bfe5a4aaef65eb47c984d31948e855c7cb9103ce63bf91e5e75cef22f1ef60dcbc2325781442a41ef513209c22d0f674788a4865b625139b8acffeec95ff150532b49aee900d2cc2e4269b4c8257d76a5476d08df71ca228764a72e3e5c9ebceec884c7225fe740de474759f4d5b1fd58df600ae7b90c39cb25f78cbae3fd439c51aa31d1226156a204c367ed6cd24c7cbbe22ef684d7115a2bc5ca7b33d92970d9571e79a1d05907f66f76c682adbf817801c8ca6addc8c6b804c17c2ab6f0d18618e83405ad375773229081e2037d64363437fcd57f32212e3076e86617d1967e74660fdb8966db6ee88e492c9eb409d8609277452ec1c8b2df6f75254c590c60e9fc2f6d34c2793d836ba787d090a22cfe677f6d4f27abacf9aac9c230494069a11fbe529e15f6bb0502cfef8e31053365b1f1665bc0b7df7de0765260e88950514cce4cb5279efd3188f6928a5931852c08b2abb2c9193327caa9d847e5f6c7d524b560de98ecf3c4d2e27b6c8ff217f8eabe5d1c11d67113d17d98a7441edc66d3a7cc7f685e854f5bdbdf8ccd23a8ea86021e0e32bde6937f3eae43435e57c853d3865b4cfee263dfd3b2f78c866865a12d00a0215174f7298d7e7f7f4057903dc724bce1287e2741d00b5e3f410cfe24ee522c4d8db7b366b1534a2ab7536877702f5336fcc544085734d2339946186619f25e404df3f21b1c86bc995c942057c0f046c05c56a1f57145f251e5e4ee1a3152f682fb15d17c576bdb958de1febb59b3c0279be6e284cf5a4b364af6ac77433dd96792156f2045dcf36796b968ae055721430a059f5d67de397469a16d1caa84d4ff995ddd313f947e38c01774012415a8698a18717c0554168ad118f66bb39b1fbd2ac0efd2520561961cd64015f199c32bde6000079243ddb7b1e797ad38fa916402559680511477760f417508524d451fd37dc02c926ba80f9e0d53dabb4fcd152ec3c02980b14d9bc83b006fa339c6440a1a4a8165b9ea5275d9e842ba0465358901dfcb47da6ecbd66df209ba85e681fbbbfdfd4d1904cfa468dfdc939689eaaf0e2b84b3e4688e8ceac4eb75d60e852f9b4487250039a404d5776735791213406c15f689af967f8ccb9138b44321b48b159e301b769677ae0a71ac98906b43932af5cda3a7c4d82ef99503691be26bb553f14371f97bd3f342bd517250a0722b3b87612b48bb0ea7f5baba429fd4154523ee3db7f58b3d0b5a8ac9fd92261842a06de8c31114b386dd437f4e29fdb4b6e81cde34a80d3eaf826ef5b58b5f50ed8bec0859509c964d0950b6c1539f233b6c2d1bcdd668af9eaee226af2cc8316d519d1190cde8eee2ac12d6d326d1b7ba7e0aa9077b28fb50ef7c73ceab7884f206afa7d2d6b419defcce7499b5f774252073b53dbfea9a7fc0e0da01cea29f7c765a2525ffa5978e64a129b8fa340dbf93dd5fba1cf0123d6947eae06a7b9bf0dc7c392a804cb4971b1e2bc78fb629f9d2ae31ca0eacb0a241f27c33e859023f7306baec58e58c3fd36d01ef1dbdf8cccd3c264fb5129f4a5971c4048457333ab47a1d49dbde4744cd0fc156b555c6887f8b244bcd44657d31ee33a4ffe891e24bbfbd9c0b89367e8c57b2238c65ccac2c9610297cd030e67365b836291702e6f44edd3445ad9e68c6a43b1c96704ad2603279a447731477bab83e7f06bc111d5d416a27e01b1085a83dcc53e2436e2d3be09db17588db3c93b70abdaec76de9efe01d5c94a1597148e961cb142efa98f7f159103f9fe8722711df7e874a07109702da2ce8248e3a75e68bf7984f11759679b59ca1fc368056289c43524142bed6520adf8a6fb8c704676ee5665e883a89d4c5e0c25c3daab82b2611657a687506d648d10e57efb83529cea4ba06beb02268db6bc108d0d99fdc86e1fcd05d228a177d98cfb7a032ec41bb3e81eacdc9d0067e9a6b87586691134545048883e15a40862001de5d2a569311774adc3e0be0671c99b4afe801d8d3c95f46753c2b3b2bf74c0e757792a92ee76548b3ce01925e9b33d0c7308cac05e1468c02d0cebc9245aab7f77d5b016036164fb3db5c7db95a4e9ba0c8bba13ae5c22b2964811893ec5680bff1118d5f94b0138b7d1e3bd800f8273d048939a02429bcb7db88237b1f39a33801540a58bdd8f6c9aa9fcfb3b2bc4ea773007a38a341a755827d4e5a657977f52c4d487eb3be5a28c49f80609658032c33fa1d274f2095fe3b4e9eaf73f44a99950c7fc1fd351db4a8fde18c0fe83461ad23fe35083475d2019ec278bd19d537fcaea31e00b4ce65f907ce2b964228c2f5002535022a7278c3a62fea2cf8040ebeb31a1d71742ca4ec19711767a7cca47c14e504049ecee037b09e40a4d06d932b41a9f28cfc14d8b526561cc73eb0944bbbbb3b9e57c42ab8f436ad879e37d101dfcf5545e7f50fdd087d891b270009f7732fc3a68a45801c99a61a3725b7b224ef6f26565a1c635f670a930105cb6e1d3f853ae834ab43dfa5afeec28654b6910226f48ce450a66b17c16a917c6cbe3e3a55364041ecd9bb324a09f8b069e0fca43d3d51f2452a14e0afcc5ad792ee786af9aa36b0c3b9061661832575b1233a031266df6d704aadbaab3cb974cb3fc1a6c78ef9b87785b4bcc86f78b768749eb4d278e25705865cdb3ddb98898bed349ec9d9fb1c12e931a29616abe15ac5e90d18be659a1b4ecf0816986a0b4cb0e1b95a902374e9f92e4ce92d6cb9d176101747d76046513a7ac59b0b2cea045d00065ade0d002d71751c4697645637335d42b22481a7803637caba120608d1345079ae0d24857853c98e6cae5d1c00a645797639063673706ee8999abcb947f8e51489e1f737904bb905f4f605d2f7731d762d402cc1d16bf3484bffea10163662045c26e0c8b34e5925bbad87fcb3155d0706c0ac44ef71b2aa069c3b92b1c97d434f5c7d46230bf9172b27ebd82219d397ecba01df696e028e1c7f281b3e28880471d45748e982dae1cab489ddc02909c26ee02cf64bee050e77375020df7eb5d0162b8100a78421fbe4f8b4a8ac6497d223cdd8cdb297fc64ada44195bf9c899099c435cf1e3f163a8c50a1cd24c7221c6e15d66bb585e0f912286e27a7e8edbc7ea4664968ace6a9f063993efcc542446b87413d31f344058ce9d651ac60573d3868e93a24d51e89349b2ecfd5627b00e50f72e062e9cf09ce19be2c9d1130dde5f5e677dc1353fef32f4c17bd8adbc811353e97f766e8a76d790c3f9682b8a0dffd8a632899f8886307d727c235bab3646567917911790ad9900ab0918399f478b1a6c99298dde7721265203b22373d81e8dd2360e14c4c6c0682ab7b9af1f1ba078399cbfc42eb91f75732da214feacbc70ef4c5b9bd45a2815b4ac464d70bae957c6ff422f44d233a4e9b81c1db5a501fb52c27346cc2b1aafee076c155fbafccab57d7485537577fa15b13375f116958d8af347739da6a0ba5ac97175df74ff5743faf5122347ba5ba2b0664331d24dc0ea40f01aa04496584e81212f0feb5edac25a632e029dcfbe5a47348e5489e1e1a3d1051154e39bf641b25c0febff4b0b0d2433e2acfe59f1e79ea21e61944dca8c45a92cc3e74859ccff0daab4796e666decfafb590f5196358a114719b03cc7dff62f7b0f4c331dc333d23b7b93d14b992ea97c0173a0ddf1bd6337043e4883d20c4aff1955fe22c8a17cd60fcd701d5f5f074976976cdb47660e10a7e85e6bd3dd6f09c6f2bf03300e0b5e587b9fc625647ce3dfc565f66d5505dbf3e74db9a54f9f42d36a2ff86546447e90505fe60bba3f63d22110ff48091bbc9d8ea20048149d2b79897e852253f1d80b16bdf671914552b89dab81e5f768158c52befed81a9abf86f254a143aadeba0987f32439cc626030f89d71875fbf6d24ad03996fbb069b40cd16030170d538d400d37a343da0922f1a392884821a11a6b43889f0084f3c1161ed9aabec7ad36918de08b6952c3ba19a791c738b0ef75460569904421f039b805bbd02c5e698f181bd42a372bbd41e8ea3741b2607881633afe78e8208bec6e20cccf2fb15286e87038ce1823acb8b7ecaa93ca9b16d2a35873ca97df626081a8a4b9a5175201a5162252bb468a89becd2abd893e7035db465bac561089295872cf26203b239e55117e04b6447dce5301ab880761e646a686dddc49c93c8722ba20031da1077af5bebfbc3d0ec4ce64995b5240118a11f3e7c1a4b6352f6c126ef32ec856b168f8ba94d5519219fbebfa3cb15561c23354f5e6eb0b1c12f489b315a848b9fc5e2ee072f515877919bb8f1f7fe006092b0191e43628e9ec200000000000000000000000000090c141f232a"
kat65ForeignSigHex = "b611cde62adbf5d17f2ec030980754e2c50206aa91925594bacfea955cf4b565037110dcf8724379a3e38fcc002b4f4a4d89e9c88123aceddc98368ba04f8d22b092daa1ab8d3b6711a46bc931003148d8b5e492f30aebff0dbfbb059043f738db23854a2ae4e351fda0e629861e610489ecba836588bee72f89dfb506903260363aed827a0f043d1bd17a0fa94d76c9f31d56a8c650752ea8a46f01efc29e9d58b3abb1ba73315295e02c60ff69b5e76228f5543220a23bbd4dca0581760792742e106d41267785018219cb3716db05862862c7fd13819427c5328e0c8b941d8c28426941986edcbcb6d950a8201f88a9469f05bae7f29b63fa8e435919734f617433efe5e07071f4c2ad6bd78c349566794bd87b45c2e9ddf75a8da24ca2c9a56bd36b65444f9967b397863b3a0ed85df7912e43198d218e5c31d92e8057c1cc891d740db3ac3c7afb46990b6992b730672fd3c97f9afe0ba12b630cb3f2c477e52fdce2d7c1b04e8603d51040da36a291d0b2395e1077685af23ce8804b50d8e3aeec1457c16dfb5a9db9baafb621e4cc715fbe405ebb9955d15fb3d5dc245a6e4f0d88270cc2706edb16ccbbcc0b66bb0aa42a7b15f5667773e534cc8bf0ebceab38b3517e1cef08a286a77246e1d1910aa297b0518ed242e76ac6c13282a233773f82c2dd19174c85d9479d87d087dad9518aeb6375ff02dac84c9f0035bdd7c908bf01c4d57145ba9e0de1c96c1d16d7890b11ceb75a3c872dc6f4b2b1e5a2a52be8a0afdffcc2818aa59d416ae52244c25d6b6c088b426c458ae009168479bde30a53ee122994e02678e0e64878e8e7be231135108719519545ac084d31a1c73cbda82a70b35880d1c1383497fed7178b150bbc810507bbc132eceffb560890aac8b2d9c664952fdaeb5cf084082194792cd4e2567c0c8b5d0ca58a344e74190fe742882c7d3c4aadf0c8ccd1eae34d0d9303e5e702f29db52008ae91e30c54f1db439f2643b56d8a8662eb5da6c1dfe973dd9a2dbddca48dd50dfa9d16dbdf00b631ac761490a99cde2f97da43bf31a57b8de37e3ac3a380964e10e22dd2afcdd3bfc8d59774cb998aabdf26e5fd0effae55ad2e88f1cec6531dc0f831c82568d04dd2802a914e255c397add0a29247c92cb4915603ba63e0328033a967a4f54c2806bd4247f331efb90ea481c74b8553cb6c9d5613706b3a0bba17022a9502c08470d5e361b982523c2261ffe52ef78895ed4cae097395df84ed188163350bfd3b426bd4be760f85304578e5b1c4724ba058adca56725209824a49ebc2e379adf32c996801606257a9fe1114bae784f0abb80533d01a8203208e3603996b81e574f82668362349ad5cae56cd04467337e06f7756dda4336d6198c0e2ab8b99474fdcd1cc90cc5d65d566e644ab499f023cc33817842ac0e97e9f86c9d2dc58db833ce6353ef657b51c907aeae8a4c1dc3eb3ee7b0e6af1b7502acde0755b05d1423de493f77f7054f0c90244db64ae4692ac57210dcd03c39ed2d461a5f7906821963d1279da576028ca65d3011c408200285a6c55e3903f22f160300315442ddc01a241087d30f0d77069b379202235ee0c7f8137ad7022648ff04332b934d6b2938727766f4fd415e1b9ef4f3920cb3869444f396cc099211acdfdcee562a24e4930906fdd575720860e26b86c0c1a7a7a85086fd1c3afd3ab52f5d866088d6e87aa191bd7e6b909aa52a404858117b9f6d11d77e4892da8f2b6ef7d578b777a7b4dcb17f475f47c9feb88425527d3707576e716b7894d1b27132dc8ef8a141e50864966980dcd95bd644f1be1e8c3d0ed3f133eb55ab34846532ac74c5f7fc321df63b676268fbd94ce615de4af7318b31d2f41eb72cf04482638672b6ab7ac59a30f0751fee25641999ee748d63d18b3f8fbe8259264080544336f4b85fdd7d0e30ba775803e713b04499a84e0fcd367deec698fba33323ee0c8b95ba3efece95c71dc71d989c98b70b1add5dc98a5710bcec103b5a30f7f756671d7b075bad4e43c90ab460e753c40aa0f7fd01eb6b19b0384e598e6c4d15eed6c9bf18468d5ca46c6aae05cbf29653b382d573d8aab0efa39ebe57136aae175cd6702fbaebe57bb0e5bd851a5ebfa0d34bedb9b6d240262d9d22e94743b0f665bdf71292c545448b684e6393f577e8d64cd9d9d446efdbf4eba04331cf5b15fc977dc72be62c8e3703d72569dee5b3d07f111d3ad4f553ee6b7c41541cdab6b1ea407ab5d0724dfc3c27f471234de501e3d4ebfa3c9dc0d02c40fdaa5984561c6083b5521e98a5aa6d961088aa2ab491a1de9f566d2e12c70bdbef88457f27d1343397927043aafe12c7e0d672a99e7085b7ed3d29330290ca3996e13ce51cecb8c00979537597bc45922ca82b450560dba81dc9690e98917a95293d94b21be4c1c29148b5337773a61a5b4e58c267f2e431d6657409f8a2e7bb9995ae2fb821cea4f206a197a8f3bb7e5c21e10d1d28ec2bd06cd6e65c8b8e20e8e82bd2d86fdb5991c43740bd5e5d52d0d75f241bbbaca2766f2b21c572a681f1fe2e41b7eff87151e75a0dce652e5caf2990415ed1f9d81851374a6e5f0bd2c894b7062a57689770a532ba180ce9b7e005338ddb0799cc9abc74a977a4dfd42bb0265dd5da83cb6ef14b396be0bfb15c8c8ddabf339a6320f272e60b0c47670773ca969aece27dd0685b88064e5e1f79e9b01f1b9f055ab87319e41c8d01585f1147ab4ffddeb56df07bf171e68f998e3f53d023901fc11a46a367b6da091133bb6b93e66816fdd364e153f8dfd8c969f4156462e24556906350b41857f5f588a0bb5c0ef93540bd1101f7e73307049df8b5ca9522051b1899aa0d76a799d0153cb85dc6e99fb6076a6feb8b9fcbbdc70e43d7b7b647aa2dcd0b1ef0b3c326122188c1ed3ae266b8e6b1b0b7753d24f16b360b71a4ed9b9b9daa8d8f395bfb184218342b537b4f008aadd58572018ea4cc7949a9276aaa315b579eb873a1fd1498d6ea8926f9cf5b2a4bc66f1ae8b739fa57f600ede94377533b07e1a6ca832da5da991f8ff6ea77fbb3b5c9612e2bfc916ab0e307e0feb08185abb26a15ce24020679a7df8b78c551261a4c4f87cb4ced601a5b0e20a9e20bf298b230fa64931b593060a3ecb4a38063e061d3564174c21203e53e29aa34b505c6ec9bbcb35432712f6566e8a9aae4da19549166786b8ca084ca343f4ef79ac6a4362ae74b5b9d164f525814c96178f28d729246d7f8de2c0df8f04d625a00f722bc3cfae909e01b966b4159a319ac7d58f05e74fd1f25ee4949c6bf001dc3e192a96843cbdc23c9c32a510b6115e838926908e3b1969d4e1722c434749c6ad66b5f53272b8478c49d5dd20c15e50cf441e82a34cf676d25f7e991a90999e195da0e551b0dca45b24ed15981dfc0acc4a16547e5eddcdfb6c59b0e8524aa9b3f50257129893e2d38dd7840419f127ecf3bf93b1cfde2e4ec8699b1dfdbaa9f1c550fdae473704757b4a76a5578fb9462cfc0c6b24061b158ba75542c25622dc8d02742f245915a8865a2c203b1ac8a6c8687f57912bc183545bf63c2be158cc1c319fa6d1e0a02e9f3b778bb1eb0836b48f2393120ad2dcd9e7b6f41ac91167e7c49aed0b2da9e6381debc3634284b7c045b210d79023898b2004bfee59000847057cb3408ede88c5a15fb6af8ded43a229cb0fac8c7f7f057319313dcc6fb58f1dc8310486ffa16327003c1b88afac533a24c6802097a4e4c5556e806dcffeb0da04fbda8c7fc730ebeb312e570e263646d05d8bf388f06bd56b0ea19f3abe1f5fe9e0d204c9f2b95bf7377ff345529ec8a267a0ec5c91ad9b3d26588f71bb3b7f5ff06ac7a8d8d9f79b1ca9737e788c1a3bc18a50f43f6c8f2b9fa54c101b29b2b3975de06afaa3795d86356b32b2c90031249e0573d956fd53bfcd59be3bf63f4d8bef94c0fd820b886145ee59cf618ef31f21f72c5adb439ef788251304b88e0557edd34daa6048b36f2310fe5dc06cc351392d1a29fb60ee97a88688e62069d4cac034b7f6f3fc3a8f84b93472c2ff92948487e46d43c1297c194cb437130c7caf51ba71ed92e0967618c858801c8928e1af25a160ac9971e2c3ed511c2847f44865c942a05daf62c187879fd37d536605cf1bc142121c950f492d5d8ed6988d9de5bbe2127d765f7fa14a99a4fa00f739903695e3e67df5ec020c1970ffa26e1d7bda5b8e37d95942f9afc35a23805da03a8cf07789d97fae8af05c664baecff373c52549e19755e08b5ac8993c89263d1eea579954a4aaf15aceda9145b395b8e4423bec645a6e984949d16177e888d0d6b496b2be440f7b62a344b36c22f302103a804027b7cfde19c3935945ac78336c57f61fa7af88f5cf67bc4da2f21bc834d7906fe9d4d2d70346e141b46c9b2ef1bed3d22470b3acbeba4e6717e9f046fba0bcac3f7370f2fa81d9d2a0b2c141c376148769454991e2dca07a64a44e4fcae74f2a725816590e56a108b5f3c6d88f29dbe86794cbe561553bcfb41d6d5c7a74c36aab959aac390223770c5af6a14612198e374c91618404647636797cee0092278b5bbc7d8de387fa8c30e1164dcedf6061a606b8287903142555dc1e100000000000000000000000000000a12161c2329"
kat87PubHex = "cb0d34d977e69b4b6a6d7c8b3c40f803ed992298e8707a22fd2f1cba0b16650b83d959b897a56fd4d1c6cd9d2d625ff3d361ed890f9da95372585948cafaee1000bd51db4a170f333c70f24820734b72137c3164fe3b21bd27362d137c7e6df4db83aa6a23993431a75a87b8e1007c328e17eb460ebd7bb1120fa5dbf53653e3284ef1c21017f6d878f9857d1e666c29a4f15a47bd21fed2720c2ac703a8cce09bb61cc9d8e80c356bc9e25fbcd1d4472eddf845acc3d3305ffdcb654ae063ee515d78706367b97da28316b4ea3105a932cc1c15c51f223459b0b18c7e2dafbba49627218b5e7a75389ec322f898833f0375a6b14a80be000e64a89bc076bc413002eaccaa3b091d6db577ab3000b929945c91daf647339ccdc6b6ba454ace13fb06eba1ded0e25dffb1d29284a3b7229e096e6aa06fbc0124026a095ae45959a72127eb2b2a9f3333fd9469fd0aa31adb5cbec3d2e25171999e27e5cf267ff35b96691a48aa7295a6d64a33a75ecad99b34a8f24af8f46f921d7cd58244b09e9cbf39e4c9ffc15637a41f1d6581055f5f47fb431c879526fe273f7496a5b2d00e195e6dc4c40e68483a3c41a78c218bbc6278424bc50ab16bf5e48469821b61b43e626955a1f580546c83fed4064b5ae5fedb60beb81832a120850c09b640d250263f3b757a6f1426c3423737455a0e380cdb215701221e176dfcec464beac2b61312a895d4124da9cb1f0053e6e727b58b1a9666e857f42d23f1980f987814d457a13d0247ab7faf5816351439a3e9f044f0ecec87872d16c514ba43ac7252326cdd9d02bbd40f8d483e129dc575edc1db5aa252bae010672db1db2ba3684593c13534b2c34eca0209a3c536da837553e8976df57f54fbe953075b0dba9d41b90b8b1da7bc7f6ce778fdda52f679d2cc1d85930b7d0ec9aefd6055486c80e3a29d406c8d63cfa3fd3b2d3e38219c09b9d26f138d10724c9c61c3c41f7529cfbc7f33e9d46038bf82fbb8288bda954861fbd8712d859ee0c33edd2ad1278d3658d966ccbc1a0462993709b2236c81c5673bb366ef4da8d9f1fe1927df7eaf8f1132c053f9684cfad44dbcc04247ac9ccac046e63fb1d8a544571ed9dab0704d828cdabcded3363c9739bf391a2aff7d6604dc512579d058195ffcbfbe22c12e20f022f2718e594dbdb30b7324e49355e8b6af5c12822496043d8390f09d7e86b12cad995065a978de4165e54f54b6e116c9960d263381f06e92e3688dab63cd3b4c9261951dc2c0266c59b7c88ba30cff23501661447cc445e42798bcb9a926fa3d588a1603f348fa50d8dcf2bf5a75a33b26895ba359f48454a5b36af4e21c064666eba01eb6fea7121530fc0c9cb28c9d5bf9bdfd58cc95a7b840bb01ffb6e7a738580a797a1f541e6a317dae554e12c57f9921b8fe29776a02f248a46759ddfbea5bd280be81de619915769bd5d2ffdb76a58b710079152a93aac4bc47ed006828744d06421133c95e384e30f284f28c984e9f843dbe3fa5294ee6c06e3a5c9a13e90d3e7f821da17cbb20bbbad5aadcdaa6846fa5149b606526beb0a8138a40c030e346bbaf8874b3e170f834da184488b46e99589acc564a1fefc597c45c4d0a611b709cb9fef5471ae733c64644a32901c6e19765e0e48727d29c178166338382aed4452dfaf4752b8e709177e433199b22700d11531d1f4fc8b44529e14da51131125ee14298a490d35d49c93d1bf65dd1643b332f10766107690d9adac3042603684ce28707e1327a8b3651a633ee1b502457663e48560fefe88b34e320b3b7aa4ab8eb5702dd07e72ef81307fc0de90c4d4ba4659739345fc2a2e26b1edbb442c99f849e95fb71bf5b0330f66a09a0acae13d2da8140e5132d304f6a1b0e7afdc4c1ce4e28d3ee9e075b1358e86bd8f4650b739f667c76bb0cb17d194f73de7013072d73da11f8b9858624ecfbd01e94c41857e49ca3582bc0a8a23041ee31e474ebf9885fe1b53277042343f580e356979c5b7db7e0fe8386ec1c10f8cc073cfc8f79ba991c098945c838dbad2acdb2dc2cdb01b8f3d7a6629c8a39f547d34001621d70757aee615acca088df9e0130d1036ce412e5f2dbab61f0a27461c85cfa8e04cb135fb46390f3a336814c32efaa7a19e9d89bc7cccd654e9dff5f9c973edb056b08688d8803e69c057d0dd21ef367c95ef167ea215930eb69fb45baacad03fd7d068f926b313a4971e7da49bd9055d3d9a3b3771e35aee9b7a147947f3ba2ebbdeda3e82f901f6ed2ab0807bf23b37a5ee53d1f3165eefa9139df6d693545db852676f9dc5c4431420edec655439985dc8a11dca1e0a3393fa8e498ef56b1390990bed3d31f2a0d136f00db0735ad2ab9696a8701b41bf0d173be7b346eb3ff79cf14ab6b17af31ddf215332ad7fe5e3527fa7affda23c0c8bb55129e890976fc9e96bee9eab37e91309a57cf15b86d6f41215a76ca6df898b6de60cbfbb57e81067151a2bd3b4fc72fcd275321b3f3f23c541341750db7a684bcef6d2104442d879aeb09ba8179b2edff4cb5dc6ee7a9864c299b1751232645ed1c43bcfc5663e2a90bf220d4f3a9b120b7a2c05c4a2f574f9b8441c5847bf58ebe1c1b69010c1a2d73c37ef7473ca11e9d652df04de3527745e08dac67a6736c81a93d0f6c4cb3ffe2bfbd294f2cc37f8d4307736f0d5a5c8439f4035d7245c75b31412cca1e5db360c520b2d45d8afa1882248996dc1064a2901585e37665170d4610c618fc8e2aca156792bc70003ec16cf643f0d27fc33cdb76b526961eb2bfe075cadbe35be1424442c5c5a4e6b3e9b1f8d23072b5ff54999e2f1fa0b2b8bf069cf838979676fbc5bee5e173a5fb883ca848a4eb26a77834f0e486c4eae14d30c0150d4d4945d50e9d38d2dd2d7a68ee5cf9e26ab33546a23ba3086895857e94b97ddbdf042bf20ed77a795b3f8dfe8cd5d676ed9449345052860587454da10ef3b52168b48896f75ce617e2295650c32bb5e181f411d61415a94be1cb86fc1c5bd85f8ee0db8e00fd2e43ea1712e14f2c7c9b1442edbe6ceb6082928d43863ef6023a731fe215b666a0dca8779a53927cc0c5508b5cd64c5c6d4e3044caca37bf5bee9691f730b4d88e5027e7df5613419162b34358a090ff776182b1760db6435804f88083cce2902ca661bb0012216d28119f963e6abdf10feb8312e4bc0213f6db619591e85bf05b5e506dda2259f91d5c9873414cbc1e8bd459140940f5d136c04c2f84a43f26615b82f23ac83c4388da8256ec5a2e82f09145c94c2894e2cbdf0bfa46b7cd2511e7c1b3e3408ba794f3cc39a621fcf0ed5108780a3efb579d548c0de21007c28d3823238e8ab1e8fb55445365cbb2cf864da397c03fab5a6e38e672c800771736316a6ebb3f43b465062f0deb85f69b4631a085ae890d50708ddbbe73e19c0df7f362381dc147df3f6fc8550088717845ba66f19eb9ec3135db28fc294e81befdecfb43216321376f314768e14052ed27e2824c362bbb97412ea1a8723633d3365987eb85d0000d50d2128cd67b6ecab6507940b640769c8a5310e61ed60ad4c8081a2ac89da273de6a291b8ba8aab9919b6b5985655960e8bbb2c3d2387fdafdf7d117826fc310b567a5b6f3ddd4c6ccae"
kat87SigHex = "c772794cf11858a2cb2c4272fe75a3643bdbfe172e4be2cdbf04aa5cb6fbb921cea723a2abf0b870b064cfc7523edc2fa9b35c08afe89d347f4d9500ffa9a3e1ec81d4ad29588edab07ad9b193753fb4741ea01cb09ed777d0cc14dba673a990c14ae2bc59148b991e241f29714dfb69b905693ea9cf0ed19f1ce4bc9970bae62f08ff8111e3df99de4cbb93bf9f452254373d41ef37cda96ecc856389b809cf8f0b6ceaec0c75df2c9ef32e74d168fdc0bdfe5155c5b98fa84d473db34e2eae044bddb6a7eadf275d09eddbe816f8a53e2cc08132ad30b5ec681d5e99dded0b515f1e8c454446fb37be7f7f447a7797d8495582d78d9442f4a1ee70d84578c3b96b47c097818d54be3657b89f983c82bdb5e814ce22721f3361a54955bf5923393ea60be9c548967a3346ff813cc235e44921b18058041e33413f0fb0f0c2fcc2549ecdb55f3dda4a689a324bc1f2bac3da377fb67be864cbb38c5098c230d1dd53f7fe5b48a79c06643fb9bbbd88a701d659cde8a304a0cf46672f443f52489bbdeddb74552608d23aa8ed3f7fff400ef1106b6310241788643bcbf0ebf91de6d68cf9ea479d08e63cc753caad43a1cac4c7a5c81df98668e8ae0e7a00087d2ac744d1e58727378798f3b89fa8ebdce25b0eecd388a8c9a5cd57c56ac43bb93303e28688a5653613bf603bf1b5d8b1647fd1e33d75f63ab21b27625a73087fe76deaea1c9b1caff8348214f33c4e404c927a359efe94d0decfc486c0885439b5ce29f1839eaeba892f7da4917dc9a2a642f7450a26fd0c738e416e599538b34b9581a0e08f02cf2aea1ce9a47bbe3e69e57c9866a6b72577a3f86e00fb0fb1fec327ee2e5a1ff6ed21dad032e6ad67a7fc91b7e06f2976b7c3dd9df7a6773118eafbfa9ea09b22001937463094ed835632ccfa5b9f167780c7700562d4cc48490445a09956b431733044d8567d2410567ce99bcc4f9b3caa2271e80a57a54c4ce60de96bd2767e585802e202946cdba7a013f25ed9d3c5edb6d01d4aeff67fe3a7a55619c1669483117fd9f7183483286b96afd5608f6bfbda733b7f6686e6a735028f1e3eff3fd087276808663620f50508919dfbee8478b8731638460ee730a9b1e97a6149f36e75e305d64f78ebc120608c6eab84814729318120a5d8ca199efee3dd72100bfb5acdfe28dceb9753bb4d86a2e58ab8e66eb77df21dd89da40f7859589979467a8c34c31ccee37e577fba5c97f4132058886be0162c85fb6c3955d5edd80213e16b9d58678df6a5420a70b475b1ab147f76c3f5fa31c193bc47f38fdb123c3dd8a97064d888653d2fe2c9b60b631da6b03560018df0f4050f3267d2c643225a5cb821c55ce74f7e494c9e21378aafa142d370a6a04be036f9a63e73f66534493f6bcab738607a6fb7dde04ddd2667c1e279996a93fc452a413e230397e76680461414d50502b7720de6a0662a2d466fc15372a5260bf886e1412a8487249618fc1ac076084e24cdf924eb915978953e8e4f2842c503989f6b9cadd37e88c12d3f4dfadd377572c0149ee075c708b887108667b35beb3e5d51f9a1fc23585e84babcc1f4035912c9119be9b43df3b8e9c94ecc09c13a86a91b59740ceabcba1618328728d9130e335647499efecd130f46ab17cdd9a6fe2a3bc309418032fc8165130fa946ddbb66ae626c463474cc84fd7b9aeb7f89a14419e0151100f78e3648258451bd9febca893ea425b198b7431f7a3399403e70eed6159bb4035a74ce799adb98e85e6594b5a067595c0694a7a896f7d68b5ec9ecf3607c98177888a9bd4987de7b2daa0b0b9f9aaa310a11ca3abe880c8e1638015dc85ed5e3083d5f765b4729004b21de1aecd60a456d916723d59b0d2eea09b5c6faaabd65bacb6fe04bb98c27ff73ef9b8a8c2c822b74bcc32520bb6f556a1f14dc8f4e7c321ac179b000506ba04f03b4b6a12b431f3646219305c271ae976293970c5e889e359cbd6017e613bb708e40fe8a299706a49f4af60142db3f8e4e7a84a34419413d9f1a66c99b9231cacca61cab579cf37ed986209cc0112e1898c0e1cc34f6c291c88c7bbd0d6373efa6cfe47d556bef9b9f8f62f9e70f4f26eb9cd9872877d96589c33b2a6a8e299069f91b66c3cae594e159bca8bab6c440c579bc0f9f31fb08128950c8cbbf8e90c1333b8ce79ec788cc7e40e77d4c85a343db5c65db191be540d961153fa3a1ea03bae75c34a35e9b4ac0903a4e7a23cd3c3f2f9f0860cd9e70525796b7098a7297cd969eac5d24068cde3e25f64a847c429f658d8e158639feb7621a0e0a61bbfd620c2a44ed8c27fe0ee0b60cf57d8194ca1a3de4aa34a0ec994d917adcc7fe540bec1929a0104e614aa435dc096f063aa45dace8b2fc6b9c078543acc462d1ea5fd82b5fb28d5285813b7718c37127b9eb3947e40d4282de20c4c4f5551eddd9a9e5cf3fdaa3ea4bfd9fe21505b50b77fe0657ad7e450189fa76bbd66ee55d581e83bf5b019571074945244d6590bf2ab246e5be863ebf92e9c881652a24d5778486071db573ff2dce538cffc5c678521b1971f297e4c89b32e3e28f1f911ff079caecefcf193fcc62fde93c6f804cb0c93266486388effc56268f6f6b714bbbed83b78161f7c3eb1091c7bcf2d66a89d2bed56b9b06471a74e7673e3d619545b68ab43b9e335937b1d447df6a044414213d80505f4fdbf52191122698d9ab8e1b0fbc8e3ed443de86bc8b30fd8febdb2c2fdcb8a7e62486b100b0b2403ae57a4c0e34375e55047da9c5da68635521c333f0631d47e62ba3cf7e11ea5fd06d2df729f02b5455dfe2781b3b6f137e8d3c42d14e17fd8ee368fd4a528e0ee58c4816ed696f8ca83139ce560a21023fff34e878f2f75b5368a0dd8f1da786600a16f42b1ee273c8c56b056d34e07283b3e485457a934839c80f7e52a3a327ab9000f6ab3d4ce9dcbe93839428fd623994ff3dac827683847c2855f66d6cfe1900d1d015d3c96727edc1f0a03b59940c3b3a41e5b5d92a920a79bcdbd0280ef916ad6615b5c7931d9c1fde3f722154b2a1226e2461395ffeb73529813331417a0d297baa9603d2eae1b9358e91a70f602157d41a9a2fdc43669954e29466ae366e80ad7439d74bb8076a3b6bedc7b9e6df5ebb000c405528a46aa30f6a24d36b6616d23508a1dc1432d8f98d5a468604584d498cc27217092a9b6ac2881410ff6c9b58e189c40912876de39dde08d1383b6c76b89ce905b35debe01798c661e9494e149f7fe163cee29e4e4030f75ed887bda49b42547e55761064ffe6a5fb25f63e9e6ee7a95e8e25929c1f84036a56d706b5ca7cd0793d9bafc66d32853068a00e2890150622e9326bd0854ba68e6051bc4a0fdbaf176c41d74170a6b8048142b6c613dd4b6d49fe7d601ca79066e369fe41468badff3aeb7a86f14a368db28a1b8b75294ddf361616063fa12c2c19fd0d696c32d377d3b4da007d7248a8699db57a7f05539edc6d0b06e61ac2d488196bf735b6ace5686588728ec432936220b7e2a2c51477fe9682a372a62b23c9eac4fa73fe2314b3791623c338414a383c2f42060d9013472f32f59fe0ef9052755250c1532f28a221800bf39eacef49894bbdbbff9d32fc7330c312363d7adb9bf29538b8928f91635f5f3f465358518022e23a9f2d7904e5320291a04ba83b554de39573c5704b7271580f0f583ea3cc579ad8244bcafad90868ff869e37f205d632487b92a6ee691f4403c4f74c981147c410e8fc1cc5552494174b1e378edd66e0769829449deb163b754a57546942b91bfa81e357fd6b48e33b59a86c841434d5151ce4266a36aac8d3ad5bce4de9ba8b4bda93eee8e61c395e3265e06234530ffb5bd2ef9fad22d62e1357efa1cb39fbcc978af4a8af540fb48f7f3217c6f748d4e717fcb64be8bbd1b3e58e75eea84bc37f8eb048bff283495b1d571a531765dbbc785268fa8a6ebac65f492d83af1cbd6c28ce16af877862529c78e92466d76930e5cfade31922f0b65a8643418422a0bed3bc72fe47a945f56007b6717f9d8d0f72c53616b3e0f27087bfc15405463079813df9a95c8239bfa0c3295e8c8e1652ef2cf936cdf14b101f7b6ec0074786625f5fead05e0a310934233455f9622432b4b077a9b549915b99bb88587f49d8cd72cba23eb0da367ec192dc1b9e800ed9dff7112b85c2f938e357df0615d1380703f07b1b962b51664e84ff45dda99b93ae361b76200c69af57a4c5156f711659e68791cf8b2600577243b8650974cb995b15c3343fbb52e88de74038e8416698a04ec432b2fadb05031d916f1d275051e8a238a93351d2e541f50790ea8627fa0305bcce096ab8e1dc7724ad6f98bf905562692db6ff6db47fecd2914ffbe56899850e34e1e88db20ace33c9d87d6e0873fbd2de6efce73c2ac2ca1c7eb00310c8ad06fc03f43253ab1656971215112d9e4dc1df386400e52be1594b5366ec2197eca788f817fd7b525c5aa0cf7eace6f82fe44a3a3a1288fe8cf4f5d4b5d5fa657bfdff4d4cf889be28d2687325400e100b6a795c8a05aaa212ad973b1bc04535b46230268716742ec9c32e3779eebe44972e0b4867c20359b33bbd8b0f0c7b4fe692ebf0cf9e881d72356b1125e67cd7be9a3a7d883258ca3ed05783d9c212d7efe4088ef01400999baad739d633cd33d5711b3ecc2d9903cfaf9448deb6a5abdb4b9a4ab12b0613254cb1d5955dabb276bf9012f7eadd941d1a4323475a571d14f3b68fd524e2c88aad418033b57c661d99780e4caf1c7cd27193b6e95c5e38cb4872f53a616a7735b1eab7b9594364875cd827d14993f0585f589caadffde1551f124b4e14fd9fad40627b8f565d1b1b3b9462f74bef3ac500194d78bcad51b4e86077902e4d30afe7b93b009ba18f180668db49a4ec9135ec04532669ce6526bc6dd188b104e258c5e3cec2770e24de24657766fb2cf80ba3482b8726ba241fd8d3f50837d9de8c0110f3611c1a59ad8c910f891456488d65f65191acfa0f22b9c84de4f35271b052d09fa33530b8e8fdf185d97ffa977796424e03585f1e806c8e8053d3e8b1e21e355085e786e4c6468b64e20769cb87fb85276577cb523bf251f271acd2e3d24bed98ff9d4993bf19c429b85db4d7afe0a45f018b5c47f2a58db6e1553be57b9bc92553d274c2dfe888336b325be45c973bb7b419a491ab6898c7eed24f805d538d6d7459ebe3367940368d637973d9089d512298ab2ebecac149f0a85e240330a5f30b2eb7c67e1e60a84bd6a63d4b5e341eedf11eb97864604469f4880cceee5f1380a1c1b22e9dccd1f7774844dd4940144fb020adf4d313d1b79b6975f3c97169cbe7c8aa7b5433ebfd35d2cde43e80c5211f55f41cd7d81451993bedebf572297e659101d76c32c88324ab445f6656429f99ca9ca4ba04c62c6d1dca85feca3c121db237ae900b7cdbf55aedff0e5d54e3b056f514a52ce0f7ac9ec9bf5e0967c5840d96e261a0cd012c386fcd0881fd9f32d9eb4755f3e0ada6b6c769305db97abe1632d0ce6f0057f82a79527f54e12549de219dcb21ff78e5bca10cbb0ba8d7c74d05f73c9a39d6d51fc6282ac64addbdd22501d5b07653f62b232918ceee58f1566b08f8cea42e45f507a6aa21e07c276a466db346b4bf78bca3c57555b9a531964435f95285aa209066d0d92de58030a5dce2d77792fdef67f74d5059352d62a0b1fd46934f98aa196db785df5e26b9a0c43cd765524f3a354c0ccc4e557075e1bbe5b2c0555884ffcdf0c88fecc8c657ea4102237cfc13b756b90a3423dd1c90a43c5dab8b1d7ef4df8094d4c65e98b50b2528884e199e27b83aeb8d9e832d2e9624060b83ce72e7e14c43d0b72330d75a126a3506815451d9b6c78c37ba72bd4257055507cbe7a03f6f802cc5cf3e315cd165f5d79878f0efb8ee292527198608fe5c6abdda04ce6bff89b3a5f66a0338b84233965cdd09a2a26f7332699b9313fda8173b7262e17e4cab8e01af5519bebf04420eea84b95a915892a1f66090ea4cc8af12f754626ffe87bec50b0d183f6bddbc6a9fd61934bd0252f42973e9cc4ac9e5b3449d62b8ed82e1594e80f9b947ebdd1c9f2cfc408835117244c2d8787da9b3fa7fae1142ae4f18eb99a5f5d6e5103135290083291519dcd22d56e33c93cb9dd1b81797add522d5ab7d043df0394debfdf4a34d6f87c3bd7dd9ad76115a9f0e257d9b27301d8640349c5d045c72e5f806160f5662a96e84f9ee40da7f1067cacde96df20bf055c573723f20d7d4e38ba7135d96346e92b30dd8752de8a7afefca973cdfa2080b2b17bd2281fe64d979d41b9b36804f5441547886e952b9fb636dfbf6a8bc9259893ff4b2857b908949f3c983e24a674db64f238094cbd1d6f60a1f54d2f314d8fc182b616c7795a7083d446971ddfd157684b2032b60889ca7b2c7d1dee9074d50687c96b6dee4eafd0000000000000000000000000000000000000000070c0f161d212c37"
kat87ForeignSigHex = "bd7c4cce541031d9c32f3b8edc4083835e797ff9069cd31a601ad0243dbf634a22d9fb4ceae41b0cce3bfa29417624c4862bd67e766d5b5f46d497373267cc0a5f3acbe209f40112e95632853ba7dc01d3910b298af4f9aad0974231bd8095e9e4dc43959f4fe7b8784d76b614c949438ee78af8466cb41c1201e372d7e4cc3faa46553407185dacddea090b7332d573616381cfebd84ad1e59b58a1ced8627dad36bcb970d35221c26a64660598f7a9f648c135a6299ec3f9eec73b06c3a51d4d091afa02a261b55049afbaa2b0afa8aee81b65e2973f168129c2591f22c6c825f434a5326af7af8235d62f203ed940a8499edabee0a3aa8cf88d887f15d55edfee76ceb790c86216741fe09cff7f70258fdef10069fc7943c8d7ae5aea057ccafb6ceac1ac5c2c063655041341f56db70ae36d71a05559f02de055089ff2d6e5951c4137aab881ab8667411a93ff30141150a205b67e49a0cd3e0c6d194a83b3a0b55ba7adc7080563e33ea2f6ceb811375bfb5c69ffd41ba3eaeae03cbd956bdbaf7adc202bb51664ff52dbda581f192fe508f27f7445528539087ce40029497cd23971d45f39d017582fa29bed39847805943dd987e1f56e9ccecef389818fa9246575cf720e01ddf5790ee85da208285ac30081ac03273889915305c97f4de7137ea9ca4e7e3cc8e033f5a9887e4c620139f2a4ff31ed10538d784aa7114c1fc450b6420edb9a740718651d7a1f35bc23c086cf9551a4a504caf57dab8e4e85143a6ed742ee26a356ed17eb51e1bc7ff4c3f8a30b2495ce909155fa7d2be999e69c29c9039aed950b699d44d2cd2701f60e4dde3d553b5c1d7c9d747eb9ff2c6d1d5f37c3af42d122578292ddd217ccea2a5fa182981bfbe5eb22ce8271cfc116b9743b9a03511dd9e5b1b6238952c1e87efbbcda35ae7d06dfc8537b7f0ca206865c30f3e56709e52841fd9bf28e7cebda93efe8ec0028e41b574a4a0b98394fac0e8591b56694b3655730233f9c3eab2b8076834ac388fa72acf37cbe8b353ffbc4cbfb0ad821a22a75bf30c68fbbadce42fee8673f11d0fe6b481b56b5d6ccb8ad2b6a3fac35f5d025c11f0203fba6357cdd5b8f27629fd2264fd5268ec2f6b72fbe2d1bb869a87fe3caa7354bb2cdf436f87dc0c76ca40f04db924770041ea9778158401d60c0a247ddb2dcb6f90b2d954619d8e5d16dffe8264cb2c012b4f875152b926c8405ad749f50e6387dc89f25b1380ba3d7ce3bd1192535cfc3ded634f24800fd3a6c3641c9fc61d804f704d57fdc6224432cb2570a406aa5a7ce711a1b50e7a11d06ef8a5cf750e6712239354d5f355f47dd70409049ae423fc9138626adadc26da7921e738690b65694507e22579b72f2c32fe3d324aebbcb5081935bbf965ddf82e13a71ec2ac071067fcbc9f5b298a3d98fb2828c6e5b0ba1ed89670b2e5bb4f0ce4161433feac9da826f95f521be9deb7c6248eda04d4276757796a78ac678216214362e180e63e9775aca34da557d175d808f96a1ba699a8bf61214c72de013eee4d8d0363029eebb76d001893bf79f19ffe247e030dc88ed8b9d7a6f2f3d2a9111bd6ddbaa14e4c7b88d0228ae724591d6a1d0e463b77deeeb50ee328c2ccd2b65f545ba7efd000b487bfd2b6603aa358bd5934bab99cc5f84f22ac36c0fe8e35617e011d548ce381314220b80402f947b014574602795dd4d924c31c1a0f1cf1e664bd693a560b673e9aa9c628ad984ff57edf1864d24f8c1548db34a6b4ba4ec126b0838517b12e439217261db41a721d0b44abb2395e4d9277405b91dc6545a6275523bbe49f69caea162c988b231e2d62bdd196c76afc0fea68df55101ede12de51ce01ce598b210dfd3931f85403c7ca22cdccbd8fda35262f6e031af8bdccaa9062b6f3cbb3fd3ae4f8f38bc30cb4699c4ce55686c4dfbe813d2a5d8521d0137e57d279e4787755e2c47e1855207a89da2e519fe25558f06b2660acea19ccd26035f7f800893f51e5066fc713f9e217f8e929804b239b70ea2ed6d5a89ee21eeed91a5dd10d1eeb6e9dad4ee19892840d703e1d29e3ca998b016512781f17311e63f55a3c8125c7cd7050da2cd3c64a8a3ba63894874c4f3b6e6a652f4387d0bee06ecd7265469c9d931a34b121e3a4b3eef6cf30c16ab04e104fc80101ba23bed7519ee3e770e9ca1e81311e3dc263704a735379b626244838a89249f244a8808de4843c6e010444cd6939389b0a192a2a8aaa4faa76ae1a54e89e309b1468ca54b1e7eeb46f64184610d70f420156a04ab741aa1751cdab8576184cc1656e22a98cb418312fe84c461685f9559a8f236ad4a529e62ce27e877f9deed4b922fcfa3504ee6282ca51aced54eec9280006918f73bb8c25ee60df04773c4c0a4fcaf0178f35a2a9c7da4164920e5881d030873fd5132c3c555365677a91a3bb9904cd8b7fc5d37a442b2d68bb6c70822e46e1e4e06855cc421ed969ca3ce2431c38a070ce03964bb8a83cea298f0f203ea3570adf9cac4a982f82beda6a3c970221482b83008b8d10f579cd5caaf7b468af4391ad5fe8b8e1fcd24b97f875d63b3b54ab4a84ad1f08c23dcf0a82de0759281ae4a160b052cc48f44c550887c80549eabaf26c9af305f184a580c0908681fd369cebdb11ddba915e9848805642af17de4fd36fa005769982b589607863bae7de2344b785f1f459973ef8fd64ea0b042ce5ab1722d03ce16c4af9778d2660168e97f1064f48b6bf3c6d5b33d5fc246b26b0eea3c57c73a90c4eb5311400d0fe427c1e0da6866bd42fa806b068d7e9e49db4d7a278206ba660ad0eccf021e9ab9ddbddccb3cbc3641319c572764a71b82232605dbb2a2fe27a681cb4ac5bbcd7c20e96b5daedb261da3fca8edb6450e4d45e99b287e21bdc63388acb0f36780e8a4c5bf326b98940a813d0d85d7903b49a7170864956724f823990de5f12302c749b4c09ac80587d26670c381df6fb493f0d1709d14be4bc034a776d54e7f05b48621386f009a765b9c037ac612333ea2023291e545b751b2152be5a1371b3a35bdeba8143633c2be841fe484e484e40c5dcfd79a93624e10f59769fb0d0a507ac69100fed36bb4e6bb4cb8e0edbbe907e60139d8757fffbf0efc6189419e6f6f2d5b9883f1fc310b390ba6b6ea19db1e2184f5936780007fbfb06f42febb9f3102b31d219502f1e920edd54ec9ed1a2af4bff0088ea889514eba539770f1a19fba6380632aef2ad3f074dfbd3a1ef3b12b30f0f37e3944f4f2b9a00fa589d1191778ece55512ea74ccf179d2e0e72e03f3736dfe8c919de60008a4117144207b91737b222d7e6f62e39d3afd56bb5cfe323827f78c8934e51914a30f25735fadbb0f01b7bc8c97c1573dcedeaf985690f80c29f1b6c313750cdfcdfca537c393882aee0e32ec5082dcad29b75c4500edced4e7cfc8febf8ad5478d73915eedd7c6945081e19de43326f28d6ec86244a88c3640bda9c8afeafd142f3081b5e4c9e548e6ac2376df09a828f320c4c27d6087a7ab7f1652560b63759954d88290ddc22f7e55220196f5e61baf87d53800a79c77ec635df45e65e30138d75bd9c705b954e6c4d3dd7f0456529d953d64bdbfcb00616e62efb6a20d459139c62a9141cfd2fe5dfd624009112b93c12e45822d6c2a5c3e45469d8bdef5653bfa959b8a7cc52d8ca75121b5ebb76749195ac734405fdc875b0b60754b321557171427560ced1b6673d301405e0f705dd7659a117123a72ed67bfeb25d16f22e33c09f7d1c97e5bb020547ff4fae1b198f7d06540dcab111b8a8a3819ad917625bd1b7cad4a20cec9d26fd6abe78f68d1a7e2d9d475ee2208c7028f9568c6ad006a647bafd9045aa8c89fac31ed5a2a92db84099d6ae2277806c9fe6a3d19bb906a815d7c826fdd41b9187740741305c0f2778b988b4334dfe5836d4b53d1d80f1f9d0f26f732812b25312b8f00b3fb1331bb5bc6af14981d996b3e2910d6e6aaf2a217b15bc61b69855f3e384c094ecae730e5d5d8dbbe0203fa993b9eebd9b9e4a2bf87d0f26fcee4f0ffe7365fb1975bed6ab4a6f5ec439166e2636d693d16e300b112436afad1d352e0d256458da9c6553472f6a75c4005b142ef0683dc9005c4f0a46299f5404f650815755c221f8088a2f102dfaa534c9ef0f33b51a0f15bdbf47281e01a7d46e3dbc683e53f66bf9e52b8e36129b69ec6e84aa0f8c5e9ad81d45f3b64738d95de43dc8fabfc93f95bce1573066effbc0f8a73e4275f03463af201c1f9e6d5fa99ca5ac31a1dd767b781fa55f74b8f3d555313f1eeb58f09a6124043c3f04863cf3ca7f89945cb12fa36cc0f4fc6f0ffccd8c22b2551744b77b10329309ff8ff89f0ed0ccf9e2a7fd8421b55c065d2a27df1564dc1b45dc4c6b5b60a978578e4f76f8484e8b84662a4ba9ebd5ad01f08be931ded96388afcc183e88daa21fd24ddd8368f984775c21b753cbb8a30f99050e55d2289be7d4be1793c7687ea3367c0f7abc68a86359ebb2a403d32d1ccd9f75175c5cbbf6a7060f01eacdc8ba2739c62e5d8c3d77ff8da1162a3d12f8658bedc8e12cc4c3278efff6a7eb7fe116125f9cd27954ac1d194a1b5c58dc96195c10deea82b2cf03ad1fc6d1e200439925cd1adaa955853178ee96c6dae46e0d820d733138007e75736821d41d3e907b8117e55bba927ae3c01ffeea7b6813867c93219e36652bc7c0e5602296b4f4da17d5777074ea037966dfe3c3add4598b9ebc490958d5a0ad7ca778a912c96748eb91c085fb197a483ddd6f3eb523b79aef738eb8946a8df96bd14e41fac7be799e6a9756144204b3c9a66dff6cdf85b2aa46440210572378c9c2753bbd71857838a7068610bc266ae76c65eb156c92fb96ef74e66d8bbc65260662b0042200ab925633abba98427084dc9e77b534db0d5ad85d907181afc65e0555d77cc3e5d7776f918812d97c9f508f510b3711677123711e13712e0bad9754f22e67897e80015afd90c6f7bf423160d7796e60b98df8e82a7691627dc9516dee8abf4971cce432d2aef389f088d3188052cbf843e499b26c7e61180c15d887380d5b0165036d92ca2ed7ec8ec8157dfdc87b68d0b7d61bd7022f62801ae460a91f68d9d257b4fa7ce22822c5e77ad17604c26a16688f4486a71ce0303cb7b293aef82406f3f93ccc54d81d233a3ee4db9b7fd38a394f4621e097ef52b30ce98090dd3d2dea5dab69c8a1279a572c79aa705389b3bf0a71c2c15daae14c1cd3b6c46d7abd756bc340a4da5b783cdb8132d8995976b9fd49815bd179b4bb0e333b817ed05168cd033bdfab9cf7a69045c86a3a521417accb3bdf668c843f43474522e2a00241bbab0c48d1b00304def92fcc6c23a0281c22fd3c0e8438daa470bd1b379cb329704c40beb7b7689cc08bfcec08de55c81911af886509e05e390fe14411319de6e0f2466206b8a7974551def6f0e768fbfde467e847629d92fec9bda973c54c8b600d75b349849477a48fb40fb99bfb20770ff62fe7385f71712226d64abeaa83e7b027fe93bef2b89a631a4a08a1cb472b03478da1bfaec9a6fb5858379732e3fbba349d339720441cff5a1d31b8b4ea414db5c6b908595cf1f183bdb3e2c0cad109cb5d0f1c7319567ead63e1a3407d3552416a880d2c118dd89ebb53abf6f9b33767907832c05fa7458b03e565d242c4159a8d73aeab282c7f4f7b2cfeaa641a52e32e3d011f384abbcd69faeaac012021876bfe137fe3086ee0b892e848718ac024621b22cb807ec295367400ceb312b0c75267365d2e210196b02264f816b50c2d6212afbc8128402020ea00a8fea38da1a21b46ef6f3644b8e537373bedafde76744c628b4787683e5ce10b1bccbb626274e4d24939c2b0f4675a02b6e811bf004a9795f5b76644ecb028f63f62d255590d264240e444a21f8693f9fcd7853f4485a1564523a6d9de9024f1dd4979511c158935a70b74e3d2b7b13700676ef39f7e6a274279162bfeaf7d65b0efa7288e9ceab803d5c447b42a073a22b70584f985e3897c6d6af2e03cc9300a3fbc98c724bd23ce883a649d700afdcd323fd6f78d1fe02c405a5ee0261f321857a06a11fca2bc2a1cd591a11eeb704ecc8baff27cc40617a764fbe758ae6c780a81603aae4a03140e50d7a89a8783d7b1391e9be78f0b629965c280102082d6f895dd69031ab15a0a393a257ddcb7e0da6d3e51a429a6d8d98a2973dfec996308db4583df72dca425429de333b501848c4d5999a1ffb8da4798f847b05d0c0e2029ac5ead1f19e6baed643b41cd2d8d7d938fe88d7a4ef08ba0aaaca1ebdd3a1b55afae780695f106d6e77fc9b1c414ca8bbacc1e180d32aebc4864d42fb88bed0f72766cec4d794400ddf512343a555a70e2e3e5f0f16970848df00b284e62c1ec090e14193794d9e6f41349567a8fc0051c31b1bacb2e3f4347567db2bac0c6d3f4f95c609cb1bbc7d4d700000000000000000000000b10161f252b3840"
)