5
5
package rand_test
6
6
7
7
import (
8
+ "bytes"
9
+ "crypto/sha256"
10
+ "encoding/hex"
11
+ "io"
8
12
. "math/rand/v2"
9
13
"testing"
14
+ "testing/iotest"
10
15
)
11
16
12
17
func TestChaCha8 (t * testing.T ) {
@@ -25,6 +30,74 @@ func TestChaCha8(t *testing.T) {
25
30
}
26
31
}
27
32
33
+ func TestChaCha8Read (t * testing.T ) {
34
+ p := NewChaCha8 (chacha8seed )
35
+ h := sha256 .New ()
36
+
37
+ buf := make ([]byte , chacha8outlen )
38
+ if nn , err := p .Read (buf ); err != nil {
39
+ t .Fatal (err )
40
+ } else if nn != len (buf ) {
41
+ t .Errorf ("Read short: got %d, expected %d" , nn , len (buf ))
42
+ }
43
+ h .Write (buf )
44
+ if got := h .Sum (nil ); ! bytes .Equal (got , chacha8hash ) {
45
+ t .Errorf ("transcript incorrect: got %x, want %x" , got , chacha8hash )
46
+ }
47
+
48
+ p .Seed (chacha8seed )
49
+ h .Reset ()
50
+
51
+ buf = make ([]byte , chacha8outlen )
52
+ if _ , err := io .ReadFull (iotest .OneByteReader (p ), buf ); err != nil {
53
+ t .Errorf ("one byte reads: %v" , err )
54
+ }
55
+ h .Write (buf )
56
+ if got := h .Sum (nil ); ! bytes .Equal (got , chacha8hash ) {
57
+ t .Errorf ("transcript incorrect (one byte reads): got %x, want %x" , got , chacha8hash )
58
+ }
59
+
60
+ p .Seed (chacha8seed )
61
+ h .Reset ()
62
+
63
+ if n , err := p .Read (make ([]byte , 0 )); err != nil {
64
+ t .Errorf ("zero length read: %v" , err )
65
+ } else if n != 0 {
66
+ t .Errorf ("Read zero length: got %d, expected %d" , n , 0 )
67
+ }
68
+
69
+ var n int
70
+ for n < chacha8outlen {
71
+ if IntN (2 ) == 0 {
72
+ out , err := p .MarshalBinary ()
73
+ if err != nil {
74
+ t .Fatal (err )
75
+ }
76
+ if IntN (2 ) == 0 {
77
+ p = NewChaCha8 ([32 ]byte {})
78
+ }
79
+ if err := p .UnmarshalBinary (out ); err != nil {
80
+ t .Fatal (err )
81
+ }
82
+ }
83
+ buf := make ([]byte , IntN (100 ))
84
+ if n + len (buf ) > chacha8outlen {
85
+ buf = buf [:chacha8outlen - n ]
86
+ }
87
+ n += len (buf )
88
+ t .Logf ("reading %d bytes" , len (buf ))
89
+ if nn , err := p .Read (buf ); err != nil {
90
+ t .Fatal (err )
91
+ } else if nn != len (buf ) {
92
+ t .Errorf ("Read short: got %d, expected %d" , nn , len (buf ))
93
+ }
94
+ h .Write (buf )
95
+ }
96
+ if got := h .Sum (nil ); ! bytes .Equal (got , chacha8hash ) {
97
+ t .Errorf ("transcript incorrect: got %x, want %x" , got , chacha8hash )
98
+ }
99
+ }
100
+
28
101
func TestChaCha8Marshal (t * testing.T ) {
29
102
p := NewChaCha8 (chacha8seed )
30
103
for i , x := range chacha8output {
@@ -33,7 +106,7 @@ func TestChaCha8Marshal(t *testing.T) {
33
106
t .Fatalf ("#%d: MarshalBinary: %v" , i , err )
34
107
}
35
108
if string (enc ) != chacha8marshal [i ] {
36
- t .Fatalf ("#%d: MarshalBinary=%q, want %q" , i , enc , chacha8marshal [i ])
109
+ t .Errorf ("#%d: MarshalBinary=%q, want %q" , i , enc , chacha8marshal [i ])
37
110
}
38
111
* p = ChaCha8 {}
39
112
if err := p .UnmarshalBinary (enc ); err != nil {
@@ -45,6 +118,24 @@ func TestChaCha8Marshal(t *testing.T) {
45
118
}
46
119
}
47
120
121
+ func TestChaCha8MarshalRead (t * testing.T ) {
122
+ p := NewChaCha8 (chacha8seed )
123
+ for i := range 50 {
124
+ enc , err := p .MarshalBinary ()
125
+ if err != nil {
126
+ t .Fatalf ("#%d: MarshalBinary: %v" , i , err )
127
+ }
128
+ if string (enc ) != chacha8marshalread [i ] {
129
+ t .Errorf ("#%d: MarshalBinary=%q, want %q" , i , enc , chacha8marshalread [i ])
130
+ }
131
+ * p = ChaCha8 {}
132
+ if err := p .UnmarshalBinary (enc ); err != nil {
133
+ t .Fatalf ("#%d: UnmarshalBinary: %v" , i , err )
134
+ }
135
+ p .Read (make ([]byte , 1 ))
136
+ }
137
+ }
138
+
48
139
func BenchmarkChaCha8 (b * testing.B ) {
49
140
p := NewChaCha8 ([32 ]byte {1 , 2 , 3 , 4 , 5 })
50
141
var t uint64
@@ -54,11 +145,26 @@ func BenchmarkChaCha8(b *testing.B) {
54
145
Sink = t
55
146
}
56
147
148
+ func BenchmarkChaCha8Read (b * testing.B ) {
149
+ p := NewChaCha8 ([32 ]byte {1 , 2 , 3 , 4 , 5 })
150
+ buf := make ([]byte , 32 )
151
+ b .SetBytes (32 )
152
+ var t uint8
153
+ for n := b .N ; n > 0 ; n -- {
154
+ p .Read (buf )
155
+ t += buf [0 ]
156
+ }
157
+ Sink = uint64 (t )
158
+ }
159
+
57
160
// Golden output test to make sure algorithm never changes,
58
161
// so that its use in math/rand/v2 stays stable.
59
162
60
163
var chacha8seed = [32 ]byte ([]byte ("ABCDEFGHIJKLMNOPQRSTUVWXYZ123456" ))
61
164
165
+ var chacha8outlen = 2976
166
+ var chacha8hash , _ = hex .DecodeString ("bfec3d418b829afe5df2d8887d1508348409c293b73758d7efd841dd995fe021" )
167
+
62
168
var chacha8output = []uint64 {
63
169
0xb773b6063d4616a5 , 0x1160af22a66abc3c , 0x8c2599d9418d287c , 0x7ee07e037edc5cd6 ,
64
170
0xcfaa9ee02d1c16ad , 0x0e090eef8febea79 , 0x3c82d271128b5b3e , 0x9c5addc11252a34f ,
@@ -529,3 +635,56 @@ var chacha8marshal = []string{
529
635
"chacha8:\x00 \x00 \x00 \x00 \x00 \x00 \x00 zK3\x9b B!,\x94 \x9d \x97 5\xce 'O_t\xee |\xb2 1\x87 \xbb \xbb \xfd )\x8f \xe5 2\x01 \v P\f k" ,
530
636
"chacha8:\x00 \x00 \x00 \x00 \x00 \x00 \x00 {K3\x9b B!,\x94 \x9d \x97 5\xce 'O_t\xee |\xb2 1\x87 \xbb \xbb \xfd )\x8f \xe5 2\x01 \v P\f k" ,
531
637
}
638
+
639
+ var chacha8marshalread = []string {
640
+ "chacha8:\x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 ABCDEFGHIJKLMNOPQRSTUVWXYZ123456" ,
641
+ "readbuf:\a \x16 F=\x06 \xb6 s\xb7 chacha8:\x00 \x00 \x00 \x00 \x00 \x00 \x00 \x01 ABCDEFGHIJKLMNOPQRSTUVWXYZ123456" ,
642
+ "readbuf:\x06 F=\x06 \xb6 s\xb7 chacha8:\x00 \x00 \x00 \x00 \x00 \x00 \x00 \x01 ABCDEFGHIJKLMNOPQRSTUVWXYZ123456" ,
643
+ "readbuf:\x05 =\x06 \xb6 s\xb7 chacha8:\x00 \x00 \x00 \x00 \x00 \x00 \x00 \x01 ABCDEFGHIJKLMNOPQRSTUVWXYZ123456" ,
644
+ "readbuf:\x04 \x06 \xb6 s\xb7 chacha8:\x00 \x00 \x00 \x00 \x00 \x00 \x00 \x01 ABCDEFGHIJKLMNOPQRSTUVWXYZ123456" ,
645
+ "readbuf:\x03 \xb6 s\xb7 chacha8:\x00 \x00 \x00 \x00 \x00 \x00 \x00 \x01 ABCDEFGHIJKLMNOPQRSTUVWXYZ123456" ,
646
+ "readbuf:\x02 s\xb7 chacha8:\x00 \x00 \x00 \x00 \x00 \x00 \x00 \x01 ABCDEFGHIJKLMNOPQRSTUVWXYZ123456" ,
647
+ "readbuf:\x01 \xb7 chacha8:\x00 \x00 \x00 \x00 \x00 \x00 \x00 \x01 ABCDEFGHIJKLMNOPQRSTUVWXYZ123456" ,
648
+ "chacha8:\x00 \x00 \x00 \x00 \x00 \x00 \x00 \x01 ABCDEFGHIJKLMNOPQRSTUVWXYZ123456" ,
649
+ "readbuf:\a \xbc j\xa6 \" \xaf `\x11 chacha8:\x00 \x00 \x00 \x00 \x00 \x00 \x00 \x02 ABCDEFGHIJKLMNOPQRSTUVWXYZ123456" ,
650
+ "readbuf:\x06 j\xa6 \" \xaf `\x11 chacha8:\x00 \x00 \x00 \x00 \x00 \x00 \x00 \x02 ABCDEFGHIJKLMNOPQRSTUVWXYZ123456" ,
651
+ "readbuf:\x05 \xa6 \" \xaf `\x11 chacha8:\x00 \x00 \x00 \x00 \x00 \x00 \x00 \x02 ABCDEFGHIJKLMNOPQRSTUVWXYZ123456" ,
652
+ "readbuf:\x04 \" \xaf `\x11 chacha8:\x00 \x00 \x00 \x00 \x00 \x00 \x00 \x02 ABCDEFGHIJKLMNOPQRSTUVWXYZ123456" ,
653
+ "readbuf:\x03 \xaf `\x11 chacha8:\x00 \x00 \x00 \x00 \x00 \x00 \x00 \x02 ABCDEFGHIJKLMNOPQRSTUVWXYZ123456" ,
654
+ "readbuf:\x02 `\x11 chacha8:\x00 \x00 \x00 \x00 \x00 \x00 \x00 \x02 ABCDEFGHIJKLMNOPQRSTUVWXYZ123456" ,
655
+ "readbuf:\x01 \x11 chacha8:\x00 \x00 \x00 \x00 \x00 \x00 \x00 \x02 ABCDEFGHIJKLMNOPQRSTUVWXYZ123456" ,
656
+ "chacha8:\x00 \x00 \x00 \x00 \x00 \x00 \x00 \x02 ABCDEFGHIJKLMNOPQRSTUVWXYZ123456" ,
657
+ "readbuf:\a (\x8d Aٙ%\x8c chacha8:\x00 \x00 \x00 \x00 \x00 \x00 \x00 \x03 ABCDEFGHIJKLMNOPQRSTUVWXYZ123456" ,
658
+ "readbuf:\x06 \x8d Aٙ%\x8c chacha8:\x00 \x00 \x00 \x00 \x00 \x00 \x00 \x03 ABCDEFGHIJKLMNOPQRSTUVWXYZ123456" ,
659
+ "readbuf:\x05 Aٙ%\x8c chacha8:\x00 \x00 \x00 \x00 \x00 \x00 \x00 \x03 ABCDEFGHIJKLMNOPQRSTUVWXYZ123456" ,
660
+ "readbuf:\x04 ٙ%\x8c chacha8:\x00 \x00 \x00 \x00 \x00 \x00 \x00 \x03 ABCDEFGHIJKLMNOPQRSTUVWXYZ123456" ,
661
+ "readbuf:\x03 \x99 %\x8c chacha8:\x00 \x00 \x00 \x00 \x00 \x00 \x00 \x03 ABCDEFGHIJKLMNOPQRSTUVWXYZ123456" ,
662
+ "readbuf:\x02 %\x8c chacha8:\x00 \x00 \x00 \x00 \x00 \x00 \x00 \x03 ABCDEFGHIJKLMNOPQRSTUVWXYZ123456" ,
663
+ "readbuf:\x01 \x8c chacha8:\x00 \x00 \x00 \x00 \x00 \x00 \x00 \x03 ABCDEFGHIJKLMNOPQRSTUVWXYZ123456" ,
664
+ "chacha8:\x00 \x00 \x00 \x00 \x00 \x00 \x00 \x03 ABCDEFGHIJKLMNOPQRSTUVWXYZ123456" ,
665
+ "readbuf:\a \\ \xdc ~\x03 ~\xe0 ~chacha8:\x00 \x00 \x00 \x00 \x00 \x00 \x00 \x04 ABCDEFGHIJKLMNOPQRSTUVWXYZ123456" ,
666
+ "readbuf:\x06 \xdc ~\x03 ~\xe0 ~chacha8:\x00 \x00 \x00 \x00 \x00 \x00 \x00 \x04 ABCDEFGHIJKLMNOPQRSTUVWXYZ123456" ,
667
+ "readbuf:\x05 ~\x03 ~\xe0 ~chacha8:\x00 \x00 \x00 \x00 \x00 \x00 \x00 \x04 ABCDEFGHIJKLMNOPQRSTUVWXYZ123456" ,
668
+ "readbuf:\x04 \x03 ~\xe0 ~chacha8:\x00 \x00 \x00 \x00 \x00 \x00 \x00 \x04 ABCDEFGHIJKLMNOPQRSTUVWXYZ123456" ,
669
+ "readbuf:\x03 ~\xe0 ~chacha8:\x00 \x00 \x00 \x00 \x00 \x00 \x00 \x04 ABCDEFGHIJKLMNOPQRSTUVWXYZ123456" ,
670
+ "readbuf:\x02 \xe0 ~chacha8:\x00 \x00 \x00 \x00 \x00 \x00 \x00 \x04 ABCDEFGHIJKLMNOPQRSTUVWXYZ123456" ,
671
+ "readbuf:\x01 ~chacha8:\x00 \x00 \x00 \x00 \x00 \x00 \x00 \x04 ABCDEFGHIJKLMNOPQRSTUVWXYZ123456" ,
672
+ "chacha8:\x00 \x00 \x00 \x00 \x00 \x00 \x00 \x04 ABCDEFGHIJKLMNOPQRSTUVWXYZ123456" ,
673
+ "readbuf:\a \x16 \x1c -\xe0 \x9e \xaa \xcf chacha8:\x00 \x00 \x00 \x00 \x00 \x00 \x00 \x05 ABCDEFGHIJKLMNOPQRSTUVWXYZ123456" ,
674
+ "readbuf:\x06 \x1c -\xe0 \x9e \xaa \xcf chacha8:\x00 \x00 \x00 \x00 \x00 \x00 \x00 \x05 ABCDEFGHIJKLMNOPQRSTUVWXYZ123456" ,
675
+ "readbuf:\x05 -\xe0 \x9e \xaa \xcf chacha8:\x00 \x00 \x00 \x00 \x00 \x00 \x00 \x05 ABCDEFGHIJKLMNOPQRSTUVWXYZ123456" ,
676
+ "readbuf:\x04 \xe0 \x9e \xaa \xcf chacha8:\x00 \x00 \x00 \x00 \x00 \x00 \x00 \x05 ABCDEFGHIJKLMNOPQRSTUVWXYZ123456" ,
677
+ "readbuf:\x03 \x9e \xaa \xcf chacha8:\x00 \x00 \x00 \x00 \x00 \x00 \x00 \x05 ABCDEFGHIJKLMNOPQRSTUVWXYZ123456" ,
678
+ "readbuf:\x02 \xaa \xcf chacha8:\x00 \x00 \x00 \x00 \x00 \x00 \x00 \x05 ABCDEFGHIJKLMNOPQRSTUVWXYZ123456" ,
679
+ "readbuf:\x01 \xcf chacha8:\x00 \x00 \x00 \x00 \x00 \x00 \x00 \x05 ABCDEFGHIJKLMNOPQRSTUVWXYZ123456" ,
680
+ "chacha8:\x00 \x00 \x00 \x00 \x00 \x00 \x00 \x05 ABCDEFGHIJKLMNOPQRSTUVWXYZ123456" ,
681
+ "readbuf:\a \xea \xeb \x8f \xef \x0e \t \x0e chacha8:\x00 \x00 \x00 \x00 \x00 \x00 \x00 \x06 ABCDEFGHIJKLMNOPQRSTUVWXYZ123456" ,
682
+ "readbuf:\x06 \xeb \x8f \xef \x0e \t \x0e chacha8:\x00 \x00 \x00 \x00 \x00 \x00 \x00 \x06 ABCDEFGHIJKLMNOPQRSTUVWXYZ123456" ,
683
+ "readbuf:\x05 \x8f \xef \x0e \t \x0e chacha8:\x00 \x00 \x00 \x00 \x00 \x00 \x00 \x06 ABCDEFGHIJKLMNOPQRSTUVWXYZ123456" ,
684
+ "readbuf:\x04 \xef \x0e \t \x0e chacha8:\x00 \x00 \x00 \x00 \x00 \x00 \x00 \x06 ABCDEFGHIJKLMNOPQRSTUVWXYZ123456" ,
685
+ "readbuf:\x03 \x0e \t \x0e chacha8:\x00 \x00 \x00 \x00 \x00 \x00 \x00 \x06 ABCDEFGHIJKLMNOPQRSTUVWXYZ123456" ,
686
+ "readbuf:\x02 \t \x0e chacha8:\x00 \x00 \x00 \x00 \x00 \x00 \x00 \x06 ABCDEFGHIJKLMNOPQRSTUVWXYZ123456" ,
687
+ "readbuf:\x01 \x0e chacha8:\x00 \x00 \x00 \x00 \x00 \x00 \x00 \x06 ABCDEFGHIJKLMNOPQRSTUVWXYZ123456" ,
688
+ "chacha8:\x00 \x00 \x00 \x00 \x00 \x00 \x00 \x06 ABCDEFGHIJKLMNOPQRSTUVWXYZ123456" ,
689
+ "readbuf:\a [\x8b \x12 q҂<chacha8:\x00 \x00 \x00 \x00 \x00 \x00 \x00 \a ABCDEFGHIJKLMNOPQRSTUVWXYZ123456" ,
690
+ }
0 commit comments