@@ -8,13 +8,12 @@ import (
8
8
"encoding/base64"
9
9
"encoding/hex"
10
10
"encoding/json"
11
+ "errors"
11
12
"fmt"
12
13
"io"
13
14
"net/http"
14
15
"time"
15
16
16
- "github.com/pkg/errors"
17
-
18
17
"golang.org/x/crypto/bcrypt"
19
18
)
20
19
@@ -72,16 +71,9 @@ func (k *ApiKey) IsCorrect(given string) error {
72
71
73
72
// EncryptData uses the Secret to AES encrypt an arbitrary data block. It does not encrypt the key itself.
74
73
func (k * ApiKey ) EncryptData (plaintext []byte ) ([]byte , error ) {
75
- var sec []byte
76
- var err error
77
- sec , err = base64 .StdEncoding .DecodeString (k .Secret )
78
- if err != nil {
79
- sec = []byte (k .Secret )
80
- }
81
- // create cipher block with api secret as aes key
82
- block , err := aes .NewCipher (sec )
74
+ block , err := newCipherBlock (k .Secret )
83
75
if err != nil {
84
- return [] byte {} , err
76
+ return nil , err
85
77
}
86
78
87
79
// byte array to hold encrypted content
@@ -103,16 +95,9 @@ func (k *ApiKey) EncryptData(plaintext []byte) ([]byte, error) {
103
95
104
96
// DecryptData uses the Secret to AES decrypt an arbitrary data block. It does not decrypt the key itself.
105
97
func (k * ApiKey ) DecryptData (ciphertext []byte ) ([]byte , error ) {
106
- var sec []byte
107
- var err error
108
- sec , err = base64 .StdEncoding .DecodeString (k .Secret )
109
- if err != nil {
110
- sec = []byte (k .Secret )
111
- }
112
-
113
- block , err := aes .NewCipher (sec )
98
+ block , err := newCipherBlock (k .Secret )
114
99
if err != nil {
115
- return [] byte {}, errors . Wrap ( err , "failed to create new cipher" )
100
+ return nil , err
116
101
}
117
102
118
103
// plaintext must be as long as ciphertext minus the length of the IV, which is the same as the AES block size
@@ -131,16 +116,9 @@ func (k *ApiKey) DecryptData(ciphertext []byte) ([]byte, error) {
131
116
// DecryptLegacy uses the Secret to AES decrypt an arbitrary data block. This is intended only for legacy data such
132
117
// as U2F keys.
133
118
func (k * ApiKey ) DecryptLegacy (ciphertext []byte ) ([]byte , error ) {
134
- var sec []byte
135
- var err error
136
- sec , err = base64 .StdEncoding .DecodeString (k .Secret )
137
- if err != nil {
138
- sec = []byte (k .Secret )
139
- }
140
-
141
- block , err := aes .NewCipher (sec )
119
+ block , err := newCipherBlock (k .Secret )
142
120
if err != nil {
143
- return [] byte {}, errors . Wrap ( err , "failed to create new cipher" )
121
+ return nil , err
144
122
}
145
123
146
124
// data was encrypted, then base64 encoded, then joined with a :, need to split
@@ -302,3 +280,20 @@ func NewApiKey(email string) (ApiKey, error) {
302
280
}
303
281
return key , nil
304
282
}
283
+
284
+ // newCipherBlock creates a new cipher.Block from a base64-encoded AES key. If the string is not valid base64 data, it
285
+ // will be interpreted as binary data.
286
+ func newCipherBlock (key string ) (cipher.Block , error ) {
287
+ var sec []byte
288
+ var err error
289
+ sec , err = base64 .StdEncoding .DecodeString (key )
290
+ if err != nil {
291
+ sec = []byte (key )
292
+ }
293
+
294
+ block , err := aes .NewCipher (sec )
295
+ if err != nil {
296
+ return nil , fmt .Errorf ("failed to create new cipher: %w" , err )
297
+ }
298
+ return block , nil
299
+ }
0 commit comments