/
encrypt_card.go
85 lines (69 loc) · 1.6 KB
/
encrypt_card.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
// Copyright (c) 2019 Leonardo Faoro. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package vault
import (
"bytes"
"encoding/gob"
"github.com/pkg/errors"
pb "github.com/lfaoro/spark/proto/api/vault"
)
func (s Server) encryptCard(data *pb.PutCardRequest) ([]byte, error) {
ec, err := encodeCard(data)
if err != nil {
return nil, err
}
ciphertext, err := s.kms.Encrypt(ec)
if err != nil {
return nil, err
}
return ciphertext, nil
}
func (s Server) decryptCard(data []byte) (*pb.GetCardResponse, error) {
plaintext, err := s.kms.Decrypt(data)
if err != nil {
return nil, err
}
vc, err := decodeCard(plaintext)
if err != nil {
return nil, err
}
return vc, err
}
type cardData struct {
Holder string
Number string
ExpYear uint32
ExpMonth uint32
CVC uint32
}
func encodeCard(card *pb.PutCardRequest) ([]byte, error) {
cd := cardData{
Number: card.Number,
ExpYear: card.ExpYear,
ExpMonth: card.ExpMonth,
CVC: card.Cvc,
}
data := bytes.Buffer{}
err := gob.NewEncoder(&data).Encode(cd)
if err != nil {
return nil, errors.Wrap(err, "failed to encode cardData")
}
return data.Bytes(), nil
}
func decodeCard(card []byte) (*pb.GetCardResponse, error) {
cd := &cardData{}
data := bytes.NewReader(card)
err := gob.NewDecoder(data).Decode(cd)
if err != nil {
return nil, errors.Wrap(err, "failed to decode cardData")
}
vc := &pb.GetCardResponse{
Holder: cd.Holder,
Number: cd.Number,
ExpMonth: cd.ExpMonth,
ExpYear: cd.ExpYear,
Cvc: cd.CVC,
}
return vc, nil
}