Skip to content
Snippets Groups Projects
Select Git revision
  • 3645-nil-pointer-errors-are-occasionally-thrown
  • main default protected
  • release-1.4 protected
  • partial-merkle-tree
  • 3616-migrate-block-ledger
  • 3623-backport
  • hashed-time-locks
  • 3626-expose-simulator
  • 3640-mining-support
  • 3621-csv2yaml
  • eip712-mask
  • 3565-eip712-ethan
  • 3617-instrumentation-followup
  • database
  • database-benchmark-index
  • database-no-mutex
  • 3588-blockchain-specific-key-value-database
  • 3570-generalize-pki-types
  • 3600-fee-schedule-consistency
  • 3589-code-intelligence
  • v1.4.1-snapshot
  • v1.4.1
  • v1.4.0
  • v1.4.0-alpha.1
  • v1.3.0
  • v1.3.0-rc.3
  • v1.2.13
  • v1.2.12
  • mexc-v1.2.11
  • v1.3.0-rc.2
  • v1.2.11
  • v1.2.10
  • v1.2.10-rc.8
  • v1.2.10-rc.7
  • v1.2.10-rc.6
  • v1.2.10-rc.5
  • v1.2.10-rc.4
  • v1.2.10-rc.3
  • v1.2.10-rc.2
  • mexc-v1.2.10-rc.2
40 results

hash_algorithm.go

hash_algorithm.go 1.72 KiB
package protocol

import (
	"crypto/sha256"
	"encoding/json"
	"fmt"
	"strings"
)

type HashAlgorithm uint8

const (
	Unhashed HashAlgorithm = iota
	UnknownHashAlgorithm
	SHA256
	SHA256D
)

func HashAlgorithmByName(s string) HashAlgorithm {
	switch strings.ToUpper(s) {
	case "", "NONE", "RAW", "UNHASHED":
		return Unhashed
	case "SHA256":
		return SHA256
	case "SHA256D":
		return SHA256D
	default:
		return UnknownHashAlgorithm
	}
}

func (ha HashAlgorithm) String() string {
	switch ha {
	case SHA256:
		return "SHA256"
	case SHA256D:
		return "SHA256D"
	default:
		return fmt.Sprintf("HashAlgorithm:%d", ha)
	}
}

func (ha HashAlgorithm) Apply(b []byte) ([]byte, error) {
	switch ha {
	case Unhashed:
		return b, nil
	case SHA256:
		kh := sha256.Sum256(b)
		return kh[:], nil
	case SHA256D:
		kh := sha256.Sum256(b)
		kh = sha256.Sum256(kh[:])
		return kh[:], nil
	default:
		return nil, fmt.Errorf("invalid hash algorithm")
	}
}

func (ha HashAlgorithm) MustApply(b []byte) []byte {
	b, err := ha.Apply(b)
	if err != nil {
		panic(err)
	}
	return b
}

func (ha HashAlgorithm) BinarySize() int {
	return 1
}
func (ha HashAlgorithm) MarshalBinary() ([]byte, error) {
	return []byte{byte(ha)}, nil
}

func (ha *HashAlgorithm) UnmarshalBinary(b []byte) error {
	if len(b) == 0 {
		return ErrNotEnoughData
	}
	*ha = HashAlgorithm(b[0])
	return nil
}

func (ha HashAlgorithm) MarshalJSON() ([]byte, error) {
	return json.Marshal(ha.String())
}

func (ha *HashAlgorithm) UnmarshalJSON(b []byte) error {
	var s *string
	err := json.Unmarshal(b, &s)
	if err != nil {
		return nil
	}
	if s == nil {
		*ha = Unhashed
		return nil
	}

	*ha = HashAlgorithmByName(*s)
	if *ha == UnknownHashAlgorithm {
		return fmt.Errorf("invalid Hash algorithm: %q", *s)
	}
	return nil
}