void present_query_closure(){ // The input is the inputed string extended by this arbitrary salt u8 input[SHA3_INLEN] = { 224, 36, 30, 106, 254, 80, 213, 241, 25, 136, 35, 3, 132, 229, 10, 248, 166, 138, 11, 177, 77, 6, 255, 203, 229, 77, 4, 199, 170, 186, 33, 88 }; strcpy(input, buffer0); u8 md[SHA3_MDLEN] = {0}; sha3(input, md); for (int i = 0; i < SHA3_MDLEN; i++) { dprintf("Input md[%d]: %d\n", i, md[i]); } u8 *script = present_get_matching_md(md); if(script){ overworld_script_virtual_ptr = script; *var_access(0x800D) = 1; }else{ *var_access(0x800D) = 0; } void (*std_closure_and_map_reload)() = (void(*)())(0x08056900 | 1); std_closure_and_map_reload(); }
int main(int argc, char **argv) { int i, set; bliss_privkey_t *priv; bliss_pubkey_t *pub; bliss_signature_t *sign; // data to be signed uint8_t data[] = "Lorem Ipsuxm."; uint8_t data_hash[64]; // not a secure random gauss_init(); // hash it sha3(data, sizeof(data), data_hash, 64); // loop over parameter sets for (set = 1; set <= 4; set++) { printf("CLASS %d x 1000\n", set); for (i = 0; i < 1000; i++) { // create a private key if ((priv = bliss_privkey_gen(set)) == NULL) { fprintf(stderr, "%04d/%d bliss_privkey_gen()" , i, set); exit(1); } // derive public key from private key if ((pub = bliss_pubkey_frompriv(priv)) == NULL) { fprintf(stderr, "%04d/%d bliss_pubkey_frompriv()" , i, set); exit(1); } // sign if ((sign = bliss_sign(priv, data_hash, 64)) == NULL) { fprintf(stderr, "%04d/%d bliss_sign()" , i, set); exit(1); } // verify if (bliss_verify(sign, data_hash, 64, pub)) { fprintf(stderr, "%04d/%d bliss_verify() FAIL.\n", i, set); exit(1); } else { // printf("%d Signature OK.\n", i); } bliss_sign_free(sign); bliss_pubkey_free(pub); bliss_privkey_free(priv); } } return 0; }
uint64_t notrand64() { if (nrpt >= 8) { nrpt = 0; sha3(nrpool, 3 * 64, nrpool[nrsel], 64); nrsel ^= 1; } return nrpool[nrsel][nrpt++]; }
Address MixClient::submitTransaction(Secret _secret, u256 _endowment, bytes const& _init, u256 _gas, u256 _gasPrice, bool _gasAuto) { WriteGuard l(x_state); u256 n = m_state.transactionsFrom(toAddress(_secret)); eth::Transaction t(_endowment, _gasPrice, _gas, _init, n, _secret); executeTransaction(t, m_state, false, _gasAuto, _secret); Address address = right160(sha3(rlpList(t.sender(), t.nonce()))); return address; }
void notrand_init() { uint64_t i; for (i = 0; i < 3; i++) sha3(&i, sizeof(i), nrpool[i], 64); nrpt = 0; nrsel = 0; }
h256 hash256(u256Map const& _s) { // build patricia tree. if (_s.empty()) return h256(); HexMap hexMap; for (auto i = _s.rbegin(); i != _s.rend(); ++i) hexMap[asNibbles(toBigEndianString(i->first))] = asString(rlp(i->second)); RLPStream s; hash256rlp(hexMap, hexMap.cbegin(), hexMap.cend(), 0, s); return sha3(s.out()); }
h256 hash256(StringMap const& _s) { // build patricia tree. if (_s.empty()) return h256(); HexMap hexMap; for (auto i = _s.rbegin(); i != _s.rend(); ++i) hexMap[toHex(i->first)] = i->second; RLPStream s; hash256rlp(hexMap, hexMap.cbegin(), hexMap.cend(), 0, s); return sha3(s.out()); }
NEXT CASE(SHA3) { ON_OP(); constexpr int64_t sha3Gas = VMSchedule::sha3Gas; constexpr int64_t sha3WordGas = VMSchedule::sha3WordGas; m_runGas = toInt63(sha3Gas + (u512(m_SP[1]) + 31) / 32 * sha3WordGas); updateMem(memNeed(m_SP[0], m_SP[1])); updateIOGas(); uint64_t inOff = (uint64_t)m_SP[0]; uint64_t inSize = (uint64_t)m_SP[1]; m_SPP[0] = (u256)sha3(bytesConstRef(m_mem.data() + inOff, inSize)); }
void hash256aux(HexMap const& _s, HexMap::const_iterator _begin, HexMap::const_iterator _end, unsigned _preLen, RLPStream& _rlp) { RLPStream rlp; hash256rlp(_s, _begin, _end, _preLen, rlp); if (rlp.out().size() < 32) { // RECURSIVE RLP #if ENABLE_DEBUG_PRINT cerr << "[INLINE: " << dec << rlp.out().size() << " < 32]" << endl; #endif _rlp.APPEND_CHILD(rlp.out()); } else { #if ENABLE_DEBUG_PRINT cerr << "[HASH: " << dec << rlp.out().size() << " >= 32]" << endl; #endif _rlp << sha3(rlp.out()); } }
namespace dev { h256 const EmptyTrie = sha3(rlp("")); /* * Hex-prefix Notation. First nibble has flags: oddness = 2^0 & termination = 2^1 * NOTE: the "termination marker" and "leaf-node" specifier are completely equivalent. * [0,0,1,2,3,4,5] 0x10012345 * [0,1,2,3,4,5] 0x00012345 * [1,2,3,4,5] 0x112345 * [0,0,1,2,3,4] 0x00001234 * [0,1,2,3,4] 0x101234 * [1,2,3,4] 0x001234 * [0,0,1,2,3,4,5,T] 0x30012345 * [0,0,1,2,3,4,T] 0x20001234 * [0,1,2,3,4,5,T] 0x20012345 * [1,2,3,4,5,T] 0x312345 * [1,2,3,4,T] 0x201234 */ std::string hexPrefixEncode(bytes const& _hexVector, bool _leaf, int _begin, int _end) { unsigned begin = _begin; unsigned end = _end < 0 ? _hexVector.size() + 1 + _end : _end; bool odd = ((end - begin) % 2) != 0; std::string ret(1, ((_leaf ? 2 : 0) | (odd ? 1 : 0)) * 16); if (odd) { ret[0] |= _hexVector[begin]; ++begin; } for (unsigned i = begin; i < end; i += 2) ret += _hexVector[i] * 16 + _hexVector[i + 1]; return ret; } std::string hexPrefixEncode(bytesConstRef _data, bool _leaf, int _beginNibble, int _endNibble, unsigned _offset) { unsigned begin = _beginNibble + _offset; unsigned end = (_endNibble < 0 ? ((int)(_data.size() * 2 - _offset) + 1) + _endNibble : _endNibble) + _offset; bool odd = (end - begin) & 1; std::string ret(1, ((_leaf ? 2 : 0) | (odd ? 1 : 0)) * 16); ret.reserve((end - begin) / 2 + 1); unsigned d = odd ? 1 : 2; for (auto i = begin; i < end; ++i, ++d) { byte n = nibble(_data, i); if (d & 1) // odd ret.back() |= n; // or the nibble onto the back else ret.push_back(n << 4); // push the nibble on to the back << 4 } return ret; } std::string hexPrefixEncode(bytesConstRef _d1, unsigned _o1, bytesConstRef _d2, unsigned _o2, bool _leaf) { unsigned begin1 = _o1; unsigned end1 = _d1.size() * 2; unsigned begin2 = _o2; unsigned end2 = _d2.size() * 2; bool odd = (end1 - begin1 + end2 - begin2) & 1; std::string ret(1, ((_leaf ? 2 : 0) | (odd ? 1 : 0)) * 16); ret.reserve((end1 - begin1 + end2 - begin2) / 2 + 1); unsigned d = odd ? 1 : 2; for (auto i = begin1; i < end1; ++i, ++d) { byte n = nibble(_d1, i); if (d & 1) // odd ret.back() |= n; // or the nibble onto the back else ret.push_back(n << 4); // push the nibble on to the back << 4 } for (auto i = begin2; i < end2; ++i, ++d) { byte n = nibble(_d2, i); if (d & 1) // odd ret.back() |= n; // or the nibble onto the back else ret.push_back(n << 4); // push the nibble on to the back << 4 } return ret; } byte uniqueInUse(RLP const& _orig, byte except) { byte used = 255; for (unsigned i = 0; i < 17; ++i) if (i != except && !_orig[i].isEmpty()) { if (used == 255) used = (byte)i; else return 255; } return used; } }
void hash256rlp(HexMap const& _s, HexMap::const_iterator _begin, HexMap::const_iterator _end, unsigned _preLen, RLPStream& _rlp) { #if ENABLE_DEBUG_PRINT static std::string s_indent; if (_preLen) s_indent += " "; #endif if (_begin == _end) _rlp << ""; // NULL else if (std::next(_begin) == _end) { // only one left - terminate with the pair. _rlp.appendList(2) << hexPrefixEncode(_begin->first, true, _preLen) << _begin->second; #if ENABLE_DEBUG_PRINT if (g_hashDebug) std::cerr << s_indent << toHex(bytesConstRef(_begin->first.data() + _preLen, _begin->first.size() - _preLen), 1) << ": " << _begin->second << " = " << sha3(_rlp.out()) << std::endl; #endif } else { // find the number of common prefix nibbles shared // i.e. the minimum number of nibbles shared at the beginning between the first hex string and each successive. uint sharedPre = (uint)-1; uint c = 0; for (auto i = std::next(_begin); i != _end && sharedPre; ++i, ++c) { uint x = std::min(sharedPre, std::min((uint)_begin->first.size(), (uint)i->first.size())); uint shared = _preLen; for (; shared < x && _begin->first[shared] == i->first[shared]; ++shared) {} sharedPre = std::min(shared, sharedPre); } if (sharedPre > _preLen) { // if they all have the same next nibble, we also want a pair. #if ENABLE_DEBUG_PRINT if (g_hashDebug) std::cerr << s_indent << toHex(bytesConstRef(_begin->first.data() + _preLen, sharedPre), 1) << ": " << std::endl; #endif _rlp.appendList(2) << hexPrefixEncode(_begin->first, false, _preLen, (int)sharedPre); hash256aux(_s, _begin, _end, (unsigned)sharedPre, _rlp); #if ENABLE_DEBUG_PRINT if (g_hashDebug) std::cerr << s_indent << "= " << hex << sha3(_rlp.out()) << dec << std::endl; #endif } else { // otherwise enumerate all 16+1 entries. _rlp.appendList(17); auto b = _begin; if (_preLen == b->first.size()) { #if ENABLE_DEBUG_PRINT if (g_hashDebug) std::cerr << s_indent << "@: " << b->second << std::endl; #endif ++b; } for (auto i = 0; i < 16; ++i) { auto n = b; for (; n != _end && n->first[_preLen] == i; ++n) {} if (b == n) _rlp << ""; else { #if ENABLE_DEBUG_PRINT if (g_hashDebug) std::cerr << s_indent << std::hex << i << ": " << std::dec << std::endl; #endif hash256aux(_s, b, n, _preLen + 1, _rlp); } b = n; } if (_preLen == _begin->first.size()) _rlp << _begin->second; else _rlp << ""; #if ENABLE_DEBUG_PRINT if (g_hashDebug) std::cerr << s_indent << "= " << hex << sha3(_rlp.out()) << dec << std::endl; #endif } } #if ENABLE_DEBUG_PRINT if (_preLen) s_indent.resize(s_indent.size() - 2); #endif }
namespace eth { const h256 c_shaNull = sha3(rlp("")); }
int main(void) { unsigned char input0bits[1] = { 0x00 }, input5bits[1] = { 0x13 }, input30bits[4] = { 0x53, 0x58, 0x7b, 0x19 }, input1600bits[200], input1605bits[201], input1630bits[204], input144bytes[144] = { 0x00 }, input29bits[4] = { 0x61, 0x62, 0x63, 0x06 }, *hash; unsigned long rounds, i, j; int print; scanf("%lu%d", &rounds, &print); for (i = 0; i < 200; i++) { input1600bits[i] = 0xa3; input1605bits[i] = 0xa3; input1630bits[i] = 0xa3; } input1605bits[i] = 0x03; while (i < 203) { input1630bits[i++] = 0xa3; } input1630bits[i] = 0x23; for (i = 0; i < rounds; i++) { /* Test standard hash lengths as per http://csrc.nist.gov/groups/ST/toolkit/examples.html#aHashing */ if (sha3_test(input0bits, 0UL, print) == EXIT_FAILURE) { return EXIT_FAILURE; } if (sha3_test(input5bits, 5UL, print) == EXIT_FAILURE) { return EXIT_FAILURE; } if (sha3_test(input30bits, 30UL, print) == EXIT_FAILURE) { return EXIT_FAILURE; } if (sha3_test(input1600bits, 1600UL, print) == EXIT_FAILURE) { return EXIT_FAILURE; } if (sha3_test(input1605bits, 1605UL, print) == EXIT_FAILURE) { return EXIT_FAILURE; } if (sha3_test(input1630bits, 1630UL, print) == EXIT_FAILURE) { return EXIT_FAILURE; } /* Test particular padding cases */ hash = sha3_224(input144bytes, 1148UL); if (hash) { if (print) { sha3_print_hash(hash, 224UL, "sha3_224(input144bytes, 1148) ="); } free(hash); } else { return EXIT_FAILURE; } hash = sha3_224(input144bytes, 1149UL); if (hash) { if (print) { sha3_print_hash(hash, 224UL, "sha3_224(input144bytes, 1149) ="); } free(hash); } else { return EXIT_FAILURE; } /* Test all possible hash lengths */ for (j = 32; j < 800; j += 32) { hash = sha3(input29bits, 29UL, j); if (hash) { if (print) { sha3_print_hash(hash, j, "sha3(input29bits, 29, %lu) =", j); } free(hash); } else { return EXIT_FAILURE; } } } return EXIT_SUCCESS; }
h256 MemTrie::hash256() const { return m_root ? m_root->hash256() : sha3(dev::rlp(bytesConstRef())); }
// TODO: prototype changed - will need rejigging. ExecutionResult MixClient::debugTransaction(Transaction const& _t, State const& _state, EnvInfo const& _envInfo, bool _call) { State execState = _state; execState.addBalance(_t.sender(), _t.gas() * _t.gasPrice()); //give it enough balance for gas estimation eth::ExecutionResult er; Executive execution(execState, _envInfo); execution.setResultRecipient(er); execution.initialize(_t); execution.execute(); std::vector<MachineState> machineStates; std::vector<unsigned> levels; std::vector<MachineCode> codes; std::map<bytes const*, unsigned> codeIndexes; std::vector<bytes> data; std::map<bytesConstRef const*, unsigned> dataIndexes; bytes const* lastCode = nullptr; bytesConstRef const* lastData = nullptr; unsigned codeIndex = 0; unsigned dataIndex = 0; auto onOp = [&](uint64_t steps, Instruction inst, bigint newMemSize, bigint gasCost, bigint gas, void* voidVM, void const* voidExt) { VM& vm = *static_cast<VM*>(voidVM); ExtVM const& ext = *static_cast<ExtVM const*>(voidExt); if (lastCode == nullptr || lastCode != &ext.code) { auto const& iter = codeIndexes.find(&ext.code); if (iter != codeIndexes.end()) codeIndex = iter->second; else { codeIndex = codes.size(); codes.push_back(MachineCode({ext.myAddress, ext.code})); codeIndexes[&ext.code] = codeIndex; } lastCode = &ext.code; } if (lastData == nullptr || lastData != &ext.data) { auto const& iter = dataIndexes.find(&ext.data); if (iter != dataIndexes.end()) dataIndex = iter->second; else { dataIndex = data.size(); data.push_back(ext.data.toBytes()); dataIndexes[&ext.data] = dataIndex; } lastData = &ext.data; } if (levels.size() < ext.depth) levels.push_back(machineStates.size() - 1); else levels.resize(ext.depth); machineStates.push_back(MachineState{ steps, vm.curPC(), inst, newMemSize, static_cast<u256>(gas), vm.stack(), vm.memory(), gasCost, ext.state().storage(ext.myAddress), std::move(levels), codeIndex, dataIndex }); }; execution.go(onOp); execution.finalize(); switch (er.excepted) { case TransactionException::None: break; case TransactionException::NotEnoughCash: BOOST_THROW_EXCEPTION(Exception() << errinfo_comment("Insufficient balance for contract deployment")); case TransactionException::OutOfGasIntrinsic: case TransactionException::OutOfGasBase: case TransactionException::OutOfGas: BOOST_THROW_EXCEPTION(OutOfGas() << errinfo_comment("Not enough gas")); case TransactionException::BlockGasLimitReached: BOOST_THROW_EXCEPTION(OutOfGas() << errinfo_comment("Block gas limit reached")); case TransactionException::BadJumpDestination: BOOST_THROW_EXCEPTION(OutOfGas() << errinfo_comment("Solidity exception (bad jump)")); case TransactionException::OutOfStack: BOOST_THROW_EXCEPTION(Exception() << errinfo_comment("Out of stack")); case TransactionException::StackUnderflow: BOOST_THROW_EXCEPTION(Exception() << errinfo_comment("Stack underflow")); //these should not happen in mix case TransactionException::Unknown: case TransactionException::BadInstruction: case TransactionException::InvalidSignature: case TransactionException::InvalidNonce: case TransactionException::InvalidFormat: case TransactionException::BadRLP: BOOST_THROW_EXCEPTION(Exception() << errinfo_comment("Internal execution error")); } ExecutionResult d; d.inputParameters = _t.data(); d.result = er; d.machineStates = machineStates; d.executionCode = std::move(codes); d.transactionData = std::move(data); d.address = _t.receiveAddress(); d.sender = _t.sender(); d.value = _t.value(); d.gasUsed = er.gasUsed + er.gasRefunded + c_callStipend; if (_t.isCreation()) d.contractAddress = right160(sha3(rlpList(_t.sender(), _t.nonce()))); if (!_call) d.transactionIndex = m_postMine.pending().size(); d.executonIndex = m_executions.size(); return d; }
void MixClient::executeTransaction(Transaction const& _t, State& _state, bool _call, bool _gasAuto, Secret const& _secret) { Transaction t = _gasAuto ? replaceGas(_t, _secret, m_state.gasLimitRemaining()) : _t; bytes rlp = t.rlp(); // do debugging run first LastHashes lastHashes(256); lastHashes[0] = bc().numberHash(bc().number()); for (unsigned i = 1; i < 256; ++i) lastHashes[i] = lastHashes[i - 1] ? bc().details(lastHashes[i - 1]).parent : h256(); State execState = _state; Executive execution(execState, lastHashes, 0); execution.initialize(&rlp); execution.execute(); std::vector<MachineState> machineStates; std::vector<unsigned> levels; std::vector<MachineCode> codes; std::map<bytes const*, unsigned> codeIndexes; std::vector<bytes> data; std::map<bytesConstRef const*, unsigned> dataIndexes; bytes const* lastCode = nullptr; bytesConstRef const* lastData = nullptr; unsigned codeIndex = 0; unsigned dataIndex = 0; auto onOp = [&](uint64_t steps, Instruction inst, dev::bigint newMemSize, dev::bigint gasCost, void* voidVM, void const* voidExt) { VM& vm = *static_cast<VM*>(voidVM); ExtVM const& ext = *static_cast<ExtVM const*>(voidExt); if (lastCode == nullptr || lastCode != &ext.code) { auto const& iter = codeIndexes.find(&ext.code); if (iter != codeIndexes.end()) codeIndex = iter->second; else { codeIndex = codes.size(); codes.push_back(MachineCode({ext.myAddress, ext.code})); codeIndexes[&ext.code] = codeIndex; } lastCode = &ext.code; } if (lastData == nullptr || lastData != &ext.data) { auto const& iter = dataIndexes.find(&ext.data); if (iter != dataIndexes.end()) dataIndex = iter->second; else { dataIndex = data.size(); data.push_back(ext.data.toBytes()); dataIndexes[&ext.data] = dataIndex; } lastData = &ext.data; } if (levels.size() < ext.depth) levels.push_back(machineStates.size() - 1); else levels.resize(ext.depth); machineStates.emplace_back(MachineState({steps, vm.curPC(), inst, newMemSize, vm.gas(), vm.stack(), vm.memory(), gasCost, ext.state().storage(ext.myAddress), levels, codeIndex, dataIndex})); }; execution.go(onOp); execution.finalize(); dev::eth::ExecutionResult er = execution.executionResult(); switch (er.excepted) { case TransactionException::None: break; case TransactionException::NotEnoughCash: BOOST_THROW_EXCEPTION(Exception() << errinfo_comment("Insufficient balance for contract deployment")); case TransactionException::OutOfGasBase: case TransactionException::OutOfGas: BOOST_THROW_EXCEPTION(OutOfGas() << errinfo_comment("Not enough gas")); case TransactionException::BlockGasLimitReached: BOOST_THROW_EXCEPTION(OutOfGas() << errinfo_comment("Block gas limit reached")); case TransactionException::OutOfStack: BOOST_THROW_EXCEPTION(Exception() << errinfo_comment("Out of stack")); case TransactionException::StackUnderflow: BOOST_THROW_EXCEPTION(Exception() << errinfo_comment("Stack underflow")); //these should not happen in mix case TransactionException::Unknown: case TransactionException::BadInstruction: case TransactionException::BadJumpDestination: case TransactionException::InvalidSignature: case TransactionException::InvalidNonce: BOOST_THROW_EXCEPTION(Exception() << errinfo_comment("Internal execution error")); }; ExecutionResult d; d.result = execution.executionResult(); d.machineStates = machineStates; d.executionCode = std::move(codes); d.transactionData = std::move(data); d.address = _t.receiveAddress(); d.sender = _t.sender(); d.value = _t.value(); d.gasUsed = er.gasUsed + er.gasRefunded; if (_t.isCreation()) d.contractAddress = right160(sha3(rlpList(_t.sender(), _t.nonce()))); if (!_call) d.transactionIndex = m_state.pending().size(); d.executonIndex = m_executions.size(); // execute on a state if (!_call) { t = _gasAuto ? replaceGas(_t, _secret, d.gasUsed) : _t; er =_state.execute(lastHashes, t); if (t.isCreation() && _state.code(d.contractAddress).empty()) BOOST_THROW_EXCEPTION(OutOfGas() << errinfo_comment("Not enough gas for contract deployment")); d.gasUsed = er.gasUsed + er.gasRefunded + er.gasForDeposit; // collect watches h256Set changed; Guard l(x_filtersWatches); for (std::pair<h256 const, eth::InstalledFilter>& i: m_filters) if ((unsigned)i.second.filter.latest() > bc().number()) { // acceptable number. auto m = i.second.filter.matches(_state.receipt(_state.pending().size() - 1)); if (m.size()) { // filter catches them for (LogEntry const& l: m) i.second.changes.push_back(LocalisedLogEntry(l, bc().number() + 1)); changed.insert(i.first); } } changed.insert(dev::eth::PendingChangedFilter); noteChanged(changed); } WriteGuard l(x_executions); m_executions.emplace_back(std::move(d)); }