Add options for Open and implement Range for all remotes
This commit is contained in:
parent
75e5e59385
commit
aef2ac5c04
33 changed files with 547 additions and 78 deletions
|
@ -355,9 +355,9 @@ func (n *nonce) fromBuf(buf []byte) {
|
|||
}
|
||||
}
|
||||
|
||||
// increment to add 1 to the nonce
|
||||
func (n *nonce) increment() {
|
||||
for i := 0; i < len(*n); i++ {
|
||||
// carry 1 up the nonce from position i
|
||||
func (n *nonce) carry(i int) {
|
||||
for ; i < len(*n); i++ {
|
||||
digit := (*n)[i]
|
||||
newDigit := digit + 1
|
||||
(*n)[i] = newDigit
|
||||
|
@ -368,6 +368,27 @@ func (n *nonce) increment() {
|
|||
}
|
||||
}
|
||||
|
||||
// increment to add 1 to the nonce
|
||||
func (n *nonce) increment() {
|
||||
n.carry(0)
|
||||
}
|
||||
|
||||
// add an uint64 to the nonce
|
||||
func (n *nonce) add(x uint64) {
|
||||
carry := uint16(0)
|
||||
for i := 0; i < 8; i++ {
|
||||
digit := (*n)[i]
|
||||
xDigit := byte(x)
|
||||
x >>= 8
|
||||
carry += uint16(digit) + uint16(xDigit)
|
||||
(*n)[i] = byte(carry)
|
||||
carry >>= 8
|
||||
}
|
||||
if carry != 0 {
|
||||
n.carry(8)
|
||||
}
|
||||
}
|
||||
|
||||
// encrypter encrypts an io.Reader on the fly
|
||||
type encrypter struct {
|
||||
in io.Reader
|
||||
|
@ -528,6 +549,17 @@ func (fh *decrypter) Read(p []byte) (n int, err error) {
|
|||
return n, nil
|
||||
}
|
||||
|
||||
// seek the decryption forwards the amount given
|
||||
//
|
||||
// returns an offset for the underlying rc to be seeked and the number
|
||||
// of bytes to be discarded
|
||||
func (fh *decrypter) seek(offset int64) (underlyingOffset int64, discard int64) {
|
||||
blocks, discard := offset/blockDataSize, offset%blockDataSize
|
||||
underlyingOffset = int64(fileHeaderSize) + blocks*(blockHeaderSize+blockDataSize)
|
||||
fh.nonce.add(uint64(blocks))
|
||||
return
|
||||
}
|
||||
|
||||
// finish sets the final error and tidies up
|
||||
func (fh *decrypter) finish(err error) error {
|
||||
if fh.err != nil {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue