78 lines
1.6 KiB
Go
78 lines
1.6 KiB
Go
package domain
|
|
|
|
import (
|
|
"crypto/sha1"
|
|
"crypto/sha256"
|
|
"crypto/sha512"
|
|
"errors"
|
|
"fmt"
|
|
"hash"
|
|
|
|
"source.toby3d.me/toby3d/hub/internal/common"
|
|
)
|
|
|
|
type Algorithm struct {
|
|
algorithm string
|
|
}
|
|
|
|
var (
|
|
AlgorithmUnd = Algorithm{algorithm: ""} // "und"
|
|
AlgorithmSHA1 = Algorithm{algorithm: "sha1"} // "sha1"
|
|
AlgorithmSHA256 = Algorithm{algorithm: "sha256"} // "sha256"
|
|
AlgorithmSHA384 = Algorithm{algorithm: "sha384"} // "sha384"
|
|
AlgorithmSHA512 = Algorithm{algorithm: "sha512"} // "sha512"
|
|
)
|
|
|
|
var ErrSyntaxAlgorithm = errors.New("bad algorithm syntax")
|
|
|
|
var stringsAlgorithms = map[string]Algorithm{
|
|
AlgorithmSHA1.algorithm: AlgorithmSHA1,
|
|
AlgorithmSHA256.algorithm: AlgorithmSHA256,
|
|
AlgorithmSHA384.algorithm: AlgorithmSHA384,
|
|
AlgorithmSHA512.algorithm: AlgorithmSHA512,
|
|
}
|
|
|
|
func ParseAlgorithm(algorithm string) (Algorithm, error) {
|
|
if alg, ok := stringsAlgorithms[algorithm]; ok {
|
|
return alg, nil
|
|
}
|
|
|
|
return AlgorithmUnd, fmt.Errorf("%w: %s", ErrSyntaxAlgorithm, algorithm)
|
|
}
|
|
|
|
func (a Algorithm) Hash() hash.Hash {
|
|
switch a {
|
|
default:
|
|
return nil
|
|
case AlgorithmSHA1:
|
|
return sha1.New()
|
|
case AlgorithmSHA256:
|
|
return sha256.New()
|
|
case AlgorithmSHA384:
|
|
return sha512.New384()
|
|
case AlgorithmSHA512:
|
|
return sha512.New()
|
|
}
|
|
}
|
|
|
|
func (a *Algorithm) UnmarshalForm(src []byte) error {
|
|
var err error
|
|
if *a, err = ParseAlgorithm(string(src)); err != nil {
|
|
return fmt.Errorf("Algorithm: %w", err)
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (a Algorithm) String() string {
|
|
if a.algorithm != "" {
|
|
return a.algorithm
|
|
}
|
|
|
|
return common.Und
|
|
}
|
|
|
|
func (a Algorithm) GoString() string {
|
|
return "domain.Algorithm(" + a.String() + ")"
|
|
}
|