31 lines
726 B
Go
31 lines
726 B
Go
// Copyright (C) 2018 Storj Labs, Inc.
|
|
// See LICENSE for copying information.
|
|
|
|
package encryption
|
|
|
|
// incrementBytes takes a byte slice buf and treats it like a little-endian
|
|
// encoded unsigned integer. it adds amount to it (which must be nonnegative)
|
|
// in place. if rollover happens (the most significant bytes don't fit
|
|
// anymore), truncated is true.
|
|
func incrementBytes(buf []byte, amount int64) (truncated bool, err error) {
|
|
if amount < 0 {
|
|
return false, Error.New("amount was negative")
|
|
}
|
|
|
|
idx := 0
|
|
for amount > 0 && idx < len(buf) {
|
|
var inc, prev byte
|
|
inc, amount = byte(amount), amount>>8
|
|
|
|
prev = buf[idx]
|
|
buf[idx] += inc
|
|
if buf[idx] < prev {
|
|
amount++
|
|
}
|
|
|
|
idx++
|
|
}
|
|
|
|
return amount != 0, nil
|
|
}
|