-
Notifications
You must be signed in to change notification settings - Fork 20
/
register.go
63 lines (56 loc) · 1.8 KB
/
register.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
package u2fhost
import (
"encoding/json"
"fmt"
butil "github.com/marshallbrekka/go-u2fhost/bytes"
)
// Registers with the device using the RegisterRequest, returning a RegisterResponse.
func (dev *HidDevice) Register(req *RegisterRequest) (*RegisterResponse, error) {
clientData, request, err := registerRequest(req)
if err != nil {
return nil, err
}
var p1 uint8 = 0x03
var p2 uint8 = 0
status, response, err := dev.hidDevice.SendAPDU(u2fCommandRegister, p1, p2, request)
return registerResponse(status, response, clientData, err)
}
func registerRequest(req *RegisterRequest) ([]byte, []byte, error) {
// Get the channel id public key, if any
cid, err := channelIdPublicKey(req.ChannelIdPublicKey, req.ChannelIdUnused)
if err != nil {
return nil, nil, err
}
// Construct the client json
client := clientData{
Typ: "navigator.id.finishEnrollment",
Challenge: req.Challenge,
Origin: req.Facet,
ChannelIdPublicKey: cid,
}
clientJson, err := json.Marshal(client)
if err != nil {
return nil, nil, fmt.Errorf("Error marshaling clientData to json: %s", err)
}
// Pack into byte array
// https://fidoalliance.org/specs/fido-u2f-v1.0-nfc-bt-amendment-20150514/fido-u2f-raw-message-formats.html#registration-request-message---u2f_register
request := butil.Concat(
sha256(clientJson),
sha256([]byte(req.AppId)),
)
return []byte(clientJson), request, nil
}
func registerResponse(status uint16, response, clientData []byte, err error) (*RegisterResponse, error) {
var registerResponse *RegisterResponse
if err == nil {
if status == u2fStatusNoError {
registerResponse = &RegisterResponse{
RegistrationData: websafeEncode(response),
ClientData: websafeEncode(clientData),
}
} else {
err = u2ferror(status)
}
}
return registerResponse, err
}