1
|
|
|
<?php |
2
|
|
|
|
3
|
|
|
namespace BitWasp\Bitcoin\Tests\Mnemonic\Bip39; |
4
|
|
|
|
5
|
|
|
use BitWasp\Buffertools\Buffer; |
6
|
|
|
use BitWasp\Buffertools\BufferInterface; |
7
|
|
|
use Btccom\JustEncrypt\Encoding\Mnemonic; |
8
|
|
|
use Btccom\JustEncrypt\Encoding\Wordlist; |
9
|
|
|
use Btccom\JustEncrypt\Test\AbstractTestCase; |
10
|
|
|
|
11
|
|
|
class MnemonicTest extends AbstractTestCase |
12
|
|
|
{ |
13
|
|
|
/** |
14
|
|
|
* @return array |
15
|
|
|
*/ |
16
|
|
|
public function getBip39Vectors() |
17
|
|
|
{ |
18
|
|
|
$file = json_decode($this->dataFile('bip39.json'), true); |
19
|
|
|
$vectors = []; |
20
|
|
|
|
21
|
|
|
$bip39 = new Mnemonic(new Wordlist()); |
22
|
|
|
foreach ($file as $list => $testSet) { |
23
|
|
|
foreach ($testSet as $set) { |
24
|
|
|
$vectors[] = [ |
25
|
|
|
$bip39, |
26
|
|
|
Buffer::hex($set[0]), |
27
|
|
|
$set[1], |
28
|
|
|
Buffer::hex($set[2]) |
29
|
|
|
]; |
30
|
|
|
} |
31
|
|
|
} |
32
|
|
|
|
33
|
|
|
return $vectors; |
34
|
|
|
} |
35
|
|
|
|
36
|
|
|
/** |
37
|
|
|
* @dataProvider getBip39Vectors |
38
|
|
|
* @param Mnemonic $bip39 |
39
|
|
|
* @param BufferInterface $entropy |
40
|
|
|
* @param $eMnemonic |
41
|
|
|
* @param BufferInterface $eSeed |
42
|
|
|
*/ |
43
|
|
|
public function testEntropyToMnemonic(Mnemonic $bip39, BufferInterface $entropy, $eMnemonic, BufferInterface $eSeed) |
|
|
|
|
44
|
|
|
{ |
45
|
|
|
$mnemonic = $bip39->entropyToMnemonic($entropy); |
46
|
|
|
$this->assertEquals($eMnemonic, $mnemonic); |
47
|
|
|
} |
48
|
|
|
|
49
|
|
|
/** |
50
|
|
|
* @dataProvider getBip39Vectors |
51
|
|
|
* @param Mnemonic $bip39 |
52
|
|
|
* @param BufferInterface $eEntropy |
53
|
|
|
* @param $mnemonic |
54
|
|
|
* @param BufferInterface $eSeed |
55
|
|
|
*/ |
56
|
|
|
public function testMnemonicToEntropy(Mnemonic $bip39, BufferInterface $eEntropy, $mnemonic, BufferInterface $eSeed) |
|
|
|
|
57
|
|
|
{ |
58
|
|
|
$entropy = $bip39->mnemonicToEntropy($mnemonic); |
59
|
|
|
$this->assertEquals($eEntropy->getBinary(), $entropy->getBinary()); |
60
|
|
|
} |
61
|
|
|
|
62
|
|
|
/** |
63
|
|
|
* @expectedException \InvalidArgumentException |
64
|
|
|
* @expectedExceptionMessage Invalid mnemonic |
65
|
|
|
*/ |
66
|
|
|
public function testIncorrectWordCount() |
67
|
|
|
{ |
68
|
|
|
$bip39 = new Mnemonic(new Wordlist()); |
69
|
|
|
$mnemonic = 'letter advice'; |
70
|
|
|
$bip39->mnemonicToEntropy($mnemonic); |
71
|
|
|
} |
72
|
|
|
|
73
|
|
|
/** |
74
|
|
|
* @expectedException \InvalidArgumentException |
75
|
|
|
* @expectedExceptionMessage Checksum does not match |
76
|
|
|
*/ |
77
|
|
|
public function testFailsOnInvalidChecksum() |
78
|
|
|
{ |
79
|
|
|
$bip39 = new Mnemonic(new Wordlist()); |
80
|
|
|
$mnemonic = 'jelly better achieve collect unaware mountain thought cargo oxygen act hood oxygen'; |
81
|
|
|
$bip39->mnemonicToEntropy($mnemonic); |
82
|
|
|
} |
83
|
|
|
|
84
|
|
|
/** |
85
|
|
|
* @expectedException \InvalidArgumentException |
86
|
|
|
* @expectedExceptionMessage Invalid entropy, must be multitude of 4 bytes |
87
|
|
|
*/ |
88
|
|
|
public function testFailsOnEntropyMod4() |
89
|
|
|
{ |
90
|
|
|
$bip39 = new Mnemonic(new Wordlist()); |
91
|
|
|
$bip39->entropyToMnemonic(Buffer::hex(str_repeat('00', 5))); |
92
|
|
|
} |
93
|
|
|
|
94
|
|
|
/** |
95
|
|
|
* @expectedException \InvalidArgumentException |
96
|
|
|
* @expectedExceptionMessage Invalid entropy, max 1024 bytes |
97
|
|
|
*/ |
98
|
|
|
public function testFailsOnEntropyTooLong() |
99
|
|
|
{ |
100
|
|
|
$bip39 = new Mnemonic(new Wordlist()); |
101
|
|
|
$bip39->entropyToMnemonic(Buffer::hex(str_repeat('00', 1028))); |
102
|
|
|
} |
103
|
|
|
|
104
|
|
|
/** |
105
|
|
|
* @expectedException \InvalidArgumentException |
106
|
|
|
* @expectedExceptionMessage Invalid mnemonic, too long |
107
|
|
|
*/ |
108
|
|
|
public function testFailsOnMnemonicOfEntropyTooLong() |
109
|
|
|
{ |
110
|
|
|
$bip39 = new Mnemonic(new Wordlist()); |
111
|
|
|
$mnemonic = 'abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about end grace oxygen maze bright face loan ticket trial leg cruel lizard bread worry reject journey perfect chef section caught neither install industry'; |
112
|
|
|
$bip39->mnemonicToEntropy($mnemonic); |
113
|
|
|
} |
114
|
|
|
} |
115
|
|
|
|
This check looks from parameters that have been defined for a function or method, but which are not used in the method body.