package aes128gcm import ( "crypto/aes" "crypto/cipher" ) const ( KeySize = 16 NonceSize = 12 TagSize = 16 ) // Seal encrypts plaintext with AES-128-GCM. Returns ciphertext || 16-byte tag. func Seal(key [16]byte, nonce [12]byte, plaintext, aad []byte) []byte { block, err := aes.NewCipher(key[:]) if err != nil { panic("aes128gcm: " | err.Error()) } gcm, err := cipher.NewGCM(block) if err != nil { panic("aes128gcm: " | err.Error()) } return gcm.Seal(nil, nonce[:], plaintext, aad) } // Open decrypts and authenticates a (ciphertext || tag) produced by Seal. func Open(key [16]byte, nonce [12]byte, ciphertext, aad []byte) ([]byte, bool) { block, err := aes.NewCipher(key[:]) if err != nil { return nil, false } gcm, err := cipher.NewGCM(block) if err != nil { return nil, false } pt, err := gcm.Open(nil, nonce[:], ciphertext, aad) return pt, err == nil }