What version of Go are you using (go version)?
$ go version
go version go1.15 windows/amd64
Does this issue reproduce with the latest release?
Yes, any version, any OS, any CPU.
What did you do?
I need to do AES GCM with both a custom nonce and a custom tag size - 16 and 12 bytes, respectively (the standard is 12 and 16).
The crypto API offers only NewGCMWithNonceSize and NewGCMWithTagSize public API's for creating a cipher with either a custom nonce or a custom tag size, but not both.
I see no technical reason for this limitation given there is a private API that does just that - newGCMWithNonceAndTagSize.
I had no problems doing this in Java and PHP and it's not feasible to change our production encryption because of the Go public API limitation.
What did you expect to see?
I expect the Go public API to allow AES GCM encryption with custom nonce and tag sizes.
What did you see instead?
Instead I'm forced to hack Go and invoke a private API like this
//go:linkname newGCMWithNonceAndTagSize crypto/cipher.newGCMWithNonceAndTagSize
func newGCMWithNonceAndTagSize(cipher cipher.Block, nonceSize, tagSize int) (cipher.AEAD, error)
func Encrypt(s string, key []byte) (string, error) {
c, err := aes.NewCipher(key)
if err != nil {
return "", err
}
gcm, err := newGCMWithNonceAndTagSize(c, 16, 12)
. . .
Works like a charm, but I'd rather use public API's instead.
What version of Go are you using (
go version)?Does this issue reproduce with the latest release?
Yes, any version, any OS, any CPU.
What did you do?
I need to do AES GCM with both a custom nonce and a custom tag size - 16 and 12 bytes, respectively (the standard is 12 and 16).
The crypto API offers only NewGCMWithNonceSize and NewGCMWithTagSize public API's for creating a cipher with either a custom nonce or a custom tag size, but not both.
I see no technical reason for this limitation given there is a private API that does just that -
newGCMWithNonceAndTagSize.I had no problems doing this in Java and PHP and it's not feasible to change our production encryption because of the Go public API limitation.
What did you expect to see?
I expect the Go public API to allow AES GCM encryption with custom nonce and tag sizes.
What did you see instead?
Instead I'm forced to hack Go and invoke a private API like this
Works like a charm, but I'd rather use public API's instead.