/* Ċ Ġ* ĠCopyright Ġ 2 0 2 0 ĠAC IN Q ĠSAS Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġfr . ac in q . bitcoin Ċ Ċ import Ġfr . ac in q . bitcoin . reference . Transaction Tests Common Ċ import Ġfr . ac in q . secp 2 5 6 k 1 . Hex Ċ import Ġfr . ac in q . secp 2 5 6 k 1 . Sec p 2 5 6 k 1 Ċ import Ġorg . kode in . memory . file . open Readable File Ċ import Ġorg . kode in . memory . file . resolve Ċ import Ġorg . kode in . memory . io . readLine Ċ import Ġorg . kode in . memory . use Ċ import Ġkotlin . random . Random Ċ import Ġkotlin . test .* Ċ Ċ class ĠCrypto Tests Common Ġ{ ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` import Ġprivate Ġkeys `() Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġexported Ġfrom Ġthe Ġbitcoin Ġclient Ġrunning Ġin Ġtest net Ġmode ĊĠĠĠĠĠĠĠ Ġval Ġaddress Ġ= Ġ" mh W 1 BQ Dy hb T sn HE u B 1 n 7 y uj 9 V 8 1 T be Rf TY " ĊĠĠĠĠĠĠĠ Ġval ĠprivateKey Ġ= Ġ" c Rp 4 u Un re GM ZN 8 v B 7 n Q FX 6 X WM HU 5 Lc 7 3 H MA h mc DE w H fb g RS 6 6 C qp " ĊĊĠĠĠĠĠĠĠ Ġval Ġ( version , Ġ_) Ġ= ĠBase 5 8 Check . decode ( privateKey ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( Base 5 8 . Prefix . SecretKey Test net , Ġversion ) ĊĠĠĠĠĠĠĠ Ġval Ġ( priv , Ġcompressed ) Ġ= ĠPrivate Key . from Base 5 8 ( privateKey , ĠBase 5 8 . Prefix . SecretKey Test net ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( compressed ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( priv . value , ĠByte Vector 3 2 (" 7 e 3 9 cf 5 fa ec 6 8 8 ce 0 9 6 d 4 0 7 2 6 ec 9 3 2 2 fb 1 f 2 9 ea 7 2 5 4 f 5 4 7 dad 7 8 8 f 9 1 6 0 7 5 3 5 8 7 ")) ĊĠĠĠĠĠĠĠ Ġassert Content Equals ( priv . compress (), ĠHex . decode (" 7 e 3 9 cf 5 fa ec 6 8 8 ce 0 9 6 d 4 0 7 2 6 ec 9 3 2 2 fb 1 f 2 9 ea 7 2 5 4 f 5 4 7 dad 7 8 8 f 9 1 6 0 7 5 3 5 8 7 0 1 ")) ĊĠĠĠĠĠĠĠ Ġval ĠpublicKey Ġ= Ġpriv . publicKey () ĊĠĠĠĠĠĠĠ Ġval Ġcomputed Address Ġ= ĠBase 5 8 Check . encode ( Base 5 8 . Prefix . Pub key Address Test net , ĠpublicKey . hash 1 6 0 ()) ĊĠĠĠĠĠĠĠ ĠassertEquals ( address , Ġcomputed Address ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` toString Ġdoes Ġnot Ġleak Ġprivate Ġkey `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpriv Ġ= ĠPrivate Key . from Hex (" B CF 6 9 F 7 AFF 3 2 7 3 B 8 6 4 F 9 DD 7 6 8 9 6 FACE 8 E 3 D 3 CF 6 9 A 1 3 3 5 8 5 C 8 1 7 7 8 1 6 F 1 4 FC 9 B 5 5 ") ĊĠĠĠĠĠĠĠ ĠassertEquals ("< private _ key >", Ġpriv . toString ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` validate Ġprivate Ġkeys `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġvalid Priv Key Ġ= ĠPrivate Key . from Hex (" B CF 6 9 F 7 AFF 3 2 7 3 B 8 6 4 F 9 DD 7 6 8 9 6 FACE 8 E 3 D 3 CF 6 9 A 1 3 3 5 8 5 C 8 1 7 7 8 1 6 F 1 4 FC 9 B 5 5 ") ĊĠĠĠĠĠĠĠ ĠassertTrue ( valid Priv Key . isValid ()) ĊĠĠĠĠĠĠĠ Ġ// ĠValid Ġprivate Ġkeys Ġmust Ġnot Ġbe Ġ 0 . ĊĠĠĠĠĠĠĠ Ġval Ġzero Priv Key Ġ= ĠPrivate Key . from Hex (" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ") ĊĠĠĠĠĠĠĠ ĠassertFalse ( zero Priv Key . isValid ()) ĊĠĠĠĠĠĠĠ Ġ// ĠValid Ġprivate Ġkeys Ġmust Ġbe Ġstrictly Ġbelow Ġthe Ġcurve Ġorder . ĊĠĠĠĠĠĠĠ Ġval Ġbelow Curve Order Ġ= ĠPrivate Key . from Hex (" FFFFFFFF FFFFFFFF FFFFFFFF FFFFFF FE B AA ED CE 6 AF 4 8 A 0 3 BB FD 2 5 E 8 CD 0 3 6 4 1 4 0 ") ĊĠĠĠĠĠĠĠ ĠassertTrue ( below Curve Order . isValid ()) ĊĠĠĠĠĠĠĠ Ġval Ġcurve Order Ġ= ĠPrivate Key . from Hex (" FFFFFFFF FFFFFFFF FFFFFFFF FFFFFF FE B AA ED CE 6 AF 4 8 A 0 3 BB FD 2 5 E 8 CD 0 3 6 4 1 4 1 ") ĊĠĠĠĠĠĠĠ ĠassertFalse ( curve Order . isValid ()) ĊĠĠĠĠĠĠĠ Ġval Ġabove Curve Order Ġ= ĠPrivate Key . from Hex (" FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF ") ĊĠĠĠĠĠĠĠ ĠassertFalse ( above Curve Order . isValid ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` check Ġgenerator `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcheck Ġ= ĠSec p 2 5 6 k 1 . pubkey Create ( Hex . decode (" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 ")) ĊĠĠĠĠĠĠĠ ĠassertEquals ( PublicKey . Generator , ĠPublicKey . parse ( check )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` generate Ġpublic Ġkeys Ġfrom Ġprivate Ġkeys `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠprivateKey 1 Ġ= ĠPrivate Key . from Hex (" 1 8 E 1 4 A 7 B 6 A 3 0 7 F 4 2 6 A 9 4 F 8 1 1 4 7 0 1 E 7 C 8 E 7 7 4 E 7 F 9 A 4 7 E 2 C 2 0 3 5 DB 2 9 A 2 0 6 3 2 1 7 2 5 ") ĊĠĠĠĠĠĠĠ Ġval ĠpublicKey 1 Ġ= ĠprivateKey 1 . publicKey () ĊĠĠĠĠĠĠĠ ĠassertEquals ( publicKey 1 . value , ĠByte Vector (" 0 2 5 0 8 6 3 ad 6 4 a 8 7 ae 8 a 2 fe 8 3 c 1 af 1 a 8 4 0 3 cb 5 3 f 5 3 e 4 8 6 d 8 5 1 1 dad 8 a 0 4 8 8 7 e 5 b 2 3 5 2 ")) ĊĊĠĠĠĠĠĠĠ Ġval ĠprivateKey 2 Ġ= ĠPrivate Key . from Hex (" B CF 6 9 F 7 AFF 3 2 7 3 B 8 6 4 F 9 DD 7 6 8 9 6 FACE 8 E 3 D 3 CF 6 9 A 1 3 3 5 8 5 C 8 1 7 7 8 1 6 F 1 4 FC 9 B 5 5 ") ĊĠĠĠĠĠĠĠ Ġval ĠpublicKey 2 Ġ= ĠprivateKey 2 . publicKey () ĊĠĠĠĠĠĠĠ ĠassertEquals ( publicKey 2 . value , ĠByte Vector (" 0 3 D 7 E 9 DD 0 C 6 1 8 C 6 5 DC 2 E 3 9 7 2 E 2 AA 4 0 6 CC D 3 4 E 5 E 7 7 8 9 5 C 9 6 DC 4 8 AF 0 CB 1 6 A 1 D 9 B 8 CE ")) ĊĊĠĠĠĠĠĠĠ Ġval Ġaddress Ġ= ĠBase 5 8 Check . encode ( Base 5 8 . Prefix . Pub key Address , ĠCrypto . hash 1 6 0 ( publicKey 2 . to Un compressed Bin ())) ĊĠĠĠĠĠĠĠ ĠassertEquals ( address , Ġ" 1 9 Fg FQ GZ y 4 7 Nc GT J 4 hf Nd GM w S 8 E AT q oa 1 X ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` compress Ġand Ġde compress Ġpublic Ġkeys `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠpublicKey 1 Ġ= ĠPrivate Key . from Hex (" 1 8 E 1 4 A 7 B 6 A 3 0 7 F 4 2 6 A 9 4 F 8 1 1 4 7 0 1 E 7 C 8 E 7 7 4 E 7 F 9 A 4 7 E 2 C 2 0 3 5 DB 2 9 A 2 0 6 3 2 1 7 2 5 "). publicKey () ĊĠĠĠĠĠĠĠ ĠassertTrue ( Crypto . is PubKey Compressed Or Un compressed ( publicKey 1 . value . toByteArray ())) ĊĠĠĠĠĠĠĠ ĠassertTrue ( Crypto . is PubKey Compressed ( publicKey 1 . value . toByteArray ())) ĊĠĠĠĠĠĠĠ ĠassertFalse ( Crypto . is PubKey Un compressed ( publicKey 1 . value . toByteArray ())) ĊĊĠĠĠĠĠĠĠ Ġval Ġun compressed 1 Ġ= ĠpublicKey 1 . to Un compressed Bin () ĊĠĠĠĠĠĠĠ ĠassertTrue ( Crypto . is PubKey Compressed Or Un compressed ( un compressed 1 )) ĊĠĠĠĠĠĠĠ ĠassertFalse ( Crypto . is PubKey Compressed ( un compressed 1 )) ĊĠĠĠĠĠĠĠ ĠassertTrue ( Crypto . is PubKey Un compressed ( un compressed 1 )) ĊĊĠĠĠĠĠĠĠ Ġval Ġcompressed 1 Ġ= ĠPublicKey . compress ( un compressed 1 ) ĊĠĠĠĠĠĠĠ Ġassert Content Equals ( compressed 1 , ĠpublicKey 1 . value . toByteArray ()) ĊĠĠĠĠĠĠĠ ĠassertTrue ( Crypto . is PubKey Compressed Or Un compressed ( compressed 1 )) ĊĠĠĠĠĠĠĠ ĠassertTrue ( Crypto . is PubKey Compressed ( compressed 1 )) ĊĠĠĠĠĠĠĠ ĠassertFalse ( Crypto . is PubKey Un compressed ( compressed 1 )) ĊĊĠĠĠĠĠĠĠ Ġval ĠpublicKey 2 Ġ= ĠPublicKey ( compressed 1 ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( Crypto . is PubKey Compressed Or Un compressed ( publicKey 2 . value . toByteArray ())) ĊĠĠĠĠĠĠĠ ĠassertTrue ( Crypto . is PubKey Compressed ( publicKey 2 . value . toByteArray ())) ĊĠĠĠĠĠĠĠ ĠassertFalse ( Crypto . is PubKey Un compressed ( publicKey 2 . value . toByteArray ())) ĊĠĠĠĠĠĠĠ ĠassertEquals ( publicKey 1 . value , ĠpublicKey 2 . value ) ĊĊĠĠĠĠĠĠĠ Ġassert Fails Ġ{ ĠPublicKey ( un compressed 1 ) Ġ} ĊĠĠĠĠĠĠĠ Ġval ĠpublicKey 3 Ġ= ĠPublicKey . parse ( un compressed 1 ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( Crypto . is PubKey Compressed Or Un compressed ( publicKey 3 . value . toByteArray ())) ĊĠĠĠĠĠĠĠ ĠassertTrue ( Crypto . is PubKey Compressed ( publicKey 3 . value . toByteArray ())) ĊĠĠĠĠĠĠĠ ĠassertFalse ( Crypto . is PubKey Un compressed ( publicKey 3 . value . toByteArray ())) ĊĠĠĠĠĠĠĠ ĠassertEquals ( publicKey 1 . value , ĠpublicKey 3 . value ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` create Ġinvalid Ġpublic Ġkey `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠprivateKey Ġ= ĠPrivate Key . from Hex (" B CF 6 9 F 7 AFF 3 2 7 3 B 8 6 4 F 9 DD 7 6 8 9 6 FACE 8 E 3 D 3 CF 6 9 A 1 3 3 5 8 5 C 8 1 7 7 8 1 6 F 1 4 FC 9 B 5 5 ") ĊĠĠĠĠĠĠĠ Ġval ĠpublicKey Ġ= ĠprivateKey . publicKey () ĊĠĠĠĠĠĠĠ ĠassertTrue ( publicKey . isValid ()) ĊĠĠĠĠĠĠĠ Ġval Ġn PublicKey Ġ= ĠPublicKey . parse ( Sec p 2 5 6 k 1 . pub Key Neg ate ( publicKey . value . toByteArray ())) ĊĠĠĠĠĠĠĠ ĠassertTrue ( n PublicKey . isValid ()) ĊĠĠĠĠĠĠĠ Ġ// ĠThe Ġresult Ġwould Ġbe Ġthe Ġpoint Ġat Ġinfinity , Ġwhich Ġisn 't Ġa Ġvalid Ġcurve Ġpoint . ĊĠĠĠĠĠĠĠ Ġassert Fails Ġ{ ĠpublicKey Ġ- ĠpublicKey Ġ} ĊĠĠĠĠĠĠĠ Ġassert Fails Ġ{ ĠpublicKey Ġ+ Ġn PublicKey Ġ} ĊĠĠĠĠĠĠĠ Ġ// ĠYou Ġcan 't Ġget Ġthe Ġpublic Ġkey Ġfor Ġan Ġinvalid Ġprivate Ġkey . ĊĠĠĠĠĠĠĠ Ġval Ġinvalid PrivateKey Ġ= ĠPrivate Key . from Hex (" FFFFFFFF FFFFFFFF FFFFFFFF FFFFFF FE B AA ED CE 6 AF 4 8 A 0 3 BB FD 2 5 E 8 CD 0 3 6 4 1 4 1 ") ĊĠĠĠĠĠĠĠ Ġassert Fails Ġ{ Ġinvalid PrivateKey . publicKey () Ġ} ĊĠĠĠĠĠĠĠ Ġ// ĠIt Ġis Ġpossible Ġto Ġcreate Ġan Ġinvalid Ġpublic Ġkey , Ġbut Ġyou Ġcan Ġdetect Ġit . ĊĠĠĠĠĠĠĠ Ġval Ġinvalid PublicKey Ġ= ĠPublicKey . from Hex (" 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 ") ĊĠĠĠĠĠĠĠ ĠassertFalse ( invalid PublicKey . isValid ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` sign Ġand Ġverify Ġsignatures `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠprivateKey Ġ= ĠPrivate Key . from Base 5 8 ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" c Rp 4 u Un re GM ZN 8 v B 7 n Q FX 6 X WM HU 5 Lc 7 3 H MA h mc DE w H fb g RS 6 6 C qp ", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBase 5 8 . Prefix . SecretKey Test net ĊĠĠĠĠĠĠĠ Ġ). first ĊĠĠĠĠĠĠĠ Ġval ĠpublicKey Ġ= ĠprivateKey . publicKey () ĊĠĠĠĠĠĠĠ Ġval Ġdata Ġ= ĠCrypto . sha 2 5 6 (" this Ġis Ġa Ġtest ". encode To ByteArray ()) ĊĠĠĠĠĠĠĠ Ġval Ġencoded Ġ= ĠCrypto . sign ( data , ĠprivateKey ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( Byte Vector 6 4 (" fb 3 6 b 3 3 afe 9 3 0 8 f 9 eeb fc db 0 f 5 0 cb 9 c 5 1 c 7 2 e 9 8 a 5 7 8 ee 2 6 cab f 4 a 2 6 b 5 aba 1 fbf 2 4 2 9 e 5 f 5 0 8 1 4 8 8 1 9 0 fb 0 1 c 5 1 6 5 1 8 9 f 2 c 7 0 e 6 1 9 a 3 b 6 6 7 e 6 f 1 e 0 fc 8 6 1 d 5 a 8 a 2 5 d 1 "), Ġencoded ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( Crypto . verify Signature ( data , Ġencoded , ĠpublicKey )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` der Ġto Ġcompact `() Ġ{ ĊĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠByte Vector 6 4 (" 3 f 1 6 c 6 f 4 0 1 6 2 ab 6 8 6 6 2 1 ef 3 0 0 0 b 0 4 e 7 5 4 1 8 a 0 c 0 cb 2 d 8 ae be ac 8 9 4 ae 3 6 0 ac 1 e 7 8 2 2 3 ea 1 3 2 0 3 caf 8 5 3 b 7 1 e 9 7 e 5 cc 1 4 9 f 6 5 5 4 7 d 1 d 7 ab 9 8 c 9 6 3 5 3 d 0 d 8 3 1 8 9 3 4 e 7 7 1 6 "), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCrypto . der 2 compact ( Hex . decode (" 3 0 4 4 0 2 2 0 3 f 1 6 c 6 f 4 0 1 6 2 ab 6 8 6 6 2 1 ef 3 0 0 0 b 0 4 e 7 5 4 1 8 a 0 c 0 cb 2 d 8 ae be ac 8 9 4 ae 3 6 0 ac 1 e 7 8 0 2 2 0 ddc 1 5 ec dfc 3 5 0 7 ac 4 8 e 1 6 8 1 a 3 3 eb 6 0 9 9 6 6 3 1 bf 6 bf 5 bc 0 a 0 6 8 2 c 4 db 7 4 3 ce 7 ca 2 b 0 1 ")) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` generate Ġdeterministic Ġsignatures `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdataset Ġ= Ġsequence Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTrip le ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Sat oshi ĠN ak am oto ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" 3 0 4 5 0 2 2 1 0 0 9 3 4 b 1 ea 1 0 a 4 b 3 c 1 7 5 7 e 2 b 0 c 0 1 7 d 0 b 6 1 4 3 ce 3 c 9 a 7 e 6 a 4 a 4 9 8 6 0 d 7 a 6 ab 2 1 0 ee 3 d 8 0 2 2 0 2 4 4 2 ce 9 d 2 b 9 1 6 0 6 4 1 0 8 0 1 4 7 8 3 e 9 2 3 ec 3 6 b 4 9 7 4 3 e 2 ffa 1 c 4 4 9 6 f 0 1 a 5 1 2 a afd 9 e 5 " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTrip le ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Everything Ġshould Ġbe Ġmade Ġas Ġsimple Ġas Ġpossible , Ġbut Ġnot Ġsimpler .", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" 3 0 4 4 0 2 2 0 3 3 a 6 9 cd 2 0 6 5 4 3 2 a 3 0 f 3 d 1 ce 4 eb 0 d 5 9 b 8 ab 5 8 c 7 4 f 2 7 c 4 1 a 7 fdb 5 6 9 6 ad 4 e 6 1 0 8 c 9 0 2 2 0 6 f 8 0 7 9 8 2 8 6 6 f 7 8 5 d 3 f 6 4 1 8 d 2 4 1 6 3 dd ae 1 1 7 b 7 db 4 d 5 fdf 0 0 7 1 de 0 6 9 fa 5 4 3 4 2 2 6 2 " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTrip le ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" All Ġthose Ġmoment s Ġwill Ġbe Ġlost Ġin Ġtime , Ġlike Ġtear s Ġin Ġrain . ĠTime Ġto Ġdie ...", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" 3 0 4 5 0 2 2 1 0 0 8 6 0 0 dbd 4 1 e 3 4 8 fe 5 c 9 4 6 5 ab 9 2 d 2 3 e 3 db 8 b 9 8 b 8 7 3 be ecd 9 3 0 7 3 6 4 8 8 6 9 6 4 3 8 cb 6 b 0 2 2 0 5 4 7 fe 6 4 4 2 7 4 9 6 db 3 3 bf 6 6 0 1 9 dac bf 0 0 3 9 c 0 4 1 9 9 abb 0 1 2 2 9 1 8 6 0 1 db 3 8 a 7 2 cfc 2 1 " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTrip le ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" FFFFFFFF FFFFFFFF FFFFFFFF FFFFFF FE B AA ED CE 6 AF 4 8 A 0 3 BB FD 2 5 E 8 CD 0 3 6 4 1 4 0 ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Sat oshi ĠN ak am oto ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" 3 0 4 5 0 2 2 1 0 0 fd 5 6 7 d 1 2 1 db 6 6 e 3 8 2 9 9 1 5 3 4 ada 7 7 a 6 bd 3 1 0 6 f 0 a 1 0 9 8 c 2 3 1 e 4 7 9 9 3 4 4 7 cd 6 af 2 d 0 0 2 2 0 6 b 3 9 cd 0 eb 1 bc 8 6 0 3 e 1 5 9 ef 5 c 2 0 a 5 c 8 ad 6 8 5 a 4 5 b 0 6 ce 9 be bed 3 f 1 5 3 d 1 0 d 9 3 bed 5 " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTrip le ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" f 8 b 8 af 8 ce 3 c 7 cca 5 e 3 0 0 d 3 3 9 3 9 5 4 0 c 1 0 d 4 5 ce 0 0 1 b 8 f 2 5 2 bf bc 5 7 ba 0 3 4 2 9 0 4 1 8 1 ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Al an ĠT uring ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" 3 0 4 4 0 2 2 0 7 0 6 3 ae 8 3 e 7 f 6 2 bbb 1 7 1 7 9 8 1 3 1 b 4 a 0 5 6 4 b 9 5 6 9 3 0 0 9 2 b 3 3 b 0 7 b 3 9 5 6 1 5 d 9 ec 7 e 1 5 c 0 2 2 0 5 8 df cc 1 e 0 0 a 3 5 e 1 5 7 2 f 3 6 6 ffe 3 4 ba 0 fc 4 7 db 1 e 7 1 8 9 7 5 9 b 9 fb 2 3 3 c 5 b 0 5 ab 3 8 8 ea " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTrip le ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" e 9 1 6 7 1 c 4 6 2 3 1 f 8 3 3 a 6 4 0 6 cc bea 0 e 3 e 3 9 2 c 7 6 c 1 6 7 bac 1 cb 0 1 3 f 6 f 1 0 1 3 9 8 0 4 5 5 c 2 ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" There Ġis Ġa Ġcomputer Ġdisease Ġthat Ġany body Ġwho Ġworks Ġwith Ġcomputers Ġknows Ġabout . ĠIt 's Ġa Ġvery Ġserious Ġdisease Ġand Ġit Ġinter fer es Ġcompletely Ġwith Ġthe Ġwork . ĠThe Ġtrouble Ġwith Ġcomputers Ġis Ġthat Ġyou Ġ' play ' Ġwith Ġthem !", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" 3 0 4 5 0 2 2 1 0 0 b 5 5 2 edd 2 7 5 8 0 1 4 1 f 3 b 2 a 5 4 6 3 0 4 8 cb 7 cd 3 e 0 4 7 b 9 7 c 9 f 9 8 0 7 6 c 3 2 db df 8 5 a 6 8 7 1 8 b 0 2 2 0 2 7 9 fa 7 2 dd 1 9 b fae 0 5 5 7 7 e 0 6 c 7 c 0 c 1 9 0 0 c 3 7 1 fcd 5 8 9 3 f 7 e 1 d 5 6 a 3 7 d 3 0 1 7 4 6 7 1 f 6 " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġdataset . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( k , Ġm , Ġs ) Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcompact Ġ= ĠCrypto . sign ( Crypto . sha 2 5 6 ( m . encode To ByteArray ()), ĠPrivate Key . from Hex ( k )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsig Ġ= ĠCrypto . compact 2 der ( compact ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( Hex . encode ( sig . toByteArray ()), Ġs ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` ECD H Ġshared Ġsecrets `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠprivateKey Ġ= ĠPrivate Key . from Hex (" B CF 6 9 F 7 AFF 3 2 7 3 B 8 6 4 F 9 DD 7 6 8 9 6 FACE 8 E 3 D 3 CF 6 9 A 1 3 3 5 8 5 C 8 1 7 7 8 1 6 F 1 4 FC 9 B 5 5 ") ĊĠĠĠĠĠĠĠ Ġval ĠpublicKey Ġ= ĠprivateKey . publicKey () ĊĠĠĠĠĠĠĠ Ġval Ġshared Ġ= ĠCrypto . ec dh ( privateKey , ĠpublicKey ) ĊĠĠĠĠĠĠĠ ĠassertEquals (" 5 6 bc 8 4 c ffc 7 db 1 ca 0 4 0 4 6 fc 0 4 ec 8 f 8 4 2 3 2 c 3 4 0 be 7 8 9 bc 4 7 7 9 d 2 2 1 fe 8 b 9 7 8 af 0 6 ", ĠHex . encode ( shared )) ĊĊĠĠĠĠĠĠĠ Ġval Ġrandom Ġ= ĠRandom ĊĠĠĠĠĠĠĠ Ġval ĠprivateKey 1 Ġ= ĠPrivate Key ( random . next Bytes ( 3 2 )) ĊĠĠĠĠĠĠĠ Ġval ĠprivateKey 2 Ġ= ĠPrivate Key ( random . next Bytes ( 3 2 )) ĊĠĠĠĠĠĠĠ Ġval Ġshared 1 Ġ= ĠCrypto . ec dh ( privateKey 1 , ĠprivateKey 2 . publicKey ()) ĊĠĠĠĠĠĠĠ Ġval Ġshared 2 Ġ= ĠCrypto . ec dh ( privateKey 2 , ĠprivateKey 1 . publicKey ()) ĊĠĠĠĠĠĠĠ Ġassert Content Equals ( shared 1 , Ġshared 2 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` DER Ġencoding Ġcompatibility Ġtests `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsig Ġ= ĠByte Vector 6 4 ( ByteArray ( 6 4 ) Ġ{ Ġ 0 xaa . to Byte () Ġ}) ĊĠĠĠĠĠĠĠ Ġval Ġder Ġ= ĠCrypto . compact 2 der ( sig ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( der . size (), Ġ 7 1 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` DER Ġdecoding Ġcompatibility Ġtests `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġder Ġ= ĠHex . decode (" 3 0 4 5 0 2 2 1 0 0 b 5 0 cb dd 8 3 b 1 7 b 7 2 2 b 0 e 1 f 5 8 e 2 1 cf 3 7 8 9 ab 1 8 b 3 6 6 4 8 0 2 3 ed 3 8 1 1 b 5 2 2 3 4 2 dd aa 9 e 0 2 2 0 7 1 8 2 6 7 3 9 6 1 b 7 a 1 0 bfa 9 4 fe 8 9 7 8 0 da 0 d 0 3 bfe 1 de 1 3 7 e 0 be 3 2 cc 4 7 a 5 1 ed caf 0 8 f 3 0 1 ") ĊĠĠĠĠĠĠĠ Ġval Ġsig Ġ= ĠCrypto . der 2 compact ( der ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( sig , ĠByte Vector 6 4 (" b 5 0 cb dd 8 3 b 1 7 b 7 2 2 b 0 e 1 f 5 8 e 2 1 cf 3 7 8 9 ab 1 8 b 3 6 6 4 8 0 2 3 ed 3 8 1 1 b 5 2 2 3 4 2 dd aa 9 e 7 1 8 2 6 7 3 9 6 1 b 7 a 1 0 bfa 9 4 fe 8 9 7 8 0 da 0 d 0 3 bfe 1 de 1 3 7 e 0 be 3 2 cc 4 7 a 5 1 ed caf 0 8 f 3 ")) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` recover Ġpublic Ġkeys Ġfrom Ġsignatures Ġ( random Ġtests )` () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrandom Ġ= ĠRandom ĊĠĠĠĠĠĠĠ Ġval Ġpriv bytes Ġ= ĠByteArray ( 3 2 ) ĊĠĠĠĠĠĠĠ Ġval Ġmessage Ġ= ĠByteArray ( 3 2 ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 1 .. 1 0 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrandom . next Bytes ( priv bytes ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrandom . next Bytes ( message ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpriv Ġ= ĠPrivate Key ( priv bytes ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpub Ġ= Ġpriv . publicKey () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsig Ġ= ĠCrypto . sign ( message , Ġpriv ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( pub 1 , Ġpub 2 ) Ġ= ĠCrypto . recover PublicKey ( sig , Ġmessage ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( Crypto . verify Signature ( message , Ġsig , Ġpub 1 )) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( Crypto . verify Signature ( message , Ġsig , Ġpub 2 )) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( pub Ġ== Ġpub 1 Ġ|| Ġpub Ġ== Ġpub 2 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` recover Ġpublic Ġkeys Ġfrom Ġsignatures Ġ( secp 2 5 6 k 1 Ġtest )` () Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġpriv : ĠPrivate Key ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġvar Ġmessage : ĠByte Vector ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġvar Ġpub : ĠPublicKey ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġvar Ġsig : ĠByte Vector ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġvar Ġrec id : ĠInt ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠTransaction Tests Common . resources Dir (). resolve (" rec id . txt ") ĊĠĠĠĠĠĠĠ Ġfile . open Readable File (). use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġline Ġ= Ġit . readLine () Ġ?: Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalues Ġ= Ġline . split (" Ġ= Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlhs Ġ= Ġvalues [ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrhs Ġ= Ġvalues [ 1 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( lhs ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" priv key " Ġ-> Ġpriv Ġ= ĠPrivate Key ( Byte Vector ( rhs ). toByteArray ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" message " Ġ-> Ġmessage Ġ= ĠByte Vector ( rhs ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" pubkey " Ġ-> Ġpub Ġ= ĠPublicKey ( Byte Vector ( rhs )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" sig " Ġ-> Ġsig Ġ= Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreversed Ġ= ĠByte Vector ( rhs ). take ( 6 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠByte Vector (( reversed . take ( 3 2 ). reversed () Ġ+ Ġreversed . take Right ( 3 2 ). reversed ()). toByteArray ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" rec id " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrec id Ġ= Ġrhs . toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( priv !!. publicKey (), Ġpub ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsig 1 Ġ= ĠCrypto . sign ( message !!. toByteArray (), Ġpriv !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( sig 1 , Ġsig ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpub 1 Ġ= ĠCrypto . recover PublicKey ( sig 1 , Ġmessage !!. toByteArray (), Ġrec id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( pub 1 , Ġpub ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ }