Skip to content

Commit 885ff98

Browse files
Fix order in which fingerprints are evaluated (#415)
* Fix order in which fingerprints are evaluated this needs to be done on the key generated from the provider, not at the start * need to base32 encode instead of base64 * fix when .keyid doesn't exist * fix error handling --------- Co-authored-by: Lukasz Zajaczkowski <zreigz@gmail.com>
1 parent 0ba4a99 commit 885ff98

5 files changed

Lines changed: 35 additions & 25 deletions

File tree

cmd/plural/crypto.go

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -334,12 +334,16 @@ func handleUnlock(c *cli.Context) error {
334334
return err
335335
}
336336

337-
gitIndex, _ := filepath.Abs(filepath.Join(repoRoot, ".git", "index"))
338-
dump, err := os.CreateTemp("", "index.bak")
337+
// fixes Invalid cross-device link when using os.Rename
338+
gitIndexDir, err := filepath.Abs(filepath.Join(repoRoot, ".git"))
339+
if err != nil {
340+
return err
341+
}
342+
gitIndex := filepath.Join(gitIndexDir, "index")
343+
dump, err := os.CreateTemp(gitIndexDir, "index.bak")
339344
if err != nil {
340345
return err
341346
}
342-
343347
if err := os.Rename(gitIndex, dump.Name()); err != nil {
344348
return err
345349
}

pkg/crypto/config.go

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package crypto
22

33
import (
4-
"fmt"
54
"os"
65
"path/filepath"
76

@@ -33,44 +32,45 @@ func ReadConfig() (conf *Config, err error) {
3332
return
3433
}
3534

36-
func Build() (Provider, error) {
35+
func Build() (prov Provider, err error) {
3736
key, err := Materialize()
3837
if err != nil {
39-
return nil, err
38+
return
4039
}
4140
keyID, err := GetKeyID()
4241
if err != nil {
43-
return nil, err
42+
return
4443
}
4544

46-
if err := validateKey(keyID, key); err != nil {
47-
return nil, err
45+
prov, err = fallbackProvider(key)
46+
if err != nil {
47+
return
4848
}
49-
5049
if utils.Exists(configPath()) {
51-
conf, err := ReadConfig()
50+
var conf *Config
51+
conf, err = ReadConfig()
5252
if err != nil {
5353
return fallbackProvider(key)
5454
}
5555

5656
switch conf.Type {
5757
case KEY:
58-
return buildKeyProvider(conf, key)
58+
prov, err = buildKeyProvider(conf, key)
5959
case AGE:
60-
return BuildAgeProvider()
60+
prov, err = BuildAgeProvider()
61+
}
62+
if err != nil {
63+
return
6164
}
6265
}
6366

64-
return fallbackProvider(key)
67+
if keyID != "" && prov.ID() != keyID {
68+
err = errFingerprint
69+
}
70+
71+
return
6572
}
6673

6774
func fallbackProvider(key *AESKey) (*KeyProvider, error) {
6875
return &KeyProvider{key: key.Key}, nil
6976
}
70-
71-
func validateKey(keyID string, key *AESKey) error {
72-
if keyID != "" && key.ID() != keyID {
73-
return fmt.Errorf("the key fingerprint doesn't match")
74-
}
75-
return nil
76-
}

pkg/crypto/config_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,14 @@ func TestBuild(t *testing.T) {
2121
{
2222
name: `when faulty config exists create default fallbackProvider`,
2323
keyContent: "key: abc",
24-
expected: "SHA256:ungWv48Bz+pBQUDeXa4iI7ADYaOWF3qctBD/YfIAFa0=",
24+
expected: "SHA256:XJ4BNP4PAHH6UQKBIDPF3LRCEOYAGYNDSYLXVHFUCD7WD4QACWWQ====",
2525
genConfig: true,
2626
},
2727
{
2828
name: `when config doesn't exist create default fallbackProvider`,
2929
genConfig: false,
3030
keyContent: "key: abc",
31-
expected: "SHA256:ungWv48Bz+pBQUDeXa4iI7ADYaOWF3qctBD/YfIAFa0=",
31+
expected: "SHA256:XJ4BNP4PAHH6UQKBIDPF3LRCEOYAGYNDSYLXVHFUCD7WD4QACWWQ====",
3232
},
3333
}
3434
for _, test := range tests {

pkg/crypto/errors.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package crypto
2+
3+
import "fmt"
4+
5+
var (
6+
errFingerprint = fmt.Errorf("The fingerprint of your encryption key does not match this repos key, we cannot safely decrypt")
7+
)

pkg/crypto/key.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ func (prov *KeyProvider) SymmetricKey() ([]byte, error) {
3131

3232
func (prov *KeyProvider) ID() string {
3333
sha := sha256.Sum256([]byte(prov.key))
34-
return "SHA256:" + base64.StdEncoding.EncodeToString(sha[:])
34+
return "SHA256:" + base32.StdEncoding.EncodeToString(sha[:])
3535
}
3636

3737
func (prov *KeyProvider) Marshall() ([]byte, error) {
@@ -172,7 +172,6 @@ func GetKeyID() (string, error) {
172172
return "", err
173173
}
174174
return k.KeyID, nil
175-
176175
}
177176

178177
func CreateKeyFingerprintFile() error {

0 commit comments

Comments
 (0)