lens @ c8e1328164e9ffbd681c3c0e449f1e6b9856b896

 1package ext
 2
 3import (
 4	"bytes"
 5	"crypto/aes"
 6	"crypto/cipher"
 7	"crypto/rand"
 8	"encoding/gob"
 9	"fmt"
10	"io"
11)
12
13type Token struct {
14	UserID   uint
15	Username string
16}
17
18var nonce []byte
19
20func init() {
21	nonce = make([]byte, 12)
22	if _, err := io.ReadFull(rand.Reader, nonce); err != nil {
23		fmt.Println("Erro while generating nonce " + err.Error())
24		panic(1)
25	}
26}
27
28func ReadToken(data []byte, key []byte) (*Token, error) {
29	block, err := aes.NewCipher(key)
30	if err != nil {
31		return nil, err
32	}
33
34	aesgcm, err := cipher.NewGCM(block)
35	if err != nil {
36		panic(err.Error())
37	}
38
39	plaintext, err := aesgcm.Open(nil, nonce, data, nil)
40	if err != nil {
41		return nil, err
42	}
43
44	r := bytes.NewReader(plaintext)
45	var token Token
46	dec := gob.NewDecoder(r)
47	if err = dec.Decode(&token); err != nil {
48		return nil, err
49	}
50	return &token, nil
51}
52
53func WriteToken(token *Token, key []byte) ([]byte, error) {
54	block, err := aes.NewCipher(key)
55	if err != nil {
56		return nil, err
57	}
58
59	aesgcm, err := cipher.NewGCM(block)
60	if err != nil {
61		return nil, err
62	}
63
64	var buffer bytes.Buffer
65	enc := gob.NewEncoder(&buffer)
66	if err := enc.Encode(token); err != nil {
67		return nil, err
68	}
69
70	ciphertext := aesgcm.Seal(nil, nonce, buffer.Bytes(), nil)
71	return ciphertext, nil
72}