...
1 package goodkey
2
3 import (
4 "crypto"
5 "crypto/sha256"
6 "encoding/base64"
7 "encoding/hex"
8 "errors"
9 "os"
10
11 "github.com/letsencrypt/boulder/core"
12 "github.com/letsencrypt/boulder/strictyaml"
13 )
14
15
16
17
18 type blockedKeys map[core.Sha256Digest]bool
19
20 var ErrWrongDecodedSize = errors.New("not enough bytes decoded for sha256 hash")
21
22
23
24
25
26
27 func (b blockedKeys) blocked(key crypto.PublicKey) (bool, error) {
28 hash, err := core.KeyDigest(key)
29 if err != nil {
30
31
32
33
34 return true, err
35 }
36 return b[hash], nil
37 }
38
39
40
41
42
43
44
45
46
47
48
49
50 func loadBlockedKeysList(filename string) (*blockedKeys, error) {
51 yamlBytes, err := os.ReadFile(filename)
52 if err != nil {
53 return nil, err
54 }
55
56 var list struct {
57 BlockedHashes []string `yaml:"blocked"`
58 BlockedHashesHex []string `yaml:"blockedHashesHex"`
59 }
60 err = strictyaml.Unmarshal(yamlBytes, &list)
61 if err != nil {
62 return nil, err
63 }
64
65 if len(list.BlockedHashes) == 0 && len(list.BlockedHashesHex) == 0 {
66 return nil, errors.New("no blocked hashes in YAML")
67 }
68
69 blockedKeys := make(blockedKeys, len(list.BlockedHashes)+len(list.BlockedHashesHex))
70 for _, b64Hash := range list.BlockedHashes {
71 decoded, err := base64.StdEncoding.DecodeString(b64Hash)
72 if err != nil {
73 return nil, err
74 }
75 if len(decoded) != sha256.Size {
76 return nil, ErrWrongDecodedSize
77 }
78 var sha256Digest core.Sha256Digest
79 copy(sha256Digest[:], decoded[0:sha256.Size])
80 blockedKeys[sha256Digest] = true
81 }
82 for _, hexHash := range list.BlockedHashesHex {
83 decoded, err := hex.DecodeString(hexHash)
84 if err != nil {
85 return nil, err
86 }
87 if len(decoded) != sha256.Size {
88 return nil, ErrWrongDecodedSize
89 }
90 var sha256Digest core.Sha256Digest
91 copy(sha256Digest[:], decoded[0:sha256.Size])
92 blockedKeys[sha256Digest] = true
93 }
94 return &blockedKeys, nil
95 }
96
View as plain text