protected internal byte[] Sha256(StackItem item) { ReadOnlySpan <byte> value = item switch { InteropInterface _interface => _interface.GetInterface <IVerifiable>().GetHashData(), Null _ => ScriptContainer.GetHashData(), _ => item.GetSpan() }; return(value.Sha256()); }
private bool VerifyWithECDsa(StackItem item, byte[] pubkey, byte[] signature, ECCurve curve) { ReadOnlySpan <byte> message = item switch { InteropInterface _interface => _interface.GetInterface <IVerifiable>().GetHashData(), Null _ => ScriptContainer.GetHashData(), _ => item.GetSpan() }; try { return(Crypto.VerifySignature(message, signature, pubkey, curve)); } catch (ArgumentException) { return(false); } }
private bool CheckMultiSigWithECDsa(StackItem item0, byte[][] pubkeys, byte[][] signatures, ECCurve curve) { int m = signatures.Length, n = pubkeys.Length; ReadOnlySpan <byte> message = item0 switch { InteropInterface _interface => _interface.GetInterface <IVerifiable>().GetHashData(), Null _ => ScriptContainer.GetHashData(), _ => item0.GetSpan() }; if (n == 0 || m == 0 || m > n) { throw new ArgumentException(); } AddGas(ECDsaVerifyPrice * n * exec_fee_factor); try { for (int i = 0, j = 0; i < m && j < n;) { if (Crypto.VerifySignature(message, signatures[i], pubkeys[j], curve)) { i++; } j++; if (m - i > n - j) { return(false); } } } catch (ArgumentException) { return(false); } return(true); } }