mirror of
https://github.com/docker/docs.git
synced 2026-11-06 12:54:24 +03:00
Instead of silently ignoring any signing errors, and failing with a generic ErrInsufficientSignatures, just pass through any signing errors. As long as the role's threshold is met, some primary keys may be missing. But if any key does exist (whether primary or optional), failures using that key are fatal. (This is why signed.Sign needs to know the role's threshold; making any missing key fatal would break signatures of roles with 2 valid keys and threshold of 1.) As a side effect, this improves the “snapshot key is not available” detection in NotaryRepository.Publish, to trigger only when a key is not available, not also when it should be available but using it is failing. Similarly, the ErrInsufficientSignatures error now mentions only the missing keys, not the successfully used keys now that present but failing keys are handled by using other error types. (This removes the second ErrInsufficientSignatures check because it is no longer necessary, which also fixes the fact that it was broken by introducing optional keys. The first, now only, ErrInsufficientSignatures check does correctly distinguish between primary and optional keys.) Signed-off-by: Miloslav Trmač <mitr@redhat.com>
87 lines
2.4 KiB
Go
87 lines
2.4 KiB
Go
package signed
|
|
|
|
import (
|
|
"fmt"
|
|
"strings"
|
|
)
|
|
|
|
// ErrInsufficientSignatures - can not create enough signatures on a piece of
|
|
// metadata
|
|
type ErrInsufficientSignatures struct {
|
|
FoundKeys int
|
|
NeededKeys int
|
|
MissingKeyIDs []string
|
|
}
|
|
|
|
func (e ErrInsufficientSignatures) Error() string {
|
|
candidates := strings.Join(e.MissingKeyIDs, ", ")
|
|
if e.FoundKeys == 0 {
|
|
return fmt.Sprintf("signing keys not available, need %d keys out of: %s", e.NeededKeys, candidates)
|
|
}
|
|
return fmt.Sprintf("not enough signing keys: got %d of %d needed keys, other candidates: %s",
|
|
e.FoundKeys, e.NeededKeys, candidates)
|
|
}
|
|
|
|
// ErrExpired indicates a piece of metadata has expired
|
|
type ErrExpired struct {
|
|
Role string
|
|
Expired string
|
|
}
|
|
|
|
func (e ErrExpired) Error() string {
|
|
return fmt.Sprintf("%s expired at %v", e.Role, e.Expired)
|
|
}
|
|
|
|
// ErrLowVersion indicates the piece of metadata has a version number lower than
|
|
// a version number we're already seen for this role
|
|
type ErrLowVersion struct {
|
|
Actual int
|
|
Current int
|
|
}
|
|
|
|
func (e ErrLowVersion) Error() string {
|
|
return fmt.Sprintf("version %d is lower than current version %d", e.Actual, e.Current)
|
|
}
|
|
|
|
// ErrRoleThreshold indicates we did not validate enough signatures to meet the threshold
|
|
type ErrRoleThreshold struct{}
|
|
|
|
func (e ErrRoleThreshold) Error() string {
|
|
return "valid signatures did not meet threshold"
|
|
}
|
|
|
|
// ErrInvalidKeyType indicates the types for the key and signature it's associated with are
|
|
// mismatched. Probably a sign of malicious behaviour
|
|
type ErrInvalidKeyType struct{}
|
|
|
|
func (e ErrInvalidKeyType) Error() string {
|
|
return "key type is not valid for signature"
|
|
}
|
|
|
|
// ErrInvalidKeyID indicates the specified key ID was incorrect for its associated data
|
|
type ErrInvalidKeyID struct{}
|
|
|
|
func (e ErrInvalidKeyID) Error() string {
|
|
return "key ID is not valid for key content"
|
|
}
|
|
|
|
// ErrInvalidKeyLength indicates that while we may support the cipher, the provided
|
|
// key length is not specifically supported, i.e. we support RSA, but not 1024 bit keys
|
|
type ErrInvalidKeyLength struct {
|
|
msg string
|
|
}
|
|
|
|
func (e ErrInvalidKeyLength) Error() string {
|
|
return fmt.Sprintf("key length is not supported: %s", e.msg)
|
|
}
|
|
|
|
// ErrNoKeys indicates no signing keys were found when trying to sign
|
|
type ErrNoKeys struct {
|
|
KeyIDs []string
|
|
}
|
|
|
|
func (e ErrNoKeys) Error() string {
|
|
return fmt.Sprintf("could not find necessary signing keys, at least one of these keys must be available: %s",
|
|
strings.Join(e.KeyIDs, ", "))
|
|
}
|