(t *testing.T)
| 200 | } |
| 201 | |
| 202 | func TestDecryptReaderAt(t *testing.T) { |
| 203 | key := make([]byte, chacha20poly1305.KeySize) |
| 204 | if _, err := rand.Read(key); err != nil { |
| 205 | t.Fatal(err) |
| 206 | } |
| 207 | |
| 208 | // Create plaintext spanning exactly 3 chunks: 2 full chunks + partial third |
| 209 | // Chunk 0: [0, cs) |
| 210 | // Chunk 1: [cs, 2*cs) |
| 211 | // Chunk 2: [2*cs, 2*cs+500) |
| 212 | plaintextSize := 2*cs + 500 |
| 213 | plaintext := make([]byte, plaintextSize) |
| 214 | if _, err := rand.Read(plaintext); err != nil { |
| 215 | t.Fatal(err) |
| 216 | } |
| 217 | |
| 218 | // Encrypt |
| 219 | buf := &bytes.Buffer{} |
| 220 | w, err := stream.NewEncryptWriter(key, buf) |
| 221 | if err != nil { |
| 222 | t.Fatal(err) |
| 223 | } |
| 224 | if _, err := w.Write(plaintext); err != nil { |
| 225 | t.Fatal(err) |
| 226 | } |
| 227 | if err := w.Close(); err != nil { |
| 228 | t.Fatal(err) |
| 229 | } |
| 230 | ciphertext := buf.Bytes() |
| 231 | |
| 232 | // Create tracking ReaderAt |
| 233 | tracker := &trackingReaderAt{r: bytes.NewReader(ciphertext)} |
| 234 | |
| 235 | // Create DecryptReaderAt (this reads and caches the final chunk) |
| 236 | ra, err := stream.NewDecryptReaderAt(key, tracker, int64(len(ciphertext))) |
| 237 | if err != nil { |
| 238 | t.Fatal(err) |
| 239 | } |
| 240 | tracker.reset() |
| 241 | |
| 242 | // Helper to check reads |
| 243 | checkRead := func(name string, off int64, size int, wantN int, wantEOF bool, wantSrcRead bool) { |
| 244 | t.Helper() |
| 245 | tracker.reset() |
| 246 | p := make([]byte, size) |
| 247 | n, err := ra.ReadAt(p, off) |
| 248 | |
| 249 | if wantEOF { |
| 250 | if err != io.EOF { |
| 251 | t.Errorf("%s: got err=%v, want EOF", name, err) |
| 252 | } |
| 253 | } else { |
| 254 | if err != nil { |
| 255 | t.Errorf("%s: got err=%v, want nil", name, err) |
| 256 | } |
| 257 | } |
| 258 | |
| 259 | if n != wantN { |
nothing calls this directly
no test coverage detected
searching dependent graphs…