// CreateTimestamp creates a new timestamp. If a prev timestamp is provided, it // is assumed this is the immediately previous one, and the new one will have a // version number one higher than prev. The store is used to lookup the current // snapshot, this function does not save the newly generated timestamp. func CreateTimestamp(gun string, prev *data.SignedTimestamp, snapshot []byte, store storage.MetaStore, cryptoService signed.CryptoService) (*data.Signed, int, error) { algorithm, public, err := store.GetTimestampKey(gun) if err != nil { // owner of gun must have generated a timestamp key otherwise // we won't proceed with generating everything. return nil, 0, err } key := data.NewPublicKey(algorithm, public) sn := &data.Signed{} err = json.Unmarshal(snapshot, sn) if err != nil { // couldn't parse snapshot return nil, 0, err } ts, err := data.NewTimestamp(sn) if err != nil { return nil, 0, err } if prev != nil { ts.Signed.Version = prev.Signed.Version + 1 } sgndTs, err := cjson.Marshal(ts.Signed) if err != nil { return nil, 0, err } out := &data.Signed{ Signatures: ts.Signatures, Signed: sgndTs, } err = signed.Sign(cryptoService, out, key) if err != nil { return nil, 0, err } return out, ts.Signed.Version, nil }
// InitRepo creates the base files for a repo. It inspects data.ValidRoles and // data.ValidTypes to determine what the role names and filename should be. It // also relies on the keysDB having already been populated with the keys and // roles. func (tr *TufRepo) InitRepo(consistent bool) error { rootRoles := make(map[string]*data.RootRole) rootKeys := make(map[string]*data.PublicKey) for _, r := range data.ValidRoles { role := tr.keysDB.GetRole(r) if role == nil { return errors.ErrInvalidRole{} } rootRoles[r] = &role.RootRole for _, kid := range role.KeyIDs { // don't need to check if GetKey returns nil, Key presence was // checked by KeyDB when role was added. key := tr.keysDB.GetKey(kid) // Create new key object to doubly ensure private key is excluded k := data.NewPublicKey(key.Cipher(), key.Public()) rootKeys[kid] = k } } root, err := data.NewRoot(rootKeys, rootRoles, consistent) if err != nil { return err } tr.Root = root targets := data.NewTargets() tr.Targets[data.ValidRoles["targets"]] = targets signedRoot, err := tr.SignRoot(data.DefaultExpires("root")) if err != nil { return err } signedTargets, err := tr.SignTargets("targets", data.DefaultExpires("targets")) if err != nil { return err } snapshot, err := data.NewSnapshot(signedRoot, signedTargets) if err != nil { return err } tr.Snapshot = snapshot signedSnapshot, err := tr.SignSnapshot(data.DefaultExpires("snapshot")) if err != nil { return err } timestamp, err := data.NewTimestamp(signedSnapshot) if err != nil { return err } tr.Timestamp = timestamp return nil }
func (tr *TufRepo) InitTimestamp() error { snap, err := tr.Snapshot.ToSigned() if err != nil { return err } timestamp, err := data.NewTimestamp(snap) if err != nil { return err } tr.Timestamp = timestamp return nil }
func (tr *TufRepo) InitTimestamp() error { signedSnapshot, err := tr.SignSnapshot(data.DefaultExpires("snapshot"), nil) if err != nil { return err } timestamp, err := data.NewTimestamp(signedSnapshot) if err != nil { return err } tr.Timestamp = timestamp return nil }