package ext import ( "bytes" "crypto/aes" "crypto/cipher" "crypto/rand" "encoding/gob" "fmt" "io" ) type Token struct { UserID uint Username string } var nonce []byte func init() { nonce = make([]byte, 12) if _, err := io.ReadFull(rand.Reader, nonce); err != nil { fmt.Println("Erro while generating nonce " + err.Error()) panic(1) } } func ReadToken(data []byte, key []byte) (*Token, error) { block, err := aes.NewCipher(key) if err != nil { return nil, err } aesgcm, err := cipher.NewGCM(block) if err != nil { panic(err.Error()) } plaintext, err := aesgcm.Open(nil, nonce, data, nil) if err != nil { return nil, err } r := bytes.NewReader(plaintext) var token Token dec := gob.NewDecoder(r) if err = dec.Decode(&token); err != nil { return nil, err } return &token, nil } func WriteToken(token *Token, key []byte) ([]byte, error) { block, err := aes.NewCipher(key) if err != nil { return nil, err } aesgcm, err := cipher.NewGCM(block) if err != nil { return nil, err } var buffer bytes.Buffer enc := gob.NewEncoder(&buffer) if err := enc.Encode(token); err != nil { return nil, err } ciphertext := aesgcm.Seal(nil, nonce, buffer.Bytes(), nil) return ciphertext, nil }