hancock

Check-in [da5f7ebb26]
Login

Many hyperlinks are disabled.
Use anonymous login to enable hyperlinks.

Overview
Comment:model: rename manifest "Content" field (was "CID")
Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | trunk
Files: files | file ages | folders
SHA3-256: da5f7ebb26ab9a08a6b39e82454b0dda658892caceb22448f29d8b792880221f
User & Date: dnc 2019-11-03 11:59:30
Context
2019-11-03
12:01
hancock: call new server interface previously: seperate index and testimony on IPFS now: hancockd server acts as key/value store check-in: 99044d8f59 user: dnc tags: trunk
11:59
model: rename manifest "Content" field (was "CID") check-in: da5f7ebb26 user: dnc tags: trunk
11:58
model: prefer model.Authority (to string) for type safety check-in: 99cee0289a user: dnc tags: trunk
Changes
Hide Diffs Unified Diffs Ignore Whitespace Patch

Changes to model/manifest.go.

84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
...
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
}

// Type FileManifest includes information about a file.  A signed
// manifest becomes testimony used to authenticate the file.
type FileManifest struct {
	// Content Identifier is derived from a cryptographically strong
	// hash of the file content.
	CID CID `json:"cid"`

	// Path indicates the relative path of the file when manifest was
	// produced.  It may have a different path when verified.
	Path string `json:"path,omitempty"`

	// Quality allows testimony to serve as either endorsement or
	// repudiation of source.
................................................................................
	cid := NewSha256CID(nil)
	_, err := io.Copy(cid, f)
	if err != nil {
		return nil, err
	}

	return &FileManifest{
		Time: time.Now().Unix(),
		CID:  cid.Encode(), // TODO(dnc): avoid unnecessary encodes/decodes, for performance
	}, nil
}

// Enforce limitations on manifest data.
func (this FileManifest) Check() error {
	const messageCount = 8
	const messageLength = 128







|







 







|
|







84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
...
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
}

// Type FileManifest includes information about a file.  A signed
// manifest becomes testimony used to authenticate the file.
type FileManifest struct {
	// Content Identifier is derived from a cryptographically strong
	// hash of the file content.
	Content CID `json:"cid"`

	// Path indicates the relative path of the file when manifest was
	// produced.  It may have a different path when verified.
	Path string `json:"path,omitempty"`

	// Quality allows testimony to serve as either endorsement or
	// repudiation of source.
................................................................................
	cid := NewSha256CID(nil)
	_, err := io.Copy(cid, f)
	if err != nil {
		return nil, err
	}

	return &FileManifest{
		Time:    time.Now().Unix(),
		Content: cid.Encode(), // TODO(dnc): avoid unnecessary encodes/decodes, for performance
	}, nil
}

// Enforce limitations on manifest data.
func (this FileManifest) Check() error {
	const messageCount = 8
	const messageLength = 128

Changes to model/testimony.go.

48
49
50
51
52
53
54
55
56

57

58
59
60
61
62
63
64
..
68
69
70
71
72
73
74












75
76

77
78


79


	publicKey ssh.PublicKey
}

// Verify returns nil when the manifest, signature, and public key are
// consistent.  This checks only the tag data, and does not check that
// the key corresponds to an authorized entity.
func (this *Testimony) Verify() error {
	if this.Authority == "" {
		return errors.New("testimony without public key")

	}

	public, err := this.PublicKey()
	if err != nil {
		return err
	}
	err = public.Verify(this.Encoded, &this.Signature)
	return err
}
................................................................................
	if this.publicKey == nil {
		this.publicKey, _, _, _, err = ssh.ParseAuthorizedKey([]byte(this.Authority))
	}
	return this.publicKey, err
}

func (this *Testimony) Key() *TestimonyKey {












	if this.Authority == "" {
		log.Panic("testimony not initialized, missing authority")

	}
	return &TestimonyKey{Authority: this.Authority, Content: this.Content}


}









|
|
>

>







 







>
>
>
>
>
>
>
>
>
>
>
>

<
>

<
>
>
|
>
>
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
..
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89

90
91

92
93
94
95
96
	publicKey ssh.PublicKey
}

// Verify returns nil when the manifest, signature, and public key are
// consistent.  This checks only the tag data, and does not check that
// the key corresponds to an authorized entity.
func (this *Testimony) Verify() error {
	err := this.Check()
	if err != nil {
		return err
	}

	public, err := this.PublicKey()
	if err != nil {
		return err
	}
	err = public.Verify(this.Encoded, &this.Signature)
	return err
}
................................................................................
	if this.publicKey == nil {
		this.publicKey, _, _, _, err = ssh.ParseAuthorizedKey([]byte(this.Authority))
	}
	return this.publicKey, err
}

func (this *Testimony) Key() *TestimonyKey {
	key := &TestimonyKey{Authority: this.Authority, Content: this.Content}

	// sanity check; TODO(dnc): remove when not needed
	err := key.Check()
	if err != nil {
		log.Panicf("failed to generate testimony key: %s", err)
	}

	return key
}

func (this *Testimony) Check() error {
	if this.Authority == "" {

		return errors.New("testimony missing authority field")
	}

	if this.Content.String() == "" {
		return errors.New("testimony missing content field")
	}
	return nil
}