sign_test.go 43 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741
  1. // Copyright (c) 2013-2016 The btcsuite developers
  2. // Use of this source code is governed by an ISC
  3. // license that can be found in the LICENSE file.
  4. package txscript
  5. import (
  6. "bytes"
  7. "fmt"
  8. "testing"
  9. "github.com/pkt-cash/pktd/btcec"
  10. "github.com/pkt-cash/pktd/btcutil"
  11. "github.com/pkt-cash/pktd/btcutil/er"
  12. "github.com/pkt-cash/pktd/chaincfg"
  13. "github.com/pkt-cash/pktd/chaincfg/chainhash"
  14. "github.com/pkt-cash/pktd/txscript/opcode"
  15. "github.com/pkt-cash/pktd/txscript/params"
  16. "github.com/pkt-cash/pktd/wire"
  17. "github.com/pkt-cash/pktd/wire/constants"
  18. )
  19. type addressToKey struct {
  20. key *btcec.PrivateKey
  21. compressed bool
  22. }
  23. func mkGetKey(keys map[string]addressToKey) KeyDB {
  24. if keys == nil {
  25. return KeyClosure(func(addr btcutil.Address) (*btcec.PrivateKey,
  26. bool, er.R) {
  27. return nil, false, er.New("nope")
  28. })
  29. }
  30. return KeyClosure(func(addr btcutil.Address) (*btcec.PrivateKey,
  31. bool, er.R) {
  32. a2k, ok := keys[addr.EncodeAddress()]
  33. if !ok {
  34. return nil, false, er.New("nope")
  35. }
  36. return a2k.key, a2k.compressed, nil
  37. })
  38. }
  39. func mkGetScript(scripts map[string][]byte) ScriptDB {
  40. if scripts == nil {
  41. return ScriptClosure(func(addr btcutil.Address) ([]byte, er.R) {
  42. return nil, er.New("nope")
  43. })
  44. }
  45. return ScriptClosure(func(addr btcutil.Address) ([]byte, er.R) {
  46. script, ok := scripts[addr.EncodeAddress()]
  47. if !ok {
  48. return nil, er.New("nope")
  49. }
  50. return script, nil
  51. })
  52. }
  53. func checkScripts(msg string, tx *wire.MsgTx, idx int, inputAmt int64, sigScript, pkScript []byte) er.R {
  54. tx.TxIn[idx].SignatureScript = sigScript
  55. vm, err := NewEngine(pkScript, tx, idx,
  56. ScriptBip16|ScriptVerifyDERSignatures, nil, nil, inputAmt)
  57. if err != nil {
  58. return er.Errorf("failed to make script engine for %s: %v",
  59. msg, err)
  60. }
  61. err = vm.Execute()
  62. if err != nil {
  63. return er.Errorf("invalid script signature for %s: %v", msg,
  64. err)
  65. }
  66. return nil
  67. }
  68. func signAndCheck(msg string, tx *wire.MsgTx, idx int, inputAmt int64, pkScript []byte,
  69. hashType params.SigHashType, kdb KeyDB, sdb ScriptDB,
  70. previousScript []byte) er.R {
  71. sigScript, err := SignTxOutput(&chaincfg.TestNet3Params, tx, idx,
  72. pkScript, hashType, kdb, sdb, nil)
  73. if err != nil {
  74. return er.Errorf("failed to sign output %s: %v", msg, err)
  75. }
  76. return checkScripts(msg, tx, idx, inputAmt, sigScript, pkScript)
  77. }
  78. func TestSignTxOutput(t *testing.T) {
  79. // make key
  80. // make script based on key.
  81. // sign with magic pixie dust.
  82. hashTypes := []params.SigHashType{
  83. params.SigHashOld, // no longer used but should act like all
  84. params.SigHashAll,
  85. params.SigHashNone,
  86. params.SigHashSingle,
  87. params.SigHashAll | params.SigHashAnyOneCanPay,
  88. params.SigHashNone | params.SigHashAnyOneCanPay,
  89. params.SigHashSingle | params.SigHashAnyOneCanPay,
  90. }
  91. inputAmounts := []int64{5, 10, 15}
  92. tx := &wire.MsgTx{
  93. Version: 1,
  94. TxIn: []*wire.TxIn{
  95. {
  96. PreviousOutPoint: wire.OutPoint{
  97. Hash: chainhash.Hash{},
  98. Index: 0,
  99. },
  100. Sequence: 4294967295,
  101. },
  102. {
  103. PreviousOutPoint: wire.OutPoint{
  104. Hash: chainhash.Hash{},
  105. Index: 1,
  106. },
  107. Sequence: 4294967295,
  108. },
  109. {
  110. PreviousOutPoint: wire.OutPoint{
  111. Hash: chainhash.Hash{},
  112. Index: 2,
  113. },
  114. Sequence: 4294967295,
  115. },
  116. },
  117. TxOut: []*wire.TxOut{
  118. {
  119. Value: 1,
  120. },
  121. {
  122. Value: 2,
  123. },
  124. {
  125. Value: 3,
  126. },
  127. },
  128. LockTime: 0,
  129. }
  130. // Pay to Pubkey Hash (uncompressed)
  131. for _, hashType := range hashTypes {
  132. for i := range tx.TxIn {
  133. msg := fmt.Sprintf("%d:%d", hashType, i)
  134. key, err := btcec.NewPrivateKey(btcec.S256())
  135. if err != nil {
  136. t.Errorf("failed to make privKey for %s: %v",
  137. msg, err)
  138. break
  139. }
  140. pk := (*btcec.PublicKey)(&key.PublicKey).
  141. SerializeUncompressed()
  142. address, err := btcutil.NewAddressPubKeyHash(
  143. btcutil.Hash160(pk), &chaincfg.TestNet3Params)
  144. if err != nil {
  145. t.Errorf("failed to make address for %s: %v",
  146. msg, err)
  147. break
  148. }
  149. pkScript, err := PayToAddrScript(address)
  150. if err != nil {
  151. t.Errorf("failed to make pkscript "+
  152. "for %s: %v", msg, err)
  153. }
  154. if err := signAndCheck(msg, tx, i, inputAmounts[i], pkScript, hashType,
  155. mkGetKey(map[string]addressToKey{
  156. address.EncodeAddress(): {key, false},
  157. }), mkGetScript(nil), nil); err != nil {
  158. t.Error(err)
  159. break
  160. }
  161. }
  162. }
  163. // Pay to Pubkey Hash (uncompressed) (merging with correct)
  164. for _, hashType := range hashTypes {
  165. for i := range tx.TxIn {
  166. msg := fmt.Sprintf("%d:%d", hashType, i)
  167. key, err := btcec.NewPrivateKey(btcec.S256())
  168. if err != nil {
  169. t.Errorf("failed to make privKey for %s: %v",
  170. msg, err)
  171. break
  172. }
  173. pk := (*btcec.PublicKey)(&key.PublicKey).
  174. SerializeUncompressed()
  175. address, err := btcutil.NewAddressPubKeyHash(
  176. btcutil.Hash160(pk), &chaincfg.TestNet3Params)
  177. if err != nil {
  178. t.Errorf("failed to make address for %s: %v",
  179. msg, err)
  180. break
  181. }
  182. pkScript, err := PayToAddrScript(address)
  183. if err != nil {
  184. t.Errorf("failed to make pkscript "+
  185. "for %s: %v", msg, err)
  186. }
  187. sigScript, err := SignTxOutput(&chaincfg.TestNet3Params,
  188. tx, i, pkScript, hashType,
  189. mkGetKey(map[string]addressToKey{
  190. address.EncodeAddress(): {key, false},
  191. }), mkGetScript(nil), nil)
  192. if err != nil {
  193. t.Errorf("failed to sign output %s: %v", msg,
  194. err)
  195. break
  196. }
  197. // by the above loop, this should be valid, now sign
  198. // again and merge.
  199. sigScript, err = SignTxOutput(&chaincfg.TestNet3Params,
  200. tx, i, pkScript, hashType,
  201. mkGetKey(map[string]addressToKey{
  202. address.EncodeAddress(): {key, false},
  203. }), mkGetScript(nil), sigScript)
  204. if err != nil {
  205. t.Errorf("failed to sign output %s a "+
  206. "second time: %v", msg, err)
  207. break
  208. }
  209. err = checkScripts(msg, tx, i, inputAmounts[i], sigScript, pkScript)
  210. if err != nil {
  211. t.Errorf("twice signed script invalid for "+
  212. "%s: %v", msg, err)
  213. break
  214. }
  215. }
  216. }
  217. // Pay to Pubkey Hash (compressed)
  218. for _, hashType := range hashTypes {
  219. for i := range tx.TxIn {
  220. msg := fmt.Sprintf("%d:%d", hashType, i)
  221. key, err := btcec.NewPrivateKey(btcec.S256())
  222. if err != nil {
  223. t.Errorf("failed to make privKey for %s: %v",
  224. msg, err)
  225. break
  226. }
  227. pk := (*btcec.PublicKey)(&key.PublicKey).
  228. SerializeCompressed()
  229. address, err := btcutil.NewAddressPubKeyHash(
  230. btcutil.Hash160(pk), &chaincfg.TestNet3Params)
  231. if err != nil {
  232. t.Errorf("failed to make address for %s: %v",
  233. msg, err)
  234. break
  235. }
  236. pkScript, err := PayToAddrScript(address)
  237. if err != nil {
  238. t.Errorf("failed to make pkscript "+
  239. "for %s: %v", msg, err)
  240. }
  241. if err := signAndCheck(msg, tx, i, inputAmounts[i],
  242. pkScript, hashType,
  243. mkGetKey(map[string]addressToKey{
  244. address.EncodeAddress(): {key, true},
  245. }), mkGetScript(nil), nil); err != nil {
  246. t.Error(err)
  247. break
  248. }
  249. }
  250. }
  251. // Pay to Pubkey Hash (compressed) with duplicate merge
  252. for _, hashType := range hashTypes {
  253. for i := range tx.TxIn {
  254. msg := fmt.Sprintf("%d:%d", hashType, i)
  255. key, err := btcec.NewPrivateKey(btcec.S256())
  256. if err != nil {
  257. t.Errorf("failed to make privKey for %s: %v",
  258. msg, err)
  259. break
  260. }
  261. pk := (*btcec.PublicKey)(&key.PublicKey).
  262. SerializeCompressed()
  263. address, err := btcutil.NewAddressPubKeyHash(
  264. btcutil.Hash160(pk), &chaincfg.TestNet3Params)
  265. if err != nil {
  266. t.Errorf("failed to make address for %s: %v",
  267. msg, err)
  268. break
  269. }
  270. pkScript, err := PayToAddrScript(address)
  271. if err != nil {
  272. t.Errorf("failed to make pkscript "+
  273. "for %s: %v", msg, err)
  274. }
  275. sigScript, err := SignTxOutput(&chaincfg.TestNet3Params,
  276. tx, i, pkScript, hashType,
  277. mkGetKey(map[string]addressToKey{
  278. address.EncodeAddress(): {key, true},
  279. }), mkGetScript(nil), nil)
  280. if err != nil {
  281. t.Errorf("failed to sign output %s: %v", msg,
  282. err)
  283. break
  284. }
  285. // by the above loop, this should be valid, now sign
  286. // again and merge.
  287. sigScript, err = SignTxOutput(&chaincfg.TestNet3Params,
  288. tx, i, pkScript, hashType,
  289. mkGetKey(map[string]addressToKey{
  290. address.EncodeAddress(): {key, true},
  291. }), mkGetScript(nil), sigScript)
  292. if err != nil {
  293. t.Errorf("failed to sign output %s a "+
  294. "second time: %v", msg, err)
  295. break
  296. }
  297. err = checkScripts(msg, tx, i, inputAmounts[i],
  298. sigScript, pkScript)
  299. if err != nil {
  300. t.Errorf("twice signed script invalid for "+
  301. "%s: %v", msg, err)
  302. break
  303. }
  304. }
  305. }
  306. // Pay to PubKey (uncompressed)
  307. for _, hashType := range hashTypes {
  308. for i := range tx.TxIn {
  309. msg := fmt.Sprintf("%d:%d", hashType, i)
  310. key, err := btcec.NewPrivateKey(btcec.S256())
  311. if err != nil {
  312. t.Errorf("failed to make privKey for %s: %v",
  313. msg, err)
  314. break
  315. }
  316. pk := (*btcec.PublicKey)(&key.PublicKey).
  317. SerializeUncompressed()
  318. address, err := btcutil.NewAddressPubKey(pk,
  319. &chaincfg.TestNet3Params)
  320. if err != nil {
  321. t.Errorf("failed to make address for %s: %v",
  322. msg, err)
  323. break
  324. }
  325. pkScript, err := PayToAddrScript(address)
  326. if err != nil {
  327. t.Errorf("failed to make pkscript "+
  328. "for %s: %v", msg, err)
  329. }
  330. if err := signAndCheck(msg, tx, i, inputAmounts[i],
  331. pkScript, hashType,
  332. mkGetKey(map[string]addressToKey{
  333. address.EncodeAddress(): {key, false},
  334. }), mkGetScript(nil), nil); err != nil {
  335. t.Error(err)
  336. break
  337. }
  338. }
  339. }
  340. // Pay to PubKey (uncompressed)
  341. for _, hashType := range hashTypes {
  342. for i := range tx.TxIn {
  343. msg := fmt.Sprintf("%d:%d", hashType, i)
  344. key, err := btcec.NewPrivateKey(btcec.S256())
  345. if err != nil {
  346. t.Errorf("failed to make privKey for %s: %v",
  347. msg, err)
  348. break
  349. }
  350. pk := (*btcec.PublicKey)(&key.PublicKey).
  351. SerializeUncompressed()
  352. address, err := btcutil.NewAddressPubKey(pk,
  353. &chaincfg.TestNet3Params)
  354. if err != nil {
  355. t.Errorf("failed to make address for %s: %v",
  356. msg, err)
  357. break
  358. }
  359. pkScript, err := PayToAddrScript(address)
  360. if err != nil {
  361. t.Errorf("failed to make pkscript "+
  362. "for %s: %v", msg, err)
  363. }
  364. sigScript, err := SignTxOutput(&chaincfg.TestNet3Params,
  365. tx, i, pkScript, hashType,
  366. mkGetKey(map[string]addressToKey{
  367. address.EncodeAddress(): {key, false},
  368. }), mkGetScript(nil), nil)
  369. if err != nil {
  370. t.Errorf("failed to sign output %s: %v", msg,
  371. err)
  372. break
  373. }
  374. // by the above loop, this should be valid, now sign
  375. // again and merge.
  376. sigScript, err = SignTxOutput(&chaincfg.TestNet3Params,
  377. tx, i, pkScript, hashType,
  378. mkGetKey(map[string]addressToKey{
  379. address.EncodeAddress(): {key, false},
  380. }), mkGetScript(nil), sigScript)
  381. if err != nil {
  382. t.Errorf("failed to sign output %s a "+
  383. "second time: %v", msg, err)
  384. break
  385. }
  386. err = checkScripts(msg, tx, i, inputAmounts[i], sigScript, pkScript)
  387. if err != nil {
  388. t.Errorf("twice signed script invalid for "+
  389. "%s: %v", msg, err)
  390. break
  391. }
  392. }
  393. }
  394. // Pay to PubKey (compressed)
  395. for _, hashType := range hashTypes {
  396. for i := range tx.TxIn {
  397. msg := fmt.Sprintf("%d:%d", hashType, i)
  398. key, err := btcec.NewPrivateKey(btcec.S256())
  399. if err != nil {
  400. t.Errorf("failed to make privKey for %s: %v",
  401. msg, err)
  402. break
  403. }
  404. pk := (*btcec.PublicKey)(&key.PublicKey).
  405. SerializeCompressed()
  406. address, err := btcutil.NewAddressPubKey(pk,
  407. &chaincfg.TestNet3Params)
  408. if err != nil {
  409. t.Errorf("failed to make address for %s: %v",
  410. msg, err)
  411. break
  412. }
  413. pkScript, err := PayToAddrScript(address)
  414. if err != nil {
  415. t.Errorf("failed to make pkscript "+
  416. "for %s: %v", msg, err)
  417. }
  418. if err := signAndCheck(msg, tx, i, inputAmounts[i],
  419. pkScript, hashType,
  420. mkGetKey(map[string]addressToKey{
  421. address.EncodeAddress(): {key, true},
  422. }), mkGetScript(nil), nil); err != nil {
  423. t.Error(err)
  424. break
  425. }
  426. }
  427. }
  428. // Pay to PubKey (compressed) with duplicate merge
  429. for _, hashType := range hashTypes {
  430. for i := range tx.TxIn {
  431. msg := fmt.Sprintf("%d:%d", hashType, i)
  432. key, err := btcec.NewPrivateKey(btcec.S256())
  433. if err != nil {
  434. t.Errorf("failed to make privKey for %s: %v",
  435. msg, err)
  436. break
  437. }
  438. pk := (*btcec.PublicKey)(&key.PublicKey).
  439. SerializeCompressed()
  440. address, err := btcutil.NewAddressPubKey(pk,
  441. &chaincfg.TestNet3Params)
  442. if err != nil {
  443. t.Errorf("failed to make address for %s: %v",
  444. msg, err)
  445. break
  446. }
  447. pkScript, err := PayToAddrScript(address)
  448. if err != nil {
  449. t.Errorf("failed to make pkscript "+
  450. "for %s: %v", msg, err)
  451. }
  452. sigScript, err := SignTxOutput(&chaincfg.TestNet3Params,
  453. tx, i, pkScript, hashType,
  454. mkGetKey(map[string]addressToKey{
  455. address.EncodeAddress(): {key, true},
  456. }), mkGetScript(nil), nil)
  457. if err != nil {
  458. t.Errorf("failed to sign output %s: %v", msg,
  459. err)
  460. break
  461. }
  462. // by the above loop, this should be valid, now sign
  463. // again and merge.
  464. sigScript, err = SignTxOutput(&chaincfg.TestNet3Params,
  465. tx, i, pkScript, hashType,
  466. mkGetKey(map[string]addressToKey{
  467. address.EncodeAddress(): {key, true},
  468. }), mkGetScript(nil), sigScript)
  469. if err != nil {
  470. t.Errorf("failed to sign output %s a "+
  471. "second time: %v", msg, err)
  472. break
  473. }
  474. err = checkScripts(msg, tx, i, inputAmounts[i],
  475. sigScript, pkScript)
  476. if err != nil {
  477. t.Errorf("twice signed script invalid for "+
  478. "%s: %v", msg, err)
  479. break
  480. }
  481. }
  482. }
  483. // As before, but with p2sh now.
  484. // Pay to Pubkey Hash (uncompressed)
  485. for _, hashType := range hashTypes {
  486. for i := range tx.TxIn {
  487. msg := fmt.Sprintf("%d:%d", hashType, i)
  488. key, err := btcec.NewPrivateKey(btcec.S256())
  489. if err != nil {
  490. t.Errorf("failed to make privKey for %s: %v",
  491. msg, err)
  492. break
  493. }
  494. pk := (*btcec.PublicKey)(&key.PublicKey).
  495. SerializeUncompressed()
  496. address, err := btcutil.NewAddressPubKeyHash(
  497. btcutil.Hash160(pk), &chaincfg.TestNet3Params)
  498. if err != nil {
  499. t.Errorf("failed to make address for %s: %v",
  500. msg, err)
  501. break
  502. }
  503. pkScript, err := PayToAddrScript(address)
  504. if err != nil {
  505. t.Errorf("failed to make pkscript "+
  506. "for %s: %v", msg, err)
  507. break
  508. }
  509. scriptAddr, err := btcutil.NewAddressScriptHash(
  510. pkScript, &chaincfg.TestNet3Params)
  511. if err != nil {
  512. t.Errorf("failed to make p2sh addr for %s: %v",
  513. msg, err)
  514. break
  515. }
  516. scriptPkScript, err := PayToAddrScript(
  517. scriptAddr)
  518. if err != nil {
  519. t.Errorf("failed to make script pkscript for "+
  520. "%s: %v", msg, err)
  521. break
  522. }
  523. if err := signAndCheck(msg, tx, i, inputAmounts[i],
  524. scriptPkScript, hashType,
  525. mkGetKey(map[string]addressToKey{
  526. address.EncodeAddress(): {key, false},
  527. }), mkGetScript(map[string][]byte{
  528. scriptAddr.EncodeAddress(): pkScript,
  529. }), nil); err != nil {
  530. t.Error(err)
  531. break
  532. }
  533. }
  534. }
  535. // Pay to Pubkey Hash (uncompressed) with duplicate merge
  536. for _, hashType := range hashTypes {
  537. for i := range tx.TxIn {
  538. msg := fmt.Sprintf("%d:%d", hashType, i)
  539. key, err := btcec.NewPrivateKey(btcec.S256())
  540. if err != nil {
  541. t.Errorf("failed to make privKey for %s: %v",
  542. msg, err)
  543. break
  544. }
  545. pk := (*btcec.PublicKey)(&key.PublicKey).
  546. SerializeUncompressed()
  547. address, err := btcutil.NewAddressPubKeyHash(
  548. btcutil.Hash160(pk), &chaincfg.TestNet3Params)
  549. if err != nil {
  550. t.Errorf("failed to make address for %s: %v",
  551. msg, err)
  552. break
  553. }
  554. pkScript, err := PayToAddrScript(address)
  555. if err != nil {
  556. t.Errorf("failed to make pkscript "+
  557. "for %s: %v", msg, err)
  558. break
  559. }
  560. scriptAddr, err := btcutil.NewAddressScriptHash(
  561. pkScript, &chaincfg.TestNet3Params)
  562. if err != nil {
  563. t.Errorf("failed to make p2sh addr for %s: %v",
  564. msg, err)
  565. break
  566. }
  567. scriptPkScript, err := PayToAddrScript(
  568. scriptAddr)
  569. if err != nil {
  570. t.Errorf("failed to make script pkscript for "+
  571. "%s: %v", msg, err)
  572. break
  573. }
  574. sigScript0, err := SignTxOutput(&chaincfg.TestNet3Params,
  575. tx, i, scriptPkScript, hashType,
  576. mkGetKey(map[string]addressToKey{
  577. address.EncodeAddress(): {key, false},
  578. }), mkGetScript(map[string][]byte{
  579. scriptAddr.EncodeAddress(): pkScript,
  580. }), nil)
  581. if err != nil {
  582. t.Errorf("failed to sign output %s: %v", msg,
  583. err)
  584. break
  585. }
  586. // by the above loop, this should be valid, now sign
  587. // again and merge.
  588. sigScript, err := SignTxOutput(&chaincfg.TestNet3Params,
  589. tx, i, scriptPkScript, hashType,
  590. mkGetKey(map[string]addressToKey{
  591. address.EncodeAddress(): {key, false},
  592. }), mkGetScript(map[string][]byte{
  593. scriptAddr.EncodeAddress(): pkScript,
  594. }), nil)
  595. if err != nil {
  596. t.Errorf("failed to sign output %s a "+
  597. "second time: %v", msg, err)
  598. break
  599. }
  600. if !bytes.Equal(sigScript0, sigScript) {
  601. t.Errorf("sigscripts did not match after signing twice")
  602. break
  603. }
  604. err = checkScripts(msg, tx, i, inputAmounts[i],
  605. sigScript, scriptPkScript)
  606. if err != nil {
  607. t.Errorf("twice signed script invalid for "+
  608. "%s: %v", msg, err)
  609. break
  610. }
  611. }
  612. }
  613. // Pay to Pubkey Hash (compressed)
  614. for _, hashType := range hashTypes {
  615. for i := range tx.TxIn {
  616. msg := fmt.Sprintf("%d:%d", hashType, i)
  617. key, err := btcec.NewPrivateKey(btcec.S256())
  618. if err != nil {
  619. t.Errorf("failed to make privKey for %s: %v",
  620. msg, err)
  621. break
  622. }
  623. pk := (*btcec.PublicKey)(&key.PublicKey).
  624. SerializeCompressed()
  625. address, err := btcutil.NewAddressPubKeyHash(
  626. btcutil.Hash160(pk), &chaincfg.TestNet3Params)
  627. if err != nil {
  628. t.Errorf("failed to make address for %s: %v",
  629. msg, err)
  630. break
  631. }
  632. pkScript, err := PayToAddrScript(address)
  633. if err != nil {
  634. t.Errorf("failed to make pkscript "+
  635. "for %s: %v", msg, err)
  636. }
  637. scriptAddr, err := btcutil.NewAddressScriptHash(
  638. pkScript, &chaincfg.TestNet3Params)
  639. if err != nil {
  640. t.Errorf("failed to make p2sh addr for %s: %v",
  641. msg, err)
  642. break
  643. }
  644. scriptPkScript, err := PayToAddrScript(
  645. scriptAddr)
  646. if err != nil {
  647. t.Errorf("failed to make script pkscript for "+
  648. "%s: %v", msg, err)
  649. break
  650. }
  651. if err := signAndCheck(msg, tx, i, inputAmounts[i],
  652. scriptPkScript, hashType,
  653. mkGetKey(map[string]addressToKey{
  654. address.EncodeAddress(): {key, true},
  655. }), mkGetScript(map[string][]byte{
  656. scriptAddr.EncodeAddress(): pkScript,
  657. }), nil); err != nil {
  658. t.Error(err)
  659. break
  660. }
  661. }
  662. }
  663. // Pay to Pubkey Hash (compressed) with duplicate merge
  664. for _, hashType := range hashTypes {
  665. for i := range tx.TxIn {
  666. msg := fmt.Sprintf("%d:%d", hashType, i)
  667. key, err := btcec.NewPrivateKey(btcec.S256())
  668. if err != nil {
  669. t.Errorf("failed to make privKey for %s: %v",
  670. msg, err)
  671. break
  672. }
  673. pk := (*btcec.PublicKey)(&key.PublicKey).
  674. SerializeCompressed()
  675. address, err := btcutil.NewAddressPubKeyHash(
  676. btcutil.Hash160(pk), &chaincfg.TestNet3Params)
  677. if err != nil {
  678. t.Errorf("failed to make address for %s: %v",
  679. msg, err)
  680. break
  681. }
  682. pkScript, err := PayToAddrScript(address)
  683. if err != nil {
  684. t.Errorf("failed to make pkscript "+
  685. "for %s: %v", msg, err)
  686. }
  687. scriptAddr, err := btcutil.NewAddressScriptHash(
  688. pkScript, &chaincfg.TestNet3Params)
  689. if err != nil {
  690. t.Errorf("failed to make p2sh addr for %s: %v",
  691. msg, err)
  692. break
  693. }
  694. scriptPkScript, err := PayToAddrScript(
  695. scriptAddr)
  696. if err != nil {
  697. t.Errorf("failed to make script pkscript for "+
  698. "%s: %v", msg, err)
  699. break
  700. }
  701. sigScript0, err := SignTxOutput(&chaincfg.TestNet3Params,
  702. tx, i, scriptPkScript, hashType,
  703. mkGetKey(map[string]addressToKey{
  704. address.EncodeAddress(): {key, true},
  705. }), mkGetScript(map[string][]byte{
  706. scriptAddr.EncodeAddress(): pkScript,
  707. }), nil)
  708. if err != nil {
  709. t.Errorf("failed to sign output %s: %v", msg,
  710. err)
  711. break
  712. }
  713. // by the above loop, this should be valid, now sign
  714. // again and merge.
  715. sigScript, err := SignTxOutput(&chaincfg.TestNet3Params,
  716. tx, i, scriptPkScript, hashType,
  717. mkGetKey(map[string]addressToKey{
  718. address.EncodeAddress(): {key, true},
  719. }), mkGetScript(map[string][]byte{
  720. scriptAddr.EncodeAddress(): pkScript,
  721. }), nil)
  722. if err != nil {
  723. t.Errorf("failed to sign output %s a "+
  724. "second time: %v", msg, err)
  725. break
  726. }
  727. if !bytes.Equal(sigScript0, sigScript) {
  728. t.Errorf("sigscripts did not match after signing twice")
  729. break
  730. }
  731. err = checkScripts(msg, tx, i, inputAmounts[i],
  732. sigScript, scriptPkScript)
  733. if err != nil {
  734. t.Errorf("twice signed script invalid for "+
  735. "%s: %v", msg, err)
  736. break
  737. }
  738. }
  739. }
  740. // Pay to PubKey (uncompressed)
  741. for _, hashType := range hashTypes {
  742. for i := range tx.TxIn {
  743. msg := fmt.Sprintf("%d:%d", hashType, i)
  744. key, err := btcec.NewPrivateKey(btcec.S256())
  745. if err != nil {
  746. t.Errorf("failed to make privKey for %s: %v",
  747. msg, err)
  748. break
  749. }
  750. pk := (*btcec.PublicKey)(&key.PublicKey).
  751. SerializeUncompressed()
  752. address, err := btcutil.NewAddressPubKey(pk,
  753. &chaincfg.TestNet3Params)
  754. if err != nil {
  755. t.Errorf("failed to make address for %s: %v",
  756. msg, err)
  757. break
  758. }
  759. pkScript, err := PayToAddrScript(address)
  760. if err != nil {
  761. t.Errorf("failed to make pkscript "+
  762. "for %s: %v", msg, err)
  763. }
  764. scriptAddr, err := btcutil.NewAddressScriptHash(
  765. pkScript, &chaincfg.TestNet3Params)
  766. if err != nil {
  767. t.Errorf("failed to make p2sh addr for %s: %v",
  768. msg, err)
  769. break
  770. }
  771. scriptPkScript, err := PayToAddrScript(
  772. scriptAddr)
  773. if err != nil {
  774. t.Errorf("failed to make script pkscript for "+
  775. "%s: %v", msg, err)
  776. break
  777. }
  778. if err := signAndCheck(msg, tx, i, inputAmounts[i],
  779. scriptPkScript, hashType,
  780. mkGetKey(map[string]addressToKey{
  781. address.EncodeAddress(): {key, false},
  782. }), mkGetScript(map[string][]byte{
  783. scriptAddr.EncodeAddress(): pkScript,
  784. }), nil); err != nil {
  785. t.Error(err)
  786. break
  787. }
  788. }
  789. }
  790. // Pay to PubKey (uncompressed) with duplicate merge
  791. for _, hashType := range hashTypes {
  792. for i := range tx.TxIn {
  793. msg := fmt.Sprintf("%d:%d", hashType, i)
  794. key, err := btcec.NewPrivateKey(btcec.S256())
  795. if err != nil {
  796. t.Errorf("failed to make privKey for %s: %v",
  797. msg, err)
  798. break
  799. }
  800. pk := (*btcec.PublicKey)(&key.PublicKey).
  801. SerializeUncompressed()
  802. address, err := btcutil.NewAddressPubKey(pk,
  803. &chaincfg.TestNet3Params)
  804. if err != nil {
  805. t.Errorf("failed to make address for %s: %v",
  806. msg, err)
  807. break
  808. }
  809. pkScript, err := PayToAddrScript(address)
  810. if err != nil {
  811. t.Errorf("failed to make pkscript "+
  812. "for %s: %v", msg, err)
  813. }
  814. scriptAddr, err := btcutil.NewAddressScriptHash(
  815. pkScript, &chaincfg.TestNet3Params)
  816. if err != nil {
  817. t.Errorf("failed to make p2sh addr for %s: %v",
  818. msg, err)
  819. break
  820. }
  821. scriptPkScript, err := PayToAddrScript(scriptAddr)
  822. if err != nil {
  823. t.Errorf("failed to make script pkscript for "+
  824. "%s: %v", msg, err)
  825. break
  826. }
  827. sigScript0, err := SignTxOutput(&chaincfg.TestNet3Params,
  828. tx, i, scriptPkScript, hashType,
  829. mkGetKey(map[string]addressToKey{
  830. address.EncodeAddress(): {key, false},
  831. }), mkGetScript(map[string][]byte{
  832. scriptAddr.EncodeAddress(): pkScript,
  833. }), nil)
  834. if err != nil {
  835. t.Errorf("failed to sign output %s: %v", msg,
  836. err)
  837. break
  838. }
  839. // by the above loop, this should be valid, now sign
  840. // again and merge.
  841. sigScript, err := SignTxOutput(&chaincfg.TestNet3Params,
  842. tx, i, scriptPkScript, hashType,
  843. mkGetKey(map[string]addressToKey{
  844. address.EncodeAddress(): {key, false},
  845. }), mkGetScript(map[string][]byte{
  846. scriptAddr.EncodeAddress(): pkScript,
  847. }), nil)
  848. if err != nil {
  849. t.Errorf("failed to sign output %s a "+
  850. "second time: %v", msg, err)
  851. break
  852. }
  853. if !bytes.Equal(sigScript0, sigScript) {
  854. t.Errorf("sigscripts did not match after signing twice")
  855. break
  856. }
  857. err = checkScripts(msg, tx, i, inputAmounts[i],
  858. sigScript, scriptPkScript)
  859. if err != nil {
  860. t.Errorf("twice signed script invalid for "+
  861. "%s: %v", msg, err)
  862. break
  863. }
  864. }
  865. }
  866. // Pay to PubKey (compressed)
  867. for _, hashType := range hashTypes {
  868. for i := range tx.TxIn {
  869. msg := fmt.Sprintf("%d:%d", hashType, i)
  870. key, err := btcec.NewPrivateKey(btcec.S256())
  871. if err != nil {
  872. t.Errorf("failed to make privKey for %s: %v",
  873. msg, err)
  874. break
  875. }
  876. pk := (*btcec.PublicKey)(&key.PublicKey).
  877. SerializeCompressed()
  878. address, err := btcutil.NewAddressPubKey(pk,
  879. &chaincfg.TestNet3Params)
  880. if err != nil {
  881. t.Errorf("failed to make address for %s: %v",
  882. msg, err)
  883. break
  884. }
  885. pkScript, err := PayToAddrScript(address)
  886. if err != nil {
  887. t.Errorf("failed to make pkscript "+
  888. "for %s: %v", msg, err)
  889. }
  890. scriptAddr, err := btcutil.NewAddressScriptHash(
  891. pkScript, &chaincfg.TestNet3Params)
  892. if err != nil {
  893. t.Errorf("failed to make p2sh addr for %s: %v",
  894. msg, err)
  895. break
  896. }
  897. scriptPkScript, err := PayToAddrScript(scriptAddr)
  898. if err != nil {
  899. t.Errorf("failed to make script pkscript for "+
  900. "%s: %v", msg, err)
  901. break
  902. }
  903. if err := signAndCheck(msg, tx, i, inputAmounts[i],
  904. scriptPkScript, hashType,
  905. mkGetKey(map[string]addressToKey{
  906. address.EncodeAddress(): {key, true},
  907. }), mkGetScript(map[string][]byte{
  908. scriptAddr.EncodeAddress(): pkScript,
  909. }), nil); err != nil {
  910. t.Error(err)
  911. break
  912. }
  913. }
  914. }
  915. // Pay to PubKey (compressed)
  916. for _, hashType := range hashTypes {
  917. for i := range tx.TxIn {
  918. msg := fmt.Sprintf("%d:%d", hashType, i)
  919. key, err := btcec.NewPrivateKey(btcec.S256())
  920. if err != nil {
  921. t.Errorf("failed to make privKey for %s: %v",
  922. msg, err)
  923. break
  924. }
  925. pk := (*btcec.PublicKey)(&key.PublicKey).
  926. SerializeCompressed()
  927. address, err := btcutil.NewAddressPubKey(pk,
  928. &chaincfg.TestNet3Params)
  929. if err != nil {
  930. t.Errorf("failed to make address for %s: %v",
  931. msg, err)
  932. break
  933. }
  934. pkScript, err := PayToAddrScript(address)
  935. if err != nil {
  936. t.Errorf("failed to make pkscript "+
  937. "for %s: %v", msg, err)
  938. }
  939. scriptAddr, err := btcutil.NewAddressScriptHash(
  940. pkScript, &chaincfg.TestNet3Params)
  941. if err != nil {
  942. t.Errorf("failed to make p2sh addr for %s: %v",
  943. msg, err)
  944. break
  945. }
  946. scriptPkScript, err := PayToAddrScript(scriptAddr)
  947. if err != nil {
  948. t.Errorf("failed to make script pkscript for "+
  949. "%s: %v", msg, err)
  950. break
  951. }
  952. _, err = SignTxOutput(&chaincfg.TestNet3Params,
  953. tx, i, scriptPkScript, hashType,
  954. mkGetKey(map[string]addressToKey{
  955. address.EncodeAddress(): {key, true},
  956. }), mkGetScript(map[string][]byte{
  957. scriptAddr.EncodeAddress(): pkScript,
  958. }), nil)
  959. if err != nil {
  960. t.Errorf("failed to sign output %s: %v", msg,
  961. err)
  962. break
  963. }
  964. // by the above loop, this should be valid, now sign
  965. // again and merge.
  966. sigScript, err := SignTxOutput(&chaincfg.TestNet3Params,
  967. tx, i, scriptPkScript, hashType,
  968. mkGetKey(map[string]addressToKey{
  969. address.EncodeAddress(): {key, true},
  970. }), mkGetScript(map[string][]byte{
  971. scriptAddr.EncodeAddress(): pkScript,
  972. }), nil)
  973. if err != nil {
  974. t.Errorf("failed to sign output %s a "+
  975. "second time: %v", msg, err)
  976. break
  977. }
  978. err = checkScripts(msg, tx, i, inputAmounts[i],
  979. sigScript, scriptPkScript)
  980. if err != nil {
  981. t.Errorf("twice signed script invalid for "+
  982. "%s: %v", msg, err)
  983. break
  984. }
  985. }
  986. }
  987. // Basic Multisig
  988. for _, hashType := range hashTypes {
  989. for i := range tx.TxIn {
  990. msg := fmt.Sprintf("%d:%d", hashType, i)
  991. key1, err := btcec.NewPrivateKey(btcec.S256())
  992. if err != nil {
  993. t.Errorf("failed to make privKey for %s: %v",
  994. msg, err)
  995. break
  996. }
  997. pk1 := (*btcec.PublicKey)(&key1.PublicKey).
  998. SerializeCompressed()
  999. address1, err := btcutil.NewAddressPubKey(pk1,
  1000. &chaincfg.TestNet3Params)
  1001. if err != nil {
  1002. t.Errorf("failed to make address for %s: %v",
  1003. msg, err)
  1004. break
  1005. }
  1006. key2, err := btcec.NewPrivateKey(btcec.S256())
  1007. if err != nil {
  1008. t.Errorf("failed to make privKey 2 for %s: %v",
  1009. msg, err)
  1010. break
  1011. }
  1012. pk2 := (*btcec.PublicKey)(&key2.PublicKey).
  1013. SerializeCompressed()
  1014. address2, err := btcutil.NewAddressPubKey(pk2,
  1015. &chaincfg.TestNet3Params)
  1016. if err != nil {
  1017. t.Errorf("failed to make address 2 for %s: %v",
  1018. msg, err)
  1019. break
  1020. }
  1021. pkScript, err := MultiSigScript(
  1022. []*btcutil.AddressPubKey{address1, address2},
  1023. 2)
  1024. if err != nil {
  1025. t.Errorf("failed to make pkscript "+
  1026. "for %s: %v", msg, err)
  1027. }
  1028. scriptAddr, err := btcutil.NewAddressScriptHash(
  1029. pkScript, &chaincfg.TestNet3Params)
  1030. if err != nil {
  1031. t.Errorf("failed to make p2sh addr for %s: %v",
  1032. msg, err)
  1033. break
  1034. }
  1035. scriptPkScript, err := PayToAddrScript(scriptAddr)
  1036. if err != nil {
  1037. t.Errorf("failed to make script pkscript for "+
  1038. "%s: %v", msg, err)
  1039. break
  1040. }
  1041. if err := signAndCheck(msg, tx, i, inputAmounts[i],
  1042. scriptPkScript, hashType,
  1043. mkGetKey(map[string]addressToKey{
  1044. address1.EncodeAddress(): {key1, true},
  1045. address2.EncodeAddress(): {key2, true},
  1046. }), mkGetScript(map[string][]byte{
  1047. scriptAddr.EncodeAddress(): pkScript,
  1048. }), nil); err != nil {
  1049. t.Error(err)
  1050. break
  1051. }
  1052. }
  1053. }
  1054. // Two part multisig, sign with one key then the other.
  1055. for _, hashType := range hashTypes {
  1056. for i := range tx.TxIn {
  1057. msg := fmt.Sprintf("%d:%d", hashType, i)
  1058. key1, err := btcec.NewPrivateKey(btcec.S256())
  1059. if err != nil {
  1060. t.Errorf("failed to make privKey for %s: %v",
  1061. msg, err)
  1062. break
  1063. }
  1064. pk1 := (*btcec.PublicKey)(&key1.PublicKey).
  1065. SerializeCompressed()
  1066. address1, err := btcutil.NewAddressPubKey(pk1,
  1067. &chaincfg.TestNet3Params)
  1068. if err != nil {
  1069. t.Errorf("failed to make address for %s: %v",
  1070. msg, err)
  1071. break
  1072. }
  1073. key2, err := btcec.NewPrivateKey(btcec.S256())
  1074. if err != nil {
  1075. t.Errorf("failed to make privKey 2 for %s: %v",
  1076. msg, err)
  1077. break
  1078. }
  1079. pk2 := (*btcec.PublicKey)(&key2.PublicKey).
  1080. SerializeCompressed()
  1081. address2, err := btcutil.NewAddressPubKey(pk2,
  1082. &chaincfg.TestNet3Params)
  1083. if err != nil {
  1084. t.Errorf("failed to make address 2 for %s: %v",
  1085. msg, err)
  1086. break
  1087. }
  1088. pkScript, err := MultiSigScript(
  1089. []*btcutil.AddressPubKey{address1, address2},
  1090. 2)
  1091. if err != nil {
  1092. t.Errorf("failed to make pkscript "+
  1093. "for %s: %v", msg, err)
  1094. }
  1095. scriptAddr, err := btcutil.NewAddressScriptHash(
  1096. pkScript, &chaincfg.TestNet3Params)
  1097. if err != nil {
  1098. t.Errorf("failed to make p2sh addr for %s: %v",
  1099. msg, err)
  1100. break
  1101. }
  1102. scriptPkScript, err := PayToAddrScript(scriptAddr)
  1103. if err != nil {
  1104. t.Errorf("failed to make script pkscript for "+
  1105. "%s: %v", msg, err)
  1106. break
  1107. }
  1108. sigScript, err := SignTxOutput(&chaincfg.TestNet3Params,
  1109. tx, i, scriptPkScript, hashType,
  1110. mkGetKey(map[string]addressToKey{
  1111. address1.EncodeAddress(): {key1, true},
  1112. }), mkGetScript(map[string][]byte{
  1113. scriptAddr.EncodeAddress(): pkScript,
  1114. }), nil)
  1115. if err != nil {
  1116. t.Errorf("failed to sign output %s: %v", msg,
  1117. err)
  1118. break
  1119. }
  1120. // Only 1 out of 2 signed, this *should* fail.
  1121. if checkScripts(msg, tx, i, inputAmounts[i], sigScript,
  1122. scriptPkScript) == nil {
  1123. t.Errorf("part signed script valid for %s", msg)
  1124. break
  1125. }
  1126. // Sign with the other key and merge
  1127. sigScript, err = SignTxOutput(&chaincfg.TestNet3Params,
  1128. tx, i, scriptPkScript, hashType,
  1129. mkGetKey(map[string]addressToKey{
  1130. address2.EncodeAddress(): {key2, true},
  1131. }), mkGetScript(map[string][]byte{
  1132. scriptAddr.EncodeAddress(): pkScript,
  1133. }), sigScript)
  1134. if err != nil {
  1135. t.Errorf("failed to sign output %s: %v", msg, err)
  1136. break
  1137. }
  1138. err = checkScripts(msg, tx, i, inputAmounts[i], sigScript,
  1139. scriptPkScript)
  1140. if err != nil {
  1141. t.Errorf("fully signed script invalid for "+
  1142. "%s: %v", msg, err)
  1143. break
  1144. }
  1145. }
  1146. }
  1147. // Two part multisig, sign with one key then both, check key dedup
  1148. // correctly.
  1149. for _, hashType := range hashTypes {
  1150. for i := range tx.TxIn {
  1151. msg := fmt.Sprintf("%d:%d", hashType, i)
  1152. key1, err := btcec.NewPrivateKey(btcec.S256())
  1153. if err != nil {
  1154. t.Errorf("failed to make privKey for %s: %v",
  1155. msg, err)
  1156. break
  1157. }
  1158. pk1 := (*btcec.PublicKey)(&key1.PublicKey).
  1159. SerializeCompressed()
  1160. address1, err := btcutil.NewAddressPubKey(pk1,
  1161. &chaincfg.TestNet3Params)
  1162. if err != nil {
  1163. t.Errorf("failed to make address for %s: %v",
  1164. msg, err)
  1165. break
  1166. }
  1167. key2, err := btcec.NewPrivateKey(btcec.S256())
  1168. if err != nil {
  1169. t.Errorf("failed to make privKey 2 for %s: %v",
  1170. msg, err)
  1171. break
  1172. }
  1173. pk2 := (*btcec.PublicKey)(&key2.PublicKey).
  1174. SerializeCompressed()
  1175. address2, err := btcutil.NewAddressPubKey(pk2,
  1176. &chaincfg.TestNet3Params)
  1177. if err != nil {
  1178. t.Errorf("failed to make address 2 for %s: %v",
  1179. msg, err)
  1180. break
  1181. }
  1182. pkScript, err := MultiSigScript(
  1183. []*btcutil.AddressPubKey{address1, address2},
  1184. 2)
  1185. if err != nil {
  1186. t.Errorf("failed to make pkscript "+
  1187. "for %s: %v", msg, err)
  1188. }
  1189. scriptAddr, err := btcutil.NewAddressScriptHash(
  1190. pkScript, &chaincfg.TestNet3Params)
  1191. if err != nil {
  1192. t.Errorf("failed to make p2sh addr for %s: %v",
  1193. msg, err)
  1194. break
  1195. }
  1196. scriptPkScript, err := PayToAddrScript(scriptAddr)
  1197. if err != nil {
  1198. t.Errorf("failed to make script pkscript for "+
  1199. "%s: %v", msg, err)
  1200. break
  1201. }
  1202. sigScript, err := SignTxOutput(&chaincfg.TestNet3Params,
  1203. tx, i, scriptPkScript, hashType,
  1204. mkGetKey(map[string]addressToKey{
  1205. address1.EncodeAddress(): {key1, true},
  1206. }), mkGetScript(map[string][]byte{
  1207. scriptAddr.EncodeAddress(): pkScript,
  1208. }), nil)
  1209. if err != nil {
  1210. t.Errorf("failed to sign output %s: %v", msg,
  1211. err)
  1212. break
  1213. }
  1214. // Only 1 out of 2 signed, this *should* fail.
  1215. if checkScripts(msg, tx, i, inputAmounts[i], sigScript,
  1216. scriptPkScript) == nil {
  1217. t.Errorf("part signed script valid for %s", msg)
  1218. break
  1219. }
  1220. // Sign with the other key and merge
  1221. sigScript, err = SignTxOutput(&chaincfg.TestNet3Params,
  1222. tx, i, scriptPkScript, hashType,
  1223. mkGetKey(map[string]addressToKey{
  1224. address1.EncodeAddress(): {key1, true},
  1225. address2.EncodeAddress(): {key2, true},
  1226. }), mkGetScript(map[string][]byte{
  1227. scriptAddr.EncodeAddress(): pkScript,
  1228. }), sigScript)
  1229. if err != nil {
  1230. t.Errorf("failed to sign output %s: %v", msg, err)
  1231. break
  1232. }
  1233. // Now we should pass.
  1234. err = checkScripts(msg, tx, i, inputAmounts[i],
  1235. sigScript, scriptPkScript)
  1236. if err != nil {
  1237. t.Errorf("fully signed script invalid for "+
  1238. "%s: %v", msg, err)
  1239. break
  1240. }
  1241. }
  1242. }
  1243. }
  1244. type tstInput struct {
  1245. txout *wire.TxOut
  1246. sigscriptGenerates bool
  1247. inputValidates bool
  1248. indexOutOfRange bool
  1249. }
  1250. type tstSigScript struct {
  1251. name string
  1252. inputs []tstInput
  1253. hashType params.SigHashType
  1254. compress bool
  1255. scriptAtWrongIndex bool
  1256. }
  1257. var coinbaseOutPoint = &wire.OutPoint{
  1258. Index: (1 << 32) - 1,
  1259. }
  1260. // Pregenerated private key, with associated public key and pkScripts
  1261. // for the uncompressed and compressed hash160.
  1262. var (
  1263. privKeyD = []byte{
  1264. 0x6b, 0x0f, 0xd8, 0xda, 0x54, 0x22, 0xd0, 0xb7,
  1265. 0xb4, 0xfc, 0x4e, 0x55, 0xd4, 0x88, 0x42, 0xb3, 0xa1, 0x65,
  1266. 0xac, 0x70, 0x7f, 0x3d, 0xa4, 0x39, 0x5e, 0xcb, 0x3b, 0xb0,
  1267. 0xd6, 0x0e, 0x06, 0x92,
  1268. }
  1269. // pubkeyX = []byte{0xb2, 0x52, 0xf0, 0x49, 0x85, 0x78, 0x03, 0x03, 0xc8,
  1270. // 0x7d, 0xce, 0x51, 0x7f, 0xa8, 0x69, 0x0b, 0x91, 0x95, 0xf4,
  1271. // 0xf3, 0x5c, 0x26, 0x73, 0x05, 0x05, 0xa2, 0xee, 0xbc, 0x09,
  1272. // 0x38, 0x34, 0x3a}
  1273. // pubkeyY = []byte{0xb7, 0xc6, 0x7d, 0xb2, 0xe1, 0xff, 0xc8, 0x43, 0x1f,
  1274. // 0x63, 0x32, 0x62, 0xaa, 0x60, 0xc6, 0x83, 0x30, 0xbd, 0x24,
  1275. // 0x7e, 0xef, 0xdb, 0x6f, 0x2e, 0x8d, 0x56, 0xf0, 0x3c, 0x9f,
  1276. // 0x6d, 0xb6, 0xf8}
  1277. uncompressedPkScript = []byte{
  1278. 0x76, 0xa9, 0x14, 0xd1, 0x7c, 0xb5,
  1279. 0xeb, 0xa4, 0x02, 0xcb, 0x68, 0xe0, 0x69, 0x56, 0xbf, 0x32,
  1280. 0x53, 0x90, 0x0e, 0x0a, 0x86, 0xc9, 0xfa, 0x88, 0xac,
  1281. }
  1282. compressedPkScript = []byte{
  1283. 0x76, 0xa9, 0x14, 0x27, 0x4d, 0x9f, 0x7f,
  1284. 0x61, 0x7e, 0x7c, 0x7a, 0x1c, 0x1f, 0xb2, 0x75, 0x79, 0x10,
  1285. 0x43, 0x65, 0x68, 0x27, 0x9d, 0x86, 0x88, 0xac,
  1286. }
  1287. shortPkScript = []byte{
  1288. 0x76, 0xa9, 0x14, 0xd1, 0x7c, 0xb5,
  1289. 0xeb, 0xa4, 0x02, 0xcb, 0x68, 0xe0, 0x69, 0x56, 0xbf, 0x32,
  1290. 0x53, 0x90, 0x0e, 0x0a, 0x88, 0xac,
  1291. }
  1292. // uncompressedAddrStr = "1L6fd93zGmtzkK6CsZFVVoCwzZV3MUtJ4F"
  1293. // compressedAddrStr = "14apLppt9zTq6cNw8SDfiJhk9PhkZrQtYZ"
  1294. )
  1295. // Pretend output amounts.
  1296. const (
  1297. coinbaseVal = 2500000000
  1298. fee = 5000000
  1299. )
  1300. var sigScriptTests = []tstSigScript{
  1301. {
  1302. name: "one input uncompressed",
  1303. inputs: []tstInput{
  1304. {
  1305. txout: wire.NewTxOut(coinbaseVal, uncompressedPkScript),
  1306. sigscriptGenerates: true,
  1307. inputValidates: true,
  1308. indexOutOfRange: false,
  1309. },
  1310. },
  1311. hashType: params.SigHashAll,
  1312. compress: false,
  1313. scriptAtWrongIndex: false,
  1314. },
  1315. {
  1316. name: "two inputs uncompressed",
  1317. inputs: []tstInput{
  1318. {
  1319. txout: wire.NewTxOut(coinbaseVal, uncompressedPkScript),
  1320. sigscriptGenerates: true,
  1321. inputValidates: true,
  1322. indexOutOfRange: false,
  1323. },
  1324. {
  1325. txout: wire.NewTxOut(coinbaseVal+fee, uncompressedPkScript),
  1326. sigscriptGenerates: true,
  1327. inputValidates: true,
  1328. indexOutOfRange: false,
  1329. },
  1330. },
  1331. hashType: params.SigHashAll,
  1332. compress: false,
  1333. scriptAtWrongIndex: false,
  1334. },
  1335. {
  1336. name: "one input compressed",
  1337. inputs: []tstInput{
  1338. {
  1339. txout: wire.NewTxOut(coinbaseVal, compressedPkScript),
  1340. sigscriptGenerates: true,
  1341. inputValidates: true,
  1342. indexOutOfRange: false,
  1343. },
  1344. },
  1345. hashType: params.SigHashAll,
  1346. compress: true,
  1347. scriptAtWrongIndex: false,
  1348. },
  1349. {
  1350. name: "two inputs compressed",
  1351. inputs: []tstInput{
  1352. {
  1353. txout: wire.NewTxOut(coinbaseVal, compressedPkScript),
  1354. sigscriptGenerates: true,
  1355. inputValidates: true,
  1356. indexOutOfRange: false,
  1357. },
  1358. {
  1359. txout: wire.NewTxOut(coinbaseVal+fee, compressedPkScript),
  1360. sigscriptGenerates: true,
  1361. inputValidates: true,
  1362. indexOutOfRange: false,
  1363. },
  1364. },
  1365. hashType: params.SigHashAll,
  1366. compress: true,
  1367. scriptAtWrongIndex: false,
  1368. },
  1369. {
  1370. name: "hashType SigHashNone",
  1371. inputs: []tstInput{
  1372. {
  1373. txout: wire.NewTxOut(coinbaseVal, uncompressedPkScript),
  1374. sigscriptGenerates: true,
  1375. inputValidates: true,
  1376. indexOutOfRange: false,
  1377. },
  1378. },
  1379. hashType: params.SigHashNone,
  1380. compress: false,
  1381. scriptAtWrongIndex: false,
  1382. },
  1383. {
  1384. name: "hashType SigHashSingle",
  1385. inputs: []tstInput{
  1386. {
  1387. txout: wire.NewTxOut(coinbaseVal, uncompressedPkScript),
  1388. sigscriptGenerates: true,
  1389. inputValidates: true,
  1390. indexOutOfRange: false,
  1391. },
  1392. },
  1393. hashType: params.SigHashSingle,
  1394. compress: false,
  1395. scriptAtWrongIndex: false,
  1396. },
  1397. {
  1398. name: "hashType SigHashAnyoneCanPay",
  1399. inputs: []tstInput{
  1400. {
  1401. txout: wire.NewTxOut(coinbaseVal, uncompressedPkScript),
  1402. sigscriptGenerates: true,
  1403. inputValidates: true,
  1404. indexOutOfRange: false,
  1405. },
  1406. },
  1407. hashType: params.SigHashAnyOneCanPay,
  1408. compress: false,
  1409. scriptAtWrongIndex: false,
  1410. },
  1411. {
  1412. name: "hashType non-standard",
  1413. inputs: []tstInput{
  1414. {
  1415. txout: wire.NewTxOut(coinbaseVal, uncompressedPkScript),
  1416. sigscriptGenerates: true,
  1417. inputValidates: true,
  1418. indexOutOfRange: false,
  1419. },
  1420. },
  1421. hashType: 0x04,
  1422. compress: false,
  1423. scriptAtWrongIndex: false,
  1424. },
  1425. {
  1426. name: "invalid compression",
  1427. inputs: []tstInput{
  1428. {
  1429. txout: wire.NewTxOut(coinbaseVal, uncompressedPkScript),
  1430. sigscriptGenerates: true,
  1431. inputValidates: false,
  1432. indexOutOfRange: false,
  1433. },
  1434. },
  1435. hashType: params.SigHashAll,
  1436. compress: true,
  1437. scriptAtWrongIndex: false,
  1438. },
  1439. {
  1440. name: "short PkScript",
  1441. inputs: []tstInput{
  1442. {
  1443. txout: wire.NewTxOut(coinbaseVal, shortPkScript),
  1444. sigscriptGenerates: false,
  1445. indexOutOfRange: false,
  1446. },
  1447. },
  1448. hashType: params.SigHashAll,
  1449. compress: false,
  1450. scriptAtWrongIndex: false,
  1451. },
  1452. {
  1453. name: "valid script at wrong index",
  1454. inputs: []tstInput{
  1455. {
  1456. txout: wire.NewTxOut(coinbaseVal, uncompressedPkScript),
  1457. sigscriptGenerates: true,
  1458. inputValidates: true,
  1459. indexOutOfRange: false,
  1460. },
  1461. {
  1462. txout: wire.NewTxOut(coinbaseVal+fee, uncompressedPkScript),
  1463. sigscriptGenerates: true,
  1464. inputValidates: true,
  1465. indexOutOfRange: false,
  1466. },
  1467. },
  1468. hashType: params.SigHashAll,
  1469. compress: false,
  1470. scriptAtWrongIndex: true,
  1471. },
  1472. {
  1473. name: "index out of range",
  1474. inputs: []tstInput{
  1475. {
  1476. txout: wire.NewTxOut(coinbaseVal, uncompressedPkScript),
  1477. sigscriptGenerates: true,
  1478. inputValidates: true,
  1479. indexOutOfRange: false,
  1480. },
  1481. {
  1482. txout: wire.NewTxOut(coinbaseVal+fee, uncompressedPkScript),
  1483. sigscriptGenerates: true,
  1484. inputValidates: true,
  1485. indexOutOfRange: false,
  1486. },
  1487. },
  1488. hashType: params.SigHashAll,
  1489. compress: false,
  1490. scriptAtWrongIndex: true,
  1491. },
  1492. }
  1493. // Test the sigscript generation for valid and invalid inputs, all
  1494. // hashTypes, and with and without compression. This test creates
  1495. // sigscripts to spend fake coinbase inputs, as sigscripts cannot be
  1496. // created for the MsgTxs in txTests, since they come from the blockchain
  1497. // and we don't have the private keys.
  1498. func TestSignatureScript(t *testing.T) {
  1499. privKey, _ := btcec.PrivKeyFromBytes(btcec.S256(), privKeyD)
  1500. nexttest:
  1501. for i := range sigScriptTests {
  1502. tx := wire.NewMsgTx(constants.TxVersion)
  1503. output := wire.NewTxOut(500, []byte{opcode.OP_RETURN})
  1504. tx.AddTxOut(output)
  1505. for range sigScriptTests[i].inputs {
  1506. txin := wire.NewTxIn(coinbaseOutPoint, nil, nil)
  1507. tx.AddTxIn(txin)
  1508. }
  1509. var script []byte
  1510. var err er.R
  1511. for j := range tx.TxIn {
  1512. var idx int
  1513. if sigScriptTests[i].inputs[j].indexOutOfRange {
  1514. t.Errorf("at test %v", sigScriptTests[i].name)
  1515. idx = len(sigScriptTests[i].inputs)
  1516. } else {
  1517. idx = j
  1518. }
  1519. script, err = SignatureScript(tx, idx,
  1520. sigScriptTests[i].inputs[j].txout.PkScript,
  1521. sigScriptTests[i].hashType, privKey,
  1522. sigScriptTests[i].compress)
  1523. if (err == nil) != sigScriptTests[i].inputs[j].sigscriptGenerates {
  1524. if err == nil {
  1525. t.Errorf("passed test '%v' incorrectly",
  1526. sigScriptTests[i].name)
  1527. } else {
  1528. t.Errorf("failed test '%v': %v",
  1529. sigScriptTests[i].name, err)
  1530. }
  1531. continue nexttest
  1532. }
  1533. if !sigScriptTests[i].inputs[j].sigscriptGenerates {
  1534. // done with this test
  1535. continue nexttest
  1536. }
  1537. tx.TxIn[j].SignatureScript = script
  1538. }
  1539. // If testing using a correct sigscript but for an incorrect
  1540. // index, use last input script for first input. Requires > 0
  1541. // inputs for test.
  1542. if sigScriptTests[i].scriptAtWrongIndex {
  1543. tx.TxIn[0].SignatureScript = script
  1544. sigScriptTests[i].inputs[0].inputValidates = false
  1545. }
  1546. // Validate tx input scripts
  1547. scriptFlags := ScriptBip16 | ScriptVerifyDERSignatures
  1548. for j := range tx.TxIn {
  1549. vm, err := NewEngine(sigScriptTests[i].
  1550. inputs[j].txout.PkScript, tx, j, scriptFlags, nil, nil, 0)
  1551. if err != nil {
  1552. t.Errorf("cannot create script vm for test %v: %v",
  1553. sigScriptTests[i].name, err)
  1554. continue nexttest
  1555. }
  1556. err = vm.Execute()
  1557. if (err == nil) != sigScriptTests[i].inputs[j].inputValidates {
  1558. if err == nil {
  1559. t.Errorf("passed test '%v' validation incorrectly: %v",
  1560. sigScriptTests[i].name, err)
  1561. } else {
  1562. t.Errorf("failed test '%v' validation: %v",
  1563. sigScriptTests[i].name, err)
  1564. }
  1565. continue nexttest
  1566. }
  1567. }
  1568. }
  1569. }