forked from TrueCloudLab/neoneo-go
06f9e1d123
Like: Error return value of alg.Write is not checked (from errcheck) Actually even though the hash.Hash implements an io.Writer interface (that return meaningful things on .Write()) it has this comment in its documentation: // Write (via the embedded io.Writer interface) adds more data to the running hash. // It never returns an error. so it should be OK to ignore return results here.
106 lines
2.9 KiB
Go
106 lines
2.9 KiB
Go
package vm
|
|
|
|
import (
|
|
"crypto/sha1"
|
|
|
|
"github.com/CityOfZion/neo-go/pkg/crypto/hash"
|
|
"github.com/CityOfZion/neo-go/pkg/vm/stack"
|
|
)
|
|
|
|
// SHA1 pops an item off of the stack and
|
|
// pushes a bytearray onto the stack whose value
|
|
// is obtained by applying the sha1 algorithm to
|
|
// the corresponding bytearray representation of the item.
|
|
// Returns an error if the Pop method cannot be execute or
|
|
// the popped item does not have a concrete bytearray implementation.
|
|
func SHA1(op stack.Instruction, ctx *stack.Context, istack *stack.Invocation, rstack *stack.RandomAccess) (Vmstate, error) {
|
|
|
|
ba, err := ctx.Estack.PopByteArray()
|
|
if err != nil {
|
|
return FAULT, err
|
|
}
|
|
|
|
alg := sha1.New()
|
|
_, _ = alg.Write(ba.Value())
|
|
hash := alg.Sum(nil)
|
|
res := stack.NewByteArray(hash)
|
|
|
|
ctx.Estack.Push(res)
|
|
|
|
return NONE, nil
|
|
}
|
|
|
|
// SHA256 pops an item off of the stack and
|
|
// pushes a bytearray onto the stack whose value
|
|
// is obtained by applying the Sha256 algorithm to
|
|
// the corresponding bytearray representation of the item.
|
|
// Returns an error if the Pop method cannot be execute or
|
|
// the popped item does not have a concrete bytearray implementation.
|
|
func SHA256(op stack.Instruction, ctx *stack.Context, istack *stack.Invocation, rstack *stack.RandomAccess) (Vmstate, error) {
|
|
|
|
ba, err := ctx.Estack.PopByteArray()
|
|
if err != nil {
|
|
return FAULT, err
|
|
}
|
|
|
|
hash, err := hash.Sha256(ba.Value())
|
|
if err != nil {
|
|
return FAULT, err
|
|
}
|
|
|
|
res := stack.NewByteArray(hash.Bytes())
|
|
|
|
ctx.Estack.Push(res)
|
|
|
|
return NONE, nil
|
|
}
|
|
|
|
// HASH160 pops an item off of the stack and
|
|
// pushes a bytearray onto the stack whose value
|
|
// is obtained by applying the Hash160 algorithm to
|
|
// the corresponding bytearray representation of the item.
|
|
// Returns an error if the Pop method cannot be execute or
|
|
// the popped item does not have a concrete bytearray implementation.
|
|
func HASH160(op stack.Instruction, ctx *stack.Context, istack *stack.Invocation, rstack *stack.RandomAccess) (Vmstate, error) {
|
|
|
|
ba, err := ctx.Estack.PopByteArray()
|
|
if err != nil {
|
|
return FAULT, err
|
|
}
|
|
|
|
hash, err := hash.Hash160(ba.Value())
|
|
if err != nil {
|
|
return FAULT, err
|
|
}
|
|
|
|
res := stack.NewByteArray(hash.Bytes())
|
|
|
|
ctx.Estack.Push(res)
|
|
|
|
return NONE, nil
|
|
}
|
|
|
|
// HASH256 pops an item off of the stack and
|
|
// pushes a bytearray onto the stack whose value
|
|
// is obtained by applying the Hash256 algorithm to
|
|
// the corresponding bytearray representation of the item.
|
|
// Returns an error if the Pop method cannot be execute or
|
|
// the popped item does not have a concrete bytearray implementation.
|
|
func HASH256(op stack.Instruction, ctx *stack.Context, istack *stack.Invocation, rstack *stack.RandomAccess) (Vmstate, error) {
|
|
|
|
ba, err := ctx.Estack.PopByteArray()
|
|
if err != nil {
|
|
return FAULT, err
|
|
}
|
|
|
|
hash, err := hash.DoubleSha256(ba.Value())
|
|
if err != nil {
|
|
return FAULT, err
|
|
}
|
|
|
|
res := stack.NewByteArray(hash.Bytes())
|
|
|
|
ctx.Estack.Push(res)
|
|
|
|
return NONE, nil
|
|
}
|