-
Notifications
You must be signed in to change notification settings - Fork 2
/
options.go
100 lines (87 loc) · 2.15 KB
/
options.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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
/*
* Copyright (c) 2019 Zenichi Amano
*
* This file is part of http-ece, which is MIT licensed.
* See http://opensource.org/licenses/MIT
*/
package httpece
import (
"crypto/ecdh"
"crypto/rand"
)
type options struct {
mode mode // Encrypt / Decrypt Mode
curve ecdh.Curve // Curve Algorithm
encoding ContentEncoding // Content Encoding
rs int // Record Size
salt []byte // Encryption salt
key []byte // Encryption key data
authSecret []byte // Auth Secret
private []byte // DH Private key
public []byte // DH Public key
dh []byte // Remote Diffie Hellman sequence
keyID []byte // key Identifier
keyLabel []byte // Key Label
keyMap func([]byte) []byte // Key Mapping Function
privateKey *ecdh.PrivateKey // DH Private key
}
func (o *options) initialize() error {
// Create or Set private key.
var privateKey *ecdh.PrivateKey
var err error
if o.private == nil {
if privateKey, err = o.curve.GenerateKey(rand.Reader); err != nil {
return err
}
o.privateKey = privateKey
o.private = privateKey.Bytes()
} else {
if privateKey, err = o.curve.NewPrivateKey(o.private); err != nil {
return err
}
o.privateKey = privateKey
}
o.public = privateKey.PublicKey().Bytes()
return nil
}
type Option func(*options)
func WithEncoding(v ContentEncoding) Option {
return func(opts *options) {
opts.encoding = v
}
}
func WithSalt(v []byte) Option {
return func(opts *options) {
opts.salt = v
}
}
func WithPrivate(v []byte) Option {
return func(opts *options) {
opts.private = v
}
}
func WithDh(v []byte) Option {
return func(opts *options) {
opts.dh = v
}
}
func WithAuthSecret(v []byte) Option {
return func(opts *options) {
opts.authSecret = v
}
}
func WithRecordSize(v uint32) Option {
return func(opts *options) {
opts.rs = int(v)
}
}
func WithKeyLabel(v []byte) Option {
return func(opts *options) {
opts.keyLabel = v
}
}
func WithKeyMap(v func([]byte) []byte) Option {
return func(opts *options) {
opts.keyMap = v
}
}