updated digest.go: added function

This commit is contained in:
Олег Бородин
2026-03-07 09:15:21 +02:00
parent 81e943f1c5
commit 59e3e9019f
+74 -21
View File
@@ -1,12 +1,12 @@
package digest package digest
import ( import (
"bytes"
"crypto/sha256" "crypto/sha256"
"crypto/sha512" "crypto/sha512"
"hash"
"encoding/hex" "encoding/hex"
"errors" "errors"
"hash"
"strings" "strings"
) )
@@ -37,16 +37,16 @@ func NewDigest(algorithm Algorithm, payload []byte) *Digest {
} }
hasher.Write(payload) hasher.Write(payload)
sum = hasher.Sum(nil) sum = hasher.Sum(nil)
digest := &Digest{ digobj := &Digest{
algorithm: algorithm, algorithm: algorithm,
decoded: sum, decoded: sum,
} }
return digest return digobj
} }
func ParseDigest(str string) (*Digest, error) { func ParseDigest(str string) (*Digest, error) {
var err error var err error
digest := &Digest{} digobj := &Digest{}
str = strings.ToLower(str) str = strings.ToLower(str)
str = strings.TrimPrefix(str, "sha256:") str = strings.TrimPrefix(str, "sha256:")
@@ -55,22 +55,22 @@ func ParseDigest(str string) (*Digest, error) {
decoded, err := hex.DecodeString(str) decoded, err := hex.DecodeString(str)
if err != nil { if err != nil {
err := errors.New("Can't decode digest") err := errors.New("Can't decode digobj")
return digest, err return digobj, err
} }
digest.decoded = decoded digobj.decoded = decoded
switch len(decoded) { switch len(decoded) {
case 32: case 32:
digest.algorithm = SHA256 digobj.algorithm = SHA256
case 48: case 48:
digest.algorithm = SHA384 digobj.algorithm = SHA384
case 64: case 64:
digest.algorithm = SHA512 digobj.algorithm = SHA512
default: default:
err = errors.New("Unknown digest type") err = errors.New("Unknown digest type")
return digest, err return digobj, err
} }
return digest, err return digobj, err
} }
func (dig *Digest) Encoded() string { func (dig *Digest) Encoded() string {
@@ -108,14 +108,14 @@ func (dig *Digest) String() string {
return prefix + ":" + hexx return prefix + ":" + hexx
} }
func xxxDigestType(digest string) Algorithm { func DetectDigestType(digobj string) Algorithm {
var err error var err error
var algorithm Algorithm var algorithm Algorithm
digest = strings.ToLower(digest) digobj = strings.ToLower(digobj)
digest = strings.TrimPrefix(digest, "sha256:") digobj = strings.TrimPrefix(digobj, "sha256:")
digest = strings.TrimPrefix(digest, "sha384:") digobj = strings.TrimPrefix(digobj, "sha384:")
digest = strings.TrimPrefix(digest, "sha512:") digobj = strings.TrimPrefix(digobj, "sha512:")
decoded, err := hex.DecodeString(digest) decoded, err := hex.DecodeString(digobj)
if err != nil { if err != nil {
return Undefined return Undefined
} }
@@ -132,16 +132,69 @@ func xxxDigestType(digest string) Algorithm {
return algorithm return algorithm
} }
func xxxSHA256Digest(src []byte) string { func MakeSHA256Digest(src []byte) string {
hasher := sha256.New() hasher := sha256.New()
hasher.Write(src) hasher.Write(src)
sum := hasher.Sum(nil) sum := hasher.Sum(nil)
return "sha256:" + hex.EncodeToString(sum) return "sha256:" + hex.EncodeToString(sum)
} }
func xxxSHA512Digest(src []byte) string { func MakeSHA384Digest(src []byte) string {
hasher := sha512.New384()
hasher.Write(src)
sum := hasher.Sum(nil)
return "sha256:" + hex.EncodeToString(sum)
}
func MakeSHA512Digest(src []byte) string {
hasher := sha512.New() hasher := sha512.New()
hasher.Write(src) hasher.Write(src)
sum := hasher.Sum(nil) sum := hasher.Sum(nil)
return "sha512:" + hex.EncodeToString(sum) return "sha512:" + hex.EncodeToString(sum)
} }
func (dig Digest) MarshalJSON() ([]byte, error) {
writer := bytes.NewBuffer(nil)
switch dig.algorithm {
case SHA256:
writer.WriteString("sha256")
case SHA384:
writer.WriteString("sha384")
case SHA512:
writer.WriteString("sha512")
}
writer.WriteString(":")
writer.WriteString(hex.EncodeToString(dig.decoded))
return writer.Bytes(), nil
}
func (dig *Digest) UnmarshalJSON(data []byte) error {
var err error
digobj := &Digest{}
str := strings.ToLower(string(data))
str = strings.TrimPrefix(str, "sha256:")
str = strings.TrimPrefix(str, "sha384:")
str = strings.TrimPrefix(str, "sha512:")
decoded, err := hex.DecodeString(str)
if err != nil {
err := errors.New("Can't decode digest")
return digobj, err
}
digobj.decoded = decoded
switch len(decoded) {
case 32:
digobj.algorithm = SHA256
case 48:
digobj.algorithm = SHA384
case 64:
digobj.algorithm = SHA512
default:
err = errors.New("Unknown digest type")
return digobj, err
}
*dig = digobj
return err
}