The docs for secretbox.Seal
<https://pkg.go.dev/golang.org/x/crypto/nacl/secretbox> say:
func Seal(out, message []byte, nonce *[24]byte, key *[32]byte) []byte
Seal appends an encrypted and authenticated copy of message to out, which
must not overlap message. The key and nonce pair must be unique for each
distinct message and the output will be Overhead bytes longer than message.
Using their example code below I find that
the first argument out is unchanged
the return value is len(nonce) + Overhead longer than the input message,
not Overhead longer
It's not clear what the first argument to Seal does. Nothing is appended
to it and it is not changed, but it has to be there. Does it have to be
the nonce[:]?
Likewise the docs for Open say
func Open(out, box []byte, nonce *[24]byte, key *[32]byte) ([]byte, bool)
Open authenticates and decrypts a box produced by Seal and appends the
message to out, which must not overlap box. The output will be Overhead
bytes smaller than box.
In their example code the out parameter is nil. So what does it do? The
second argument is encrypted[len(nonce):] which includes the Overhead at
the start of the []byte. Apparently that Overhead is important.
The docs seem wildly wrong.
Here's code based on their example:
func main() {
secretKeyBytes, err :=
hex.DecodeString("6368616e676520746869732070617373776f726420746f206120736563726574")
if err != nil {
panic(err)
}
var secretKey [32]byte
copy(secretKey[:], secretKeyBytes)
var nonce [24]byte
if _, err := io.ReadFull(rand.Reader, nonce[:]); err != nil {
panic(err)
}
nonceOrig := nonce
fmt.Printf("len(nonce): %v\n", len(nonce))
s := "hello world"
encrypted := secretbox.Seal(nonce[:], []byte(s), &nonce, &secretKey)
fmt.Printf("len(nonce): %v\n", len(nonce))
fmt.Printf("len(s): %v\n", len(s))
fmt.Printf("len(encrypted): %v\n", len(encrypted))
if !reflect.DeepEqual(nonceOrig, nonce) {
fmt.Println("nonce changed")
}
var decryptNonce [24]byte
copy(decryptNonce[:], encrypted[:24])
if !reflect.DeepEqual(decryptNonce, nonce) {
fmt.Println("decryptNonce, nonce differ")
}
decrypted, ok := secretbox.Open(nil, encrypted[24:], &decryptNonce,
&secretKey)
if !ok {
panic("decryption error")
}
fmt.Println(string(decrypted))
encrypted2 := secretbox.Seal([]byte{}, []byte(s), &nonce, &secretKey)
copy(decryptNonce[:], encrypted2[:24])
decrypted2, ok := secretbox.Open(nil, encrypted2[24:], &decryptNonce,
&secretKey)
if !ok {
fmt.Printf("decryption error 2: %v\n", decrypted2)
//panic("decryption error 2")
}
fmt.Printf("decrypted2: %v\n", decrypted2)
encrypted3 := secretbox.Seal(nil, []byte(s), &nonce, &secretKey)
decrypted3, ok := secretbox.Open(nil, encrypted3[24:], &nonce, &secretKey)
if !ok {
fmt.Printf("decryption error 3: %v\n", decrypted3)
}
fmt.Printf("decrypted3: %v\n", decrypted3)
}
--
You received this message because you are subscribed to the Google Groups
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/golang-nuts/5d31760e-59ec-4c4e-af11-c4826ae5560cn%40googlegroups.com.