Skip to content

Commit afab1a7

Browse files
committed
Add slightly nicer error handling
1 parent 8b8fb5e commit afab1a7

File tree

2 files changed

+30
-17
lines changed

2 files changed

+30
-17
lines changed

cmd/tkey-verification/remotesign.go

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,14 @@ import (
1717
func remoteSign(server Server, appBin AppBin, devPath string, firmwares Firmwares, verbose bool) {
1818
udi, pubKey, fw, err := signChallenge(devPath, appBin, firmwares, verbose)
1919
if err != nil {
20-
le.Printf("Couldn't sign challenge: %s", err)
20+
le.Printf("Couldn't sign challenge: %s\n", err)
2121
os.Exit(1)
2222
}
2323

2424
err = vendorSign(server, udi.Bytes, pubKey, fw, appBin)
2525
if err != nil {
26+
le.Printf("Couldn't get a vendor signature: %s\n", err)
27+
os.Exit(1)
2628
}
2729

2830
le.Printf("Remote Sign was successful\n")
@@ -33,15 +35,15 @@ func signChallenge(devPath string, appBin AppBin, firmwares Firmwares, verbose b
3335
var fw Firmware
3436
tk, err := tkey.NewTKey(devPath, verbose)
3537
if err != nil {
36-
return nil, nil, fw, fmt.Errorf("Couldn't connect to TKey: %v", err)
38+
return nil, nil, fw, fmt.Errorf("%w", err)
3739
}
3840

3941
defer tk.Close()
4042

4143
le.Printf("Loading device app built from %s ...\n", appBin.String())
4244
pubKey, err := tk.LoadSigner(appBin.Bin)
4345
if err != nil {
44-
return nil, nil, fw, fmt.Errorf("couldn't load device app: %w", err)
46+
return nil, nil, fw, fmt.Errorf("%w", err)
4547
}
4648
le.Printf("TKey UDI: %s\n", tk.Udi.String())
4749

@@ -52,26 +54,26 @@ func signChallenge(devPath string, appBin AppBin, firmwares Firmwares, verbose b
5254

5355
fw, err = verifyFirmwareHash(*expectfw, *tk, pubKey)
5456
if err != nil {
55-
return nil, nil, fw, fmt.Errorf("verifyFirmwareHash failed: %w", err)
57+
return nil, nil, fw, fmt.Errorf("%w", err)
5658
}
5759
le.Printf("TKey firmware with size:%d and verified hash:%0x…\n", fw.Size, fw.Hash[:16])
5860

5961
// Locally generate a challenge and sign it
6062
challenge := make([]byte, 32)
6163
if _, err = rand.Read(challenge); err != nil {
62-
return nil, nil, fw, fmt.Errorf("rand.Read failed: %w", err)
64+
return nil, nil, fw, fmt.Errorf("%w", err)
6365
}
6466

6567
signature, err := tk.Sign(challenge)
6668
if err != nil {
67-
return nil, nil, fw, fmt.Errorf("tkey.Sign failed: %w", err)
69+
return nil, nil, fw, fmt.Errorf("%w", err)
6870
}
6971

7072
fmt.Printf("signature: %x\n", signature)
7173

7274
// Verify the signature against the extracted public key
7375
if !ed25519.Verify(pubKey, challenge, signature) {
74-
return nil, nil, fw, fmt.Errorf("device signature failed verification!")
76+
return nil, nil, fw, fmt.Errorf("device signature failed verification")
7577
}
7678

7779
return &tk.Udi, pubKey, fw, nil

internal/tkey/tkey.go

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,17 @@ const (
3838
wantAppName1 = "sign"
3939
)
4040

41+
type constError string
42+
43+
func (err constError) Error() string {
44+
return string(err)
45+
}
46+
47+
const (
48+
ErrNoDevice = constError("no TKey connected")
49+
ErrNotFirmware = constError("not firmware")
50+
)
51+
4152
var le = log.New(os.Stderr, "", 0)
4253

4354
type TKey struct {
@@ -57,34 +68,34 @@ func NewTKey(devPath string, verbose bool) (*TKey, error) {
5768
if devPath == "" {
5869
devPath, err = util.DetectSerialPort(true)
5970
if err != nil {
60-
return nil, fmt.Errorf("no device")
71+
return nil, ErrNoDevice
6172
}
6273
}
6374

6475
tk := tkeyclient.New()
6576
le.Printf("Connecting to device on serial port %s ...\n", devPath)
6677
if err := tk.Connect(devPath); err != nil {
67-
return nil, fmt.Errorf("couldn't open device %s: %w\n", devPath, err)
78+
return nil, fmt.Errorf("couldn't open device %s: %w", devPath, err)
6879
}
6980

7081
nameVer, err := tk.GetNameVersion()
7182
if err != nil {
7283
le.Printf("Please unplug the TKey and plug it in again to put it in firmware-mode.\n")
7384
le.Printf("Either the device path (%s) is wrong, or the TKey is not in firmware-mode (already running an app).\n", devPath)
74-
return nil, fmt.Errorf("not firmware")
85+
return nil, ErrNotFirmware
7586
}
7687
le.Printf("Firmware name0:'%s' name1:'%s' version:%d\n",
7788
nameVer.Name0, nameVer.Name1, nameVer.Version)
7889

7990
tkUDI, err := tk.GetUDI()
8091
if err != nil {
81-
return nil, fmt.Errorf("GetUDI failed: %w\n", err)
92+
return nil, fmt.Errorf("GetUDI failed: %w", err)
8293
}
8394

8495
var udi UDI
8596

8697
if err = udi.fromRawLE(tkUDI.RawBytes()); err != nil {
87-
return nil, fmt.Errorf("UDI fromRawLE failed: %w\n", err)
98+
return nil, fmt.Errorf("UDI fromRawLE failed: %w", err)
8899
}
89100

90101
tkey := TKey{
@@ -114,7 +125,7 @@ func (t *TKey) LoadSigner(bin []byte) ([]byte, error) {
114125

115126
// No USS.
116127
if err = t.client.LoadApp(bin, []byte{}); err != nil {
117-
return nil, fmt.Errorf("Failed to load app: %w\n", err)
128+
return nil, fmt.Errorf("%w", err)
118129
}
119130
if t.verbose {
120131
le.Printf("App loaded.\n")
@@ -124,7 +135,7 @@ func (t *TKey) LoadSigner(bin []byte) ([]byte, error) {
124135

125136
nameVer, err := t.signer.GetAppNameVersion()
126137
if err != nil {
127-
return nil, fmt.Errorf("GetAppNameVersion: %w\n", err)
138+
return nil, fmt.Errorf("%w", err)
128139
}
129140

130141
if t.verbose {
@@ -140,7 +151,7 @@ func (t *TKey) LoadSigner(bin []byte) ([]byte, error) {
140151

141152
pubKey, err := t.signer.GetPubkey()
142153
if err != nil {
143-
return nil, fmt.Errorf("GetPubKey failed: %w\n", err)
154+
return nil, fmt.Errorf("%w", err)
144155
}
145156

146157
return pubKey, nil
@@ -152,7 +163,7 @@ func (t *TKey) LoadSigner(bin []byte) ([]byte, error) {
152163
func (t TKey) Sign(message []byte) ([]byte, error) {
153164
signature, err := t.signer.Sign(message)
154165
if err != nil {
155-
return nil, fmt.Errorf("Sign failed: %w", err)
166+
return nil, fmt.Errorf("%w", err)
156167
}
157168

158169
return signature, nil
@@ -163,7 +174,7 @@ func (t TKey) Sign(message []byte) ([]byte, error) {
163174
func (t TKey) GetFirmwareHash(firmwareSize int) ([]byte, error) {
164175
fwHash, err := t.signer.GetFWDigest(firmwareSize)
165176
if err != nil {
166-
return nil, fmt.Errorf("GetFirmwareHash failed: %w", err)
177+
return nil, fmt.Errorf("%w", err)
167178
}
168179

169180
return fwHash, nil

0 commit comments

Comments
 (0)