2019-04-04 20:46:06 +00:00
|
|
|
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) {
|
|
|
|
|
2019-04-05 18:34:02 +00:00
|
|
|
ba, err := ctx.Estack.PopByteArray()
|
2019-04-04 20:46:06 +00:00
|
|
|
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) {
|
|
|
|
|
2019-04-05 18:34:02 +00:00
|
|
|
ba, err := ctx.Estack.PopByteArray()
|
2019-04-04 20:46:06 +00:00
|
|
|
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) {
|
|
|
|
|
2019-04-05 18:34:02 +00:00
|
|
|
ba, err := ctx.Estack.PopByteArray()
|
2019-04-04 20:46:06 +00:00
|
|
|
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) {
|
|
|
|
|
2019-04-05 18:34:02 +00:00
|
|
|
ba, err := ctx.Estack.PopByteArray()
|
2019-04-04 20:46:06 +00:00
|
|
|
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
|
|
|
|
}
|