// NewNotaryRepository is a helper method that returns a new notary repository. // It takes the base directory under where all the trust files will be stored // (usually ~/.docker/trust/). func NewNotaryRepository(baseDir, gun, baseURL string, rt http.RoundTripper, passphraseRetriever passphrase.Retriever) (*NotaryRepository, error) { keyStoreManager, err := keystoremanager.NewKeyStoreManager(baseDir, passphraseRetriever) if err != nil { return nil, err } cryptoService := cryptoservice.NewCryptoService(gun, keyStoreManager.NonRootKeyStore()) nRepo := &NotaryRepository{ gun: gun, baseDir: baseDir, baseURL: baseURL, tufRepoPath: filepath.Join(baseDir, tufDir, filepath.FromSlash(gun)), cryptoService: cryptoService, roundTrip: rt, KeyStoreManager: keyStoreManager, } fileStore, err := store.NewFilesystemStore( nRepo.tufRepoPath, "metadata", "json", "", ) if err != nil { return nil, err } nRepo.fileStore = fileStore return nRepo, nil }
func tufPublish(cmd *cobra.Command, args []string) { if len(args) < 1 { cmd.Usage() fatalf("Must specify a GUN") } gun := args[0] fmt.Println("Pushing changes to ", gun, ".") remote, err := store.NewHTTPStore( "https://notary:4443/v2/"+gun+"/_trust/tuf/", "", "json", "", ) filestore, err := store.NewFilesystemStore( path.Join(viper.GetString("tufDir"), gun), "metadata", "json", "targets", ) if err != nil { fatalf(err.Error()) } root, err := filestore.GetMeta("root", 0) if err != nil { fatalf(err.Error()) } targets, err := filestore.GetMeta("targets", 0) if err != nil { fatalf(err.Error()) } snapshot, err := filestore.GetMeta("snapshot", 0) if err != nil { fatalf(err.Error()) } timestamp, err := filestore.GetMeta("timestamp", 0) if err != nil { fatalf(err.Error()) } err = remote.SetMeta("root", root) if err != nil { fatalf(err.Error()) } err = remote.SetMeta("targets", targets) if err != nil { fatalf(err.Error()) } err = remote.SetMeta("snapshot", snapshot) if err != nil { fatalf(err.Error()) } err = remote.SetMeta("timestamp", timestamp) if err != nil { fatalf(err.Error()) } }
func bootstrapRepo(gun string, repo *tuf.TufRepo) store.MetadataStore { filestore, err := store.NewFilesystemStore( path.Join(viper.GetString("tufDir"), gun), "metadata", "json", "targets", ) if err != nil { fatalf(err.Error()) } fmt.Println("Loading trusted collection.") rootJSON, err := filestore.GetMeta("root", 0) if err != nil { fatalf(err.Error()) } root := &data.Signed{} err = json.Unmarshal(rootJSON, root) if err != nil { fatalf(err.Error()) } repo.SetRoot(root) targetsJSON, err := filestore.GetMeta("targets", 0) if err != nil { fatalf(err.Error()) } targets := &data.Signed{} err = json.Unmarshal(targetsJSON, targets) if err != nil { fatalf(err.Error()) } repo.SetTargets("targets", targets) snapshotJSON, err := filestore.GetMeta("snapshot", 0) if err != nil { fatalf(err.Error()) } snapshot := &data.Signed{} err = json.Unmarshal(snapshotJSON, snapshot) if err != nil { fatalf(err.Error()) } repo.SetSnapshot(snapshot) timestampJSON, err := filestore.GetMeta("timestamp", 0) if err != nil { fatalf(err.Error()) } timestamp := &data.Signed{} err = json.Unmarshal(timestampJSON, timestamp) if err != nil { fatalf(err.Error()) } repo.SetTimestamp(timestamp) return filestore }
func (r *NotaryRepository) bootstrapRepo() error { fileStore, err := store.NewFilesystemStore( r.tufRepoPath, "metadata", "json", "targets", ) if err != nil { return err } kdb := keys.NewDB() tufRepo := tuf.NewTufRepo(kdb, r.signer) fmt.Println("Loading trusted collection.") rootJSON, err := fileStore.GetMeta("root", 0) if err != nil { return err } root := &data.Signed{} err = json.Unmarshal(rootJSON, root) if err != nil { return err } tufRepo.SetRoot(root) targetsJSON, err := fileStore.GetMeta("targets", 0) if err != nil { return err } targets := &data.Signed{} err = json.Unmarshal(targetsJSON, targets) if err != nil { return err } tufRepo.SetTargets("targets", targets) snapshotJSON, err := fileStore.GetMeta("snapshot", 0) if err != nil { return err } snapshot := &data.Signed{} err = json.Unmarshal(snapshotJSON, snapshot) if err != nil { return err } tufRepo.SetSnapshot(snapshot) r.tufRepo = tufRepo r.fileStore = fileStore return nil }
func tufInit(cmd *cobra.Command, args []string) { if len(args) < 1 { cmd.Usage() fatalf("Must specify a GUN") } gun := args[0] kdb := keys.NewDB() signer := signed.NewSigner(NewCryptoService(gun)) rootKey, err := signer.Create("root") if err != nil { fatalf(err.Error()) } targetsKey, err := signer.Create("targets") if err != nil { fatalf(err.Error()) } snapshotKey, err := signer.Create("snapshot") if err != nil { fatalf(err.Error()) } timestampKey, err := signer.Create("timestamp") if err != nil { fatalf(err.Error()) } kdb.AddKey(rootKey) kdb.AddKey(targetsKey) kdb.AddKey(snapshotKey) kdb.AddKey(timestampKey) rootRole, err := data.NewRole("root", 1, []string{rootKey.ID()}, nil, nil) if err != nil { fatalf(err.Error()) } targetsRole, err := data.NewRole("targets", 1, []string{targetsKey.ID()}, nil, nil) if err != nil { fatalf(err.Error()) } snapshotRole, err := data.NewRole("snapshot", 1, []string{snapshotKey.ID()}, nil, nil) if err != nil { fatalf(err.Error()) } timestampRole, err := data.NewRole("timestamp", 1, []string{timestampKey.ID()}, nil, nil) if err != nil { fatalf(err.Error()) } err = kdb.AddRole(rootRole) if err != nil { fatalf(err.Error()) } err = kdb.AddRole(targetsRole) if err != nil { fatalf(err.Error()) } err = kdb.AddRole(snapshotRole) if err != nil { fatalf(err.Error()) } err = kdb.AddRole(timestampRole) if err != nil { fatalf(err.Error()) } repo := tuf.NewTufRepo(kdb, signer) filestore, err := store.NewFilesystemStore( path.Join(viper.GetString("tufDir"), gun), // TODO: base trust dir from config "metadata", "json", "targets", ) if err != nil { fatalf(err.Error()) } err = repo.InitRepo(false) if err != nil { fatalf(err.Error()) } saveRepo(repo, filestore) }
// Initialize creates a new repository by using rootKey as the root Key for the // TUF repository. func (r *NotaryRepository) Initialize(uSigner *UnlockedSigner) error { rootCert, err := uSigner.GenerateCertificate(r.Gun) if err != nil { return err } r.certificateStore.AddCert(rootCert) rootKey := data.NewPublicKey("RSA", trustmanager.CertToPEM(rootCert)) err = r.rootKeyStore.Link(uSigner.ID(), rootKey.ID()) if err != nil { return err } remote, err := getRemoteStore(r.baseURL, r.Gun) rawTSKey, err := remote.GetKey("timestamp") if err != nil { return err } parsedKey := &data.TUFKey{} err = json.Unmarshal(rawTSKey, parsedKey) if err != nil { return err } timestampKey := data.NewPublicKey(parsedKey.Cipher(), parsedKey.Public()) targetsKey, err := r.signer.Create("targets") if err != nil { return err } snapshotKey, err := r.signer.Create("snapshot") if err != nil { return err } kdb := keys.NewDB() kdb.AddKey(rootKey) kdb.AddKey(targetsKey) kdb.AddKey(snapshotKey) kdb.AddKey(timestampKey) rootRole, err := data.NewRole("root", 1, []string{rootKey.ID()}, nil, nil) if err != nil { return err } targetsRole, err := data.NewRole("targets", 1, []string{targetsKey.ID()}, nil, nil) if err != nil { return err } snapshotRole, err := data.NewRole("snapshot", 1, []string{snapshotKey.ID()}, nil, nil) if err != nil { return err } timestampRole, err := data.NewRole("timestamp", 1, []string{timestampKey.ID()}, nil, nil) if err != nil { return err } if err := kdb.AddRole(rootRole); err != nil { return err } if err := kdb.AddRole(targetsRole); err != nil { return err } if err := kdb.AddRole(snapshotRole); err != nil { return err } if err := kdb.AddRole(timestampRole); err != nil { return err } r.tufRepo = tuf.NewTufRepo(kdb, r.signer) r.fileStore, err = store.NewFilesystemStore( r.tufRepoPath, "metadata", "json", "targets", ) if err != nil { return err } if err := r.tufRepo.InitRepo(false); err != nil { return err } if err := r.saveMetadata(uSigner.signer); err != nil { return err } // Creates an empty snapshot return r.snapshot() }
// Initialize creates a new repository by using rootKey as the root Key for the // TUF repository. func (r *NotaryRepository) Initialize(uCryptoService *cryptoservice.UnlockedCryptoService) error { rootCert, err := uCryptoService.GenerateCertificate(r.gun) if err != nil { return err } r.KeyStoreManager.AddTrustedCert(rootCert) // The root key gets stored in the TUF metadata X509 encoded, linking // the tuf root.json to our X509 PKI. // If the key is RSA, we store it as type RSAx509, if it is ECDSA we store it // as ECDSAx509 to allow the gotuf verifiers to correctly decode the // key on verification of signatures. var algorithmType data.KeyAlgorithm algorithm := uCryptoService.PrivKey.Algorithm() switch algorithm { case data.RSAKey: algorithmType = data.RSAx509Key case data.ECDSAKey: algorithmType = data.ECDSAx509Key default: return fmt.Errorf("invalid format for root key: %s", algorithm) } // Generate a x509Key using the rootCert as the public key rootKey := data.NewPublicKey(algorithmType, trustmanager.CertToPEM(rootCert)) // Creates a symlink between the certificate ID and the real public key it // is associated with. This is used to be able to retrieve the root private key // associated with a particular certificate logrus.Debugf("Linking %s to %s.", rootKey.ID(), uCryptoService.ID()) err = r.KeyStoreManager.RootKeyStore().Link(uCryptoService.ID(), rootKey.ID()) if err != nil { return err } // All the timestamp keys are generated by the remote server. remote, err := getRemoteStore(r.baseURL, r.gun, r.roundTrip) rawTSKey, err := remote.GetKey("timestamp") if err != nil { return err } parsedKey := &data.TUFKey{} err = json.Unmarshal(rawTSKey, parsedKey) if err != nil { return err } // Turn the JSON timestamp key from the remote server into a TUFKey timestampKey := data.NewPublicKey(parsedKey.Algorithm(), parsedKey.Public()) logrus.Debugf("got remote %s timestamp key with keyID: %s", parsedKey.Algorithm(), timestampKey.ID()) // This is currently hardcoding the targets and snapshots keys to ECDSA // Targets and snapshot keys are always generated locally. targetsKey, err := r.cryptoService.Create("targets", data.ECDSAKey) if err != nil { return err } snapshotKey, err := r.cryptoService.Create("snapshot", data.ECDSAKey) if err != nil { return err } kdb := keys.NewDB() kdb.AddKey(rootKey) kdb.AddKey(targetsKey) kdb.AddKey(snapshotKey) kdb.AddKey(timestampKey) rootRole, err := data.NewRole("root", 1, []string{rootKey.ID()}, nil, nil) if err != nil { return err } targetsRole, err := data.NewRole("targets", 1, []string{targetsKey.ID()}, nil, nil) if err != nil { return err } snapshotRole, err := data.NewRole("snapshot", 1, []string{snapshotKey.ID()}, nil, nil) if err != nil { return err } timestampRole, err := data.NewRole("timestamp", 1, []string{timestampKey.ID()}, nil, nil) if err != nil { return err } if err := kdb.AddRole(rootRole); err != nil { return err } if err := kdb.AddRole(targetsRole); err != nil { return err } if err := kdb.AddRole(snapshotRole); err != nil { return err } if err := kdb.AddRole(timestampRole); err != nil { return err } r.tufRepo = tuf.NewTufRepo(kdb, r.cryptoService) r.fileStore, err = store.NewFilesystemStore( r.tufRepoPath, "metadata", "json", "targets", ) if err != nil { return err } if err := r.tufRepo.InitRepo(false); err != nil { return err } if err := r.saveMetadata(uCryptoService.CryptoService); err != nil { return err } // Creates an empty snapshot return r.snapshot() }