db.go 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. package verify
  2. import (
  3. "github.com/DataDog/go-tuf/data"
  4. "github.com/DataDog/go-tuf/internal/roles"
  5. "github.com/DataDog/go-tuf/pkg/keys"
  6. )
  7. type Role struct {
  8. KeyIDs map[string]struct{}
  9. Threshold int
  10. }
  11. func (r *Role) ValidKey(id string) bool {
  12. _, ok := r.KeyIDs[id]
  13. return ok
  14. }
  15. type DB struct {
  16. roles map[string]*Role
  17. verifiers map[string]keys.Verifier
  18. }
  19. func NewDB() *DB {
  20. return &DB{
  21. roles: make(map[string]*Role),
  22. verifiers: make(map[string]keys.Verifier),
  23. }
  24. }
  25. // NewDBFromDelegations returns a DB that verifies delegations
  26. // of a given Targets.
  27. func NewDBFromDelegations(d *data.Delegations) (*DB, error) {
  28. db := &DB{
  29. roles: make(map[string]*Role, len(d.Roles)),
  30. verifiers: make(map[string]keys.Verifier, len(d.Keys)),
  31. }
  32. for _, r := range d.Roles {
  33. if _, ok := roles.TopLevelRoles[r.Name]; ok {
  34. return nil, ErrInvalidDelegatedRole
  35. }
  36. role := &data.Role{Threshold: r.Threshold, KeyIDs: r.KeyIDs}
  37. if err := db.AddRole(r.Name, role); err != nil {
  38. return nil, err
  39. }
  40. }
  41. for id, k := range d.Keys {
  42. if err := db.AddKey(id, k); err != nil {
  43. return nil, err
  44. }
  45. }
  46. return db, nil
  47. }
  48. func (db *DB) AddKey(id string, k *data.PublicKey) error {
  49. if !k.ContainsID(id) {
  50. return ErrWrongID{}
  51. }
  52. verifier, err := keys.GetVerifier(k)
  53. if err != nil {
  54. return ErrInvalidKey
  55. }
  56. db.verifiers[id] = verifier
  57. return nil
  58. }
  59. func (db *DB) AddRole(name string, r *data.Role) error {
  60. if r.Threshold < 1 {
  61. return ErrInvalidThreshold
  62. }
  63. role := &Role{
  64. KeyIDs: make(map[string]struct{}),
  65. Threshold: r.Threshold,
  66. }
  67. for _, id := range r.KeyIDs {
  68. if len(id) != data.KeyIDLength {
  69. return ErrInvalidKeyID
  70. }
  71. role.KeyIDs[id] = struct{}{}
  72. }
  73. db.roles[name] = role
  74. return nil
  75. }
  76. func (db *DB) GetVerifier(id string) (keys.Verifier, error) {
  77. k, ok := db.verifiers[id]
  78. if !ok {
  79. return nil, ErrMissingKey
  80. }
  81. return k, nil
  82. }
  83. func (db *DB) GetRole(name string) *Role {
  84. return db.roles[name]
  85. }