| // Copyright 2019 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| package repo |
| |
| import ( |
| "encoding/json" |
| "reflect" |
| "sort" |
| "testing" |
| |
| tuf_data "github.com/theupdateframework/go-tuf/data" |
| ) |
| |
| func TestMarshaling(t *testing.T) { |
| goldenCfg := Config{ |
| URL: "fuchsia-pkg://example.com", |
| RootKeys: []KeyConfig{ |
| { |
| ED25519Key: "8e70ed31f117087a08ad23e00c2e1c353bf76fc0e0ac1aac334336e2b83ee7f4", |
| }, |
| }, |
| Mirrors: []MirrorConfig{{ |
| URL: "https://example.com/repo", |
| Subscribe: true, |
| }}, |
| RootVersion: 1, |
| RootThreshold: 1, |
| } |
| |
| cfgStr := ` |
| { |
| "repo_url": "fuchsia-pkg://example.com", |
| "root_keys": [ |
| { |
| "type": "ed25519", |
| "value": "8e70ed31f117087a08ad23e00c2e1c353bf76fc0e0ac1aac334336e2b83ee7f4" |
| } |
| ], |
| "mirrors": [ |
| { |
| "mirror_url": "https://example.com/repo", |
| "subscribe": true |
| } |
| ] |
| }` |
| |
| var cfg Config |
| if err := json.Unmarshal([]byte(cfgStr), &cfg); err != nil { |
| t.Fatalf("could not unmarshal golden config string: %v", err) |
| } |
| |
| if !reflect.DeepEqual(cfg, goldenCfg) { |
| t.Fatalf("expected\n%#v\nand\n%#v\nto be equal", cfg, goldenCfg) |
| } |
| } |
| |
| func TestGetRootKeys(t *testing.T) { |
| rootJSONStr := ` |
| { |
| "_type": "root", |
| "keys": { |
| "33efe3720e278de9ac57c810c1be71b9ef4dd49c0951edd9a2f9a39af08b5776": { |
| "keyid_hash_algorithms": [ |
| "sha256" |
| ], |
| "keytype": "ed25519", |
| "keyval": { |
| "public": "8e70ed31f117087a08ad23e00c2e1c353bf76fc0e0ac1aac334336e2b83ee7f4" |
| }, |
| "scheme": "ed25519" |
| }, |
| "8bcc00bc3575eea5fb608dea6a521845d4f287d2fa80baa40a902f1f3ec7911e": { |
| "keyid_hash_algorithms": [ |
| "sha256" |
| ], |
| "keytype": "ed25519", |
| "keyval": { |
| "public": "be0b983f7396da675c40c6b93e47fced7c1e9ea8a32a1fe952ba8f519760b307" |
| }, |
| "scheme": "ed25519" |
| }, |
| "c919b6e358fdb4ed062311ac5cebd44787d0f7ae9e5a5a213929dd4e3cde07c4": { |
| "keyid_hash_algorithms": [ |
| "sha256" |
| ], |
| "keytype": "ed25519", |
| "keyval": { |
| "public": "be0b983f7396da675c40c6b93e47fced7c1e9ea8a32a1fe952ba8f519760b307" |
| }, |
| "scheme": "ed25519" |
| }, |
| "f6ee2f092af683f6c1d8cbf477c2a8b7e01cc496fb4324150a172a54f514e4e7": { |
| "keyid_hash_algorithms": [ |
| "sha256" |
| ], |
| "keytype": "ed25519", |
| "keyval": { |
| "public": "8e70ed31f117087a08ad23e00c2e1c353bf76fc0e0ac1aac334336e2b83ee7f4" |
| }, |
| "scheme": "ed25519" |
| } |
| }, |
| "roles": { |
| "root": { |
| "keyids": [ |
| "8bcc00bc3575eea5fb608dea6a521845d4f287d2fa80baa40a902f1f3ec7911e", |
| "c919b6e358fdb4ed062311ac5cebd44787d0f7ae9e5a5a213929dd4e3cde07c4", |
| "f6ee2f092af683f6c1d8cbf477c2a8b7e01cc496fb4324150a172a54f514e4e7" |
| ] |
| }, |
| "other": { |
| "keyids": [ |
| "33efe3720e278de9ac57c810c1be71b9ef4dd49c0951edd9a2f9a39af08b5776", |
| "f6ee2f092af683f6c1d8cbf477c2a8b7e01cc496fb4324150a172a54f514e4e7" |
| ] |
| } |
| } |
| } |
| ` |
| var root tuf_data.Root |
| if err := json.Unmarshal([]byte(rootJSONStr), &root); err != nil { |
| t.Fatalf("failed to unmarshal root metadata: %v", err) |
| } |
| actual, err := GetRootKeys(&root) |
| if err != nil { |
| t.Fatalf("failed to derive root keys: %v", err) |
| } |
| sort.Slice(actual, func(i, j int) bool { |
| return actual[i].ED25519Key <= actual[j].ED25519Key |
| }) |
| expected := []KeyConfig{ |
| { |
| ED25519Key: "8e70ed31f117087a08ad23e00c2e1c353bf76fc0e0ac1aac334336e2b83ee7f4", |
| }, |
| { |
| ED25519Key: "be0b983f7396da675c40c6b93e47fced7c1e9ea8a32a1fe952ba8f519760b307", |
| }, |
| } |
| if !reflect.DeepEqual(expected, actual) { |
| t.Errorf("unexpected keys:\nexpected: %v\nactual: %v", expected, actual) |
| } |
| } |