delegations.go 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. package client
  2. import (
  3. "github.com/DataDog/go-tuf/data"
  4. "github.com/DataDog/go-tuf/pkg/targets"
  5. "github.com/DataDog/go-tuf/verify"
  6. )
  7. // getTargetFileMeta searches for a verified TargetFileMeta matching a target
  8. // Requires a local snapshot to be loaded and is locked to the snapshot versions.
  9. // Searches through delegated targets following TUF spec 1.0.19 section 5.6.
  10. func (c *Client) getTargetFileMeta(target string) (data.TargetFileMeta, error) {
  11. snapshot, err := c.loadLocalSnapshot()
  12. if err != nil {
  13. return data.TargetFileMeta{}, err
  14. }
  15. // delegationsIterator covers 5.6.7
  16. // - pre-order depth-first search starting with the top targets
  17. // - filter delegations with paths or path_hash_prefixes matching searched target
  18. // - 5.6.7.1 cycles protection
  19. // - 5.6.7.2 terminations
  20. delegations, err := targets.NewDelegationsIterator(target, c.db)
  21. if err != nil {
  22. return data.TargetFileMeta{}, err
  23. }
  24. for i := 0; i < c.MaxDelegations; i++ {
  25. d, ok := delegations.Next()
  26. if !ok {
  27. return data.TargetFileMeta{}, ErrUnknownTarget{target, snapshot.Version}
  28. }
  29. // covers 5.6.{1,2,3,4,5,6}
  30. targets, err := c.loadDelegatedTargets(snapshot, d.Delegatee.Name, d.DB)
  31. if err != nil {
  32. return data.TargetFileMeta{}, err
  33. }
  34. // stop when the searched TargetFileMeta is found
  35. if m, ok := targets.Targets[target]; ok {
  36. return m, nil
  37. }
  38. if targets.Delegations != nil {
  39. delegationsDB, err := verify.NewDBFromDelegations(targets.Delegations)
  40. if err != nil {
  41. return data.TargetFileMeta{}, err
  42. }
  43. err = delegations.Add(targets.Delegations.Roles, d.Delegatee.Name, delegationsDB)
  44. if err != nil {
  45. return data.TargetFileMeta{}, err
  46. }
  47. }
  48. }
  49. return data.TargetFileMeta{}, ErrMaxDelegations{
  50. Target: target,
  51. MaxDelegations: c.MaxDelegations,
  52. SnapshotVersion: snapshot.Version,
  53. }
  54. }
  55. func (c *Client) loadLocalSnapshot() (*data.Snapshot, error) {
  56. if err := c.getLocalMeta(); err != nil {
  57. return nil, err
  58. }
  59. rawS, ok := c.localMeta["snapshot.json"]
  60. if !ok {
  61. return nil, ErrNoLocalSnapshot
  62. }
  63. snapshot := &data.Snapshot{}
  64. if err := c.db.Unmarshal(rawS, snapshot, "snapshot", c.snapshotVer); err != nil {
  65. return nil, ErrDecodeFailed{"snapshot.json", err}
  66. }
  67. return snapshot, nil
  68. }
  69. // loadDelegatedTargets downloads, decodes, verifies and stores targets
  70. func (c *Client) loadDelegatedTargets(snapshot *data.Snapshot, role string, db *verify.DB) (*data.Targets, error) {
  71. var err error
  72. fileName := role + ".json"
  73. fileMeta, ok := snapshot.Meta[fileName]
  74. if !ok {
  75. return nil, ErrRoleNotInSnapshot{role, snapshot.Version}
  76. }
  77. // 5.6.1 download target if not in the local store
  78. // 5.6.2 check against snapshot hash
  79. // 5.6.4 check against snapshot version
  80. raw, alreadyStored := c.localMetaFromSnapshot(fileName, fileMeta)
  81. if !alreadyStored {
  82. raw, err = c.downloadMetaFromSnapshot(fileName, fileMeta)
  83. if err != nil {
  84. return nil, err
  85. }
  86. }
  87. targets := &data.Targets{}
  88. // 5.6.3 verify signature with parent public keys
  89. // 5.6.5 verify that the targets is not expired
  90. // role "targets" is a top role verified by root keys loaded in the client db
  91. err = db.Unmarshal(raw, targets, role, fileMeta.Version)
  92. if err != nil {
  93. return nil, ErrDecodeFailed{fileName, err}
  94. }
  95. // 5.6.6 persist
  96. if !alreadyStored {
  97. if err := c.local.SetMeta(fileName, raw); err != nil {
  98. return nil, err
  99. }
  100. }
  101. return targets, nil
  102. }