Merge branch 'duke' into dev
This commit is contained in:
@@ -2,7 +2,7 @@
|
||||
# Distributed under the GPLv3 software license, see the accompanying
|
||||
# file COPYING or https://www.gnu.org/licenses/gpl-3.0.en.html
|
||||
|
||||
DIST_SUBDIRS = secp256k1 univalue cryptoconditions
|
||||
DIST_SUBDIRS = secp256k1 univalue
|
||||
|
||||
AM_LDFLAGS = $(PTHREAD_CFLAGS) $(LIBTOOL_LDFLAGS) $(SAN_LDFLAGS) $(HARDENED_LDFLAGS)
|
||||
AM_CXXFLAGS = $(SAN_CXXFLAGS) $(HARDENED_CXXFLAGS) $(ERROR_CXXFLAGS)
|
||||
@@ -35,9 +35,6 @@ BITCOIN_INCLUDES=-I$(builddir) -I$(builddir)/obj $(BDB_CPPFLAGS) $(BOOST_CPPFLAG
|
||||
|
||||
BITCOIN_INCLUDES += -I$(srcdir)/secp256k1/include
|
||||
BITCOIN_INCLUDES += -I$(srcdir)/cc/includes
|
||||
BITCOIN_INCLUDES += -I$(srcdir)/cryptoconditions/include
|
||||
BITCOIN_INCLUDES += -I$(srcdir)/cryptoconditions/src
|
||||
BITCOIN_INCLUDES += -I$(srcdir)/cryptoconditions/src/asn
|
||||
BITCOIN_INCLUDES += -I$(srcdir)/univalue/include
|
||||
BITCOIN_INCLUDES += -I$(srcdir)/leveldb/include
|
||||
|
||||
@@ -57,7 +54,6 @@ LIBBITCOIN_CLI=libbitcoin_cli.a
|
||||
LIBBITCOIN_UTIL=libbitcoin_util.a
|
||||
LIBBITCOIN_CRYPTO=crypto/libbitcoin_crypto.a
|
||||
LIBSECP256K1=secp256k1/libsecp256k1.la
|
||||
LIBCRYPTOCONDITIONS=cryptoconditions/libcryptoconditions_core.la
|
||||
LIBUNIVALUE=univalue/libunivalue.la
|
||||
LIBZCASH=libzcash.a
|
||||
LIBHUSH=libhush.a
|
||||
@@ -76,9 +72,6 @@ $(LIBSECP256K1): $(wildcard secp256k1/src/*) $(wildcard secp256k1/include/*)
|
||||
$(LIBUNIVALUE): $(wildcard univalue/lib/*)
|
||||
$(AM_V_at)$(MAKE) $(AM_MAKEFLAGS) -C $(@D) $(@F) OPTFLAGS="-O2 -march=$(PLATFORM_VARIANT) -g "
|
||||
|
||||
$(LIBCRYPTOCONDITIONS): $(wildcard cryptoconditions/src/*) $(wildcard cryptoconditions/include/*)
|
||||
$(AM_V_at)$(MAKE) $(AM_MAKEFLAGS) -C $(@D) $(@F) OPTFLAGS="-O2 -march=$(PLATFORM_VARIANT) -g "
|
||||
|
||||
# Make is not made aware of per-object dependencies to avoid limiting building parallelization
|
||||
# But to build the less dependent modules first, we manually select their order here:
|
||||
EXTRA_LIBRARIES += \
|
||||
@@ -410,7 +403,6 @@ libbitcoin_common_a_SOURCES = \
|
||||
script/sign.cpp \
|
||||
script/standard.cpp \
|
||||
transaction_builder.cpp \
|
||||
cc/CCtokenutils.cpp \
|
||||
cc/CCutilbits.cpp \
|
||||
$(BITCOIN_CORE_H) \
|
||||
$(LIBZCASH_H)
|
||||
@@ -481,7 +473,6 @@ hushd_LDADD = \
|
||||
$(LIBLEVELDB) \
|
||||
$(LIBMEMENV) \
|
||||
$(LIBSECP256K1) \
|
||||
$(LIBCRYPTOCONDITIONS) \
|
||||
$(LIBRANDOMX)
|
||||
|
||||
if ENABLE_WALLET
|
||||
@@ -559,7 +550,6 @@ wallet_utility_LDADD = \
|
||||
$(CRYPTO_LIBS) \
|
||||
$(LIBZCASH) \
|
||||
$(LIBZCASH_LIBS)\
|
||||
$(LIBCRYPTOCONDITIONS) \
|
||||
$(LIBRANDOMX)
|
||||
endif
|
||||
|
||||
@@ -582,7 +572,6 @@ hush_tx_LDADD = \
|
||||
$(LIBHUSH) \
|
||||
$(LIBBITCOIN_CRYPTO) \
|
||||
$(LIBZCASH_LIBS) \
|
||||
$(LIBCRYPTOCONDITIONS) \
|
||||
$(LIBRANDOMX)
|
||||
|
||||
hush_tx_LDADD += $(BOOST_LIBS) $(CRYPTO_LIBS)
|
||||
@@ -634,7 +623,7 @@ endif
|
||||
|
||||
libzcashconsensus_la_LDFLAGS = $(AM_LDFLAGS) -no-undefined $(RELDFLAGS)
|
||||
libzcashconsensus_la_LIBADD = $(LIBSECP256K1)
|
||||
libzcashconsensus_la_CPPFLAGS = $(AM_CPPFLAGS) -I$(builddir)/obj -I$(srcdir)/secp256k1/include -I$(srcdir)/cryptoconditions/include -DBUILD_BITCOIN_INTERNAL
|
||||
libzcashconsensus_la_CPPFLAGS = $(AM_CPPFLAGS) -I$(builddir)/obj -I$(srcdir)/secp256k1/include -DBUILD_BITCOIN_INTERNAL
|
||||
libzcashconsensus_la_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS)
|
||||
|
||||
endif
|
||||
|
||||
@@ -1,39 +0,0 @@
|
||||
// Copyright (c) 2016-2023 The Hush developers
|
||||
// Distributed under the GPLv3 software license, see the accompanying
|
||||
// file COPYING or https://www.gnu.org/licenses/gpl-3.0.en.html
|
||||
/******************************************************************************
|
||||
* Copyright © 2014-2019 The SuperNET Developers. *
|
||||
* *
|
||||
* See the AUTHORS, DEVELOPER-AGREEMENT and LICENSE files at *
|
||||
* the top-level directory of this distribution for the individual copyright *
|
||||
* holder information and the developer policies on copyright and licensing. *
|
||||
* *
|
||||
* Unless otherwise agreed in a custom licensing agreement, no part of the *
|
||||
* SuperNET software, including this file may be copied, modified, propagated *
|
||||
* or distributed except according to the terms contained in the LICENSE file *
|
||||
* *
|
||||
* Removal or modification of this copyright notice is prohibited. *
|
||||
* *
|
||||
******************************************************************************/
|
||||
|
||||
#ifndef CC_HEIR_H
|
||||
#define CC_HEIR_H
|
||||
|
||||
#include "CCinclude.h"
|
||||
#include "CCtokens.h"
|
||||
|
||||
//#define EVAL_HEIR 0xea
|
||||
|
||||
bool HeirValidate(struct CCcontract_info *cp,Eval* eval,const CTransaction &tx, uint32_t nIn);
|
||||
|
||||
class CoinHelper;
|
||||
class TokenHelper;
|
||||
|
||||
UniValue HeirFundCoinCaller(int64_t txfee, int64_t coins, std::string heirName, CPubKey heirPubkey, int64_t inactivityTimeSec, std::string memo);
|
||||
UniValue HeirFundTokenCaller(int64_t txfee, int64_t satoshis, std::string heirName, CPubKey heirPubkey, int64_t inactivityTimeSec, std::string memo, uint256 tokenid);
|
||||
UniValue HeirClaimCaller(uint256 fundingtxid, int64_t txfee, std::string amount);
|
||||
UniValue HeirAddCaller(uint256 fundingtxid, int64_t txfee, std::string amount);
|
||||
UniValue HeirInfo(uint256 fundingtxid);
|
||||
UniValue HeirList();
|
||||
|
||||
#endif
|
||||
@@ -1,40 +0,0 @@
|
||||
// Copyright (c) 2016-2023 The Hush developers
|
||||
// Distributed under the GPLv3 software license, see the accompanying
|
||||
// file COPYING or https://www.gnu.org/licenses/gpl-3.0.en.html
|
||||
/******************************************************************************
|
||||
* Copyright © 2014-2018 The SuperNET Developers. *
|
||||
* *
|
||||
* See the AUTHORS, DEVELOPER-AGREEMENT and LICENSE files at *
|
||||
* the top-level directory of this distribution for the individual copyright *
|
||||
* holder information and the developer policies on copyright and licensing. *
|
||||
* *
|
||||
* Unless otherwise agreed in a custom licensing agreement, no part of the *
|
||||
* SuperNET software, including this file may be copied, modified, propagated *
|
||||
* or distributed except according to the terms contained in the LICENSE file *
|
||||
* *
|
||||
* Removal or modification of this copyright notice is prohibited. *
|
||||
* *
|
||||
******************************************************************************/
|
||||
|
||||
|
||||
#ifndef CC_IMPORTGATEWAY_H
|
||||
#define CC_IMPORTGATEWAY_H
|
||||
|
||||
#include "CCinclude.h"
|
||||
|
||||
// CCcustom
|
||||
bool ImportGatewayValidate(struct CCcontract_info *cp,Eval *eval,const CTransaction &tx, uint32_t nIn);
|
||||
bool ImportGatewayExactAmounts(bool goDeeper, struct CCcontract_info *cpTokens, int64_t &inputs, int64_t &outputs, Eval* eval, const CTransaction &tx, uint256 tokenid);
|
||||
std::string ImportGatewayBind(uint64_t txfee,std::string coin,uint256 oracletxid,uint8_t M,uint8_t N,std::vector<CPubKey> pubkeys,uint8_t p1,uint8_t p2,uint8_t p3,uint8_t p4);
|
||||
std::string ImportGatewayDeposit(uint64_t txfee,uint256 bindtxid,int32_t height,std::string refcoin,uint256 burntxid,int32_t burnvout,std::string rawburntx,std::vector<uint8_t>proof,CPubKey destpub,int64_t amount);
|
||||
std::string ImportGatewayWithdraw(uint64_t txfee,uint256 bindtxid,std::string refcoin,CPubKey withdrawpub,int64_t amount);
|
||||
std::string ImportGatewayPartialSign(uint64_t txfee,uint256 lasttxid,std::string refcoin, std::string hex);
|
||||
std::string ImportGatewayCompleteSigning(uint64_t txfee,uint256 lasttxid,std::string refcoin,std::string hex);
|
||||
std::string ImportGatewayMarkDone(uint64_t txfee,uint256 completetxid,std::string refcoin);
|
||||
UniValue ImportGatewayPendingWithdraws(uint256 bindtxid,std::string refcoin);
|
||||
UniValue ImportGatewayProcessedWithdraws(uint256 bindtxid,std::string refcoin);
|
||||
UniValue ImportGatewayExternalAddress(uint256 bindtxid,CPubKey pubkey);
|
||||
UniValue ImportGatewayDumpPrivKey(uint256 bindtxid,CKey key);
|
||||
UniValue ImportGatewayList();
|
||||
UniValue ImportGatewayInfo(uint256 bindtxid);
|
||||
#endif
|
||||
@@ -1,37 +0,0 @@
|
||||
// Copyright (c) 2016-2023 The Hush developers
|
||||
// Distributed under the GPLv3 software license, see the accompanying
|
||||
// file COPYING or https://www.gnu.org/licenses/gpl-3.0.en.html
|
||||
/******************************************************************************
|
||||
* Copyright © 2014-2019 The SuperNET Developers. *
|
||||
* *
|
||||
* See the AUTHORS, DEVELOPER-AGREEMENT and LICENSE files at *
|
||||
* the top-level directory of this distribution for the individual copyright *
|
||||
* holder information and the developer policies on copyright and licensing. *
|
||||
* *
|
||||
* Unless otherwise agreed in a custom licensing agreement, no part of the *
|
||||
* SuperNET software, including this file may be copied, modified, propagated *
|
||||
* or distributed except according to the terms contained in the LICENSE file *
|
||||
* *
|
||||
* Removal or modification of this copyright notice is prohibited. *
|
||||
* *
|
||||
******************************************************************************/
|
||||
|
||||
|
||||
#ifndef CC_ORACLES_H
|
||||
#define CC_ORACLES_H
|
||||
|
||||
#include "CCinclude.h"
|
||||
|
||||
bool OraclesValidate(struct CCcontract_info *cp,Eval* eval,const CTransaction &tx, uint32_t nIn);
|
||||
UniValue OracleCreate(const CPubKey& pk, int64_t txfee,std::string name,std::string description,std::string format);
|
||||
UniValue OracleFund(const CPubKey& pk, int64_t txfee,uint256 oracletxid);
|
||||
UniValue OracleRegister(const CPubKey& pk, int64_t txfee,uint256 oracletxid,int64_t datafee);
|
||||
UniValue OracleSubscribe(const CPubKey& pk, int64_t txfee,uint256 oracletxid,CPubKey publisher,int64_t amount);
|
||||
UniValue OracleData(const CPubKey& pk, int64_t txfee,uint256 oracletxid,std::vector <uint8_t> data);
|
||||
// CCcustom
|
||||
UniValue OracleDataSample(uint256 reforacletxid,uint256 txid);
|
||||
UniValue OracleDataSamples(uint256 reforacletxid,char* batonaddr,int32_t num);
|
||||
UniValue OracleInfo(uint256 origtxid);
|
||||
UniValue OraclesList();
|
||||
|
||||
#endif
|
||||
@@ -1,18 +0,0 @@
|
||||
// Copyright (c) 2016-2023 The Hush developers
|
||||
// Distributed under the GPLv3 software license, see the accompanying
|
||||
// file COPYING or https://www.gnu.org/licenses/gpl-3.0.en.html
|
||||
/******************************************************************************
|
||||
* Copyright © 2014-2019 The SuperNET Developers. *
|
||||
* *
|
||||
* See the AUTHORS, DEVELOPER-AGREEMENT and LICENSE files at *
|
||||
* the top-level directory of this distribution for the individual copyright *
|
||||
* holder information and the developer policies on copyright and licensing. *
|
||||
* *
|
||||
* Unless otherwise agreed in a custom licensing agreement, no part of the *
|
||||
* SuperNET software, including this file may be copied, modified, propagated *
|
||||
* or distributed except according to the terms contained in the LICENSE file *
|
||||
* *
|
||||
* Removal or modification of this copyright notice is prohibited. *
|
||||
* *
|
||||
******************************************************************************/
|
||||
|
||||
@@ -1,66 +0,0 @@
|
||||
// Copyright (c) 2016-2023 The Hush developers
|
||||
// Distributed under the GPLv3 software license, see the accompanying
|
||||
// file COPYING or https://www.gnu.org/licenses/gpl-3.0.en.html
|
||||
/******************************************************************************
|
||||
* Copyright © 2014-2019 The SuperNET Developers. *
|
||||
* *
|
||||
* See the AUTHORS, DEVELOPER-AGREEMENT and LICENSE files at *
|
||||
* the top-level directory of this distribution for the individual copyright *
|
||||
* holder information and the developer policies on copyright and licensing. *
|
||||
* *
|
||||
* Unless otherwise agreed in a custom licensing agreement, no part of the *
|
||||
* SuperNET software, including this file may be copied, modified, propagated *
|
||||
* or distributed except according to the terms contained in the LICENSE file *
|
||||
* *
|
||||
* Removal or modification of this copyright notice is prohibited. *
|
||||
* *
|
||||
******************************************************************************/
|
||||
|
||||
|
||||
#ifndef CC_PRICES_H
|
||||
#define CC_PRICES_H
|
||||
|
||||
#include "hush_defs.h"
|
||||
#include "CCinclude.h"
|
||||
|
||||
int32_t hush_priceget(int64_t *buf64,int32_t ind,int32_t height,int32_t numblocks);
|
||||
extern void GetHushEarlytxidScriptPub();
|
||||
extern CScript HUSH_EARLYTXID_SCRIPTPUB;
|
||||
|
||||
// #define PRICES_DAYWINDOW ((3600*24/ASSETCHAINS_BLOCKTIME) + 1) // defined in hush_defs.h
|
||||
#define PRICES_TXFEE 10000
|
||||
#define PRICES_MAXLEVERAGE 777
|
||||
#define PRICES_SMOOTHWIDTH 1
|
||||
#define HUSH_MAXPRICES 2048 // must be power of 2 and less than 8192
|
||||
#define HUSH_PRICEMASK (~(HUSH_MAXPRICES - 1)) // actually 1111 1000 0000 0000
|
||||
#define PRICES_WEIGHT (HUSH_MAXPRICES * 1) // 0000 1000 0000 0000
|
||||
#define PRICES_MULT (HUSH_MAXPRICES * 2) // 0001 0000 0000 0000
|
||||
#define PRICES_DIV (HUSH_MAXPRICES * 3) // 0001 1000 0000 0000
|
||||
#define PRICES_INV (HUSH_MAXPRICES * 4) // 0010 0000 0000 0000
|
||||
#define PRICES_MDD (HUSH_MAXPRICES * 5) // 0010 1000 0000 0000
|
||||
#define PRICES_MMD (HUSH_MAXPRICES * 6) // 0011 0000 0000 0000
|
||||
#define PRICES_MMM (HUSH_MAXPRICES * 7) // 0011 1000 0000 0000
|
||||
#define PRICES_DDD (HUSH_MAXPRICES * 8) // 0100 0000 0000 0000
|
||||
|
||||
//#define PRICES_NORMFACTOR (int64_t)(SATOSHIDEN)
|
||||
//#define PRICES_POINTFACTOR (int64_t)10000
|
||||
|
||||
#define PRICES_REVSHAREDUST 10000
|
||||
#define PRICES_SUBREVSHAREFEE(amount) ((amount) * 199 / 200) // revshare fee percentage == 0.005
|
||||
#define PRICES_MINAVAILFUNDFRACTION 0.1 // leveraged bet limit < fund fraction
|
||||
|
||||
bool PricesValidate(struct CCcontract_info *cp,Eval* eval,const CTransaction &tx, uint32_t nIn);
|
||||
|
||||
// CCcustom
|
||||
UniValue PricesBet(int64_t txfee,int64_t amount,int16_t leverage,std::vector<std::string> synthetic);
|
||||
UniValue PricesAddFunding(int64_t txfee,uint256 bettxid,int64_t amount);
|
||||
UniValue PricesSetcostbasis(int64_t txfee,uint256 bettxid);
|
||||
UniValue PricesRekt(int64_t txfee,uint256 bettxid,int32_t rektheight);
|
||||
UniValue PricesCashout(int64_t txfee,uint256 bettxid);
|
||||
UniValue PricesInfo(uint256 bettxid,int32_t refheight);
|
||||
UniValue PricesList(uint32_t filter, CPubKey mypk);
|
||||
UniValue PricesGetOrderbook();
|
||||
UniValue PricesRefillFund(int64_t amount);
|
||||
|
||||
|
||||
#endif
|
||||
@@ -1,715 +0,0 @@
|
||||
// Copyright (c) 2016-2023 The Hush developers
|
||||
/******************************************************************************
|
||||
* Copyright © 2014-2019 The SuperNET Developers. *
|
||||
* *
|
||||
* See the AUTHORS, DEVELOPER-AGREEMENT and LICENSE files at *
|
||||
* the top-level directory of this distribution for the individual copyright *
|
||||
* holder information and the developer policies on copyright and licensing. *
|
||||
* *
|
||||
* Unless otherwise agreed in a custom licensing agreement, no part of the *
|
||||
* SuperNET software, including this file may be copied, modified, propagated *
|
||||
* or distributed except according to the terms contained in the LICENSE file *
|
||||
* *
|
||||
* Removal or modification of this copyright notice is prohibited. *
|
||||
* *
|
||||
******************************************************************************/
|
||||
|
||||
How to write utxo based CryptoConditions contracts for HUSH chains
|
||||
by jl777
|
||||
|
||||
This is not the only smart contracts methodology that is possible to build on top of OP_CHECKCRYPTOCONDITION, just the first one. All the credit for getting OP_CHECKCRYPTOCONDITION working in the Hush codebase goes to @libscott. I am just hooking into the code that he made and tried to make it just a little easier to make new contracts.
|
||||
|
||||
There is probably some fancy marketing name to use, but for now, I will just call it "CC contract" for short, knowing that it is not 100% technically accurate as the CryptoConditions aspect is not really the main attribute. However, the HUSH contracts were built to make the CryptoConditions codebase that was integrated into it to be more accessible.
|
||||
|
||||
Since CC contracts run native C/C++ code, it is turing complete and that means that any contract that is possible to do on any other platform will be possible to create via CC contract.
|
||||
|
||||
utxo based contracts are a bit harder to start writing than for balance based contracts. However, they are much more secure as they leverage the existing bitcoin utxo system. That makes it much harder to have bugs that issue a zillion new coins from a bug, since all the CC contract operations needs to also obey the existing bitcoin utxo protocol.
|
||||
|
||||
This document will be heavily example based so it will utilize many of the existing reference CC contracts. After understanding this document, you should be in a good position to start creating either a new CC contract to be integrated into hushd or to make rpc based dapps directly.
|
||||
|
||||
Chapter 0 - Bitcoin Protocol Basics
|
||||
There are many aspects of the bitcoin protocol that isnt needed to understand the CC contracts dependence on it. Such details will not be discussed. The primary aspect is the utxo, unspent transaction output. Just a fancy name for txid/vout, so when you sendtoaddress some coins, it creates a txid and the first output is vout.0, combine it and txid/0 is a specific utxo.
|
||||
|
||||
Of course, to understand even this level of detail requires that you understand what a txid is, but there are plenty of reference materials on that. It is basically the 64 char long set of letters and numbers that you get when you send funds.
|
||||
|
||||
Implicit with the utxo is that it prevents double spends. Once you spend a utxo, you cant spend it again. This is quite an important characteristic and while advanced readers will point out chain reorgs can allow a double spend, we will not confuse the issue with such details. The important thing is that given a blockchain at a specific height's blockhash, you can know if a txid/vout has been spent or not.
|
||||
|
||||
There are also the transactions that are in memory waiting to be mined, the mempool. And it is possible for the utxo to be spent by a tx in the mempool. However since it isnt confirmed yet, it is still unspent at the current height, even if we are pretty sure it will be spent in the next block.
|
||||
|
||||
A useful example is to think about a queue of people lined up to get into an event. They need to have a valid ticket and also to get into the queue. After some time passes, they get their ticket stamped and allowed into the event.
|
||||
|
||||
In the utxo case, the ticket is the spending transaction and the event is the confirmed blockchain. The queue is the mempool.
|
||||
|
||||
|
||||
Chapter 1 - OP_CHECKCRYPTOCONDITION
|
||||
In the prior chapter the utxo was explained. However, the specific mechanism used to send a payment was not explained. Contrary to what most people might think, on the blockchain there are not entries that say "pay X amount to address". Instead what exists is a bitcoin script that must be satisfied in order for the funds to be able to be spent.
|
||||
|
||||
Originally, there was the pay to pubkey script:
|
||||
<pubkey> <checksig>
|
||||
|
||||
About as simple of a payment script that you can get. Basically the pubkey's signature is checked and if it is valid, you get to spend it. One problem satoshi realized was that with Quantum Computers such payment scripts are vulnerable! So, he made a way to have a cold address, ie. an address whose pubkey isnt known. At least it isnt known until it is spent, so it is only Quantum resistant prior to the first spend. This line of reasoning is why we have one time use addresses and a new change address for each transaction. Maybe in some ways, this is too forward thinking as it makes things a lot more confusing to use and easier to lose track of all the required private keys.
|
||||
|
||||
However, it is here to stay and its script is:
|
||||
<hash the pubkey> <pubkey> <verify hash matches> <checksig>
|
||||
|
||||
With this, the blockchain has what maps to "pay to address", just that the address is actually a base58 encoded (prefix + pubkeyhash). Hey, if it wasnt complicated, it would be easy!
|
||||
|
||||
In order to spend a p2pkh (pay to pubkey hash) utxo, you need to divulge the pubkey in addition to having a valid signature. After the first spend from an address, its security is degraded to p2pk (pay to pubkey) as its pubkey is now known. The net result is that each reused address takes 25 extra bytes on the blockchain, and that is why for addresses that are expected to be reused, I just use the p2pk script.
|
||||
|
||||
Originally, bitcoin allowed any type of script opcodes to be used directly. The problem was some of them caused problems and satoshi decided to disable them and only allow standard forms of payments. Thus the p2pk and p2pkh became 99%+ of bitcoin transactions. However, going from having a fully scriptable language that can create countless payment scripts (and bugs!), to having just 2... well it was a "short term" limitation. It did last for some years but eventually a compromise p2sh script was allowed to be standard. This is a pay to script hash, so it can have a standard format as the normal p2pkh, but have infinitely more flexibility.
|
||||
|
||||
<hash the script> <script> <verify hash matches>
|
||||
|
||||
Wait, something is wrong! If it was just that, then anybody that found out what the required script (called redeemscript) was, they could just spend it. I forgot to say that the redeemscript is then used to determine if the payment can be spent or not. So you can have a normal p2pk or p2pkh redeemscript inside a p2sh script.
|
||||
|
||||
OK, I know that just got really confusing. Let us have a more clear example:
|
||||
|
||||
redeemscript <- pay to pubkey
|
||||
p2sh becomes the hash of the redeem script + the compares
|
||||
|
||||
So to spend it, you need to divulge the redeemscript, which in turn requires you to divulge the pubkey. Put it all together and the p2sh mechanism verifies you not only had the correct redeemscript by comparing its hash, but that when the redeemscript is run, it is satisfied. In this case, that the pubkey's signature was valid.
|
||||
|
||||
If you are still following, there is some good news! OP_CHECKCRYPTOCONDITION scripts are actually simpler than p2sh scripts in some sense as there isnt this extra level of script inside a scripthash. @libscott implemented the addition of OP_CHECKCRYPTOCONDITION to the set of bitcoin opcodes and what it does is makes sure that a CryptoConditions script is properly signed.
|
||||
|
||||
Which gets us to the CryptoConditions specification, which is a monster of a IETF (Internet standards) draft and has hundred(s) of pages of specification. I am sure you are happy to know that you dont really need to know about it much at all! Just know that you can create all sorts of cryptoconditions and its binary encoding can be used in a bitcoin utxo. If the standard CC contracts dont have the power you need, it is always possible to expand on it. So far, most all the CC contracts only need the power of a 1of1 CC script, which is 1 signature combined with custom constraints. The realtime payment channels CC is the only one of the reference CC contracts so far that didnt fit into this model, it needed a 1of2 CC script.
|
||||
|
||||
The best part is that all these opcode level things are not needed at all. I just wanted to explain it for those that need to know all the details of everything.
|
||||
|
||||
Chapter 2 - CC contract basics
|
||||
Each CC contract has an eval code, this is just an arbitrary number that is associated with a specific CC contract. The details about a specific CC contract are all determined by the validation logic, that is ultimately what implements a CC contract.
|
||||
|
||||
However, unlike the normal bitcoin payments, where it is validated with only information in the transaction, a CC contract has the power to do pretty much anything. It has full access to the blockchain and even the mempool, though using mempool information is inherently more risky and needs to be done carefully or for exclusions, rather than inclusions.
|
||||
|
||||
However, this is the CC contract basics chapter, so let us ignore mempool issues and deal with just the basics. Fundamentally there is no structure for OP_CHECKCRYPTOCONDITION serialized scripts, but if you are like me, you want to avoid having to read and understand a 1000 page IETF standard. What we really want to do is have a logical way to make a new contract and have it be able to be coded and debugged in an efficient way.
|
||||
|
||||
That means to just follow a known working template and only changing the things where the existing templates are not sufficient, ie. the core differentiator of your CC contract.
|
||||
|
||||
In the hush3/src/cc/eval.h file all the eval codes are defined, currently:
|
||||
|
||||
#define FOREACH_EVAL(EVAL) \
|
||||
EVAL(EVAL_IMPORTPAYOUT, 0xe1) \
|
||||
EVAL(EVAL_IMPORTCOIN, 0xe2) \
|
||||
EVAL(EVAL_ASSETS, 0xe3) \
|
||||
EVAL(EVAL_FAUCET, 0xe4) \
|
||||
EVAL(EVAL_REWARDS, 0xe5) \
|
||||
EVAL(EVAL_DICE, 0xe6) \
|
||||
EVAL(EVAL_FSM, 0xe7) \
|
||||
EVAL(EVAL_AUCTION, 0xe8) \
|
||||
EVAL(EVAL_LOTTO, 0xe9) \
|
||||
EVAL(EVAL_HEIR, 0xea) \
|
||||
EVAL(EVAL_CHANNELS, 0xeb) \
|
||||
EVAL(EVAL_ORACLES, 0xec) \
|
||||
EVAL(EVAL_PRICES, 0xed) \
|
||||
EVAL(EVAL_PEGS, 0xee) \
|
||||
EVAL(EVAL_TRIGGERS, 0xef) \
|
||||
EVAL(EVAL_PAYMENTS, 0xf0) \
|
||||
EVAL(EVAL_GATEWAYS, 0xf1)
|
||||
|
||||
Ultimately, we will probably end up with all 256 eval codes used, for now there is plenty of room. I imagined that similar to my coins repo, we can end up with a much larger than 256 number of CC contracts and you select the 256 that you want active for your blockchain. That does mean any specific chain will be limited to "only" having 256 contracts. Since there seems to be so few actually useful contracts so far, this limit seems to be sufficient. I am told that the evalcode can be of any length, but the current CC contracts assumes it is one byte.
|
||||
|
||||
The simplest CC script would be one that requires a signature from a pubkey along with a CC validation. This is the equivalent of the pay to pubkey bitcoin script and is what most of the initial CC contracts use. Only the channels one needed more than this and it will be explained in its chapter.
|
||||
|
||||
We end up with CC scripts of the form (evalcode) + (pubkey) + (other stuff), dont worry about the other stuff, it is automatically handled with some handy internal functions. The important thing to note is that each CC contract of this form needs a single pubkey and eval code and from that we get the CC script. Using the standard bitcoin's "hash and make an address from it" method, this means that the same pubkey will generate a different address for each different CC contract!
|
||||
|
||||
This is an important point, so I will say it in a different way. In bitcoin there used to be uncompressed pubkeys which had both the right and left half combined, into a giant 64 byte pubkey. But since you can derive one from the other, compressed pubkeys became the standard, that is why you have bitcoin pubkeys of 33 bytes instead of 65 bytes. There is a 02, 03 or 04 prefix, to mean odd or even or big pubkey. This means there are two different pubkeys for each privkey, the compressed and uncompressed. And in fact you can have two different bitcoin protocol addresses that are spendable by the same privkey. If you use some paper wallet generators, you might have noticed this.
|
||||
|
||||
CC contracts are like that, where each pubkey gets a different address for each evalcode. It is the same pubkey, just different address due to the actual script having a different evalcode, it ends up with a different hash and thus a different address. Now funds send to a specific CC address is only accessible by that CC contract and must follow the rules of that contract.
|
||||
|
||||
I also added another very useful feature where the convention is for each CC contract to have a special address that is known to all, including its private key. Before you panic about publishing the private key, remember that to spend a CC output, you need to properly sign it AND satisfy all the rules. By everyone having the privkey for the CC contract, everybody can do the "properly sign" part, but they still need to follow the rest of the rules.
|
||||
|
||||
From a user's perspective, there is the global CC address for a CC contract and some contracts also use the user pubkey's CC address. Having a pair of new addresses for each contract can get a bit confusing at first, but eventually we will get easy to use GUI that will make it all easy to use.
|
||||
|
||||
|
||||
Chapter 3 - CC vins and vouts
|
||||
You might want to review the bitcoin basics and other materials to refresh about how bitcoin outputs become inputs. It is a bit complicated, but ultimately it is about one specific amount of coins that are spent, once spent it is combined with the other coins that are also spent in that transaction and then various outputs are created.
|
||||
|
||||
vin0 + vin1 + vin2 -> vout0 + vout1
|
||||
|
||||
That is a 3 input, 2 output transaction. The value from the three inputs are combined and then split into vout0 and vout1, each of the vouts gets a spend script that must be satisfied to be able to be spent. Which means for all three of out vins, all the requirements (as specified in the output that created them) are satisfied.
|
||||
|
||||
Yes, I know this is a bit too complicated without a nice chart, so we will hope that a nice chart is added here:
|
||||
|
||||
[nice chart goes here]
|
||||
|
||||
Out of all the aspects of the CC contracts, the flexibility that different vins and vouts created was the biggest surprise. When I started writing the first of these a month ago, I had no idea the power inherent in the smart utxo contracts. I was just happy to have a way to lock funds and release them upon some specific conditions.
|
||||
|
||||
After the assets/tokens CC contract, I realized that it was just a tip of the iceberg. I knew it was Turing complete, but after all these years of restricted bitcoin script, to have the full power of any arbitrary algorithm, it was eye opening. Years of writing blockchain code and having really bad consequences with every bug naturally makes you gun shy about doing aggressive things at the consensus level. And that is the way it should be, if not very careful, some really bad things can and do happen. The foundation of building on top of the existing (well tested and reliable) utxo system is what makes the CC contracts less likely for the monster bugs. That being said, lack of validation can easily allow an improperly coded CC contract to have its funds drained.
|
||||
|
||||
The CC contract breaks out of the standard limitations of a bitcoin transaction. Already, what I wrote explains the reason, but it was not obvious even to me at first, so likely you might have missed it too. If you are wondering what on earth I am talking about, THAT is what I am talking about!
|
||||
|
||||
To recap, we have now a new standard bitcoin output type called a CC output. Further, there can be up to 256 different types of CC outputs active on any given blockchain. We also know that to spend any output, you need to satisfy its spending script, which in our case is the signature and whatever constraints the CC validation imposes. We also have the convention of a globally shared keypair, which gives us a general CC address that can have funds sent to it, along with a user pubkey specific CC address.
|
||||
|
||||
Let us go back to the 3+2 transaction example:
|
||||
|
||||
vin0 + vin1 + vin2 -> vout0 + vout1
|
||||
|
||||
Given the prior paragraph, try to imagine the possibilities the simple 3+2 transaction can be. Each vin could be a normal vin, from the global contract address, the user's CC address and the vouts can also have this range. Theoretically, there can be 257 * 257 * 257 * 257 * 257 forms of a 3+2 transaction!
|
||||
|
||||
In reality, we really dont want that much degrees of freedom as it will ensure a large degree of bugs! So we need to reduce things to a more manageable level where there are at most 3 types for each, and preferably just 1 type. That will make the job of validating it much simpler and simple is better as long as we dont sacrifice the power. We dont.
|
||||
|
||||
Ultimately the CC contract is all about how it constrains its inputs, but before it can constrain them, they need to be created as outputs. More about this in the CC validation chapter.
|
||||
|
||||
Chapter 4 - CC rpc extensions
|
||||
Currently, CC contracts need to be integrated at the source level. This limits who is able to create and add new CC contracts, which at first is good, but eventually will be a too strict limitation. The runtime bindings chapter will touch on how to break out of the source based limitation, but there is another key interface level, the RPC.
|
||||
|
||||
By convention, each CC contract adds an associated set of rpc calls to the hush-cli. This not only simplifies the creation of the CC contract transactions, it further will allow dapps to be created just via rpc calls. That will require there being enough foundational CC contracts already in place. As we find new usecases that cannot be implemented via rpc, then a new CC contract is made that can handle that (and more) and the power of the rpc level increases. This is a long term process.
|
||||
|
||||
The typical rpc calls that are added <CC>address, <CClist>, <CCinfo> return the various special CC addresses, the list of CC contract instances and info about each CC contract instance. Along with an rpc that creates a CC instance and of course the calls to invoke a CC instance.
|
||||
|
||||
The role of the rpc calls are to create properly signed rawtransactions that are ready for broadcasting. This then allows using only the rpc calls to not only invoke but to create a specific instance of a CC. The faucet contract is special in that it only has a single instance, so some of these rpc calls are skipped.
|
||||
|
||||
So, there is no MUSTHAVE rpc calls, just a sane convention to follow so it fits into the general pattern.
|
||||
|
||||
One thing that I forgot to describe was how to create a special CC address and even though this is not really an rpc issue, it is kind of separate from the core CC functions, so I will show how to do it here:
|
||||
|
||||
const char *FaucetCCaddr = "R9zHrofhRbub7ER77B7NrVch3A63R39GuC";
|
||||
const char *FaucetNormaladdr = "RKQV4oYs4rvxAWx1J43VnT73rSTVtUeckk";
|
||||
char FaucetCChexstr[67] = { "03682b255c40d0cde8faee381a1a50bbb89980ff24539cb8518e294d3a63cefe12" };
|
||||
uint8_t FaucetCCpriv[32] = { 0xd4, 0x4f, 0xf2, 0x31, 0x71, 0x7d, 0x28, 0x02, 0x4b, 0xc7, 0xdd, 0x71, 0xa0, 0x39, 0xc4, 0xbe, 0x1a, 0xfe, 0xeb, 0xc2, 0x46, 0xda, 0x76, 0xf8, 0x07, 0x53, 0x3d, 0x96, 0xb4, 0xca, 0xa0, 0xe9 };
|
||||
|
||||
Above are the specifics for the faucet CC, but each one has the equivalent in CCcustom.cpp. At the bottom of the file is a big switch statement where these values are copied into an in memory data structure for each CC type. This allows all the CC codebase to access these special addresses in a standard way.
|
||||
|
||||
In order to get the above values, follow these steps:
|
||||
A. use getnewaddress to get a new address and put that in the <CC>Normaladdr = ""; line
|
||||
B. use validateaddress <newaddress from A> to get the pubkey, which is put into the <CC>hexstr[67] = ""; line
|
||||
C. stop the daemon and start with -pubkey=<pubkey from B> and do a <CC>address rpc call. In the console you will get a printout of the hex for the privkey, assuming the if ( 0 ) in Myprivkey() is enabled (CCutils.cpp)
|
||||
D. update the CCaddress and privkey and dont forget to change the -pubkey= parameter
|
||||
|
||||
The first rpc command to add is <CC>address and to do that, add a line to rpcserver.h and update the commands array in rpcserver.cpp
|
||||
|
||||
In the rpcwallet.cpp file you will find the actual rpc functions, find one of the <CC>address ones, copy paste, change the eval code to your eval code and customize the function. Oh, and dont forget to add an entry into eval.h
|
||||
|
||||
Now you have made your own CC contract, but it wont link as you still need to implement the actual functions of it. This will be covered in the following chapters.
|
||||
|
||||
|
||||
Chapter 5 - CC validation
|
||||
CC validation is what its all about, not the "hokey pokey"!
|
||||
|
||||
Each CC must have its own validation function and when the blockchain is validating a transaction, it will call the CC validation code. It is totally up to the CC validation whether to validate it or not.
|
||||
|
||||
Any set of rules that you can think of and implement can be part of the validation. Make sure that there is no ambiguity! Make sure that all transactions that should be rejected are in fact rejected.
|
||||
|
||||
Also, make sure any rpc calls that create a CC transaction dont create anything that doesnt validate.
|
||||
|
||||
Really, that is all that needs to be said about validation that is generic, as it is just a concept and gets a dedicated function to determine if a transaction is valid or not.
|
||||
|
||||
For most of the initial CC contracts, I made a function code for various functions of the CC contract and add that along with the creation txid. That enables the validation of the transactions much easier, as the required data is right there in the opreturn.
|
||||
|
||||
You do need to be careful not to cause a deadlock as the CC validation code is called while already locked in the main loop of the bitcoin protocol. As long as the provided CC contracts are used as models, you should keep out of deadlock troubles.
|
||||
|
||||
|
||||
Chapter 6 - faucet example
|
||||
Finally, we are ready for the first actual example of a CC contract. The faucet. This is a very simple contract and it ran into some interesting bugs in the first incarnation.
|
||||
|
||||
The code in hush3/src/cc/faucet.cpp is the ultimate documentation for it with all the details, so I will just address the conceptual issues here.
|
||||
|
||||
The idea is that people send funds to the faucet by locking it in faucet's global CC address and anybody is allowed to create a faucetget transaction that spends it.
|
||||
|
||||
There are only 7 functions in faucet.cpp, a bit over 200 lines including comments. The first three are for validation, the last four for the rpc calls to use.
|
||||
|
||||
int64_t IsFaucetvout(struct CCcontract_info *cp,const CTransaction& tx,int32_t v)
|
||||
|
||||
bool FaucetExactAmounts(struct CCcontract_info *cp,Eval* eval,const CTransaction &tx,int32_t minage,uint64_t txfee)
|
||||
|
||||
bool FaucetValidate(struct CCcontract_info *cp,Eval* eval,const CTransaction &tx)
|
||||
|
||||
int64_t AddFaucetInputs(struct CCcontract_infoCC_info *cp,CMutableTransaction &mtx,CPubKey pk,int64_t total,int32_t maxinputs)
|
||||
|
||||
std::string FaucetGet(uint64_t txfee)
|
||||
|
||||
std::string FaucetFund(uint64_t txfee,int64_t funds)
|
||||
|
||||
UniValue FaucetInfo()
|
||||
|
||||
Functions in rpcwallet implement:
|
||||
|
||||
faucetaddress fully implemented in rpcwallet.cpp
|
||||
faucetfund calls FaucetFund
|
||||
faucetget calls FaucetGet
|
||||
faucetinfo calls FaucetInfo
|
||||
|
||||
Now you might not be a programmer, but I hope you are able to understand the above sequence. user types in a cli call, hush-cli processes it by calling the rpc function, which in turn calls the function inside faucet.cpp
|
||||
|
||||
No magic, just simple conversion of a user command line call that runs code inside the hushd. Both the faucetfund and faucetget create properly signed rawtransaction that is ready to be broadcast to the network using the standard sendrawtransaction rpc. It doesnt automatically do this to allow the GUI to have a confirmation step with all the details before doing an irrevocable CC contract transaction.
|
||||
|
||||
faucetfund allows anybody to add funds to the faucet
|
||||
faucetget allows anybody to get 0.1 coins from the faucet as long as they dont violate the rules.
|
||||
|
||||
And we come to what it is all about. The rules of the faucet. Initially it was much less strict and that allowed it to be drained slowly, but automatically and it prevented most from being able to use the faucet.
|
||||
|
||||
To make it much harder to leech, it was made so each faucetget returned only 0.1 coins (down from 1.0) so it was worth 90% less. It was also made so that it had to be to a fresh address with less than 3 transactions. Finally each txid was constrained to start and end with 00! This is a cool trick to force usage of precious CPU time (20 to 60 seconds depending on system) to generate a valid txid. Like PoW mining for the txid and I expect other CC contracts to use a similar mechanism if they want to rate limit usage.
|
||||
|
||||
Combined, it became such a pain to get 0.1 coins, the faucet leeching problem was solved. It might not seem like too much trouble to change an address to get another 0.1 coins, but the way things are setup you need to launch the hushd -pubkey=<your pubkey> to change the pubkey that is active for a node. That means to change the pubkey being used, the hushd needs to be restarted and this creates a lot of issues for any automation trying to do this. Combined with the PoW required, only when 0.1 coins becomes worth a significant effort will faucet leeching return. In that case, the PoW requirement can be increased and coin amount decreased, likely with a faucet2 CC contract as I dont expect many such variations to be needed.
|
||||
|
||||
Chapter 7 - rewards example
|
||||
The next CC contract in complexity is the rewards CC contract. This is designed to capture what most people like about masternodes, without anything else, ie. the rewards!
|
||||
|
||||
The idea is to allow people to lock funds for some amount of time and get an extra reward. We also want to support having more than one rewards plan at a time and to allow customization of plan details. One twist that makes it a bit unexpected is that anybody should be able to unlock the funds that were locked, as long as it ends up in the locking address. The reason for this is that SPV servers want to be supported and while locking can be done via normal sendrawtransaction, it requires a native node to do the unlocking. By allowing anybody to be able to unlock, then there can be a special node that unlocks all locked funds when they are ready. This way, from the user's point of view, they lock the funds and after it is matured, it reappears in their wallet.
|
||||
|
||||
The above requirements leads us to using the global CC address for the rewards contract to lock the funds in. That allows anybody to properly sign the unlock, but of course that is not enough, we need to make sure they are following all the unlock requirements. Primarily that the funds go back to the locking address.
|
||||
|
||||
The four aspects of the rewards plan that are customizable are:
|
||||
APR, minseconds, maxseconds, mindeposit
|
||||
|
||||
This allows each plan to set a different APR (up to 25%, anything above is becoming silly), the minimum time funds must be locked, the maximum time they are earning rewards and the minimum that can be deposited.
|
||||
|
||||
So the tx that creates the rewards plan will have these attributes and it is put into the OP_RETURN data. All the other calls will reference the plan creation txid and inherit these parameters from the creation tx. This means it is an important validation to do, to make sure the funding txid is a valid funding txid.
|
||||
|
||||
Since it is possible that the initial funding will be used up, there needs to be a way for more funding to be added to the rewards plan.
|
||||
|
||||
Having multiple possible rewards plans means it is useful to have rpc calls to get information about them. Hence: rewardslist returns the list of rewards creation txids and rewardsinfo <txid> returns the details about a specific rewards plan.
|
||||
|
||||
A locking transaction sends funds to the rewards CC address, along with a normal (small) tx to the address that the unlock should go to. This allows the validation of the proper unlocking. Also, it is important to make sure only locking transactions are able to be unlocked. Additionally, the minimum time needs to elapse before unlocking is allowed.
|
||||
|
||||
All of these things are done in rewards.cpp, with the validation code being about 200 lines and a total of 700 lines or so. Bigger than faucet, but most of the code is the non-consensus code to create the proper transactions. In order to simplify the validation, specific vin and vout positions are designated to have specific required values:
|
||||
|
||||
createfunding
|
||||
vins.*: normal inputs
|
||||
vout.0: CC vout for funding
|
||||
vout.1: normal marker vout for easy searching
|
||||
vout.2: normal change
|
||||
vout.n-1: opreturn 'F' sbits APR minseconds maxseconds mindeposit
|
||||
|
||||
addfunding
|
||||
vins.*: normal inputs
|
||||
vout.0: CC vout for funding
|
||||
vout.1: normal change
|
||||
vout.n-1: opreturn 'A' sbits fundingtxid
|
||||
|
||||
lock
|
||||
vins.*: normal inputs
|
||||
vout.0: CC vout for locked funds
|
||||
vout.1: normal output to unlock address
|
||||
vout.2: change
|
||||
vout.n-1: opreturn 'L' sbits fundingtxid
|
||||
|
||||
unlock
|
||||
vin.0: locked funds CC vout.0 from lock
|
||||
vin.1+: funding CC vout.0 from 'F' and 'A' and 'U'
|
||||
vout.0: funding CC change
|
||||
vout.1: normal output to unlock address
|
||||
vout.n-1: opreturn 'U' sbits fundingtxid
|
||||
|
||||
It is recommended to create such a vin/vout allocation for each CC contract to make sure that the rpc calls that create the transaction and the validation code have a specific set of constraints that can be checked for.
|
||||
|
||||
Chapter 8 - assets example
|
||||
In some respects the assets CC is the most complex, it was actually the first one that I coded. It is however using a simple model, even for the DEX functions, so while it is quite involved, it does not have the challenge/response complexity of dice.
|
||||
|
||||
There are two major aspects to creating tokens. First is to create and track it, down to every specific satoshi. The second is solving how to implement DEX functions of trading assets.
|
||||
|
||||
The model used is "colored coins". This means that the token creating txid issues the assets as denoted by all the satoshis, so locking 1 COIN issues 100 million tokens. This multiplication will allow creation of plenty of assets. We want to preserve all the tokens created across all allowed operations. The way this is achieved is that all operations attaches the token creation txid in its OP_RETURN, along with the specified operation.
|
||||
|
||||
Ownership of tokens are represented by the colored satoshis in the CC address for the user's pubkey. This allows using the standard utxo system to automatically track ownership of the tokens. This automatic inheritance is one of the big advantages of utxo CC contracts that compensates for the slightly more work needed to implement a CC contract.
|
||||
|
||||
So now we have the standard CC addresss, list and info commands that provide the CC addresses, list of all tokens and info on specific tokens and the ability to create and transfer tokens. Any amount of tokens can be created from 1 to very large numbers and using standard addressbalance, addressutxo type of commands, the details of all assets owned can be determined for a specific pubkey.
|
||||
|
||||
Now we can solve the DEX part of the tokenization, which turns out to be much simpler than initially imagined. We start with bidding for a specific token. Funds for the bid are locked into the global CC address, along with the desired token and price. This creates a bid utxo that is able to be listed via an orderbook rpc call. To fill the bid, a specific bid utxo is spent with the appropriate number of assets and change and updated price for the unfilled amount. if the entire amount is filled, then it wont appear in the orderbook anymore.
|
||||
|
||||
asks work by locking assets along with the required price. Partial fills can be supported and the rpc calls can mask the utxo-ness of the funds/assets needed by automatically gathering the required amount of funds to fill the specific amount.
|
||||
|
||||
With calls to cancel the pending bid or ask, we get a complete set of rpc calls that can support a COIN-centric DEX.
|
||||
|
||||
In the future, it is expected that a token swap rpc can be supported to allow directly swapping one token for another, but at first it is expected that there wont be sufficient volumes for such token to token swaps, so it was left out of the initial implementation.
|
||||
|
||||
With just these rpc calls and associated validation, we get the ability to issue tokens and trade them on a DEX!
|
||||
|
||||
create
|
||||
vin.0: normal input
|
||||
vout.0: issuance assetoshis to CC
|
||||
vout.1: tag sent to normal address of AssetsCCaddress
|
||||
vout.2: normal output for change (if any)
|
||||
vout.n-1: opreturn [EVAL_ASSETS] ['c'] [origpubkey] "<assetname>" "<description>"
|
||||
|
||||
transfer
|
||||
vin.0: normal input
|
||||
vin.1 .. vin.n-1: valid CC outputs
|
||||
vout.0 to n-2: assetoshis output to CC
|
||||
vout.n-2: normal output for change (if any)
|
||||
vout.n-1: opreturn [EVAL_ASSETS] ['t'] [assetid]
|
||||
|
||||
buyoffer:
|
||||
vins.*: normal inputs (bid + change)
|
||||
vout.0: amount of bid to unspendable
|
||||
vout.1: normal output for change (if any)
|
||||
vout.n-1: opreturn [EVAL_ASSETS] ['b'] [assetid] [amount of asset required] [origpubkey]
|
||||
|
||||
cancelbuy:
|
||||
vin.0: normal input
|
||||
vin.1: unspendable.(vout.0 from buyoffer) buyTx.vout[0]
|
||||
vout.0: vin.1 value to original pubkey buyTx.vout[0].nValue -> [origpubkey]
|
||||
vout.1: normal output for change (if any)
|
||||
vout.n-1: opreturn [EVAL_ASSETS] ['o'] [assetid]
|
||||
|
||||
fillbuy:
|
||||
vin.0: normal input
|
||||
vin.1: unspendable.(vout.0 from buyoffer) buyTx.vout[0]
|
||||
vin.2+: valid CC output satisfies buyoffer (*tx.vin[2])->nValue
|
||||
vout.0: remaining amount of bid to unspendable
|
||||
vout.1: vin.1 value to signer of vin.2
|
||||
vout.2: vin.2 assetoshis to original pubkey
|
||||
vout.3: CC output for assetoshis change (if any)
|
||||
vout.4: normal output for change (if any)
|
||||
vout.n-1: opreturn [EVAL_ASSETS] ['B'] [assetid] [remaining asset required] [origpubkey]
|
||||
|
||||
selloffer:
|
||||
vin.0: normal input
|
||||
vin.1+: valid CC output for sale
|
||||
vout.0: vin.1 assetoshis output to CC to unspendable
|
||||
vout.1: CC output for change (if any)
|
||||
vout.2: normal output for change (if any)
|
||||
vout.n-1: opreturn [EVAL_ASSETS] ['s'] [assetid] [amount of native coin required] [origpubkey]
|
||||
|
||||
cancel:
|
||||
vin.0: normal input
|
||||
vin.1: unspendable.(vout.0 from exchange or selloffer) sellTx/exchangeTx.vout[0] inputTx
|
||||
vout.0: vin.1 assetoshis to original pubkey CC sellTx/exchangeTx.vout[0].nValue -> [origpubkey]
|
||||
vout.1: normal output for change (if any)
|
||||
vout.n-1: opreturn [EVAL_ASSETS] ['x'] [assetid]
|
||||
|
||||
fillsell:
|
||||
vin.0: normal input
|
||||
vin.1: unspendable.(vout.0 assetoshis from selloffer) sellTx.vout[0]
|
||||
vin.2+: normal output that satisfies selloffer (*tx.vin[2])->nValue
|
||||
vout.0: remaining assetoshis -> unspendable
|
||||
vout.1: vin.1 assetoshis to signer of vin.2 sellTx.vout[0].nValue -> any
|
||||
vout.2: vin.2 value to original pubkey [origpubkey]
|
||||
vout.3: CC asset for change (if any)
|
||||
vout.4: CC asset2 for change (if any) 'E' only
|
||||
vout.5: normal output for change (if any)
|
||||
vout.n-1: opreturn [EVAL_ASSETS] ['S'] [assetid] [amount of coin still required] [origpubkey]
|
||||
|
||||
Chapter 9 - dice example
|
||||
The dice CC contract is actually more complex in the sequences required than the assets/tokens CC. The reason is the need for realtime response by the dealer node, but also having a way to resolve bets if the dealer node is not online. The dice CC contract shows how to build in such a challenge/response mechanism, which likely will be very useful for many other realtime interactive CC contracts.
|
||||
|
||||
First, let us describe the issues that the dice CC contract needs to solve. Foremost is that it needs to be random and fair. It should also have realtime response and a fallback timeout in case the realtime response doesnt happen. As with the rewards CC contract, multiple dice plans are supported. Each plan can be customized as to the following: minbet, maxbet, maxodds, timeoutblocks
|
||||
|
||||
This allows each plan to control the risk exposure and also advertises to everyone when dicebets expire and a timeout win can be claimed. In event the dealer node does not process a dicebet in time, in order to prevent dealer nodes from simply not responding to dicebets that they lose, a timeout must go to the dicebet player. A short timeframe means that the dealer would need to be running multiple redundant nodes to make sure they can respond in time. If the timeout is set to long, then many players would prefer to use a different dice plan with a shorter timeout.
|
||||
|
||||
Now to describe how to ensure a proper random number that is fair. The method chosen was for the dealer node to create transactions with hash of their entropy in the OP_RETURN. Then the dicebet player would select a specific entropy tx and include their (unhashed) entropy to their OP_RETURN. This allows the dealer node to immediately determine if the dicebet won or lost. If the dicebet included the hash of the bettor entropy, then another step would be needed. However, doing so would allow some timeouts to end with a refund, rather than an automatic win for the dicebet player.
|
||||
|
||||
One additional technique used to keep all required data on the blockchain is the dealer entropy value calculation. The vin0 txid is used as one of the privkeys to calculate a shared secret and then hashed to remove links to the original privkey. This method allows recreating the dealer's entropy value (by the dealer node) given the blockchain itself, which means there is no need for any local storage.
|
||||
|
||||
This allows the dealer node to recreate the unhashed entropy value used and so when the dicebet transaction is seen (in the mempool!), the dealer node can immediately determine if it is a winner or a loser. This is done by creating a dealer hash vs. a bettor hash via:
|
||||
|
||||
dealer hash: SHA256(dealer entropy + bettor entropy)
|
||||
bettor hash: SHA256(bettor entropy + dealer entropy)
|
||||
|
||||
The same values are used, but in different order. The resulting hashes are compared arithmetically for 1:1 bets and the standard industry use is used for the higher odds: https://dicesites.com/provably-fair
|
||||
|
||||
The dealer creates a dice plan and then also needs to create entropy transactions. Each win or loss that creates change also creates entropy transactions by the dealer, but timeout transactions wont as it needs to be created by the dealer node to prevent cheating. The dealer tx are locked into the global dice CC address, as is the dicebet transaction, which selects a specific entropy tx to "roll" against. Then the dicefinish process by the dealer will spend the dicebet outputs either all to itself for a loss, or the winning amount to th dice bettor's address. For dicebets that are not dicefinish'ed by the dealer, anybody is able to do a timeout completion.
|
||||
|
||||
createfunding:
|
||||
vins.*: normal inputs
|
||||
vout.0: CC vout for funding
|
||||
vout.1: owner vout
|
||||
vout.2: dice marker address vout for easy searching
|
||||
vout.3: normal change
|
||||
vout.n-1: opreturn 'F' sbits minbet maxbet maxodds timeoutblocks
|
||||
|
||||
addfunding (entropy):
|
||||
vins.*: normal inputs
|
||||
vout.0: CC vout for locked entropy funds
|
||||
vout.1: tag to owner address for entropy funds
|
||||
vout.2: normal change
|
||||
vout.n-1: opreturn 'E' sbits fundingtxid hentropy
|
||||
|
||||
bet:
|
||||
vin.0: entropy txid from house (must validate vin0 of 'E')
|
||||
vins.1+: normal inputs
|
||||
vout.0: CC vout for locked entropy
|
||||
vout.1: CC vout for locked bet
|
||||
vout.2: tag for bettor's address (txfee + odds)
|
||||
vout.3: change
|
||||
vout.n-1: opreturn 'B' sbits fundingtxid entropy
|
||||
|
||||
loser:
|
||||
vin.0: normal input
|
||||
vin.1: betTx CC vout.0 entropy from bet
|
||||
vin.2: betTx CC vout.1 bet amount from bet
|
||||
vin.3+: funding CC vout.0 from 'F', 'E', 'W', 'L' or 'T'
|
||||
vout.0: funding CC to entropy owner
|
||||
vout.1: tag to owner address for entropy funds
|
||||
vout.2: change to fundingpk
|
||||
vout.n-1: opreturn 'L' sbits fundingtxid hentropy proof
|
||||
|
||||
winner:
|
||||
same as loser, but vout.2 is winnings
|
||||
vout.3: change to fundingpk
|
||||
vout.n-1: opreturn 'W' sbits fundingtxid hentropy proof
|
||||
|
||||
timeout:
|
||||
same as winner, just without hentropy or proof
|
||||
|
||||
WARNING: there is an attack vector that precludes betting any large amounts, it goes as follows:
|
||||
1. do dicebet to get the house entropy revealed
|
||||
2. calculate bettor entropy that would win against the house entropy
|
||||
3. reorg the chain and make a big bet using the winning entropy calculated in 2.
|
||||
|
||||
In order to mitigate this, the disclosure of the house entropy needs to be delayed beyond a reasonable reorg depth (notarization). It is recommended for production dice game with significant amounts of money to use such a delayed disclosure method.
|
||||
|
||||
|
||||
Chapter 10 - channels example
|
||||
It might be hard to believe, but channels CC implements an instant payment mechanism that is secured by dPoW in a way that is backward compatible with the existing wallets, explorers, etc. and channels CC does not require both nodes to be online. Its usecases are all the usecases for Lightning Network, it is just more secure, less expensive and backward compatible! The one aspect which some might consider a downside (and others another benefit) is that all payments are onchain. This means it would increase blockchain size, but the idea is for channels CC to be used on blockchains with relatively lower value coins, so a txfee of 0.0001 is not anything significant.
|
||||
|
||||
Warning: very confusing blockchain reorganization issues described below. Will be confusing to most people
|
||||
|
||||
From a distance, the blockchain is a chain of blocks. One block after the next, each referencing all the prior blocks. Each block containing a group of transactions. Prior to getting into a block, the transactions are broadcast to the network and if it is valid, it enters the memory pool. Each miner then constructs a valid block from these memory pool transactions and when a transaction gets mined (confirmed), it is removed from the memory pool.
|
||||
|
||||
That is the simple version!
|
||||
|
||||
The reality is quite a bit more complex, but the critical aspect is that the blockchain can (and is) reorganized as part of the expected protocol. This can happen even when there is no 51% attack happening and it is important to understand this process in detail, so here goes.
|
||||
|
||||
What happens if two miners find a valid block at the same time? In this case the "same time" means within the time it takes for a block to propagate to the network. When a miner finds a new block, it is broadcast to the network and nodes update and start waiting for the next block. When there are two different (and valid) blocks propagating at the same time, some nodes update with one of the blocks and some the other, lets call it blockA and blockB. Now the nodes will know about both blockA and blockB, but some will consider blockA to be the chaintip and others will consider blockB to be the chaintip.
|
||||
|
||||
This is where it gets confusing. Which is the correct chaintip (latest block?). It turns out that both blockA and blockB are valid at this moment in time. So there are actuall two blockchains. We have what is called a small fork! Now dont worry, the protocol will help us converge to a single chain, but in order to do that, we need the next block.
|
||||
|
||||
Some miners will be mining from blockA and others from blockB. In most all cases, when the next block is found, it wont be at the "same time" again. So we will end up with a chain that is blockA+blockA2 or blockB+blockB2. Here comes the small reorg! Let's assuming blockA2 was found before blockB2, so that means all nodes that had blockB as the chaintip now see a longer chain blockA+blockA2, which trumps blockB. When that happens, it reorgs the chain so it is on blockA+blockA2. To do this properly, all the transactions that were in blockB are put back into the mempool and blockA is added, then blockA2.
|
||||
|
||||
Of course, when blockB2 arrives, the nodes see it but blockB+blockB2 is the same length as blockA+blockA2, so no reorg happens. Since we postulated that blockAs arrived "before" blockB2, that means all nodes are on the same chaintip, including all the miners and the next block found would be blockA3, without any complications.
|
||||
|
||||
Believe it or not, this sort of thing is happening all the time, one all blockchains. The chaintip is a volatile thing and that is why more than one confirmation is needed to avoid the small reorgs invalidating blockhash. However, it is possible for more than just the blockhash to change. When the reorg happens, all the transactions in the block are put back into the mempool and then the new blocks are processed in order. So what happens if one of the inputs to a transaction that happened in blockB, gets spent in blockA2? Based on random utxo allocation by wallets this is not impossible if an address has a lot of activity, but if it is part of a 51% attack, then this remote chance of an utxo being spent becomes a certainity! In fact, that is what a 51% attack is.
|
||||
|
||||
The attack can go much deeper than just one block. For chains that use the longest chain rule, it can go quite deep indeed. So as all the reorged transactions are put back into the mempool, we feel good that it will get confirmed again. Unfortunately, there is no enforcement of a miner needing to mine any specific transaction in the mempool. And the 51% attacker is intent on mining the transaction that spends an already spent utxo in the reorganized chain. it is called a double spend, but in the reorganized chain, it is spent only once. So it is a bit of a misnomer.
|
||||
|
||||
The important thing to understand is that if any transaction has inputs that are signed by a node, it is possible when the chain reorganizes for that transaction to become invalid. This is why dPoW is important as it doesnt strictly use the longest chain rule, but rather the longest notarized chain rule. Once a block is notarized, then it will refuse to reorganize that block (or any block before). So the risk is still there, but only until a notarization. Please see more detailed information about dPoW <here>.
|
||||
|
||||
Given the above, if you are wondering how can it be possible to have a mempool payment be secured by dPoW. Since it is explained how the reorgs can make valid transactions disappear, it seems unlikely any such solution is possible. However, the CC is very powerful and it can make unlikely things possible.
|
||||
|
||||
The following describes how.
|
||||
|
||||
We know that any payment that is utxo based can be invalidated via 51% attack, or even an unlikely but not impossible random utxo allocation from a busy wallet. Which means the payment cant be via a utxo. Since the CC system is utxo based, you might think that it means CC cant solve this. However, CC is very powerful and can implement payments that are not utxo based. But before this non-utxo payment method is explained, first we need to solve the mechanics of payment.
|
||||
|
||||
At a high level, we want to lock funds into a channel, have this lock notarized so it cant be reorganized. Then payments can unlock funds. Additionally, if we are restricting the payment to just one destination, we also need a way for the sender to reclaim the unused funds. So there needs a way for a close channel notification, which when notarized allows the sender to reclaim all funds. After the channel close is notarized, then the only action possible should be a reclaim of sender funds.
|
||||
|
||||
We need to assume that any payment, channel close, reclaim can be reorganized until it is notarized so great care needs to be made that a payment that is made will always be valid. With some allowances for blocks after a channelclose is notarized, we can protect the payments using the logic of "stop accepting payments after a channelclose is seen". It might be that a full notarization of wait time after the channelclose is notarized is needed to provide sufficient time for all the payments to be reprocessed.
|
||||
|
||||
Now we can finally describe the requirements for the CC. The locked funds need to be able to be spent by either the sender or receiver, the former only after sufficient time after a channelclose and the latter only after a payment is seen (not just confirmed, but just seeing it should be enough). The protection from reorgs is that the payment itself reveals a secret that is needed for the payment and only the secret would be needed, so it wont matter what utxo is used. To lock funds into a CC address that can handle this we need a 1of2 CC address, which can accept a signature from either of two pubkeys. The additional CC constraints would be enforced to make sure payments are made until the channel is closed.
|
||||
|
||||
A hashchain has the nice property of being able to encode a lot of secrets with a single hash. You can hash the hash, over and over and the final hash is the public value. By revealing the next to last hash, it can be verified that it hashes to the final hash. There is a restriction that a hashchain needs to be of reasonable maximum depth, say 1000. That means each iteration of the hashchain that is revealed is worth 1/1000th the total channelfunds. In fact, if the 500th hash value is revealed, half the channelfunds are released. this allows 1/1000th resolution that can be released with a single hash value.
|
||||
|
||||
Now we can make the payment based on the hashvalue revealed at a specified depth before the prior released hashchain value. Both the sender and receiver can make a payment to the destination by attaching a hashchain secret. This means even if the sender's payment is reorganized, if the destination has the revealed secret, a replacement payment can be made that is valid. If the destination account isnt monitoring the blockchain, then it wont see the revealed secret, but in this case there shouldnt be value released for the payments that are reorganized. So it would be a case of no harm, no foul. In any event, all the payments end up verifiable on the blockchain to provide verifiability.
|
||||
|
||||
Payments at the speed of the mempool, protected by dPoW!
|
||||
|
||||
RPC calls
|
||||
channelsopen:
|
||||
Used to open channel between two pub keys (sender and receiver). Parameters: destination_pubkey, total_number_of_payments, payment_denomination.
|
||||
Example - channelsopen 03a8fe537de2ace0d9c210b0ff945085c9192c9abf56ea22f22ce7998f289bb7bb 10 10000000
|
||||
channelspayment:
|
||||
Sending payment to receiver. Condition is that the channel open tx is confirmed/notarized. Parameters: open_tx_id, payment_amount, [secret] (optional, used when receiver needs to make a payment which secret has already been revealed by sender).
|
||||
Example - channelspayment b9c141facc8cb71306d0de8e525b3de1450e93e17fc8799c8fda5ed52fd14440 20000000
|
||||
channelsclose:
|
||||
Marking channel as closed. This RPC only creates a tx which says that the channel is closed and will be used in refund RPC to withdraw funds from closed channel. This also notifies receiver that channel fund could be withdrawn, but the payment RPC is still available until all funds are withdrawn. Parameters: open_tx_id.
|
||||
Example - channelsclose b9c141facc8cb71306d0de8e525b3de1450e93e17fc8799c8fda5ed52fd14440
|
||||
channelsrefund:
|
||||
Withdrawing funds back to senders address. Refund can be issued only when channel close tx is confirmed/notarized. Parameters: open_tx_id, close_tx_id
|
||||
Example - channelsrefund b9c141facc8cb71306d0de8e525b3de1450e93e17fc8799c8fda5ed52fd14440 bb0ea34f846247642684c7c541c435b06ee79e47893640e5d2e51023841677fd
|
||||
channelsinfo:
|
||||
Getting info about channels in which the issuer is involved, either as sender or receiver. Call without parameters give the list of available channels. Parameters: [open_tx_id] (optional - used to get info about specific channel)
|
||||
|
||||
VIN/VOUT allocation
|
||||
Open:
|
||||
vin.0: normal input
|
||||
vout.0: CC vout for channel funding on CC1of2 pubkey
|
||||
vout.1: CC vout marker to senders pubKey
|
||||
vout.2: CC vout marker to receiver pubkey
|
||||
vout.n-2: normal change
|
||||
vout.n-1: opreturn - 'O' zerotxid senderspubkey receiverspubkey totalnumberofpayments paymentamount hashchain
|
||||
|
||||
Payment
|
||||
vin.0: normal input
|
||||
vin.1: CC input from channel funding
|
||||
vin.2: CC input from src marker
|
||||
vout.0: CC vout change to channel funding on CC1of2 pubkey
|
||||
vout.1: CC vout marker to senders pubKey
|
||||
vout.2: CC vout marker to receiver pubkey
|
||||
vout.3: normal output of payment amount to receiver pubkey
|
||||
vout.n-2: normal change
|
||||
vout.n-1: opreturn - 'P' opentxid senderspubkey receiverspubkey depth numpayments secret
|
||||
|
||||
Close:
|
||||
vin.0: normal input
|
||||
vin.1: CC input from channel funding
|
||||
vin.2: CC input from src marker
|
||||
vout.0: CC vout for channel funding
|
||||
vout.1: CC vout marker to senders pubKey
|
||||
vout.2: CC vout marker to receiver pubkey
|
||||
vout.n-2: normal change
|
||||
vout.n-1: opreturn - 'C' opentxid senderspubkey receiverspubkey 0 0 0
|
||||
|
||||
Refund:
|
||||
vin.0: normal input
|
||||
vin.1: CC input from channel funding
|
||||
vin.2: CC input from src marker
|
||||
vout.0: CC vout marker to senders pubKey
|
||||
vout.1: CC vout marker to receiver pubKey
|
||||
vout.2: normal output of CC input to senders pubkey
|
||||
vout.n-2: normal change
|
||||
vout.n-1: opreturn - 'R' opentxid senderspubkey receiverspubkey numpayments payment closetxid
|
||||
|
||||
Chapter 11 - oracles example
|
||||
Oracles CC is an example where it ended up being simpler than I first expected, but at the same time a lot more powerful. It is one of the smaller CC, but it enables creation of an arbitrary number of data markets, in a performant way.
|
||||
|
||||
In order to gain the performance, some clever usage of special addresses was needed. It was a bit tricky to generate a special address to keep track of the latest data.
|
||||
|
||||
Let's back up to the beginning. Just what is an oracle? In this context it is something that puts data that is not on the blockchain, onto the blockchain. Since everything other than the transactions and blocks are not in the blockchain, there is a very large universe of data that can be oracle-ized. It can be literally anything, from the obvious like prices to specific results relative to an arbitrary description.
|
||||
|
||||
The most difficult issue about oracles is that they need to be trusted to various degree to provide accurate and timely data. The danger is that if a trusted node is used to write data to the blockchain, it creates a trust point and a single point of attack. Ultimately there is nothing that can ensure only valid data is written to the blockchain, so what is done is to reinforce good behavior via pay per datapoint. However, for critical data, higher level processing is needed that combines multiple data providers into a validated signal.
|
||||
|
||||
At the oracles CC level, it is enough that there is financial incentive to provide good data. Also it is needed to allow multiple vendors for each data that is required and to enable efficient ways to update and query the data.
|
||||
|
||||
The following are the rpc calls:
|
||||
oraclescreate name description format
|
||||
oracleslist
|
||||
oraclesinfo oracletxid
|
||||
oraclesregister oracletxid datafee
|
||||
oraclessubscribe oracletxid publisher amount
|
||||
oraclesdata oracletxid hexstr
|
||||
oraclessamples oracletxid batonutxo num
|
||||
|
||||
The first step is to create a specific data description with oraclescreate, which also defines the format of the binary data. This creates an oracletxid, which is used in the other rpc calls. name and description are just arbitrary strings, with name preferably being a short name used to access the data. The format is a string comprised of a single character per data element:
|
||||
|
||||
's' -> <256 char string
|
||||
'S' -> <65536 char string
|
||||
'd' -> <256 binary data
|
||||
'D' -> <65536 binary data
|
||||
'c' -> 1 byte signed little endian number, 'C' unsigned
|
||||
't' -> 2 byte signed little endian number, 'T' unsigned
|
||||
'i' -> 4 byte signed little endian number, 'I' unsigned
|
||||
'l' -> 8 byte signed little endian number, 'L' unsigned
|
||||
'h' -> 32 byte hash
|
||||
|
||||
For example, if the datapoint is comprised of a 4byte timestamp and an 8byte number the format string would be: "IL"
|
||||
|
||||
oracleslist displays a list of all the oraclestxid and oraclesinfo displays information about the specific oracletxid. Each oracletxid deterministically generates a marker address and a small amount is sent to that address to mark a transaction's relation to the oracltxid.
|
||||
|
||||
{
|
||||
"result": "success",
|
||||
"txid": "4895f631316a649e216153aee7a574bd281686265dc4e8d37597f72353facac3",
|
||||
"name": "BTCUSD",
|
||||
"description": "coindeskpricedata",
|
||||
"format": "L",
|
||||
"marker": "RVqJCSrdBm1gYJZS1h7dgtHioA5TEYzNRk",
|
||||
"registered": [
|
||||
{
|
||||
"publisher": "02ebc786cb83de8dc3922ab83c21f3f8a2f3216940c3bf9da43ce39e2a3a882c92",
|
||||
"baton": "RKY4zmHJZ5mNtf6tfKE5VMsKoV71Euej3i",
|
||||
"batontxid": "4de10b01242ce1a5e29d5fbb03098b4519976879e05ad0458ef7174ed9127f18",
|
||||
"lifetime": "1.50000000",
|
||||
"funds": "0.01000000",
|
||||
"datafee": "0.01000000"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
A data publisher needs to register a datafee and their pubkey for a specific oracletxid. datafee needs to be at least as big as a txfee. Using oraclesregister the current datafee can be updated so a publisher can adapt to market conditions. Once registered, subscribers can prepay for some number of datapoints to a specific publisher using the oraclessubscribe rpc. At first, it is likely that the publisher would pay themselves to enable the posting of initial data points so the potential subscribers can evaluate the quality and consistency of the data.
|
||||
|
||||
The one final rpc is oraclessamples, which returns the most recent samples of data from a specific publisher. In order to have a performant solution to track all the potential data streams from all the publishers for all the oracletxid, a baton utxo is used. This is an output sent to a specific address and expected to have just a single utxo at any given time to allow for direct lookup. oraclessamples requires a starting txid to use and with each datapoint having the prior batontxid, there is a reverse linked list to traverse the most recent data.
|
||||
|
||||
In order to implement this, the following vin/vout contraints are used:
|
||||
|
||||
create:
|
||||
vins.*: normal inputs
|
||||
vout.0: txfee tag to oracle normal address
|
||||
vout.1: change, if any
|
||||
vout.n-1: opreturn with name and description and format for data
|
||||
|
||||
register:
|
||||
vins.*: normal inputs
|
||||
vout.0: txfee tag to normal marker address
|
||||
vout.1: baton CC utxo
|
||||
vout.2: change, if any
|
||||
vout.n-1: opreturn with oracletxid, pubkey and price per data point
|
||||
|
||||
subscribe:
|
||||
vins.*: normal inputs
|
||||
vout.0: subscription fee to publishers CC address
|
||||
vout.1: change, if any
|
||||
vout.n-1: opreturn with oracletxid, registered provider's pubkey, amount
|
||||
|
||||
data:
|
||||
vin.0: normal input
|
||||
vin.1: baton CC utxo (most of the time)
|
||||
vin.2+: subscription or data vout.0
|
||||
vout.0: change to publishers CC address
|
||||
vout.1: baton CC utxo
|
||||
vout.2: payment for dataprovider
|
||||
vout.3: change, if any
|
||||
vout.n-1: opreturn with oracletxid, prevbatontxid and data in proper format
|
||||
|
||||
The oraclesdata transaction is the most complex as it needs to find and spend the baton utxo, use the correct datafee and spend funds from the locked subscription funds. With the above, the oracles CC is complete and allows the creations of massively parallel data streams from multiple vendors that uses free market feedback via payments, ie. poorly performing providers wont get renewals.
|
||||
|
||||
I expect that at first, the data providers will just be dapp developers deploying a working system including the required data, but its structure allows open market competition. Of course, specific dapps could restrict themselves to using only publishers from a allowlist of pubkeys. The potential usecases for oracles CC is quite varied and limited only by the imagination.
|
||||
|
||||
Chapter 12 - limitless possibilities
|
||||
As can be seen, CC contracts can do a wide range of things and since they are Turing complete, we know that this is true. However, what is more important is the added security gained from using a utxo based system. While in some ways it is more complex to have to deal with utxo, as can be seen by the above examples, it is either solved and made invisible at the rpc level, or actually used as part of the solution.
|
||||
|
||||
Being utxo based, automatically builds in a rate limit to how many tx per block a specific CC contract can do. The state advancing by one transaction at a time is another means that rate limits. Since more utxo can be made available to increase capacity, it actually offers a way for managing load.
|
||||
|
||||
I believe I have made one of the first operational utxo smart contracts, CC or otherwise and hope that there will be many more developers joining forces to create more foundational CC contracts. Feel free to contact me for feedback on the type of CC contract you want to make. I have not documented all my notes and it could well be I already sort of know how to implement what your want your CC contract to do. Just only so many I can actually make time to code and debug.
|
||||
|
||||
Our testing cycle went a lot faster than expected as the bugs found were few and far between. Considering the scope of the assets CC and the realtime response aspects of dice CC, this was quite unexpected. I can only attribute it to the fact that CC validation is just the final validation on top of all the standard bitcoin protocol validations. Not having to worry about double spends is sure a nice luxury, though dont get too complacent about chain rewrites! It is possible to wait for information to be divulged and then reorg the chain to take advantage of this knowledge in a chain which is rewound.
|
||||
|
||||
Yes, blockchains are complicated.
|
||||
|
||||
Chapter 13 - different languages
|
||||
The current codebase is integrated into the hushd codebase, which is C/C++. However, it is possible to use different languages and integrate into the C/C++ as zcash has shown by using the rust language for some parts of the zcashd.
|
||||
|
||||
I think any language that is compiled and can create a linkable library while being able to call and be called by C/C++ functions can be used. If you are able to make such a language binding for a simple CC contract like faucet, this will be good for a 777 HUSH bounty. Of course, you need to be the first to submit a properly working pull request.
|
||||
|
||||
|
||||
Chapter 14 - runtime bindings
|
||||
Once build time linking works, then it is one step away from being able to do runtime linking, ie. dynamically linked libraries. There will be some work required to prevent duplication of eval codes and making sure it is a valid version of the CC contract plugin, but these are issues that have been solved before and I dont see any reason they cant be solved for CC contracts.
|
||||
|
||||
This would open up the door for quite an interesting ecosystem of CC plugins that blockchains can subscribe to.
|
||||
|
||||
Chapter 15 - rpc based dapps
|
||||
Ultimately, I expect there to be so many new rpc calls (one set from each CC contract), that virtually any dapp can be made with rpc calls. We are just at the beginning now, but it is just a matter of time when we get there.
|
||||
|
||||
For now, we just need to keep listening to what the market wants as far as dapps go. Then make a new CC contract that enables doing as many of those as possible.
|
||||
|
||||
Repeat...
|
||||
|
||||
Imagine the scope that will exist after a year or two of continuous new CC contracts being created, along with all the rpc based dapps. I have seen some automatic GUI generators and it could be that for most cases, there can be a special GUI that not only create the dapp's GUI, but also all the rpc calls that are needed to make it work the way it is customized.
|
||||
|
||||
This codebase and tools in between the GUI and the rpc level will be a very good area for new initiatives.
|
||||
|
||||
##########
|
||||
|
||||
Conclusion
|
||||
I hope this document has helped you understand what a Hush utxo based CC contract is and how it is different from the other smart contracts. If you are now able to dive into the cc directory and start making your own CC contract, then I am very happy!
|
||||
|
||||
|
||||
gateways CC
|
||||
gateways CC is the first CC that combines multiple CC into a single one. In order to achieve its goals, both the assets CC and the oracles CC is used, in addition to a dapp that issues regular transactions. This general approach can be used to solve quite a few different use cases, so it is important to understand how a multi-CC solution is put together. There are some tricky issues that only arise when using more than one CC at a time.
|
||||
|
||||
Before the implementation details, first lets understand what the gateways CC does. At a high level it is similar to the old multigateway (from NXT AE 2014), but with improvements. The basic idea is to tokenize other crypto coins (like BTC) and then use the assets CC to transact/swap against the tokenized crypto. By enforcing a 1:1 peg between a specific token and BTC and an automated deposit/withdraw mechanism, it is possible to transact in the virtual BTC without the delay or expensive txfees. Then anybody that ends up having any of the BTC token would be able to withdraw actual BTC by redeeming the token.
|
||||
|
||||
BTC -> deposit to special address -> receive token that represents BTC onchain
|
||||
do onchain transactions with the BTC token
|
||||
anybody who obtains the BTC token can redeem the token and get actual BTC in the withdraw address
|
||||
|
||||
By bringing the operations onchain, it avoids the need for crosschain complications for each trade. The crosschain does still have to happen on the deposit and withdraw, but that is all. There is just one aspect that makes it not fully decentralized, which is the reliance on MofN multisig. However, with N trusted community members and a reasonable M value, it is not expected to be a big barrier. Since all operations are automated, the only trust needed is that M of the N multisig signers are running their nodes with the gateways dapp active and also that M of them wont collude to steal the funds locked in the multisig. In three years of operations, the MGW multigateway didnt have any incident of multisig signer misbehavior and it was only 2of3 multisig.
|
||||
|
||||
How can the gatewaysCC work? First, it needs a dedicated token that can be used to represent the external crypto coin. In order to avoid any issues with misplaced tokens, it is simplest to require that 100% of all the tokens are all locked in the gatewaysCC address. We want to make it so that the only way the tokens can be released from the locked address is when a verified deposit is made. So, we also need a deposit address, which means there needs to be a set of pubkeys that control the deposit address. It turns out, we also need to post merkleroot data from the external coin so that the information is onchain to be able to validate the external deposit. Since we are already trusting the deposit address signers to safekeep the external coins via MofN multisig, trusting them to post the merkleroots doesnt increase the trust footprint needed.
|
||||
|
||||
Now we have all the ingredients needed, a dedicated token, a set of multisig pubkeys and an oracle for merkleroots.
|
||||
|
||||
gatewaysbind tokenid oracletxid coin tokensupply M N pubkey(s)
|
||||
|
||||
With a gatewaysbind, a new gateway is defined. the pubkeys are for the custodians of the multisig funds and they also need to be posting merkleroots to the chain, so the oracle needs to be setup and funded and each of the signers needs to run the oraclefeed dapp. That posts each new merkleroot via oraclesdata and also responds to withdraw requests.
|
||||
|
||||
The MofN pubkeys generates a deposit address and when funds are sent to that address along with a small amount to the claim address. With the txid from this external coin, along with the txproof and the rawtransaction, all is submitted with a gatewaysdeposit. This adds a special baton output which is a gateways CC output to invoke gateways validation and also prevents double claims by using the unspent status of the baton.
|
||||
|
||||
gatewaysdeposit bindtxid height coin cointxid claimvout deposithex proof destpub amount
|
||||
gatewaysclaim bindtxid coin deposittxid destpub amount
|
||||
|
||||
Once the gatewaysdeposit is validated, it can be claimed and now the token is sent to the claim address. A 1:1 pegging of the external crypto to the token is established. And as long as one of the deposit address signers is running the oraclefeed, then the deposit/claim process is fully automatic and under the control of the depositor. Nothing needs to be signed by any other party! Also by using the utxo from the deposittxid, double claims are prevented.
|
||||
|
||||
On the withdraw side, the tokens are sent back to the address where the tokens are locked and this needs to create a redemption right that can only be used once.
|
||||
|
||||
gatewayswithdraw bindtxid coin withdrawpub amount
|
||||
|
||||
|
||||
And with a bit more magic in the oraclefeed, this is achieved. To be continued...
|
||||
|
||||
@@ -1,50 +0,0 @@
|
||||
// Copyright (c) 2016-2023 The Hush developers
|
||||
// Distributed under the GPLv3 software license, see the accompanying
|
||||
// file COPYING or https://www.gnu.org/licenses/gpl-3.0.en.html
|
||||
/******************************************************************************
|
||||
* Copyright © 2014-2019 The SuperNET Developers. *
|
||||
* *
|
||||
* See the AUTHORS, DEVELOPER-AGREEMENT and LICENSE files at *
|
||||
* the top-level directory of this distribution for the individual copyright *
|
||||
* holder information and the developer policies on copyright and licensing. *
|
||||
* *
|
||||
* Unless otherwise agreed in a custom licensing agreement, no part of the *
|
||||
* SuperNET software, including this file may be copied, modified, propagated *
|
||||
* or distributed except according to the terms contained in the LICENSE file *
|
||||
* *
|
||||
* Removal or modification of this copyright notice is prohibited. *
|
||||
* *
|
||||
******************************************************************************/
|
||||
|
||||
|
||||
/*
|
||||
CCassetstx has the functions that create the EVAL_ASSETS transactions. It is expected that rpc calls would call these functions. For EVAL_ASSETS, the rpc functions are in rpcwallet.cpp
|
||||
|
||||
CCassetsCore has functions that are used in two contexts, both during rpc transaction create time and also during the blockchain validation. Using the identical functions is a good way to prevent them from being mismatched. The must match or the transaction will get rejected.
|
||||
*/
|
||||
|
||||
#ifndef CC_ASSETS_H
|
||||
#define CC_ASSETS_H
|
||||
|
||||
#include "CCinclude.h"
|
||||
|
||||
// CCcustom
|
||||
bool AssetsValidate(struct CCcontract_info *cp,Eval* eval,const CTransaction &tx, uint32_t nIn);
|
||||
|
||||
// CCassetsCore
|
||||
vscript_t EncodeAssetOpRet(uint8_t assetFuncId, uint256 assetid2, int64_t price, std::vector<uint8_t> origpubkey);
|
||||
uint8_t DecodeAssetTokenOpRet(const CScript &scriptPubKey, uint8_t &assetsEvalCode, uint256 &tokenid, uint256 &assetid2, int64_t &price, std::vector<uint8_t> &origpubkey);
|
||||
bool SetAssetOrigpubkey(std::vector<uint8_t> &origpubkey,int64_t &price,const CTransaction &tx);
|
||||
int64_t IsAssetvout(struct CCcontract_info *cp, int64_t &price, std::vector<uint8_t> &origpubkey, const CTransaction& tx, int32_t v, uint256 refassetid);
|
||||
bool ValidateBidRemainder(int64_t remaining_price,int64_t remaining_nValue,int64_t orig_nValue,int64_t received_nValue,int64_t paidprice,int64_t totalprice);
|
||||
bool ValidateAskRemainder(int64_t remaining_price,int64_t remaining_nValue,int64_t orig_nValue,int64_t received_nValue,int64_t paidprice,int64_t totalprice);
|
||||
bool ValidateSwapRemainder(int64_t remaining_price,int64_t remaining_nValue,int64_t orig_nValue,int64_t received_nValue,int64_t paidprice,int64_t totalprice);
|
||||
bool SetBidFillamounts(int64_t &paid,int64_t &remaining_price,int64_t orig_nValue,int64_t &received,int64_t totalprice);
|
||||
bool SetAskFillamounts(int64_t &paid,int64_t &remaining_price,int64_t orig_nValue,int64_t &received,int64_t totalprice);
|
||||
bool SetSwapFillamounts(int64_t &paid,int64_t &remaining_price,int64_t orig_nValue,int64_t &received,int64_t totalprice);
|
||||
int64_t AssetValidateBuyvin(struct CCcontract_info *cp,Eval* eval,int64_t &tmpprice,std::vector<uint8_t> &tmporigpubkey,char *CCaddr,char *origaddr,const CTransaction &tx,uint256 refassetid);
|
||||
int64_t AssetValidateSellvin(struct CCcontract_info *cp,Eval* eval,int64_t &tmpprice,std::vector<uint8_t> &tmporigpubkey,char *CCaddr,char *origaddr,const CTransaction &tx,uint256 assetid);
|
||||
bool AssetCalcAmounts(struct CCcontract_info *cpAssets, int64_t &inputs, int64_t &outputs, Eval* eval, const CTransaction &tx, uint256 assetid);
|
||||
|
||||
|
||||
#endif
|
||||
@@ -1,33 +0,0 @@
|
||||
// Copyright (c) 2016-2023 The Hush developers
|
||||
// Distributed under the GPLv3 software license, see the accompanying
|
||||
// file COPYING or https://www.gnu.org/licenses/gpl-3.0.en.html
|
||||
/******************************************************************************
|
||||
* Copyright © 2014-2019 The SuperNET Developers. *
|
||||
* *
|
||||
* See the AUTHORS, DEVELOPER-AGREEMENT and LICENSE files at *
|
||||
* the top-level directory of this distribution for the individual copyright *
|
||||
* holder information and the developer policies on copyright and licensing. *
|
||||
* *
|
||||
* Unless otherwise agreed in a custom licensing agreement, no part of the *
|
||||
* SuperNET software, including this file may be copied, modified, propagated *
|
||||
* or distributed except according to the terms contained in the LICENSE file *
|
||||
* *
|
||||
* Removal or modification of this copyright notice is prohibited. *
|
||||
* *
|
||||
******************************************************************************/
|
||||
|
||||
|
||||
#ifndef CC_AUCTION_H
|
||||
#define CC_AUCTION_H
|
||||
|
||||
#include "CCinclude.h"
|
||||
|
||||
#define EVAL_AUCTION 0xe8
|
||||
|
||||
bool AuctionValidate(struct CCcontract_info *cp,Eval* eval,const CTransaction &tx, uint32_t nIn);
|
||||
|
||||
std::string AuctionPost(uint64_t txfee,uint256 itemhash,int64_t minbid,char *title,char *description);
|
||||
std::string AuctionBid(uint64_t txfee,uint256 itemhash,int64_t amount);
|
||||
std::string AuctionDeliver(uint64_t txfee,uint256 itemhash,uint256 bidtxid);
|
||||
|
||||
#endif
|
||||
@@ -18,412 +18,14 @@
|
||||
|
||||
#include "key_io.h"
|
||||
#include "CCinclude.h"
|
||||
#include "CCassets.h"
|
||||
#include "CCfaucet.h"
|
||||
#include "CCauction.h"
|
||||
#include "CCfsm.h"
|
||||
#include "CCHeir.h"
|
||||
#include "CCOracles.h"
|
||||
#include "CCPrices.h"
|
||||
#include "CCPegs.h"
|
||||
#include "CCtokens.h"
|
||||
|
||||
/*
|
||||
CCcustom has most of the functions that need to be extended to create a new CC contract.
|
||||
|
||||
A CC scriptPubKey can only be spent if it is properly signed and validated. By constraining the vins and vouts, it is possible to implement a variety of functionality. CC vouts have an otherwise non-standard form, but it is properly supported by the enhanced bitcoin protocol code as a "cryptoconditions" output and the same pubkey will create a different address.
|
||||
|
||||
This allows creation of a special address(es) for each contract type, which has the privkey public. That allows anybody to properly sign and spend it, but with the constraints on what is allowed in the validation code, the contract functionality can be implemented.
|
||||
|
||||
what needs to be done to add a new contract:
|
||||
1. add EVAL_CODE to eval.h
|
||||
2. initialize the variables in the CCinit function below
|
||||
3. write a Validate function to reject any unsanctioned usage of vin/vout
|
||||
4. make helper functions to create rawtx for RPC functions
|
||||
5. add rpc calls to rpcserver.cpp and rpcserver.h and in one of the rpc.cpp files
|
||||
6. add the new .cpp files to src/Makefile.am
|
||||
|
||||
IMPORTANT: make sure that all CC inputs and CC outputs are properly accounted for and reconcile to the satoshi. The built in utxo management will enforce overall vin/vout constraints but it wont know anything about the CC constraints. That is what your Validate function needs to do.
|
||||
|
||||
Generally speaking, there will be normal coins that change into CC outputs, CC outputs that go back to being normal coins, CC outputs that are spent to new CC outputs.
|
||||
|
||||
Make sure both the CC coins and normal coins are preserved and follow the rules that make sense. It is a good idea to define specific roles for specific vins and vouts to reduce the complexity of validation.
|
||||
*/
|
||||
|
||||
// to create a new CCaddr, add to rpcwallet the CCaddress and start with -pubkey= with the pubkey of the new address, with its wif already imported. set normaladdr and CChexstr. run CCaddress and it will print the privkey along with autocorrect the CCaddress. which should then update the CCaddr here
|
||||
|
||||
// Assets, aka Tokens
|
||||
#define FUNCNAME IsAssetsInput
|
||||
#define EVALCODE EVAL_ASSETS
|
||||
const char *AssetsCCaddr = "RGKRjeTBw4LYFotSDLT6RWzMHbhXri6BG6";
|
||||
const char *AssetsNormaladdr = "RFYE2yL3KknWdHK6uNhvWacYsCUtwzjY3u";
|
||||
char AssetsCChexstr[67] = { "02adf84e0e075cf90868bd4e3d34a03420e034719649c41f371fc70d8e33aa2702" };
|
||||
uint8_t AssetsCCpriv[32] = { 0x9b, 0x17, 0x66, 0xe5, 0x82, 0x66, 0xac, 0xb6, 0xba, 0x43, 0x83, 0x74, 0xf7, 0x63, 0x11, 0x3b, 0xf0, 0xf3, 0x50, 0x6f, 0xd9, 0x6b, 0x67, 0x85, 0xf9, 0x7a, 0xf0, 0x54, 0x4d, 0xb1, 0x30, 0x77 };
|
||||
#include "CCcustom.inc"
|
||||
#undef FUNCNAME
|
||||
#undef EVALCODE
|
||||
|
||||
// Faucet
|
||||
#define FUNCNAME IsFaucetInput
|
||||
#define EVALCODE EVAL_FAUCET
|
||||
const char *FaucetCCaddr = "R9zHrofhRbub7ER77B7NrVch3A63R39GuC";
|
||||
const char *FaucetNormaladdr = "RKQV4oYs4rvxAWx1J43VnT73rSTVtUeckk";
|
||||
char FaucetCChexstr[67] = { "03682b255c40d0cde8faee381a1a50bbb89980ff24539cb8518e294d3a63cefe12" };
|
||||
uint8_t FaucetCCpriv[32] = { 0xd4, 0x4f, 0xf2, 0x31, 0x71, 0x7d, 0x28, 0x02, 0x4b, 0xc7, 0xdd, 0x71, 0xa0, 0x39, 0xc4, 0xbe, 0x1a, 0xfe, 0xeb, 0xc2, 0x46, 0xda, 0x76, 0xf8, 0x07, 0x53, 0x3d, 0x96, 0xb4, 0xca, 0xa0, 0xe9 };
|
||||
#include "CCcustom.inc"
|
||||
#undef FUNCNAME
|
||||
#undef EVALCODE
|
||||
|
||||
// Rewards
|
||||
#define FUNCNAME IsRewardsInput
|
||||
#define EVALCODE EVAL_REWARDS
|
||||
const char *RewardsCCaddr = "RTsRBYL1HSvMoE3qtBJkyiswdVaWkm8YTK";
|
||||
const char *RewardsNormaladdr = "RMgye9jeczNjQx9Uzq8no8pTLiCSwuHwkz";
|
||||
char RewardsCChexstr[67] = { "03da60379d924c2c30ac290d2a86c2ead128cb7bd571f69211cb95356e2dcc5eb9" };
|
||||
uint8_t RewardsCCpriv[32] = { 0x82, 0xf5, 0xd2, 0xe7, 0xd6, 0x99, 0x33, 0x77, 0xfb, 0x80, 0x00, 0x97, 0x23, 0x3d, 0x1e, 0x6f, 0x61, 0xa9, 0xb5, 0x2e, 0x5e, 0xb4, 0x96, 0x6f, 0xbc, 0xed, 0x6b, 0xe2, 0xbb, 0x7b, 0x4b, 0xb3 };
|
||||
#include "CCcustom.inc"
|
||||
#undef FUNCNAME
|
||||
#undef EVALCODE
|
||||
|
||||
// Dice
|
||||
#define FUNCNAME IsDiceInput
|
||||
#define EVALCODE EVAL_DICE
|
||||
const char *DiceCCaddr = "REabWB7KjFN5C3LFMZ5odExHPenYzHLtVw";
|
||||
const char *DiceNormaladdr = "RLEe8f7Eg3TDuXii9BmNiiiaVGraHUt25c";
|
||||
char DiceCChexstr[67] = { "039d966927cfdadab3ee6c56da63c21f17ea753dde4b3dfd41487103e24b27e94e" };
|
||||
uint8_t DiceCCpriv[32] = { 0x0e, 0xe8, 0xf5, 0xb4, 0x3d, 0x25, 0xcc, 0x35, 0xd1, 0xf1, 0x2f, 0x04, 0x5f, 0x01, 0x26, 0xb8, 0xd1, 0xac, 0x3a, 0x5a, 0xea, 0xe0, 0x25, 0xa2, 0x8f, 0x2a, 0x8e, 0x0e, 0xf9, 0x34, 0xfa, 0x77 };
|
||||
#include "CCcustom.inc"
|
||||
#undef FUNCNAME
|
||||
#undef EVALCODE
|
||||
|
||||
// Lotto
|
||||
#define FUNCNAME IsLottoInput
|
||||
#define EVALCODE EVAL_LOTTO
|
||||
const char *LottoCCaddr = "RNXZxgyWSAE6XS3qGnTaf5dVNCxnYzhPrg";
|
||||
const char *LottoNormaladdr = "RLW6hhRqBZZMBndnyPv29Yg3krh6iBYCyg";
|
||||
char LottoCChexstr[67] = { "03f72d2c4db440df1e706502b09ca5fec73ffe954ea1883e4049e98da68690d98f" };
|
||||
uint8_t LottoCCpriv[32] = { 0xb4, 0xac, 0xc2, 0xd9, 0x67, 0x34, 0xd7, 0x58, 0x80, 0x4e, 0x25, 0x55, 0xc0, 0x50, 0x66, 0x84, 0xbb, 0xa2, 0xe7, 0xc0, 0x39, 0x17, 0xb4, 0xc5, 0x07, 0xb7, 0x3f, 0xca, 0x07, 0xb0, 0x9a, 0xeb };
|
||||
#include "CCcustom.inc"
|
||||
#undef FUNCNAME
|
||||
#undef EVALCODE
|
||||
|
||||
// Finite State Machine
|
||||
#define FUNCNAME IsFSMInput
|
||||
#define EVALCODE EVAL_FSM
|
||||
const char *FSMCCaddr = "RUKTbLBeKgHkm3Ss4hKZP3ikuLW1xx7B2x";
|
||||
const char *FSMNormaladdr = "RWSHRbxnJYLvDjpcQ2i8MekgP6h2ctTKaj";
|
||||
char FSMCChexstr[67] = { "039b52d294b413b07f3643c1a28c5467901a76562d8b39a785910ae0a0f3043810" };
|
||||
uint8_t FSMCCpriv[32] = { 0x11, 0xe1, 0xea, 0x3e, 0xdb, 0x36, 0xf0, 0xa8, 0xc6, 0x34, 0xe1, 0x21, 0xb8, 0x02, 0xb9, 0x4b, 0x12, 0x37, 0x8f, 0xa0, 0x86, 0x23, 0x50, 0xb2, 0x5f, 0xe4, 0xe7, 0x36, 0x0f, 0xda, 0xae, 0xfc };
|
||||
#include "CCcustom.inc"
|
||||
#undef FUNCNAME
|
||||
#undef EVALCODE
|
||||
|
||||
// Auction
|
||||
#define FUNCNAME IsAuctionInput
|
||||
#define EVALCODE EVAL_AUCTION
|
||||
const char *AuctionCCaddr = "RL4YPX7JYG3FnvoPqWF2pn3nQknH5NWEwx";
|
||||
const char *AuctionNormaladdr = "RFtVDNmdTZBTNZdmFRbfBgJ6LitgTghikL";
|
||||
char AuctionCChexstr[67] = { "037eefe050c14cb60ae65d5b2f69eaa1c9006826d729bc0957bdc3024e3ca1dbe6" };
|
||||
uint8_t AuctionCCpriv[32] = { 0x8c, 0x1b, 0xb7, 0x8c, 0x02, 0xa3, 0x9d, 0x21, 0x28, 0x59, 0xf5, 0xea, 0xda, 0xec, 0x0d, 0x11, 0xcd, 0x38, 0x47, 0xac, 0x0b, 0x6f, 0x19, 0xc0, 0x24, 0x36, 0xbf, 0x1c, 0x0a, 0x06, 0x31, 0xfb };
|
||||
#include "CCcustom.inc"
|
||||
#undef FUNCNAME
|
||||
#undef EVALCODE
|
||||
|
||||
// Heir
|
||||
#define FUNCNAME IsHeirInput
|
||||
#define EVALCODE EVAL_HEIR
|
||||
const char *HeirCCaddr = "RDVHcSekmXgeYBqRupNTmqo3Rn8QRXNduy";
|
||||
const char *HeirNormaladdr = "RTPwUjKYECcGn6Y4KYChLhgaht1RSU4jwf";
|
||||
char HeirCChexstr[67] = { "03c91bef3d7cc59c3a89286833a3446b29e52a5e773f738a1ad2b09785e5f4179e" };
|
||||
uint8_t HeirCCpriv[32] = { 0x9d, 0xa1, 0xf8, 0xf7, 0xba, 0x0a, 0x91, 0x36, 0x89, 0x9a, 0x86, 0x30, 0x63, 0x20, 0xd7, 0xdf, 0xaa, 0x35, 0xe3, 0x99, 0x32, 0x2b, 0x63, 0xc0, 0x66, 0x9c, 0x93, 0xc4, 0x5e, 0x9d, 0xb9, 0xce };
|
||||
#include "CCcustom.inc"
|
||||
#undef FUNCNAME
|
||||
#undef EVALCODE
|
||||
|
||||
// Channels
|
||||
#define FUNCNAME IsChannelsInput
|
||||
#define EVALCODE EVAL_CHANNELS
|
||||
const char *ChannelsCCaddr = "RQy3rwX8sP9oDm3c39vGKA6H315cgtPLfr";
|
||||
const char *ChannelsNormaladdr = "RQUuT8zmkvDfXqECH4m3VD3SsHZAfnoh1v";
|
||||
char ChannelsCChexstr[67] = { "035debdb19b1c98c615259339500511d6216a3ffbeb28ff5655a7ef5790a12ab0b" };
|
||||
uint8_t ChannelsCCpriv[32] = { 0xec, 0x91, 0x36, 0x15, 0x2d, 0xd4, 0x48, 0x73, 0x22, 0x36, 0x4f, 0x6a, 0x34, 0x5c, 0x61, 0x0f, 0x01, 0xb4, 0x79, 0xe8, 0x1c, 0x2f, 0xa1, 0x1d, 0x4a, 0x0a, 0x21, 0x16, 0xea, 0x82, 0x84, 0x60 };
|
||||
#include "CCcustom.inc"
|
||||
#undef FUNCNAME
|
||||
#undef EVALCODE
|
||||
|
||||
// Oracles
|
||||
#define FUNCNAME IsOraclesInput
|
||||
#define EVALCODE EVAL_ORACLES
|
||||
const char *OraclesCCaddr = "REt2C4ZMnX8YYX1DRpffNA4hECZTFm39e3";
|
||||
const char *OraclesNormaladdr = "RHkFKzn1csxA3fWzAsxsLWohoCgBbirXb5";
|
||||
char OraclesCChexstr[67] = { "038c1d42db6a45a57eccb8981b078fb7857b9b496293fe299d2b8d120ac5b5691a" };
|
||||
uint8_t OraclesCCpriv[32] = { 0xf7, 0x4b, 0x5b, 0xa2, 0x7a, 0x5e, 0x9c, 0xda, 0x89, 0xb1, 0xcb, 0xb9, 0xe6, 0x9c, 0x2c, 0x70, 0x85, 0x37, 0xdd, 0x00, 0x7a, 0x67, 0xff, 0x7c, 0x62, 0x1b, 0xe2, 0xfb, 0x04, 0x8f, 0x85, 0xbf };
|
||||
#include "CCcustom.inc"
|
||||
#undef FUNCNAME
|
||||
#undef EVALCODE
|
||||
|
||||
// Prices
|
||||
#define FUNCNAME IsPricesInput
|
||||
#define EVALCODE EVAL_PRICES
|
||||
const char *PricesCCaddr = "RAL5Vh8NXmFqEKJRKrk1KjKaUckK7mM1iS";
|
||||
const char *PricesNormaladdr = "RBunXCsMHk5NPd6q8SQfmpgre3x133rSwZ";
|
||||
char PricesCChexstr[67] = { "039894cb054c0032e99e65e715b03799607aa91212a16648d391b6fa2cc52ed0cf" };
|
||||
uint8_t PricesCCpriv[32] = { 0x0a, 0x3b, 0xe7, 0x5d, 0xce, 0x06, 0xed, 0xb7, 0xc0, 0xb1, 0xbe, 0xe8, 0x7b, 0x5a, 0xd4, 0x99, 0xb8, 0x8d, 0xde, 0xac, 0xb2, 0x7e, 0x7a, 0x52, 0x96, 0x15, 0xd2, 0xa0, 0xc6, 0xb9, 0x89, 0x61 };
|
||||
#include "CCcustom.inc"
|
||||
#undef FUNCNAME
|
||||
#undef EVALCODE
|
||||
|
||||
// Pegs
|
||||
#define FUNCNAME IsPegsInput
|
||||
#define EVALCODE EVAL_PEGS
|
||||
const char *PegsCCaddr = "RHnkVb7vHuHnjEjhkCF1bS6xxLLNZPv5fd";
|
||||
const char *PegsNormaladdr = "RMcCZtX6dHf1fz3gpLQhUEMQ8cVZ6Rzaro";
|
||||
char PegsCChexstr[67] = { "03c75c1de29a35e41606363b430c08be1c2dd93cf7a468229a082cc79c7b77eece" };
|
||||
uint8_t PegsCCpriv[32] = { 0x52, 0x56, 0x4c, 0x78, 0x87, 0xf7, 0xa2, 0x39, 0xb0, 0x90, 0xb7, 0xb8, 0x62, 0x80, 0x0f, 0x83, 0x18, 0x9d, 0xf4, 0xf4, 0xbd, 0x28, 0x09, 0xa9, 0x9b, 0x85, 0x54, 0x16, 0x0f, 0x3f, 0xfb, 0x65 };
|
||||
#include "CCcustom.inc"
|
||||
#undef FUNCNAME
|
||||
#undef EVALCODE
|
||||
|
||||
// Payments
|
||||
#define FUNCNAME IsPaymentsInput
|
||||
#define EVALCODE EVAL_PAYMENTS
|
||||
const char *PaymentsCCaddr = "REpyKi7avsVduqZ3eimncK4uKqSArLTGGK";
|
||||
const char *PaymentsNormaladdr = "RHRX8RTMAh2STWe9DHqsvJbzS7ty6aZy3d";
|
||||
char PaymentsCChexstr[67] = { "0358f1764f82c63abc7c7455555fd1d3184905e30e819e97667e247e5792b46856" };
|
||||
uint8_t PaymentsCCpriv[32] = { 0x03, 0xc9, 0x73, 0xc2, 0xb8, 0x30, 0x3d, 0xbd, 0xc8, 0xd9, 0xbf, 0x02, 0x49, 0xd9, 0x65, 0x61, 0x45, 0xed, 0x9e, 0x93, 0x51, 0xab, 0x8b, 0x2e, 0xe7, 0xc7, 0x40, 0xf1, 0xc4, 0xd2, 0xc0, 0x5b };
|
||||
#include "CCcustom.inc"
|
||||
#undef FUNCNAME
|
||||
#undef EVALCODE
|
||||
|
||||
// Gateways
|
||||
#define FUNCNAME IsGatewaysInput
|
||||
#define EVALCODE EVAL_GATEWAYS
|
||||
const char *GatewaysCCaddr = "RKWpoK6vTRtq5b9qrRBodLkCzeURHeEk33";
|
||||
const char *GatewaysNormaladdr = "RGJKV97ZN1wBfunuMt1tebiiHENNEq73Yh"; // wif UxJFYqEvLAjWPPRvn8NN1fRWscBxQZXZB5BBgc3HiapKVQBYNcmo
|
||||
char GatewaysCChexstr[67] = { "03ea9c062b9652d8eff34879b504eda0717895d27597aaeb60347d65eed96ccb40" };
|
||||
uint8_t GatewaysCCpriv[32] = { 0xf7, 0x4b, 0x5b, 0xa2, 0x7a, 0x5e, 0x9c, 0xda, 0x89, 0xb1, 0xcb, 0xb9, 0xe6, 0x9c, 0x2c, 0x70, 0x85, 0x37, 0xdd, 0x00, 0x7a, 0x67, 0xff, 0x7c, 0x62, 0x1b, 0xe2, 0xfb, 0x04, 0x8f, 0x85, 0xbf };
|
||||
#include "CCcustom.inc"
|
||||
#undef FUNCNAME
|
||||
#undef EVALCODE
|
||||
|
||||
// Tokens
|
||||
#define FUNCNAME IsTokensInput
|
||||
#define EVALCODE EVAL_TOKENS
|
||||
const char *TokensCCaddr = "RAMvUfoyURBRxAdVeTMHxn3giJZCFWeha2";
|
||||
const char *TokensNormaladdr = "RCNgAngYAdrfzujYyPgfbjCGNVQZzCgTad";
|
||||
char TokensCChexstr[67] = { "03e6191c70c9c9a28f9fd87089b9488d0e6c02fb629df64979c9cdb6b2b4a68d95" };
|
||||
uint8_t TokensCCpriv[32] = { 0x1d, 0x0d, 0x0d, 0xce, 0x2d, 0xd2, 0xe1, 0x9d, 0xf5, 0xb6, 0x26, 0xd5, 0xad, 0xa0, 0xf0, 0x0a, 0xdd, 0x7a, 0x72, 0x7d, 0x17, 0x35, 0xb5, 0xe3, 0x2c, 0x6c, 0xa9, 0xa2, 0x03, 0x16, 0x4b, 0xcf };
|
||||
#include "CCcustom.inc"
|
||||
#undef FUNCNAME
|
||||
#undef EVALCODE
|
||||
|
||||
#define FUNCNAME IsCClibInput
|
||||
#define EVALCODE EVAL_FIRSTUSER
|
||||
const char *CClibNormaladdr = "RVVeUg43rNcq3mZFnvZ8yqagyzqFgUnq4u";
|
||||
char CClibCChexstr[67] = { "032447d97655da079729dc024c61088ea415b22f4c15d4810ddaf2069ac6468d2f" };
|
||||
uint8_t CClibCCpriv[32] = { 0x57, 0xcf, 0x49, 0x71, 0x7d, 0xb4, 0x15, 0x1b, 0x4f, 0x98, 0xc5, 0x45, 0x8d, 0x26, 0x52, 0x4b, 0x7b, 0xe9, 0xbd, 0x55, 0xd8, 0x20, 0xd6, 0xc4, 0x82, 0x0f, 0xf5, 0xec, 0x6c, 0x1c, 0xa0, 0xc0 };
|
||||
#include "CCcustom.inc"
|
||||
#undef FUNCNAME
|
||||
#undef EVALCODE
|
||||
|
||||
// ImportGateway
|
||||
#define FUNCNAME IsImportGatewayInput
|
||||
#define EVALCODE EVAL_IMPORTGATEWAY
|
||||
const char *ImportGatewayCCaddr = "RXJT6CRAXHFuQ2UjqdxMj7EfrayF6UJpzZ";
|
||||
const char *ImportGatewayNormaladdr = "RNFRho63Ddz1Rh2eGPETykrU4fA8r67S4Y";
|
||||
char ImportGatewayCChexstr[67] = { "0397231cfe04ea32d5fafb2206773ec9fba6e15c5a4e86064468bca195f7542714" };
|
||||
uint8_t ImportGatewayCCpriv[32] = { 0x65, 0xef, 0x27, 0xeb, 0x3d, 0xb0, 0xb4, 0xae, 0x0f, 0xbc, 0x77, 0xdb, 0xf8, 0x40, 0x48, 0x90, 0x52, 0x20, 0x9e, 0x45, 0x3b, 0x49, 0xd8, 0x97, 0x60, 0x8c, 0x27, 0x4c, 0x59, 0x46, 0xe1, 0xdf };
|
||||
#include "CCcustom.inc"
|
||||
#undef FUNCNAME
|
||||
#undef EVALCODE
|
||||
|
||||
int32_t CClib_initcp(struct CCcontract_info *cp,uint8_t evalcode)
|
||||
{
|
||||
CPubKey pk; int32_t i; uint8_t pub33[33],check33[33],hash[32]; char CCaddr[64],checkaddr[64],str[67];
|
||||
cp->evalcode = evalcode;
|
||||
cp->ismyvin = IsCClibInput;
|
||||
memcpy(cp->CCpriv,CClibCCpriv,32);
|
||||
if ( evalcode == EVAL_FIRSTUSER ) // eventually make a hashchain for each evalcode
|
||||
{
|
||||
strcpy(cp->CChexstr,CClibCChexstr);
|
||||
decode_hex(pub33,33,cp->CChexstr);
|
||||
pk = buf2pk(pub33);
|
||||
Getscriptaddress(cp->normaladdr,CScript() << ParseHex(HexStr(pk)) << OP_CHECKSIG);
|
||||
if ( strcmp(cp->normaladdr,CClibNormaladdr) != 0 )
|
||||
fprintf(stderr,"CClib_initcp addr mismatch %s vs %s\n",cp->normaladdr,CClibNormaladdr);
|
||||
GetCCaddress(cp,cp->unspendableCCaddr,pk);
|
||||
if ( priv2addr(checkaddr,check33,cp->CCpriv) != 0 )
|
||||
{
|
||||
if ( buf2pk(check33) == pk && strcmp(checkaddr,cp->normaladdr) == 0 )
|
||||
{
|
||||
//fprintf(stderr,"verified evalcode.%d %s %s\n",cp->evalcode,checkaddr,pubkey33_str(str,pub33));
|
||||
return(0);
|
||||
} else fprintf(stderr,"CClib_initcp mismatched privkey -> addr %s vs %s\n",checkaddr,cp->normaladdr);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for (i=EVAL_FIRSTUSER; i<evalcode; i++)
|
||||
{
|
||||
vcalc_sha256(0,hash,cp->CCpriv,32);
|
||||
memcpy(cp->CCpriv,hash,32);
|
||||
}
|
||||
if ( priv2addr(cp->normaladdr,pub33,cp->CCpriv) != 0 )
|
||||
{
|
||||
pk = buf2pk(pub33);
|
||||
for (i=0; i<33; i++)
|
||||
sprintf(&cp->CChexstr[i*2],"%02x",pub33[i]);
|
||||
cp->CChexstr[i*2] = 0;
|
||||
GetCCaddress(cp,cp->unspendableCCaddr,pk);
|
||||
//printf("evalcode.%d initialized\n",evalcode);
|
||||
return(0);
|
||||
}
|
||||
}
|
||||
return(-1);
|
||||
}
|
||||
|
||||
struct CCcontract_info *CCinit(struct CCcontract_info *cp, uint8_t evalcode)
|
||||
{
|
||||
// important to clear because not all members are always initialized!
|
||||
memset(cp, '\0', sizeof(*cp));
|
||||
|
||||
cp->evalcode = evalcode;
|
||||
switch ( evalcode )
|
||||
{
|
||||
case EVAL_ASSETS:
|
||||
strcpy(cp->unspendableCCaddr,AssetsCCaddr);
|
||||
strcpy(cp->normaladdr,AssetsNormaladdr);
|
||||
strcpy(cp->CChexstr,AssetsCChexstr);
|
||||
memcpy(cp->CCpriv,AssetsCCpriv,32);
|
||||
//cp->validate = AssetsValidate;
|
||||
//cp->ismyvin = IsAssetsInput;
|
||||
break;
|
||||
case EVAL_FAUCET:
|
||||
strcpy(cp->unspendableCCaddr,FaucetCCaddr);
|
||||
strcpy(cp->normaladdr,FaucetNormaladdr);
|
||||
strcpy(cp->CChexstr,FaucetCChexstr);
|
||||
memcpy(cp->CCpriv,FaucetCCpriv,32);
|
||||
//cp->validate = FaucetValidate;
|
||||
//cp->ismyvin = IsFaucetInput;
|
||||
break;
|
||||
case EVAL_REWARDS:
|
||||
strcpy(cp->unspendableCCaddr,RewardsCCaddr);
|
||||
strcpy(cp->normaladdr,RewardsNormaladdr);
|
||||
strcpy(cp->CChexstr,RewardsCChexstr);
|
||||
memcpy(cp->CCpriv,RewardsCCpriv,32);
|
||||
//cp->validate = RewardsValidate;
|
||||
//cp->ismyvin = IsRewardsInput;
|
||||
break;
|
||||
case EVAL_DICE:
|
||||
strcpy(cp->unspendableCCaddr,DiceCCaddr);
|
||||
strcpy(cp->normaladdr,DiceNormaladdr);
|
||||
strcpy(cp->CChexstr,DiceCChexstr);
|
||||
memcpy(cp->CCpriv,DiceCCpriv,32);
|
||||
//cp->validate = DiceValidate;
|
||||
//cp->ismyvin = IsDiceInput;
|
||||
break;
|
||||
case EVAL_LOTTO:
|
||||
strcpy(cp->unspendableCCaddr,LottoCCaddr);
|
||||
strcpy(cp->normaladdr,LottoNormaladdr);
|
||||
strcpy(cp->CChexstr,LottoCChexstr);
|
||||
memcpy(cp->CCpriv,LottoCCpriv,32);
|
||||
//cp->validate = LottoValidate;
|
||||
//cp->ismyvin = IsLottoInput;
|
||||
break;
|
||||
case EVAL_FSM:
|
||||
strcpy(cp->unspendableCCaddr,FSMCCaddr);
|
||||
strcpy(cp->normaladdr,FSMNormaladdr);
|
||||
strcpy(cp->CChexstr,FSMCChexstr);
|
||||
memcpy(cp->CCpriv,FSMCCpriv,32);
|
||||
//cp->validate = FSMValidate;
|
||||
//cp->ismyvin = IsFSMInput;
|
||||
break;
|
||||
case EVAL_AUCTION:
|
||||
strcpy(cp->unspendableCCaddr,AuctionCCaddr);
|
||||
strcpy(cp->normaladdr,AuctionNormaladdr);
|
||||
strcpy(cp->CChexstr,AuctionCChexstr);
|
||||
memcpy(cp->CCpriv,AuctionCCpriv,32);
|
||||
//cp->validate = AuctionValidate;
|
||||
//cp->ismyvin = IsAuctionInput;
|
||||
break;
|
||||
case EVAL_HEIR:
|
||||
strcpy(cp->unspendableCCaddr,HeirCCaddr);
|
||||
strcpy(cp->normaladdr,HeirNormaladdr);
|
||||
strcpy(cp->CChexstr,HeirCChexstr);
|
||||
memcpy(cp->CCpriv,HeirCCpriv,32);
|
||||
//cp->validate = HeirValidate;
|
||||
//cp->ismyvin = IsHeirInput;
|
||||
break;
|
||||
case EVAL_CHANNELS:
|
||||
strcpy(cp->unspendableCCaddr,ChannelsCCaddr);
|
||||
strcpy(cp->normaladdr,ChannelsNormaladdr);
|
||||
strcpy(cp->CChexstr,ChannelsCChexstr);
|
||||
memcpy(cp->CCpriv,ChannelsCCpriv,32);
|
||||
//cp->validate = ChannelsValidate;
|
||||
//cp->ismyvin = IsChannelsInput;
|
||||
break;
|
||||
case EVAL_ORACLES:
|
||||
strcpy(cp->unspendableCCaddr,OraclesCCaddr);
|
||||
strcpy(cp->normaladdr,OraclesNormaladdr);
|
||||
strcpy(cp->CChexstr,OraclesCChexstr);
|
||||
memcpy(cp->CCpriv,OraclesCCpriv,32);
|
||||
//cp->validate = OraclesValidate;
|
||||
//cp->ismyvin = IsOraclesInput;
|
||||
break;
|
||||
case EVAL_PRICES:
|
||||
strcpy(cp->unspendableCCaddr,PricesCCaddr);
|
||||
strcpy(cp->normaladdr,PricesNormaladdr);
|
||||
strcpy(cp->CChexstr,PricesCChexstr);
|
||||
memcpy(cp->CCpriv,PricesCCpriv,32);
|
||||
//cp->validate = PricesValidate;
|
||||
//cp->ismyvin = IsPricesInput;
|
||||
break;
|
||||
case EVAL_PEGS:
|
||||
strcpy(cp->unspendableCCaddr,PegsCCaddr);
|
||||
strcpy(cp->normaladdr,PegsNormaladdr);
|
||||
strcpy(cp->CChexstr,PegsCChexstr);
|
||||
memcpy(cp->CCpriv,PegsCCpriv,32);
|
||||
//cp->validate = PegsValidate;
|
||||
//cp->ismyvin = IsPegsInput;
|
||||
break;
|
||||
case EVAL_PAYMENTS:
|
||||
strcpy(cp->unspendableCCaddr,PaymentsCCaddr);
|
||||
strcpy(cp->normaladdr,PaymentsNormaladdr);
|
||||
strcpy(cp->CChexstr,PaymentsCChexstr);
|
||||
memcpy(cp->CCpriv,PaymentsCCpriv,32);
|
||||
//cp->validate = PaymentsValidate;
|
||||
//cp->ismyvin = IsPaymentsInput;
|
||||
break;
|
||||
case EVAL_GATEWAYS:
|
||||
strcpy(cp->unspendableCCaddr,GatewaysCCaddr);
|
||||
strcpy(cp->normaladdr,GatewaysNormaladdr);
|
||||
strcpy(cp->CChexstr,GatewaysCChexstr);
|
||||
memcpy(cp->CCpriv,GatewaysCCpriv,32);
|
||||
//cp->validate = GatewaysValidate;
|
||||
//cp->ismyvin = IsGatewaysInput;
|
||||
break;
|
||||
|
||||
case EVAL_TOKENS:
|
||||
strcpy(cp->unspendableCCaddr, TokensCCaddr);
|
||||
strcpy(cp->normaladdr, TokensNormaladdr);
|
||||
strcpy(cp->CChexstr, TokensCChexstr);
|
||||
memcpy(cp->CCpriv, TokensCCpriv, 32);
|
||||
//cp->validate = TokensValidate;
|
||||
//cp->ismyvin = IsTokensInput;
|
||||
break;
|
||||
case EVAL_IMPORTGATEWAY:
|
||||
strcpy(cp->unspendableCCaddr, ImportGatewayCCaddr);
|
||||
strcpy(cp->normaladdr, ImportGatewayNormaladdr);
|
||||
strcpy(cp->CChexstr, ImportGatewayCChexstr);
|
||||
memcpy(cp->CCpriv, ImportGatewayCCpriv, 32);
|
||||
//cp->validate = ImportGatewayValidate;
|
||||
//cp->ismyvin = IsImportGatewayInput;
|
||||
break;
|
||||
default:
|
||||
if ( CClib_initcp(cp,evalcode) < 0 )
|
||||
return(0);
|
||||
break;
|
||||
}
|
||||
return(cp);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,17 +0,0 @@
|
||||
|
||||
bool FUNCNAME(CScript const& scriptSig)
|
||||
{
|
||||
CC *cond;
|
||||
if (!(cond = GetCryptoCondition(scriptSig)))
|
||||
return false;
|
||||
// Recurse the CC tree to find asset condition
|
||||
auto findEval = [] (CC *cond, struct CCVisitor _) {
|
||||
bool r = cc_typeId(cond) == CC_Eval && cond->codeLength == 1 && cond->code[0] == EVALCODE;
|
||||
// false for a match, true for continue
|
||||
return r ? 0 : 1;
|
||||
};
|
||||
CCVisitor visitor = {findEval, (uint8_t*)"", 0, NULL};
|
||||
bool out =! cc_visit(cond, visitor);
|
||||
cc_free(cond);
|
||||
return out;
|
||||
}
|
||||
@@ -1,31 +0,0 @@
|
||||
// Copyright (c) 2016-2023 The Hush developers
|
||||
// Distributed under the GPLv3 software license, see the accompanying
|
||||
// file COPYING or https://www.gnu.org/licenses/gpl-3.0.en.html
|
||||
/******************************************************************************
|
||||
* Copyright © 2014-2019 The SuperNET Developers. *
|
||||
* *
|
||||
* See the AUTHORS, DEVELOPER-AGREEMENT and LICENSE files at *
|
||||
* the top-level directory of this distribution for the individual copyright *
|
||||
* holder information and the developer policies on copyright and licensing. *
|
||||
* *
|
||||
* Unless otherwise agreed in a custom licensing agreement, no part of the *
|
||||
* SuperNET software, including this file may be copied, modified, propagated *
|
||||
* or distributed except according to the terms contained in the LICENSE file *
|
||||
* *
|
||||
* Removal or modification of this copyright notice is prohibited. *
|
||||
* *
|
||||
******************************************************************************/
|
||||
#ifndef CC_FAUCET_H
|
||||
#define CC_FAUCET_H
|
||||
#include "CCinclude.h"
|
||||
#define EVAL_FAUCET 0xe4
|
||||
#define FAUCETSIZE (COIN / 10)
|
||||
|
||||
bool FaucetValidate(struct CCcontract_info *cp,Eval* eval,const CTransaction &tx, uint32_t nIn);
|
||||
|
||||
// CCcustom
|
||||
UniValue FaucetFund(const CPubKey& mypk,uint64_t txfee,int64_t funds);
|
||||
UniValue FaucetGet(const CPubKey& mypk,uint64_t txfee);
|
||||
UniValue FaucetInfo();
|
||||
|
||||
#endif
|
||||
@@ -1,33 +0,0 @@
|
||||
// Copyright (c) 2016-2023 The Hush developers
|
||||
// Distributed under the GPLv3 software license, see the accompanying
|
||||
// file COPYING or https://www.gnu.org/licenses/gpl-3.0.en.html
|
||||
/******************************************************************************
|
||||
* Copyright © 2014-2019 The SuperNET Developers. *
|
||||
* *
|
||||
* See the AUTHORS, DEVELOPER-AGREEMENT and LICENSE files at *
|
||||
* the top-level directory of this distribution for the individual copyright *
|
||||
* holder information and the developer policies on copyright and licensing. *
|
||||
* *
|
||||
* Unless otherwise agreed in a custom licensing agreement, no part of the *
|
||||
* SuperNET software, including this file may be copied, modified, propagated *
|
||||
* or distributed except according to the terms contained in the LICENSE file *
|
||||
* *
|
||||
* Removal or modification of this copyright notice is prohibited. *
|
||||
* *
|
||||
******************************************************************************/
|
||||
|
||||
|
||||
#ifndef CC_FSM_H
|
||||
#define CC_FSM_H
|
||||
|
||||
#include "CCinclude.h"
|
||||
|
||||
#define EVAL_FSM 0xe7
|
||||
|
||||
bool FSMValidate(struct CCcontract_info *cp,Eval* eval,const CTransaction &tx, uint32_t nIn);
|
||||
|
||||
std::string FSMList();
|
||||
std::string FSMInfo(uint256 fsmtxid);
|
||||
std::string FSMCreate(uint64_t txfee,std::string name,std::string states);
|
||||
|
||||
#endif
|
||||
@@ -18,46 +18,10 @@
|
||||
#ifndef CC_INCLUDE_H
|
||||
#define CC_INCLUDE_H
|
||||
|
||||
/*! \file CCinclude.h
|
||||
\brief Cryptoconditions
|
||||
|
||||
CCs for teh lulz
|
||||
|
||||
*/
|
||||
|
||||
/// \mainpage Brief introduction into cryptocondition contracts
|
||||
/// There are only a very few types in bitcoin: pay to pubkey, pay to pubkey hash and pay to script hash (p2pk, p2pkh, p2sh).
|
||||
/// There are actually more that are possible, but those three are 99%+ of bitcoin transactions.
|
||||
/// So you can pay to a pubkey, or to its hash or to a script's hash. The last is how most of the more complex scripts are invoked. To spend a p2sh vout, you need to provide the redeemscript,
|
||||
/// this script's hash is what the p2sh address was.
|
||||
/// All of the above are the standard bitcoin vout types and there should be plenty of materials about it.
|
||||
///
|
||||
/// Cryptoconditions (CC) contracts created a fourth type of vout, the CC vout. This is using the cryptoconditions standard and it is even a different signature mechanism,
|
||||
/// ed25519 instead of secp256k1. It is basically a big extension to the bitcoin script. There is a special opcode that is added that says it is a CC script.
|
||||
///
|
||||
/// But it gets more interesting. Each CC script has an evalcode.
|
||||
/// This is just an arbitrary number but what it does is allows to create a self-contained universe of CC utxo that all have the same evalcode and that is
|
||||
/// how a faucet CC contract differentiates itself from a dice CC contract, the eval code is different.
|
||||
///
|
||||
/// One effect from using a different eval code is that even if the rest of the CC script is the same, the bitcoin address that is calculated is different.
|
||||
/// What this means is that for each pubkey, there is a unique address for each different eval code!
|
||||
/// And this allows efficient segregation of one CC contracts transactions from another.
|
||||
/// The final part that will make it all clear how the funds can be locked inside the contract.
|
||||
/// This is what makes a contract, a contract.
|
||||
/// I put both the privkey and pubkey for a randomly chosen address and associate it with each CC contract.
|
||||
/// That means anybody can sign outputs for that privkey.
|
||||
/// However, it is a CC output, so in addition to the signature, whatever constraints a CC contract implements must also be satistifed.
|
||||
/// This allows funds to be locked and yet anybody is able to spend it, assuming they satisfy the CC's rules.
|
||||
///
|
||||
/// One other technical note is that Hush has the insight-explorer extensions built in
|
||||
/// so it can lookup directly all transactions to any address.
|
||||
/// This is a key performance boosting thing as if it wasnt there, trying to get all the utxo for an address not in the wallet is quite time consuming.
|
||||
///
|
||||
|
||||
#include <cc/eval.h>
|
||||
#include <script/cc.h>
|
||||
#include <script/script.h>
|
||||
#include <cryptoconditions.h>
|
||||
#include "../script/standard.h"
|
||||
#include "../base58.h"
|
||||
#include "../key.h"
|
||||
@@ -75,7 +39,6 @@ CCs for teh lulz
|
||||
#include "../init.h"
|
||||
#include "rpc/server.h"
|
||||
|
||||
#define CC_BURNPUBKEY "02deaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddead" //!< 'dead' pubkey in hex for burning tokens (if tokens are sent to it, they become 'burned')
|
||||
/// \cond INTERNAL
|
||||
#define CC_MAXVINS 1024
|
||||
#define CC_REQUIREMENTS_MSG (HUSH_NSPV_SUPERLITE?"to use CC contracts you need to nspv_login first\n":"to use CC contracts, you need to launch daemon with valid -pubkey= for an address in your wallet\n")
|
||||
@@ -252,7 +215,6 @@ bool GetAddressUnspent(uint160 addressHash, int type,std::vector<std::pair<CAddr
|
||||
int32_t CCgetspenttxid(uint256 &spenttxid,int32_t &vini,int32_t &height,uint256 txid,int32_t vout);
|
||||
|
||||
/// @private
|
||||
void CCclearvars(struct CCcontract_info *cp);
|
||||
UniValue CClib(struct CCcontract_info *cp,char *method,char *jsonstr);
|
||||
UniValue CClib_info(struct CCcontract_info *cp);
|
||||
|
||||
@@ -327,21 +289,6 @@ CPubKey CCtxidaddr(char *txidaddr,uint256 txid);
|
||||
/// @return public key for the created address
|
||||
CPubKey CCCustomtxidaddr(char *txidaddr,uint256 txid,uint8_t taddr,uint8_t prefix,uint8_t prefix2);
|
||||
|
||||
// TODO: description
|
||||
/// @private
|
||||
bool GetCCParams(Eval* eval, const CTransaction &tx, uint32_t nIn,
|
||||
CTransaction &txOut, std::vector<std::vector<unsigned char>> &preConditions, std::vector<std::vector<unsigned char>> ¶ms);
|
||||
|
||||
/// \cond INTERNAL
|
||||
int64_t OraclePrice(int32_t height,uint256 reforacletxid,char *markeraddr,char *format);
|
||||
uint256 OracleMerkle(int32_t height,uint256 reforacletxid,char *format,std::vector<struct oracle_merklepair>publishers);
|
||||
uint256 OraclesBatontxid(uint256 oracletxid,CPubKey pk);
|
||||
uint8_t DecodeOraclesCreateOpRet(const CScript &scriptPubKey,std::string &name,std::string &description,std::string &format);
|
||||
uint8_t DecodeOraclesOpRet(const CScript &scriptPubKey,uint256 &oracletxid,CPubKey &pk,int64_t &num);
|
||||
uint8_t DecodeOraclesData(const CScript &scriptPubKey,uint256 &oracletxid,uint256 &batontxid,CPubKey &pk,std::vector <uint8_t>&data);
|
||||
int32_t oracle_format(uint256 *hashp,int64_t *valp,char *str,uint8_t fmt,uint8_t *data,int32_t offset,int32_t datalen);
|
||||
/// \endcond
|
||||
|
||||
/// Adds token inputs to transaction object. If tokenid is a non-fungible token then the function will set additionalTokensEvalcode2 variable in the cp object to the eval code from NFT data to spend NFT outputs properly
|
||||
/// @param cp CCcontract_info structure
|
||||
/// @param mtx mutable transaction object
|
||||
@@ -377,71 +324,6 @@ bool DecodeHexTx(CTransaction& tx, const std::string& strHexTx);
|
||||
/// @private
|
||||
int32_t payments_parsehexdata(std::vector<uint8_t> &hexdata,cJSON *item,int32_t len);
|
||||
|
||||
/// Makes opreturn scriptPubKey for token creation transaction. Normally this function is called internally by the tokencreate rpc. You might need to call this function to create a customized token.
|
||||
/// The total opreturn length should not exceed 10001 byte
|
||||
/// @param funcid should be set to 'c' character
|
||||
/// @param origpubkey token creator pubkey as byte array
|
||||
/// @param name token name (no more than 32 char)
|
||||
/// @param description token description (no more than 4096 char)
|
||||
/// @param vopretNonfungible NFT data, could be empty. If not empty, NFT will be created, the first byte if the NFT data should be set to the eval code of the contract validating this NFT data
|
||||
/// @returns scriptPubKey with OP_RETURN script
|
||||
CScript EncodeTokenCreateOpRet(uint8_t funcid, std::vector<uint8_t> origpubkey, std::string name, std::string description, vscript_t vopretNonfungible);
|
||||
|
||||
/// Makes opreturn scriptPubKey for token creation transaction. Normally this function is called internally by the tokencreate rpc. You might need to call it to create a customized token.
|
||||
/// The total opreturn length should not exceed 10001 byte
|
||||
/// @param funcid should be set to 'c' character
|
||||
/// @param origpubkey token creator pubkey as byte array
|
||||
/// @param name token name (no more than 32 char)
|
||||
/// @param description token description (no more than 4096 char)
|
||||
/// @param oprets vector of pairs of additional data added to the token opret. The first element in the pair is opretid enum, the second is the data as byte array
|
||||
/// @returns scriptPubKey with OP_RETURN script
|
||||
/// @see opretid
|
||||
CScript EncodeTokenCreateOpRet(uint8_t funcid, std::vector<uint8_t> origpubkey, std::string name, std::string description, std::vector<std::pair<uint8_t, vscript_t>> oprets);
|
||||
|
||||
/// Makes opreturn scriptPubKey for token transaction. Normally this function is called internally by the token rpcs. You might call this function if your module should create a customized token.
|
||||
/// The total opreturn length should not exceed 10001 byte
|
||||
/// @param tokenid id of the token
|
||||
/// @param voutPubkeys vector of pubkeys used to make the token vout in the same transaction that the created opreturn is for, the pubkeys are used for token vout validation
|
||||
/// @param opretWithId a pair of additional opreturn data added to the token opret. Could be empty. The first element in the pair is opretid enum, the second is the data as byte array
|
||||
/// @returns scriptPubKey with OP_RETURN script
|
||||
CScript EncodeTokenOpRet(uint256 tokenid, std::vector<CPubKey> voutPubkeys, std::pair<uint8_t, vscript_t> opretWithId);
|
||||
|
||||
/// An overload to make opreturn scriptPubKey for token transaction. Normally this function is called internally by the token rpcs. You might call this function if your module should create a customized token.
|
||||
/// The total opreturn length should not exceed 10001 byte
|
||||
/// @param tokenid id of the token
|
||||
/// @param voutPubkeys vector of pubkeys used to make the token vout in the same transaction that the created opreturn is for, the pubkeys are used for token vout validation
|
||||
/// @param oprets vector of pairs of additional opreturn data added to the token opret. Could be empty. The first element in the pair is opretid enum, the second is the data as byte array
|
||||
/// @returns scriptPubKey with OP_RETURN script
|
||||
CScript EncodeTokenOpRet(uint256 tokenid, std::vector<CPubKey> voutPubkeys, std::vector<std::pair<uint8_t, vscript_t>> oprets);
|
||||
|
||||
/// Decodes opreturn scriptPubKey of token creation transaction. Normally this function is called internally by the token rpcs. You might call this function if your module should create a customized token.
|
||||
/// @param scriptPubKey OP_RETURN script to decode
|
||||
/// @param[out] origpubkey creator public key as a byte array
|
||||
/// @param[out] name token name
|
||||
/// @param[out] description token description
|
||||
/// @returns funcid ('c') or NULL if errors
|
||||
uint8_t DecodeTokenCreateOpRet(const CScript &scriptPubKey, std::vector<uint8_t> &origpubkey, std::string &name, std::string &description);
|
||||
|
||||
/// Overload that decodes opreturn scriptPubKey of token creation transaction and also returns additional data blobs.
|
||||
/// Normally this function is called internally by the token rpcs. You might want to call this function if your module should create a customized token.
|
||||
/// @param scriptPubKey OP_RETURN script to decode
|
||||
/// @param[out] origpubkey creator public key as a byte array
|
||||
/// @param[out] name token name
|
||||
/// @param[out] description token description
|
||||
/// @param[out] oprets vector of pairs of additional opreturn data added to the token opret. Could be empty if not set. The first element in the pair is opretid enum, the second is the data as byte array
|
||||
/// @returns funcid ('c') or NULL if errors
|
||||
uint8_t DecodeTokenCreateOpRet(const CScript &scriptPubKey, std::vector<uint8_t> &origpubkey, std::string &name, std::string &description, std::vector<std::pair<uint8_t, vscript_t>> &oprets);
|
||||
|
||||
/// Decodes opreturn scriptPubKey of token transaction, also returns additional data blobs.
|
||||
/// Normally this function is called internally by different token rpc. You might want to call if your module created a customized token.
|
||||
/// @param scriptPubKey OP_RETURN script to decode
|
||||
/// @param[out] evalCodeTokens should be EVAL_TOKENS
|
||||
/// @param[out] tokenid id of token
|
||||
/// @param[out] voutPubkeys vector of token output validation pubkeys from the opreturn
|
||||
/// @param[out] oprets vector of pairs of additional opreturn data added to the token opret. Could be empty if not set. The first element in the pair is opretid enum, the second is the data as byte array
|
||||
/// @returns funcid ('c' if creation tx or 't' if token transfer tx) or NULL if errors
|
||||
uint8_t DecodeTokenOpRet(const CScript scriptPubKey, uint8_t &evalCodeTokens, uint256 &tokenid, std::vector<CPubKey> &voutPubkeys, std::vector<std::pair<uint8_t, vscript_t>> &oprets);
|
||||
|
||||
/// @private
|
||||
int64_t AddCClibtxfee(struct CCcontract_info *cp, CMutableTransaction &mtx, CPubKey pk);
|
||||
|
||||
@@ -512,24 +394,6 @@ bool getCCopret(const CScript &scriptPubKey, CScript &opret);
|
||||
/// @private
|
||||
bool makeCCopret(CScript &opret, std::vector<std::vector<unsigned char>> &vData);
|
||||
|
||||
/// MakeCCcond1 creates a cryptocondition that allows to spend it by one key
|
||||
/// @param evalcode cryptocondition eval code (transactions with this eval code in cc inputs will be forwarded to the contract associated with this eval code)
|
||||
/// @param pk pubkey to spend the cc
|
||||
/// @returns cryptocondition object. Must be disposed with cc_free function when not used any more
|
||||
CC *MakeCCcond1(uint8_t evalcode,CPubKey pk);
|
||||
|
||||
/// MakeCCcond1of2 creates new 1of2 cryptocondition that allows to spend it by either of two keys
|
||||
/// @param evalcode cryptocondition eval code (transactions with this eval code in cc inputs will be forwarded to the contract associated with this eval code)
|
||||
/// @param pk1 one of two pubkeys to spend the cc
|
||||
/// @param pk2 second of two pubkeys to spend the cc
|
||||
/// @returns cryptocondition object. Must be disposed with cc_free function when not used any more
|
||||
CC *MakeCCcond1of2(uint8_t evalcode,CPubKey pk1,CPubKey pk2);
|
||||
|
||||
/// GetCryptoCondition retrieves the cryptocondition from a scriptSig object
|
||||
/// @param scriptSig scriptSig object with a cryptocondition
|
||||
/// @returns cc object, must be disposed with cc_free when not used
|
||||
CC* GetCryptoCondition(CScript const& scriptSig);
|
||||
|
||||
/// CCaddr2set sets private key for additional eval code global address.
|
||||
/// This allows to spend from two cc global addresses in one transaction (the first one is set in cp object by @see CCinit function).
|
||||
/// @param cp contract info structure (@see CCcontract_info) where the private key is set
|
||||
@@ -566,38 +430,6 @@ void CCaddr3set(struct CCcontract_info *cp,uint8_t evalcode,CPubKey pk,uint8_t *
|
||||
/// @see GetCCaddress1of2
|
||||
void CCaddr1of2set(struct CCcontract_info *cp, CPubKey pk1, CPubKey pk2,uint8_t *priv,char *coinaddr);
|
||||
|
||||
/// Creates a token cryptocondition that allows to spend it by one key
|
||||
/// The resulting cc will have two eval codes (EVAL_TOKENS and evalcode parameter value).
|
||||
/// @param evalcode cryptocondition eval code (transactions with this eval code in cc inputs will be forwarded to the contract associated with this eval code)
|
||||
/// @param pk pubkey to spend the cc
|
||||
/// @returns cryptocondition object. Must be disposed with cc_free function when not used any more
|
||||
CC *MakeTokensCCcond1(uint8_t evalcode, CPubKey pk);
|
||||
|
||||
/// Overloaded function that creates a token cryptocondition that allows to spend it by one key
|
||||
/// The resulting cc will have two eval codes (EVAL_TOKENS and evalcode parameter value).
|
||||
/// @param evalcode cryptocondition eval code (transactions with this eval code in cc inputs will be forwarded to the contract associated with this eval code)
|
||||
/// @param evalcode2 yet another cryptocondition eval code (transactions with this eval code in cc inputs will be forwarded to the contract associated with this eval code)
|
||||
/// @param pk pubkey to spend the cc
|
||||
/// @returns cryptocondition object. Must be disposed with cc_free function when not used any more
|
||||
CC *MakeTokensCCcond1(uint8_t evalcode, uint8_t evalcode2, CPubKey pk);
|
||||
|
||||
/// Creates new 1of2 token cryptocondition that allows to spend it by either of two keys
|
||||
/// Resulting vout will have three eval codes (EVAL_TOKENS, evalcode and evalcode2 parameter values).
|
||||
/// @param evalcode cryptocondition eval code (transactions with this eval code in cc inputs will be forwarded to the contract associated with this eval code)
|
||||
/// @param pk1 one of two pubkeys to spend the cc
|
||||
/// @param pk2 second of two pubkeys to spend the cc
|
||||
/// @returns cryptocondition object. Must be disposed with cc_free function when not used any more
|
||||
CC *MakeTokensCCcond1of2(uint8_t evalcode, CPubKey pk1, CPubKey pk2);
|
||||
|
||||
/// Creates new 1of2 token cryptocondition that allows to spend it by either of two keys
|
||||
/// The resulting cc will have two eval codes (EVAL_TOKENS and evalcode parameter value).
|
||||
/// @param evalcode cryptocondition eval code (transactions with this eval code in cc inputs will be forwarded to the contract associated with this eval code)
|
||||
/// @param evalcode2 yet another cryptocondition eval code (transactions with this eval code in cc inputs will be forwarded to the contract associated with this eval code)
|
||||
/// @param pk1 one of two pubkeys to spend the cc
|
||||
/// @param pk2 second of two pubkeys to spend the cc
|
||||
/// @returns cryptocondition object. Must be disposed with cc_free function when not used any more
|
||||
CC *MakeTokensCCcond1of2(uint8_t evalcode, uint8_t evalcode2, CPubKey pk1, CPubKey pk2);
|
||||
|
||||
/// Creates a token transaction output with a cryptocondition that allows to spend it by one key.
|
||||
/// The resulting vout will have two eval codes (EVAL_TOKENS and evalcode parameter value).
|
||||
/// The returned output should be added to a transaction vout array.
|
||||
@@ -709,43 +541,9 @@ CPubKey pubkey2pk(std::vector<uint8_t> vpubkey);
|
||||
/// @param tokenid id of token (id of token creation tx)
|
||||
int64_t CCfullsupply(uint256 tokenid);
|
||||
|
||||
/// CCtoken_balance returns token balance for an address
|
||||
/// @param destaddr address to search the balance on
|
||||
/// @param tokenid id of the token
|
||||
int64_t CCtoken_balance(char *destaddr,uint256 tokenid);
|
||||
|
||||
/// @private
|
||||
int64_t CCtoken_balance2(char *destaddr,uint256 tokenid);
|
||||
|
||||
/// _GetCCaddress retrieves the address for the scriptPubKey for the cryptocondition that is made for eval code and public key
|
||||
/// @param[out] destaddr the address for the cc scriptPubKey. Should have at least 64 char buffer space
|
||||
/// @param evalcode eval code for which cryptocondition will be made
|
||||
/// @param pk pubkey for which cryptocondition will be made
|
||||
bool _GetCCaddress(char *destaddr,uint8_t evalcode,CPubKey pk);
|
||||
|
||||
/// GetCCaddress retrieves the address for the scriptPubKey for the cryptocondition that is made for eval code and public key.
|
||||
/// The evalcode is taken from the cp object
|
||||
/// @param cp object of CCcontract_info type
|
||||
/// @param[out] destaddr the address for the cc scriptPubKey. Should have at least 64 char buffer space
|
||||
/// @param pk pubkey for which cryptocondition will be made
|
||||
/// @see CCcontract_info
|
||||
bool GetCCaddress(struct CCcontract_info *cp,char *destaddr,CPubKey pk);
|
||||
|
||||
/// GetCCaddress1of2 retrieves the address for the scriptPubKey for the 1of2 cryptocondition that is made for eval code and two public keys.
|
||||
/// The evalcode is taken from the cp object
|
||||
/// @param cp object of CCcontract_info type
|
||||
/// @param[out] destaddr the address for the cc scriptPubKey. Should have at least 64 char buffer space
|
||||
/// @param pk first pubkey 1of2 cryptocondition
|
||||
/// @param pk2 second pubkey of 1of2 cryptocondition
|
||||
/// @see CCcontract_info
|
||||
bool GetCCaddress1of2(struct CCcontract_info *cp,char *destaddr,CPubKey pk,CPubKey pk2);
|
||||
|
||||
/// @private
|
||||
bool ConstrainVout(CTxOut vout,int32_t CCflag,char *cmpaddr,int64_t nValue);
|
||||
|
||||
/// @private
|
||||
bool PreventCC(Eval* eval,const CTransaction &tx,int32_t preventCCvins,int32_t numvins,int32_t preventCCvouts,int32_t numvouts);
|
||||
|
||||
/// Returns bitcoin address for the scriptPubKey parameter
|
||||
/// @param[out] destaddr the returned address of the scriptPubKey, the buffer should have size of at least 64 chars
|
||||
/// @param scriptPubKey scriptPubKey object
|
||||
@@ -770,18 +568,6 @@ std::vector<uint8_t> Mypubkey();
|
||||
/// @see Mypubkey
|
||||
bool Myprivkey(uint8_t myprivkey[]);
|
||||
|
||||
/// Returns duration in seconds and number of blocks since the block where a transaction resides till the chain tip
|
||||
/// @param[out] numblocks number of blocks from the block where the transaction with txid resides
|
||||
/// @param txid id of the transaction that is queried of
|
||||
/// @return duration in seconds since the block where the transaction with txid resides
|
||||
int64_t CCduration(int32_t &numblocks,uint256 txid);
|
||||
|
||||
/// @private
|
||||
uint256 CCOraclesReverseScan(char const *logcategory,uint256 &txid,int32_t height,uint256 reforacletxid,uint256 batontxid);
|
||||
|
||||
/// @private
|
||||
int32_t CCCointxidExists(char const *logcategory,uint256 cointxid);
|
||||
|
||||
/// @private
|
||||
uint256 BitcoinGetProofMerkleRoot(const std::vector<uint8_t> &proofData, std::vector<uint256> &txids);
|
||||
|
||||
@@ -949,11 +735,6 @@ extern void CCLogPrintStr(const char *category, int level, const std::string &st
|
||||
template <class T>
|
||||
void CCLogPrintStream(const char *category, int level, const char *functionName, T print_to_stream)
|
||||
{
|
||||
std::ostringstream stream;
|
||||
print_to_stream(stream);
|
||||
if (functionName != NULL)
|
||||
stream << functionName << " ";
|
||||
CCLogPrintStr(category, level, stream.str());
|
||||
}
|
||||
/// Macro for logging messages using bitcoin LogAcceptCategory and LogPrintStr functions.
|
||||
/// Supports error, info and three levels of debug messages.
|
||||
|
||||
@@ -1,44 +0,0 @@
|
||||
// Copyright (c) 2016-2023 The Hush developers
|
||||
// Distributed under the GPLv3 software license, see the accompanying
|
||||
// file COPYING or https://www.gnu.org/licenses/gpl-3.0.en.html
|
||||
/******************************************************************************
|
||||
* Copyright © 2014-2018 The SuperNET Developers. *
|
||||
* *
|
||||
* See the AUTHORS, DEVELOPER-AGREEMENT and LICENSE files at *
|
||||
* the top-level directory of this distribution for the individual copyright *
|
||||
* holder information and the developer policies on copyright and licensing. *
|
||||
* *
|
||||
* Unless otherwise agreed in a custom licensing agreement, no part of the *
|
||||
* SuperNET software, including this file may be copied, modified, propagated *
|
||||
* or distributed except according to the terms contained in the LICENSE file *
|
||||
* *
|
||||
* Removal or modification of this copyright notice is prohibited. *
|
||||
* *
|
||||
******************************************************************************/
|
||||
|
||||
|
||||
/*
|
||||
CCassetstx has the functions that create the EVAL_ASSETS transactions. It is expected that rpc calls would call these functions. For EVAL_ASSETS, the rpc functions are in rpcwallet.cpp
|
||||
|
||||
CCassetsCore has functions that are used in two contexts, both during rpc transaction create time and also during the blockchain validation. Using the identical functions is a good way to prevent them from being mismatched. The must match or the transaction will get rejected.
|
||||
*/
|
||||
|
||||
#ifndef CC_TOKENS_H
|
||||
#define CC_TOKENS_H
|
||||
|
||||
#include "CCinclude.h"
|
||||
|
||||
// CCcustom
|
||||
bool TokensValidate(struct CCcontract_info *cp,Eval* eval,const CTransaction &tx, uint32_t nIn);
|
||||
bool TokensExactAmounts(bool goDeeper, struct CCcontract_info *cpTokens, int64_t &inputs, int64_t &outputs, Eval* eval, const CTransaction &tx, uint256 tokenid);
|
||||
std::string CreateToken(int64_t txfee, int64_t assetsupply, std::string name, std::string description, std::vector<uint8_t> nonfungibleData);
|
||||
std::string TokenTransfer(int64_t txfee, uint256 assetid, std::vector<uint8_t> destpubkey, int64_t total);
|
||||
int64_t HasBurnedTokensvouts(struct CCcontract_info *cp, Eval* eval, const CTransaction& tx, uint256 reftokenid);
|
||||
CPubKey GetTokenOriginatorPubKey(CScript scriptPubKey);
|
||||
bool IsTokenMarkerVout(CTxOut vout);
|
||||
|
||||
int64_t GetTokenBalance(CPubKey pk, uint256 tokenid);
|
||||
UniValue TokenInfo(uint256 tokenid);
|
||||
UniValue TokenList();
|
||||
|
||||
#endif
|
||||
@@ -1,354 +0,0 @@
|
||||
// Copyright (c) 2016-2023 The Hush developers
|
||||
// Distributed under the GPLv3 software license, see the accompanying
|
||||
// file COPYING or https://www.gnu.org/licenses/gpl-3.0.en.html
|
||||
/******************************************************************************
|
||||
* Copyright © 2014-2019 The SuperNET Developers. *
|
||||
* *
|
||||
* See the AUTHORS, DEVELOPER-AGREEMENT and LICENSE files at *
|
||||
* the top-level directory of this distribution for the individual copyright *
|
||||
* holder information and the developer policies on copyright and licensing. *
|
||||
* *
|
||||
* Unless otherwise agreed in a custom licensing agreement, no part of the *
|
||||
* SuperNET software, including this file may be copied, modified, propagated *
|
||||
* or distributed except according to the terms contained in the LICENSE file *
|
||||
* *
|
||||
* Removal or modification of this copyright notice is prohibited. *
|
||||
* *
|
||||
******************************************************************************/
|
||||
|
||||
// encode decode tokens opret
|
||||
// make token cryptoconditions and vouts
|
||||
// This code was moved to a separate source file to enable linking libcommon.so (with importcoin.cpp which depends on some token functions)
|
||||
|
||||
#include "CCtokens.h"
|
||||
|
||||
#ifndef IS_CHARINSTR
|
||||
#define IS_CHARINSTR(c, str) (std::string(str).find((char)(c)) != std::string::npos)
|
||||
#endif
|
||||
|
||||
// NOTE: this inital tx won't be used by other contract
|
||||
// for tokens to be used there should be at least one 't' tx with other contract's custom opret
|
||||
CScript EncodeTokenCreateOpRet(uint8_t funcid, std::vector<uint8_t> origpubkey, std::string name, std::string description, vscript_t vopretNonfungible)
|
||||
{
|
||||
/* CScript opret;
|
||||
uint8_t evalcode = EVAL_TOKENS;
|
||||
funcid = 'c'; // override the param
|
||||
|
||||
opret << OP_RETURN << E_MARSHAL(ss << evalcode << funcid << origpubkey << name << description; \
|
||||
if (!vopretNonfungible.empty()) {
|
||||
ss << (uint8_t)OPRETID_NONFUNGIBLEDATA;
|
||||
ss << vopretNonfungible;
|
||||
}); */
|
||||
|
||||
std::vector<std::pair<uint8_t, vscript_t>> oprets;
|
||||
|
||||
if(!vopretNonfungible.empty())
|
||||
oprets.push_back(std::make_pair(OPRETID_NONFUNGIBLEDATA, vopretNonfungible));
|
||||
return EncodeTokenCreateOpRet(funcid, origpubkey, name, description, oprets);
|
||||
}
|
||||
|
||||
CScript EncodeTokenCreateOpRet(uint8_t funcid, std::vector<uint8_t> origpubkey, std::string name, std::string description, std::vector<std::pair<uint8_t, vscript_t>> oprets)
|
||||
{
|
||||
CScript opret;
|
||||
uint8_t evalcode = EVAL_TOKENS;
|
||||
funcid = 'c'; // override the param
|
||||
|
||||
opret << OP_RETURN << E_MARSHAL(ss << evalcode << funcid << origpubkey << name << description;
|
||||
for (auto o : oprets) {
|
||||
if (o.first != 0) {
|
||||
ss << (uint8_t)o.first;
|
||||
ss << o.second;
|
||||
}
|
||||
});
|
||||
return(opret);
|
||||
}
|
||||
|
||||
/*
|
||||
// opret 'i' for imported tokens
|
||||
CScript EncodeTokenImportOpRet(std::vector<uint8_t> origpubkey, std::string name, std::string description, uint256 srctokenid, std::vector<std::pair<uint8_t, vscript_t>> oprets)
|
||||
{
|
||||
CScript opret;
|
||||
uint8_t evalcode = EVAL_TOKENS;
|
||||
uint8_t funcid = 'i';
|
||||
|
||||
srctokenid = revuint256(srctokenid); // do not forget this
|
||||
|
||||
opret << OP_RETURN << E_MARSHAL(ss << evalcode << funcid << origpubkey << name << description << srctokenid;
|
||||
for (auto o : oprets) {
|
||||
if (o.first != 0) {
|
||||
ss << (uint8_t)o.first;
|
||||
ss << o.second;
|
||||
}
|
||||
});
|
||||
return(opret);
|
||||
}
|
||||
*/
|
||||
|
||||
|
||||
CScript EncodeTokenOpRet(uint256 tokenid, std::vector<CPubKey> voutPubkeys, std::pair<uint8_t, vscript_t> opretWithId)
|
||||
{
|
||||
std::vector<std::pair<uint8_t, vscript_t>> oprets;
|
||||
oprets.push_back(opretWithId);
|
||||
return EncodeTokenOpRet(tokenid, voutPubkeys, oprets);
|
||||
}
|
||||
|
||||
CScript EncodeTokenOpRet(uint256 tokenid, std::vector<CPubKey> voutPubkeys, std::vector<std::pair<uint8_t, vscript_t>> oprets)
|
||||
{
|
||||
CScript opret;
|
||||
uint8_t tokenFuncId = 't';
|
||||
uint8_t evalCodeInOpret = EVAL_TOKENS;
|
||||
|
||||
tokenid = revuint256(tokenid);
|
||||
|
||||
uint8_t ccType = 0;
|
||||
if (voutPubkeys.size() >= 0 && voutPubkeys.size() <= 2)
|
||||
ccType = voutPubkeys.size();
|
||||
else {
|
||||
LOGSTREAM((char *)"cctokens", CCLOG_DEBUG2, stream << "EncodeTokenOpRet voutPubkeys.size()=" << voutPubkeys.size() << " not supported" << std::endl);
|
||||
}
|
||||
|
||||
//vopret_t vpayload;
|
||||
//GetOpReturnData(payload, vpayload);
|
||||
|
||||
opret << OP_RETURN << E_MARSHAL(ss << evalCodeInOpret << tokenFuncId << tokenid << ccType;
|
||||
if (ccType >= 1) ss << voutPubkeys[0];
|
||||
if (ccType == 2) ss << voutPubkeys[1];
|
||||
for (auto o : oprets) {
|
||||
if (o.first != 0) {
|
||||
ss << (uint8_t)o.first;
|
||||
ss << o.second;
|
||||
}
|
||||
});
|
||||
|
||||
// bad opret cases (tries to attach payload without re-serialization):
|
||||
|
||||
// error "64: scriptpubkey":
|
||||
// if (payload.size() > 0)
|
||||
// opret += payload;
|
||||
|
||||
// error "64: scriptpubkey":
|
||||
// CScript opretPayloadNoOpcode(vpayload);
|
||||
// return opret + opretPayloadNoOpcode;
|
||||
|
||||
// error "sig_aborted":
|
||||
// opret.resize(opret.size() + vpayload.size());
|
||||
// CScript::iterator it = opret.begin() + opret.size();
|
||||
// for (int i = 0; i < vpayload.size(); i++, it++)
|
||||
// *it = vpayload[i];
|
||||
|
||||
return opret;
|
||||
}
|
||||
|
||||
// overload for compatibility
|
||||
//CScript EncodeTokenOpRet(uint8_t tokenFuncId, uint8_t evalCodeInOpret, uint256 tokenid, std::vector<CPubKey> voutPubkeys, CScript payload)
|
||||
//{
|
||||
// return EncodeTokenOpRet(tokenid, voutPubkeys, payload);
|
||||
//}
|
||||
|
||||
// overload for fungible tokens (no additional data in opret):
|
||||
uint8_t DecodeTokenCreateOpRet(const CScript &scriptPubKey, std::vector<uint8_t> &origpubkey, std::string &name, std::string &description) {
|
||||
//vopret_t vopretNonfungibleDummy;
|
||||
std::vector<std::pair<uint8_t, vscript_t>> opretsDummy;
|
||||
return DecodeTokenCreateOpRet(scriptPubKey, origpubkey, name, description, opretsDummy);
|
||||
}
|
||||
|
||||
uint8_t DecodeTokenCreateOpRet(const CScript &scriptPubKey, std::vector<uint8_t> &origpubkey, std::string &name, std::string &description, std::vector<std::pair<uint8_t, vscript_t>> &oprets)
|
||||
{
|
||||
vscript_t vopret, vblob;
|
||||
uint8_t dummyEvalcode, funcid, opretId = 0;
|
||||
|
||||
GetOpReturnData(scriptPubKey, vopret);
|
||||
oprets.clear();
|
||||
|
||||
if (vopret.size() > 2 && vopret.begin()[0] == EVAL_TOKENS && vopret.begin()[1] == 'c')
|
||||
{
|
||||
if (E_UNMARSHAL(vopret, ss >> dummyEvalcode; ss >> funcid; ss >> origpubkey; ss >> name; ss >> description;
|
||||
while (!ss.eof()) {
|
||||
ss >> opretId;
|
||||
if (!ss.eof()) {
|
||||
ss >> vblob;
|
||||
oprets.push_back(std::make_pair(opretId, vblob));
|
||||
}
|
||||
}))
|
||||
{
|
||||
return(funcid);
|
||||
}
|
||||
}
|
||||
LOGSTREAM((char *)"cctokens", CCLOG_INFO, stream << "DecodeTokenCreateOpRet() incorrect token create opret" << std::endl);
|
||||
return (uint8_t)0;
|
||||
}
|
||||
|
||||
// decode token opret:
|
||||
// for 't' returns all data from opret, vopretExtra contains other contract's data (currently only assets').
|
||||
// for 'c' returns only funcid. NOTE: nonfungible data is not returned
|
||||
uint8_t DecodeTokenOpRet(const CScript scriptPubKey, uint8_t &evalCodeTokens, uint256 &tokenid, std::vector<CPubKey> &voutPubkeys, std::vector<std::pair<uint8_t, vscript_t>> &oprets)
|
||||
{
|
||||
vscript_t vopret, vblob, dummyPubkey, vnonfungibleDummy;
|
||||
uint8_t funcId = 0, *script, dummyEvalCode, dummyFuncId, ccType, opretId = 0;
|
||||
std::string dummyName; std::string dummyDescription;
|
||||
uint256 dummySrcTokenId;
|
||||
CPubKey voutPubkey1, voutPubkey2;
|
||||
|
||||
vscript_t voldstyledata;
|
||||
bool foundOldstyle = false;
|
||||
|
||||
GetOpReturnData(scriptPubKey, vopret);
|
||||
script = (uint8_t *)vopret.data();
|
||||
tokenid = zeroid;
|
||||
oprets.clear();
|
||||
|
||||
if (script != NULL && vopret.size() > 2)
|
||||
{
|
||||
evalCodeTokens = script[0];
|
||||
if (evalCodeTokens != EVAL_TOKENS) {
|
||||
LOGSTREAM((char *)"cctokens", CCLOG_INFO, stream << "DecodeTokenOpRet() incorrect evalcode in tokens opret" << std::endl);
|
||||
return (uint8_t)0;
|
||||
}
|
||||
|
||||
funcId = script[1];
|
||||
LOGSTREAM((char *)"cctokens", CCLOG_DEBUG2, stream << "DecodeTokenOpRet() decoded funcId=" << (char)(funcId ? funcId : ' ') << std::endl);
|
||||
|
||||
switch (funcId)
|
||||
{
|
||||
case 'c':
|
||||
return DecodeTokenCreateOpRet(scriptPubKey, dummyPubkey, dummyName, dummyDescription, oprets);
|
||||
|
||||
case 't':
|
||||
|
||||
// compatibility with old-style rogue or assets data (with no opretid):
|
||||
// try to unmarshal old-style rogue or assets data:
|
||||
foundOldstyle = E_UNMARSHAL(vopret, ss >> dummyEvalCode; ss >> dummyFuncId; ss >> tokenid; ss >> ccType;
|
||||
if (ccType >= 1) ss >> voutPubkey1;
|
||||
if (ccType == 2) ss >> voutPubkey2;
|
||||
if (!ss.eof()) {
|
||||
ss >> voldstyledata;
|
||||
}) && voldstyledata.size() >= 2 &&
|
||||
(voldstyledata.begin()[0] == 0x11 /*EVAL_ROGUE*/ && IS_CHARINSTR(voldstyledata.begin()[1], "RHQKG") ||
|
||||
voldstyledata.begin()[0] == EVAL_ASSETS && IS_CHARINSTR(voldstyledata.begin()[1], "sbSBxo")) ;
|
||||
|
||||
if (foundOldstyle || // fix for compatibility with old style data (no opretid)
|
||||
E_UNMARSHAL(vopret, ss >> dummyEvalCode; ss >> dummyFuncId; ss >> tokenid; ss >> ccType;
|
||||
if (ccType >= 1) ss >> voutPubkey1;
|
||||
if (ccType == 2) ss >> voutPubkey2;
|
||||
while (!ss.eof()) {
|
||||
ss >> opretId;
|
||||
if (!ss.eof()) {
|
||||
ss >> vblob;
|
||||
oprets.push_back(std::make_pair(opretId, vblob));
|
||||
}
|
||||
}))
|
||||
{
|
||||
if (!(ccType >= 0 && ccType <= 2)) { //incorrect ccType
|
||||
LOGSTREAM((char *)"cctokens", CCLOG_INFO, stream << "DecodeTokenOpRet() incorrect ccType=" << (int)ccType << " tokenid=" << revuint256(tokenid).GetHex() << std::endl);
|
||||
return (uint8_t)0;
|
||||
}
|
||||
|
||||
// add verification pubkeys:
|
||||
voutPubkeys.clear();
|
||||
if (voutPubkey1.IsValid())
|
||||
voutPubkeys.push_back(voutPubkey1);
|
||||
if (voutPubkey2.IsValid())
|
||||
voutPubkeys.push_back(voutPubkey2);
|
||||
|
||||
tokenid = revuint256(tokenid);
|
||||
|
||||
if (foundOldstyle) { //patch for old-style opret data with no opretid
|
||||
LOGSTREAM((char *)"cctokens", CCLOG_DEBUG1, stream << "DecodeTokenOpRet() found old-style rogue/asset data, evalcode=" << (int)voldstyledata.begin()[0] << " funcid=" << (char)voldstyledata.begin()[1] << " for tokenid=" << revuint256(tokenid).GetHex() << std::endl);
|
||||
uint8_t opretIdRestored;
|
||||
if (voldstyledata.begin()[0] == 0x11 /*EVAL_ROGUE*/)
|
||||
opretIdRestored = OPRETID_ROGUEGAMEDATA;
|
||||
else // EVAL_ASSETS
|
||||
opretIdRestored = OPRETID_ASSETSDATA;
|
||||
|
||||
oprets.push_back(std::make_pair(opretIdRestored, voldstyledata));
|
||||
}
|
||||
|
||||
return(funcId);
|
||||
}
|
||||
LOGSTREAM((char *)"cctokens", CCLOG_INFO, stream << "DecodeTokenOpRet() bad opret format," << " ccType=" << (int)ccType << " tokenid=" << revuint256(tokenid).GetHex() << std::endl);
|
||||
return (uint8_t)0;
|
||||
|
||||
default:
|
||||
LOGSTREAM((char *)"cctokens", CCLOG_INFO, stream << "DecodeTokenOpRet() illegal funcid=" << (int)funcId << std::endl);
|
||||
return (uint8_t)0;
|
||||
}
|
||||
}
|
||||
else {
|
||||
LOGSTREAM((char *)"cctokens", CCLOG_INFO, stream << "DecodeTokenOpRet() empty opret, could not parse" << std::endl);
|
||||
}
|
||||
return (uint8_t)0;
|
||||
}
|
||||
|
||||
|
||||
// make three-eval (token+evalcode+evalcode2) 1of2 cryptocondition:
|
||||
CC *MakeTokensCCcond1of2(uint8_t evalcode, uint8_t evalcode2, CPubKey pk1, CPubKey pk2)
|
||||
{
|
||||
// make 1of2 sigs cond
|
||||
std::vector<CC*> pks;
|
||||
pks.push_back(CCNewSecp256k1(pk1));
|
||||
pks.push_back(CCNewSecp256k1(pk2));
|
||||
|
||||
std::vector<CC*> thresholds;
|
||||
thresholds.push_back(CCNewEval(E_MARSHAL(ss << evalcode)));
|
||||
if (evalcode != EVAL_TOKENS) // if evalCode == EVAL_TOKENS, it is actually MakeCCcond1of2()!
|
||||
thresholds.push_back(CCNewEval(E_MARSHAL(ss << (uint8_t)EVAL_TOKENS))); // this is eval token cc
|
||||
if (evalcode2 != 0)
|
||||
thresholds.push_back(CCNewEval(E_MARSHAL(ss << evalcode2))); // add optional additional evalcode
|
||||
thresholds.push_back(CCNewThreshold(1, pks)); // this is 1 of 2 sigs cc
|
||||
|
||||
return CCNewThreshold(thresholds.size(), thresholds);
|
||||
}
|
||||
// overload to make two-eval (token+evalcode) 1of2 cryptocondition:
|
||||
CC *MakeTokensCCcond1of2(uint8_t evalcode, CPubKey pk1, CPubKey pk2) {
|
||||
return MakeTokensCCcond1of2(evalcode, 0, pk1, pk2);
|
||||
}
|
||||
|
||||
// make three-eval (token+evalcode+evalcode2) cryptocondition:
|
||||
CC *MakeTokensCCcond1(uint8_t evalcode, uint8_t evalcode2, CPubKey pk)
|
||||
{
|
||||
std::vector<CC*> pks;
|
||||
pks.push_back(CCNewSecp256k1(pk));
|
||||
|
||||
std::vector<CC*> thresholds;
|
||||
thresholds.push_back(CCNewEval(E_MARSHAL(ss << evalcode)));
|
||||
if (evalcode != EVAL_TOKENS) // if evalCode == EVAL_TOKENS, it is actually MakeCCcond1()!
|
||||
thresholds.push_back(CCNewEval(E_MARSHAL(ss << (uint8_t)EVAL_TOKENS))); // this is eval token cc
|
||||
if (evalcode2 != 0)
|
||||
thresholds.push_back(CCNewEval(E_MARSHAL(ss << evalcode2))); // add optional additional evalcode
|
||||
thresholds.push_back(CCNewThreshold(1, pks)); // signature
|
||||
|
||||
return CCNewThreshold(thresholds.size(), thresholds);
|
||||
}
|
||||
// overload to make two-eval (token+evalcode) cryptocondition:
|
||||
CC *MakeTokensCCcond1(uint8_t evalcode, CPubKey pk) {
|
||||
return MakeTokensCCcond1(evalcode, 0, pk);
|
||||
}
|
||||
|
||||
// make three-eval (token+evalcode+evalcode2) 1of2 cc vout:
|
||||
CTxOut MakeTokensCC1of2vout(uint8_t evalcode, uint8_t evalcode2, CAmount nValue, CPubKey pk1, CPubKey pk2)
|
||||
{
|
||||
CTxOut vout;
|
||||
CC *payoutCond = MakeTokensCCcond1of2(evalcode, evalcode2, pk1, pk2);
|
||||
vout = CTxOut(nValue, CCPubKey(payoutCond));
|
||||
cc_free(payoutCond);
|
||||
return(vout);
|
||||
}
|
||||
// overload to make two-eval (token+evalcode) 1of2 cc vout:
|
||||
CTxOut MakeTokensCC1of2vout(uint8_t evalcode, CAmount nValue, CPubKey pk1, CPubKey pk2) {
|
||||
return MakeTokensCC1of2vout(evalcode, 0, nValue, pk1, pk2);
|
||||
}
|
||||
|
||||
// make three-eval (token+evalcode+evalcode2) cc vout:
|
||||
CTxOut MakeTokensCC1vout(uint8_t evalcode, uint8_t evalcode2, CAmount nValue, CPubKey pk)
|
||||
{
|
||||
CTxOut vout;
|
||||
CC *payoutCond = MakeTokensCCcond1(evalcode, evalcode2, pk);
|
||||
vout = CTxOut(nValue, CCPubKey(payoutCond));
|
||||
cc_free(payoutCond);
|
||||
return(vout);
|
||||
}
|
||||
// overload to make two-eval (token+evalcode) cc vout:
|
||||
CTxOut MakeTokensCC1vout(uint8_t evalcode, CAmount nValue, CPubKey pk) {
|
||||
return MakeTokensCC1vout(evalcode, 0, nValue, pk);
|
||||
}
|
||||
|
||||
@@ -66,46 +66,6 @@ void SetCCunspents(std::vector<std::pair<CAddressUnspentKey, CAddressUnspentValu
|
||||
return;
|
||||
}
|
||||
|
||||
void SetCCtxids(std::vector<std::pair<CAddressIndexKey, CAmount> > &addressIndex,char *coinaddr,bool ccflag)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
void SetCCtxids(std::vector<uint256> &txids,char *coinaddr,bool ccflag, uint8_t evalcode, uint256 filtertxid, uint8_t func)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
int64_t CCutxovalue(char *coinaddr,uint256 utxotxid,int32_t utxovout,int32_t CCflag)
|
||||
{
|
||||
return(0);
|
||||
}
|
||||
|
||||
int64_t CCgettxout(uint256 txid,int32_t vout,int32_t mempoolflag,int32_t lockflag)
|
||||
{
|
||||
return(-1);
|
||||
}
|
||||
|
||||
int32_t CCgetspenttxid(uint256 &spenttxid,int32_t &vini,int32_t &height,uint256 txid,int32_t vout)
|
||||
{
|
||||
return(0);
|
||||
}
|
||||
|
||||
int64_t CCaddress_balance(char *coinaddr,int32_t CCflag)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
int64_t CCfullsupply(uint256 tokenid)
|
||||
{
|
||||
return(0);
|
||||
}
|
||||
|
||||
int64_t CCtoken_balance(char *coinaddr,uint256 reftokenid)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
int32_t CC_vinselect(int32_t *aboveip,int64_t *abovep,int32_t *belowip,int64_t *belowp,struct CC_utxo utxos[],int32_t numunspents,int64_t value)
|
||||
{
|
||||
int32_t i,abovei,belowi; int64_t above,below,gap,atx_value;
|
||||
|
||||
@@ -105,14 +105,4 @@ CPubKey pubkey2pk(std::vector<uint8_t> vpubkey)
|
||||
|
||||
void CCLogPrintStr(const char *category, int level, const std::string &str)
|
||||
{
|
||||
if (level < 0)
|
||||
level = 0;
|
||||
if (level > CCLOG_MAXLEVEL)
|
||||
level = CCLOG_MAXLEVEL;
|
||||
for (int i = level; i <= CCLOG_MAXLEVEL; i++)
|
||||
if (LogAcceptCategory((std::string(category) + std::string("-") + std::to_string(i)).c_str()) || // '-debug=cctokens-0', '-debug=cctokens-1',...
|
||||
i == 0 && LogAcceptCategory(std::string(category).c_str())) { // also supporting '-debug=cctokens' for CCLOG_INFO
|
||||
LogPrintStr(str);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -41,25 +41,6 @@ void endiancpy(uint8_t *dest,uint8_t *src,int32_t len)
|
||||
#endif
|
||||
}
|
||||
|
||||
CC *MakeCCcond1of2(uint8_t evalcode,CPubKey pk1,CPubKey pk2)
|
||||
{
|
||||
std::vector<CC*> pks;
|
||||
pks.push_back(CCNewSecp256k1(pk1));
|
||||
pks.push_back(CCNewSecp256k1(pk2));
|
||||
CC *condCC = CCNewEval(E_MARSHAL(ss << evalcode));
|
||||
CC *Sig = CCNewThreshold(1, pks);
|
||||
return CCNewThreshold(2, {condCC, Sig});
|
||||
}
|
||||
|
||||
CC *MakeCCcond1(uint8_t evalcode,CPubKey pk)
|
||||
{
|
||||
std::vector<CC*> pks;
|
||||
pks.push_back(CCNewSecp256k1(pk));
|
||||
CC *condCC = CCNewEval(E_MARSHAL(ss << evalcode));
|
||||
CC *Sig = CCNewThreshold(1, pks);
|
||||
return CCNewThreshold(2, {condCC, Sig});
|
||||
}
|
||||
|
||||
int32_t has_opret(const CTransaction &tx, uint8_t evalcode)
|
||||
{
|
||||
int i = 0;
|
||||
@@ -73,83 +54,26 @@ int32_t has_opret(const CTransaction &tx, uint8_t evalcode)
|
||||
return 0;
|
||||
}
|
||||
|
||||
bool getCCopret(const CScript &scriptPubKey, CScript &opret)
|
||||
{
|
||||
std::vector<std::vector<unsigned char>> vParams = std::vector<std::vector<unsigned char>>();
|
||||
CScript dummy; bool ret = false;
|
||||
if ( scriptPubKey.IsPayToCryptoCondition(&dummy, vParams) != 0 )
|
||||
{
|
||||
ret = true;
|
||||
if ( vParams.size() == 1)
|
||||
{
|
||||
opret = CScript(vParams[0].begin()+6, vParams[0].end());
|
||||
//fprintf(stderr, "vparams.%s\n", HexStr(vParams[0].begin(), vParams[0].end()).c_str());
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
bool makeCCopret(CScript &opret, std::vector<std::vector<unsigned char>> &vData)
|
||||
{
|
||||
if ( opret.empty() )
|
||||
return false;
|
||||
vData.push_back(std::vector<unsigned char>(opret.begin(), opret.end()));
|
||||
return true;
|
||||
}
|
||||
|
||||
CTxOut MakeCC1vout(uint8_t evalcode,CAmount nValue, CPubKey pk, std::vector<std::vector<unsigned char>>* vData)
|
||||
{
|
||||
CTxOut vout;
|
||||
CC *payoutCond = MakeCCcond1(evalcode,pk);
|
||||
vout = CTxOut(nValue,CCPubKey(payoutCond));
|
||||
if ( vData )
|
||||
{
|
||||
//std::vector<std::vector<unsigned char>> vtmpData = std::vector<std::vector<unsigned char>>(vData->begin(), vData->end());
|
||||
std::vector<CPubKey> vPubKeys = std::vector<CPubKey>();
|
||||
//vPubKeys.push_back(pk);
|
||||
COptCCParams ccp = COptCCParams(COptCCParams::VERSION, evalcode, 1, 1, vPubKeys, ( * vData));
|
||||
vout.scriptPubKey << ccp.AsVector() << OP_DROP;
|
||||
}
|
||||
cc_free(payoutCond);
|
||||
return(vout);
|
||||
}
|
||||
|
||||
CTxOut MakeCC1of2vout(uint8_t evalcode,CAmount nValue,CPubKey pk1,CPubKey pk2, std::vector<std::vector<unsigned char>>* vData)
|
||||
{
|
||||
CTxOut vout;
|
||||
CC *payoutCond = MakeCCcond1of2(evalcode,pk1,pk2);
|
||||
vout = CTxOut(nValue,CCPubKey(payoutCond));
|
||||
if ( vData )
|
||||
{
|
||||
//std::vector<std::vector<unsigned char>> vtmpData = std::vector<std::vector<unsigned char>>(vData->begin(), vData->end());
|
||||
std::vector<CPubKey> vPubKeys = std::vector<CPubKey>();
|
||||
// skip pubkeys. These need to maybe be optional and we need some way to get them out that is easy!
|
||||
//vPubKeys.push_back(pk1);
|
||||
//vPubKeys.push_back(pk2);
|
||||
COptCCParams ccp = COptCCParams(COptCCParams::VERSION, evalcode, 1, 2, vPubKeys, ( * vData));
|
||||
vout.scriptPubKey << ccp.AsVector() << OP_DROP;
|
||||
}
|
||||
cc_free(payoutCond);
|
||||
return(vout);
|
||||
}
|
||||
|
||||
CC* GetCryptoCondition(CScript const& scriptSig)
|
||||
{
|
||||
auto pc = scriptSig.begin();
|
||||
opcodetype opcode;
|
||||
std::vector<unsigned char> ffbin;
|
||||
if (scriptSig.GetOp(pc, opcode, ffbin))
|
||||
return cc_readFulfillmentBinary((uint8_t*)ffbin.data(), ffbin.size()-1);
|
||||
else return(0);
|
||||
}
|
||||
|
||||
bool IsCCInput(CScript const& scriptSig)
|
||||
{
|
||||
CC *cond;
|
||||
if ( (cond= GetCryptoCondition(scriptSig)) == 0 )
|
||||
return false;
|
||||
cc_free(cond);
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
bool CheckTxFee(const CTransaction &tx, uint64_t txfee, uint32_t height, uint64_t blocktime, int64_t &actualtxfee)
|
||||
@@ -236,48 +160,6 @@ bool GetCustomscriptaddress(char *destaddr,const CScript &scriptPubKey,uint8_t t
|
||||
return(false);
|
||||
}
|
||||
|
||||
bool GetCCParams(Eval* eval, const CTransaction &tx, uint32_t nIn,
|
||||
CTransaction &txOut, std::vector<std::vector<unsigned char>> &preConditions, std::vector<std::vector<unsigned char>> ¶ms)
|
||||
{
|
||||
uint256 blockHash;
|
||||
|
||||
if (myGetTransaction(tx.vin[nIn].prevout.hash, txOut, blockHash) && txOut.vout.size() > tx.vin[nIn].prevout.n)
|
||||
{
|
||||
CBlockIndex index;
|
||||
if (eval->GetBlock(blockHash, index))
|
||||
{
|
||||
// read preconditions
|
||||
CScript subScript = CScript();
|
||||
preConditions.clear();
|
||||
if (txOut.vout[tx.vin[nIn].prevout.n].scriptPubKey.IsPayToCryptoCondition(&subScript, preConditions))
|
||||
{
|
||||
// read any available parameters in the output transaction
|
||||
params.clear();
|
||||
if (tx.vout.size() > 0 && tx.vout[tx.vout.size() - 1].scriptPubKey.IsOpReturn())
|
||||
{
|
||||
if (tx.vout[tx.vout.size() - 1].scriptPubKey.GetOpretData(params) && params.size() == 1)
|
||||
{
|
||||
CScript scr = CScript(params[0].begin(), params[0].end());
|
||||
|
||||
// printf("Script decoding inner:\n%s\nouter:\n%s\n", scr.ToString().c_str(), tx.vout[tx.vout.size() - 1].scriptPubKey.ToString().c_str());
|
||||
|
||||
if (!scr.GetPushedData(scr.begin(), params))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
else return true;
|
||||
}
|
||||
else return false;
|
||||
}
|
||||
else return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
//fprintf(stderr,"ExtractDestination failed\n");
|
||||
return(false);
|
||||
}
|
||||
|
||||
bool pubkey2addr(char *destaddr,uint8_t *pubkey33)
|
||||
{
|
||||
std::vector<uint8_t>pk; int32_t i;
|
||||
@@ -286,92 +168,6 @@ bool pubkey2addr(char *destaddr,uint8_t *pubkey33)
|
||||
return(Getscriptaddress(destaddr,CScript() << pk << OP_CHECKSIG));
|
||||
}
|
||||
|
||||
CPubKey CCtxidaddr(char *txidaddr,uint256 txid)
|
||||
{
|
||||
uint8_t buf33[33]; CPubKey pk;
|
||||
buf33[0] = 0x02;
|
||||
endiancpy(&buf33[1],(uint8_t *)&txid,32);
|
||||
pk = buf2pk(buf33);
|
||||
Getscriptaddress(txidaddr,CScript() << ParseHex(HexStr(pk)) << OP_CHECKSIG);
|
||||
return(pk);
|
||||
}
|
||||
|
||||
CPubKey CCCustomtxidaddr(char *txidaddr,uint256 txid,uint8_t taddr,uint8_t prefix,uint8_t prefix2)
|
||||
{
|
||||
uint8_t buf33[33]; CPubKey pk;
|
||||
buf33[0] = 0x02;
|
||||
endiancpy(&buf33[1],(uint8_t *)&txid,32);
|
||||
pk = buf2pk(buf33);
|
||||
GetCustomscriptaddress(txidaddr,CScript() << ParseHex(HexStr(pk)) << OP_CHECKSIG,taddr,prefix,prefix2);
|
||||
return(pk);
|
||||
}
|
||||
|
||||
bool _GetCCaddress(char *destaddr,uint8_t evalcode,CPubKey pk)
|
||||
{
|
||||
CC *payoutCond;
|
||||
destaddr[0] = 0;
|
||||
if ( (payoutCond= MakeCCcond1(evalcode,pk)) != 0 )
|
||||
{
|
||||
Getscriptaddress(destaddr,CCPubKey(payoutCond));
|
||||
cc_free(payoutCond);
|
||||
}
|
||||
return(destaddr[0] != 0);
|
||||
}
|
||||
|
||||
bool GetCCaddress(struct CCcontract_info *cp,char *destaddr,CPubKey pk)
|
||||
{
|
||||
destaddr[0] = 0;
|
||||
if ( pk.size() == 0 )
|
||||
pk = GetUnspendable(cp,0);
|
||||
return(_GetCCaddress(destaddr,cp->evalcode,pk));
|
||||
}
|
||||
|
||||
bool _GetTokensCCaddress(char *destaddr, uint8_t evalcode, uint8_t evalcode2, CPubKey pk)
|
||||
{
|
||||
CC *payoutCond;
|
||||
destaddr[0] = 0;
|
||||
if ((payoutCond = MakeTokensCCcond1(evalcode, evalcode2, pk)) != 0)
|
||||
{
|
||||
Getscriptaddress(destaddr, CCPubKey(payoutCond));
|
||||
cc_free(payoutCond);
|
||||
}
|
||||
return(destaddr[0] != 0);
|
||||
}
|
||||
|
||||
// get scriptPubKey adddress for three/dual eval token cc vout
|
||||
bool GetTokensCCaddress(struct CCcontract_info *cp, char *destaddr, CPubKey pk)
|
||||
{
|
||||
destaddr[0] = 0;
|
||||
if (pk.size() == 0)
|
||||
pk = GetUnspendable(cp, 0);
|
||||
return(_GetTokensCCaddress(destaddr, cp->evalcode, cp->additionalTokensEvalcode2, pk));
|
||||
}
|
||||
|
||||
|
||||
bool GetCCaddress1of2(struct CCcontract_info *cp,char *destaddr,CPubKey pk,CPubKey pk2)
|
||||
{
|
||||
CC *payoutCond;
|
||||
destaddr[0] = 0;
|
||||
if ( (payoutCond= MakeCCcond1of2(cp->evalcode,pk,pk2)) != 0 )
|
||||
{
|
||||
Getscriptaddress(destaddr,CCPubKey(payoutCond));
|
||||
cc_free(payoutCond);
|
||||
}
|
||||
return(destaddr[0] != 0);
|
||||
}
|
||||
|
||||
bool GetTokensCCaddress1of2(struct CCcontract_info *cp, char *destaddr, CPubKey pk, CPubKey pk2)
|
||||
{
|
||||
CC *payoutCond;
|
||||
destaddr[0] = 0;
|
||||
if ((payoutCond = MakeTokensCCcond1of2(cp->evalcode, cp->additionalTokensEvalcode2, pk, pk2)) != 0) // if additionalTokensEvalcode2 not set then it is dual-eval cc else three-eval cc
|
||||
{
|
||||
Getscriptaddress(destaddr, CCPubKey(payoutCond));
|
||||
cc_free(payoutCond);
|
||||
}
|
||||
return(destaddr[0] != 0);
|
||||
}
|
||||
|
||||
bool ConstrainVout(CTxOut vout, int32_t CCflag, char *cmpaddr, int64_t nValue)
|
||||
{
|
||||
char destaddr[64];
|
||||
@@ -393,31 +189,6 @@ bool ConstrainVout(CTxOut vout, int32_t CCflag, char *cmpaddr, int64_t nValue)
|
||||
else return(true);
|
||||
}
|
||||
|
||||
bool PreventCC(Eval* eval,const CTransaction &tx,int32_t preventCCvins,int32_t numvins,int32_t preventCCvouts,int32_t numvouts)
|
||||
{
|
||||
int32_t i;
|
||||
if ( preventCCvins >= 0 )
|
||||
{
|
||||
for (i=preventCCvins; i<numvins; i++)
|
||||
{
|
||||
if ( IsCCInput(tx.vin[i].scriptSig) != 0 )
|
||||
return eval->Invalid("invalid CC vin");
|
||||
}
|
||||
}
|
||||
if ( preventCCvouts >= 0 )
|
||||
{
|
||||
for (i=preventCCvouts; i<numvouts; i++)
|
||||
{
|
||||
if ( tx.vout[i].scriptPubKey.IsPayToCryptoCondition() != 0 )
|
||||
{
|
||||
fprintf(stderr,"vout.%d is CC\n",i);
|
||||
return eval->Invalid("invalid CC vout");
|
||||
}
|
||||
}
|
||||
}
|
||||
return(true);
|
||||
}
|
||||
|
||||
bool priv2addr(char *coinaddr,uint8_t *buf33,uint8_t priv32[32])
|
||||
{
|
||||
CKey priv; CPubKey pk; int32_t i; uint8_t *src;
|
||||
@@ -509,43 +280,6 @@ CPubKey GetUnspendable(struct CCcontract_info *cp,uint8_t *unspendablepriv)
|
||||
return(pubkey2pk(ParseHex(cp->CChexstr)));
|
||||
}
|
||||
|
||||
void CCclearvars(struct CCcontract_info *cp)
|
||||
{
|
||||
cp->unspendableEvalcode2 = cp->unspendableEvalcode3 = 0;
|
||||
cp->unspendableaddr2[0] = cp->unspendableaddr3[0] = 0;
|
||||
}
|
||||
|
||||
int64_t CCduration(int32_t &numblocks,uint256 txid)
|
||||
{
|
||||
CTransaction tx; uint256 hashBlock; uint32_t txheight,txtime=0; char str[65]; CBlockIndex *pindex; int64_t duration = 0;
|
||||
numblocks = 0;
|
||||
if ( myGetTransaction(txid,tx,hashBlock) == 0 )
|
||||
{
|
||||
//fprintf(stderr,"CCduration cant find duration txid %s\n",uint256_str(str,txid));
|
||||
return(0);
|
||||
}
|
||||
else if ( hashBlock == zeroid )
|
||||
{
|
||||
//fprintf(stderr,"CCduration no hashBlock for txid %s\n",uint256_str(str,txid));
|
||||
return(0);
|
||||
}
|
||||
else if ( (pindex= hush_getblockindex(hashBlock)) == 0 || (txtime= pindex->nTime) == 0 || (txheight= pindex->GetHeight()) <= 0 )
|
||||
{
|
||||
fprintf(stderr,"CCduration no txtime %u or txheight.%d %p for txid %s\n",txtime,txheight,pindex,uint256_str(str,txid));
|
||||
return(0);
|
||||
}
|
||||
else if ( (pindex= chainActive.LastTip()) == 0 || pindex->nTime < txtime || pindex->GetHeight() <= txheight )
|
||||
{
|
||||
if ( pindex->nTime < txtime )
|
||||
fprintf(stderr,"CCduration backwards timestamps %u %u for txid %s hts.(%d %d)\n",(uint32_t)pindex->nTime,txtime,uint256_str(str,txid),txheight,(int32_t)pindex->GetHeight());
|
||||
return(0);
|
||||
}
|
||||
numblocks = (pindex->GetHeight() - txheight);
|
||||
duration = (pindex->nTime - txtime);
|
||||
//fprintf(stderr,"duration %d (%u - %u) numblocks %d (%d - %d)\n",(int32_t)duration,(uint32_t)pindex->nTime,txtime,numblocks,pindex->GetHeight(),txheight);
|
||||
return(duration);
|
||||
}
|
||||
|
||||
int32_t NSPV_coinaddr_inmempool(char const *logcategory,char *coinaddr,uint8_t CCflag);
|
||||
|
||||
int32_t myIs_coinaddr_inmempoolvout(char const *logcategory,char *coinaddr)
|
||||
@@ -599,19 +333,6 @@ int32_t myGet_mempool_txs(std::vector<CTransaction> &txs,uint8_t evalcode,uint8_
|
||||
return(i);
|
||||
}
|
||||
|
||||
int32_t CCCointxidExists(char const *logcategory,uint256 cointxid)
|
||||
{
|
||||
char txidaddr[64]; std::string coin; int32_t numvouts; uint256 hashBlock;
|
||||
std::vector<std::pair<CAddressIndexKey, CAmount> > addressIndex;
|
||||
CCtxidaddr(txidaddr,cointxid);
|
||||
SetCCtxids(addressIndex,txidaddr,true);
|
||||
for (std::vector<std::pair<CAddressIndexKey, CAmount> >::const_iterator it=addressIndex.begin(); it!=addressIndex.end(); it++)
|
||||
{
|
||||
return(-1);
|
||||
}
|
||||
return(myIs_coinaddr_inmempoolvout(logcategory,txidaddr));
|
||||
}
|
||||
|
||||
/* Get the block merkle root for a proof
|
||||
* IN: proofData
|
||||
* OUT: merkle root
|
||||
@@ -699,37 +420,6 @@ bool hush_txnotarizedconfirmed(uint256 txid)
|
||||
return (false);
|
||||
}
|
||||
|
||||
CPubKey check_signing_pubkey(CScript scriptSig)
|
||||
{
|
||||
bool found = false;
|
||||
CPubKey pubkey;
|
||||
|
||||
auto findEval = [](CC *cond, struct CCVisitor _) {
|
||||
bool r = false;
|
||||
|
||||
if (cc_typeId(cond) == CC_Secp256k1) {
|
||||
*(CPubKey*)_.context=buf2pk(cond->publicKey);
|
||||
r = true;
|
||||
}
|
||||
// false for a match, true for continue
|
||||
return r ? 0 : 1;
|
||||
};
|
||||
|
||||
CC *cond = GetCryptoCondition(scriptSig);
|
||||
|
||||
if (cond) {
|
||||
CCVisitor visitor = { findEval, (uint8_t*)"", 0, &pubkey };
|
||||
bool out = !cc_visit(cond, visitor);
|
||||
cc_free(cond);
|
||||
|
||||
if (pubkey.IsValid()) {
|
||||
return pubkey;
|
||||
}
|
||||
}
|
||||
return CPubKey();
|
||||
}
|
||||
|
||||
|
||||
// returns total of normal inputs signed with this pubkey
|
||||
int64_t TotalPubkeyNormalInputs(const CTransaction &tx, const CPubKey &pubkey)
|
||||
{
|
||||
@@ -763,98 +453,9 @@ int64_t TotalPubkeyNormalInputs(const CTransaction &tx, const CPubKey &pubkey)
|
||||
int64_t TotalPubkeyCCInputs(const CTransaction &tx, const CPubKey &pubkey)
|
||||
{
|
||||
int64_t total = 0;
|
||||
for (auto vin : tx.vin) {
|
||||
if (IsCCInput(vin.scriptSig)) {
|
||||
CPubKey vinPubkey = check_signing_pubkey(vin.scriptSig);
|
||||
if (vinPubkey.IsValid()) {
|
||||
if (vinPubkey == pubkey) {
|
||||
CTransaction vintx;
|
||||
uint256 hashBlock;
|
||||
if (myGetTransaction(vin.prevout.hash, vintx, hashBlock)) {
|
||||
total += vintx.vout[vin.prevout.n].nValue;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return total;
|
||||
}
|
||||
|
||||
bool ProcessCC(struct CCcontract_info *cp,Eval* eval, std::vector<uint8_t> paramsNull,const CTransaction &ctx, unsigned int nIn)
|
||||
{
|
||||
CTransaction createTx; uint256 assetid,assetid2,hashBlock; uint8_t funcid; int32_t height,i,n,from_mempool = 0; int64_t amount; std::vector<uint8_t> origpubkey;
|
||||
height = HUSH_CONNECTING;
|
||||
if ( HUSH_CONNECTING < 0 ) // always comes back with > 0 for final confirmation
|
||||
return(true);
|
||||
if ( ASSETCHAINS_CC == 0 || (height & ~(1<<30)) < HUSH_CCACTIVATE )
|
||||
return eval->Invalid("CC are disabled or not active yet");
|
||||
if ( (HUSH_CONNECTING & (1<<30)) != 0 )
|
||||
{
|
||||
from_mempool = 1;
|
||||
height &= ((1<<30) - 1);
|
||||
}
|
||||
if (cp->validate == NULL)
|
||||
return eval->Invalid("validation not supported for eval code");
|
||||
|
||||
//fprintf(stderr,"HUSH_CONNECTING.%d mempool.%d vs CCactive.%d\n",height,from_mempool,HUSH_CCACTIVATE);
|
||||
// there is a chance CC tx is valid in mempool, but invalid when in block, so we cant filter duplicate requests. if any of the vins are spent, for example
|
||||
//txid = ctx.GetHash();
|
||||
//if ( txid == cp->prevtxid )
|
||||
// return(true);
|
||||
//fprintf(stderr,"process CC %02x\n",cp->evalcode);
|
||||
CCclearvars(cp);
|
||||
if ( paramsNull.size() != 0 ) // Don't expect params
|
||||
return eval->Invalid("Cannot have params");
|
||||
//else if ( ctx.vout.size() == 0 ) // spend can go to z-addresses
|
||||
// return eval->Invalid("no-vouts");
|
||||
else if ( (*cp->validate)(cp,eval,ctx,nIn) != 0 )
|
||||
{
|
||||
//fprintf(stderr,"done CC %02x\n",cp->evalcode);
|
||||
//cp->prevtxid = txid;
|
||||
return(true);
|
||||
}
|
||||
//fprintf(stderr,"invalid CC %02x\n",cp->evalcode);
|
||||
return(false);
|
||||
}
|
||||
|
||||
extern struct CCcontract_info CCinfos[0x100];
|
||||
extern std::string MYCCLIBNAME;
|
||||
bool CClib_validate(struct CCcontract_info *cp,int32_t height,Eval *eval,const CTransaction tx,unsigned int nIn);
|
||||
|
||||
bool CClib_Dispatch(const CC *cond,Eval *eval,std::vector<uint8_t> paramsNull,const CTransaction &txTo,unsigned int nIn)
|
||||
{
|
||||
uint8_t evalcode; int32_t height,from_mempool; struct CCcontract_info *cp;
|
||||
if ( ASSETCHAINS_CCLIB != MYCCLIBNAME )
|
||||
{
|
||||
fprintf(stderr,"-ac_cclib=%s vs myname %s\n",ASSETCHAINS_CCLIB.c_str(),MYCCLIBNAME.c_str());
|
||||
return eval->Invalid("-ac_cclib name mismatches myname");
|
||||
}
|
||||
height = HUSH_CONNECTING;
|
||||
if ( HUSH_CONNECTING < 0 ) // always comes back with > 0 for final confirmation
|
||||
return(true);
|
||||
if ( ASSETCHAINS_CC == 0 || (height & ~(1<<30)) < HUSH_CCACTIVATE )
|
||||
return eval->Invalid("CC are disabled or not active yet");
|
||||
if ( (HUSH_CONNECTING & (1<<30)) != 0 )
|
||||
{
|
||||
from_mempool = 1;
|
||||
height &= ((1<<30) - 1);
|
||||
}
|
||||
evalcode = cond->code[0];
|
||||
if ( evalcode >= EVAL_FIRSTUSER && evalcode <= EVAL_LASTUSER )
|
||||
{
|
||||
cp = &CCinfos[(int32_t)evalcode];
|
||||
if ( cp->didinit == 0 )
|
||||
{
|
||||
if ( CClib_initcp(cp,evalcode) == 0 )
|
||||
cp->didinit = 1;
|
||||
else return eval->Invalid("unsupported CClib evalcode");
|
||||
}
|
||||
CCclearvars(cp);
|
||||
if ( paramsNull.size() != 0 ) // Don't expect params
|
||||
return eval->Invalid("Cannot have params");
|
||||
else if ( CClib_validate(cp,height,eval,txTo,nIn) != 0 )
|
||||
return(true);
|
||||
return(false); //eval->Invalid("error in CClib_validate");
|
||||
}
|
||||
return eval->Invalid("cclib CC must have evalcode between 16 and 127");
|
||||
}
|
||||
|
||||
@@ -1,78 +0,0 @@
|
||||
// Copyright (c) 2016-2023 The Hush developers
|
||||
// Distributed under the GPLv3 software license, see the accompanying
|
||||
// file COPYING or https://www.gnu.org/licenses/gpl-3.0.en.html
|
||||
/******************************************************************************
|
||||
* Copyright © 2014-2019 The SuperNET Developers. *
|
||||
* *
|
||||
* See the AUTHORS, DEVELOPER-AGREEMENT and LICENSE files at *
|
||||
* the top-level directory of this distribution for the individual copyright *
|
||||
* holder information and the developer policies on copyright and licensing. *
|
||||
* *
|
||||
* Unless otherwise agreed in a custom licensing agreement, no part of the *
|
||||
* SuperNET software, including this file may be copied, modified, propagated *
|
||||
* or distributed except according to the terms contained in the LICENSE file *
|
||||
* *
|
||||
* Removal or modification of this copyright notice is prohibited. *
|
||||
* *
|
||||
******************************************************************************/
|
||||
|
||||
#ifndef BETPROTOCOL_H
|
||||
#define BETPROTOCOL_H
|
||||
|
||||
#include "cc/eval.h"
|
||||
#include "pubkey.h"
|
||||
#include "primitives/transaction.h"
|
||||
#include "cryptoconditions/include/cryptoconditions.h"
|
||||
|
||||
|
||||
class MoMProof
|
||||
{
|
||||
public:
|
||||
MerkleBranch branch;
|
||||
uint256 notarizationHash;
|
||||
ADD_SERIALIZE_METHODS;
|
||||
template <typename Stream, typename Operation>
|
||||
inline void SerializationOp(Stream& s, Operation ser_action) {
|
||||
READWRITE(branch);
|
||||
READWRITE(notarizationHash);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
|
||||
class BetProtocol
|
||||
{
|
||||
protected:
|
||||
std::vector<CC*> playerConditions();
|
||||
public:
|
||||
EvalCode disputeCode;
|
||||
std::vector<CPubKey> players;
|
||||
std::vector<unsigned char> vmParams;
|
||||
uint32_t waitBlocks;
|
||||
|
||||
// Utility
|
||||
BetProtocol(EvalCode dc, std::vector<CPubKey> ps, uint32_t wb, std::vector<uint8_t> vmp)
|
||||
: disputeCode(dc), waitBlocks(wb), vmParams(vmp), players(ps) {}
|
||||
std::vector<CC*> PlayerConditions();
|
||||
|
||||
// on PANGEA
|
||||
CC* MakeDisputeCond();
|
||||
CMutableTransaction MakeSessionTx(CAmount spendFee);
|
||||
CMutableTransaction MakeDisputeTx(uint256 signedSessionTxHash, uint256 vmResultHash);
|
||||
CMutableTransaction MakePostEvidenceTx(uint256 signedSessionTxHash,
|
||||
int playerIndex, std::vector<unsigned char> state);
|
||||
|
||||
// on HUSH
|
||||
CC* MakePayoutCond(uint256 signedSessionTxHash);
|
||||
CMutableTransaction MakeStakeTx(CAmount totalPayout, uint256 signedSessionTx);
|
||||
CMutableTransaction MakeAgreePayoutTx(std::vector<CTxOut> payouts, uint256 signedStakeTxHash);
|
||||
CMutableTransaction MakeImportPayoutTx(std::vector<CTxOut> payouts,
|
||||
CTransaction signedDisputeTx, uint256 signedStakeTxHash, MoMProof momProof);
|
||||
};
|
||||
|
||||
|
||||
|
||||
bool GetOpReturnHash(CScript script, uint256 &hash);
|
||||
|
||||
|
||||
#endif /* BETPROTOCOL_H */
|
||||
@@ -16,7 +16,6 @@
|
||||
* *
|
||||
******************************************************************************/
|
||||
#include <assert.h>
|
||||
#include <cryptoconditions.h>
|
||||
#include "primitives/block.h"
|
||||
#include "primitives/transaction.h"
|
||||
#include "script/cc.h"
|
||||
|
||||
@@ -84,25 +84,5 @@ UniValue custom_func1(uint64_t txfee,struct CCcontract_info *cp,cJSON *params)
|
||||
|
||||
bool custom_validate(struct CCcontract_info *cp,int32_t height,Eval *eval,const CTransaction tx)
|
||||
{
|
||||
char expectedaddress[64]; CPubKey pk;
|
||||
CScript opret; int32_t numvout = 0;
|
||||
if ( has_opret(tx, EVAL_CUSTOM) == 0 )
|
||||
{
|
||||
std::vector<std::vector<unsigned char>> vParams = std::vector<std::vector<unsigned char>>();
|
||||
if ( getCCopret(tx.vout[0].scriptPubKey,opret) )
|
||||
numvout = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
opret = tx.vout[1].scriptPubKey;
|
||||
numvout = 2;
|
||||
}
|
||||
if ( tx.vout.size() != numvout ) // make sure the tx only has appropriate outputs
|
||||
return eval->Invalid("invalid number of vouts");
|
||||
else if ( custom_opretdecode(pk,opret) != '1' ) // verify opreturn payload
|
||||
return eval->Invalid("invalid opreturn");
|
||||
GetCCaddress(cp,expectedaddress,pk);
|
||||
if ( IsCClibvout(cp,tx,0,expectedaddress) == COIN ) // make sure amount and destination matches
|
||||
return(true);
|
||||
else return eval->Invalid("invalid vout0 amount");
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -1,346 +0,0 @@
|
||||
// Copyright (c) 2016-2023 The Hush developers
|
||||
// Distributed under the GPLv3 software license, see the accompanying
|
||||
// file COPYING or https://www.gnu.org/licenses/gpl-3.0.en.html
|
||||
#include <stdint.h>
|
||||
|
||||
#ifndef HUSH_DILITHIUM_H
|
||||
#define HUSH_DILITHIUM_H
|
||||
|
||||
#define SHAKE128_RATE 168
|
||||
#define SHAKE256_RATE 136
|
||||
|
||||
void shake128_absorb(uint64_t *s, const uint8_t *input, int32_t inlen);
|
||||
void shake128_squeezeblocks(uint8_t *output, int32_t nblocks, uint64_t *s);
|
||||
void shake256_absorb(uint64_t *s, const uint8_t *input, int32_t inlen);
|
||||
void shake256_squeezeblocks(uint8_t *output, int32_t nblocks, uint64_t *s);
|
||||
void shake128(uint8_t *output, int32_t outlen, const uint8_t *input, int32_t inlen);
|
||||
void shake256(uint8_t *output, int32_t outlen, const uint8_t *input, int32_t inlen);
|
||||
|
||||
#endif
|
||||
|
||||
#ifndef PARAMS_H
|
||||
#define PARAMS_H
|
||||
|
||||
#ifndef MODE
|
||||
#define MODE 3
|
||||
#endif
|
||||
|
||||
#define SEEDBYTES 32U
|
||||
#define CRHBYTES 48U
|
||||
#define N 256U
|
||||
#define Q 8380417U
|
||||
#define QBITS 23U
|
||||
#define ROOT_OF_UNITY 1753U
|
||||
#define D 14U
|
||||
#define GAMMA1 ((Q - 1U)/16U)
|
||||
#define GAMMA2 (GAMMA1/2U)
|
||||
#define ALPHA (2U*GAMMA2)
|
||||
|
||||
#if MODE == 0
|
||||
#define K 3U
|
||||
#define L 2U
|
||||
#define ETA 7U
|
||||
#define SETABITS 4U
|
||||
#define BETA 375U
|
||||
#define OMEGA 64U
|
||||
|
||||
#elif MODE == 1
|
||||
#define K 4U
|
||||
#define L 3U
|
||||
#define ETA 6U
|
||||
#define SETABITS 4U
|
||||
#define BETA 325U
|
||||
#define OMEGA 80U
|
||||
|
||||
#elif MODE == 2
|
||||
#define K 5U
|
||||
#define L 4U
|
||||
#define ETA 5U
|
||||
#define SETABITS 4U
|
||||
#define BETA 275U
|
||||
#define OMEGA 96U
|
||||
|
||||
#elif MODE == 3
|
||||
#define K 6U
|
||||
#define L 5U
|
||||
#define ETA 3U
|
||||
#define SETABITS 3U
|
||||
#define BETA 175U
|
||||
#define OMEGA 120U
|
||||
|
||||
#endif
|
||||
|
||||
#define POL_SIZE_PACKED ((N*QBITS)/8)
|
||||
#define POLT1_SIZE_PACKED ((N*(QBITS - D))/8)
|
||||
#define POLT0_SIZE_PACKED ((N*D)/8)
|
||||
#define POLETA_SIZE_PACKED ((N*SETABITS)/8)
|
||||
#define POLZ_SIZE_PACKED ((N*(QBITS - 3))/8)
|
||||
#define POLW1_SIZE_PACKED ((N*4)/8)
|
||||
#define POLVECK_SIZE_PACKED (K*POL_SIZE_PACKED)
|
||||
#define POLVECL_SIZE_PACKED (L*POL_SIZE_PACKED)
|
||||
|
||||
#define CRYPTO_PUBLICKEYBYTES (SEEDBYTES + K*POLT1_SIZE_PACKED)
|
||||
#define CRYPTO_SECRETKEYBYTES (2*SEEDBYTES + (L + K)*POLETA_SIZE_PACKED + CRHBYTES + K*POLT0_SIZE_PACKED)
|
||||
#define CRYPTO_BYTES (L*POLZ_SIZE_PACKED + (OMEGA + K) + (N/8 + 8))
|
||||
|
||||
#endif
|
||||
#ifndef POLY_H
|
||||
#define POLY_H
|
||||
|
||||
//#include <stdint.h>
|
||||
//#include "params.h"
|
||||
//#include "fips202.h"
|
||||
|
||||
typedef struct {
|
||||
uint32_t coeffs[N];
|
||||
} poly __attribute__((aligned(32)));
|
||||
|
||||
void poly_reduce(poly *a);
|
||||
void poly_csubq(poly *a);
|
||||
void poly_freeze(poly *a);
|
||||
|
||||
void poly_add(poly *c, const poly *a, const poly *b);
|
||||
void poly_sub(poly *c, const poly *a, const poly *b);
|
||||
void poly_neg(poly *a);
|
||||
void poly_shiftl(poly *a, uint32_t k);
|
||||
|
||||
void poly_ntt(poly *a);
|
||||
void poly_invntt_montgomery(poly *a);
|
||||
void poly_pointwise_invmontgomery(poly *c, const poly *a, const poly *b);
|
||||
|
||||
void poly_power2round(poly *a1, poly *a0, const poly *a);
|
||||
void poly_decompose(poly *a1, poly *a0, const poly *a);
|
||||
uint32_t poly_make_hint(poly *h, const poly *a, const poly *b);
|
||||
void poly_use_hint(poly *a, const poly *b, const poly *h);
|
||||
|
||||
int poly_chknorm(const poly *a, uint32_t B);
|
||||
void poly_uniform(poly *a, const uint8_t *buf);
|
||||
void poly_uniform_eta(poly *a,
|
||||
const uint8_t seed[SEEDBYTES],
|
||||
uint8_t nonce);
|
||||
void poly_uniform_gamma1m1(poly *a,
|
||||
const uint8_t seed[SEEDBYTES + CRHBYTES],
|
||||
uint16_t nonce);
|
||||
|
||||
void polyeta_pack(uint8_t *r, const poly *a);
|
||||
void polyeta_unpack(poly *r, const uint8_t *a);
|
||||
|
||||
void polyt1_pack(uint8_t *r, const poly *a);
|
||||
void polyt1_unpack(poly *r, const uint8_t *a);
|
||||
|
||||
void polyt0_pack(uint8_t *r, const poly *a);
|
||||
void polyt0_unpack(poly *r, const uint8_t *a);
|
||||
|
||||
void polyz_pack(uint8_t *r, const poly *a);
|
||||
void polyz_unpack(poly *r, const uint8_t *a);
|
||||
|
||||
void polyw1_pack(uint8_t *r, const poly *a);
|
||||
#endif
|
||||
#ifndef POLYVEC_H
|
||||
#define POLYVEC_H
|
||||
|
||||
//#include <stdint.h>
|
||||
//#include "params.h"
|
||||
//#include "poly.h"
|
||||
|
||||
/* Vectors of polynomials of length L */
|
||||
typedef struct {
|
||||
poly vec[L];
|
||||
} polyvecl;
|
||||
|
||||
void polyvecl_freeze(polyvecl *v);
|
||||
|
||||
void polyvecl_add(polyvecl *w, const polyvecl *u, const polyvecl *v);
|
||||
|
||||
void polyvecl_ntt(polyvecl *v);
|
||||
void polyvecl_pointwise_acc_invmontgomery(poly *w,
|
||||
const polyvecl *u,
|
||||
const polyvecl *v);
|
||||
|
||||
int polyvecl_chknorm(const polyvecl *v, uint32_t B);
|
||||
|
||||
|
||||
|
||||
/* Vectors of polynomials of length K */
|
||||
typedef struct {
|
||||
poly vec[K];
|
||||
} polyveck;
|
||||
|
||||
void polyveck_reduce(polyveck *v);
|
||||
void polyveck_csubq(polyveck *v);
|
||||
void polyveck_freeze(polyveck *v);
|
||||
|
||||
void polyveck_add(polyveck *w, const polyveck *u, const polyveck *v);
|
||||
void polyveck_sub(polyveck *w, const polyveck *u, const polyveck *v);
|
||||
void polyveck_shiftl(polyveck *v, uint32_t k);
|
||||
|
||||
void polyveck_ntt(polyveck *v);
|
||||
void polyveck_invntt_montgomery(polyveck *v);
|
||||
|
||||
int polyveck_chknorm(const polyveck *v, uint32_t B);
|
||||
|
||||
void polyveck_power2round(polyveck *v1, polyveck *v0, const polyveck *v);
|
||||
void polyveck_decompose(polyveck *v1, polyveck *v0, const polyveck *v);
|
||||
uint32_t polyveck_make_hint(polyveck *h,
|
||||
const polyveck *u,
|
||||
const polyveck *v);
|
||||
void polyveck_use_hint(polyveck *w, const polyveck *v, const polyveck *h);
|
||||
|
||||
#endif
|
||||
|
||||
#ifndef NTT_H
|
||||
#define NTT_H
|
||||
|
||||
//#include <stdint.h>
|
||||
//#include "params.h"
|
||||
|
||||
void ntt(uint32_t p[N]);
|
||||
void invntt_frominvmont(uint32_t p[N]);
|
||||
|
||||
#endif
|
||||
#ifndef PACKING_H
|
||||
#define PACKING_H
|
||||
|
||||
//#include "params.h"
|
||||
//#include "polyvec.h"
|
||||
|
||||
void pack_pk(uint8_t pk[CRYPTO_PUBLICKEYBYTES],
|
||||
const uint8_t rho[SEEDBYTES], const polyveck *t1);
|
||||
void pack_sk(uint8_t sk[CRYPTO_SECRETKEYBYTES],
|
||||
const uint8_t rho[SEEDBYTES],
|
||||
const uint8_t key[SEEDBYTES],
|
||||
const uint8_t tr[CRHBYTES],
|
||||
const polyvecl *s1,
|
||||
const polyveck *s2,
|
||||
const polyveck *t0);
|
||||
void pack_sig(uint8_t sig[CRYPTO_BYTES],
|
||||
const polyvecl *z, const polyveck *h, const poly *c);
|
||||
|
||||
void unpack_pk(uint8_t rho[SEEDBYTES], polyveck *t1,
|
||||
const uint8_t pk[CRYPTO_PUBLICKEYBYTES]);
|
||||
void unpack_sk(uint8_t rho[SEEDBYTES],
|
||||
uint8_t key[SEEDBYTES],
|
||||
uint8_t tr[CRHBYTES],
|
||||
polyvecl *s1,
|
||||
polyveck *s2,
|
||||
polyveck *t0,
|
||||
const uint8_t sk[CRYPTO_SECRETKEYBYTES]);
|
||||
int unpack_sig(polyvecl *z, polyveck *h, poly *c,
|
||||
const uint8_t sig[CRYPTO_BYTES]);
|
||||
|
||||
#endif
|
||||
#ifndef REDUCE_H
|
||||
#define REDUCE_H
|
||||
|
||||
//#include <stdint.h>
|
||||
|
||||
#define MONT 4193792U // 2^32 % Q
|
||||
#define QINV 4236238847U // -q^(-1) mod 2^32
|
||||
|
||||
/* a <= Q*2^32 => r < 2*Q */
|
||||
uint32_t montgomery_reduce(uint64_t a);
|
||||
|
||||
/* r < 2*Q */
|
||||
uint32_t reduce32(uint32_t a);
|
||||
|
||||
/* a < 2*Q => r < Q */
|
||||
uint32_t csubq(uint32_t a);
|
||||
|
||||
/* r < Q */
|
||||
uint32_t freeze(uint32_t a);
|
||||
|
||||
#endif
|
||||
#ifndef ROUNDING_H
|
||||
#define ROUNDING_H
|
||||
|
||||
//#include <stdint.h>
|
||||
|
||||
uint32_t power2round(const uint32_t a, uint32_t *a0);
|
||||
uint32_t decompose(uint32_t a, uint32_t *a0);
|
||||
uint32_t make_hint(const uint32_t a, const uint32_t b);
|
||||
uint32_t use_hint(const uint32_t a, const uint32_t hint);
|
||||
|
||||
#endif
|
||||
#ifndef SIGN_H
|
||||
#define SIGN_H
|
||||
|
||||
//#include "params.h"
|
||||
//#include "poly.h"
|
||||
//#include "polyvec.h"
|
||||
|
||||
void expand_mat(polyvecl mat[K], const uint8_t rho[SEEDBYTES]);
|
||||
void challenge(poly *c, const uint8_t mu[CRHBYTES],
|
||||
const polyveck *w1);
|
||||
|
||||
int crypto_sign_keypair(uint8_t *pk, uint8_t *sk);
|
||||
|
||||
int crypto_sign(uint8_t *sm, int32_t *smlen,
|
||||
const uint8_t *msg, int32_t len,
|
||||
const uint8_t *sk);
|
||||
|
||||
int crypto_sign_open(uint8_t *m, int32_t *mlen,
|
||||
const uint8_t *sm, int32_t smlen,
|
||||
const uint8_t *pk);
|
||||
|
||||
#endif
|
||||
|
||||
#ifndef API_H
|
||||
#define API_H
|
||||
|
||||
#ifndef MODE
|
||||
#define MODE 3
|
||||
#endif
|
||||
|
||||
#if MODE == 0
|
||||
#if CRYPTO_PUBLICKEYBYTES -896U
|
||||
CRYPTO_PUBLICKEYBYTES size error
|
||||
#endif
|
||||
#if CRYPTO_SECRETKEYBYTES -2096U
|
||||
CRYPTO_SECRETKEYBYTES size error
|
||||
#endif
|
||||
#if CRYPTO_BYTES -1387U
|
||||
CRYPTO_BYTES size error
|
||||
#endif
|
||||
|
||||
#elif MODE == 1
|
||||
#if CRYPTO_PUBLICKEYBYTES -1184U
|
||||
CRYPTO_PUBLICKEYBYTES size error
|
||||
#endif
|
||||
#if CRYPTO_SECRETKEYBYTES -2800U
|
||||
CRYPTO_SECRETKEYBYTES size error
|
||||
#endif
|
||||
#if CRYPTO_BYTES -2044U
|
||||
CRYPTO_BYTES size error
|
||||
#endif
|
||||
|
||||
#elif MODE == 2
|
||||
#if CRYPTO_PUBLICKEYBYTES -1472U
|
||||
CRYPTO_PUBLICKEYBYTES size error
|
||||
#endif
|
||||
#if CRYPTO_SECRETKEYBYTES -3504U
|
||||
CRYPTO_SECRETKEYBYTES size error
|
||||
#endif
|
||||
#if CRYPTO_BYTES -2701U
|
||||
CRYPTO_BYTES size error
|
||||
#endif
|
||||
|
||||
#elif MODE == 3
|
||||
#if CRYPTO_PUBLICKEYBYTES -1760U
|
||||
CRYPTO_PUBLICKEYBYTES size error
|
||||
#endif
|
||||
#if CRYPTO_SECRETKEYBYTES -3856U
|
||||
CRYPTO_SECRETKEYBYTES size error
|
||||
#endif
|
||||
#if CRYPTO_BYTES -3366U
|
||||
CRYPTO_BYTES size error
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
#define CRYPTO_ALGNAME "Dilithium"
|
||||
|
||||
int crypto_sign_keypair(uint8_t *pk, uint8_t *sk);
|
||||
int crypto_sign(uint8_t *sm, int32_t *smlen, const uint8_t *msg, int32_t len, const uint8_t *sk);
|
||||
int crypto_sign_open(uint8_t *m, int32_t *mlen, const uint8_t *sm, int32_t smlen, const uint8_t *pk);
|
||||
|
||||
#endif
|
||||
@@ -16,7 +16,6 @@
|
||||
* *
|
||||
******************************************************************************/
|
||||
#include <assert.h>
|
||||
#include <cryptoconditions.h>
|
||||
#include "primitives/block.h"
|
||||
#include "primitives/transaction.h"
|
||||
#include "script/cc.h"
|
||||
@@ -28,27 +27,12 @@
|
||||
#include "core_io.h"
|
||||
#include "crosschain.h"
|
||||
|
||||
bool CClib_Dispatch(const CC *cond,Eval *eval,std::vector<uint8_t> paramsNull,const CTransaction &txTo,unsigned int nIn);
|
||||
char *CClib_name();
|
||||
|
||||
Eval* EVAL_TEST = 0;
|
||||
struct CCcontract_info CCinfos[0x100];
|
||||
extern pthread_mutex_t HUSH_CC_mutex;
|
||||
|
||||
bool RunCCEval(const CC *cond, const CTransaction &tx, unsigned int nIn)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Test the validity of an Eval node
|
||||
*/
|
||||
bool Eval::Dispatch(const CC *cond, const CTransaction &txTo, unsigned int nIn)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
bool Eval::GetSpendsConfirmed(uint256 hash, std::vector<CTransaction> &spends) const
|
||||
{
|
||||
|
||||
@@ -19,7 +19,6 @@
|
||||
#ifndef CC_EVAL_H
|
||||
#define CC_EVAL_H
|
||||
|
||||
#include <cryptoconditions.h>
|
||||
#include "cc/utils.h"
|
||||
#include "chain.h"
|
||||
#include "streams.h"
|
||||
@@ -81,11 +80,6 @@ public:
|
||||
bool Error(std::string s) { return state.Error(s); }
|
||||
bool Valid() { return true; }
|
||||
|
||||
/*
|
||||
* Test validity of a CC_Eval node
|
||||
*/
|
||||
virtual bool Dispatch(const CC *cond, const CTransaction &tx, unsigned int nIn);
|
||||
|
||||
/*
|
||||
* Dispute a payout using a VM
|
||||
*/
|
||||
@@ -134,8 +128,6 @@ public:
|
||||
|
||||
|
||||
|
||||
bool RunCCEval(const CC *cond, const CTransaction &tx, unsigned int nIn);
|
||||
|
||||
|
||||
/*
|
||||
* Virtual machine to use in the case of on-chain app evaluation
|
||||
|
||||
@@ -1,24 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
# Copyright (c) 2016-2023 The Hush developers
|
||||
# Distributed under the GPLv3 software license, see the accompanying
|
||||
# file COPYING or https://www.gnu.org/licenses/gpl-3.0.en.html
|
||||
|
||||
rm *.so rogue/rogue games/tetris games/prices
|
||||
|
||||
echo rogue
|
||||
make -f Makefile_rogue
|
||||
./makerogue
|
||||
rm ../libcc.so
|
||||
cp librogue.so ../libcc.so
|
||||
|
||||
echo sudoku/musig/dilithium
|
||||
gcc -O3 -std=c++11 -I../secp256k1/include -I../univalue/include -I../cryptoconditions/include -I../cryptoconditions/src -I../cryptoconditions/src/asn -I.. -I. -fPIC -shared -c -o sudokucc.so cclib.cpp
|
||||
|
||||
echo games tetris
|
||||
./maketetris
|
||||
|
||||
echo games prices
|
||||
./makeprices
|
||||
|
||||
echo customcc stub
|
||||
gcc -O3 -DBUILD_CUSTOMCC -std=c++11 -I../secp256k1/include -I../univalue/include -I../cryptoconditions/include -I../cryptoconditions/src -I../cryptoconditions/src/asn -I.. -I. -fPIC -shared -c -o customcc.so cclib.cpp
|
||||
24
src/cryptoconditions/.gitignore
vendored
24
src/cryptoconditions/.gitignore
vendored
@@ -1,24 +0,0 @@
|
||||
*.pyc
|
||||
.cache
|
||||
/Makefile
|
||||
/Makefile.in
|
||||
/aclocal.m4
|
||||
/autom4te.cache/
|
||||
/src/cryptoconditions-config.h
|
||||
/configure
|
||||
/depcomp
|
||||
/install-sh
|
||||
/libtool
|
||||
/ltmain.sh
|
||||
/m4/
|
||||
/missing
|
||||
/stamp-h?
|
||||
.deps/
|
||||
.dirstamp
|
||||
.libs/
|
||||
*.l[ao]
|
||||
*.[ao]
|
||||
*~
|
||||
converter-sample.c
|
||||
config.*
|
||||
.pytest_cache
|
||||
@@ -1,9 +0,0 @@
|
||||
# Original Author
|
||||
|
||||
Copyright 2017 Scott Sadler
|
||||
|
||||
# Current Authors
|
||||
|
||||
Copyright (c) 2016-2023 The Hush Developers
|
||||
|
||||
Relicensed to GPLv3 on Nov 21st 2020.
|
||||
@@ -1,619 +0,0 @@
|
||||
GENERAL GENERAL PUBLIC LICENSE
|
||||
Version 3, 29 June 2007
|
||||
|
||||
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
Preamble
|
||||
|
||||
The GENERAL General Public License is a free, copyleft license for
|
||||
software and other kinds of works.
|
||||
|
||||
The licenses for most software and other practical works are designed
|
||||
to take away your freedom to share and change the works. By contrast,
|
||||
the GENERAL General Public License is intended to guarantee your freedom to
|
||||
share and change all versions of a program--to make sure it remains free
|
||||
software for all its users. We, the Free Software Foundation, use the
|
||||
GENERAL General Public License for most of our software; it applies also to
|
||||
any other work released this way by its authors. You can apply it to
|
||||
your programs, too.
|
||||
|
||||
When we speak of free software, we are referring to freedom, not
|
||||
price. Our General Public Licenses are designed to make sure that you
|
||||
have the freedom to distribute copies of free software (and charge for
|
||||
them if you wish), that you receive source code or can get it if you
|
||||
want it, that you can change the software or use pieces of it in new
|
||||
free programs, and that you know you can do these things.
|
||||
|
||||
To protect your rights, we need to prevent others from denying you
|
||||
these rights or asking you to surrender the rights. Therefore, you have
|
||||
certain responsibilities if you distribute copies of the software, or if
|
||||
you modify it: responsibilities to respect the freedom of others.
|
||||
|
||||
For example, if you distribute copies of such a program, whether
|
||||
gratis or for a fee, you must pass on to the recipients the same
|
||||
freedoms that you received. You must make sure that they, too, receive
|
||||
or can get the source code. And you must show them these terms so they
|
||||
know their rights.
|
||||
|
||||
Developers that use the GENERAL GPL protect your rights with two steps:
|
||||
(1) assert copyright on the software, and (2) offer you this License
|
||||
giving you legal permission to copy, distribute and/or modify it.
|
||||
|
||||
For the developers' and authors' protection, the GPL clearly explains
|
||||
that there is no warranty for this free software. For both users' and
|
||||
authors' sake, the GPL requires that modified versions be marked as
|
||||
changed, so that their problems will not be attributed erroneously to
|
||||
authors of previous versions.
|
||||
|
||||
Some devices are designed to deny users access to install or run
|
||||
modified versions of the software inside them, although the manufacturer
|
||||
can do so. This is fundamentally incompatible with the aim of
|
||||
protecting users' freedom to change the software. The systematic
|
||||
pattern of such abuse occurs in the area of products for individuals to
|
||||
use, which is precisely where it is most unacceptable. Therefore, we
|
||||
have designed this version of the GPL to prohibit the practice for those
|
||||
products. If such problems arise substantially in other domains, we
|
||||
stand ready to extend this provision to those domains in future versions
|
||||
of the GPL, as needed to protect the freedom of users.
|
||||
|
||||
Finally, every program is threatened constantly by software patents.
|
||||
States should not allow patents to restrict development and use of
|
||||
software on general-purpose computers, but in those that do, we wish to
|
||||
avoid the special danger that patents applied to a free program could
|
||||
make it effectively proprietary. To prevent this, the GPL assures that
|
||||
patents cannot be used to render the program non-free.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
TERMS AND CONDITIONS
|
||||
|
||||
0. Definitions.
|
||||
|
||||
"This License" refers to version 3 of the GENERAL General Public License.
|
||||
|
||||
"Copyright" also means copyright-like laws that apply to other kinds of
|
||||
works, such as semiconductor masks.
|
||||
|
||||
"The Program" refers to any copyrightable work licensed under this
|
||||
License. Each licensee is addressed as "you". "Licensees" and
|
||||
"recipients" may be individuals or organizations.
|
||||
|
||||
To "modify" a work means to copy from or adapt all or part of the work
|
||||
in a fashion requiring copyright permission, other than the making of an
|
||||
exact copy. The resulting work is called a "modified version" of the
|
||||
earlier work or a work "based on" the earlier work.
|
||||
|
||||
A "covered work" means either the unmodified Program or a work based
|
||||
on the Program.
|
||||
|
||||
To "propagate" a work means to do anything with it that, without
|
||||
permission, would make you directly or secondarily liable for
|
||||
infringement under applicable copyright law, except executing it on a
|
||||
computer or modifying a private copy. Propagation includes copying,
|
||||
distribution (with or without modification), making available to the
|
||||
public, and in some countries other activities as well.
|
||||
|
||||
To "convey" a work means any kind of propagation that enables other
|
||||
parties to make or receive copies. Mere interaction with a user through
|
||||
a computer network, with no transfer of a copy, is not conveying.
|
||||
|
||||
An interactive user interface displays "Appropriate Legal Notices"
|
||||
to the extent that it includes a convenient and prominently visible
|
||||
feature that (1) displays an appropriate copyright notice, and (2)
|
||||
tells the user that there is no warranty for the work (except to the
|
||||
extent that warranties are provided), that licensees may convey the
|
||||
work under this License, and how to view a copy of this License. If
|
||||
the interface presents a list of user commands or options, such as a
|
||||
menu, a prominent item in the list meets this criterion.
|
||||
|
||||
1. Source Code.
|
||||
|
||||
The "source code" for a work means the preferred form of the work
|
||||
for making modifications to it. "Object code" means any non-source
|
||||
form of a work.
|
||||
|
||||
A "Standard Interface" means an interface that either is an official
|
||||
standard defined by a recognized standards body, or, in the case of
|
||||
interfaces specified for a particular programming language, one that
|
||||
is widely used among developers working in that language.
|
||||
|
||||
The "System Libraries" of an executable work include anything, other
|
||||
than the work as a whole, that (a) is included in the normal form of
|
||||
packaging a Major Component, but which is not part of that Major
|
||||
Component, and (b) serves only to enable use of the work with that
|
||||
Major Component, or to implement a Standard Interface for which an
|
||||
implementation is available to the public in source code form. A
|
||||
"Major Component", in this context, means a major essential component
|
||||
(kernel, window system, and so on) of the specific operating system
|
||||
(if any) on which the executable work runs, or a compiler used to
|
||||
produce the work, or an object code interpreter used to run it.
|
||||
|
||||
The "Corresponding Source" for a work in object code form means all
|
||||
the source code needed to generate, install, and (for an executable
|
||||
work) run the object code and to modify the work, including scripts to
|
||||
control those activities. However, it does not include the work's
|
||||
System Libraries, or general-purpose tools or generally available free
|
||||
programs which are used unmodified in performing those activities but
|
||||
which are not part of the work. For example, Corresponding Source
|
||||
includes interface definition files associated with source files for
|
||||
the work, and the source code for shared libraries and dynamically
|
||||
linked subprograms that the work is specifically designed to require,
|
||||
such as by intimate data communication or control flow between those
|
||||
subprograms and other parts of the work.
|
||||
|
||||
The Corresponding Source need not include anything that users
|
||||
can regenerate automatically from other parts of the Corresponding
|
||||
Source.
|
||||
|
||||
The Corresponding Source for a work in source code form is that
|
||||
same work.
|
||||
|
||||
2. Basic Permissions.
|
||||
|
||||
All rights granted under this License are granted for the term of
|
||||
copyright on the Program, and are irrevocable provided the stated
|
||||
conditions are met. This License explicitly affirms your unlimited
|
||||
permission to run the unmodified Program. The output from running a
|
||||
covered work is covered by this License only if the output, given its
|
||||
content, constitutes a covered work. This License acknowledges your
|
||||
rights of fair use or other equivalent, as provided by copyright law.
|
||||
|
||||
You may make, run and propagate covered works that you do not
|
||||
convey, without conditions so long as your license otherwise remains
|
||||
in force. You may convey covered works to others for the sole purpose
|
||||
of having them make modifications exclusively for you, or provide you
|
||||
with facilities for running those works, provided that you comply with
|
||||
the terms of this License in conveying all material for which you do
|
||||
not control copyright. Those thus making or running the covered works
|
||||
for you must do so exclusively on your behalf, under your direction
|
||||
and control, on terms that prohibit them from making any copies of
|
||||
your copyrighted material outside their relationship with you.
|
||||
|
||||
Conveying under any other circumstances is permitted solely under
|
||||
the conditions stated below. Sublicensing is not allowed; section 10
|
||||
makes it unnecessary.
|
||||
|
||||
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
|
||||
|
||||
No covered work shall be deemed part of an effective technological
|
||||
measure under any applicable law fulfilling obligations under article
|
||||
11 of the WIPO copyright treaty adopted on 20 December 1996, or
|
||||
similar laws prohibiting or restricting circumvention of such
|
||||
measures.
|
||||
|
||||
When you convey a covered work, you waive any legal power to forbid
|
||||
circumvention of technological measures to the extent such circumvention
|
||||
is effected by exercising rights under this License with respect to
|
||||
the covered work, and you disclaim any intention to limit operation or
|
||||
modification of the work as a means of enforcing, against the work's
|
||||
users, your or third parties' legal rights to forbid circumvention of
|
||||
technological measures.
|
||||
|
||||
4. Conveying Verbatim Copies.
|
||||
|
||||
You may convey verbatim copies of the Program's source code as you
|
||||
receive it, in any medium, provided that you conspicuously and
|
||||
appropriately publish on each copy an appropriate copyright notice;
|
||||
keep intact all notices stating that this License and any
|
||||
non-permissive terms added in accord with section 7 apply to the code;
|
||||
keep intact all notices of the absence of any warranty; and give all
|
||||
recipients a copy of this License along with the Program.
|
||||
|
||||
You may charge any price or no price for each copy that you convey,
|
||||
and you may offer support or warranty protection for a fee.
|
||||
|
||||
5. Conveying Modified Source Versions.
|
||||
|
||||
You may convey a work based on the Program, or the modifications to
|
||||
produce it from the Program, in the form of source code under the
|
||||
terms of section 4, provided that you also meet all of these conditions:
|
||||
|
||||
a) The work must carry prominent notices stating that you modified
|
||||
it, and giving a relevant date.
|
||||
|
||||
b) The work must carry prominent notices stating that it is
|
||||
released under this License and any conditions added under section
|
||||
7. This requirement modifies the requirement in section 4 to
|
||||
"keep intact all notices".
|
||||
|
||||
c) You must license the entire work, as a whole, under this
|
||||
License to anyone who comes into possession of a copy. This
|
||||
License will therefore apply, along with any applicable section 7
|
||||
additional terms, to the whole of the work, and all its parts,
|
||||
regardless of how they are packaged. This License gives no
|
||||
permission to license the work in any other way, but it does not
|
||||
invalidate such permission if you have separately received it.
|
||||
|
||||
d) If the work has interactive user interfaces, each must display
|
||||
Appropriate Legal Notices; however, if the Program has interactive
|
||||
interfaces that do not display Appropriate Legal Notices, your
|
||||
work need not make them do so.
|
||||
|
||||
A compilation of a covered work with other separate and independent
|
||||
works, which are not by their nature extensions of the covered work,
|
||||
and which are not combined with it such as to form a larger program,
|
||||
in or on a volume of a storage or distribution medium, is called an
|
||||
"aggregate" if the compilation and its resulting copyright are not
|
||||
used to limit the access or legal rights of the compilation's users
|
||||
beyond what the individual works permit. Inclusion of a covered work
|
||||
in an aggregate does not cause this License to apply to the other
|
||||
parts of the aggregate.
|
||||
|
||||
6. Conveying Non-Source Forms.
|
||||
|
||||
You may convey a covered work in object code form under the terms
|
||||
of sections 4 and 5, provided that you also convey the
|
||||
machine-readable Corresponding Source under the terms of this License,
|
||||
in one of these ways:
|
||||
|
||||
a) Convey the object code in, or embodied in, a physical product
|
||||
(including a physical distribution medium), accompanied by the
|
||||
Corresponding Source fixed on a durable physical medium
|
||||
customarily used for software interchange.
|
||||
|
||||
b) Convey the object code in, or embodied in, a physical product
|
||||
(including a physical distribution medium), accompanied by a
|
||||
written offer, valid for at least three years and valid for as
|
||||
long as you offer spare parts or customer support for that product
|
||||
model, to give anyone who possesses the object code either (1) a
|
||||
copy of the Corresponding Source for all the software in the
|
||||
product that is covered by this License, on a durable physical
|
||||
medium customarily used for software interchange, for a price no
|
||||
more than your reasonable cost of physically performing this
|
||||
conveying of source, or (2) access to copy the
|
||||
Corresponding Source from a network server at no charge.
|
||||
|
||||
c) Convey individual copies of the object code with a copy of the
|
||||
written offer to provide the Corresponding Source. This
|
||||
alternative is allowed only occasionally and noncommercially, and
|
||||
only if you received the object code with such an offer, in accord
|
||||
with subsection 6b.
|
||||
|
||||
d) Convey the object code by offering access from a designated
|
||||
place (gratis or for a charge), and offer equivalent access to the
|
||||
Corresponding Source in the same way through the same place at no
|
||||
further charge. You need not require recipients to copy the
|
||||
Corresponding Source along with the object code. If the place to
|
||||
copy the object code is a network server, the Corresponding Source
|
||||
may be on a different server (operated by you or a third party)
|
||||
that supports equivalent copying facilities, provided you maintain
|
||||
clear directions next to the object code saying where to find the
|
||||
Corresponding Source. Regardless of what server hosts the
|
||||
Corresponding Source, you remain obligated to ensure that it is
|
||||
available for as long as needed to satisfy these requirements.
|
||||
|
||||
e) Convey the object code using peer-to-peer transmission, provided
|
||||
you inform other peers where the object code and Corresponding
|
||||
Source of the work are being offered to the general public at no
|
||||
charge under subsection 6d.
|
||||
|
||||
A separable portion of the object code, whose source code is excluded
|
||||
from the Corresponding Source as a System Library, need not be
|
||||
included in conveying the object code work.
|
||||
|
||||
A "User Product" is either (1) a "consumer product", which means any
|
||||
tangible personal property which is normally used for personal, family,
|
||||
or household purposes, or (2) anything designed or sold for incorporation
|
||||
into a dwelling. In determining whether a product is a consumer product,
|
||||
doubtful cases shall be resolved in favor of coverage. For a particular
|
||||
product received by a particular user, "normally used" refers to a
|
||||
typical or common use of that class of product, regardless of the status
|
||||
of the particular user or of the way in which the particular user
|
||||
actually uses, or expects or is expected to use, the product. A product
|
||||
is a consumer product regardless of whether the product has substantial
|
||||
commercial, industrial or non-consumer uses, unless such uses represent
|
||||
the only significant mode of use of the product.
|
||||
|
||||
"Installation Information" for a User Product means any methods,
|
||||
procedures, authorization keys, or other information required to install
|
||||
and execute modified versions of a covered work in that User Product from
|
||||
a modified version of its Corresponding Source. The information must
|
||||
suffice to ensure that the continued functioning of the modified object
|
||||
code is in no case prevented or interfered with solely because
|
||||
modification has been made.
|
||||
|
||||
If you convey an object code work under this section in, or with, or
|
||||
specifically for use in, a User Product, and the conveying occurs as
|
||||
part of a transaction in which the right of possession and use of the
|
||||
User Product is transferred to the recipient in perpetuity or for a
|
||||
fixed term (regardless of how the transaction is characterized), the
|
||||
Corresponding Source conveyed under this section must be accompanied
|
||||
by the Installation Information. But this requirement does not apply
|
||||
if neither you nor any third party retains the ability to install
|
||||
modified object code on the User Product (for example, the work has
|
||||
been installed in ROM).
|
||||
|
||||
The requirement to provide Installation Information does not include a
|
||||
requirement to continue to provide support service, warranty, or updates
|
||||
for a work that has been modified or installed by the recipient, or for
|
||||
the User Product in which it has been modified or installed. Access to a
|
||||
network may be denied when the modification itself materially and
|
||||
adversely affects the operation of the network or violates the rules and
|
||||
protocols for communication across the network.
|
||||
|
||||
Corresponding Source conveyed, and Installation Information provided,
|
||||
in accord with this section must be in a format that is publicly
|
||||
documented (and with an implementation available to the public in
|
||||
source code form), and must require no special password or key for
|
||||
unpacking, reading or copying.
|
||||
|
||||
7. Additional Terms.
|
||||
|
||||
"Additional permissions" are terms that supplement the terms of this
|
||||
License by making exceptions from one or more of its conditions.
|
||||
Additional permissions that are applicable to the entire Program shall
|
||||
be treated as though they were included in this License, to the extent
|
||||
that they are valid under applicable law. If additional permissions
|
||||
apply only to part of the Program, that part may be used separately
|
||||
under those permissions, but the entire Program remains governed by
|
||||
this License without regard to the additional permissions.
|
||||
|
||||
When you convey a copy of a covered work, you may at your option
|
||||
remove any additional permissions from that copy, or from any part of
|
||||
it. (Additional permissions may be written to require their own
|
||||
removal in certain cases when you modify the work.) You may place
|
||||
additional permissions on material, added by you to a covered work,
|
||||
for which you have or can give appropriate copyright permission.
|
||||
|
||||
Notwithstanding any other provision of this License, for material you
|
||||
add to a covered work, you may (if authorized by the copyright holders of
|
||||
that material) supplement the terms of this License with terms:
|
||||
|
||||
a) Disclaiming warranty or limiting liability differently from the
|
||||
terms of sections 15 and 16 of this License; or
|
||||
|
||||
b) Requiring preservation of specified reasonable legal notices or
|
||||
author attributions in that material or in the Appropriate Legal
|
||||
Notices displayed by works containing it; or
|
||||
|
||||
c) Prohibiting misrepresentation of the origin of that material, or
|
||||
requiring that modified versions of such material be marked in
|
||||
reasonable ways as different from the original version; or
|
||||
|
||||
d) Limiting the use for publicity purposes of names of licensors or
|
||||
authors of the material; or
|
||||
|
||||
e) Declining to grant rights under trademark law for use of some
|
||||
trade names, trademarks, or service marks; or
|
||||
|
||||
f) Requiring indemnification of licensors and authors of that
|
||||
material by anyone who conveys the material (or modified versions of
|
||||
it) with contractual assumptions of liability to the recipient, for
|
||||
any liability that these contractual assumptions directly impose on
|
||||
those licensors and authors.
|
||||
|
||||
All other non-permissive additional terms are considered "further
|
||||
restrictions" within the meaning of section 10. If the Program as you
|
||||
received it, or any part of it, contains a notice stating that it is
|
||||
governed by this License along with a term that is a further
|
||||
restriction, you may remove that term. If a license document contains
|
||||
a further restriction but permits relicensing or conveying under this
|
||||
License, you may add to a covered work material governed by the terms
|
||||
of that license document, provided that the further restriction does
|
||||
not survive such relicensing or conveying.
|
||||
|
||||
If you add terms to a covered work in accord with this section, you
|
||||
must place, in the relevant source files, a statement of the
|
||||
additional terms that apply to those files, or a notice indicating
|
||||
where to find the applicable terms.
|
||||
|
||||
Additional terms, permissive or non-permissive, may be stated in the
|
||||
form of a separately written license, or stated as exceptions;
|
||||
the above requirements apply either way.
|
||||
|
||||
8. Termination.
|
||||
|
||||
You may not propagate or modify a covered work except as expressly
|
||||
provided under this License. Any attempt otherwise to propagate or
|
||||
modify it is void, and will automatically terminate your rights under
|
||||
this License (including any patent licenses granted under the third
|
||||
paragraph of section 11).
|
||||
|
||||
However, if you cease all violation of this License, then your
|
||||
license from a particular copyright holder is reinstated (a)
|
||||
provisionally, unless and until the copyright holder explicitly and
|
||||
finally terminates your license, and (b) permanently, if the copyright
|
||||
holder fails to notify you of the violation by some reasonable means
|
||||
prior to 60 days after the cessation.
|
||||
|
||||
Moreover, your license from a particular copyright holder is
|
||||
reinstated permanently if the copyright holder notifies you of the
|
||||
violation by some reasonable means, this is the first time you have
|
||||
received notice of violation of this License (for any work) from that
|
||||
copyright holder, and you cure the violation prior to 30 days after
|
||||
your receipt of the notice.
|
||||
|
||||
Termination of your rights under this section does not terminate the
|
||||
licenses of parties who have received copies or rights from you under
|
||||
this License. If your rights have been terminated and not permanently
|
||||
reinstated, you do not qualify to receive new licenses for the same
|
||||
material under section 10.
|
||||
|
||||
9. Acceptance Not Required for Having Copies.
|
||||
|
||||
You are not required to accept this License in order to receive or
|
||||
run a copy of the Program. Ancillary propagation of a covered work
|
||||
occurring solely as a consequence of using peer-to-peer transmission
|
||||
to receive a copy likewise does not require acceptance. However,
|
||||
nothing other than this License grants you permission to propagate or
|
||||
modify any covered work. These actions infringe copyright if you do
|
||||
not accept this License. Therefore, by modifying or propagating a
|
||||
covered work, you indicate your acceptance of this License to do so.
|
||||
|
||||
10. Automatic Licensing of Downstream Recipients.
|
||||
|
||||
Each time you convey a covered work, the recipient automatically
|
||||
receives a license from the original licensors, to run, modify and
|
||||
propagate that work, subject to this License. You are not responsible
|
||||
for enforcing compliance by third parties with this License.
|
||||
|
||||
An "entity transaction" is a transaction transferring control of an
|
||||
organization, or substantially all assets of one, or subdividing an
|
||||
organization, or merging organizations. If propagation of a covered
|
||||
work results from an entity transaction, each party to that
|
||||
transaction who receives a copy of the work also receives whatever
|
||||
licenses to the work the party's predecessor in interest had or could
|
||||
give under the previous paragraph, plus a right to possession of the
|
||||
Corresponding Source of the work from the predecessor in interest, if
|
||||
the predecessor has it or can get it with reasonable efforts.
|
||||
|
||||
You may not impose any further restrictions on the exercise of the
|
||||
rights granted or affirmed under this License. For example, you may
|
||||
not impose a license fee, royalty, or other charge for exercise of
|
||||
rights granted under this License, and you may not initiate litigation
|
||||
(including a cross-claim or counterclaim in a lawsuit) alleging that
|
||||
any patent claim is infringed by making, using, selling, offering for
|
||||
sale, or importing the Program or any portion of it.
|
||||
|
||||
11. Patents.
|
||||
|
||||
A "contributor" is a copyright holder who authorizes use under this
|
||||
License of the Program or a work on which the Program is based. The
|
||||
work thus licensed is called the contributor's "contributor version".
|
||||
|
||||
A contributor's "essential patent claims" are all patent claims
|
||||
owned or controlled by the contributor, whether already acquired or
|
||||
hereafter acquired, that would be infringed by some manner, permitted
|
||||
by this License, of making, using, or selling its contributor version,
|
||||
but do not include claims that would be infringed only as a
|
||||
consequence of further modification of the contributor version. For
|
||||
purposes of this definition, "control" includes the right to grant
|
||||
patent sublicenses in a manner consistent with the requirements of
|
||||
this License.
|
||||
|
||||
Each contributor grants you a non-exclusive, worldwide, royalty-free
|
||||
patent license under the contributor's essential patent claims, to
|
||||
make, use, sell, offer for sale, import and otherwise run, modify and
|
||||
propagate the contents of its contributor version.
|
||||
|
||||
In the following three paragraphs, a "patent license" is any express
|
||||
agreement or commitment, however denominated, not to enforce a patent
|
||||
(such as an express permission to practice a patent or covenant not to
|
||||
sue for patent infringement). To "grant" such a patent license to a
|
||||
party means to make such an agreement or commitment not to enforce a
|
||||
patent against the party.
|
||||
|
||||
If you convey a covered work, knowingly relying on a patent license,
|
||||
and the Corresponding Source of the work is not available for anyone
|
||||
to copy, free of charge and under the terms of this License, through a
|
||||
publicly available network server or other readily accessible means,
|
||||
then you must either (1) cause the Corresponding Source to be so
|
||||
available, or (2) arrange to deprive yourself of the benefit of the
|
||||
patent license for this particular work, or (3) arrange, in a manner
|
||||
consistent with the requirements of this License, to extend the patent
|
||||
license to downstream recipients. "Knowingly relying" means you have
|
||||
actual knowledge that, but for the patent license, your conveying the
|
||||
covered work in a country, or your recipient's use of the covered work
|
||||
in a country, would infringe one or more identifiable patents in that
|
||||
country that you have reason to believe are valid.
|
||||
|
||||
If, pursuant to or in connection with a single transaction or
|
||||
arrangement, you convey, or propagate by procuring conveyance of, a
|
||||
covered work, and grant a patent license to some of the parties
|
||||
receiving the covered work authorizing them to use, propagate, modify
|
||||
or convey a specific copy of the covered work, then the patent license
|
||||
you grant is automatically extended to all recipients of the covered
|
||||
work and works based on it.
|
||||
|
||||
A patent license is "discriminatory" if it does not include within
|
||||
the scope of its coverage, prohibits the exercise of, or is
|
||||
conditioned on the non-exercise of one or more of the rights that are
|
||||
specifically granted under this License. You may not convey a covered
|
||||
work if you are a party to an arrangement with a third party that is
|
||||
in the business of distributing software, under which you make payment
|
||||
to the third party based on the extent of your activity of conveying
|
||||
the work, and under which the third party grants, to any of the
|
||||
parties who would receive the covered work from you, a discriminatory
|
||||
patent license (a) in connection with copies of the covered work
|
||||
conveyed by you (or copies made from those copies), or (b) primarily
|
||||
for and in connection with specific products or compilations that
|
||||
contain the covered work, unless you entered into that arrangement,
|
||||
or that patent license was granted, prior to 28 March 2007.
|
||||
|
||||
Nothing in this License shall be construed as excluding or limiting
|
||||
any implied license or other defenses to infringement that may
|
||||
otherwise be available to you under applicable patent law.
|
||||
|
||||
12. No Surrender of Others' Freedom.
|
||||
|
||||
If conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot convey a
|
||||
covered work so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you may
|
||||
not convey it at all. For example, if you agree to terms that obligate you
|
||||
to collect a royalty for further conveying from those to whom you convey
|
||||
the Program, the only way you could satisfy both those terms and this
|
||||
License would be to refrain entirely from conveying the Program.
|
||||
|
||||
13. Use with the GENERAL Affero General Public License.
|
||||
|
||||
Notwithstanding any other provision of this License, you have
|
||||
permission to link or combine any covered work with a work licensed
|
||||
under version 3 of the GENERAL Affero General Public License into a single
|
||||
combined work, and to convey the resulting work. The terms of this
|
||||
License will continue to apply to the part which is the covered work,
|
||||
but the special requirements of the GENERAL Affero General Public License,
|
||||
section 13, concerning interaction through a network will apply to the
|
||||
combination as such.
|
||||
|
||||
14. Revised Versions of this License.
|
||||
|
||||
The Free Software Foundation may publish revised and/or new versions of
|
||||
the GENERAL General Public License from time to time. Such new versions will
|
||||
be similar in spirit to the present version, but may differ in detail to
|
||||
address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the
|
||||
Program specifies that a certain numbered version of the GENERAL General
|
||||
Public License "or any later version" applies to it, you have the
|
||||
option of following the terms and conditions either of that numbered
|
||||
version or of any later version published by the Free Software
|
||||
Foundation. If the Program does not specify a version number of the
|
||||
GENERAL General Public License, you may choose any version ever published
|
||||
by the Free Software Foundation.
|
||||
|
||||
If the Program specifies that a proxy can decide which future
|
||||
versions of the GENERAL General Public License can be used, that proxy's
|
||||
public statement of acceptance of a version permanently authorizes you
|
||||
to choose that version for the Program.
|
||||
|
||||
Later license versions may give you additional or different
|
||||
permissions. However, no additional obligations are imposed on any
|
||||
author or copyright holder as a result of your choosing to follow a
|
||||
later version.
|
||||
|
||||
15. Disclaimer of Warranty.
|
||||
|
||||
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
|
||||
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
|
||||
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
|
||||
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
|
||||
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
|
||||
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
|
||||
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||||
|
||||
16. Limitation of Liability.
|
||||
|
||||
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
|
||||
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
|
||||
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
|
||||
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
|
||||
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
|
||||
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
|
||||
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
|
||||
SUCH DAMAGES.
|
||||
|
||||
17. Interpretation of Sections 15 and 16.
|
||||
|
||||
If the disclaimer of warranty and limitation of liability provided
|
||||
above cannot be given local legal effect according to their terms,
|
||||
reviewing courts shall apply local law that most closely approximates
|
||||
an absolute waiver of all civil liability in connection with the
|
||||
Program, unless a warranty or assumption of liability accompanies a
|
||||
copy of the Program in return for a fee.
|
||||
@@ -1,94 +0,0 @@
|
||||
# Copyright 2016-2023 The Hush developers
|
||||
# Distributed under the GPLv3 software license, see the accompanying
|
||||
# file COPYING or https://www.gnu.org/licenses/gpl-3.0.en.html
|
||||
lib_LTLIBRARIES=libcryptoconditions.la
|
||||
noinst_LTLIBRARIES=$(CRYPTOCONDITIONS_CORE)
|
||||
SUBDIRS = src/include/secp256k1
|
||||
|
||||
include_HEADERS = include/cryptoconditions.h
|
||||
|
||||
# Have a separate build target for cryptoconditions that does not contain secp256k1
|
||||
|
||||
libcryptoconditions_la_SOURCES = include/cryptoconditions.h
|
||||
libcryptoconditions_la_LIBADD = $(CRYPTOCONDITIONS_CORE) $(LIBSECP256K1)
|
||||
|
||||
AM_CFLAGS = -I$(top_srcdir)/src/asn -I$(top_srcdir)/include -I$(top_srcdir)/src/include \
|
||||
-Wall -Wno-pointer-sign -Wno-discarded-qualifiers
|
||||
|
||||
LIBSECP256K1=src/include/secp256k1/libsecp256k1.la
|
||||
|
||||
$(LIBSECP256K1): $(wildcard src/secp256k1/*)
|
||||
$(AM_V_at)$(MAKE) $(AM_MAKEFLAGS) -C $(@D) $(@F) -g
|
||||
|
||||
CRYPTOCONDITIONS_CORE=libcryptoconditions_core.la
|
||||
|
||||
libcryptoconditions_core_la_SOURCES = \
|
||||
src/cryptoconditions.c \
|
||||
src/utils.c \
|
||||
src/include/cJSON.c \
|
||||
src/include/sha256.c \
|
||||
src/include/ed25519/src/keypair.c \
|
||||
src/include/ed25519/src/seed.c \
|
||||
src/include/ed25519/src/verify.c \
|
||||
src/include/ed25519/src/sign.c \
|
||||
src/include/ed25519/src/fe.c \
|
||||
src/include/ed25519/src/sc.c \
|
||||
src/include/ed25519/src/sha512.c \
|
||||
src/include/ed25519/src/ge.c \
|
||||
src/include/ed25519/src/add_scalar.c \
|
||||
src/include/ed25519/src/key_exchange.c \
|
||||
src/asn/Condition.c \
|
||||
src/asn/SimpleSha256Condition.c \
|
||||
src/asn/CompoundSha256Condition.c \
|
||||
src/asn/ConditionTypes.c \
|
||||
src/asn/Fulfillment.c \
|
||||
src/asn/PreimageFulfillment.c \
|
||||
src/asn/PrefixFulfillment.c \
|
||||
src/asn/ThresholdFulfillment.c \
|
||||
src/asn/RsaSha256Fulfillment.c \
|
||||
src/asn/Ed25519Sha512Fulfillment.c \
|
||||
src/asn/PrefixFingerprintContents.c \
|
||||
src/asn/ThresholdFingerprintContents.c \
|
||||
src/asn/RsaFingerprintContents.c \
|
||||
src/asn/Ed25519FingerprintContents.c \
|
||||
src/asn/EvalFulfillment.c \
|
||||
src/asn/Secp256k1FingerprintContents.c \
|
||||
src/asn/Secp256k1Fulfillment.c \
|
||||
src/asn/INTEGER.c \
|
||||
src/asn/NativeEnumerated.c \
|
||||
src/asn/NativeInteger.c \
|
||||
src/asn/asn_SET_OF.c \
|
||||
src/asn/constr_CHOICE.c \
|
||||
src/asn/constr_SEQUENCE.c \
|
||||
src/asn/constr_SET_OF.c \
|
||||
src/asn/OCTET_STRING.c \
|
||||
src/asn/BIT_STRING.c \
|
||||
src/asn/asn_codecs_prim.c \
|
||||
src/asn/ber_tlv_length.c \
|
||||
src/asn/ber_tlv_tag.c \
|
||||
src/asn/ber_decoder.c \
|
||||
src/asn/der_encoder.c \
|
||||
src/asn/constr_TYPE.c \
|
||||
src/asn/constraints.c \
|
||||
src/asn/xer_support.c \
|
||||
src/asn/xer_decoder.c \
|
||||
src/asn/xer_encoder.c \
|
||||
src/asn/per_support.c \
|
||||
src/asn/per_decoder.c \
|
||||
src/asn/per_encoder.c \
|
||||
src/asn/per_opentype.c
|
||||
|
||||
test:
|
||||
bash -c '[ -d .env ] || virtualenv .env -p python3'
|
||||
.env/bin/pip install pytest
|
||||
gdb -batch -ex run -ex bt --args .env/bin/python -m pytest -s -x -v 2>&1 | grep -v ^"No stack."$
|
||||
|
||||
test-debug-interactive:
|
||||
gdb -ex run --args python3 -m pytest -s -x -v
|
||||
|
||||
asn:
|
||||
cd src/asn; \
|
||||
mv asn_system.h asn_system.bak; \
|
||||
rm *.c *.h; \
|
||||
asn1c CryptoConditions.asn; \
|
||||
mv asn_system.bak asn_system.h
|
||||
@@ -1,169 +0,0 @@
|
||||
# libcryptoconditions
|
||||
|
||||
Interledger Crypto-Conditions in C, targeting spec [draft-thomas-crypto-conditions-03](https://tools.ietf.org/html/draft-thomas-crypto-conditions-03).
|
||||
|
||||
Features shared object and easy to use JSON api, as well as a command line interface written in Python.
|
||||
|
||||
## Quickstart
|
||||
|
||||
```shell
|
||||
git clone --recursive https://github.com/libscott/libcryptoconditions
|
||||
cd libcryptoconditions
|
||||
./autogen.sh
|
||||
./configure
|
||||
make
|
||||
./cryptoconditions.py --help
|
||||
```
|
||||
|
||||
## Status
|
||||
|
||||
JSON interface may not be particularly safe. The rest is pretty good now.
|
||||
|
||||
## Embedding
|
||||
|
||||
For the binary interface, see [cryptoconditions.h](./include/cryptoconditions.h).
|
||||
|
||||
To embed in other languages, the easiest way may be to call the JSON RPC method via FFI. This is how it looks in Python:
|
||||
|
||||
```python
|
||||
import json
|
||||
from ctypes import *
|
||||
|
||||
so = cdll.LoadLibrary('.libs/libcryptoconditions.so')
|
||||
so.jsonRPC.restype = c_char_p
|
||||
|
||||
def call_cryptoconditions_rpc(method, params):
|
||||
out = so.jsonRPC(json.dumps({
|
||||
'method': method,
|
||||
'params': params,
|
||||
}))
|
||||
return json.loads(out)
|
||||
```
|
||||
|
||||
## JSON methods
|
||||
|
||||
### encodeCondition
|
||||
|
||||
Encode a JSON condition to a base64 binary string
|
||||
|
||||
```shell
|
||||
cryptoconditions encodeCondition '{
|
||||
"type": "ed25519-sha-256",
|
||||
"publicKey": "11qYAYKxCrfVS_7TyWQHOg7hcvPapiMlrwIaaPcHURo"
|
||||
}'
|
||||
{
|
||||
"bin": "pCeAIHmSOauo_E_36r-8TETmnovf7ZkzJOEu1keSq-KJzx1fgQMCAAA",
|
||||
"uri": "ni:///sha-256;eZI5q6j8T_fqv7xMROaei9_tmTMk4S7WR5Kr4onPHV8?fpt=ed25519-sha-256&cost=131072"
|
||||
}
|
||||
```
|
||||
|
||||
### decodeCondition
|
||||
|
||||
Decode a binary condition
|
||||
|
||||
```shell
|
||||
cryptoconditions decodeCondition '{
|
||||
"bin": "pCeAIHmSOauo_E_36r-8TETmnovf7ZkzJOEu1keSq-KJzx1fgQMCAAA"
|
||||
}'
|
||||
{
|
||||
"bin": "pCeAIHmSOauo_E_36r-8TETmnovf7ZkzJOEu1keSq-KJzx1fgQMCAAA",
|
||||
"uri": "ni:///sha-256;eZI5q6j8T_fqv7xMROaei9_tmTMk4S7WR5Kr4onPHV8?fpt=ed25519-sha-256&cost=131072"
|
||||
}
|
||||
```
|
||||
|
||||
### encodeFulfillment
|
||||
|
||||
Encode a JSON condition to a binary fulfillment. The condition must be fulfilled, that is,
|
||||
it needs to have signatures present.
|
||||
|
||||
```shell
|
||||
cryptoconditions encodeFulfillment '{
|
||||
{
|
||||
"type": "ed25519-sha-256",
|
||||
"publicKey": "E0x0Ws4GhWhO_zBoUyaLbuqCz6hDdq11Ft1Dgbe9y9k",
|
||||
"signature": "jcuovSRpHwqiC781KzSM1Jd0Qtyfge0cMGttUdLOVdjJlSBFLTtgpinASOaJpd-VGjhSGWkp1hPWuMAAZq6pAg"
|
||||
}'
|
||||
{
|
||||
"fulfillment": "pGSAIBNMdFrOBoVoTv8waFMmi27qgs-oQ3atdRbdQ4G3vcvZgUCNy6i9JGkfCqILvzUrNIzUl3RC3J-B7Rwwa21R0s5V2MmVIEUtO2CmKcBI5oml35UaOFIZaSnWE9a4wABmrqkC"
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
### decodeFulfillment
|
||||
|
||||
Decode a binary fulfillment
|
||||
|
||||
```shell
|
||||
cryptoconditions decodeFulfillment '{
|
||||
"fulfillment": "pGSAINdamAGCsQq31Uv-08lkBzoO4XLz2qYjJa8CGmj3B1EagUDlVkMAw2CscpCG4syAboKKhId_Hrjl2XTYc-BlIkkBVV-4ghWQozusxh45cBz5tGvSW_XwWVu-JGVRQUOOehAL"
|
||||
}'
|
||||
{
|
||||
"bin": "pCeAIHmSOauo_E_36r-8TETmnovf7ZkzJOEu1keSq-KJzx1fgQMCAAA",
|
||||
"uri": "ni:///sha-256;eZI5q6j8T_fqv7xMROaei9_tmTMk4S7WR5Kr4onPHV8?fpt=ed25519-sha-256&cost=131072"
|
||||
}
|
||||
```
|
||||
|
||||
### verifyFulfillment
|
||||
|
||||
Verify a fulfillment against a message and a condition URL
|
||||
|
||||
```shell
|
||||
cryptoconditions verifyFulfillment '{
|
||||
"message": "",
|
||||
"fulfillment": "pGSAINdamAGCsQq31Uv-08lkBzoO4XLz2qYjJa8CGmj3B1EagUDlVkMAw2CscpCG4syAboKKhId_Hrjl2XTYc-BlIkkBVV-4ghWQozusxh45cBz5tGvSW_XwWVu-JGVRQUOOehAL",
|
||||
"condition": "pCeAIHmSOauo_E_36r-8TETmnovf7ZkzJOEu1keSq-KJzx1fgQMCAAA"
|
||||
}
|
||||
{
|
||||
"valid": true
|
||||
}
|
||||
```
|
||||
|
||||
### signTreeEd25519
|
||||
|
||||
Sign all ed25519 nodes in a condition tree
|
||||
|
||||
```shell
|
||||
cryptoconditions signTreeEd25519 '{
|
||||
"condition": {
|
||||
"type": "ed25519-sha-256",
|
||||
"publicKey": "E0x0Ws4GhWhO_zBoUyaLbuqCz6hDdq11Ft1Dgbe9y9k",
|
||||
},
|
||||
"privateKey": "11qYAYKxCrfVS_7TyWQHOg7hcvPapiMlrwIaaPcHURo",
|
||||
"message": "",
|
||||
}'
|
||||
{
|
||||
"num_signed": 1,
|
||||
"condition": {
|
||||
"type": "ed25519-sha-256",
|
||||
"publicKey": "E0x0Ws4GhWhO_zBoUyaLbuqCz6hDdq11Ft1Dgbe9y9k",
|
||||
"signature": "jcuovSRpHwqiC781KzSM1Jd0Qtyfge0cMGttUdLOVdjJlSBFLTtgpinASOaJpd-VGjhSGWkp1hPWuMAAZq6pAg"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### signTreeSecp256k1
|
||||
|
||||
Sign all secp256k1 nodes in a condition tree
|
||||
|
||||
```shell
|
||||
cryptoconditions signTreeSecp256k1 '{
|
||||
"condition": {
|
||||
"type": "secp256k1-sha-256",
|
||||
"publicKey": "AmkauD4tVL5-I7NN9hE_A8SlA0WdCIeJe_1Nac_km1hr",
|
||||
},
|
||||
"privateKey": "Bxwd5hOLZcTvzrR5Cupm3IV7TWHHl8nNLeO4UhYfRs4",
|
||||
"message": "",
|
||||
}'
|
||||
{
|
||||
"num_signed": 1,
|
||||
"condition": {
|
||||
"type": "secp256k1-sha-256",
|
||||
"publicKey": "AmkauD4tVL5-I7NN9hE_A8SlA0WdCIeJe_1Nac_km1hr",
|
||||
"signature": "LSQLzZo4cmt04KoCdoFcbIJX5MZ9CM6324SqkdqV1PppfUwquiWa7HD97hf4jdkdqU3ep8ZS9AU7zEJoUAl_Gg"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
# License
|
||||
|
||||
GPLv3
|
||||
@@ -1,3 +0,0 @@
|
||||
#!/bin/sh
|
||||
set -e
|
||||
autoreconf -if --warnings=all
|
||||
@@ -1,42 +0,0 @@
|
||||
# -*- Autoconf -*-
|
||||
# Process this file with autoconf to produce a configure script.
|
||||
|
||||
AC_PREREQ([2.69])
|
||||
AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS])
|
||||
AC_CONFIG_HEADERS([src/cryptoconditions-config.h])
|
||||
AC_CONFIG_MACRO_DIRS([m4])
|
||||
AC_CONFIG_SUBDIRS([src/include/secp256k1])
|
||||
|
||||
AM_INIT_AUTOMAKE([foreign subdir-objects])
|
||||
LT_INIT
|
||||
|
||||
# Checks for programs.
|
||||
AC_PROG_CC
|
||||
AC_PROG_CC_STDC
|
||||
|
||||
# Checks for libraries.
|
||||
|
||||
# Checks for header files.
|
||||
AC_FUNC_ALLOCA
|
||||
AC_CHECK_HEADERS([arpa/inet.h float.h inttypes.h limits.h locale.h malloc.h netinet/in.h stddef.h stdint.h stdlib.h string.h])
|
||||
|
||||
# Checks for typedefs, structures, and compiler characteristics.
|
||||
AC_CHECK_HEADER_STDBOOL
|
||||
AC_TYPE_INT16_T
|
||||
AC_TYPE_INT32_T
|
||||
AC_TYPE_INT8_T
|
||||
AC_TYPE_SIZE_T
|
||||
AC_TYPE_SSIZE_T
|
||||
AC_TYPE_UINT16_T
|
||||
AC_TYPE_UINT32_T
|
||||
AC_TYPE_UINT64_T
|
||||
AC_TYPE_UINT8_T
|
||||
AC_CHECK_TYPES([ptrdiff_t])
|
||||
|
||||
# Checks for library functions.
|
||||
AC_FUNC_MALLOC
|
||||
AC_FUNC_STRTOD
|
||||
AC_CHECK_FUNCS([localeconv memchr memset])
|
||||
|
||||
AC_CONFIG_FILES([Makefile])
|
||||
AC_OUTPUT
|
||||
@@ -1,62 +0,0 @@
|
||||
#!/usr/bin/env python
|
||||
|
||||
import sys
|
||||
import json
|
||||
import ctypes
|
||||
import base64
|
||||
import os.path
|
||||
import argparse
|
||||
from ctypes import *
|
||||
|
||||
|
||||
so = cdll.LoadLibrary('.libs/libcryptoconditions.so')
|
||||
so.jsonRPC.restype = c_char_p
|
||||
|
||||
|
||||
def jsonRPC(method, params, load=True):
|
||||
out = so.cc_jsonRPC(json.dumps({
|
||||
'method': method,
|
||||
'params': params,
|
||||
}))
|
||||
return json.loads(out) if load else out
|
||||
|
||||
|
||||
def b16_to_b64(b16):
|
||||
return base64.urlsafe_b64encode(base64.b16decode(b16)).rstrip('=')
|
||||
|
||||
|
||||
USAGE = "cryptoconditions [-h] {method} {request_json}"
|
||||
|
||||
def get_help():
|
||||
methods = jsonRPC("listMethods", {})['methods']
|
||||
|
||||
txt = USAGE + "\n\nmethods:\n"
|
||||
|
||||
for method in methods:
|
||||
txt += ' %s: %s\n' % (method['name'], method['description'])
|
||||
|
||||
txt += """\noptional arguments:
|
||||
-h, --help show this help message and exit
|
||||
"""
|
||||
return txt
|
||||
|
||||
|
||||
def get_parser():
|
||||
class Parser(argparse.ArgumentParser):
|
||||
def format_help(self):
|
||||
return get_help()
|
||||
|
||||
parser = Parser(description='Crypto Conditions JSON interface', usage=USAGE)
|
||||
|
||||
json_loads = lambda r: json.loads(r)
|
||||
json_loads.__name__ = 'json'
|
||||
|
||||
parser.add_argument("method")
|
||||
parser.add_argument("request", type=json_loads)
|
||||
|
||||
return parser
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
args = get_parser().parse_args()
|
||||
print(jsonRPC(args.method, args.request, load=False))
|
||||
@@ -1,120 +0,0 @@
|
||||
/******************************************************************************
|
||||
* Copyright © 2014-2019 The SuperNET Developers. *
|
||||
* *
|
||||
* See the AUTHORS, DEVELOPER-AGREEMENT and LICENSE files at *
|
||||
* the top-level directory of this distribution for the individual copyright *
|
||||
* holder information and the developer policies on copyright and licensing. *
|
||||
* *
|
||||
* Unless otherwise agreed in a custom licensing agreement, no part of the *
|
||||
* SuperNET software, including this file may be copied, modified, propagated *
|
||||
* or distributed except according to the terms contained in the LICENSE file *
|
||||
* *
|
||||
* Removal or modification of this copyright notice is prohibited. *
|
||||
* *
|
||||
******************************************************************************/
|
||||
|
||||
#include <cJSON.h>
|
||||
#include <stdint.h>
|
||||
|
||||
|
||||
#ifndef CRYPTOCONDITIONS_H
|
||||
#define CRYPTOCONDITIONS_H
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
|
||||
struct CC;
|
||||
struct CCType;
|
||||
|
||||
|
||||
enum CCTypeId {
|
||||
CC_Anon = -1,
|
||||
CC_Preimage = 0,
|
||||
CC_Prefix = 1,
|
||||
CC_Threshold = 2,
|
||||
CC_Ed25519 = 4,
|
||||
CC_Secp256k1 = 5,
|
||||
CC_Eval = 15
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
* Evaliliary verification callback
|
||||
*/
|
||||
typedef int (*VerifyEval)(struct CC *cond, void *context);
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* Crypto Condition
|
||||
*/
|
||||
typedef struct CC {
|
||||
struct CCType *type;
|
||||
union {
|
||||
// public key types
|
||||
struct { uint8_t *publicKey, *signature; };
|
||||
// preimage
|
||||
struct { uint8_t *preimage; size_t preimageLength; };
|
||||
// threshold
|
||||
struct { long threshold; uint8_t size; struct CC **subconditions; };
|
||||
// prefix
|
||||
struct { uint8_t *prefix; size_t prefixLength; struct CC *subcondition;
|
||||
size_t maxMessageLength; };
|
||||
// eval
|
||||
struct { uint8_t *code; size_t codeLength; };
|
||||
// anon
|
||||
struct { uint8_t fingerprint[32]; uint32_t subtypes; unsigned long cost;
|
||||
struct CCType *conditionType; };
|
||||
};
|
||||
} CC;
|
||||
|
||||
/*
|
||||
* Crypto Condition Visitor
|
||||
*/
|
||||
typedef struct CCVisitor {
|
||||
int (*visit)(CC *cond, struct CCVisitor visitor);
|
||||
const uint8_t *msg;
|
||||
size_t msgLength;
|
||||
void *context;
|
||||
} CCVisitor;
|
||||
|
||||
|
||||
/*
|
||||
* Public methods
|
||||
*/
|
||||
int cc_isFulfilled(const CC *cond);
|
||||
int cc_verify(const struct CC *cond, const uint8_t *msg, size_t msgLength,
|
||||
int doHashMessage, const uint8_t *condBin, size_t condBinLength,
|
||||
VerifyEval verifyEval, void *evalContext);
|
||||
int cc_visit(CC *cond, struct CCVisitor visitor);
|
||||
int cc_signTreeEd25519(CC *cond, const uint8_t *privateKey, const uint8_t *msg,
|
||||
const size_t msgLength);
|
||||
int cc_signTreeSecp256k1Msg32(CC *cond, const uint8_t *privateKey, const uint8_t *msg32);
|
||||
int cc_secp256k1VerifyTreeMsg32(const CC *cond, const uint8_t *msg32);
|
||||
size_t cc_conditionBinary(const CC *cond, uint8_t *buf);
|
||||
size_t cc_fulfillmentBinary(const CC *cond, uint8_t *buf, size_t bufLength);
|
||||
struct CC* cc_conditionFromJSON(cJSON *params, char *err);
|
||||
struct CC* cc_conditionFromJSONString(const char *json, char *err);
|
||||
struct CC* cc_readConditionBinary(const uint8_t *cond_bin, size_t cond_bin_len);
|
||||
struct CC* cc_readFulfillmentBinary(const uint8_t *ffill_bin, size_t ffill_bin_len);
|
||||
int cc_readFulfillmentBinaryExt(const unsigned char *ffill_bin, size_t ffill_bin_len, CC **ppcc);
|
||||
struct CC* cc_new(int typeId);
|
||||
struct cJSON* cc_conditionToJSON(const CC *cond);
|
||||
char* cc_conditionToJSONString(const CC *cond);
|
||||
char* cc_conditionUri(const CC *cond);
|
||||
char* cc_jsonRPC(char *request);
|
||||
char* cc_typeName(const CC *cond);
|
||||
enum CCTypeId cc_typeId(const CC *cond);
|
||||
unsigned long cc_getCost(const CC *cond);
|
||||
uint32_t cc_typeMask(const CC *cond);
|
||||
int cc_isAnon(const CC *cond);
|
||||
void cc_free(struct CC *cond);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* CRYPTOCONDITIONS_H */
|
||||
@@ -1,84 +0,0 @@
|
||||
// Copyright (c) 2016-2023 The Hush developers
|
||||
/******************************************************************************
|
||||
* Copyright © 2014-2019 The SuperNET Developers. *
|
||||
* *
|
||||
* See the AUTHORS, DEVELOPER-AGREEMENT and LICENSE files at *
|
||||
* the top-level directory of this distribution for the individual copyright *
|
||||
* holder information and the developer policies on copyright and licensing. *
|
||||
* *
|
||||
* Unless otherwise agreed in a custom licensing agreement, no part of the *
|
||||
* SuperNET software, including this file may be copied, modified, propagated *
|
||||
* or distributed except according to the terms contained in the LICENSE file *
|
||||
* *
|
||||
* Removal or modification of this copyright notice is prohibited. *
|
||||
* *
|
||||
******************************************************************************/
|
||||
|
||||
#include "asn/Condition.h"
|
||||
#include "asn/Fulfillment.h"
|
||||
#include "asn/PrefixFingerprintContents.h"
|
||||
#include "asn/OCTET_STRING.h"
|
||||
#include "include/cJSON.h"
|
||||
#include "cryptoconditions.h"
|
||||
|
||||
struct CCType CC_AnonType;
|
||||
|
||||
CC *mkAnon(const Condition_t *asnCond) {
|
||||
|
||||
CCType *realType = getTypeByAsnEnum(asnCond->present);
|
||||
if (!realType) {
|
||||
fprintf(stderr, "Unknown ASN type: %i", asnCond->present);
|
||||
return 0;
|
||||
}
|
||||
CC *cond = cc_new(CC_Anon);
|
||||
cond->conditionType = realType;
|
||||
const CompoundSha256Condition_t *deets = &asnCond->choice.thresholdSha256;
|
||||
memcpy(cond->fingerprint, deets->fingerprint.buf, 32);
|
||||
cond->cost = deets->cost;
|
||||
if (realType->getSubtypes) {
|
||||
cond->subtypes = fromAsnSubtypes(deets->subtypes);
|
||||
}
|
||||
return cond;
|
||||
}
|
||||
|
||||
|
||||
|
||||
static void anonToJSON(const CC *cond, cJSON *params) {
|
||||
unsigned char *b64 = base64_encode(cond->fingerprint, 32);
|
||||
cJSON_AddItemToObject(params, "fingerprint", cJSON_CreateString(b64));
|
||||
free(b64);
|
||||
cJSON_AddItemToObject(params, "cost", cJSON_CreateNumber(cond->cost));
|
||||
cJSON_AddItemToObject(params, "subtypes", cJSON_CreateNumber(cond->subtypes));
|
||||
}
|
||||
|
||||
|
||||
static void anonFingerprint(const CC *cond, uint8_t *out) {
|
||||
memcpy(out, cond->fingerprint, 32);
|
||||
}
|
||||
|
||||
|
||||
static unsigned long anonCost(const CC *cond) {
|
||||
return cond->cost;
|
||||
}
|
||||
|
||||
|
||||
static uint32_t anonSubtypes(const CC *cond) {
|
||||
return cond->subtypes;
|
||||
}
|
||||
|
||||
|
||||
static Fulfillment_t *anonFulfillment(const CC *cond) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
static void anonFree(CC *cond) {
|
||||
}
|
||||
|
||||
|
||||
static int anonIsFulfilled(const CC *cond) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
struct CCType CC_AnonType = { -1, "(anon)", Condition_PR_NOTHING, NULL, &anonFingerprint, &anonCost, &anonSubtypes, NULL, &anonToJSON, NULL, &anonFulfillment, &anonIsFulfilled, &anonFree };
|
||||
@@ -1,192 +0,0 @@
|
||||
// Copyright (c) 2016-2023 The Hush developers
|
||||
// Distributed under the GPLv3 software license, see the accompanying
|
||||
// file COPYING or https://www.gnu.org/licenses/gpl-3.0.en.html
|
||||
/*-
|
||||
* Copyright (c) 2003, 2004 Lev Walkin <vlm@lionet.info>. All rights reserved.
|
||||
* Redistribution and modifications are permitted subject to BSD license.
|
||||
*/
|
||||
#include <asn_internal.h>
|
||||
#include <BIT_STRING.h>
|
||||
#include <asn_internal.h>
|
||||
|
||||
/*
|
||||
* BIT STRING basic type description.
|
||||
*/
|
||||
static const ber_tlv_tag_t asn_DEF_BIT_STRING_tags[] = {
|
||||
(ASN_TAG_CLASS_UNIVERSAL | (3 << 2))
|
||||
};
|
||||
static asn_OCTET_STRING_specifics_t asn_DEF_BIT_STRING_specs = {
|
||||
sizeof(BIT_STRING_t),
|
||||
offsetof(BIT_STRING_t, _asn_ctx),
|
||||
ASN_OSUBV_BIT
|
||||
};
|
||||
asn_TYPE_descriptor_t asn_DEF_BIT_STRING = {
|
||||
"BIT STRING",
|
||||
"BIT_STRING",
|
||||
OCTET_STRING_free, /* Implemented in terms of OCTET STRING */
|
||||
BIT_STRING_print,
|
||||
BIT_STRING_constraint,
|
||||
OCTET_STRING_decode_ber, /* Implemented in terms of OCTET STRING */
|
||||
OCTET_STRING_encode_der, /* Implemented in terms of OCTET STRING */
|
||||
OCTET_STRING_decode_xer_binary,
|
||||
BIT_STRING_encode_xer,
|
||||
OCTET_STRING_decode_uper, /* Unaligned PER decoder */
|
||||
OCTET_STRING_encode_uper, /* Unaligned PER encoder */
|
||||
0, /* Use generic outmost tag fetcher */
|
||||
asn_DEF_BIT_STRING_tags,
|
||||
sizeof(asn_DEF_BIT_STRING_tags)
|
||||
/ sizeof(asn_DEF_BIT_STRING_tags[0]),
|
||||
asn_DEF_BIT_STRING_tags, /* Same as above */
|
||||
sizeof(asn_DEF_BIT_STRING_tags)
|
||||
/ sizeof(asn_DEF_BIT_STRING_tags[0]),
|
||||
0, /* No PER visible constraints */
|
||||
0, 0, /* No members */
|
||||
&asn_DEF_BIT_STRING_specs
|
||||
};
|
||||
|
||||
/*
|
||||
* BIT STRING generic constraint.
|
||||
*/
|
||||
int
|
||||
BIT_STRING_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
|
||||
asn_app_constraint_failed_f *ctfailcb, void *app_key) {
|
||||
const BIT_STRING_t *st = (const BIT_STRING_t *)sptr;
|
||||
|
||||
if(st && st->buf) {
|
||||
if((st->size == 0 && st->bits_unused)
|
||||
|| st->bits_unused < 0 || st->bits_unused > 7) {
|
||||
ASN__CTFAIL(app_key, td, sptr,
|
||||
"%s: invalid padding byte (%s:%d)",
|
||||
td->name, __FILE__, __LINE__);
|
||||
return -1;
|
||||
}
|
||||
} else {
|
||||
ASN__CTFAIL(app_key, td, sptr,
|
||||
"%s: value not given (%s:%d)",
|
||||
td->name, __FILE__, __LINE__);
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static char *_bit_pattern[16] = {
|
||||
"0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111",
|
||||
"1000", "1001", "1010", "1011", "1100", "1101", "1110", "1111"
|
||||
};
|
||||
|
||||
asn_enc_rval_t
|
||||
BIT_STRING_encode_xer(asn_TYPE_descriptor_t *td, void *sptr,
|
||||
int ilevel, enum xer_encoder_flags_e flags,
|
||||
asn_app_consume_bytes_f *cb, void *app_key) {
|
||||
asn_enc_rval_t er;
|
||||
char scratch[128];
|
||||
char *p = scratch;
|
||||
char *scend = scratch + (sizeof(scratch) - 10);
|
||||
const BIT_STRING_t *st = (const BIT_STRING_t *)sptr;
|
||||
int xcan = (flags & XER_F_CANONICAL);
|
||||
uint8_t *buf;
|
||||
uint8_t *end;
|
||||
|
||||
if(!st || !st->buf)
|
||||
ASN__ENCODE_FAILED;
|
||||
|
||||
er.encoded = 0;
|
||||
|
||||
buf = st->buf;
|
||||
end = buf + st->size - 1; /* Last byte is special */
|
||||
|
||||
/*
|
||||
* Binary dump
|
||||
*/
|
||||
for(; buf < end; buf++) {
|
||||
int v = *buf;
|
||||
int nline = xcan?0:(((buf - st->buf) % 8) == 0);
|
||||
if(p >= scend || nline) {
|
||||
er.encoded += p - scratch;
|
||||
ASN__CALLBACK(scratch, p - scratch);
|
||||
p = scratch;
|
||||
if(nline) ASN__TEXT_INDENT(1, ilevel);
|
||||
}
|
||||
memcpy(p + 0, _bit_pattern[v >> 4], 4);
|
||||
memcpy(p + 4, _bit_pattern[v & 0x0f], 4);
|
||||
p += 8;
|
||||
}
|
||||
|
||||
if(!xcan && ((buf - st->buf) % 8) == 0)
|
||||
ASN__TEXT_INDENT(1, ilevel);
|
||||
er.encoded += p - scratch;
|
||||
ASN__CALLBACK(scratch, p - scratch);
|
||||
p = scratch;
|
||||
|
||||
if(buf == end) {
|
||||
int v = *buf;
|
||||
int ubits = st->bits_unused;
|
||||
int i;
|
||||
for(i = 7; i >= ubits; i--)
|
||||
*p++ = (v & (1 << i)) ? 0x31 : 0x30;
|
||||
er.encoded += p - scratch;
|
||||
ASN__CALLBACK(scratch, p - scratch);
|
||||
}
|
||||
|
||||
if(!xcan) ASN__TEXT_INDENT(1, ilevel - 1);
|
||||
|
||||
ASN__ENCODED_OK(er);
|
||||
cb_failed:
|
||||
ASN__ENCODE_FAILED;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* BIT STRING specific contents printer.
|
||||
*/
|
||||
int
|
||||
BIT_STRING_print(asn_TYPE_descriptor_t *td, const void *sptr, int ilevel,
|
||||
asn_app_consume_bytes_f *cb, void *app_key) {
|
||||
const char * const h2c = "0123456789ABCDEF";
|
||||
char scratch[64];
|
||||
const BIT_STRING_t *st = (const BIT_STRING_t *)sptr;
|
||||
uint8_t *buf;
|
||||
uint8_t *end;
|
||||
char *p = scratch;
|
||||
|
||||
(void)td; /* Unused argument */
|
||||
|
||||
if(!st || !st->buf)
|
||||
return (cb("<absent>", 8, app_key) < 0) ? -1 : 0;
|
||||
|
||||
ilevel++;
|
||||
buf = st->buf;
|
||||
end = buf + st->size;
|
||||
|
||||
/*
|
||||
* Hexadecimal dump.
|
||||
*/
|
||||
for(; buf < end; buf++) {
|
||||
if((buf - st->buf) % 16 == 0 && (st->size > 16)
|
||||
&& buf != st->buf) {
|
||||
_i_INDENT(1);
|
||||
/* Dump the string */
|
||||
if(cb(scratch, p - scratch, app_key) < 0) return -1;
|
||||
p = scratch;
|
||||
}
|
||||
*p++ = h2c[*buf >> 4];
|
||||
*p++ = h2c[*buf & 0x0F];
|
||||
*p++ = 0x20;
|
||||
}
|
||||
|
||||
if(p > scratch) {
|
||||
p--; /* Eat the tailing space */
|
||||
|
||||
if((st->size > 16)) {
|
||||
_i_INDENT(1);
|
||||
}
|
||||
|
||||
/* Dump the incomplete 16-bytes row */
|
||||
if(cb(scratch, p - scratch, app_key) < 0)
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1,36 +0,0 @@
|
||||
// Copyright (c) 2016-2023 The Hush developers
|
||||
// Distributed under the GPLv3 software license, see the accompanying
|
||||
// file COPYING or https://www.gnu.org/licenses/gpl-3.0.en.html
|
||||
/*-
|
||||
* Copyright (c) 2003 Lev Walkin <vlm@lionet.info>. All rights reserved.
|
||||
* Redistribution and modifications are permitted subject to BSD license.
|
||||
*/
|
||||
#ifndef _BIT_STRING_H_
|
||||
#define _BIT_STRING_H_
|
||||
|
||||
#include <OCTET_STRING.h> /* Some help from OCTET STRING */
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
typedef struct BIT_STRING_s {
|
||||
uint8_t *buf; /* BIT STRING body */
|
||||
int size; /* Size of the above buffer */
|
||||
|
||||
int bits_unused;/* Unused trailing bits in the last octet (0..7) */
|
||||
|
||||
asn_struct_ctx_t _asn_ctx; /* Parsing across buffer boundaries */
|
||||
} BIT_STRING_t;
|
||||
|
||||
extern asn_TYPE_descriptor_t asn_DEF_BIT_STRING;
|
||||
|
||||
asn_struct_print_f BIT_STRING_print; /* Human-readable output */
|
||||
asn_constr_check_f BIT_STRING_constraint;
|
||||
xer_type_encoder_f BIT_STRING_encode_xer;
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _BIT_STRING_H_ */
|
||||
@@ -1,238 +0,0 @@
|
||||
// Copyright (c) 2016-2023 The Hush developers
|
||||
// Distributed under the GPLv3 software license, see the accompanying
|
||||
// file COPYING or https://www.gnu.org/licenses/gpl-3.0.en.html
|
||||
/*
|
||||
* Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
|
||||
* From ASN.1 module "Crypto-Conditions"
|
||||
* found in "CryptoConditions.asn"
|
||||
*/
|
||||
|
||||
#include "CompoundSha256Condition.h"
|
||||
|
||||
static int
|
||||
cost_3_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
|
||||
asn_app_constraint_failed_f *ctfailcb, void *app_key) {
|
||||
|
||||
if(!sptr) {
|
||||
ASN__CTFAIL(app_key, td, sptr,
|
||||
"%s: value not given (%s:%d)",
|
||||
td->name, __FILE__, __LINE__);
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
/* Constraint check succeeded */
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* This type is implemented using NativeInteger,
|
||||
* so here we adjust the DEF accordingly.
|
||||
*/
|
||||
static void
|
||||
cost_3_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
|
||||
td->free_struct = asn_DEF_NativeInteger.free_struct;
|
||||
td->print_struct = asn_DEF_NativeInteger.print_struct;
|
||||
td->check_constraints = asn_DEF_NativeInteger.check_constraints;
|
||||
td->ber_decoder = asn_DEF_NativeInteger.ber_decoder;
|
||||
td->der_encoder = asn_DEF_NativeInteger.der_encoder;
|
||||
td->xer_decoder = asn_DEF_NativeInteger.xer_decoder;
|
||||
td->xer_encoder = asn_DEF_NativeInteger.xer_encoder;
|
||||
td->uper_decoder = asn_DEF_NativeInteger.uper_decoder;
|
||||
td->uper_encoder = asn_DEF_NativeInteger.uper_encoder;
|
||||
if(!td->per_constraints)
|
||||
td->per_constraints = asn_DEF_NativeInteger.per_constraints;
|
||||
td->elements = asn_DEF_NativeInteger.elements;
|
||||
td->elements_count = asn_DEF_NativeInteger.elements_count;
|
||||
/* td->specifics = asn_DEF_NativeInteger.specifics; // Defined explicitly */
|
||||
}
|
||||
|
||||
static void
|
||||
cost_3_free(asn_TYPE_descriptor_t *td,
|
||||
void *struct_ptr, int contents_only) {
|
||||
cost_3_inherit_TYPE_descriptor(td);
|
||||
td->free_struct(td, struct_ptr, contents_only);
|
||||
}
|
||||
|
||||
static int
|
||||
cost_3_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
|
||||
int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
|
||||
cost_3_inherit_TYPE_descriptor(td);
|
||||
return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
|
||||
}
|
||||
|
||||
static asn_dec_rval_t
|
||||
cost_3_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
|
||||
void **structure, const void *bufptr, size_t size, int tag_mode) {
|
||||
cost_3_inherit_TYPE_descriptor(td);
|
||||
return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
|
||||
}
|
||||
|
||||
static asn_enc_rval_t
|
||||
cost_3_encode_der(asn_TYPE_descriptor_t *td,
|
||||
void *structure, int tag_mode, ber_tlv_tag_t tag,
|
||||
asn_app_consume_bytes_f *cb, void *app_key) {
|
||||
cost_3_inherit_TYPE_descriptor(td);
|
||||
return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
|
||||
}
|
||||
|
||||
static asn_dec_rval_t
|
||||
cost_3_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
|
||||
void **structure, const char *opt_mname, const void *bufptr, size_t size) {
|
||||
cost_3_inherit_TYPE_descriptor(td);
|
||||
return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
|
||||
}
|
||||
|
||||
static asn_enc_rval_t
|
||||
cost_3_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
|
||||
int ilevel, enum xer_encoder_flags_e flags,
|
||||
asn_app_consume_bytes_f *cb, void *app_key) {
|
||||
cost_3_inherit_TYPE_descriptor(td);
|
||||
return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
|
||||
}
|
||||
|
||||
static int
|
||||
memb_fingerprint_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
|
||||
asn_app_constraint_failed_f *ctfailcb, void *app_key) {
|
||||
const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr;
|
||||
size_t size;
|
||||
|
||||
if(!sptr) {
|
||||
ASN__CTFAIL(app_key, td, sptr,
|
||||
"%s: value not given (%s:%d)",
|
||||
td->name, __FILE__, __LINE__);
|
||||
return -1;
|
||||
}
|
||||
|
||||
size = st->size;
|
||||
|
||||
if((size == 32)) {
|
||||
/* Constraint check succeeded */
|
||||
return 0;
|
||||
} else {
|
||||
ASN__CTFAIL(app_key, td, sptr,
|
||||
"%s: constraint failed (%s:%d)",
|
||||
td->name, __FILE__, __LINE__);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
static int
|
||||
memb_cost_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
|
||||
asn_app_constraint_failed_f *ctfailcb, void *app_key) {
|
||||
|
||||
if(!sptr) {
|
||||
ASN__CTFAIL(app_key, td, sptr,
|
||||
"%s: value not given (%s:%d)",
|
||||
td->name, __FILE__, __LINE__);
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
/* Constraint check succeeded */
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const asn_INTEGER_specifics_t asn_SPC_cost_specs_3 = {
|
||||
0, 0, 0, 0, 0,
|
||||
0, /* Native long size */
|
||||
1 /* Unsigned representation */
|
||||
};
|
||||
static const ber_tlv_tag_t asn_DEF_cost_tags_3[] = {
|
||||
(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
|
||||
(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
|
||||
};
|
||||
static /* Use -fall-defs-global to expose */
|
||||
asn_TYPE_descriptor_t asn_DEF_cost_3 = {
|
||||
"cost",
|
||||
"cost",
|
||||
cost_3_free,
|
||||
cost_3_print,
|
||||
cost_3_constraint,
|
||||
cost_3_decode_ber,
|
||||
cost_3_encode_der,
|
||||
cost_3_decode_xer,
|
||||
cost_3_encode_xer,
|
||||
0, 0, /* No PER support, use "-gen-PER" to enable */
|
||||
0, /* Use generic outmost tag fetcher */
|
||||
asn_DEF_cost_tags_3,
|
||||
sizeof(asn_DEF_cost_tags_3)
|
||||
/sizeof(asn_DEF_cost_tags_3[0]) - 1, /* 1 */
|
||||
asn_DEF_cost_tags_3, /* Same as above */
|
||||
sizeof(asn_DEF_cost_tags_3)
|
||||
/sizeof(asn_DEF_cost_tags_3[0]), /* 2 */
|
||||
0, /* No PER visible constraints */
|
||||
0, 0, /* No members */
|
||||
&asn_SPC_cost_specs_3 /* Additional specs */
|
||||
};
|
||||
|
||||
static asn_TYPE_member_t asn_MBR_CompoundSha256Condition_1[] = {
|
||||
{ ATF_NOFLAGS, 0, offsetof(struct CompoundSha256Condition, fingerprint),
|
||||
(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
|
||||
-1, /* IMPLICIT tag at current level */
|
||||
&asn_DEF_OCTET_STRING,
|
||||
memb_fingerprint_constraint_1,
|
||||
0, /* PER is not compiled, use -gen-PER */
|
||||
0,
|
||||
"fingerprint"
|
||||
},
|
||||
{ ATF_NOFLAGS, 0, offsetof(struct CompoundSha256Condition, cost),
|
||||
(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
|
||||
-1, /* IMPLICIT tag at current level */
|
||||
&asn_DEF_cost_3,
|
||||
memb_cost_constraint_1,
|
||||
0, /* PER is not compiled, use -gen-PER */
|
||||
0,
|
||||
"cost"
|
||||
},
|
||||
{ ATF_NOFLAGS, 0, offsetof(struct CompoundSha256Condition, subtypes),
|
||||
(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
|
||||
-1, /* IMPLICIT tag at current level */
|
||||
&asn_DEF_ConditionTypes,
|
||||
0, /* Defer constraints checking to the member type */
|
||||
0, /* PER is not compiled, use -gen-PER */
|
||||
0,
|
||||
"subtypes"
|
||||
},
|
||||
};
|
||||
static const ber_tlv_tag_t asn_DEF_CompoundSha256Condition_tags_1[] = {
|
||||
(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
|
||||
};
|
||||
static const asn_TYPE_tag2member_t asn_MAP_CompoundSha256Condition_tag2el_1[] = {
|
||||
{ (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* fingerprint */
|
||||
{ (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* cost */
|
||||
{ (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* subtypes */
|
||||
};
|
||||
static asn_SEQUENCE_specifics_t asn_SPC_CompoundSha256Condition_specs_1 = {
|
||||
sizeof(struct CompoundSha256Condition),
|
||||
offsetof(struct CompoundSha256Condition, _asn_ctx),
|
||||
asn_MAP_CompoundSha256Condition_tag2el_1,
|
||||
3, /* Count of tags in the map */
|
||||
0, 0, 0, /* Optional elements (not needed) */
|
||||
-1, /* Start extensions */
|
||||
-1 /* Stop extensions */
|
||||
};
|
||||
asn_TYPE_descriptor_t asn_DEF_CompoundSha256Condition = {
|
||||
"CompoundSha256Condition",
|
||||
"CompoundSha256Condition",
|
||||
SEQUENCE_free,
|
||||
SEQUENCE_print,
|
||||
SEQUENCE_constraint,
|
||||
SEQUENCE_decode_ber,
|
||||
SEQUENCE_encode_der,
|
||||
SEQUENCE_decode_xer,
|
||||
SEQUENCE_encode_xer,
|
||||
0, 0, /* No PER support, use "-gen-PER" to enable */
|
||||
0, /* Use generic outmost tag fetcher */
|
||||
asn_DEF_CompoundSha256Condition_tags_1,
|
||||
sizeof(asn_DEF_CompoundSha256Condition_tags_1)
|
||||
/sizeof(asn_DEF_CompoundSha256Condition_tags_1[0]), /* 1 */
|
||||
asn_DEF_CompoundSha256Condition_tags_1, /* Same as above */
|
||||
sizeof(asn_DEF_CompoundSha256Condition_tags_1)
|
||||
/sizeof(asn_DEF_CompoundSha256Condition_tags_1[0]), /* 1 */
|
||||
0, /* No PER visible constraints */
|
||||
asn_MBR_CompoundSha256Condition_1,
|
||||
3, /* Elements count */
|
||||
&asn_SPC_CompoundSha256Condition_specs_1 /* Additional specs */
|
||||
};
|
||||
|
||||
@@ -1,45 +0,0 @@
|
||||
// Copyright (c) 2016-2023 The Hush developers
|
||||
// Distributed under the GPLv3 software license, see the accompanying
|
||||
// file COPYING or https://www.gnu.org/licenses/gpl-3.0.en.html
|
||||
/*
|
||||
* Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
|
||||
* From ASN.1 module "Crypto-Conditions"
|
||||
* found in "CryptoConditions.asn"
|
||||
*/
|
||||
|
||||
#ifndef _CompoundSha256Condition_H_
|
||||
#define _CompoundSha256Condition_H_
|
||||
|
||||
|
||||
#include "asn_application.h"
|
||||
|
||||
/* Including external dependencies */
|
||||
#include <OCTET_STRING.h>
|
||||
#include <NativeInteger.h>
|
||||
#include "ConditionTypes.h"
|
||||
#include <constr_SEQUENCE.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* CompoundSha256Condition */
|
||||
typedef struct CompoundSha256Condition {
|
||||
OCTET_STRING_t fingerprint;
|
||||
unsigned long cost;
|
||||
ConditionTypes_t subtypes;
|
||||
|
||||
/* Context for parsing across buffer boundaries */
|
||||
asn_struct_ctx_t _asn_ctx;
|
||||
} CompoundSha256Condition_t;
|
||||
|
||||
/* Implementation */
|
||||
/* extern asn_TYPE_descriptor_t asn_DEF_cost_3; // (Use -fall-defs-global to expose) */
|
||||
extern asn_TYPE_descriptor_t asn_DEF_CompoundSha256Condition;
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _CompoundSha256Condition_H_ */
|
||||
#include <asn_internal.h>
|
||||
@@ -1,117 +0,0 @@
|
||||
// Copyright (c) 2016-2023 The Hush developers
|
||||
// Distributed under the GPLv3 software license, see the accompanying
|
||||
// file COPYING or https://www.gnu.org/licenses/gpl-3.0.en.html
|
||||
/*
|
||||
* Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
|
||||
* From ASN.1 module "Crypto-Conditions"
|
||||
* found in "CryptoConditions.asn"
|
||||
*/
|
||||
|
||||
#include "Condition.h"
|
||||
|
||||
static asn_TYPE_member_t asn_MBR_Condition_1[] = {
|
||||
{ ATF_NOFLAGS, 0, offsetof(struct Condition, choice.preimageSha256),
|
||||
(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
|
||||
-1, /* IMPLICIT tag at current level */
|
||||
&asn_DEF_SimpleSha256Condition,
|
||||
0, /* Defer constraints checking to the member type */
|
||||
0, /* PER is not compiled, use -gen-PER */
|
||||
0,
|
||||
"preimageSha256"
|
||||
},
|
||||
{ ATF_NOFLAGS, 0, offsetof(struct Condition, choice.prefixSha256),
|
||||
(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
|
||||
-1, /* IMPLICIT tag at current level */
|
||||
&asn_DEF_CompoundSha256Condition,
|
||||
0, /* Defer constraints checking to the member type */
|
||||
0, /* PER is not compiled, use -gen-PER */
|
||||
0,
|
||||
"prefixSha256"
|
||||
},
|
||||
{ ATF_NOFLAGS, 0, offsetof(struct Condition, choice.thresholdSha256),
|
||||
(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
|
||||
-1, /* IMPLICIT tag at current level */
|
||||
&asn_DEF_CompoundSha256Condition,
|
||||
0, /* Defer constraints checking to the member type */
|
||||
0, /* PER is not compiled, use -gen-PER */
|
||||
0,
|
||||
"thresholdSha256"
|
||||
},
|
||||
{ ATF_NOFLAGS, 0, offsetof(struct Condition, choice.rsaSha256),
|
||||
(ASN_TAG_CLASS_CONTEXT | (3 << 2)),
|
||||
-1, /* IMPLICIT tag at current level */
|
||||
&asn_DEF_SimpleSha256Condition,
|
||||
0, /* Defer constraints checking to the member type */
|
||||
0, /* PER is not compiled, use -gen-PER */
|
||||
0,
|
||||
"rsaSha256"
|
||||
},
|
||||
{ ATF_NOFLAGS, 0, offsetof(struct Condition, choice.ed25519Sha256),
|
||||
(ASN_TAG_CLASS_CONTEXT | (4 << 2)),
|
||||
-1, /* IMPLICIT tag at current level */
|
||||
&asn_DEF_SimpleSha256Condition,
|
||||
0, /* Defer constraints checking to the member type */
|
||||
0, /* PER is not compiled, use -gen-PER */
|
||||
0,
|
||||
"ed25519Sha256"
|
||||
},
|
||||
{ ATF_NOFLAGS, 0, offsetof(struct Condition, choice.secp256k1Sha256),
|
||||
(ASN_TAG_CLASS_CONTEXT | (5 << 2)),
|
||||
-1, /* IMPLICIT tag at current level */
|
||||
&asn_DEF_SimpleSha256Condition,
|
||||
0, /* Defer constraints checking to the member type */
|
||||
0, /* PER is not compiled, use -gen-PER */
|
||||
0,
|
||||
"secp256k1Sha256"
|
||||
},
|
||||
{ ATF_NOFLAGS, 0, offsetof(struct Condition, choice.evalSha256),
|
||||
(ASN_TAG_CLASS_CONTEXT | (15 << 2)),
|
||||
-1, /* IMPLICIT tag at current level */
|
||||
&asn_DEF_SimpleSha256Condition,
|
||||
0, /* Defer constraints checking to the member type */
|
||||
0, /* PER is not compiled, use -gen-PER */
|
||||
0,
|
||||
"evalSha256"
|
||||
},
|
||||
};
|
||||
static const asn_TYPE_tag2member_t asn_MAP_Condition_tag2el_1[] = {
|
||||
{ (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* preimageSha256 */
|
||||
{ (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* prefixSha256 */
|
||||
{ (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* thresholdSha256 */
|
||||
{ (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* rsaSha256 */
|
||||
{ (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 4, 0, 0 }, /* ed25519Sha256 */
|
||||
{ (ASN_TAG_CLASS_CONTEXT | (5 << 2)), 5, 0, 0 }, /* secp256k1Sha256 */
|
||||
{ (ASN_TAG_CLASS_CONTEXT | (15 << 2)), 6, 0, 0 } /* evalSha256 */
|
||||
};
|
||||
static asn_CHOICE_specifics_t asn_SPC_Condition_specs_1 = {
|
||||
sizeof(struct Condition),
|
||||
offsetof(struct Condition, _asn_ctx),
|
||||
offsetof(struct Condition, present),
|
||||
sizeof(((struct Condition *)0)->present),
|
||||
asn_MAP_Condition_tag2el_1,
|
||||
7, /* Count of tags in the map */
|
||||
0,
|
||||
-1 /* Extensions start */
|
||||
};
|
||||
asn_TYPE_descriptor_t asn_DEF_Condition = {
|
||||
"Condition",
|
||||
"Condition",
|
||||
CHOICE_free,
|
||||
CHOICE_print,
|
||||
CHOICE_constraint,
|
||||
CHOICE_decode_ber,
|
||||
CHOICE_encode_der,
|
||||
CHOICE_decode_xer,
|
||||
CHOICE_encode_xer,
|
||||
0, 0, /* No PER support, use "-gen-PER" to enable */
|
||||
CHOICE_outmost_tag,
|
||||
0, /* No effective tags (pointer) */
|
||||
0, /* No effective tags (count) */
|
||||
0, /* No tags (pointer) */
|
||||
0, /* No tags (count) */
|
||||
0, /* No PER visible constraints */
|
||||
asn_MBR_Condition_1,
|
||||
7, /* Elements count */
|
||||
&asn_SPC_Condition_specs_1 /* Additional specs */
|
||||
};
|
||||
|
||||
@@ -1,62 +0,0 @@
|
||||
// Copyright (c) 2016-2023 The Hush developers
|
||||
// Distributed under the GPLv3 software license, see the accompanying
|
||||
// file COPYING or https://www.gnu.org/licenses/gpl-3.0.en.html
|
||||
/*
|
||||
* Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
|
||||
* From ASN.1 module "Crypto-Conditions"
|
||||
* found in "CryptoConditions.asn"
|
||||
*/
|
||||
|
||||
#ifndef _Condition_H_
|
||||
#define _Condition_H_
|
||||
|
||||
|
||||
#include "asn_application.h"
|
||||
|
||||
/* Including external dependencies */
|
||||
#include "SimpleSha256Condition.h"
|
||||
#include "CompoundSha256Condition.h"
|
||||
#include <constr_CHOICE.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* Dependencies */
|
||||
typedef enum Condition_PR {
|
||||
Condition_PR_NOTHING, /* No components present */
|
||||
Condition_PR_preimageSha256,
|
||||
Condition_PR_prefixSha256,
|
||||
Condition_PR_thresholdSha256,
|
||||
Condition_PR_rsaSha256,
|
||||
Condition_PR_ed25519Sha256,
|
||||
Condition_PR_secp256k1Sha256,
|
||||
Condition_PR_evalSha256
|
||||
} Condition_PR;
|
||||
|
||||
/* Condition */
|
||||
typedef struct Condition {
|
||||
Condition_PR present;
|
||||
union Condition_u {
|
||||
SimpleSha256Condition_t preimageSha256;
|
||||
CompoundSha256Condition_t prefixSha256;
|
||||
CompoundSha256Condition_t thresholdSha256;
|
||||
SimpleSha256Condition_t rsaSha256;
|
||||
SimpleSha256Condition_t ed25519Sha256;
|
||||
SimpleSha256Condition_t secp256k1Sha256;
|
||||
SimpleSha256Condition_t evalSha256;
|
||||
} choice;
|
||||
|
||||
/* Context for parsing across buffer boundaries */
|
||||
asn_struct_ctx_t _asn_ctx;
|
||||
} Condition_t;
|
||||
|
||||
/* Implementation */
|
||||
extern asn_TYPE_descriptor_t asn_DEF_Condition;
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _Condition_H_ */
|
||||
#include <asn_internal.h>
|
||||
@@ -1,111 +0,0 @@
|
||||
// Copyright (c) 2016-2023 The Hush developers
|
||||
// Distributed under the GPLv3 software license, see the accompanying
|
||||
// file COPYING or https://www.gnu.org/licenses/gpl-3.0.en.html
|
||||
/*
|
||||
* Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
|
||||
* From ASN.1 module "Crypto-Conditions"
|
||||
* found in "CryptoConditions.asn"
|
||||
*/
|
||||
|
||||
#include "ConditionTypes.h"
|
||||
|
||||
int
|
||||
ConditionTypes_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
|
||||
asn_app_constraint_failed_f *ctfailcb, void *app_key) {
|
||||
/* Replace with underlying type checker */
|
||||
td->check_constraints = asn_DEF_BIT_STRING.check_constraints;
|
||||
return td->check_constraints(td, sptr, ctfailcb, app_key);
|
||||
}
|
||||
|
||||
/*
|
||||
* This type is implemented using BIT_STRING,
|
||||
* so here we adjust the DEF accordingly.
|
||||
*/
|
||||
static void
|
||||
ConditionTypes_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
|
||||
td->free_struct = asn_DEF_BIT_STRING.free_struct;
|
||||
td->print_struct = asn_DEF_BIT_STRING.print_struct;
|
||||
td->check_constraints = asn_DEF_BIT_STRING.check_constraints;
|
||||
td->ber_decoder = asn_DEF_BIT_STRING.ber_decoder;
|
||||
td->der_encoder = asn_DEF_BIT_STRING.der_encoder;
|
||||
td->xer_decoder = asn_DEF_BIT_STRING.xer_decoder;
|
||||
td->xer_encoder = asn_DEF_BIT_STRING.xer_encoder;
|
||||
td->uper_decoder = asn_DEF_BIT_STRING.uper_decoder;
|
||||
td->uper_encoder = asn_DEF_BIT_STRING.uper_encoder;
|
||||
if(!td->per_constraints)
|
||||
td->per_constraints = asn_DEF_BIT_STRING.per_constraints;
|
||||
td->elements = asn_DEF_BIT_STRING.elements;
|
||||
td->elements_count = asn_DEF_BIT_STRING.elements_count;
|
||||
td->specifics = asn_DEF_BIT_STRING.specifics;
|
||||
}
|
||||
|
||||
void
|
||||
ConditionTypes_free(asn_TYPE_descriptor_t *td,
|
||||
void *struct_ptr, int contents_only) {
|
||||
ConditionTypes_1_inherit_TYPE_descriptor(td);
|
||||
td->free_struct(td, struct_ptr, contents_only);
|
||||
}
|
||||
|
||||
int
|
||||
ConditionTypes_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
|
||||
int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
|
||||
ConditionTypes_1_inherit_TYPE_descriptor(td);
|
||||
return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
|
||||
}
|
||||
|
||||
asn_dec_rval_t
|
||||
ConditionTypes_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
|
||||
void **structure, const void *bufptr, size_t size, int tag_mode) {
|
||||
ConditionTypes_1_inherit_TYPE_descriptor(td);
|
||||
return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
|
||||
}
|
||||
|
||||
asn_enc_rval_t
|
||||
ConditionTypes_encode_der(asn_TYPE_descriptor_t *td,
|
||||
void *structure, int tag_mode, ber_tlv_tag_t tag,
|
||||
asn_app_consume_bytes_f *cb, void *app_key) {
|
||||
ConditionTypes_1_inherit_TYPE_descriptor(td);
|
||||
return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
|
||||
}
|
||||
|
||||
asn_dec_rval_t
|
||||
ConditionTypes_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
|
||||
void **structure, const char *opt_mname, const void *bufptr, size_t size) {
|
||||
ConditionTypes_1_inherit_TYPE_descriptor(td);
|
||||
return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
|
||||
}
|
||||
|
||||
asn_enc_rval_t
|
||||
ConditionTypes_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
|
||||
int ilevel, enum xer_encoder_flags_e flags,
|
||||
asn_app_consume_bytes_f *cb, void *app_key) {
|
||||
ConditionTypes_1_inherit_TYPE_descriptor(td);
|
||||
return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
|
||||
}
|
||||
|
||||
static const ber_tlv_tag_t asn_DEF_ConditionTypes_tags_1[] = {
|
||||
(ASN_TAG_CLASS_UNIVERSAL | (3 << 2))
|
||||
};
|
||||
asn_TYPE_descriptor_t asn_DEF_ConditionTypes = {
|
||||
"ConditionTypes",
|
||||
"ConditionTypes",
|
||||
ConditionTypes_free,
|
||||
ConditionTypes_print,
|
||||
ConditionTypes_constraint,
|
||||
ConditionTypes_decode_ber,
|
||||
ConditionTypes_encode_der,
|
||||
ConditionTypes_decode_xer,
|
||||
ConditionTypes_encode_xer,
|
||||
0, 0, /* No PER support, use "-gen-PER" to enable */
|
||||
0, /* Use generic outmost tag fetcher */
|
||||
asn_DEF_ConditionTypes_tags_1,
|
||||
sizeof(asn_DEF_ConditionTypes_tags_1)
|
||||
/sizeof(asn_DEF_ConditionTypes_tags_1[0]), /* 1 */
|
||||
asn_DEF_ConditionTypes_tags_1, /* Same as above */
|
||||
sizeof(asn_DEF_ConditionTypes_tags_1)
|
||||
/sizeof(asn_DEF_ConditionTypes_tags_1[0]), /* 1 */
|
||||
0, /* No PER visible constraints */
|
||||
0, 0, /* Defined elsewhere */
|
||||
0 /* No specifics */
|
||||
};
|
||||
|
||||
@@ -1,52 +0,0 @@
|
||||
// Copyright (c) 2016-2023 The Hush developers
|
||||
// Distributed under the GPLv3 software license, see the accompanying
|
||||
// file COPYING or https://www.gnu.org/licenses/gpl-3.0.en.html
|
||||
/*
|
||||
* Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
|
||||
* From ASN.1 module "Crypto-Conditions"
|
||||
* found in "CryptoConditions.asn"
|
||||
*/
|
||||
|
||||
#ifndef _ConditionTypes_H_
|
||||
#define _ConditionTypes_H_
|
||||
|
||||
|
||||
#include "asn_application.h"
|
||||
|
||||
/* Including external dependencies */
|
||||
#include <BIT_STRING.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* Dependencies */
|
||||
typedef enum ConditionTypes {
|
||||
ConditionTypes_preImageSha256 = 0,
|
||||
ConditionTypes_prefixSha256 = 1,
|
||||
ConditionTypes_thresholdSha256 = 2,
|
||||
ConditionTypes_rsaSha256 = 3,
|
||||
ConditionTypes_ed25519Sha256 = 4,
|
||||
ConditionTypes_secp256k1Sha256 = 5,
|
||||
ConditionTypes_evalSha256 = 15
|
||||
} e_ConditionTypes;
|
||||
|
||||
/* ConditionTypes */
|
||||
typedef BIT_STRING_t ConditionTypes_t;
|
||||
|
||||
/* Implementation */
|
||||
extern asn_TYPE_descriptor_t asn_DEF_ConditionTypes;
|
||||
asn_struct_free_f ConditionTypes_free;
|
||||
asn_struct_print_f ConditionTypes_print;
|
||||
asn_constr_check_f ConditionTypes_constraint;
|
||||
ber_type_decoder_f ConditionTypes_decode_ber;
|
||||
der_type_encoder_f ConditionTypes_encode_der;
|
||||
xer_type_decoder_f ConditionTypes_decode_xer;
|
||||
xer_type_encoder_f ConditionTypes_encode_xer;
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _ConditionTypes_H_ */
|
||||
#include <asn_internal.h>
|
||||
@@ -1,113 +0,0 @@
|
||||
--<ASN1.PDU Crypto-Conditions.Condition, Crypto-Conditions.Fulfillment>--
|
||||
|
||||
Crypto-Conditions DEFINITIONS AUTOMATIC TAGS ::= BEGIN
|
||||
|
||||
-- Conditions
|
||||
|
||||
Condition ::= CHOICE {
|
||||
preimageSha256 [0] SimpleSha256Condition,
|
||||
prefixSha256 [1] CompoundSha256Condition,
|
||||
thresholdSha256 [2] CompoundSha256Condition,
|
||||
rsaSha256 [3] SimpleSha256Condition,
|
||||
ed25519Sha256 [4] SimpleSha256Condition,
|
||||
secp256k1Sha256 [5] SimpleSha256Condition,
|
||||
evalSha256 [15] SimpleSha256Condition
|
||||
}
|
||||
|
||||
SimpleSha256Condition ::= SEQUENCE {
|
||||
fingerprint OCTET STRING (SIZE(32)),
|
||||
cost INTEGER (0..4294967295)
|
||||
}
|
||||
|
||||
CompoundSha256Condition ::= SEQUENCE {
|
||||
fingerprint OCTET STRING (SIZE(32)),
|
||||
cost INTEGER (0..4294967295),
|
||||
subtypes ConditionTypes
|
||||
}
|
||||
|
||||
ConditionTypes ::= BIT STRING {
|
||||
preImageSha256 (0),
|
||||
prefixSha256 (1),
|
||||
thresholdSha256 (2),
|
||||
rsaSha256 (3),
|
||||
ed25519Sha256 (4),
|
||||
secp256k1Sha256 (5),
|
||||
evalSha256 (15)
|
||||
}
|
||||
|
||||
-- Fulfillments
|
||||
|
||||
Fulfillment ::= CHOICE {
|
||||
preimageSha256 [0] PreimageFulfillment ,
|
||||
prefixSha256 [1] PrefixFulfillment,
|
||||
thresholdSha256 [2] ThresholdFulfillment,
|
||||
rsaSha256 [3] RsaSha256Fulfillment,
|
||||
ed25519Sha256 [4] Ed25519Sha512Fulfillment,
|
||||
secp256k1Sha256 [5] Secp256k1Fulfillment,
|
||||
evalSha256 [15] EvalFulfillment
|
||||
}
|
||||
|
||||
PreimageFulfillment ::= SEQUENCE {
|
||||
preimage OCTET STRING
|
||||
}
|
||||
|
||||
PrefixFulfillment ::= SEQUENCE {
|
||||
prefix OCTET STRING,
|
||||
maxMessageLength INTEGER (0..4294967295),
|
||||
subfulfillment Fulfillment
|
||||
}
|
||||
|
||||
ThresholdFulfillment ::= SEQUENCE {
|
||||
subfulfillments SET OF Fulfillment,
|
||||
subconditions SET OF Condition
|
||||
}
|
||||
|
||||
RsaSha256Fulfillment ::= SEQUENCE {
|
||||
modulus OCTET STRING,
|
||||
signature OCTET STRING
|
||||
}
|
||||
|
||||
Ed25519Sha512Fulfillment ::= SEQUENCE {
|
||||
publicKey OCTET STRING (SIZE(32)),
|
||||
signature OCTET STRING (SIZE(64))
|
||||
}
|
||||
|
||||
Secp256k1Fulfillment ::= SEQUENCE {
|
||||
publicKey OCTET STRING (SIZE(33)),
|
||||
signature OCTET STRING (SIZE(64))
|
||||
}
|
||||
|
||||
EvalFulfillment ::= SEQUENCE {
|
||||
code OCTET STRING
|
||||
}
|
||||
|
||||
-- Fingerprint Content
|
||||
|
||||
-- The PREIMAGE-SHA-256 condition fingerprint content is not DER encoded
|
||||
-- The fingerprint content is the preimage
|
||||
-- Same for Eval
|
||||
|
||||
PrefixFingerprintContents ::= SEQUENCE {
|
||||
prefix OCTET STRING,
|
||||
maxMessageLength INTEGER (0..4294967295),
|
||||
subcondition Condition
|
||||
}
|
||||
|
||||
ThresholdFingerprintContents ::= SEQUENCE {
|
||||
threshold INTEGER (1..65535),
|
||||
subconditions2 SET OF Condition
|
||||
}
|
||||
|
||||
RsaFingerprintContents ::= SEQUENCE {
|
||||
modulus OCTET STRING
|
||||
}
|
||||
|
||||
Ed25519FingerprintContents ::= SEQUENCE {
|
||||
publicKey OCTET STRING (SIZE(32))
|
||||
}
|
||||
|
||||
Secp256k1FingerprintContents ::= SEQUENCE {
|
||||
publicKey OCTET STRING (SIZE(33))
|
||||
}
|
||||
|
||||
END
|
||||
@@ -1,87 +0,0 @@
|
||||
// Copyright (c) 2016-2023 The Hush developers
|
||||
// Distributed under the GPLv3 software license, see the accompanying
|
||||
// file COPYING or https://www.gnu.org/licenses/gpl-3.0.en.html
|
||||
/*
|
||||
* Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
|
||||
* From ASN.1 module "Crypto-Conditions"
|
||||
* found in "CryptoConditions.asn"
|
||||
*/
|
||||
|
||||
#include "Ed25519FingerprintContents.h"
|
||||
|
||||
static int
|
||||
memb_publicKey_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
|
||||
asn_app_constraint_failed_f *ctfailcb, void *app_key) {
|
||||
const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr;
|
||||
size_t size;
|
||||
|
||||
if(!sptr) {
|
||||
ASN__CTFAIL(app_key, td, sptr,
|
||||
"%s: value not given (%s:%d)",
|
||||
td->name, __FILE__, __LINE__);
|
||||
return -1;
|
||||
}
|
||||
|
||||
size = st->size;
|
||||
|
||||
if((size == 32)) {
|
||||
/* Constraint check succeeded */
|
||||
return 0;
|
||||
} else {
|
||||
ASN__CTFAIL(app_key, td, sptr,
|
||||
"%s: constraint failed (%s:%d)",
|
||||
td->name, __FILE__, __LINE__);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
static asn_TYPE_member_t asn_MBR_Ed25519FingerprintContents_1[] = {
|
||||
{ ATF_NOFLAGS, 0, offsetof(struct Ed25519FingerprintContents, publicKey),
|
||||
(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
|
||||
-1, /* IMPLICIT tag at current level */
|
||||
&asn_DEF_OCTET_STRING,
|
||||
memb_publicKey_constraint_1,
|
||||
0, /* PER is not compiled, use -gen-PER */
|
||||
0,
|
||||
"publicKey"
|
||||
},
|
||||
};
|
||||
static const ber_tlv_tag_t asn_DEF_Ed25519FingerprintContents_tags_1[] = {
|
||||
(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
|
||||
};
|
||||
static const asn_TYPE_tag2member_t asn_MAP_Ed25519FingerprintContents_tag2el_1[] = {
|
||||
{ (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* publicKey */
|
||||
};
|
||||
static asn_SEQUENCE_specifics_t asn_SPC_Ed25519FingerprintContents_specs_1 = {
|
||||
sizeof(struct Ed25519FingerprintContents),
|
||||
offsetof(struct Ed25519FingerprintContents, _asn_ctx),
|
||||
asn_MAP_Ed25519FingerprintContents_tag2el_1,
|
||||
1, /* Count of tags in the map */
|
||||
0, 0, 0, /* Optional elements (not needed) */
|
||||
-1, /* Start extensions */
|
||||
-1 /* Stop extensions */
|
||||
};
|
||||
asn_TYPE_descriptor_t asn_DEF_Ed25519FingerprintContents = {
|
||||
"Ed25519FingerprintContents",
|
||||
"Ed25519FingerprintContents",
|
||||
SEQUENCE_free,
|
||||
SEQUENCE_print,
|
||||
SEQUENCE_constraint,
|
||||
SEQUENCE_decode_ber,
|
||||
SEQUENCE_encode_der,
|
||||
SEQUENCE_decode_xer,
|
||||
SEQUENCE_encode_xer,
|
||||
0, 0, /* No PER support, use "-gen-PER" to enable */
|
||||
0, /* Use generic outmost tag fetcher */
|
||||
asn_DEF_Ed25519FingerprintContents_tags_1,
|
||||
sizeof(asn_DEF_Ed25519FingerprintContents_tags_1)
|
||||
/sizeof(asn_DEF_Ed25519FingerprintContents_tags_1[0]), /* 1 */
|
||||
asn_DEF_Ed25519FingerprintContents_tags_1, /* Same as above */
|
||||
sizeof(asn_DEF_Ed25519FingerprintContents_tags_1)
|
||||
/sizeof(asn_DEF_Ed25519FingerprintContents_tags_1[0]), /* 1 */
|
||||
0, /* No PER visible constraints */
|
||||
asn_MBR_Ed25519FingerprintContents_1,
|
||||
1, /* Elements count */
|
||||
&asn_SPC_Ed25519FingerprintContents_specs_1 /* Additional specs */
|
||||
};
|
||||
|
||||
@@ -1,40 +0,0 @@
|
||||
// Copyright (c) 2016-2023 The Hush developers
|
||||
// Distributed under the GPLv3 software license, see the accompanying
|
||||
// file COPYING or https://www.gnu.org/licenses/gpl-3.0.en.html
|
||||
/*
|
||||
* Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
|
||||
* From ASN.1 module "Crypto-Conditions"
|
||||
* found in "CryptoConditions.asn"
|
||||
*/
|
||||
|
||||
#ifndef _Ed25519FingerprintContents_H_
|
||||
#define _Ed25519FingerprintContents_H_
|
||||
|
||||
|
||||
#include "asn_application.h"
|
||||
|
||||
/* Including external dependencies */
|
||||
#include <OCTET_STRING.h>
|
||||
#include <constr_SEQUENCE.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* Ed25519FingerprintContents */
|
||||
typedef struct Ed25519FingerprintContents {
|
||||
OCTET_STRING_t publicKey;
|
||||
|
||||
/* Context for parsing across buffer boundaries */
|
||||
asn_struct_ctx_t _asn_ctx;
|
||||
} Ed25519FingerprintContents_t;
|
||||
|
||||
/* Implementation */
|
||||
extern asn_TYPE_descriptor_t asn_DEF_Ed25519FingerprintContents;
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _Ed25519FingerprintContents_H_ */
|
||||
#include <asn_internal.h>
|
||||
@@ -1,123 +0,0 @@
|
||||
// Copyright (c) 2016-2023 The Hush developers
|
||||
// Distributed under the GPLv3 software license, see the accompanying
|
||||
// file COPYING or https://www.gnu.org/licenses/gpl-3.0.en.html
|
||||
/*
|
||||
* Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
|
||||
* From ASN.1 module "Crypto-Conditions"
|
||||
* found in "CryptoConditions.asn"
|
||||
*/
|
||||
|
||||
#include "Ed25519Sha512Fulfillment.h"
|
||||
|
||||
static int
|
||||
memb_publicKey_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
|
||||
asn_app_constraint_failed_f *ctfailcb, void *app_key) {
|
||||
const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr;
|
||||
size_t size;
|
||||
|
||||
if(!sptr) {
|
||||
ASN__CTFAIL(app_key, td, sptr,
|
||||
"%s: value not given (%s:%d)",
|
||||
td->name, __FILE__, __LINE__);
|
||||
return -1;
|
||||
}
|
||||
|
||||
size = st->size;
|
||||
|
||||
if((size == 32)) {
|
||||
/* Constraint check succeeded */
|
||||
return 0;
|
||||
} else {
|
||||
ASN__CTFAIL(app_key, td, sptr,
|
||||
"%s: constraint failed (%s:%d)",
|
||||
td->name, __FILE__, __LINE__);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
static int
|
||||
memb_signature_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
|
||||
asn_app_constraint_failed_f *ctfailcb, void *app_key) {
|
||||
const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr;
|
||||
size_t size;
|
||||
|
||||
if(!sptr) {
|
||||
ASN__CTFAIL(app_key, td, sptr,
|
||||
"%s: value not given (%s:%d)",
|
||||
td->name, __FILE__, __LINE__);
|
||||
return -1;
|
||||
}
|
||||
|
||||
size = st->size;
|
||||
|
||||
if((size == 64)) {
|
||||
/* Constraint check succeeded */
|
||||
return 0;
|
||||
} else {
|
||||
ASN__CTFAIL(app_key, td, sptr,
|
||||
"%s: constraint failed (%s:%d)",
|
||||
td->name, __FILE__, __LINE__);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
static asn_TYPE_member_t asn_MBR_Ed25519Sha512Fulfillment_1[] = {
|
||||
{ ATF_NOFLAGS, 0, offsetof(struct Ed25519Sha512Fulfillment, publicKey),
|
||||
(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
|
||||
-1, /* IMPLICIT tag at current level */
|
||||
&asn_DEF_OCTET_STRING,
|
||||
memb_publicKey_constraint_1,
|
||||
0, /* PER is not compiled, use -gen-PER */
|
||||
0,
|
||||
"publicKey"
|
||||
},
|
||||
{ ATF_NOFLAGS, 0, offsetof(struct Ed25519Sha512Fulfillment, signature),
|
||||
(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
|
||||
-1, /* IMPLICIT tag at current level */
|
||||
&asn_DEF_OCTET_STRING,
|
||||
memb_signature_constraint_1,
|
||||
0, /* PER is not compiled, use -gen-PER */
|
||||
0,
|
||||
"signature"
|
||||
},
|
||||
};
|
||||
static const ber_tlv_tag_t asn_DEF_Ed25519Sha512Fulfillment_tags_1[] = {
|
||||
(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
|
||||
};
|
||||
static const asn_TYPE_tag2member_t asn_MAP_Ed25519Sha512Fulfillment_tag2el_1[] = {
|
||||
{ (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* publicKey */
|
||||
{ (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* signature */
|
||||
};
|
||||
static asn_SEQUENCE_specifics_t asn_SPC_Ed25519Sha512Fulfillment_specs_1 = {
|
||||
sizeof(struct Ed25519Sha512Fulfillment),
|
||||
offsetof(struct Ed25519Sha512Fulfillment, _asn_ctx),
|
||||
asn_MAP_Ed25519Sha512Fulfillment_tag2el_1,
|
||||
2, /* Count of tags in the map */
|
||||
0, 0, 0, /* Optional elements (not needed) */
|
||||
-1, /* Start extensions */
|
||||
-1 /* Stop extensions */
|
||||
};
|
||||
asn_TYPE_descriptor_t asn_DEF_Ed25519Sha512Fulfillment = {
|
||||
"Ed25519Sha512Fulfillment",
|
||||
"Ed25519Sha512Fulfillment",
|
||||
SEQUENCE_free,
|
||||
SEQUENCE_print,
|
||||
SEQUENCE_constraint,
|
||||
SEQUENCE_decode_ber,
|
||||
SEQUENCE_encode_der,
|
||||
SEQUENCE_decode_xer,
|
||||
SEQUENCE_encode_xer,
|
||||
0, 0, /* No PER support, use "-gen-PER" to enable */
|
||||
0, /* Use generic outmost tag fetcher */
|
||||
asn_DEF_Ed25519Sha512Fulfillment_tags_1,
|
||||
sizeof(asn_DEF_Ed25519Sha512Fulfillment_tags_1)
|
||||
/sizeof(asn_DEF_Ed25519Sha512Fulfillment_tags_1[0]), /* 1 */
|
||||
asn_DEF_Ed25519Sha512Fulfillment_tags_1, /* Same as above */
|
||||
sizeof(asn_DEF_Ed25519Sha512Fulfillment_tags_1)
|
||||
/sizeof(asn_DEF_Ed25519Sha512Fulfillment_tags_1[0]), /* 1 */
|
||||
0, /* No PER visible constraints */
|
||||
asn_MBR_Ed25519Sha512Fulfillment_1,
|
||||
2, /* Elements count */
|
||||
&asn_SPC_Ed25519Sha512Fulfillment_specs_1 /* Additional specs */
|
||||
};
|
||||
|
||||
@@ -1,41 +0,0 @@
|
||||
// Copyright (c) 2016-2023 The Hush developers
|
||||
// Distributed under the GPLv3 software license, see the accompanying
|
||||
// file COPYING or https://www.gnu.org/licenses/gpl-3.0.en.html
|
||||
/*
|
||||
* Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
|
||||
* From ASN.1 module "Crypto-Conditions"
|
||||
* found in "CryptoConditions.asn"
|
||||
*/
|
||||
|
||||
#ifndef _Ed25519Sha512Fulfillment_H_
|
||||
#define _Ed25519Sha512Fulfillment_H_
|
||||
|
||||
|
||||
#include "asn_application.h"
|
||||
|
||||
/* Including external dependencies */
|
||||
#include <OCTET_STRING.h>
|
||||
#include <constr_SEQUENCE.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* Ed25519Sha512Fulfillment */
|
||||
typedef struct Ed25519Sha512Fulfillment {
|
||||
OCTET_STRING_t publicKey;
|
||||
OCTET_STRING_t signature;
|
||||
|
||||
/* Context for parsing across buffer boundaries */
|
||||
asn_struct_ctx_t _asn_ctx;
|
||||
} Ed25519Sha512Fulfillment_t;
|
||||
|
||||
/* Implementation */
|
||||
extern asn_TYPE_descriptor_t asn_DEF_Ed25519Sha512Fulfillment;
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _Ed25519Sha512Fulfillment_H_ */
|
||||
#include <asn_internal.h>
|
||||
@@ -1,61 +0,0 @@
|
||||
// Copyright (c) 2016-2023 The Hush developers
|
||||
// Distributed under the GPLv3 software license, see the accompanying
|
||||
// file COPYING or https://www.gnu.org/licenses/gpl-3.0.en.html
|
||||
/*
|
||||
* Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
|
||||
* From ASN.1 module "Crypto-Conditions"
|
||||
* found in "CryptoConditions.asn"
|
||||
*/
|
||||
|
||||
#include "EvalFulfillment.h"
|
||||
|
||||
static asn_TYPE_member_t asn_MBR_EvalFulfillment_1[] = {
|
||||
{ ATF_NOFLAGS, 0, offsetof(struct EvalFulfillment, code),
|
||||
(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
|
||||
-1, /* IMPLICIT tag at current level */
|
||||
&asn_DEF_OCTET_STRING,
|
||||
0, /* Defer constraints checking to the member type */
|
||||
0, /* PER is not compiled, use -gen-PER */
|
||||
0,
|
||||
"code"
|
||||
},
|
||||
};
|
||||
static const ber_tlv_tag_t asn_DEF_EvalFulfillment_tags_1[] = {
|
||||
(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
|
||||
};
|
||||
static const asn_TYPE_tag2member_t asn_MAP_EvalFulfillment_tag2el_1[] = {
|
||||
{ (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* code */
|
||||
};
|
||||
static asn_SEQUENCE_specifics_t asn_SPC_EvalFulfillment_specs_1 = {
|
||||
sizeof(struct EvalFulfillment),
|
||||
offsetof(struct EvalFulfillment, _asn_ctx),
|
||||
asn_MAP_EvalFulfillment_tag2el_1,
|
||||
1, /* Count of tags in the map */
|
||||
0, 0, 0, /* Optional elements (not needed) */
|
||||
-1, /* Start extensions */
|
||||
-1 /* Stop extensions */
|
||||
};
|
||||
asn_TYPE_descriptor_t asn_DEF_EvalFulfillment = {
|
||||
"EvalFulfillment",
|
||||
"EvalFulfillment",
|
||||
SEQUENCE_free,
|
||||
SEQUENCE_print,
|
||||
SEQUENCE_constraint,
|
||||
SEQUENCE_decode_ber,
|
||||
SEQUENCE_encode_der,
|
||||
SEQUENCE_decode_xer,
|
||||
SEQUENCE_encode_xer,
|
||||
0, 0, /* No PER support, use "-gen-PER" to enable */
|
||||
0, /* Use generic outmost tag fetcher */
|
||||
asn_DEF_EvalFulfillment_tags_1,
|
||||
sizeof(asn_DEF_EvalFulfillment_tags_1)
|
||||
/sizeof(asn_DEF_EvalFulfillment_tags_1[0]), /* 1 */
|
||||
asn_DEF_EvalFulfillment_tags_1, /* Same as above */
|
||||
sizeof(asn_DEF_EvalFulfillment_tags_1)
|
||||
/sizeof(asn_DEF_EvalFulfillment_tags_1[0]), /* 1 */
|
||||
0, /* No PER visible constraints */
|
||||
asn_MBR_EvalFulfillment_1,
|
||||
1, /* Elements count */
|
||||
&asn_SPC_EvalFulfillment_specs_1 /* Additional specs */
|
||||
};
|
||||
|
||||
@@ -1,40 +0,0 @@
|
||||
// Copyright (c) 2016-2023 The Hush developers
|
||||
// Distributed under the GPLv3 software license, see the accompanying
|
||||
// file COPYING or https://www.gnu.org/licenses/gpl-3.0.en.html
|
||||
/*
|
||||
* Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
|
||||
* From ASN.1 module "Crypto-Conditions"
|
||||
* found in "CryptoConditions.asn"
|
||||
*/
|
||||
|
||||
#ifndef _EvalFulfillment_H_
|
||||
#define _EvalFulfillment_H_
|
||||
|
||||
|
||||
#include "asn_application.h"
|
||||
|
||||
/* Including external dependencies */
|
||||
#include <OCTET_STRING.h>
|
||||
#include <constr_SEQUENCE.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* EvalFulfillment */
|
||||
typedef struct EvalFulfillment {
|
||||
OCTET_STRING_t code;
|
||||
|
||||
/* Context for parsing across buffer boundaries */
|
||||
asn_struct_ctx_t _asn_ctx;
|
||||
} EvalFulfillment_t;
|
||||
|
||||
/* Implementation */
|
||||
extern asn_TYPE_descriptor_t asn_DEF_EvalFulfillment;
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _EvalFulfillment_H_ */
|
||||
#include <asn_internal.h>
|
||||
@@ -1,117 +0,0 @@
|
||||
// Copyright (c) 2016-2023 The Hush developers
|
||||
// Distributed under the GPLv3 software license, see the accompanying
|
||||
// file COPYING or https://www.gnu.org/licenses/gpl-3.0.en.html
|
||||
/*
|
||||
* Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
|
||||
* From ASN.1 module "Crypto-Conditions"
|
||||
* found in "CryptoConditions.asn"
|
||||
*/
|
||||
|
||||
#include "Fulfillment.h"
|
||||
|
||||
static asn_TYPE_member_t asn_MBR_Fulfillment_1[] = {
|
||||
{ ATF_NOFLAGS, 0, offsetof(struct Fulfillment, choice.preimageSha256),
|
||||
(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
|
||||
-1, /* IMPLICIT tag at current level */
|
||||
&asn_DEF_PreimageFulfillment,
|
||||
0, /* Defer constraints checking to the member type */
|
||||
0, /* PER is not compiled, use -gen-PER */
|
||||
0,
|
||||
"preimageSha256"
|
||||
},
|
||||
{ ATF_POINTER, 0, offsetof(struct Fulfillment, choice.prefixSha256),
|
||||
(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
|
||||
-1, /* IMPLICIT tag at current level */
|
||||
&asn_DEF_PrefixFulfillment,
|
||||
0, /* Defer constraints checking to the member type */
|
||||
0, /* PER is not compiled, use -gen-PER */
|
||||
0,
|
||||
"prefixSha256"
|
||||
},
|
||||
{ ATF_POINTER, 0, offsetof(struct Fulfillment, choice.thresholdSha256),
|
||||
(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
|
||||
-1, /* IMPLICIT tag at current level */
|
||||
&asn_DEF_ThresholdFulfillment,
|
||||
0, /* Defer constraints checking to the member type */
|
||||
0, /* PER is not compiled, use -gen-PER */
|
||||
0,
|
||||
"thresholdSha256"
|
||||
},
|
||||
{ ATF_NOFLAGS, 0, offsetof(struct Fulfillment, choice.rsaSha256),
|
||||
(ASN_TAG_CLASS_CONTEXT | (3 << 2)),
|
||||
-1, /* IMPLICIT tag at current level */
|
||||
&asn_DEF_RsaSha256Fulfillment,
|
||||
0, /* Defer constraints checking to the member type */
|
||||
0, /* PER is not compiled, use -gen-PER */
|
||||
0,
|
||||
"rsaSha256"
|
||||
},
|
||||
{ ATF_NOFLAGS, 0, offsetof(struct Fulfillment, choice.ed25519Sha256),
|
||||
(ASN_TAG_CLASS_CONTEXT | (4 << 2)),
|
||||
-1, /* IMPLICIT tag at current level */
|
||||
&asn_DEF_Ed25519Sha512Fulfillment,
|
||||
0, /* Defer constraints checking to the member type */
|
||||
0, /* PER is not compiled, use -gen-PER */
|
||||
0,
|
||||
"ed25519Sha256"
|
||||
},
|
||||
{ ATF_NOFLAGS, 0, offsetof(struct Fulfillment, choice.secp256k1Sha256),
|
||||
(ASN_TAG_CLASS_CONTEXT | (5 << 2)),
|
||||
-1, /* IMPLICIT tag at current level */
|
||||
&asn_DEF_Secp256k1Fulfillment,
|
||||
0, /* Defer constraints checking to the member type */
|
||||
0, /* PER is not compiled, use -gen-PER */
|
||||
0,
|
||||
"secp256k1Sha256"
|
||||
},
|
||||
{ ATF_NOFLAGS, 0, offsetof(struct Fulfillment, choice.evalSha256),
|
||||
(ASN_TAG_CLASS_CONTEXT | (15 << 2)),
|
||||
-1, /* IMPLICIT tag at current level */
|
||||
&asn_DEF_EvalFulfillment,
|
||||
0, /* Defer constraints checking to the member type */
|
||||
0, /* PER is not compiled, use -gen-PER */
|
||||
0,
|
||||
"evalSha256"
|
||||
},
|
||||
};
|
||||
static const asn_TYPE_tag2member_t asn_MAP_Fulfillment_tag2el_1[] = {
|
||||
{ (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* preimageSha256 */
|
||||
{ (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* prefixSha256 */
|
||||
{ (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* thresholdSha256 */
|
||||
{ (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* rsaSha256 */
|
||||
{ (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 4, 0, 0 }, /* ed25519Sha256 */
|
||||
{ (ASN_TAG_CLASS_CONTEXT | (5 << 2)), 5, 0, 0 }, /* secp256k1Sha256 */
|
||||
{ (ASN_TAG_CLASS_CONTEXT | (15 << 2)), 6, 0, 0 } /* evalSha256 */
|
||||
};
|
||||
static asn_CHOICE_specifics_t asn_SPC_Fulfillment_specs_1 = {
|
||||
sizeof(struct Fulfillment),
|
||||
offsetof(struct Fulfillment, _asn_ctx),
|
||||
offsetof(struct Fulfillment, present),
|
||||
sizeof(((struct Fulfillment *)0)->present),
|
||||
asn_MAP_Fulfillment_tag2el_1,
|
||||
7, /* Count of tags in the map */
|
||||
0,
|
||||
-1 /* Extensions start */
|
||||
};
|
||||
asn_TYPE_descriptor_t asn_DEF_Fulfillment = {
|
||||
"Fulfillment",
|
||||
"Fulfillment",
|
||||
CHOICE_free,
|
||||
CHOICE_print,
|
||||
CHOICE_constraint,
|
||||
CHOICE_decode_ber,
|
||||
CHOICE_encode_der,
|
||||
CHOICE_decode_xer,
|
||||
CHOICE_encode_xer,
|
||||
0, 0, /* No PER support, use "-gen-PER" to enable */
|
||||
CHOICE_outmost_tag,
|
||||
0, /* No effective tags (pointer) */
|
||||
0, /* No effective tags (count) */
|
||||
0, /* No tags (pointer) */
|
||||
0, /* No tags (count) */
|
||||
0, /* No PER visible constraints */
|
||||
asn_MBR_Fulfillment_1,
|
||||
7, /* Elements count */
|
||||
&asn_SPC_Fulfillment_specs_1 /* Additional specs */
|
||||
};
|
||||
|
||||
@@ -1,73 +0,0 @@
|
||||
// Copyright (c) 2016-2023 The Hush developers
|
||||
// Distributed under the GPLv3 software license, see the accompanying
|
||||
// file COPYING or https://www.gnu.org/licenses/gpl-3.0.en.html
|
||||
/*
|
||||
* Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
|
||||
* From ASN.1 module "Crypto-Conditions"
|
||||
* found in "CryptoConditions.asn"
|
||||
*/
|
||||
|
||||
#ifndef _Fulfillment_H_
|
||||
#define _Fulfillment_H_
|
||||
|
||||
|
||||
#include "asn_application.h"
|
||||
|
||||
/* Including external dependencies */
|
||||
#include "PreimageFulfillment.h"
|
||||
#include "RsaSha256Fulfillment.h"
|
||||
#include "Ed25519Sha512Fulfillment.h"
|
||||
#include "Secp256k1Fulfillment.h"
|
||||
#include "EvalFulfillment.h"
|
||||
#include <constr_CHOICE.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* Dependencies */
|
||||
typedef enum Fulfillment_PR {
|
||||
Fulfillment_PR_NOTHING, /* No components present */
|
||||
Fulfillment_PR_preimageSha256,
|
||||
Fulfillment_PR_prefixSha256,
|
||||
Fulfillment_PR_thresholdSha256,
|
||||
Fulfillment_PR_rsaSha256,
|
||||
Fulfillment_PR_ed25519Sha256,
|
||||
Fulfillment_PR_secp256k1Sha256,
|
||||
Fulfillment_PR_evalSha256
|
||||
} Fulfillment_PR;
|
||||
|
||||
/* Forward declarations */
|
||||
struct PrefixFulfillment;
|
||||
struct ThresholdFulfillment;
|
||||
|
||||
/* Fulfillment */
|
||||
typedef struct Fulfillment {
|
||||
Fulfillment_PR present;
|
||||
union Fulfillment_u {
|
||||
PreimageFulfillment_t preimageSha256;
|
||||
struct PrefixFulfillment *prefixSha256;
|
||||
struct ThresholdFulfillment *thresholdSha256;
|
||||
RsaSha256Fulfillment_t rsaSha256;
|
||||
Ed25519Sha512Fulfillment_t ed25519Sha256;
|
||||
Secp256k1Fulfillment_t secp256k1Sha256;
|
||||
EvalFulfillment_t evalSha256;
|
||||
} choice;
|
||||
|
||||
/* Context for parsing across buffer boundaries */
|
||||
asn_struct_ctx_t _asn_ctx;
|
||||
} Fulfillment_t;
|
||||
|
||||
/* Implementation */
|
||||
extern asn_TYPE_descriptor_t asn_DEF_Fulfillment;
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Referred external types */
|
||||
#include "PrefixFulfillment.h"
|
||||
#include "ThresholdFulfillment.h"
|
||||
|
||||
#endif /* _Fulfillment_H_ */
|
||||
#include <asn_internal.h>
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,85 +0,0 @@
|
||||
// Copyright (c) 2016-2023 The Hush developers
|
||||
// Distributed under the GPLv3 software license, see the accompanying
|
||||
// file COPYING or https://www.gnu.org/licenses/gpl-3.0.en.html
|
||||
/*-
|
||||
* Copyright (c) 2003, 2005 Lev Walkin <vlm@lionet.info>. All rights reserved.
|
||||
* Redistribution and modifications are permitted subject to BSD license.
|
||||
*/
|
||||
#ifndef _INTEGER_H_
|
||||
#define _INTEGER_H_
|
||||
|
||||
#include "asn_application.h"
|
||||
#include <asn_codecs_prim.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
typedef ASN__PRIMITIVE_TYPE_t INTEGER_t;
|
||||
|
||||
extern asn_TYPE_descriptor_t asn_DEF_INTEGER;
|
||||
|
||||
/* Map with <tag> to integer value association */
|
||||
typedef struct asn_INTEGER_enum_map_s {
|
||||
long nat_value; /* associated native integer value */
|
||||
size_t enum_len; /* strlen("tag") */
|
||||
const char *enum_name; /* "tag" */
|
||||
} asn_INTEGER_enum_map_t;
|
||||
|
||||
/* This type describes an enumeration for INTEGER and ENUMERATED types */
|
||||
typedef const struct asn_INTEGER_specifics_s {
|
||||
const asn_INTEGER_enum_map_t *value2enum; /* N -> "tag"; sorted by N */
|
||||
const unsigned int *enum2value; /* "tag" => N; sorted by tag */
|
||||
int map_count; /* Elements in either map */
|
||||
int extension; /* This map is extensible */
|
||||
int strict_enumeration; /* Enumeration set is fixed */
|
||||
int field_width; /* Size of native integer */
|
||||
int field_unsigned; /* Signed=0, unsigned=1 */
|
||||
} asn_INTEGER_specifics_t;
|
||||
|
||||
asn_struct_print_f INTEGER_print;
|
||||
ber_type_decoder_f INTEGER_decode_ber;
|
||||
der_type_encoder_f INTEGER_encode_der;
|
||||
xer_type_decoder_f INTEGER_decode_xer;
|
||||
xer_type_encoder_f INTEGER_encode_xer;
|
||||
per_type_decoder_f INTEGER_decode_uper;
|
||||
per_type_encoder_f INTEGER_encode_uper;
|
||||
|
||||
/***********************************
|
||||
* Some handy conversion routines. *
|
||||
***********************************/
|
||||
|
||||
/*
|
||||
* Returns 0 if it was possible to convert, -1 otherwise.
|
||||
* -1/EINVAL: Mandatory argument missing
|
||||
* -1/ERANGE: Value encoded is out of range for long representation
|
||||
* -1/ENOMEM: Memory allocation failed (in asn_long2INTEGER()).
|
||||
*/
|
||||
int asn_INTEGER2long(const INTEGER_t *i, long *l);
|
||||
int asn_INTEGER2ulong(const INTEGER_t *i, unsigned long *l);
|
||||
int asn_long2INTEGER(INTEGER_t *i, long l);
|
||||
int asn_ulong2INTEGER(INTEGER_t *i, unsigned long l);
|
||||
|
||||
/* A a reified version of strtol(3) with nicer error reporting. */
|
||||
enum asn_strtol_result_e {
|
||||
ASN_STRTOL_ERROR_RANGE = -3, /* Input outside of numeric range for long type */
|
||||
ASN_STRTOL_ERROR_INVAL = -2, /* Invalid data encountered (e.g., "+-") */
|
||||
ASN_STRTOL_EXPECT_MORE = -1, /* More data expected (e.g. "+") */
|
||||
ASN_STRTOL_OK = 0, /* Conversion succeded, number ends at (*end) */
|
||||
ASN_STRTOL_EXTRA_DATA = 1 /* Conversion succeded, but the string has extra stuff */
|
||||
};
|
||||
enum asn_strtol_result_e asn_strtol_lim(const char *str, const char **end, long *l);
|
||||
|
||||
/* The asn_strtol is going to be DEPRECATED soon */
|
||||
enum asn_strtol_result_e asn_strtol(const char *str, const char *end, long *l);
|
||||
|
||||
/*
|
||||
* Convert the integer value into the corresponding enumeration map entry.
|
||||
*/
|
||||
const asn_INTEGER_enum_map_t *INTEGER_map_value2enum(asn_INTEGER_specifics_t *specs, long value);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _INTEGER_H_ */
|
||||
@@ -1,120 +0,0 @@
|
||||
ASN_MODULE_SOURCES= \
|
||||
Condition.c \
|
||||
SimpleSha256Condition.c \
|
||||
CompoundSha256Condition.c \
|
||||
ConditionTypes.c \
|
||||
Fulfillment.c \
|
||||
PreimageFulfillment.c \
|
||||
PrefixFulfillment.c \
|
||||
ThresholdFulfillment.c \
|
||||
RsaSha256Fulfillment.c \
|
||||
Ed25519Sha512Fulfillment.c \
|
||||
Secp256k1Fulfillment.c \
|
||||
EvalFulfillment.c \
|
||||
PrefixFingerprintContents.c \
|
||||
ThresholdFingerprintContents.c \
|
||||
RsaFingerprintContents.c \
|
||||
Ed25519FingerprintContents.c \
|
||||
Secp256k1FingerprintContents.c
|
||||
|
||||
ASN_MODULE_HEADERS= \
|
||||
Condition.h \
|
||||
SimpleSha256Condition.h \
|
||||
CompoundSha256Condition.h \
|
||||
ConditionTypes.h \
|
||||
Fulfillment.h \
|
||||
PreimageFulfillment.h \
|
||||
PrefixFulfillment.h \
|
||||
ThresholdFulfillment.h \
|
||||
RsaSha256Fulfillment.h \
|
||||
Ed25519Sha512Fulfillment.h \
|
||||
Secp256k1Fulfillment.h \
|
||||
EvalFulfillment.h \
|
||||
PrefixFingerprintContents.h \
|
||||
ThresholdFingerprintContents.h \
|
||||
RsaFingerprintContents.h \
|
||||
Ed25519FingerprintContents.h \
|
||||
Secp256k1FingerprintContents.h
|
||||
|
||||
ASN_MODULE_HEADERS+=INTEGER.h
|
||||
ASN_MODULE_HEADERS+=NativeEnumerated.h
|
||||
ASN_MODULE_SOURCES+=INTEGER.c
|
||||
ASN_MODULE_SOURCES+=NativeEnumerated.c
|
||||
ASN_MODULE_HEADERS+=NativeInteger.h
|
||||
ASN_MODULE_SOURCES+=NativeInteger.c
|
||||
ASN_MODULE_HEADERS+=asn_SET_OF.h
|
||||
ASN_MODULE_SOURCES+=asn_SET_OF.c
|
||||
ASN_MODULE_HEADERS+=constr_CHOICE.h
|
||||
ASN_MODULE_SOURCES+=constr_CHOICE.c
|
||||
ASN_MODULE_HEADERS+=constr_SEQUENCE.h
|
||||
ASN_MODULE_SOURCES+=constr_SEQUENCE.c
|
||||
ASN_MODULE_HEADERS+=constr_SET_OF.h
|
||||
ASN_MODULE_SOURCES+=constr_SET_OF.c
|
||||
ASN_MODULE_HEADERS+=asn_application.h
|
||||
ASN_MODULE_HEADERS+=asn_system.h
|
||||
ASN_MODULE_HEADERS+=asn_codecs.h
|
||||
ASN_MODULE_HEADERS+=asn_internal.h
|
||||
ASN_MODULE_HEADERS+=OCTET_STRING.h
|
||||
ASN_MODULE_SOURCES+=OCTET_STRING.c
|
||||
ASN_MODULE_HEADERS+=BIT_STRING.h
|
||||
ASN_MODULE_SOURCES+=BIT_STRING.c
|
||||
ASN_MODULE_SOURCES+=asn_codecs_prim.c
|
||||
ASN_MODULE_HEADERS+=asn_codecs_prim.h
|
||||
ASN_MODULE_HEADERS+=ber_tlv_length.h
|
||||
ASN_MODULE_SOURCES+=ber_tlv_length.c
|
||||
ASN_MODULE_HEADERS+=ber_tlv_tag.h
|
||||
ASN_MODULE_SOURCES+=ber_tlv_tag.c
|
||||
ASN_MODULE_HEADERS+=ber_decoder.h
|
||||
ASN_MODULE_SOURCES+=ber_decoder.c
|
||||
ASN_MODULE_HEADERS+=der_encoder.h
|
||||
ASN_MODULE_SOURCES+=der_encoder.c
|
||||
ASN_MODULE_HEADERS+=constr_TYPE.h
|
||||
ASN_MODULE_SOURCES+=constr_TYPE.c
|
||||
ASN_MODULE_HEADERS+=constraints.h
|
||||
ASN_MODULE_SOURCES+=constraints.c
|
||||
ASN_MODULE_HEADERS+=xer_support.h
|
||||
ASN_MODULE_SOURCES+=xer_support.c
|
||||
ASN_MODULE_HEADERS+=xer_decoder.h
|
||||
ASN_MODULE_SOURCES+=xer_decoder.c
|
||||
ASN_MODULE_HEADERS+=xer_encoder.h
|
||||
ASN_MODULE_SOURCES+=xer_encoder.c
|
||||
ASN_MODULE_HEADERS+=per_support.h
|
||||
ASN_MODULE_SOURCES+=per_support.c
|
||||
ASN_MODULE_HEADERS+=per_decoder.h
|
||||
ASN_MODULE_SOURCES+=per_decoder.c
|
||||
ASN_MODULE_HEADERS+=per_encoder.h
|
||||
ASN_MODULE_SOURCES+=per_encoder.c
|
||||
ASN_MODULE_HEADERS+=per_opentype.h
|
||||
ASN_MODULE_SOURCES+=per_opentype.c
|
||||
ASN_CONVERTER_SOURCES+=converter-sample.c
|
||||
|
||||
|
||||
lib_LTLIBRARIES=libsomething.la
|
||||
libsomething_la_SOURCES=$(ASN_MODULE_SOURCES) $(ASN_MODULE_HEADERS)
|
||||
|
||||
# This file may be used as an input for make(3)
|
||||
# Remove the lines below to convert it into a pure .am file
|
||||
TARGET = progname
|
||||
CFLAGS += -I.
|
||||
OBJS=${ASN_MODULE_SOURCES:.c=.o} ${ASN_CONVERTER_SOURCES:.c=.o}
|
||||
|
||||
all: $(TARGET)
|
||||
|
||||
$(TARGET): ${OBJS}
|
||||
$(CC) $(CFLAGS) -o $(TARGET) ${OBJS} $(LDFLAGS) $(LIBS)
|
||||
|
||||
.SUFFIXES:
|
||||
.SUFFIXES: .c .o
|
||||
|
||||
.c.o:
|
||||
$(CC) $(CFLAGS) -o $@ -c $<
|
||||
|
||||
clean:
|
||||
rm -f $(TARGET)
|
||||
rm -f $(OBJS)
|
||||
|
||||
regen: regenerate-from-asn1-source
|
||||
|
||||
regenerate-from-asn1-source:
|
||||
asn1c CryptoConditions.asn
|
||||
|
||||
@@ -1,210 +0,0 @@
|
||||
// Copyright (c) 2016-2023 The Hush developers
|
||||
// Distributed under the GPLv3 software license, see the accompanying
|
||||
// file COPYING or https://www.gnu.org/licenses/gpl-3.0.en.html
|
||||
/*-
|
||||
* Copyright (c) 2004, 2007 Lev Walkin <vlm@lionet.info>. All rights reserved.
|
||||
* Redistribution and modifications are permitted subject to BSD license.
|
||||
*/
|
||||
/*
|
||||
* Read the NativeInteger.h for the explanation wrt. differences between
|
||||
* INTEGER and NativeInteger.
|
||||
* Basically, both are decoders and encoders of ASN.1 INTEGER type, but this
|
||||
* implementation deals with the standard (machine-specific) representation
|
||||
* of them instead of using the platform-independent buffer.
|
||||
*/
|
||||
#include <asn_internal.h>
|
||||
#include <NativeEnumerated.h>
|
||||
|
||||
/*
|
||||
* NativeEnumerated basic type description.
|
||||
*/
|
||||
static const ber_tlv_tag_t asn_DEF_NativeEnumerated_tags[] = {
|
||||
(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
|
||||
};
|
||||
asn_TYPE_descriptor_t asn_DEF_NativeEnumerated = {
|
||||
"ENUMERATED", /* The ASN.1 type is still ENUMERATED */
|
||||
"ENUMERATED",
|
||||
NativeInteger_free,
|
||||
NativeInteger_print,
|
||||
asn_generic_no_constraint,
|
||||
NativeInteger_decode_ber,
|
||||
NativeInteger_encode_der,
|
||||
NativeInteger_decode_xer,
|
||||
NativeEnumerated_encode_xer,
|
||||
NativeEnumerated_decode_uper,
|
||||
NativeEnumerated_encode_uper,
|
||||
0, /* Use generic outmost tag fetcher */
|
||||
asn_DEF_NativeEnumerated_tags,
|
||||
sizeof(asn_DEF_NativeEnumerated_tags) / sizeof(asn_DEF_NativeEnumerated_tags[0]),
|
||||
asn_DEF_NativeEnumerated_tags, /* Same as above */
|
||||
sizeof(asn_DEF_NativeEnumerated_tags) / sizeof(asn_DEF_NativeEnumerated_tags[0]),
|
||||
0, /* No PER visible constraints */
|
||||
0, 0, /* No members */
|
||||
0 /* No specifics */
|
||||
};
|
||||
|
||||
asn_enc_rval_t
|
||||
NativeEnumerated_encode_xer(asn_TYPE_descriptor_t *td, void *sptr,
|
||||
int ilevel, enum xer_encoder_flags_e flags,
|
||||
asn_app_consume_bytes_f *cb, void *app_key) {
|
||||
asn_INTEGER_specifics_t *specs=(asn_INTEGER_specifics_t *)td->specifics;
|
||||
asn_enc_rval_t er;
|
||||
const long *native = (const long *)sptr;
|
||||
const asn_INTEGER_enum_map_t *el;
|
||||
|
||||
(void)ilevel;
|
||||
(void)flags;
|
||||
|
||||
if(!native) ASN__ENCODE_FAILED;
|
||||
|
||||
el = INTEGER_map_value2enum(specs, *native);
|
||||
if(el) {
|
||||
size_t srcsize = el->enum_len + 5;
|
||||
char *src = (char *)alloca(srcsize);
|
||||
|
||||
er.encoded = snprintf(src, srcsize, "<%s/>", el->enum_name);
|
||||
assert(er.encoded > 0 && (size_t)er.encoded < srcsize);
|
||||
if(cb(src, er.encoded, app_key) < 0) ASN__ENCODE_FAILED;
|
||||
ASN__ENCODED_OK(er);
|
||||
} else {
|
||||
ASN_DEBUG("ASN.1 forbids dealing with "
|
||||
"unknown value of ENUMERATED type");
|
||||
ASN__ENCODE_FAILED;
|
||||
}
|
||||
}
|
||||
|
||||
asn_dec_rval_t
|
||||
NativeEnumerated_decode_uper(asn_codec_ctx_t *opt_codec_ctx,
|
||||
asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints,
|
||||
void **sptr, asn_per_data_t *pd) {
|
||||
asn_INTEGER_specifics_t *specs = (asn_INTEGER_specifics_t *)td->specifics;
|
||||
asn_dec_rval_t rval = { RC_OK, 0 };
|
||||
long *native = (long *)*sptr;
|
||||
asn_per_constraint_t *ct;
|
||||
long value;
|
||||
|
||||
(void)opt_codec_ctx;
|
||||
|
||||
if(constraints) ct = &constraints->value;
|
||||
else if(td->per_constraints) ct = &td->per_constraints->value;
|
||||
else ASN__DECODE_FAILED; /* Mandatory! */
|
||||
if(!specs) ASN__DECODE_FAILED;
|
||||
|
||||
if(!native) {
|
||||
native = (long *)(*sptr = CALLOC(1, sizeof(*native)));
|
||||
if(!native) ASN__DECODE_FAILED;
|
||||
}
|
||||
|
||||
ASN_DEBUG("Decoding %s as NativeEnumerated", td->name);
|
||||
|
||||
if(ct->flags & APC_EXTENSIBLE) {
|
||||
int inext = per_get_few_bits(pd, 1);
|
||||
if(inext < 0) ASN__DECODE_STARVED;
|
||||
if(inext) ct = 0;
|
||||
}
|
||||
|
||||
if(ct && ct->range_bits >= 0) {
|
||||
value = per_get_few_bits(pd, ct->range_bits);
|
||||
if(value < 0) ASN__DECODE_STARVED;
|
||||
if(value >= (specs->extension
|
||||
? specs->extension - 1 : specs->map_count))
|
||||
ASN__DECODE_FAILED;
|
||||
} else {
|
||||
if(!specs->extension)
|
||||
ASN__DECODE_FAILED;
|
||||
/*
|
||||
* X.691, #10.6: normally small non-negative whole number;
|
||||
*/
|
||||
value = uper_get_nsnnwn(pd);
|
||||
if(value < 0) ASN__DECODE_STARVED;
|
||||
value += specs->extension - 1;
|
||||
if(value >= specs->map_count)
|
||||
ASN__DECODE_FAILED;
|
||||
}
|
||||
|
||||
*native = specs->value2enum[value].nat_value;
|
||||
ASN_DEBUG("Decoded %s = %ld", td->name, *native);
|
||||
|
||||
return rval;
|
||||
}
|
||||
|
||||
static int
|
||||
NativeEnumerated__compar_value2enum(const void *ap, const void *bp) {
|
||||
const asn_INTEGER_enum_map_t *a = ap;
|
||||
const asn_INTEGER_enum_map_t *b = bp;
|
||||
if(a->nat_value == b->nat_value)
|
||||
return 0;
|
||||
if(a->nat_value < b->nat_value)
|
||||
return -1;
|
||||
return 1;
|
||||
}
|
||||
|
||||
asn_enc_rval_t
|
||||
NativeEnumerated_encode_uper(asn_TYPE_descriptor_t *td,
|
||||
asn_per_constraints_t *constraints, void *sptr, asn_per_outp_t *po) {
|
||||
asn_INTEGER_specifics_t *specs = (asn_INTEGER_specifics_t *)td->specifics;
|
||||
asn_enc_rval_t er;
|
||||
long native, value;
|
||||
asn_per_constraint_t *ct;
|
||||
int inext = 0;
|
||||
asn_INTEGER_enum_map_t key;
|
||||
const asn_INTEGER_enum_map_t *kf;
|
||||
|
||||
if(!sptr) ASN__ENCODE_FAILED;
|
||||
if(!specs) ASN__ENCODE_FAILED;
|
||||
|
||||
if(constraints) ct = &constraints->value;
|
||||
else if(td->per_constraints) ct = &td->per_constraints->value;
|
||||
else ASN__ENCODE_FAILED; /* Mandatory! */
|
||||
|
||||
ASN_DEBUG("Encoding %s as NativeEnumerated", td->name);
|
||||
|
||||
er.encoded = 0;
|
||||
|
||||
native = *(long *)sptr;
|
||||
if(native < 0) ASN__ENCODE_FAILED;
|
||||
|
||||
key.nat_value = native;
|
||||
kf = bsearch(&key, specs->value2enum, specs->map_count,
|
||||
sizeof(key), NativeEnumerated__compar_value2enum);
|
||||
if(!kf) {
|
||||
ASN_DEBUG("No element corresponds to %ld", native);
|
||||
ASN__ENCODE_FAILED;
|
||||
}
|
||||
value = kf - specs->value2enum;
|
||||
|
||||
if(ct->range_bits >= 0) {
|
||||
int cmpWith = specs->extension
|
||||
? specs->extension - 1 : specs->map_count;
|
||||
if(value >= cmpWith)
|
||||
inext = 1;
|
||||
}
|
||||
if(ct->flags & APC_EXTENSIBLE) {
|
||||
if(per_put_few_bits(po, inext, 1))
|
||||
ASN__ENCODE_FAILED;
|
||||
if(inext) ct = 0;
|
||||
} else if(inext) {
|
||||
ASN__ENCODE_FAILED;
|
||||
}
|
||||
|
||||
if(ct && ct->range_bits >= 0) {
|
||||
if(per_put_few_bits(po, value, ct->range_bits))
|
||||
ASN__ENCODE_FAILED;
|
||||
ASN__ENCODED_OK(er);
|
||||
}
|
||||
|
||||
if(!specs->extension)
|
||||
ASN__ENCODE_FAILED;
|
||||
|
||||
/*
|
||||
* X.691, #10.6: normally small non-negative whole number;
|
||||
*/
|
||||
ASN_DEBUG("value = %ld, ext = %d, inext = %d, res = %ld",
|
||||
value, specs->extension, inext,
|
||||
value - (inext ? (specs->extension - 1) : 0));
|
||||
if(uper_put_nsnnwn(po, value - (inext ? (specs->extension - 1) : 0)))
|
||||
ASN__ENCODE_FAILED;
|
||||
|
||||
ASN__ENCODED_OK(er);
|
||||
}
|
||||
|
||||
@@ -1,35 +0,0 @@
|
||||
// Copyright (c) 2016-2023 The Hush developers
|
||||
// Distributed under the GPLv3 software license, see the accompanying
|
||||
// file COPYING or https://www.gnu.org/licenses/gpl-3.0.en.html
|
||||
/*-
|
||||
* Copyright (c) 2004, 2005, 2006 Lev Walkin <vlm@lionet.info>.
|
||||
* All rights reserved.
|
||||
* Redistribution and modifications are permitted subject to BSD license.
|
||||
*/
|
||||
/*
|
||||
* This type differs from the standard ENUMERATED in that it is modelled using
|
||||
* the fixed machine type (long, int, short), so it can hold only values of
|
||||
* limited length. There is no type (i.e., NativeEnumerated_t, any integer type
|
||||
* will do).
|
||||
* This type may be used when integer range is limited by subtype constraints.
|
||||
*/
|
||||
#ifndef _NativeEnumerated_H_
|
||||
#define _NativeEnumerated_H_
|
||||
|
||||
#include <NativeInteger.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
extern asn_TYPE_descriptor_t asn_DEF_NativeEnumerated;
|
||||
|
||||
xer_type_encoder_f NativeEnumerated_encode_xer;
|
||||
per_type_decoder_f NativeEnumerated_decode_uper;
|
||||
per_type_encoder_f NativeEnumerated_encode_uper;
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _NativeEnumerated_H_ */
|
||||
@@ -1,335 +0,0 @@
|
||||
// Copyright (c) 2016-2023 The Hush developers
|
||||
// Distributed under the GPLv3 software license, see the accompanying
|
||||
// file COPYING or https://www.gnu.org/licenses/gpl-3.0.en.html
|
||||
/*-
|
||||
* Copyright (c) 2004, 2005, 2006 Lev Walkin <vlm@lionet.info>.
|
||||
* All rights reserved.
|
||||
* Redistribution and modifications are permitted subject to BSD license.
|
||||
*/
|
||||
/*
|
||||
* Read the NativeInteger.h for the explanation wrt. differences between
|
||||
* INTEGER and NativeInteger.
|
||||
* Basically, both are decoders and encoders of ASN.1 INTEGER type, but this
|
||||
* implementation deals with the standard (machine-specific) representation
|
||||
* of them instead of using the platform-independent buffer.
|
||||
*/
|
||||
#include <asn_internal.h>
|
||||
#include <NativeInteger.h>
|
||||
|
||||
/*
|
||||
* NativeInteger basic type description.
|
||||
*/
|
||||
static const ber_tlv_tag_t asn_DEF_NativeInteger_tags[] = {
|
||||
(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
|
||||
};
|
||||
asn_TYPE_descriptor_t asn_DEF_NativeInteger = {
|
||||
"INTEGER", /* The ASN.1 type is still INTEGER */
|
||||
"INTEGER",
|
||||
NativeInteger_free,
|
||||
NativeInteger_print,
|
||||
asn_generic_no_constraint,
|
||||
NativeInteger_decode_ber,
|
||||
NativeInteger_encode_der,
|
||||
NativeInteger_decode_xer,
|
||||
NativeInteger_encode_xer,
|
||||
NativeInteger_decode_uper, /* Unaligned PER decoder */
|
||||
NativeInteger_encode_uper, /* Unaligned PER encoder */
|
||||
0, /* Use generic outmost tag fetcher */
|
||||
asn_DEF_NativeInteger_tags,
|
||||
sizeof(asn_DEF_NativeInteger_tags) / sizeof(asn_DEF_NativeInteger_tags[0]),
|
||||
asn_DEF_NativeInteger_tags, /* Same as above */
|
||||
sizeof(asn_DEF_NativeInteger_tags) / sizeof(asn_DEF_NativeInteger_tags[0]),
|
||||
0, /* No PER visible constraints */
|
||||
0, 0, /* No members */
|
||||
0 /* No specifics */
|
||||
};
|
||||
|
||||
/*
|
||||
* Decode INTEGER type.
|
||||
*/
|
||||
asn_dec_rval_t
|
||||
NativeInteger_decode_ber(asn_codec_ctx_t *opt_codec_ctx,
|
||||
asn_TYPE_descriptor_t *td,
|
||||
void **nint_ptr, const void *buf_ptr, size_t size, int tag_mode) {
|
||||
asn_INTEGER_specifics_t *specs=(asn_INTEGER_specifics_t *)td->specifics;
|
||||
long *native = (long *)*nint_ptr;
|
||||
asn_dec_rval_t rval;
|
||||
ber_tlv_len_t length;
|
||||
|
||||
/*
|
||||
* If the structure is not there, allocate it.
|
||||
*/
|
||||
if(native == NULL) {
|
||||
native = (long *)(*nint_ptr = CALLOC(1, sizeof(*native)));
|
||||
if(native == NULL) {
|
||||
rval.code = RC_FAIL;
|
||||
rval.consumed = 0;
|
||||
return rval;
|
||||
}
|
||||
}
|
||||
|
||||
ASN_DEBUG("Decoding %s as INTEGER (tm=%d)",
|
||||
td->name, tag_mode);
|
||||
|
||||
/*
|
||||
* Check tags.
|
||||
*/
|
||||
rval = ber_check_tags(opt_codec_ctx, td, 0, buf_ptr, size,
|
||||
tag_mode, 0, &length, 0);
|
||||
if(rval.code != RC_OK)
|
||||
return rval;
|
||||
|
||||
ASN_DEBUG("%s length is %d bytes", td->name, (int)length);
|
||||
|
||||
/*
|
||||
* Make sure we have this length.
|
||||
*/
|
||||
buf_ptr = ((const char *)buf_ptr) + rval.consumed;
|
||||
size -= rval.consumed;
|
||||
if(length > (ber_tlv_len_t)size) {
|
||||
rval.code = RC_WMORE;
|
||||
rval.consumed = 0;
|
||||
return rval;
|
||||
}
|
||||
|
||||
/*
|
||||
* ASN.1 encoded INTEGER: buf_ptr, length
|
||||
* Fill the native, at the same time checking for overflow.
|
||||
* If overflow occured, return with RC_FAIL.
|
||||
*/
|
||||
{
|
||||
INTEGER_t tmp;
|
||||
union {
|
||||
const void *constbuf;
|
||||
void *nonconstbuf;
|
||||
} unconst_buf;
|
||||
long l;
|
||||
|
||||
unconst_buf.constbuf = buf_ptr;
|
||||
tmp.buf = (uint8_t *)unconst_buf.nonconstbuf;
|
||||
tmp.size = length;
|
||||
|
||||
if((specs&&specs->field_unsigned)
|
||||
? asn_INTEGER2ulong(&tmp, (unsigned long *)&l) /* sic */
|
||||
: asn_INTEGER2long(&tmp, &l)) {
|
||||
rval.code = RC_FAIL;
|
||||
rval.consumed = 0;
|
||||
return rval;
|
||||
}
|
||||
|
||||
*native = l;
|
||||
}
|
||||
|
||||
rval.code = RC_OK;
|
||||
rval.consumed += length;
|
||||
|
||||
ASN_DEBUG("Took %ld/%ld bytes to encode %s (%ld)",
|
||||
(long)rval.consumed, (long)length, td->name, (long)*native);
|
||||
|
||||
return rval;
|
||||
}
|
||||
|
||||
/*
|
||||
* Encode the NativeInteger using the standard INTEGER type DER encoder.
|
||||
*/
|
||||
asn_enc_rval_t
|
||||
NativeInteger_encode_der(asn_TYPE_descriptor_t *sd, void *ptr,
|
||||
int tag_mode, ber_tlv_tag_t tag,
|
||||
asn_app_consume_bytes_f *cb, void *app_key) {
|
||||
unsigned long native = *(unsigned long *)ptr; /* Disable sign ext. */
|
||||
asn_enc_rval_t erval;
|
||||
INTEGER_t tmp;
|
||||
|
||||
#ifdef WORDS_BIGENDIAN /* Opportunistic optimization */
|
||||
|
||||
tmp.buf = (uint8_t *)&native;
|
||||
tmp.size = sizeof(native);
|
||||
|
||||
#else /* Works even if WORDS_BIGENDIAN is not set where should've been */
|
||||
uint8_t buf[sizeof(native)];
|
||||
uint8_t *p;
|
||||
|
||||
/* Prepare a fake INTEGER */
|
||||
for(p = buf + sizeof(buf) - 1; p >= buf; p--, native >>= 8)
|
||||
*p = (uint8_t)native;
|
||||
|
||||
tmp.buf = buf;
|
||||
tmp.size = sizeof(buf);
|
||||
#endif /* WORDS_BIGENDIAN */
|
||||
|
||||
/* Encode fake INTEGER */
|
||||
erval = INTEGER_encode_der(sd, &tmp, tag_mode, tag, cb, app_key);
|
||||
if(erval.encoded == -1) {
|
||||
assert(erval.structure_ptr == &tmp);
|
||||
erval.structure_ptr = ptr;
|
||||
}
|
||||
return erval;
|
||||
}
|
||||
|
||||
/*
|
||||
* Decode the chunk of XML text encoding INTEGER.
|
||||
*/
|
||||
asn_dec_rval_t
|
||||
NativeInteger_decode_xer(asn_codec_ctx_t *opt_codec_ctx,
|
||||
asn_TYPE_descriptor_t *td, void **sptr, const char *opt_mname,
|
||||
const void *buf_ptr, size_t size) {
|
||||
asn_INTEGER_specifics_t *specs=(asn_INTEGER_specifics_t *)td->specifics;
|
||||
asn_dec_rval_t rval;
|
||||
INTEGER_t st;
|
||||
void *st_ptr = (void *)&st;
|
||||
long *native = (long *)*sptr;
|
||||
|
||||
if(!native) {
|
||||
native = (long *)(*sptr = CALLOC(1, sizeof(*native)));
|
||||
if(!native) ASN__DECODE_FAILED;
|
||||
}
|
||||
|
||||
memset(&st, 0, sizeof(st));
|
||||
rval = INTEGER_decode_xer(opt_codec_ctx, td, &st_ptr,
|
||||
opt_mname, buf_ptr, size);
|
||||
if(rval.code == RC_OK) {
|
||||
long l;
|
||||
if((specs&&specs->field_unsigned)
|
||||
? asn_INTEGER2ulong(&st, (unsigned long *)&l) /* sic */
|
||||
: asn_INTEGER2long(&st, &l)) {
|
||||
rval.code = RC_FAIL;
|
||||
rval.consumed = 0;
|
||||
} else {
|
||||
*native = l;
|
||||
}
|
||||
} else {
|
||||
/*
|
||||
* Cannot restart from the middle;
|
||||
* there is no place to save state in the native type.
|
||||
* Request a continuation from the very beginning.
|
||||
*/
|
||||
rval.consumed = 0;
|
||||
}
|
||||
ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_INTEGER, &st);
|
||||
return rval;
|
||||
}
|
||||
|
||||
|
||||
asn_enc_rval_t
|
||||
NativeInteger_encode_xer(asn_TYPE_descriptor_t *td, void *sptr,
|
||||
int ilevel, enum xer_encoder_flags_e flags,
|
||||
asn_app_consume_bytes_f *cb, void *app_key) {
|
||||
asn_INTEGER_specifics_t *specs=(asn_INTEGER_specifics_t *)td->specifics;
|
||||
char scratch[32]; /* Enough for 64-bit int */
|
||||
asn_enc_rval_t er;
|
||||
const long *native = (const long *)sptr;
|
||||
|
||||
(void)ilevel;
|
||||
(void)flags;
|
||||
|
||||
if(!native) ASN__ENCODE_FAILED;
|
||||
|
||||
er.encoded = snprintf(scratch, sizeof(scratch),
|
||||
(specs && specs->field_unsigned)
|
||||
? "%lu" : "%ld", *native);
|
||||
if(er.encoded <= 0 || (size_t)er.encoded >= sizeof(scratch)
|
||||
|| cb(scratch, er.encoded, app_key) < 0)
|
||||
ASN__ENCODE_FAILED;
|
||||
|
||||
ASN__ENCODED_OK(er);
|
||||
}
|
||||
|
||||
asn_dec_rval_t
|
||||
NativeInteger_decode_uper(asn_codec_ctx_t *opt_codec_ctx,
|
||||
asn_TYPE_descriptor_t *td,
|
||||
asn_per_constraints_t *constraints, void **sptr, asn_per_data_t *pd) {
|
||||
|
||||
asn_INTEGER_specifics_t *specs=(asn_INTEGER_specifics_t *)td->specifics;
|
||||
asn_dec_rval_t rval;
|
||||
long *native = (long *)*sptr;
|
||||
INTEGER_t tmpint;
|
||||
void *tmpintptr = &tmpint;
|
||||
|
||||
(void)opt_codec_ctx;
|
||||
ASN_DEBUG("Decoding NativeInteger %s (UPER)", td->name);
|
||||
|
||||
if(!native) {
|
||||
native = (long *)(*sptr = CALLOC(1, sizeof(*native)));
|
||||
if(!native) ASN__DECODE_FAILED;
|
||||
}
|
||||
|
||||
memset(&tmpint, 0, sizeof tmpint);
|
||||
rval = INTEGER_decode_uper(opt_codec_ctx, td, constraints,
|
||||
&tmpintptr, pd);
|
||||
if(rval.code == RC_OK) {
|
||||
if((specs&&specs->field_unsigned)
|
||||
? asn_INTEGER2ulong(&tmpint, (unsigned long *)native)
|
||||
: asn_INTEGER2long(&tmpint, native))
|
||||
rval.code = RC_FAIL;
|
||||
else
|
||||
ASN_DEBUG("NativeInteger %s got value %ld",
|
||||
td->name, *native);
|
||||
}
|
||||
ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_INTEGER, &tmpint);
|
||||
|
||||
return rval;
|
||||
}
|
||||
|
||||
asn_enc_rval_t
|
||||
NativeInteger_encode_uper(asn_TYPE_descriptor_t *td,
|
||||
asn_per_constraints_t *constraints, void *sptr, asn_per_outp_t *po) {
|
||||
asn_INTEGER_specifics_t *specs=(asn_INTEGER_specifics_t *)td->specifics;
|
||||
asn_enc_rval_t er;
|
||||
long native;
|
||||
INTEGER_t tmpint;
|
||||
|
||||
if(!sptr) ASN__ENCODE_FAILED;
|
||||
|
||||
native = *(long *)sptr;
|
||||
|
||||
ASN_DEBUG("Encoding NativeInteger %s %ld (UPER)", td->name, native);
|
||||
|
||||
memset(&tmpint, 0, sizeof(tmpint));
|
||||
if((specs&&specs->field_unsigned)
|
||||
? asn_ulong2INTEGER(&tmpint, native)
|
||||
: asn_long2INTEGER(&tmpint, native))
|
||||
ASN__ENCODE_FAILED;
|
||||
er = INTEGER_encode_uper(td, constraints, &tmpint, po);
|
||||
ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_INTEGER, &tmpint);
|
||||
return er;
|
||||
}
|
||||
|
||||
/*
|
||||
* INTEGER specific human-readable output.
|
||||
*/
|
||||
int
|
||||
NativeInteger_print(asn_TYPE_descriptor_t *td, const void *sptr, int ilevel,
|
||||
asn_app_consume_bytes_f *cb, void *app_key) {
|
||||
asn_INTEGER_specifics_t *specs=(asn_INTEGER_specifics_t *)td->specifics;
|
||||
const long *native = (const long *)sptr;
|
||||
char scratch[32]; /* Enough for 64-bit int */
|
||||
int ret;
|
||||
|
||||
(void)td; /* Unused argument */
|
||||
(void)ilevel; /* Unused argument */
|
||||
|
||||
if(native) {
|
||||
ret = snprintf(scratch, sizeof(scratch),
|
||||
(specs && specs->field_unsigned)
|
||||
? "%lu" : "%ld", *native);
|
||||
assert(ret > 0 && (size_t)ret < sizeof(scratch));
|
||||
return (cb(scratch, ret, app_key) < 0) ? -1 : 0;
|
||||
} else {
|
||||
return (cb("<absent>", 8, app_key) < 0) ? -1 : 0;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
NativeInteger_free(asn_TYPE_descriptor_t *td, void *ptr, int contents_only) {
|
||||
|
||||
if(!td || !ptr)
|
||||
return;
|
||||
|
||||
ASN_DEBUG("Freeing %s as INTEGER (%d, %p, Native)",
|
||||
td->name, contents_only, ptr);
|
||||
|
||||
if(!contents_only) {
|
||||
FREEMEM(ptr);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,40 +0,0 @@
|
||||
// Copyright (c) 2016-2023 The Hush developers
|
||||
// Distributed under the GPLv3 software license, see the accompanying
|
||||
// file COPYING or https://www.gnu.org/licenses/gpl-3.0.en.html
|
||||
/*-
|
||||
* Copyright (c) 2004 Lev Walkin <vlm@lionet.info>. All rights reserved.
|
||||
* Redistribution and modifications are permitted subject to BSD license.
|
||||
*/
|
||||
/*
|
||||
* This type differs from the standard INTEGER in that it is modelled using
|
||||
* the fixed machine type (long, int, short), so it can hold only values of
|
||||
* limited length. There is no type (i.e., NativeInteger_t, any integer type
|
||||
* will do).
|
||||
* This type may be used when integer range is limited by subtype constraints.
|
||||
*/
|
||||
#ifndef _NativeInteger_H_
|
||||
#define _NativeInteger_H_
|
||||
|
||||
#include "asn_application.h"
|
||||
#include <INTEGER.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
extern asn_TYPE_descriptor_t asn_DEF_NativeInteger;
|
||||
|
||||
asn_struct_free_f NativeInteger_free;
|
||||
asn_struct_print_f NativeInteger_print;
|
||||
ber_type_decoder_f NativeInteger_decode_ber;
|
||||
der_type_encoder_f NativeInteger_encode_der;
|
||||
xer_type_decoder_f NativeInteger_decode_xer;
|
||||
xer_type_encoder_f NativeInteger_encode_xer;
|
||||
per_type_decoder_f NativeInteger_decode_uper;
|
||||
per_type_encoder_f NativeInteger_encode_uper;
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _NativeInteger_H_ */
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,89 +0,0 @@
|
||||
// Copyright (c) 2016-2023 The Hush developers
|
||||
// Distributed under the GPLv3 software license, see the accompanying
|
||||
// file COPYING or https://www.gnu.org/licenses/gpl-3.0.en.html
|
||||
/*-
|
||||
* Copyright (c) 2003 Lev Walkin <vlm@lionet.info>. All rights reserved.
|
||||
* Redistribution and modifications are permitted subject to BSD license.
|
||||
*/
|
||||
#ifndef _OCTET_STRING_H_
|
||||
#define _OCTET_STRING_H_
|
||||
|
||||
#include "asn_application.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
typedef struct OCTET_STRING {
|
||||
uint8_t *buf; /* Buffer with consecutive OCTET_STRING bits */
|
||||
int size; /* Size of the buffer */
|
||||
|
||||
asn_struct_ctx_t _asn_ctx; /* Parsing across buffer boundaries */
|
||||
} OCTET_STRING_t;
|
||||
|
||||
extern asn_TYPE_descriptor_t asn_DEF_OCTET_STRING;
|
||||
|
||||
asn_struct_free_f OCTET_STRING_free;
|
||||
asn_struct_print_f OCTET_STRING_print;
|
||||
asn_struct_print_f OCTET_STRING_print_utf8;
|
||||
ber_type_decoder_f OCTET_STRING_decode_ber;
|
||||
der_type_encoder_f OCTET_STRING_encode_der;
|
||||
xer_type_decoder_f OCTET_STRING_decode_xer_hex; /* Hexadecimal */
|
||||
xer_type_decoder_f OCTET_STRING_decode_xer_binary; /* 01010111010 */
|
||||
xer_type_decoder_f OCTET_STRING_decode_xer_utf8; /* ASCII/UTF-8 */
|
||||
xer_type_encoder_f OCTET_STRING_encode_xer;
|
||||
xer_type_encoder_f OCTET_STRING_encode_xer_utf8;
|
||||
per_type_decoder_f OCTET_STRING_decode_uper;
|
||||
per_type_encoder_f OCTET_STRING_encode_uper;
|
||||
|
||||
/******************************
|
||||
* Handy conversion routines. *
|
||||
******************************/
|
||||
|
||||
/*
|
||||
* This function clears the previous value of the OCTET STRING (if any)
|
||||
* and then allocates a new memory with the specified content (str/size).
|
||||
* If size = -1, the size of the original string will be determined
|
||||
* using strlen(str).
|
||||
* If str equals to NULL, the function will silently clear the
|
||||
* current contents of the OCTET STRING.
|
||||
* Returns 0 if it was possible to perform operation, -1 otherwise.
|
||||
*/
|
||||
int OCTET_STRING_fromBuf(OCTET_STRING_t *s, const char *str, int size);
|
||||
|
||||
/* Handy conversion from the C string into the OCTET STRING. */
|
||||
#define OCTET_STRING_fromString(s, str) OCTET_STRING_fromBuf(s, str, -1)
|
||||
|
||||
/*
|
||||
* Allocate and fill the new OCTET STRING and return a pointer to the newly
|
||||
* allocated object. NULL is permitted in str: the function will just allocate
|
||||
* empty OCTET STRING.
|
||||
*/
|
||||
OCTET_STRING_t *OCTET_STRING_new_fromBuf(asn_TYPE_descriptor_t *td,
|
||||
const char *str, int size);
|
||||
|
||||
/****************************
|
||||
* Internally useful stuff. *
|
||||
****************************/
|
||||
|
||||
typedef const struct asn_OCTET_STRING_specifics_s {
|
||||
/*
|
||||
* Target structure description.
|
||||
*/
|
||||
int struct_size; /* Size of the structure */
|
||||
int ctx_offset; /* Offset of the asn_struct_ctx_t member */
|
||||
|
||||
enum asn_OS_Subvariant {
|
||||
ASN_OSUBV_ANY, /* The open type (ANY) */
|
||||
ASN_OSUBV_BIT, /* BIT STRING */
|
||||
ASN_OSUBV_STR, /* String types, not {BMP,Universal}String */
|
||||
ASN_OSUBV_U16, /* 16-bit character (BMPString) */
|
||||
ASN_OSUBV_U32 /* 32-bit character (UniversalString) */
|
||||
} subvariant;
|
||||
} asn_OCTET_STRING_specifics_t;
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _OCTET_STRING_H_ */
|
||||
@@ -1,212 +0,0 @@
|
||||
// Copyright (c) 2016-2023 The Hush developers
|
||||
// Distributed under the GPLv3 software license, see the accompanying
|
||||
// file COPYING or https://www.gnu.org/licenses/gpl-3.0.en.html
|
||||
/*
|
||||
* Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
|
||||
* From ASN.1 module "Crypto-Conditions"
|
||||
* found in "CryptoConditions.asn"
|
||||
*/
|
||||
|
||||
#include "PrefixFingerprintContents.h"
|
||||
|
||||
static int
|
||||
maxMessageLength_3_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
|
||||
asn_app_constraint_failed_f *ctfailcb, void *app_key) {
|
||||
|
||||
if(!sptr) {
|
||||
ASN__CTFAIL(app_key, td, sptr,
|
||||
"%s: value not given (%s:%d)",
|
||||
td->name, __FILE__, __LINE__);
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
/* Constraint check succeeded */
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* This type is implemented using NativeInteger,
|
||||
* so here we adjust the DEF accordingly.
|
||||
*/
|
||||
static void
|
||||
maxMessageLength_3_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
|
||||
td->free_struct = asn_DEF_NativeInteger.free_struct;
|
||||
td->print_struct = asn_DEF_NativeInteger.print_struct;
|
||||
td->check_constraints = asn_DEF_NativeInteger.check_constraints;
|
||||
td->ber_decoder = asn_DEF_NativeInteger.ber_decoder;
|
||||
td->der_encoder = asn_DEF_NativeInteger.der_encoder;
|
||||
td->xer_decoder = asn_DEF_NativeInteger.xer_decoder;
|
||||
td->xer_encoder = asn_DEF_NativeInteger.xer_encoder;
|
||||
td->uper_decoder = asn_DEF_NativeInteger.uper_decoder;
|
||||
td->uper_encoder = asn_DEF_NativeInteger.uper_encoder;
|
||||
if(!td->per_constraints)
|
||||
td->per_constraints = asn_DEF_NativeInteger.per_constraints;
|
||||
td->elements = asn_DEF_NativeInteger.elements;
|
||||
td->elements_count = asn_DEF_NativeInteger.elements_count;
|
||||
/* td->specifics = asn_DEF_NativeInteger.specifics; // Defined explicitly */
|
||||
}
|
||||
|
||||
static void
|
||||
maxMessageLength_3_free(asn_TYPE_descriptor_t *td,
|
||||
void *struct_ptr, int contents_only) {
|
||||
maxMessageLength_3_inherit_TYPE_descriptor(td);
|
||||
td->free_struct(td, struct_ptr, contents_only);
|
||||
}
|
||||
|
||||
static int
|
||||
maxMessageLength_3_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
|
||||
int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
|
||||
maxMessageLength_3_inherit_TYPE_descriptor(td);
|
||||
return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
|
||||
}
|
||||
|
||||
static asn_dec_rval_t
|
||||
maxMessageLength_3_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
|
||||
void **structure, const void *bufptr, size_t size, int tag_mode) {
|
||||
maxMessageLength_3_inherit_TYPE_descriptor(td);
|
||||
return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
|
||||
}
|
||||
|
||||
static asn_enc_rval_t
|
||||
maxMessageLength_3_encode_der(asn_TYPE_descriptor_t *td,
|
||||
void *structure, int tag_mode, ber_tlv_tag_t tag,
|
||||
asn_app_consume_bytes_f *cb, void *app_key) {
|
||||
maxMessageLength_3_inherit_TYPE_descriptor(td);
|
||||
return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
|
||||
}
|
||||
|
||||
static asn_dec_rval_t
|
||||
maxMessageLength_3_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
|
||||
void **structure, const char *opt_mname, const void *bufptr, size_t size) {
|
||||
maxMessageLength_3_inherit_TYPE_descriptor(td);
|
||||
return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
|
||||
}
|
||||
|
||||
static asn_enc_rval_t
|
||||
maxMessageLength_3_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
|
||||
int ilevel, enum xer_encoder_flags_e flags,
|
||||
asn_app_consume_bytes_f *cb, void *app_key) {
|
||||
maxMessageLength_3_inherit_TYPE_descriptor(td);
|
||||
return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
|
||||
}
|
||||
|
||||
static int
|
||||
memb_maxMessageLength_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
|
||||
asn_app_constraint_failed_f *ctfailcb, void *app_key) {
|
||||
|
||||
if(!sptr) {
|
||||
ASN__CTFAIL(app_key, td, sptr,
|
||||
"%s: value not given (%s:%d)",
|
||||
td->name, __FILE__, __LINE__);
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
/* Constraint check succeeded */
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const asn_INTEGER_specifics_t asn_SPC_maxMessageLength_specs_3 = {
|
||||
0, 0, 0, 0, 0,
|
||||
0, /* Native long size */
|
||||
1 /* Unsigned representation */
|
||||
};
|
||||
static const ber_tlv_tag_t asn_DEF_maxMessageLength_tags_3[] = {
|
||||
(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
|
||||
(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
|
||||
};
|
||||
static /* Use -fall-defs-global to expose */
|
||||
asn_TYPE_descriptor_t asn_DEF_maxMessageLength_3 = {
|
||||
"maxMessageLength",
|
||||
"maxMessageLength",
|
||||
maxMessageLength_3_free,
|
||||
maxMessageLength_3_print,
|
||||
maxMessageLength_3_constraint,
|
||||
maxMessageLength_3_decode_ber,
|
||||
maxMessageLength_3_encode_der,
|
||||
maxMessageLength_3_decode_xer,
|
||||
maxMessageLength_3_encode_xer,
|
||||
0, 0, /* No PER support, use "-gen-PER" to enable */
|
||||
0, /* Use generic outmost tag fetcher */
|
||||
asn_DEF_maxMessageLength_tags_3,
|
||||
sizeof(asn_DEF_maxMessageLength_tags_3)
|
||||
/sizeof(asn_DEF_maxMessageLength_tags_3[0]) - 1, /* 1 */
|
||||
asn_DEF_maxMessageLength_tags_3, /* Same as above */
|
||||
sizeof(asn_DEF_maxMessageLength_tags_3)
|
||||
/sizeof(asn_DEF_maxMessageLength_tags_3[0]), /* 2 */
|
||||
0, /* No PER visible constraints */
|
||||
0, 0, /* No members */
|
||||
&asn_SPC_maxMessageLength_specs_3 /* Additional specs */
|
||||
};
|
||||
|
||||
static asn_TYPE_member_t asn_MBR_PrefixFingerprintContents_1[] = {
|
||||
{ ATF_NOFLAGS, 0, offsetof(struct PrefixFingerprintContents, prefix),
|
||||
(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
|
||||
-1, /* IMPLICIT tag at current level */
|
||||
&asn_DEF_OCTET_STRING,
|
||||
0, /* Defer constraints checking to the member type */
|
||||
0, /* PER is not compiled, use -gen-PER */
|
||||
0,
|
||||
"prefix"
|
||||
},
|
||||
{ ATF_NOFLAGS, 0, offsetof(struct PrefixFingerprintContents, maxMessageLength),
|
||||
(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
|
||||
-1, /* IMPLICIT tag at current level */
|
||||
&asn_DEF_maxMessageLength_3,
|
||||
memb_maxMessageLength_constraint_1,
|
||||
0, /* PER is not compiled, use -gen-PER */
|
||||
0,
|
||||
"maxMessageLength"
|
||||
},
|
||||
{ ATF_NOFLAGS, 0, offsetof(struct PrefixFingerprintContents, subcondition),
|
||||
(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
|
||||
+1, /* EXPLICIT tag at current level */
|
||||
&asn_DEF_Condition,
|
||||
0, /* Defer constraints checking to the member type */
|
||||
0, /* PER is not compiled, use -gen-PER */
|
||||
0,
|
||||
"subcondition"
|
||||
},
|
||||
};
|
||||
static const ber_tlv_tag_t asn_DEF_PrefixFingerprintContents_tags_1[] = {
|
||||
(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
|
||||
};
|
||||
static const asn_TYPE_tag2member_t asn_MAP_PrefixFingerprintContents_tag2el_1[] = {
|
||||
{ (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* prefix */
|
||||
{ (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* maxMessageLength */
|
||||
{ (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* subcondition */
|
||||
};
|
||||
static asn_SEQUENCE_specifics_t asn_SPC_PrefixFingerprintContents_specs_1 = {
|
||||
sizeof(struct PrefixFingerprintContents),
|
||||
offsetof(struct PrefixFingerprintContents, _asn_ctx),
|
||||
asn_MAP_PrefixFingerprintContents_tag2el_1,
|
||||
3, /* Count of tags in the map */
|
||||
0, 0, 0, /* Optional elements (not needed) */
|
||||
-1, /* Start extensions */
|
||||
-1 /* Stop extensions */
|
||||
};
|
||||
asn_TYPE_descriptor_t asn_DEF_PrefixFingerprintContents = {
|
||||
"PrefixFingerprintContents",
|
||||
"PrefixFingerprintContents",
|
||||
SEQUENCE_free,
|
||||
SEQUENCE_print,
|
||||
SEQUENCE_constraint,
|
||||
SEQUENCE_decode_ber,
|
||||
SEQUENCE_encode_der,
|
||||
SEQUENCE_decode_xer,
|
||||
SEQUENCE_encode_xer,
|
||||
0, 0, /* No PER support, use "-gen-PER" to enable */
|
||||
0, /* Use generic outmost tag fetcher */
|
||||
asn_DEF_PrefixFingerprintContents_tags_1,
|
||||
sizeof(asn_DEF_PrefixFingerprintContents_tags_1)
|
||||
/sizeof(asn_DEF_PrefixFingerprintContents_tags_1[0]), /* 1 */
|
||||
asn_DEF_PrefixFingerprintContents_tags_1, /* Same as above */
|
||||
sizeof(asn_DEF_PrefixFingerprintContents_tags_1)
|
||||
/sizeof(asn_DEF_PrefixFingerprintContents_tags_1[0]), /* 1 */
|
||||
0, /* No PER visible constraints */
|
||||
asn_MBR_PrefixFingerprintContents_1,
|
||||
3, /* Elements count */
|
||||
&asn_SPC_PrefixFingerprintContents_specs_1 /* Additional specs */
|
||||
};
|
||||
|
||||
@@ -1,45 +0,0 @@
|
||||
// Copyright (c) 2016-2023 The Hush developers
|
||||
// Distributed under the GPLv3 software license, see the accompanying
|
||||
// file COPYING or https://www.gnu.org/licenses/gpl-3.0.en.html
|
||||
/*
|
||||
* Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
|
||||
* From ASN.1 module "Crypto-Conditions"
|
||||
* found in "CryptoConditions.asn"
|
||||
*/
|
||||
|
||||
#ifndef _PrefixFingerprintContents_H_
|
||||
#define _PrefixFingerprintContents_H_
|
||||
|
||||
|
||||
#include "asn_application.h"
|
||||
|
||||
/* Including external dependencies */
|
||||
#include <OCTET_STRING.h>
|
||||
#include <NativeInteger.h>
|
||||
#include "Condition.h"
|
||||
#include <constr_SEQUENCE.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* PrefixFingerprintContents */
|
||||
typedef struct PrefixFingerprintContents {
|
||||
OCTET_STRING_t prefix;
|
||||
unsigned long maxMessageLength;
|
||||
Condition_t subcondition;
|
||||
|
||||
/* Context for parsing across buffer boundaries */
|
||||
asn_struct_ctx_t _asn_ctx;
|
||||
} PrefixFingerprintContents_t;
|
||||
|
||||
/* Implementation */
|
||||
/* extern asn_TYPE_descriptor_t asn_DEF_maxMessageLength_3; // (Use -fall-defs-global to expose) */
|
||||
extern asn_TYPE_descriptor_t asn_DEF_PrefixFingerprintContents;
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _PrefixFingerprintContents_H_ */
|
||||
#include <asn_internal.h>
|
||||
@@ -1,212 +0,0 @@
|
||||
// Copyright (c) 2016-2023 The Hush developers
|
||||
// Distributed under the GPLv3 software license, see the accompanying
|
||||
// file COPYING or https://www.gnu.org/licenses/gpl-3.0.en.html
|
||||
/*
|
||||
* Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
|
||||
* From ASN.1 module "Crypto-Conditions"
|
||||
* found in "CryptoConditions.asn"
|
||||
*/
|
||||
|
||||
#include "PrefixFulfillment.h"
|
||||
|
||||
static int
|
||||
maxMessageLength_3_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
|
||||
asn_app_constraint_failed_f *ctfailcb, void *app_key) {
|
||||
|
||||
if(!sptr) {
|
||||
ASN__CTFAIL(app_key, td, sptr,
|
||||
"%s: value not given (%s:%d)",
|
||||
td->name, __FILE__, __LINE__);
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
/* Constraint check succeeded */
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* This type is implemented using NativeInteger,
|
||||
* so here we adjust the DEF accordingly.
|
||||
*/
|
||||
static void
|
||||
maxMessageLength_3_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
|
||||
td->free_struct = asn_DEF_NativeInteger.free_struct;
|
||||
td->print_struct = asn_DEF_NativeInteger.print_struct;
|
||||
td->check_constraints = asn_DEF_NativeInteger.check_constraints;
|
||||
td->ber_decoder = asn_DEF_NativeInteger.ber_decoder;
|
||||
td->der_encoder = asn_DEF_NativeInteger.der_encoder;
|
||||
td->xer_decoder = asn_DEF_NativeInteger.xer_decoder;
|
||||
td->xer_encoder = asn_DEF_NativeInteger.xer_encoder;
|
||||
td->uper_decoder = asn_DEF_NativeInteger.uper_decoder;
|
||||
td->uper_encoder = asn_DEF_NativeInteger.uper_encoder;
|
||||
if(!td->per_constraints)
|
||||
td->per_constraints = asn_DEF_NativeInteger.per_constraints;
|
||||
td->elements = asn_DEF_NativeInteger.elements;
|
||||
td->elements_count = asn_DEF_NativeInteger.elements_count;
|
||||
/* td->specifics = asn_DEF_NativeInteger.specifics; // Defined explicitly */
|
||||
}
|
||||
|
||||
static void
|
||||
maxMessageLength_3_free(asn_TYPE_descriptor_t *td,
|
||||
void *struct_ptr, int contents_only) {
|
||||
maxMessageLength_3_inherit_TYPE_descriptor(td);
|
||||
td->free_struct(td, struct_ptr, contents_only);
|
||||
}
|
||||
|
||||
static int
|
||||
maxMessageLength_3_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
|
||||
int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
|
||||
maxMessageLength_3_inherit_TYPE_descriptor(td);
|
||||
return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
|
||||
}
|
||||
|
||||
static asn_dec_rval_t
|
||||
maxMessageLength_3_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
|
||||
void **structure, const void *bufptr, size_t size, int tag_mode) {
|
||||
maxMessageLength_3_inherit_TYPE_descriptor(td);
|
||||
return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
|
||||
}
|
||||
|
||||
static asn_enc_rval_t
|
||||
maxMessageLength_3_encode_der(asn_TYPE_descriptor_t *td,
|
||||
void *structure, int tag_mode, ber_tlv_tag_t tag,
|
||||
asn_app_consume_bytes_f *cb, void *app_key) {
|
||||
maxMessageLength_3_inherit_TYPE_descriptor(td);
|
||||
return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
|
||||
}
|
||||
|
||||
static asn_dec_rval_t
|
||||
maxMessageLength_3_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
|
||||
void **structure, const char *opt_mname, const void *bufptr, size_t size) {
|
||||
maxMessageLength_3_inherit_TYPE_descriptor(td);
|
||||
return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
|
||||
}
|
||||
|
||||
static asn_enc_rval_t
|
||||
maxMessageLength_3_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
|
||||
int ilevel, enum xer_encoder_flags_e flags,
|
||||
asn_app_consume_bytes_f *cb, void *app_key) {
|
||||
maxMessageLength_3_inherit_TYPE_descriptor(td);
|
||||
return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
|
||||
}
|
||||
|
||||
static int
|
||||
memb_maxMessageLength_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
|
||||
asn_app_constraint_failed_f *ctfailcb, void *app_key) {
|
||||
|
||||
if(!sptr) {
|
||||
ASN__CTFAIL(app_key, td, sptr,
|
||||
"%s: value not given (%s:%d)",
|
||||
td->name, __FILE__, __LINE__);
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
/* Constraint check succeeded */
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const asn_INTEGER_specifics_t asn_SPC_maxMessageLength_specs_3 = {
|
||||
0, 0, 0, 0, 0,
|
||||
0, /* Native long size */
|
||||
1 /* Unsigned representation */
|
||||
};
|
||||
static const ber_tlv_tag_t asn_DEF_maxMessageLength_tags_3[] = {
|
||||
(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
|
||||
(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
|
||||
};
|
||||
static /* Use -fall-defs-global to expose */
|
||||
asn_TYPE_descriptor_t asn_DEF_maxMessageLength_3 = {
|
||||
"maxMessageLength",
|
||||
"maxMessageLength",
|
||||
maxMessageLength_3_free,
|
||||
maxMessageLength_3_print,
|
||||
maxMessageLength_3_constraint,
|
||||
maxMessageLength_3_decode_ber,
|
||||
maxMessageLength_3_encode_der,
|
||||
maxMessageLength_3_decode_xer,
|
||||
maxMessageLength_3_encode_xer,
|
||||
0, 0, /* No PER support, use "-gen-PER" to enable */
|
||||
0, /* Use generic outmost tag fetcher */
|
||||
asn_DEF_maxMessageLength_tags_3,
|
||||
sizeof(asn_DEF_maxMessageLength_tags_3)
|
||||
/sizeof(asn_DEF_maxMessageLength_tags_3[0]) - 1, /* 1 */
|
||||
asn_DEF_maxMessageLength_tags_3, /* Same as above */
|
||||
sizeof(asn_DEF_maxMessageLength_tags_3)
|
||||
/sizeof(asn_DEF_maxMessageLength_tags_3[0]), /* 2 */
|
||||
0, /* No PER visible constraints */
|
||||
0, 0, /* No members */
|
||||
&asn_SPC_maxMessageLength_specs_3 /* Additional specs */
|
||||
};
|
||||
|
||||
static asn_TYPE_member_t asn_MBR_PrefixFulfillment_1[] = {
|
||||
{ ATF_NOFLAGS, 0, offsetof(struct PrefixFulfillment, prefix),
|
||||
(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
|
||||
-1, /* IMPLICIT tag at current level */
|
||||
&asn_DEF_OCTET_STRING,
|
||||
0, /* Defer constraints checking to the member type */
|
||||
0, /* PER is not compiled, use -gen-PER */
|
||||
0,
|
||||
"prefix"
|
||||
},
|
||||
{ ATF_NOFLAGS, 0, offsetof(struct PrefixFulfillment, maxMessageLength),
|
||||
(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
|
||||
-1, /* IMPLICIT tag at current level */
|
||||
&asn_DEF_maxMessageLength_3,
|
||||
memb_maxMessageLength_constraint_1,
|
||||
0, /* PER is not compiled, use -gen-PER */
|
||||
0,
|
||||
"maxMessageLength"
|
||||
},
|
||||
{ ATF_POINTER, 0, offsetof(struct PrefixFulfillment, subfulfillment),
|
||||
(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
|
||||
+1, /* EXPLICIT tag at current level */
|
||||
&asn_DEF_Fulfillment,
|
||||
0, /* Defer constraints checking to the member type */
|
||||
0, /* PER is not compiled, use -gen-PER */
|
||||
0,
|
||||
"subfulfillment"
|
||||
},
|
||||
};
|
||||
static const ber_tlv_tag_t asn_DEF_PrefixFulfillment_tags_1[] = {
|
||||
(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
|
||||
};
|
||||
static const asn_TYPE_tag2member_t asn_MAP_PrefixFulfillment_tag2el_1[] = {
|
||||
{ (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* prefix */
|
||||
{ (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* maxMessageLength */
|
||||
{ (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* subfulfillment */
|
||||
};
|
||||
static asn_SEQUENCE_specifics_t asn_SPC_PrefixFulfillment_specs_1 = {
|
||||
sizeof(struct PrefixFulfillment),
|
||||
offsetof(struct PrefixFulfillment, _asn_ctx),
|
||||
asn_MAP_PrefixFulfillment_tag2el_1,
|
||||
3, /* Count of tags in the map */
|
||||
0, 0, 0, /* Optional elements (not needed) */
|
||||
-1, /* Start extensions */
|
||||
-1 /* Stop extensions */
|
||||
};
|
||||
asn_TYPE_descriptor_t asn_DEF_PrefixFulfillment = {
|
||||
"PrefixFulfillment",
|
||||
"PrefixFulfillment",
|
||||
SEQUENCE_free,
|
||||
SEQUENCE_print,
|
||||
SEQUENCE_constraint,
|
||||
SEQUENCE_decode_ber,
|
||||
SEQUENCE_encode_der,
|
||||
SEQUENCE_decode_xer,
|
||||
SEQUENCE_encode_xer,
|
||||
0, 0, /* No PER support, use "-gen-PER" to enable */
|
||||
0, /* Use generic outmost tag fetcher */
|
||||
asn_DEF_PrefixFulfillment_tags_1,
|
||||
sizeof(asn_DEF_PrefixFulfillment_tags_1)
|
||||
/sizeof(asn_DEF_PrefixFulfillment_tags_1[0]), /* 1 */
|
||||
asn_DEF_PrefixFulfillment_tags_1, /* Same as above */
|
||||
sizeof(asn_DEF_PrefixFulfillment_tags_1)
|
||||
/sizeof(asn_DEF_PrefixFulfillment_tags_1[0]), /* 1 */
|
||||
0, /* No PER visible constraints */
|
||||
asn_MBR_PrefixFulfillment_1,
|
||||
3, /* Elements count */
|
||||
&asn_SPC_PrefixFulfillment_specs_1 /* Additional specs */
|
||||
};
|
||||
|
||||
@@ -1,50 +0,0 @@
|
||||
// Copyright (c) 2016-2023 The Hush developers
|
||||
// Distributed under the GPLv3 software license, see the accompanying
|
||||
// file COPYING or https://www.gnu.org/licenses/gpl-3.0.en.html
|
||||
/*
|
||||
* Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
|
||||
* From ASN.1 module "Crypto-Conditions"
|
||||
* found in "CryptoConditions.asn"
|
||||
*/
|
||||
|
||||
#ifndef _PrefixFulfillment_H_
|
||||
#define _PrefixFulfillment_H_
|
||||
|
||||
|
||||
#include "asn_application.h"
|
||||
|
||||
/* Including external dependencies */
|
||||
#include <OCTET_STRING.h>
|
||||
#include <NativeInteger.h>
|
||||
#include <constr_SEQUENCE.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* Forward declarations */
|
||||
struct Fulfillment;
|
||||
|
||||
/* PrefixFulfillment */
|
||||
typedef struct PrefixFulfillment {
|
||||
OCTET_STRING_t prefix;
|
||||
unsigned long maxMessageLength;
|
||||
struct Fulfillment *subfulfillment;
|
||||
|
||||
/* Context for parsing across buffer boundaries */
|
||||
asn_struct_ctx_t _asn_ctx;
|
||||
} PrefixFulfillment_t;
|
||||
|
||||
/* Implementation */
|
||||
/* extern asn_TYPE_descriptor_t asn_DEF_maxMessageLength_3; // (Use -fall-defs-global to expose) */
|
||||
extern asn_TYPE_descriptor_t asn_DEF_PrefixFulfillment;
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Referred external types */
|
||||
#include "Fulfillment.h"
|
||||
|
||||
#endif /* _PrefixFulfillment_H_ */
|
||||
#include <asn_internal.h>
|
||||
@@ -1,61 +0,0 @@
|
||||
// Copyright (c) 2016-2023 The Hush developers
|
||||
// Distributed under the GPLv3 software license, see the accompanying
|
||||
// file COPYING or https://www.gnu.org/licenses/gpl-3.0.en.html
|
||||
/*
|
||||
* Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
|
||||
* From ASN.1 module "Crypto-Conditions"
|
||||
* found in "CryptoConditions.asn"
|
||||
*/
|
||||
|
||||
#include "PreimageFulfillment.h"
|
||||
|
||||
static asn_TYPE_member_t asn_MBR_PreimageFulfillment_1[] = {
|
||||
{ ATF_NOFLAGS, 0, offsetof(struct PreimageFulfillment, preimage),
|
||||
(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
|
||||
-1, /* IMPLICIT tag at current level */
|
||||
&asn_DEF_OCTET_STRING,
|
||||
0, /* Defer constraints checking to the member type */
|
||||
0, /* PER is not compiled, use -gen-PER */
|
||||
0,
|
||||
"preimage"
|
||||
},
|
||||
};
|
||||
static const ber_tlv_tag_t asn_DEF_PreimageFulfillment_tags_1[] = {
|
||||
(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
|
||||
};
|
||||
static const asn_TYPE_tag2member_t asn_MAP_PreimageFulfillment_tag2el_1[] = {
|
||||
{ (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* preimage */
|
||||
};
|
||||
static asn_SEQUENCE_specifics_t asn_SPC_PreimageFulfillment_specs_1 = {
|
||||
sizeof(struct PreimageFulfillment),
|
||||
offsetof(struct PreimageFulfillment, _asn_ctx),
|
||||
asn_MAP_PreimageFulfillment_tag2el_1,
|
||||
1, /* Count of tags in the map */
|
||||
0, 0, 0, /* Optional elements (not needed) */
|
||||
-1, /* Start extensions */
|
||||
-1 /* Stop extensions */
|
||||
};
|
||||
asn_TYPE_descriptor_t asn_DEF_PreimageFulfillment = {
|
||||
"PreimageFulfillment",
|
||||
"PreimageFulfillment",
|
||||
SEQUENCE_free,
|
||||
SEQUENCE_print,
|
||||
SEQUENCE_constraint,
|
||||
SEQUENCE_decode_ber,
|
||||
SEQUENCE_encode_der,
|
||||
SEQUENCE_decode_xer,
|
||||
SEQUENCE_encode_xer,
|
||||
0, 0, /* No PER support, use "-gen-PER" to enable */
|
||||
0, /* Use generic outmost tag fetcher */
|
||||
asn_DEF_PreimageFulfillment_tags_1,
|
||||
sizeof(asn_DEF_PreimageFulfillment_tags_1)
|
||||
/sizeof(asn_DEF_PreimageFulfillment_tags_1[0]), /* 1 */
|
||||
asn_DEF_PreimageFulfillment_tags_1, /* Same as above */
|
||||
sizeof(asn_DEF_PreimageFulfillment_tags_1)
|
||||
/sizeof(asn_DEF_PreimageFulfillment_tags_1[0]), /* 1 */
|
||||
0, /* No PER visible constraints */
|
||||
asn_MBR_PreimageFulfillment_1,
|
||||
1, /* Elements count */
|
||||
&asn_SPC_PreimageFulfillment_specs_1 /* Additional specs */
|
||||
};
|
||||
|
||||
@@ -1,40 +0,0 @@
|
||||
// Copyright (c) 2016-2023 The Hush developers
|
||||
// Distributed under the GPLv3 software license, see the accompanying
|
||||
// file COPYING or https://www.gnu.org/licenses/gpl-3.0.en.html
|
||||
/*
|
||||
* Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
|
||||
* From ASN.1 module "Crypto-Conditions"
|
||||
* found in "CryptoConditions.asn"
|
||||
*/
|
||||
|
||||
#ifndef _PreimageFulfillment_H_
|
||||
#define _PreimageFulfillment_H_
|
||||
|
||||
|
||||
#include "asn_application.h"
|
||||
|
||||
/* Including external dependencies */
|
||||
#include <OCTET_STRING.h>
|
||||
#include <constr_SEQUENCE.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* PreimageFulfillment */
|
||||
typedef struct PreimageFulfillment {
|
||||
OCTET_STRING_t preimage;
|
||||
|
||||
/* Context for parsing across buffer boundaries */
|
||||
asn_struct_ctx_t _asn_ctx;
|
||||
} PreimageFulfillment_t;
|
||||
|
||||
/* Implementation */
|
||||
extern asn_TYPE_descriptor_t asn_DEF_PreimageFulfillment;
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _PreimageFulfillment_H_ */
|
||||
#include <asn_internal.h>
|
||||
@@ -1,61 +0,0 @@
|
||||
// Copyright (c) 2016-2023 The Hush developers
|
||||
// Distributed under the GPLv3 software license, see the accompanying
|
||||
// file COPYING or https://www.gnu.org/licenses/gpl-3.0.en.html
|
||||
/*
|
||||
* Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
|
||||
* From ASN.1 module "Crypto-Conditions"
|
||||
* found in "CryptoConditions.asn"
|
||||
*/
|
||||
|
||||
#include "RsaFingerprintContents.h"
|
||||
|
||||
static asn_TYPE_member_t asn_MBR_RsaFingerprintContents_1[] = {
|
||||
{ ATF_NOFLAGS, 0, offsetof(struct RsaFingerprintContents, modulus),
|
||||
(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
|
||||
-1, /* IMPLICIT tag at current level */
|
||||
&asn_DEF_OCTET_STRING,
|
||||
0, /* Defer constraints checking to the member type */
|
||||
0, /* PER is not compiled, use -gen-PER */
|
||||
0,
|
||||
"modulus"
|
||||
},
|
||||
};
|
||||
static const ber_tlv_tag_t asn_DEF_RsaFingerprintContents_tags_1[] = {
|
||||
(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
|
||||
};
|
||||
static const asn_TYPE_tag2member_t asn_MAP_RsaFingerprintContents_tag2el_1[] = {
|
||||
{ (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* modulus */
|
||||
};
|
||||
static asn_SEQUENCE_specifics_t asn_SPC_RsaFingerprintContents_specs_1 = {
|
||||
sizeof(struct RsaFingerprintContents),
|
||||
offsetof(struct RsaFingerprintContents, _asn_ctx),
|
||||
asn_MAP_RsaFingerprintContents_tag2el_1,
|
||||
1, /* Count of tags in the map */
|
||||
0, 0, 0, /* Optional elements (not needed) */
|
||||
-1, /* Start extensions */
|
||||
-1 /* Stop extensions */
|
||||
};
|
||||
asn_TYPE_descriptor_t asn_DEF_RsaFingerprintContents = {
|
||||
"RsaFingerprintContents",
|
||||
"RsaFingerprintContents",
|
||||
SEQUENCE_free,
|
||||
SEQUENCE_print,
|
||||
SEQUENCE_constraint,
|
||||
SEQUENCE_decode_ber,
|
||||
SEQUENCE_encode_der,
|
||||
SEQUENCE_decode_xer,
|
||||
SEQUENCE_encode_xer,
|
||||
0, 0, /* No PER support, use "-gen-PER" to enable */
|
||||
0, /* Use generic outmost tag fetcher */
|
||||
asn_DEF_RsaFingerprintContents_tags_1,
|
||||
sizeof(asn_DEF_RsaFingerprintContents_tags_1)
|
||||
/sizeof(asn_DEF_RsaFingerprintContents_tags_1[0]), /* 1 */
|
||||
asn_DEF_RsaFingerprintContents_tags_1, /* Same as above */
|
||||
sizeof(asn_DEF_RsaFingerprintContents_tags_1)
|
||||
/sizeof(asn_DEF_RsaFingerprintContents_tags_1[0]), /* 1 */
|
||||
0, /* No PER visible constraints */
|
||||
asn_MBR_RsaFingerprintContents_1,
|
||||
1, /* Elements count */
|
||||
&asn_SPC_RsaFingerprintContents_specs_1 /* Additional specs */
|
||||
};
|
||||
|
||||
@@ -1,40 +0,0 @@
|
||||
// Copyright (c) 2016-2023 The Hush developers
|
||||
// Distributed under the GPLv3 software license, see the accompanying
|
||||
// file COPYING or https://www.gnu.org/licenses/gpl-3.0.en.html
|
||||
/*
|
||||
* Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
|
||||
* From ASN.1 module "Crypto-Conditions"
|
||||
* found in "CryptoConditions.asn"
|
||||
*/
|
||||
|
||||
#ifndef _RsaFingerprintContents_H_
|
||||
#define _RsaFingerprintContents_H_
|
||||
|
||||
|
||||
#include "asn_application.h"
|
||||
|
||||
/* Including external dependencies */
|
||||
#include <OCTET_STRING.h>
|
||||
#include <constr_SEQUENCE.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* RsaFingerprintContents */
|
||||
typedef struct RsaFingerprintContents {
|
||||
OCTET_STRING_t modulus;
|
||||
|
||||
/* Context for parsing across buffer boundaries */
|
||||
asn_struct_ctx_t _asn_ctx;
|
||||
} RsaFingerprintContents_t;
|
||||
|
||||
/* Implementation */
|
||||
extern asn_TYPE_descriptor_t asn_DEF_RsaFingerprintContents;
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _RsaFingerprintContents_H_ */
|
||||
#include <asn_internal.h>
|
||||
@@ -1,71 +0,0 @@
|
||||
// Copyright (c) 2016-2023 The Hush developers
|
||||
// Distributed under the GPLv3 software license, see the accompanying
|
||||
// file COPYING or https://www.gnu.org/licenses/gpl-3.0.en.html
|
||||
/*
|
||||
* Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
|
||||
* From ASN.1 module "Crypto-Conditions"
|
||||
* found in "CryptoConditions.asn"
|
||||
*/
|
||||
|
||||
#include "RsaSha256Fulfillment.h"
|
||||
|
||||
static asn_TYPE_member_t asn_MBR_RsaSha256Fulfillment_1[] = {
|
||||
{ ATF_NOFLAGS, 0, offsetof(struct RsaSha256Fulfillment, modulus),
|
||||
(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
|
||||
-1, /* IMPLICIT tag at current level */
|
||||
&asn_DEF_OCTET_STRING,
|
||||
0, /* Defer constraints checking to the member type */
|
||||
0, /* PER is not compiled, use -gen-PER */
|
||||
0,
|
||||
"modulus"
|
||||
},
|
||||
{ ATF_NOFLAGS, 0, offsetof(struct RsaSha256Fulfillment, signature),
|
||||
(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
|
||||
-1, /* IMPLICIT tag at current level */
|
||||
&asn_DEF_OCTET_STRING,
|
||||
0, /* Defer constraints checking to the member type */
|
||||
0, /* PER is not compiled, use -gen-PER */
|
||||
0,
|
||||
"signature"
|
||||
},
|
||||
};
|
||||
static const ber_tlv_tag_t asn_DEF_RsaSha256Fulfillment_tags_1[] = {
|
||||
(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
|
||||
};
|
||||
static const asn_TYPE_tag2member_t asn_MAP_RsaSha256Fulfillment_tag2el_1[] = {
|
||||
{ (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* modulus */
|
||||
{ (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* signature */
|
||||
};
|
||||
static asn_SEQUENCE_specifics_t asn_SPC_RsaSha256Fulfillment_specs_1 = {
|
||||
sizeof(struct RsaSha256Fulfillment),
|
||||
offsetof(struct RsaSha256Fulfillment, _asn_ctx),
|
||||
asn_MAP_RsaSha256Fulfillment_tag2el_1,
|
||||
2, /* Count of tags in the map */
|
||||
0, 0, 0, /* Optional elements (not needed) */
|
||||
-1, /* Start extensions */
|
||||
-1 /* Stop extensions */
|
||||
};
|
||||
asn_TYPE_descriptor_t asn_DEF_RsaSha256Fulfillment = {
|
||||
"RsaSha256Fulfillment",
|
||||
"RsaSha256Fulfillment",
|
||||
SEQUENCE_free,
|
||||
SEQUENCE_print,
|
||||
SEQUENCE_constraint,
|
||||
SEQUENCE_decode_ber,
|
||||
SEQUENCE_encode_der,
|
||||
SEQUENCE_decode_xer,
|
||||
SEQUENCE_encode_xer,
|
||||
0, 0, /* No PER support, use "-gen-PER" to enable */
|
||||
0, /* Use generic outmost tag fetcher */
|
||||
asn_DEF_RsaSha256Fulfillment_tags_1,
|
||||
sizeof(asn_DEF_RsaSha256Fulfillment_tags_1)
|
||||
/sizeof(asn_DEF_RsaSha256Fulfillment_tags_1[0]), /* 1 */
|
||||
asn_DEF_RsaSha256Fulfillment_tags_1, /* Same as above */
|
||||
sizeof(asn_DEF_RsaSha256Fulfillment_tags_1)
|
||||
/sizeof(asn_DEF_RsaSha256Fulfillment_tags_1[0]), /* 1 */
|
||||
0, /* No PER visible constraints */
|
||||
asn_MBR_RsaSha256Fulfillment_1,
|
||||
2, /* Elements count */
|
||||
&asn_SPC_RsaSha256Fulfillment_specs_1 /* Additional specs */
|
||||
};
|
||||
|
||||
@@ -1,41 +0,0 @@
|
||||
// Copyright (c) 2016-2023 The Hush developers
|
||||
// Distributed under the GPLv3 software license, see the accompanying
|
||||
// file COPYING or https://www.gnu.org/licenses/gpl-3.0.en.html
|
||||
/*
|
||||
* Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
|
||||
* From ASN.1 module "Crypto-Conditions"
|
||||
* found in "CryptoConditions.asn"
|
||||
*/
|
||||
|
||||
#ifndef _RsaSha256Fulfillment_H_
|
||||
#define _RsaSha256Fulfillment_H_
|
||||
|
||||
|
||||
#include "asn_application.h"
|
||||
|
||||
/* Including external dependencies */
|
||||
#include <OCTET_STRING.h>
|
||||
#include <constr_SEQUENCE.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* RsaSha256Fulfillment */
|
||||
typedef struct RsaSha256Fulfillment {
|
||||
OCTET_STRING_t modulus;
|
||||
OCTET_STRING_t signature;
|
||||
|
||||
/* Context for parsing across buffer boundaries */
|
||||
asn_struct_ctx_t _asn_ctx;
|
||||
} RsaSha256Fulfillment_t;
|
||||
|
||||
/* Implementation */
|
||||
extern asn_TYPE_descriptor_t asn_DEF_RsaSha256Fulfillment;
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _RsaSha256Fulfillment_H_ */
|
||||
#include <asn_internal.h>
|
||||
@@ -1,87 +0,0 @@
|
||||
// Copyright (c) 2016-2023 The Hush developers
|
||||
// Distributed under the GPLv3 software license, see the accompanying
|
||||
// file COPYING or https://www.gnu.org/licenses/gpl-3.0.en.html
|
||||
/*
|
||||
* Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
|
||||
* From ASN.1 module "Crypto-Conditions"
|
||||
* found in "CryptoConditions.asn"
|
||||
*/
|
||||
|
||||
#include "Secp256k1FingerprintContents.h"
|
||||
|
||||
static int
|
||||
memb_publicKey_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
|
||||
asn_app_constraint_failed_f *ctfailcb, void *app_key) {
|
||||
const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr;
|
||||
size_t size;
|
||||
|
||||
if(!sptr) {
|
||||
ASN__CTFAIL(app_key, td, sptr,
|
||||
"%s: value not given (%s:%d)",
|
||||
td->name, __FILE__, __LINE__);
|
||||
return -1;
|
||||
}
|
||||
|
||||
size = st->size;
|
||||
|
||||
if((size == 33)) {
|
||||
/* Constraint check succeeded */
|
||||
return 0;
|
||||
} else {
|
||||
ASN__CTFAIL(app_key, td, sptr,
|
||||
"%s: constraint failed (%s:%d)",
|
||||
td->name, __FILE__, __LINE__);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
static asn_TYPE_member_t asn_MBR_Secp256k1FingerprintContents_1[] = {
|
||||
{ ATF_NOFLAGS, 0, offsetof(struct Secp256k1FingerprintContents, publicKey),
|
||||
(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
|
||||
-1, /* IMPLICIT tag at current level */
|
||||
&asn_DEF_OCTET_STRING,
|
||||
memb_publicKey_constraint_1,
|
||||
0, /* PER is not compiled, use -gen-PER */
|
||||
0,
|
||||
"publicKey"
|
||||
},
|
||||
};
|
||||
static const ber_tlv_tag_t asn_DEF_Secp256k1FingerprintContents_tags_1[] = {
|
||||
(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
|
||||
};
|
||||
static const asn_TYPE_tag2member_t asn_MAP_Secp256k1FingerprintContents_tag2el_1[] = {
|
||||
{ (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* publicKey */
|
||||
};
|
||||
static asn_SEQUENCE_specifics_t asn_SPC_Secp256k1FingerprintContents_specs_1 = {
|
||||
sizeof(struct Secp256k1FingerprintContents),
|
||||
offsetof(struct Secp256k1FingerprintContents, _asn_ctx),
|
||||
asn_MAP_Secp256k1FingerprintContents_tag2el_1,
|
||||
1, /* Count of tags in the map */
|
||||
0, 0, 0, /* Optional elements (not needed) */
|
||||
-1, /* Start extensions */
|
||||
-1 /* Stop extensions */
|
||||
};
|
||||
asn_TYPE_descriptor_t asn_DEF_Secp256k1FingerprintContents = {
|
||||
"Secp256k1FingerprintContents",
|
||||
"Secp256k1FingerprintContents",
|
||||
SEQUENCE_free,
|
||||
SEQUENCE_print,
|
||||
SEQUENCE_constraint,
|
||||
SEQUENCE_decode_ber,
|
||||
SEQUENCE_encode_der,
|
||||
SEQUENCE_decode_xer,
|
||||
SEQUENCE_encode_xer,
|
||||
0, 0, /* No PER support, use "-gen-PER" to enable */
|
||||
0, /* Use generic outmost tag fetcher */
|
||||
asn_DEF_Secp256k1FingerprintContents_tags_1,
|
||||
sizeof(asn_DEF_Secp256k1FingerprintContents_tags_1)
|
||||
/sizeof(asn_DEF_Secp256k1FingerprintContents_tags_1[0]), /* 1 */
|
||||
asn_DEF_Secp256k1FingerprintContents_tags_1, /* Same as above */
|
||||
sizeof(asn_DEF_Secp256k1FingerprintContents_tags_1)
|
||||
/sizeof(asn_DEF_Secp256k1FingerprintContents_tags_1[0]), /* 1 */
|
||||
0, /* No PER visible constraints */
|
||||
asn_MBR_Secp256k1FingerprintContents_1,
|
||||
1, /* Elements count */
|
||||
&asn_SPC_Secp256k1FingerprintContents_specs_1 /* Additional specs */
|
||||
};
|
||||
|
||||
@@ -1,40 +0,0 @@
|
||||
// Copyright (c) 2016-2023 The Hush developers
|
||||
// Distributed under the GPLv3 software license, see the accompanying
|
||||
// file COPYING or https://www.gnu.org/licenses/gpl-3.0.en.html
|
||||
/*
|
||||
* Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
|
||||
* From ASN.1 module "Crypto-Conditions"
|
||||
* found in "CryptoConditions.asn"
|
||||
*/
|
||||
|
||||
#ifndef _Secp256k1FingerprintContents_H_
|
||||
#define _Secp256k1FingerprintContents_H_
|
||||
|
||||
|
||||
#include "asn_application.h"
|
||||
|
||||
/* Including external dependencies */
|
||||
#include <OCTET_STRING.h>
|
||||
#include <constr_SEQUENCE.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* Secp256k1FingerprintContents */
|
||||
typedef struct Secp256k1FingerprintContents {
|
||||
OCTET_STRING_t publicKey;
|
||||
|
||||
/* Context for parsing across buffer boundaries */
|
||||
asn_struct_ctx_t _asn_ctx;
|
||||
} Secp256k1FingerprintContents_t;
|
||||
|
||||
/* Implementation */
|
||||
extern asn_TYPE_descriptor_t asn_DEF_Secp256k1FingerprintContents;
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _Secp256k1FingerprintContents_H_ */
|
||||
#include <asn_internal.h>
|
||||
@@ -1,123 +0,0 @@
|
||||
// Copyright (c) 2016-2023 The Hush developers
|
||||
// Distributed under the GPLv3 software license, see the accompanying
|
||||
// file COPYING or https://www.gnu.org/licenses/gpl-3.0.en.html
|
||||
/*
|
||||
* Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
|
||||
* From ASN.1 module "Crypto-Conditions"
|
||||
* found in "CryptoConditions.asn"
|
||||
*/
|
||||
|
||||
#include "Secp256k1Fulfillment.h"
|
||||
|
||||
static int
|
||||
memb_publicKey_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
|
||||
asn_app_constraint_failed_f *ctfailcb, void *app_key) {
|
||||
const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr;
|
||||
size_t size;
|
||||
|
||||
if(!sptr) {
|
||||
ASN__CTFAIL(app_key, td, sptr,
|
||||
"%s: value not given (%s:%d)",
|
||||
td->name, __FILE__, __LINE__);
|
||||
return -1;
|
||||
}
|
||||
|
||||
size = st->size;
|
||||
|
||||
if((size == 33)) {
|
||||
/* Constraint check succeeded */
|
||||
return 0;
|
||||
} else {
|
||||
ASN__CTFAIL(app_key, td, sptr,
|
||||
"%s: constraint failed (%s:%d)",
|
||||
td->name, __FILE__, __LINE__);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
static int
|
||||
memb_signature_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
|
||||
asn_app_constraint_failed_f *ctfailcb, void *app_key) {
|
||||
const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr;
|
||||
size_t size;
|
||||
|
||||
if(!sptr) {
|
||||
ASN__CTFAIL(app_key, td, sptr,
|
||||
"%s: value not given (%s:%d)",
|
||||
td->name, __FILE__, __LINE__);
|
||||
return -1;
|
||||
}
|
||||
|
||||
size = st->size;
|
||||
|
||||
if((size == 64)) {
|
||||
/* Constraint check succeeded */
|
||||
return 0;
|
||||
} else {
|
||||
ASN__CTFAIL(app_key, td, sptr,
|
||||
"%s: constraint failed (%s:%d)",
|
||||
td->name, __FILE__, __LINE__);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
static asn_TYPE_member_t asn_MBR_Secp256k1Fulfillment_1[] = {
|
||||
{ ATF_NOFLAGS, 0, offsetof(struct Secp256k1Fulfillment, publicKey),
|
||||
(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
|
||||
-1, /* IMPLICIT tag at current level */
|
||||
&asn_DEF_OCTET_STRING,
|
||||
memb_publicKey_constraint_1,
|
||||
0, /* PER is not compiled, use -gen-PER */
|
||||
0,
|
||||
"publicKey"
|
||||
},
|
||||
{ ATF_NOFLAGS, 0, offsetof(struct Secp256k1Fulfillment, signature),
|
||||
(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
|
||||
-1, /* IMPLICIT tag at current level */
|
||||
&asn_DEF_OCTET_STRING,
|
||||
memb_signature_constraint_1,
|
||||
0, /* PER is not compiled, use -gen-PER */
|
||||
0,
|
||||
"signature"
|
||||
},
|
||||
};
|
||||
static const ber_tlv_tag_t asn_DEF_Secp256k1Fulfillment_tags_1[] = {
|
||||
(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
|
||||
};
|
||||
static const asn_TYPE_tag2member_t asn_MAP_Secp256k1Fulfillment_tag2el_1[] = {
|
||||
{ (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* publicKey */
|
||||
{ (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* signature */
|
||||
};
|
||||
static asn_SEQUENCE_specifics_t asn_SPC_Secp256k1Fulfillment_specs_1 = {
|
||||
sizeof(struct Secp256k1Fulfillment),
|
||||
offsetof(struct Secp256k1Fulfillment, _asn_ctx),
|
||||
asn_MAP_Secp256k1Fulfillment_tag2el_1,
|
||||
2, /* Count of tags in the map */
|
||||
0, 0, 0, /* Optional elements (not needed) */
|
||||
-1, /* Start extensions */
|
||||
-1 /* Stop extensions */
|
||||
};
|
||||
asn_TYPE_descriptor_t asn_DEF_Secp256k1Fulfillment = {
|
||||
"Secp256k1Fulfillment",
|
||||
"Secp256k1Fulfillment",
|
||||
SEQUENCE_free,
|
||||
SEQUENCE_print,
|
||||
SEQUENCE_constraint,
|
||||
SEQUENCE_decode_ber,
|
||||
SEQUENCE_encode_der,
|
||||
SEQUENCE_decode_xer,
|
||||
SEQUENCE_encode_xer,
|
||||
0, 0, /* No PER support, use "-gen-PER" to enable */
|
||||
0, /* Use generic outmost tag fetcher */
|
||||
asn_DEF_Secp256k1Fulfillment_tags_1,
|
||||
sizeof(asn_DEF_Secp256k1Fulfillment_tags_1)
|
||||
/sizeof(asn_DEF_Secp256k1Fulfillment_tags_1[0]), /* 1 */
|
||||
asn_DEF_Secp256k1Fulfillment_tags_1, /* Same as above */
|
||||
sizeof(asn_DEF_Secp256k1Fulfillment_tags_1)
|
||||
/sizeof(asn_DEF_Secp256k1Fulfillment_tags_1[0]), /* 1 */
|
||||
0, /* No PER visible constraints */
|
||||
asn_MBR_Secp256k1Fulfillment_1,
|
||||
2, /* Elements count */
|
||||
&asn_SPC_Secp256k1Fulfillment_specs_1 /* Additional specs */
|
||||
};
|
||||
|
||||
@@ -1,41 +0,0 @@
|
||||
// Copyright (c) 2016-2023 The Hush developers
|
||||
// Distributed under the GPLv3 software license, see the accompanying
|
||||
// file COPYING or https://www.gnu.org/licenses/gpl-3.0.en.html
|
||||
/*
|
||||
* Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
|
||||
* From ASN.1 module "Crypto-Conditions"
|
||||
* found in "CryptoConditions.asn"
|
||||
*/
|
||||
|
||||
#ifndef _Secp256k1Fulfillment_H_
|
||||
#define _Secp256k1Fulfillment_H_
|
||||
|
||||
|
||||
#include "asn_application.h"
|
||||
|
||||
/* Including external dependencies */
|
||||
#include <OCTET_STRING.h>
|
||||
#include <constr_SEQUENCE.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* Secp256k1Fulfillment */
|
||||
typedef struct Secp256k1Fulfillment {
|
||||
OCTET_STRING_t publicKey;
|
||||
OCTET_STRING_t signature;
|
||||
|
||||
/* Context for parsing across buffer boundaries */
|
||||
asn_struct_ctx_t _asn_ctx;
|
||||
} Secp256k1Fulfillment_t;
|
||||
|
||||
/* Implementation */
|
||||
extern asn_TYPE_descriptor_t asn_DEF_Secp256k1Fulfillment;
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _Secp256k1Fulfillment_H_ */
|
||||
#include <asn_internal.h>
|
||||
@@ -1,228 +0,0 @@
|
||||
// Copyright (c) 2016-2023 The Hush developers
|
||||
// Distributed under the GPLv3 software license, see the accompanying
|
||||
// file COPYING or https://www.gnu.org/licenses/gpl-3.0.en.html
|
||||
/*
|
||||
* Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
|
||||
* From ASN.1 module "Crypto-Conditions"
|
||||
* found in "CryptoConditions.asn"
|
||||
*/
|
||||
|
||||
#include "SimpleSha256Condition.h"
|
||||
|
||||
static int
|
||||
cost_3_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
|
||||
asn_app_constraint_failed_f *ctfailcb, void *app_key) {
|
||||
|
||||
if(!sptr) {
|
||||
ASN__CTFAIL(app_key, td, sptr,
|
||||
"%s: value not given (%s:%d)",
|
||||
td->name, __FILE__, __LINE__);
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
/* Constraint check succeeded */
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* This type is implemented using NativeInteger,
|
||||
* so here we adjust the DEF accordingly.
|
||||
*/
|
||||
static void
|
||||
cost_3_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
|
||||
td->free_struct = asn_DEF_NativeInteger.free_struct;
|
||||
td->print_struct = asn_DEF_NativeInteger.print_struct;
|
||||
td->check_constraints = asn_DEF_NativeInteger.check_constraints;
|
||||
td->ber_decoder = asn_DEF_NativeInteger.ber_decoder;
|
||||
td->der_encoder = asn_DEF_NativeInteger.der_encoder;
|
||||
td->xer_decoder = asn_DEF_NativeInteger.xer_decoder;
|
||||
td->xer_encoder = asn_DEF_NativeInteger.xer_encoder;
|
||||
td->uper_decoder = asn_DEF_NativeInteger.uper_decoder;
|
||||
td->uper_encoder = asn_DEF_NativeInteger.uper_encoder;
|
||||
if(!td->per_constraints)
|
||||
td->per_constraints = asn_DEF_NativeInteger.per_constraints;
|
||||
td->elements = asn_DEF_NativeInteger.elements;
|
||||
td->elements_count = asn_DEF_NativeInteger.elements_count;
|
||||
/* td->specifics = asn_DEF_NativeInteger.specifics; // Defined explicitly */
|
||||
}
|
||||
|
||||
static void
|
||||
cost_3_free(asn_TYPE_descriptor_t *td,
|
||||
void *struct_ptr, int contents_only) {
|
||||
cost_3_inherit_TYPE_descriptor(td);
|
||||
td->free_struct(td, struct_ptr, contents_only);
|
||||
}
|
||||
|
||||
static int
|
||||
cost_3_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
|
||||
int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
|
||||
cost_3_inherit_TYPE_descriptor(td);
|
||||
return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
|
||||
}
|
||||
|
||||
static asn_dec_rval_t
|
||||
cost_3_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
|
||||
void **structure, const void *bufptr, size_t size, int tag_mode) {
|
||||
cost_3_inherit_TYPE_descriptor(td);
|
||||
return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
|
||||
}
|
||||
|
||||
static asn_enc_rval_t
|
||||
cost_3_encode_der(asn_TYPE_descriptor_t *td,
|
||||
void *structure, int tag_mode, ber_tlv_tag_t tag,
|
||||
asn_app_consume_bytes_f *cb, void *app_key) {
|
||||
cost_3_inherit_TYPE_descriptor(td);
|
||||
return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
|
||||
}
|
||||
|
||||
static asn_dec_rval_t
|
||||
cost_3_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
|
||||
void **structure, const char *opt_mname, const void *bufptr, size_t size) {
|
||||
cost_3_inherit_TYPE_descriptor(td);
|
||||
return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
|
||||
}
|
||||
|
||||
static asn_enc_rval_t
|
||||
cost_3_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
|
||||
int ilevel, enum xer_encoder_flags_e flags,
|
||||
asn_app_consume_bytes_f *cb, void *app_key) {
|
||||
cost_3_inherit_TYPE_descriptor(td);
|
||||
return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
|
||||
}
|
||||
|
||||
static int
|
||||
memb_fingerprint_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
|
||||
asn_app_constraint_failed_f *ctfailcb, void *app_key) {
|
||||
const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr;
|
||||
size_t size;
|
||||
|
||||
if(!sptr) {
|
||||
ASN__CTFAIL(app_key, td, sptr,
|
||||
"%s: value not given (%s:%d)",
|
||||
td->name, __FILE__, __LINE__);
|
||||
return -1;
|
||||
}
|
||||
|
||||
size = st->size;
|
||||
|
||||
if((size == 32)) {
|
||||
/* Constraint check succeeded */
|
||||
return 0;
|
||||
} else {
|
||||
ASN__CTFAIL(app_key, td, sptr,
|
||||
"%s: constraint failed (%s:%d)",
|
||||
td->name, __FILE__, __LINE__);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
static int
|
||||
memb_cost_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
|
||||
asn_app_constraint_failed_f *ctfailcb, void *app_key) {
|
||||
|
||||
if(!sptr) {
|
||||
ASN__CTFAIL(app_key, td, sptr,
|
||||
"%s: value not given (%s:%d)",
|
||||
td->name, __FILE__, __LINE__);
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
/* Constraint check succeeded */
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const asn_INTEGER_specifics_t asn_SPC_cost_specs_3 = {
|
||||
0, 0, 0, 0, 0,
|
||||
0, /* Native long size */
|
||||
1 /* Unsigned representation */
|
||||
};
|
||||
static const ber_tlv_tag_t asn_DEF_cost_tags_3[] = {
|
||||
(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
|
||||
(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
|
||||
};
|
||||
static /* Use -fall-defs-global to expose */
|
||||
asn_TYPE_descriptor_t asn_DEF_cost_3 = {
|
||||
"cost",
|
||||
"cost",
|
||||
cost_3_free,
|
||||
cost_3_print,
|
||||
cost_3_constraint,
|
||||
cost_3_decode_ber,
|
||||
cost_3_encode_der,
|
||||
cost_3_decode_xer,
|
||||
cost_3_encode_xer,
|
||||
0, 0, /* No PER support, use "-gen-PER" to enable */
|
||||
0, /* Use generic outmost tag fetcher */
|
||||
asn_DEF_cost_tags_3,
|
||||
sizeof(asn_DEF_cost_tags_3)
|
||||
/sizeof(asn_DEF_cost_tags_3[0]) - 1, /* 1 */
|
||||
asn_DEF_cost_tags_3, /* Same as above */
|
||||
sizeof(asn_DEF_cost_tags_3)
|
||||
/sizeof(asn_DEF_cost_tags_3[0]), /* 2 */
|
||||
0, /* No PER visible constraints */
|
||||
0, 0, /* No members */
|
||||
&asn_SPC_cost_specs_3 /* Additional specs */
|
||||
};
|
||||
|
||||
static asn_TYPE_member_t asn_MBR_SimpleSha256Condition_1[] = {
|
||||
{ ATF_NOFLAGS, 0, offsetof(struct SimpleSha256Condition, fingerprint),
|
||||
(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
|
||||
-1, /* IMPLICIT tag at current level */
|
||||
&asn_DEF_OCTET_STRING,
|
||||
memb_fingerprint_constraint_1,
|
||||
0, /* PER is not compiled, use -gen-PER */
|
||||
0,
|
||||
"fingerprint"
|
||||
},
|
||||
{ ATF_NOFLAGS, 0, offsetof(struct SimpleSha256Condition, cost),
|
||||
(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
|
||||
-1, /* IMPLICIT tag at current level */
|
||||
&asn_DEF_cost_3,
|
||||
memb_cost_constraint_1,
|
||||
0, /* PER is not compiled, use -gen-PER */
|
||||
0,
|
||||
"cost"
|
||||
},
|
||||
};
|
||||
static const ber_tlv_tag_t asn_DEF_SimpleSha256Condition_tags_1[] = {
|
||||
(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
|
||||
};
|
||||
static const asn_TYPE_tag2member_t asn_MAP_SimpleSha256Condition_tag2el_1[] = {
|
||||
{ (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* fingerprint */
|
||||
{ (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* cost */
|
||||
};
|
||||
static asn_SEQUENCE_specifics_t asn_SPC_SimpleSha256Condition_specs_1 = {
|
||||
sizeof(struct SimpleSha256Condition),
|
||||
offsetof(struct SimpleSha256Condition, _asn_ctx),
|
||||
asn_MAP_SimpleSha256Condition_tag2el_1,
|
||||
2, /* Count of tags in the map */
|
||||
0, 0, 0, /* Optional elements (not needed) */
|
||||
-1, /* Start extensions */
|
||||
-1 /* Stop extensions */
|
||||
};
|
||||
asn_TYPE_descriptor_t asn_DEF_SimpleSha256Condition = {
|
||||
"SimpleSha256Condition",
|
||||
"SimpleSha256Condition",
|
||||
SEQUENCE_free,
|
||||
SEQUENCE_print,
|
||||
SEQUENCE_constraint,
|
||||
SEQUENCE_decode_ber,
|
||||
SEQUENCE_encode_der,
|
||||
SEQUENCE_decode_xer,
|
||||
SEQUENCE_encode_xer,
|
||||
0, 0, /* No PER support, use "-gen-PER" to enable */
|
||||
0, /* Use generic outmost tag fetcher */
|
||||
asn_DEF_SimpleSha256Condition_tags_1,
|
||||
sizeof(asn_DEF_SimpleSha256Condition_tags_1)
|
||||
/sizeof(asn_DEF_SimpleSha256Condition_tags_1[0]), /* 1 */
|
||||
asn_DEF_SimpleSha256Condition_tags_1, /* Same as above */
|
||||
sizeof(asn_DEF_SimpleSha256Condition_tags_1)
|
||||
/sizeof(asn_DEF_SimpleSha256Condition_tags_1[0]), /* 1 */
|
||||
0, /* No PER visible constraints */
|
||||
asn_MBR_SimpleSha256Condition_1,
|
||||
2, /* Elements count */
|
||||
&asn_SPC_SimpleSha256Condition_specs_1 /* Additional specs */
|
||||
};
|
||||
|
||||
@@ -1,43 +0,0 @@
|
||||
// Copyright (c) 2016-2023 The Hush developers
|
||||
// Distributed under the GPLv3 software license, see the accompanying
|
||||
// file COPYING or https://www.gnu.org/licenses/gpl-3.0.en.html
|
||||
/*
|
||||
* Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
|
||||
* From ASN.1 module "Crypto-Conditions"
|
||||
* found in "CryptoConditions.asn"
|
||||
*/
|
||||
|
||||
#ifndef _SimpleSha256Condition_H_
|
||||
#define _SimpleSha256Condition_H_
|
||||
|
||||
|
||||
#include "asn_application.h"
|
||||
|
||||
/* Including external dependencies */
|
||||
#include <OCTET_STRING.h>
|
||||
#include <NativeInteger.h>
|
||||
#include <constr_SEQUENCE.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* SimpleSha256Condition */
|
||||
typedef struct SimpleSha256Condition {
|
||||
OCTET_STRING_t fingerprint;
|
||||
unsigned long cost;
|
||||
|
||||
/* Context for parsing across buffer boundaries */
|
||||
asn_struct_ctx_t _asn_ctx;
|
||||
} SimpleSha256Condition_t;
|
||||
|
||||
/* Implementation */
|
||||
/* extern asn_TYPE_descriptor_t asn_DEF_cost_3; // (Use -fall-defs-global to expose) */
|
||||
extern asn_TYPE_descriptor_t asn_DEF_SimpleSha256Condition;
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _SimpleSha256Condition_H_ */
|
||||
#include <asn_internal.h>
|
||||
@@ -1,141 +0,0 @@
|
||||
// Copyright (c) 2016-2023 The Hush developers
|
||||
// Distributed under the GPLv3 software license, see the accompanying
|
||||
// file COPYING or https://www.gnu.org/licenses/gpl-3.0.en.html
|
||||
/*
|
||||
* Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
|
||||
* From ASN.1 module "Crypto-Conditions"
|
||||
* found in "CryptoConditions.asn"
|
||||
*/
|
||||
|
||||
#include "ThresholdFingerprintContents.h"
|
||||
|
||||
static int
|
||||
memb_threshold_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
|
||||
asn_app_constraint_failed_f *ctfailcb, void *app_key) {
|
||||
long value;
|
||||
|
||||
if(!sptr) {
|
||||
ASN__CTFAIL(app_key, td, sptr,
|
||||
"%s: value not given (%s:%d)",
|
||||
td->name, __FILE__, __LINE__);
|
||||
return -1;
|
||||
}
|
||||
|
||||
value = *(const long *)sptr;
|
||||
|
||||
if((value >= 1 && value <= 65535)) {
|
||||
/* Constraint check succeeded */
|
||||
return 0;
|
||||
} else {
|
||||
ASN__CTFAIL(app_key, td, sptr,
|
||||
"%s: constraint failed (%s:%d)",
|
||||
td->name, __FILE__, __LINE__);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
static asn_TYPE_member_t asn_MBR_subconditions2_3[] = {
|
||||
{ ATF_POINTER, 0, 0,
|
||||
-1 /* Ambiguous tag (CHOICE?) */,
|
||||
0,
|
||||
&asn_DEF_Condition,
|
||||
0, /* Defer constraints checking to the member type */
|
||||
0, /* PER is not compiled, use -gen-PER */
|
||||
0,
|
||||
""
|
||||
},
|
||||
};
|
||||
static const ber_tlv_tag_t asn_DEF_subconditions2_tags_3[] = {
|
||||
(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
|
||||
(ASN_TAG_CLASS_UNIVERSAL | (17 << 2))
|
||||
};
|
||||
static asn_SET_OF_specifics_t asn_SPC_subconditions2_specs_3 = {
|
||||
sizeof(struct subconditions2),
|
||||
offsetof(struct subconditions2, _asn_ctx),
|
||||
2, /* XER encoding is XMLValueList */
|
||||
};
|
||||
static /* Use -fall-defs-global to expose */
|
||||
asn_TYPE_descriptor_t asn_DEF_subconditions2_3 = {
|
||||
"subconditions2",
|
||||
"subconditions2",
|
||||
SET_OF_free,
|
||||
SET_OF_print,
|
||||
SET_OF_constraint,
|
||||
SET_OF_decode_ber,
|
||||
SET_OF_encode_der,
|
||||
SET_OF_decode_xer,
|
||||
SET_OF_encode_xer,
|
||||
0, 0, /* No PER support, use "-gen-PER" to enable */
|
||||
0, /* Use generic outmost tag fetcher */
|
||||
asn_DEF_subconditions2_tags_3,
|
||||
sizeof(asn_DEF_subconditions2_tags_3)
|
||||
/sizeof(asn_DEF_subconditions2_tags_3[0]) - 1, /* 1 */
|
||||
asn_DEF_subconditions2_tags_3, /* Same as above */
|
||||
sizeof(asn_DEF_subconditions2_tags_3)
|
||||
/sizeof(asn_DEF_subconditions2_tags_3[0]), /* 2 */
|
||||
0, /* No PER visible constraints */
|
||||
asn_MBR_subconditions2_3,
|
||||
1, /* Single element */
|
||||
&asn_SPC_subconditions2_specs_3 /* Additional specs */
|
||||
};
|
||||
|
||||
static asn_TYPE_member_t asn_MBR_ThresholdFingerprintContents_1[] = {
|
||||
{ ATF_NOFLAGS, 0, offsetof(struct ThresholdFingerprintContents, threshold),
|
||||
(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
|
||||
-1, /* IMPLICIT tag at current level */
|
||||
&asn_DEF_NativeInteger,
|
||||
memb_threshold_constraint_1,
|
||||
0, /* PER is not compiled, use -gen-PER */
|
||||
0,
|
||||
"threshold"
|
||||
},
|
||||
{ ATF_NOFLAGS, 0, offsetof(struct ThresholdFingerprintContents, subconditions2),
|
||||
(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
|
||||
0,
|
||||
&asn_DEF_subconditions2_3,
|
||||
0, /* Defer constraints checking to the member type */
|
||||
0, /* PER is not compiled, use -gen-PER */
|
||||
0,
|
||||
"subconditions2"
|
||||
},
|
||||
};
|
||||
static const ber_tlv_tag_t asn_DEF_ThresholdFingerprintContents_tags_1[] = {
|
||||
(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
|
||||
};
|
||||
static const asn_TYPE_tag2member_t asn_MAP_ThresholdFingerprintContents_tag2el_1[] = {
|
||||
{ (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* threshold */
|
||||
{ (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* subconditions2 */
|
||||
};
|
||||
static asn_SEQUENCE_specifics_t asn_SPC_ThresholdFingerprintContents_specs_1 = {
|
||||
sizeof(struct ThresholdFingerprintContents),
|
||||
offsetof(struct ThresholdFingerprintContents, _asn_ctx),
|
||||
asn_MAP_ThresholdFingerprintContents_tag2el_1,
|
||||
2, /* Count of tags in the map */
|
||||
0, 0, 0, /* Optional elements (not needed) */
|
||||
-1, /* Start extensions */
|
||||
-1 /* Stop extensions */
|
||||
};
|
||||
asn_TYPE_descriptor_t asn_DEF_ThresholdFingerprintContents = {
|
||||
"ThresholdFingerprintContents",
|
||||
"ThresholdFingerprintContents",
|
||||
SEQUENCE_free,
|
||||
SEQUENCE_print,
|
||||
SEQUENCE_constraint,
|
||||
SEQUENCE_decode_ber,
|
||||
SEQUENCE_encode_der,
|
||||
SEQUENCE_decode_xer,
|
||||
SEQUENCE_encode_xer,
|
||||
0, 0, /* No PER support, use "-gen-PER" to enable */
|
||||
0, /* Use generic outmost tag fetcher */
|
||||
asn_DEF_ThresholdFingerprintContents_tags_1,
|
||||
sizeof(asn_DEF_ThresholdFingerprintContents_tags_1)
|
||||
/sizeof(asn_DEF_ThresholdFingerprintContents_tags_1[0]), /* 1 */
|
||||
asn_DEF_ThresholdFingerprintContents_tags_1, /* Same as above */
|
||||
sizeof(asn_DEF_ThresholdFingerprintContents_tags_1)
|
||||
/sizeof(asn_DEF_ThresholdFingerprintContents_tags_1[0]), /* 1 */
|
||||
0, /* No PER visible constraints */
|
||||
asn_MBR_ThresholdFingerprintContents_1,
|
||||
2, /* Elements count */
|
||||
&asn_SPC_ThresholdFingerprintContents_specs_1 /* Additional specs */
|
||||
};
|
||||
|
||||
@@ -1,54 +0,0 @@
|
||||
// Copyright (c) 2016-2023 The Hush developers
|
||||
// Distributed under the GPLv3 software license, see the accompanying
|
||||
// file COPYING or https://www.gnu.org/licenses/gpl-3.0.en.html
|
||||
/*
|
||||
* Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
|
||||
* From ASN.1 module "Crypto-Conditions"
|
||||
* found in "CryptoConditions.asn"
|
||||
*/
|
||||
|
||||
#ifndef _ThresholdFingerprintContents_H_
|
||||
#define _ThresholdFingerprintContents_H_
|
||||
|
||||
|
||||
#include "asn_application.h"
|
||||
|
||||
/* Including external dependencies */
|
||||
#include <NativeInteger.h>
|
||||
#include <asn_SET_OF.h>
|
||||
#include <constr_SET_OF.h>
|
||||
#include <constr_SEQUENCE.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* Forward declarations */
|
||||
struct Condition;
|
||||
|
||||
/* ThresholdFingerprintContents */
|
||||
typedef struct ThresholdFingerprintContents {
|
||||
long threshold;
|
||||
struct subconditions2 {
|
||||
A_SET_OF(struct Condition) list;
|
||||
|
||||
/* Context for parsing across buffer boundaries */
|
||||
asn_struct_ctx_t _asn_ctx;
|
||||
} subconditions2;
|
||||
|
||||
/* Context for parsing across buffer boundaries */
|
||||
asn_struct_ctx_t _asn_ctx;
|
||||
} ThresholdFingerprintContents_t;
|
||||
|
||||
/* Implementation */
|
||||
extern asn_TYPE_descriptor_t asn_DEF_ThresholdFingerprintContents;
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Referred external types */
|
||||
#include "Condition.h"
|
||||
|
||||
#endif /* _ThresholdFingerprintContents_H_ */
|
||||
#include <asn_internal.h>
|
||||
@@ -1,161 +0,0 @@
|
||||
// Copyright (c) 2016-2023 The Hush developers
|
||||
// Distributed under the GPLv3 software license, see the accompanying
|
||||
// file COPYING or https://www.gnu.org/licenses/gpl-3.0.en.html
|
||||
/*
|
||||
* Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
|
||||
* From ASN.1 module "Crypto-Conditions"
|
||||
* found in "CryptoConditions.asn"
|
||||
*/
|
||||
|
||||
#include "ThresholdFulfillment.h"
|
||||
|
||||
static asn_TYPE_member_t asn_MBR_subfulfillments_2[] = {
|
||||
{ ATF_POINTER, 0, 0,
|
||||
-1 /* Ambiguous tag (CHOICE?) */,
|
||||
0,
|
||||
&asn_DEF_Fulfillment,
|
||||
0, /* Defer constraints checking to the member type */
|
||||
0, /* PER is not compiled, use -gen-PER */
|
||||
0,
|
||||
""
|
||||
},
|
||||
};
|
||||
static const ber_tlv_tag_t asn_DEF_subfulfillments_tags_2[] = {
|
||||
(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
|
||||
(ASN_TAG_CLASS_UNIVERSAL | (17 << 2))
|
||||
};
|
||||
static asn_SET_OF_specifics_t asn_SPC_subfulfillments_specs_2 = {
|
||||
sizeof(struct subfulfillments),
|
||||
offsetof(struct subfulfillments, _asn_ctx),
|
||||
2, /* XER encoding is XMLValueList */
|
||||
};
|
||||
static /* Use -fall-defs-global to expose */
|
||||
asn_TYPE_descriptor_t asn_DEF_subfulfillments_2 = {
|
||||
"subfulfillments",
|
||||
"subfulfillments",
|
||||
SET_OF_free,
|
||||
SET_OF_print,
|
||||
SET_OF_constraint,
|
||||
SET_OF_decode_ber,
|
||||
SET_OF_encode_der,
|
||||
SET_OF_decode_xer,
|
||||
SET_OF_encode_xer,
|
||||
0, 0, /* No PER support, use "-gen-PER" to enable */
|
||||
0, /* Use generic outmost tag fetcher */
|
||||
asn_DEF_subfulfillments_tags_2,
|
||||
sizeof(asn_DEF_subfulfillments_tags_2)
|
||||
/sizeof(asn_DEF_subfulfillments_tags_2[0]) - 1, /* 1 */
|
||||
asn_DEF_subfulfillments_tags_2, /* Same as above */
|
||||
sizeof(asn_DEF_subfulfillments_tags_2)
|
||||
/sizeof(asn_DEF_subfulfillments_tags_2[0]), /* 2 */
|
||||
0, /* No PER visible constraints */
|
||||
asn_MBR_subfulfillments_2,
|
||||
1, /* Single element */
|
||||
&asn_SPC_subfulfillments_specs_2 /* Additional specs */
|
||||
};
|
||||
|
||||
static asn_TYPE_member_t asn_MBR_subconditions_4[] = {
|
||||
{ ATF_POINTER, 0, 0,
|
||||
-1 /* Ambiguous tag (CHOICE?) */,
|
||||
0,
|
||||
&asn_DEF_Condition,
|
||||
0, /* Defer constraints checking to the member type */
|
||||
0, /* PER is not compiled, use -gen-PER */
|
||||
0,
|
||||
""
|
||||
},
|
||||
};
|
||||
static const ber_tlv_tag_t asn_DEF_subconditions_tags_4[] = {
|
||||
(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
|
||||
(ASN_TAG_CLASS_UNIVERSAL | (17 << 2))
|
||||
};
|
||||
static asn_SET_OF_specifics_t asn_SPC_subconditions_specs_4 = {
|
||||
sizeof(struct subconditions),
|
||||
offsetof(struct subconditions, _asn_ctx),
|
||||
2, /* XER encoding is XMLValueList */
|
||||
};
|
||||
static /* Use -fall-defs-global to expose */
|
||||
asn_TYPE_descriptor_t asn_DEF_subconditions_4 = {
|
||||
"subconditions",
|
||||
"subconditions",
|
||||
SET_OF_free,
|
||||
SET_OF_print,
|
||||
SET_OF_constraint,
|
||||
SET_OF_decode_ber,
|
||||
SET_OF_encode_der,
|
||||
SET_OF_decode_xer,
|
||||
SET_OF_encode_xer,
|
||||
0, 0, /* No PER support, use "-gen-PER" to enable */
|
||||
0, /* Use generic outmost tag fetcher */
|
||||
asn_DEF_subconditions_tags_4,
|
||||
sizeof(asn_DEF_subconditions_tags_4)
|
||||
/sizeof(asn_DEF_subconditions_tags_4[0]) - 1, /* 1 */
|
||||
asn_DEF_subconditions_tags_4, /* Same as above */
|
||||
sizeof(asn_DEF_subconditions_tags_4)
|
||||
/sizeof(asn_DEF_subconditions_tags_4[0]), /* 2 */
|
||||
0, /* No PER visible constraints */
|
||||
asn_MBR_subconditions_4,
|
||||
1, /* Single element */
|
||||
&asn_SPC_subconditions_specs_4 /* Additional specs */
|
||||
};
|
||||
|
||||
static asn_TYPE_member_t asn_MBR_ThresholdFulfillment_1[] = {
|
||||
{ ATF_NOFLAGS, 0, offsetof(struct ThresholdFulfillment, subfulfillments),
|
||||
(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
|
||||
0,
|
||||
&asn_DEF_subfulfillments_2,
|
||||
0, /* Defer constraints checking to the member type */
|
||||
0, /* PER is not compiled, use -gen-PER */
|
||||
0,
|
||||
"subfulfillments"
|
||||
},
|
||||
{ ATF_NOFLAGS, 0, offsetof(struct ThresholdFulfillment, subconditions),
|
||||
(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
|
||||
0,
|
||||
&asn_DEF_subconditions_4,
|
||||
0, /* Defer constraints checking to the member type */
|
||||
0, /* PER is not compiled, use -gen-PER */
|
||||
0,
|
||||
"subconditions"
|
||||
},
|
||||
};
|
||||
static const ber_tlv_tag_t asn_DEF_ThresholdFulfillment_tags_1[] = {
|
||||
(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
|
||||
};
|
||||
static const asn_TYPE_tag2member_t asn_MAP_ThresholdFulfillment_tag2el_1[] = {
|
||||
{ (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* subfulfillments */
|
||||
{ (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* subconditions */
|
||||
};
|
||||
static asn_SEQUENCE_specifics_t asn_SPC_ThresholdFulfillment_specs_1 = {
|
||||
sizeof(struct ThresholdFulfillment),
|
||||
offsetof(struct ThresholdFulfillment, _asn_ctx),
|
||||
asn_MAP_ThresholdFulfillment_tag2el_1,
|
||||
2, /* Count of tags in the map */
|
||||
0, 0, 0, /* Optional elements (not needed) */
|
||||
-1, /* Start extensions */
|
||||
-1 /* Stop extensions */
|
||||
};
|
||||
asn_TYPE_descriptor_t asn_DEF_ThresholdFulfillment = {
|
||||
"ThresholdFulfillment",
|
||||
"ThresholdFulfillment",
|
||||
SEQUENCE_free,
|
||||
SEQUENCE_print,
|
||||
SEQUENCE_constraint,
|
||||
SEQUENCE_decode_ber,
|
||||
SEQUENCE_encode_der,
|
||||
SEQUENCE_decode_xer,
|
||||
SEQUENCE_encode_xer,
|
||||
0, 0, /* No PER support, use "-gen-PER" to enable */
|
||||
0, /* Use generic outmost tag fetcher */
|
||||
asn_DEF_ThresholdFulfillment_tags_1,
|
||||
sizeof(asn_DEF_ThresholdFulfillment_tags_1)
|
||||
/sizeof(asn_DEF_ThresholdFulfillment_tags_1[0]), /* 1 */
|
||||
asn_DEF_ThresholdFulfillment_tags_1, /* Same as above */
|
||||
sizeof(asn_DEF_ThresholdFulfillment_tags_1)
|
||||
/sizeof(asn_DEF_ThresholdFulfillment_tags_1[0]), /* 1 */
|
||||
0, /* No PER visible constraints */
|
||||
asn_MBR_ThresholdFulfillment_1,
|
||||
2, /* Elements count */
|
||||
&asn_SPC_ThresholdFulfillment_specs_1 /* Additional specs */
|
||||
};
|
||||
|
||||
@@ -1,60 +0,0 @@
|
||||
// Copyright (c) 2016-2023 The Hush developers
|
||||
// Distributed under the GPLv3 software license, see the accompanying
|
||||
// file COPYING or https://www.gnu.org/licenses/gpl-3.0.en.html
|
||||
/*
|
||||
* Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
|
||||
* From ASN.1 module "Crypto-Conditions"
|
||||
* found in "CryptoConditions.asn"
|
||||
*/
|
||||
|
||||
#ifndef _ThresholdFulfillment_H_
|
||||
#define _ThresholdFulfillment_H_
|
||||
|
||||
|
||||
#include "asn_application.h"
|
||||
|
||||
/* Including external dependencies */
|
||||
#include <asn_SET_OF.h>
|
||||
#include <constr_SET_OF.h>
|
||||
#include <constr_SEQUENCE.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* Forward declarations */
|
||||
struct Fulfillment;
|
||||
struct Condition;
|
||||
|
||||
/* ThresholdFulfillment */
|
||||
typedef struct ThresholdFulfillment {
|
||||
struct subfulfillments {
|
||||
A_SET_OF(struct Fulfillment) list;
|
||||
|
||||
/* Context for parsing across buffer boundaries */
|
||||
asn_struct_ctx_t _asn_ctx;
|
||||
} subfulfillments;
|
||||
struct subconditions {
|
||||
A_SET_OF(struct Condition) list;
|
||||
|
||||
/* Context for parsing across buffer boundaries */
|
||||
asn_struct_ctx_t _asn_ctx;
|
||||
} subconditions;
|
||||
|
||||
/* Context for parsing across buffer boundaries */
|
||||
asn_struct_ctx_t _asn_ctx;
|
||||
} ThresholdFulfillment_t;
|
||||
|
||||
/* Implementation */
|
||||
extern asn_TYPE_descriptor_t asn_DEF_ThresholdFulfillment;
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Referred external types */
|
||||
#include "Fulfillment.h"
|
||||
#include "Condition.h"
|
||||
|
||||
#endif /* _ThresholdFulfillment_H_ */
|
||||
#include <asn_internal.h>
|
||||
@@ -1,91 +0,0 @@
|
||||
// Copyright (c) 2016-2023 The Hush developers
|
||||
// Distributed under the GPLv3 software license, see the accompanying
|
||||
// file COPYING or https://www.gnu.org/licenses/gpl-3.0.en.html
|
||||
/*-
|
||||
* Copyright (c) 2003, 2004 Lev Walkin <vlm@lionet.info>. All rights reserved.
|
||||
* Redistribution and modifications are permitted subject to BSD license.
|
||||
*/
|
||||
#include <asn_internal.h>
|
||||
#include <asn_SET_OF.h>
|
||||
#include <errno.h>
|
||||
|
||||
/*
|
||||
* Add another element into the set.
|
||||
*/
|
||||
int
|
||||
asn_set_add(void *asn_set_of_x, void *ptr) {
|
||||
asn_anonymous_set_ *as = _A_SET_FROM_VOID(asn_set_of_x);
|
||||
|
||||
if(as == 0 || ptr == 0) {
|
||||
errno = EINVAL; /* Invalid arguments */
|
||||
return -1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Make sure there's enough space to insert an element.
|
||||
*/
|
||||
if(as->count == as->size) {
|
||||
int _newsize = as->size ? (as->size << 1) : 4;
|
||||
void *_new_arr;
|
||||
_new_arr = REALLOC(as->array, _newsize * sizeof(as->array[0]));
|
||||
if(_new_arr) {
|
||||
as->array = (void **)_new_arr;
|
||||
as->size = _newsize;
|
||||
} else {
|
||||
/* ENOMEM */
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
as->array[as->count++] = ptr;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
asn_set_del(void *asn_set_of_x, int number, int _do_free) {
|
||||
asn_anonymous_set_ *as = _A_SET_FROM_VOID(asn_set_of_x);
|
||||
|
||||
if(as) {
|
||||
void *ptr;
|
||||
if(number < 0 || number >= as->count)
|
||||
return;
|
||||
|
||||
if(_do_free && as->free) {
|
||||
ptr = as->array[number];
|
||||
} else {
|
||||
ptr = 0;
|
||||
}
|
||||
|
||||
as->array[number] = as->array[--as->count];
|
||||
|
||||
/*
|
||||
* Invoke the third-party function only when the state
|
||||
* of the parent structure is consistent.
|
||||
*/
|
||||
if(ptr) as->free(ptr);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Free the contents of the set, do not free the set itself.
|
||||
*/
|
||||
void
|
||||
asn_set_empty(void *asn_set_of_x) {
|
||||
asn_anonymous_set_ *as = _A_SET_FROM_VOID(asn_set_of_x);
|
||||
|
||||
if(as) {
|
||||
if(as->array) {
|
||||
if(as->free) {
|
||||
while(as->count--)
|
||||
as->free(as->array[as->count]);
|
||||
}
|
||||
FREEMEM(as->array);
|
||||
as->array = 0;
|
||||
}
|
||||
as->count = 0;
|
||||
as->size = 0;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,65 +0,0 @@
|
||||
// Copyright (c) 2016-2023 The Hush developers
|
||||
// Distributed under the GPLv3 software license, see the accompanying
|
||||
// file COPYING or https://www.gnu.org/licenses/gpl-3.0.en.html
|
||||
/*-
|
||||
* Copyright (c) 2003, 2004 Lev Walkin <vlm@lionet.info>. All rights reserved.
|
||||
* Redistribution and modifications are permitted subject to BSD license.
|
||||
*/
|
||||
#ifndef ASN_SET_OF_H
|
||||
#define ASN_SET_OF_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#define A_SET_OF(type) \
|
||||
struct { \
|
||||
type **array; \
|
||||
int count; /* Meaningful size */ \
|
||||
int size; /* Allocated size */ \
|
||||
void (*free)(type *); \
|
||||
}
|
||||
|
||||
#define ASN_SET_ADD(headptr, ptr) \
|
||||
asn_set_add((headptr), (ptr))
|
||||
|
||||
/*******************************************
|
||||
* Implementation of the SET OF structure.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Add another structure into the set by its pointer.
|
||||
* RETURN VALUES:
|
||||
* 0 for success and -1/errno for failure.
|
||||
*/
|
||||
int asn_set_add(void *asn_set_of_x, void *ptr);
|
||||
|
||||
/*
|
||||
* Delete the element from the set by its number (base 0).
|
||||
* This is a constant-time operation. The order of elements before the
|
||||
* deleted ones is guaranteed, the order of elements after the deleted
|
||||
* one is NOT guaranteed.
|
||||
* If _do_free is given AND the (*free) is initialized, the element
|
||||
* will be freed using the custom (*free) function as well.
|
||||
*/
|
||||
void asn_set_del(void *asn_set_of_x, int number, int _do_free);
|
||||
|
||||
/*
|
||||
* Empty the contents of the set. Will free the elements, if (*free) is given.
|
||||
* Will NOT free the set itself.
|
||||
*/
|
||||
void asn_set_empty(void *asn_set_of_x);
|
||||
|
||||
/*
|
||||
* Cope with different conversions requirements to/from void in C and C++.
|
||||
* This is mostly useful for support library.
|
||||
*/
|
||||
typedef A_SET_OF(void) asn_anonymous_set_;
|
||||
#define _A_SET_FROM_VOID(ptr) ((asn_anonymous_set_ *)(ptr))
|
||||
#define _A_CSET_FROM_VOID(ptr) ((const asn_anonymous_set_ *)(ptr))
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* ASN_SET_OF_H */
|
||||
@@ -1,50 +0,0 @@
|
||||
// Copyright (c) 2016-2023 The Hush developers
|
||||
// Distributed under the GPLv3 software license, see the accompanying
|
||||
// file COPYING or https://www.gnu.org/licenses/gpl-3.0.en.html
|
||||
/*-
|
||||
* Copyright (c) 2004, 2006 Lev Walkin <vlm@lionet.info>. All rights reserved.
|
||||
* Redistribution and modifications are permitted subject to BSD license.
|
||||
*/
|
||||
/*
|
||||
* Application-level ASN.1 callbacks.
|
||||
*/
|
||||
#ifndef ASN_APPLICATION_H
|
||||
#define ASN_APPLICATION_H
|
||||
|
||||
#include "asn_system.h" /* for platform-dependent types */
|
||||
#include "asn_codecs.h" /* for ASN.1 codecs specifics */
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Generic type of an application-defined callback to return various
|
||||
* types of data to the application.
|
||||
* EXPECTED RETURN VALUES:
|
||||
* -1: Failed to consume bytes. Abort the mission.
|
||||
* Non-negative return values indicate success, and ignored.
|
||||
*/
|
||||
typedef int (asn_app_consume_bytes_f)(const void *buffer, size_t size,
|
||||
void *application_specific_key);
|
||||
|
||||
/*
|
||||
* A callback of this type is called whenever constraint validation fails
|
||||
* on some ASN.1 type. See "constraints.h" for more details on constraint
|
||||
* validation.
|
||||
* This callback specifies a descriptor of the ASN.1 type which failed
|
||||
* the constraint check, as well as human readable message on what
|
||||
* particular constraint has failed.
|
||||
*/
|
||||
typedef void (asn_app_constraint_failed_f)(void *application_specific_key,
|
||||
struct asn_TYPE_descriptor_s *type_descriptor_which_failed,
|
||||
const void *structure_which_failed_ptr,
|
||||
const char *error_message_format, ...) GCC_PRINTFLIKE(4, 5);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#include "constr_TYPE.h" /* for asn_TYPE_descriptor_t */
|
||||
|
||||
#endif /* ASN_APPLICATION_H */
|
||||
@@ -1,112 +0,0 @@
|
||||
// Copyright (c) 2016-2023 The Hush developers
|
||||
// Distributed under the GPLv3 software license, see the accompanying
|
||||
// file COPYING or https://www.gnu.org/licenses/gpl-3.0.en.html
|
||||
/*-
|
||||
* Copyright (c) 2003, 2004, 2005 Lev Walkin <vlm@lionet.info>.
|
||||
* All rights reserved.
|
||||
* Redistribution and modifications are permitted subject to BSD license.
|
||||
*/
|
||||
#ifndef ASN_CODECS_H
|
||||
#define ASN_CODECS_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
struct asn_TYPE_descriptor_s; /* Forward declaration */
|
||||
|
||||
/*
|
||||
* This structure defines a set of parameters that may be passed
|
||||
* to every ASN.1 encoder or decoder function.
|
||||
* WARNING: if max_stack_size member is set, and you are calling the
|
||||
* function pointers of the asn_TYPE_descriptor_t directly,
|
||||
* this structure must be ALLOCATED ON THE STACK!
|
||||
* If you can't always satisfy this requirement, use ber_decode(),
|
||||
* xer_decode() and uper_decode() functions instead.
|
||||
*/
|
||||
typedef struct asn_codec_ctx_s {
|
||||
/*
|
||||
* Limit the decoder routines to use no (much) more stack than a given
|
||||
* number of bytes. Most of decoders are stack-based, and this
|
||||
* would protect against stack overflows if the number of nested
|
||||
* encodings is high.
|
||||
* The OCTET STRING, BIT STRING and ANY BER decoders are heap-based,
|
||||
* and are safe from this kind of overflow.
|
||||
* A value from getrlimit(RLIMIT_STACK) may be used to initialize
|
||||
* this variable. Be careful in multithreaded environments, as the
|
||||
* stack size is rather limited.
|
||||
*/
|
||||
size_t max_stack_size; /* 0 disables stack bounds checking */
|
||||
} asn_codec_ctx_t;
|
||||
|
||||
/*
|
||||
* Type of the return value of the encoding functions (der_encode, xer_encode).
|
||||
*/
|
||||
typedef struct asn_enc_rval_s {
|
||||
/*
|
||||
* Number of bytes encoded.
|
||||
* -1 indicates failure to encode the structure.
|
||||
* In this case, the members below this one are meaningful.
|
||||
*/
|
||||
ssize_t encoded;
|
||||
|
||||
/*
|
||||
* Members meaningful when (encoded == -1), for post mortem analysis.
|
||||
*/
|
||||
|
||||
/* Type which cannot be encoded */
|
||||
struct asn_TYPE_descriptor_s *failed_type;
|
||||
|
||||
/* Pointer to the structure of that type */
|
||||
void *structure_ptr;
|
||||
} asn_enc_rval_t;
|
||||
#define ASN__ENCODE_FAILED do { \
|
||||
asn_enc_rval_t tmp_error; \
|
||||
tmp_error.encoded = -1; \
|
||||
tmp_error.failed_type = td; \
|
||||
tmp_error.structure_ptr = sptr; \
|
||||
ASN_DEBUG("Failed to encode element %s", td ? td->name : ""); \
|
||||
return tmp_error; \
|
||||
} while(0)
|
||||
#define ASN__ENCODED_OK(rval) do { \
|
||||
rval.structure_ptr = 0; \
|
||||
rval.failed_type = 0; \
|
||||
return rval; \
|
||||
} while(0)
|
||||
|
||||
/*
|
||||
* Type of the return value of the decoding functions (ber_decode, xer_decode)
|
||||
*
|
||||
* Please note that the number of consumed bytes is ALWAYS meaningful,
|
||||
* even if code==RC_FAIL. This is to indicate the number of successfully
|
||||
* decoded bytes, hence providing a possibility to fail with more diagnostics
|
||||
* (i.e., print the offending remainder of the buffer).
|
||||
*/
|
||||
enum asn_dec_rval_code_e {
|
||||
RC_OK, /* Decoded successfully */
|
||||
RC_WMORE, /* More data expected, call again */
|
||||
RC_FAIL /* Failure to decode data */
|
||||
};
|
||||
typedef struct asn_dec_rval_s {
|
||||
enum asn_dec_rval_code_e code; /* Result code */
|
||||
size_t consumed; /* Number of bytes consumed */
|
||||
} asn_dec_rval_t;
|
||||
#define ASN__DECODE_FAILED do { \
|
||||
asn_dec_rval_t tmp_error; \
|
||||
tmp_error.code = RC_FAIL; \
|
||||
tmp_error.consumed = 0; \
|
||||
ASN_DEBUG("Failed to decode element %s", td ? td->name : ""); \
|
||||
return tmp_error; \
|
||||
} while(0)
|
||||
#define ASN__DECODE_STARVED do { \
|
||||
asn_dec_rval_t tmp_error; \
|
||||
tmp_error.code = RC_WMORE; \
|
||||
tmp_error.consumed = 0; \
|
||||
return tmp_error; \
|
||||
} while(0)
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* ASN_CODECS_H */
|
||||
@@ -1,315 +0,0 @@
|
||||
// Copyright (c) 2016-2023 The Hush developers
|
||||
// Distributed under the GPLv3 software license, see the accompanying
|
||||
// file COPYING or https://www.gnu.org/licenses/gpl-3.0.en.html
|
||||
/*-
|
||||
* Copyright (c) 2003, 2004 Lev Walkin <vlm@lionet.info>. All rights reserved.
|
||||
* Redistribution and modifications are permitted subject to BSD license.
|
||||
*/
|
||||
#include <asn_internal.h>
|
||||
#include <asn_codecs_prim.h>
|
||||
#include <errno.h>
|
||||
|
||||
/*
|
||||
* Decode an always-primitive type.
|
||||
*/
|
||||
asn_dec_rval_t
|
||||
ber_decode_primitive(asn_codec_ctx_t *opt_codec_ctx,
|
||||
asn_TYPE_descriptor_t *td,
|
||||
void **sptr, const void *buf_ptr, size_t size, int tag_mode) {
|
||||
ASN__PRIMITIVE_TYPE_t *st = (ASN__PRIMITIVE_TYPE_t *)*sptr;
|
||||
asn_dec_rval_t rval;
|
||||
ber_tlv_len_t length = 0; /* =0 to avoid [incorrect] warning. */
|
||||
|
||||
/*
|
||||
* If the structure is not there, allocate it.
|
||||
*/
|
||||
if(st == NULL) {
|
||||
st = (ASN__PRIMITIVE_TYPE_t *)CALLOC(1, sizeof(*st));
|
||||
if(st == NULL) ASN__DECODE_FAILED;
|
||||
*sptr = (void *)st;
|
||||
}
|
||||
|
||||
ASN_DEBUG("Decoding %s as plain primitive (tm=%d)",
|
||||
td->name, tag_mode);
|
||||
|
||||
/*
|
||||
* Check tags and extract value length.
|
||||
*/
|
||||
rval = ber_check_tags(opt_codec_ctx, td, 0, buf_ptr, size,
|
||||
tag_mode, 0, &length, 0);
|
||||
if(rval.code != RC_OK)
|
||||
return rval;
|
||||
|
||||
ASN_DEBUG("%s length is %d bytes", td->name, (int)length);
|
||||
|
||||
/*
|
||||
* Make sure we have this length.
|
||||
*/
|
||||
buf_ptr = ((const char *)buf_ptr) + rval.consumed;
|
||||
size -= rval.consumed;
|
||||
if(length > (ber_tlv_len_t)size) {
|
||||
rval.code = RC_WMORE;
|
||||
rval.consumed = 0;
|
||||
return rval;
|
||||
}
|
||||
|
||||
st->size = (int)length;
|
||||
/* The following better be optimized away. */
|
||||
if(sizeof(st->size) != sizeof(length)
|
||||
&& (ber_tlv_len_t)st->size != length) {
|
||||
st->size = 0;
|
||||
ASN__DECODE_FAILED;
|
||||
}
|
||||
|
||||
st->buf = (uint8_t *)MALLOC(length + 1);
|
||||
if(!st->buf) {
|
||||
st->size = 0;
|
||||
ASN__DECODE_FAILED;
|
||||
}
|
||||
|
||||
memcpy(st->buf, buf_ptr, length);
|
||||
st->buf[length] = '\0'; /* Just in case */
|
||||
|
||||
rval.code = RC_OK;
|
||||
rval.consumed += length;
|
||||
|
||||
ASN_DEBUG("Took %ld/%ld bytes to encode %s",
|
||||
(long)rval.consumed,
|
||||
(long)length, td->name);
|
||||
|
||||
return rval;
|
||||
}
|
||||
|
||||
/*
|
||||
* Encode an always-primitive type using DER.
|
||||
*/
|
||||
asn_enc_rval_t
|
||||
der_encode_primitive(asn_TYPE_descriptor_t *td, void *sptr,
|
||||
int tag_mode, ber_tlv_tag_t tag,
|
||||
asn_app_consume_bytes_f *cb, void *app_key) {
|
||||
asn_enc_rval_t erval;
|
||||
ASN__PRIMITIVE_TYPE_t *st = (ASN__PRIMITIVE_TYPE_t *)sptr;
|
||||
|
||||
ASN_DEBUG("%s %s as a primitive type (tm=%d)",
|
||||
cb?"Encoding":"Estimating", td->name, tag_mode);
|
||||
|
||||
erval.encoded = der_write_tags(td, st->size, tag_mode, 0, tag,
|
||||
cb, app_key);
|
||||
ASN_DEBUG("%s wrote tags %d", td->name, (int)erval.encoded);
|
||||
if(erval.encoded == -1) {
|
||||
erval.failed_type = td;
|
||||
erval.structure_ptr = sptr;
|
||||
return erval;
|
||||
}
|
||||
|
||||
if(cb && st->buf) {
|
||||
if(cb(st->buf, st->size, app_key) < 0) {
|
||||
erval.encoded = -1;
|
||||
erval.failed_type = td;
|
||||
erval.structure_ptr = sptr;
|
||||
return erval;
|
||||
}
|
||||
} else {
|
||||
assert(st->buf || st->size == 0);
|
||||
}
|
||||
|
||||
erval.encoded += st->size;
|
||||
ASN__ENCODED_OK(erval);
|
||||
}
|
||||
|
||||
void
|
||||
ASN__PRIMITIVE_TYPE_free(asn_TYPE_descriptor_t *td, void *sptr,
|
||||
int contents_only) {
|
||||
ASN__PRIMITIVE_TYPE_t *st = (ASN__PRIMITIVE_TYPE_t *)sptr;
|
||||
|
||||
if(!td || !sptr)
|
||||
return;
|
||||
|
||||
ASN_DEBUG("Freeing %s as a primitive type", td->name);
|
||||
|
||||
if(st->buf)
|
||||
FREEMEM(st->buf);
|
||||
|
||||
if(!contents_only)
|
||||
FREEMEM(st);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Local internal type passed around as an argument.
|
||||
*/
|
||||
struct xdp_arg_s {
|
||||
asn_TYPE_descriptor_t *type_descriptor;
|
||||
void *struct_key;
|
||||
xer_primitive_body_decoder_f *prim_body_decoder;
|
||||
int decoded_something;
|
||||
int want_more;
|
||||
};
|
||||
|
||||
/*
|
||||
* Since some kinds of primitive values can be encoded using value-specific
|
||||
* tags (<MINUS-INFINITY>, <enum-element>, etc), the primitive decoder must
|
||||
* be supplied with such tags to parse them as needed.
|
||||
*/
|
||||
static int
|
||||
xer_decode__unexpected_tag(void *key, const void *chunk_buf, size_t chunk_size) {
|
||||
struct xdp_arg_s *arg = (struct xdp_arg_s *)key;
|
||||
enum xer_pbd_rval bret;
|
||||
|
||||
/*
|
||||
* The chunk_buf is guaranteed to start at '<'.
|
||||
*/
|
||||
assert(chunk_size && ((const char *)chunk_buf)[0] == 0x3c);
|
||||
|
||||
/*
|
||||
* Decoding was performed once already. Prohibit doing it again.
|
||||
*/
|
||||
if(arg->decoded_something)
|
||||
return -1;
|
||||
|
||||
bret = arg->prim_body_decoder(arg->type_descriptor,
|
||||
arg->struct_key, chunk_buf, chunk_size);
|
||||
switch(bret) {
|
||||
case XPBD_SYSTEM_FAILURE:
|
||||
case XPBD_DECODER_LIMIT:
|
||||
case XPBD_BROKEN_ENCODING:
|
||||
break;
|
||||
case XPBD_BODY_CONSUMED:
|
||||
/* Tag decoded successfully */
|
||||
arg->decoded_something = 1;
|
||||
/* Fall through */
|
||||
case XPBD_NOT_BODY_IGNORE: /* Safe to proceed further */
|
||||
return 0;
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
static ssize_t
|
||||
xer_decode__primitive_body(void *key, const void *chunk_buf, size_t chunk_size, int have_more) {
|
||||
struct xdp_arg_s *arg = (struct xdp_arg_s *)key;
|
||||
enum xer_pbd_rval bret;
|
||||
size_t lead_wsp_size;
|
||||
|
||||
if(arg->decoded_something) {
|
||||
if(xer_whitespace_span(chunk_buf, chunk_size) == chunk_size) {
|
||||
/*
|
||||
* Example:
|
||||
* "<INTEGER>123<!--/--> </INTEGER>"
|
||||
* ^- chunk_buf position.
|
||||
*/
|
||||
return chunk_size;
|
||||
}
|
||||
/*
|
||||
* Decoding was done once already. Prohibit doing it again.
|
||||
*/
|
||||
return -1;
|
||||
}
|
||||
|
||||
if(!have_more) {
|
||||
/*
|
||||
* If we've received something like "1", we can't really
|
||||
* tell whether it is really `1` or `123`, until we know
|
||||
* that there is no more data coming.
|
||||
* The have_more argument will be set to 1 once something
|
||||
* like this is available to the caller of this callback:
|
||||
* "1<tag_start..."
|
||||
*/
|
||||
arg->want_more = 1;
|
||||
return -1;
|
||||
}
|
||||
|
||||
lead_wsp_size = xer_whitespace_span(chunk_buf, chunk_size);
|
||||
chunk_buf = (const char *)chunk_buf + lead_wsp_size;
|
||||
chunk_size -= lead_wsp_size;
|
||||
|
||||
bret = arg->prim_body_decoder(arg->type_descriptor,
|
||||
arg->struct_key, chunk_buf, chunk_size);
|
||||
switch(bret) {
|
||||
case XPBD_SYSTEM_FAILURE:
|
||||
case XPBD_DECODER_LIMIT:
|
||||
case XPBD_BROKEN_ENCODING:
|
||||
break;
|
||||
case XPBD_BODY_CONSUMED:
|
||||
/* Tag decoded successfully */
|
||||
arg->decoded_something = 1;
|
||||
/* Fall through */
|
||||
case XPBD_NOT_BODY_IGNORE: /* Safe to proceed further */
|
||||
return lead_wsp_size + chunk_size;
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
asn_dec_rval_t
|
||||
xer_decode_primitive(asn_codec_ctx_t *opt_codec_ctx,
|
||||
asn_TYPE_descriptor_t *td,
|
||||
void **sptr,
|
||||
size_t struct_size,
|
||||
const char *opt_mname,
|
||||
const void *buf_ptr, size_t size,
|
||||
xer_primitive_body_decoder_f *prim_body_decoder
|
||||
) {
|
||||
const char *xml_tag = opt_mname ? opt_mname : td->xml_tag;
|
||||
asn_struct_ctx_t s_ctx;
|
||||
struct xdp_arg_s s_arg;
|
||||
asn_dec_rval_t rc;
|
||||
|
||||
/*
|
||||
* Create the structure if does not exist.
|
||||
*/
|
||||
if(!*sptr) {
|
||||
*sptr = CALLOC(1, struct_size);
|
||||
if(!*sptr) ASN__DECODE_FAILED;
|
||||
}
|
||||
|
||||
memset(&s_ctx, 0, sizeof(s_ctx));
|
||||
s_arg.type_descriptor = td;
|
||||
s_arg.struct_key = *sptr;
|
||||
s_arg.prim_body_decoder = prim_body_decoder;
|
||||
s_arg.decoded_something = 0;
|
||||
s_arg.want_more = 0;
|
||||
|
||||
rc = xer_decode_general(opt_codec_ctx, &s_ctx, &s_arg,
|
||||
xml_tag, buf_ptr, size,
|
||||
xer_decode__unexpected_tag, xer_decode__primitive_body);
|
||||
switch(rc.code) {
|
||||
case RC_OK:
|
||||
if(!s_arg.decoded_something) {
|
||||
char ch;
|
||||
ASN_DEBUG("Primitive body is not recognized, "
|
||||
"supplying empty one");
|
||||
/*
|
||||
* Decoding opportunity has come and gone.
|
||||
* Where's the result?
|
||||
* Try to feed with empty body, see if it eats it.
|
||||
*/
|
||||
if(prim_body_decoder(s_arg.type_descriptor,
|
||||
s_arg.struct_key, &ch, 0)
|
||||
!= XPBD_BODY_CONSUMED) {
|
||||
/*
|
||||
* This decoder does not like empty stuff.
|
||||
*/
|
||||
ASN__DECODE_FAILED;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case RC_WMORE:
|
||||
/*
|
||||
* Redo the whole thing later.
|
||||
* We don't have a context to save intermediate parsing state.
|
||||
*/
|
||||
rc.consumed = 0;
|
||||
break;
|
||||
case RC_FAIL:
|
||||
rc.consumed = 0;
|
||||
if(s_arg.want_more)
|
||||
rc.code = RC_WMORE;
|
||||
else
|
||||
ASN__DECODE_FAILED;
|
||||
break;
|
||||
}
|
||||
return rc;
|
||||
}
|
||||
|
||||
@@ -1,56 +0,0 @@
|
||||
// Copyright (c) 2016-2023 The Hush developers
|
||||
// Distributed under the GPLv3 software license, see the accompanying
|
||||
// file COPYING or https://www.gnu.org/licenses/gpl-3.0.en.html
|
||||
/*-
|
||||
* Copyright (c) 2004 Lev Walkin <vlm@lionet.info>. All rights reserved.
|
||||
* Redistribution and modifications are permitted subject to BSD license.
|
||||
*/
|
||||
#ifndef ASN_CODECS_PRIM_H
|
||||
#define ASN_CODECS_PRIM_H
|
||||
|
||||
#include "asn_application.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
typedef struct ASN__PRIMITIVE_TYPE_s {
|
||||
uint8_t *buf; /* Buffer with consecutive primitive encoding bytes */
|
||||
int size; /* Size of the buffer */
|
||||
} ASN__PRIMITIVE_TYPE_t; /* Do not use this type directly! */
|
||||
|
||||
asn_struct_free_f ASN__PRIMITIVE_TYPE_free;
|
||||
ber_type_decoder_f ber_decode_primitive;
|
||||
der_type_encoder_f der_encode_primitive;
|
||||
|
||||
/*
|
||||
* A callback specification for the xer_decode_primitive() function below.
|
||||
*/
|
||||
enum xer_pbd_rval {
|
||||
XPBD_SYSTEM_FAILURE, /* System failure (memory shortage, etc) */
|
||||
XPBD_DECODER_LIMIT, /* Hit some decoder limitation or deficiency */
|
||||
XPBD_BROKEN_ENCODING, /* Encoding of a primitive body is broken */
|
||||
XPBD_NOT_BODY_IGNORE, /* Not a body format, but safe to ignore */
|
||||
XPBD_BODY_CONSUMED /* Body is recognized and consumed */
|
||||
};
|
||||
typedef enum xer_pbd_rval (xer_primitive_body_decoder_f)
|
||||
(asn_TYPE_descriptor_t *td, void *struct_ptr,
|
||||
const void *chunk_buf, size_t chunk_size);
|
||||
|
||||
/*
|
||||
* Specific function to decode simple primitive types.
|
||||
* Also see xer_decode_general() in xer_decoder.h
|
||||
*/
|
||||
asn_dec_rval_t xer_decode_primitive(asn_codec_ctx_t *opt_codec_ctx,
|
||||
asn_TYPE_descriptor_t *type_descriptor,
|
||||
void **struct_ptr, size_t struct_size,
|
||||
const char *opt_mname,
|
||||
const void *buf_ptr, size_t size,
|
||||
xer_primitive_body_decoder_f *prim_body_decoder
|
||||
);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* ASN_CODECS_PRIM_H */
|
||||
@@ -1,131 +0,0 @@
|
||||
// Copyright (c) 2016-2023 The Hush developers
|
||||
// Distributed under the GPLv3 software license, see the accompanying
|
||||
// file COPYING or https://www.gnu.org/licenses/gpl-3.0.en.html
|
||||
/*-
|
||||
* Copyright (c) 2003, 2004, 2005, 2007 Lev Walkin <vlm@lionet.info>.
|
||||
* All rights reserved.
|
||||
* Redistribution and modifications are permitted subject to BSD license.
|
||||
*/
|
||||
/*
|
||||
* Declarations internally useful for the ASN.1 support code.
|
||||
*/
|
||||
#ifndef ASN_INTERNAL_H
|
||||
#define ASN_INTERNAL_H
|
||||
|
||||
#include "asn_application.h" /* Application-visible API */
|
||||
|
||||
#ifndef __NO_ASSERT_H__ /* Include assert.h only for internal use. */
|
||||
#include <assert.h> /* for assert() macro */
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* Environment version might be used to avoid running with the old library */
|
||||
#define ASN1C_ENVIRONMENT_VERSION 923 /* Compile-time version */
|
||||
int get_asn1c_environment_version(void); /* Run-time version */
|
||||
|
||||
#define CALLOC(nmemb, size) calloc(nmemb, size)
|
||||
#define MALLOC(size) malloc(size)
|
||||
#define REALLOC(oldptr, size) realloc(oldptr, size)
|
||||
#define FREEMEM(ptr) free(ptr)
|
||||
|
||||
#define asn_debug_indent 0
|
||||
#define ASN_DEBUG_INDENT_ADD(i) do{}while(0)
|
||||
|
||||
/*
|
||||
* A macro for debugging the ASN.1 internals.
|
||||
* You may enable or override it.
|
||||
*/
|
||||
#ifndef ASN_DEBUG /* If debugging code is not defined elsewhere... */
|
||||
#if EMIT_ASN_DEBUG == 1 /* And it was asked to emit this code... */
|
||||
#ifdef __GNUC__
|
||||
#ifdef ASN_THREAD_SAFE
|
||||
/* Thread safety requires sacrifice in output indentation:
|
||||
* Retain empty definition of ASN_DEBUG_INDENT_ADD. */
|
||||
#else /* !ASN_THREAD_SAFE */
|
||||
#undef ASN_DEBUG_INDENT_ADD
|
||||
#undef asn_debug_indent
|
||||
int asn_debug_indent;
|
||||
#define ASN_DEBUG_INDENT_ADD(i) do { asn_debug_indent += i; } while(0)
|
||||
#endif /* ASN_THREAD_SAFE */
|
||||
#define ASN_DEBUG(fmt, args...) do { \
|
||||
int adi = asn_debug_indent; \
|
||||
while(adi--) fprintf(stderr, " "); \
|
||||
fprintf(stderr, fmt, ##args); \
|
||||
fprintf(stderr, " (%s:%d)\n", \
|
||||
__FILE__, __LINE__); \
|
||||
} while(0)
|
||||
#else /* !__GNUC__ */
|
||||
void ASN_DEBUG_f(const char *fmt, ...);
|
||||
#define ASN_DEBUG ASN_DEBUG_f
|
||||
#endif /* __GNUC__ */
|
||||
#else /* EMIT_ASN_DEBUG != 1 */
|
||||
static void ASN_DEBUG(const char *fmt, ...) { (void)fmt; }
|
||||
#endif /* EMIT_ASN_DEBUG */
|
||||
#endif /* ASN_DEBUG */
|
||||
|
||||
/*
|
||||
* Invoke the application-supplied callback and fail, if something is wrong.
|
||||
*/
|
||||
#define ASN__E_cbc(buf, size) (cb((buf), (size), app_key) < 0)
|
||||
#define ASN__E_CALLBACK(foo) do { \
|
||||
if(foo) goto cb_failed; \
|
||||
} while(0)
|
||||
#define ASN__CALLBACK(buf, size) \
|
||||
ASN__E_CALLBACK(ASN__E_cbc(buf, size))
|
||||
#define ASN__CALLBACK2(buf1, size1, buf2, size2) \
|
||||
ASN__E_CALLBACK(ASN__E_cbc(buf1, size1) || ASN__E_cbc(buf2, size2))
|
||||
#define ASN__CALLBACK3(buf1, size1, buf2, size2, buf3, size3) \
|
||||
ASN__E_CALLBACK(ASN__E_cbc(buf1, size1) \
|
||||
|| ASN__E_cbc(buf2, size2) \
|
||||
|| ASN__E_cbc(buf3, size3))
|
||||
|
||||
#define ASN__TEXT_INDENT(nl, level) do { \
|
||||
int tmp_level = (level); \
|
||||
int tmp_nl = ((nl) != 0); \
|
||||
int tmp_i; \
|
||||
if(tmp_nl) ASN__CALLBACK("\n", 1); \
|
||||
if(tmp_level < 0) tmp_level = 0; \
|
||||
for(tmp_i = 0; tmp_i < tmp_level; tmp_i++) \
|
||||
ASN__CALLBACK(" ", 4); \
|
||||
er.encoded += tmp_nl + 4 * tmp_level; \
|
||||
} while(0)
|
||||
|
||||
#define _i_INDENT(nl) do { \
|
||||
int tmp_i; \
|
||||
if((nl) && cb("\n", 1, app_key) < 0) \
|
||||
return -1; \
|
||||
for(tmp_i = 0; tmp_i < ilevel; tmp_i++) \
|
||||
if(cb(" ", 4, app_key) < 0) \
|
||||
return -1; \
|
||||
} while(0)
|
||||
|
||||
/*
|
||||
* Check stack against overflow, if limit is set.
|
||||
*/
|
||||
#define ASN__DEFAULT_STACK_MAX (30000)
|
||||
static int __attribute__((unused))
|
||||
ASN__STACK_OVERFLOW_CHECK(asn_codec_ctx_t *ctx) {
|
||||
if(ctx && ctx->max_stack_size) {
|
||||
|
||||
/* ctx MUST be allocated on the stack */
|
||||
ptrdiff_t usedstack = ((char *)ctx - (char *)&ctx);
|
||||
if(usedstack > 0) usedstack = -usedstack; /* grows up! */
|
||||
|
||||
/* double negative required to avoid int wrap-around */
|
||||
if(usedstack < -(ptrdiff_t)ctx->max_stack_size) {
|
||||
ASN_DEBUG("Stack limit %ld reached",
|
||||
(long)ctx->max_stack_size);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* ASN_INTERNAL_H */
|
||||
@@ -1,131 +0,0 @@
|
||||
// Copyright (c) 2016-2023 The Hush developers
|
||||
// Distributed under the GPLv3 software license, see the accompanying
|
||||
// file COPYING or https://www.gnu.org/licenses/gpl-3.0.en.html
|
||||
/*-
|
||||
* Copyright (c) 2003, 2004, 2007 Lev Walkin <vlm@lionet.info>.
|
||||
* All rights reserved.
|
||||
* Redistribution and modifications are permitted subject to BSD license.
|
||||
*/
|
||||
/*
|
||||
* Miscellaneous system-dependent types.
|
||||
*/
|
||||
#ifndef ASN_SYSTEM_H
|
||||
#define ASN_SYSTEM_H
|
||||
|
||||
#ifdef CRYPTOCONDITIONS_HAVE_CONFIG_H
|
||||
#include "cryptoconditions-config.h"
|
||||
#endif
|
||||
|
||||
#ifndef _BSD_SOURCE
|
||||
#define _BSD_SOURCE /* for snprintf() on some linux systems */
|
||||
#endif
|
||||
|
||||
#include <stdio.h> /* For snprintf(3) */
|
||||
#include <stdlib.h> /* For *alloc(3) */
|
||||
#include <string.h> /* For memcpy(3) */
|
||||
#include <sys/types.h> /* For size_t */
|
||||
#include <limits.h> /* For LONG_MAX */
|
||||
#include <stdarg.h> /* For va_start */
|
||||
#include <stddef.h> /* for offsetof and ptrdiff_t */
|
||||
|
||||
#ifdef HAVE_ALLOCA_H
|
||||
#include <alloca.h> /* For alloca(3) */
|
||||
#endif
|
||||
|
||||
#ifdef _WIN32
|
||||
|
||||
#include <malloc.h>
|
||||
#define snprintf _snprintf
|
||||
#define vsnprintf _vsnprintf
|
||||
|
||||
/* To avoid linking with ws2_32.lib, here's the definition of ntohl() */
|
||||
#define sys_ntohl(l) ((((l) << 24) & 0xff000000) \
|
||||
| (((l) << 8) & 0xff0000) \
|
||||
| (((l) >> 8) & 0xff00) \
|
||||
| ((l >> 24) & 0xff))
|
||||
|
||||
#ifdef _MSC_VER /* MSVS.Net */
|
||||
#ifndef __cplusplus
|
||||
#define inline __inline
|
||||
#endif
|
||||
#ifndef ASSUMESTDTYPES /* Standard types have been defined elsewhere */
|
||||
#define ssize_t SSIZE_T
|
||||
typedef char int8_t;
|
||||
typedef short int16_t;
|
||||
typedef int int32_t;
|
||||
typedef unsigned char uint8_t;
|
||||
typedef unsigned short uint16_t;
|
||||
typedef unsigned int uint32_t;
|
||||
#endif /* ASSUMESTDTYPES */
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#include <windows.h>
|
||||
#include <float.h>
|
||||
#define isnan _isnan
|
||||
#define finite _finite
|
||||
#define copysign _copysign
|
||||
#define ilogb _logb
|
||||
#else /* !_MSC_VER */
|
||||
#include <stdint.h>
|
||||
#endif /* _MSC_VER */
|
||||
|
||||
#else /* !_WIN32 */
|
||||
|
||||
#if defined(__vxworks)
|
||||
#include <types/vxTypes.h>
|
||||
#else /* !defined(__vxworks) */
|
||||
|
||||
#include <inttypes.h> /* C99 specifies this file */
|
||||
/*
|
||||
* 1. Earlier FreeBSD version didn't have <stdint.h>,
|
||||
* but <inttypes.h> was present.
|
||||
* 2. Sun Solaris requires <alloca.h> for alloca(3),
|
||||
* but does not have <stdint.h>.
|
||||
*/
|
||||
#if (!defined(__FreeBSD__) || !defined(_SYS_INTTYPES_H_))
|
||||
#if defined(sun)
|
||||
#include <alloca.h> /* For alloca(3) */
|
||||
#include <ieeefp.h> /* for finite(3) */
|
||||
#elif defined(__hpux)
|
||||
#ifdef __GNUC__
|
||||
#include <alloca.h> /* For alloca(3) */
|
||||
#else /* !__GNUC__ */
|
||||
#define inline
|
||||
#endif /* __GNUC__ */
|
||||
#else
|
||||
#include <stdint.h> /* SUSv2+ and C99 specify this file, for uintXX_t */
|
||||
#endif /* defined(sun) */
|
||||
#endif
|
||||
|
||||
#include <netinet/in.h> /* for ntohl() */
|
||||
#define sys_ntohl(foo) ntohl(foo)
|
||||
|
||||
#endif /* defined(__vxworks) */
|
||||
|
||||
#endif /* _WIN32 */
|
||||
|
||||
#if __GNUC__ >= 3
|
||||
#ifndef GCC_PRINTFLIKE
|
||||
#define GCC_PRINTFLIKE(fmt,var) __attribute__((format(printf,fmt,var)))
|
||||
#endif
|
||||
#ifndef GCC_NOTUSED
|
||||
#define GCC_NOTUSED __attribute__((unused))
|
||||
#endif
|
||||
#else
|
||||
#ifndef GCC_PRINTFLIKE
|
||||
#define GCC_PRINTFLIKE(fmt,var) /* nothing */
|
||||
#endif
|
||||
#ifndef GCC_NOTUSED
|
||||
#define GCC_NOTUSED
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* Figure out if thread safety is requested */
|
||||
#if !defined(ASN_THREAD_SAFE) && (defined(THREAD_SAFE) || defined(_REENTRANT))
|
||||
#define ASN_THREAD_SAFE
|
||||
#endif /* Thread safety */
|
||||
|
||||
#ifndef offsetof /* If not defined by <stddef.h> */
|
||||
#define offsetof(s, m) ((ptrdiff_t)&(((s *)0)->m) - (ptrdiff_t)((s *)0))
|
||||
#endif /* offsetof */
|
||||
|
||||
#endif /* ASN_SYSTEM_H */
|
||||
@@ -1,286 +0,0 @@
|
||||
// Copyright (c) 2016-2023 The Hush developers
|
||||
// Distributed under the GPLv3 software license, see the accompanying
|
||||
// file COPYING or https://www.gnu.org/licenses/gpl-3.0.en.html
|
||||
/*-
|
||||
* Copyright (c) 2003, 2004 Lev Walkin <vlm@lionet.info>. All rights reserved.
|
||||
* Redistribution and modifications are permitted subject to BSD license.
|
||||
*/
|
||||
#include <asn_internal.h>
|
||||
|
||||
#undef ADVANCE
|
||||
#define ADVANCE(num_bytes) do { \
|
||||
size_t num = num_bytes; \
|
||||
ptr = ((const char *)ptr) + num; \
|
||||
size -= num; \
|
||||
consumed_myself += num; \
|
||||
} while(0)
|
||||
#undef RETURN
|
||||
#define RETURN(_code) do { \
|
||||
asn_dec_rval_t rval; \
|
||||
rval.code = _code; \
|
||||
if(opt_ctx) opt_ctx->step = step; /* Save context */ \
|
||||
if(_code == RC_OK || opt_ctx) \
|
||||
rval.consumed = consumed_myself; \
|
||||
else \
|
||||
rval.consumed = 0; /* Context-free */ \
|
||||
return rval; \
|
||||
} while(0)
|
||||
|
||||
/*
|
||||
* The BER decoder of any type.
|
||||
*/
|
||||
asn_dec_rval_t
|
||||
ber_decode(asn_codec_ctx_t *opt_codec_ctx,
|
||||
asn_TYPE_descriptor_t *type_descriptor,
|
||||
void **struct_ptr, const void *ptr, size_t size) {
|
||||
asn_codec_ctx_t s_codec_ctx;
|
||||
|
||||
/*
|
||||
* Stack checker requires that the codec context
|
||||
* must be allocated on the stack.
|
||||
*/
|
||||
if(opt_codec_ctx) {
|
||||
if(opt_codec_ctx->max_stack_size) {
|
||||
s_codec_ctx = *opt_codec_ctx;
|
||||
opt_codec_ctx = &s_codec_ctx;
|
||||
}
|
||||
} else {
|
||||
/* If context is not given, be security-conscious anyway */
|
||||
memset(&s_codec_ctx, 0, sizeof(s_codec_ctx));
|
||||
s_codec_ctx.max_stack_size = ASN__DEFAULT_STACK_MAX;
|
||||
opt_codec_ctx = &s_codec_ctx;
|
||||
}
|
||||
|
||||
/*
|
||||
* Invoke type-specific decoder.
|
||||
*/
|
||||
return type_descriptor->ber_decoder(opt_codec_ctx, type_descriptor,
|
||||
struct_ptr, /* Pointer to the destination structure */
|
||||
ptr, size, /* Buffer and its size */
|
||||
0 /* Default tag mode is 0 */
|
||||
);
|
||||
}
|
||||
|
||||
/*
|
||||
* Check the set of <TL<TL<TL...>>> tags matches the definition.
|
||||
*/
|
||||
asn_dec_rval_t
|
||||
ber_check_tags(asn_codec_ctx_t *opt_codec_ctx,
|
||||
asn_TYPE_descriptor_t *td, asn_struct_ctx_t *opt_ctx,
|
||||
const void *ptr, size_t size, int tag_mode, int last_tag_form,
|
||||
ber_tlv_len_t *last_length, int *opt_tlv_form) {
|
||||
ssize_t consumed_myself = 0;
|
||||
ssize_t tag_len;
|
||||
ssize_t len_len;
|
||||
ber_tlv_tag_t tlv_tag;
|
||||
ber_tlv_len_t tlv_len;
|
||||
ber_tlv_len_t limit_len = -1;
|
||||
int expect_00_terminators = 0;
|
||||
int tlv_constr = -1; /* If CHOICE, opt_tlv_form is not given */
|
||||
int step = opt_ctx ? opt_ctx->step : 0; /* Where we left previously */
|
||||
int tagno;
|
||||
|
||||
/*
|
||||
* Make sure we didn't exceed the maximum stack size.
|
||||
*/
|
||||
if(ASN__STACK_OVERFLOW_CHECK(opt_codec_ctx))
|
||||
RETURN(RC_FAIL);
|
||||
|
||||
/*
|
||||
* So what does all this implicit skip stuff mean?
|
||||
* Imagine two types,
|
||||
* A ::= [5] IMPLICIT T
|
||||
* B ::= [2] EXPLICIT T
|
||||
* Where T is defined as
|
||||
* T ::= [4] IMPLICIT SEQUENCE { ... }
|
||||
*
|
||||
* Let's say, we are starting to decode type A, given the
|
||||
* following TLV stream: <5> <0>. What does this mean?
|
||||
* It means that the type A contains type T which is,
|
||||
* in turn, empty.
|
||||
* Remember though, that we are still in A. We cannot
|
||||
* just pass control to the type T decoder. Why? Because
|
||||
* the type T decoder expects <4> <0>, not <5> <0>.
|
||||
* So, we must make sure we are going to receive <5> while
|
||||
* still in A, then pass control to the T decoder, indicating
|
||||
* that the tag <4> was implicitly skipped. The decoder of T
|
||||
* hence will be prepared to treat <4> as valid tag, and decode
|
||||
* it appropriately.
|
||||
*/
|
||||
|
||||
tagno = step /* Continuing where left previously */
|
||||
+ (tag_mode==1?-1:0)
|
||||
;
|
||||
ASN_DEBUG("ber_check_tags(%s, size=%ld, tm=%d, step=%d, tagno=%d)",
|
||||
td->name, (long)size, tag_mode, step, tagno);
|
||||
/* assert(td->tags_count >= 1) May not be the case for CHOICE or ANY */
|
||||
|
||||
if(tag_mode == 0 && tagno == td->tags_count) {
|
||||
/*
|
||||
* This must be the _untagged_ ANY type,
|
||||
* which outermost tag isn't known in advance.
|
||||
* Fetch the tag and length separately.
|
||||
*/
|
||||
tag_len = ber_fetch_tag(ptr, size, &tlv_tag);
|
||||
switch(tag_len) {
|
||||
case -1: RETURN(RC_FAIL);
|
||||
case 0: RETURN(RC_WMORE);
|
||||
}
|
||||
tlv_constr = BER_TLV_CONSTRUCTED(ptr);
|
||||
len_len = ber_fetch_length(tlv_constr,
|
||||
(const char *)ptr + tag_len, size - tag_len, &tlv_len);
|
||||
switch(len_len) {
|
||||
case -1: RETURN(RC_FAIL);
|
||||
case 0: RETURN(RC_WMORE);
|
||||
}
|
||||
ASN_DEBUG("Advancing %ld in ANY case",
|
||||
(long)(tag_len + len_len));
|
||||
ADVANCE(tag_len + len_len);
|
||||
} else {
|
||||
assert(tagno < td->tags_count); /* At least one loop */
|
||||
}
|
||||
for((void)tagno; tagno < td->tags_count; tagno++, step++) {
|
||||
|
||||
/*
|
||||
* Fetch and process T from TLV.
|
||||
*/
|
||||
tag_len = ber_fetch_tag(ptr, size, &tlv_tag);
|
||||
ASN_DEBUG("Fetching tag from {%p,%ld}: "
|
||||
"len %ld, step %d, tagno %d got %s",
|
||||
ptr, (long)size,
|
||||
(long)tag_len, step, tagno,
|
||||
ber_tlv_tag_string(tlv_tag));
|
||||
switch(tag_len) {
|
||||
case -1: RETURN(RC_FAIL);
|
||||
case 0: RETURN(RC_WMORE);
|
||||
}
|
||||
|
||||
tlv_constr = BER_TLV_CONSTRUCTED(ptr);
|
||||
|
||||
/*
|
||||
* If {I}, don't check anything.
|
||||
* If {I,B,C}, check B and C unless we're at I.
|
||||
*/
|
||||
if(tag_mode != 0 && step == 0) {
|
||||
/*
|
||||
* We don't expect tag to match here.
|
||||
* It's just because we don't know how the tag
|
||||
* is supposed to look like.
|
||||
*/
|
||||
} else {
|
||||
assert(tagno >= 0); /* Guaranteed by the code above */
|
||||
if(tlv_tag != td->tags[tagno]) {
|
||||
/*
|
||||
* Unexpected tag. Too bad.
|
||||
*/
|
||||
ASN_DEBUG("Expected: %s, "
|
||||
"expectation failed (tn=%d, tm=%d)",
|
||||
ber_tlv_tag_string(td->tags[tagno]),
|
||||
tagno, tag_mode
|
||||
);
|
||||
RETURN(RC_FAIL);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Attention: if there are more tags expected,
|
||||
* ensure that the current tag is presented
|
||||
* in constructed form (it contains other tags!).
|
||||
* If this one is the last one, check that the tag form
|
||||
* matches the one given in descriptor.
|
||||
*/
|
||||
if(tagno < (td->tags_count - 1)) {
|
||||
if(tlv_constr == 0) {
|
||||
ASN_DEBUG("tlv_constr = %d, expfail",
|
||||
tlv_constr);
|
||||
RETURN(RC_FAIL);
|
||||
}
|
||||
} else {
|
||||
if(last_tag_form != tlv_constr
|
||||
&& last_tag_form != -1) {
|
||||
ASN_DEBUG("last_tag_form %d != %d",
|
||||
last_tag_form, tlv_constr);
|
||||
RETURN(RC_FAIL);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Fetch and process L from TLV.
|
||||
*/
|
||||
len_len = ber_fetch_length(tlv_constr,
|
||||
(const char *)ptr + tag_len, size - tag_len, &tlv_len);
|
||||
ASN_DEBUG("Fetching len = %ld", (long)len_len);
|
||||
switch(len_len) {
|
||||
case -1: RETURN(RC_FAIL);
|
||||
case 0: RETURN(RC_WMORE);
|
||||
}
|
||||
|
||||
/*
|
||||
* FIXME
|
||||
* As of today, the chain of tags
|
||||
* must either contain several indefinite length TLVs,
|
||||
* or several definite length ones.
|
||||
* No mixing is allowed.
|
||||
*/
|
||||
if(tlv_len == -1) {
|
||||
/*
|
||||
* Indefinite length.
|
||||
*/
|
||||
if(limit_len == -1) {
|
||||
expect_00_terminators++;
|
||||
} else {
|
||||
ASN_DEBUG("Unexpected indefinite length "
|
||||
"in a chain of definite lengths");
|
||||
RETURN(RC_FAIL);
|
||||
}
|
||||
ADVANCE(tag_len + len_len);
|
||||
continue;
|
||||
} else {
|
||||
if(expect_00_terminators) {
|
||||
ASN_DEBUG("Unexpected definite length "
|
||||
"in a chain of indefinite lengths");
|
||||
RETURN(RC_FAIL);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Check that multiple TLVs specify ever decreasing length,
|
||||
* which is consistent.
|
||||
*/
|
||||
if(limit_len == -1) {
|
||||
limit_len = tlv_len + tag_len + len_len;
|
||||
if(limit_len < 0) {
|
||||
/* Too great tlv_len value? */
|
||||
RETURN(RC_FAIL);
|
||||
}
|
||||
} else if(limit_len != tlv_len + tag_len + len_len) {
|
||||
/*
|
||||
* Inner TLV specifies length which is inconsistent
|
||||
* with the outer TLV's length value.
|
||||
*/
|
||||
ASN_DEBUG("Outer TLV is %ld and inner is %ld",
|
||||
(long)limit_len, (long)tlv_len);
|
||||
RETURN(RC_FAIL);
|
||||
}
|
||||
|
||||
ADVANCE(tag_len + len_len);
|
||||
|
||||
limit_len -= (tag_len + len_len);
|
||||
if((ssize_t)size > limit_len) {
|
||||
/*
|
||||
* Make sure that we won't consume more bytes
|
||||
* from the parent frame than the inferred limit.
|
||||
*/
|
||||
size = limit_len;
|
||||
}
|
||||
}
|
||||
|
||||
if(opt_tlv_form)
|
||||
*opt_tlv_form = tlv_constr;
|
||||
if(expect_00_terminators)
|
||||
*last_length = -expect_00_terminators;
|
||||
else
|
||||
*last_length = tlv_len;
|
||||
|
||||
RETURN(RC_OK);
|
||||
}
|
||||
@@ -1,67 +0,0 @@
|
||||
// Copyright (c) 2016-2023 The Hush developers
|
||||
// Distributed under the GPLv3 software license, see the accompanying
|
||||
// file COPYING or https://www.gnu.org/licenses/gpl-3.0.en.html
|
||||
/*-
|
||||
* Copyright (c) 2003, 2004 Lev Walkin <vlm@lionet.info>. All rights reserved.
|
||||
* Redistribution and modifications are permitted subject to BSD license.
|
||||
*/
|
||||
#ifndef _BER_DECODER_H_
|
||||
#define _BER_DECODER_H_
|
||||
|
||||
#include "asn_application.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
struct asn_TYPE_descriptor_s; /* Forward declaration */
|
||||
struct asn_codec_ctx_s; /* Forward declaration */
|
||||
|
||||
/*
|
||||
* The BER decoder of any type.
|
||||
* This function may be invoked directly from the application.
|
||||
* The der_encode() function (der_encoder.h) is an opposite to ber_decode().
|
||||
*/
|
||||
asn_dec_rval_t ber_decode(struct asn_codec_ctx_s *opt_codec_ctx,
|
||||
struct asn_TYPE_descriptor_s *type_descriptor,
|
||||
void **struct_ptr, /* Pointer to a target structure's pointer */
|
||||
const void *buffer, /* Data to be decoded */
|
||||
size_t size /* Size of that buffer */
|
||||
);
|
||||
|
||||
/*
|
||||
* Type of generic function which decodes the byte stream into the structure.
|
||||
*/
|
||||
typedef asn_dec_rval_t (ber_type_decoder_f)(
|
||||
struct asn_codec_ctx_s *opt_codec_ctx,
|
||||
struct asn_TYPE_descriptor_s *type_descriptor,
|
||||
void **struct_ptr, const void *buf_ptr, size_t size,
|
||||
int tag_mode);
|
||||
|
||||
/*******************************
|
||||
* INTERNALLY USEFUL FUNCTIONS *
|
||||
*******************************/
|
||||
|
||||
/*
|
||||
* Check that all tags correspond to the type definition (as given in head).
|
||||
* On return, last_length would contain either a non-negative length of the
|
||||
* value part of the last TLV, or the negative number of expected
|
||||
* "end of content" sequences. The number may only be negative if the
|
||||
* head->last_tag_form is non-zero.
|
||||
*/
|
||||
asn_dec_rval_t ber_check_tags(
|
||||
struct asn_codec_ctx_s *opt_codec_ctx, /* codec options */
|
||||
struct asn_TYPE_descriptor_s *type_descriptor,
|
||||
asn_struct_ctx_t *opt_ctx, /* saved decoding context */
|
||||
const void *ptr, size_t size,
|
||||
int tag_mode, /* {-1,0,1}: IMPLICIT, no, EXPLICIT */
|
||||
int last_tag_form, /* {-1,0:1}: any, primitive, constr */
|
||||
ber_tlv_len_t *last_length,
|
||||
int *opt_tlv_form /* optional tag form */
|
||||
);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _BER_DECODER_H_ */
|
||||
@@ -1,181 +0,0 @@
|
||||
// Copyright (c) 2016-2023 The Hush developers
|
||||
// Distributed under the GPLv3 software license, see the accompanying
|
||||
// file COPYING or https://www.gnu.org/licenses/gpl-3.0.en.html
|
||||
/*-
|
||||
* Copyright (c) 2003, 2004 Lev Walkin <vlm@lionet.info>. All rights reserved.
|
||||
* Redistribution and modifications are permitted subject to BSD license.
|
||||
*/
|
||||
#include <asn_internal.h>
|
||||
#include <ber_tlv_length.h>
|
||||
#include <ber_tlv_tag.h>
|
||||
|
||||
ssize_t
|
||||
ber_fetch_length(int _is_constructed, const void *bufptr, size_t size,
|
||||
ber_tlv_len_t *len_r) {
|
||||
const uint8_t *buf = (const uint8_t *)bufptr;
|
||||
unsigned oct;
|
||||
|
||||
if(size == 0)
|
||||
return 0; /* Want more */
|
||||
|
||||
oct = *(const uint8_t *)buf;
|
||||
if((oct & 0x80) == 0) {
|
||||
/*
|
||||
* Short definite length.
|
||||
*/
|
||||
*len_r = oct; /* & 0x7F */
|
||||
return 1;
|
||||
} else {
|
||||
ber_tlv_len_t len;
|
||||
size_t skipped;
|
||||
|
||||
if(_is_constructed && oct == 0x80) {
|
||||
*len_r = -1; /* Indefinite length */
|
||||
return 1;
|
||||
}
|
||||
|
||||
if(oct == 0xff) {
|
||||
/* Reserved in standard for future use. */
|
||||
return -1;
|
||||
}
|
||||
|
||||
oct &= 0x7F; /* Leave only the 7 LS bits */
|
||||
for(len = 0, buf++, skipped = 1;
|
||||
oct && (++skipped <= size); buf++, oct--) {
|
||||
|
||||
len = (len << 8) | *buf;
|
||||
if(len < 0
|
||||
|| (len >> ((8 * sizeof(len)) - 8) && oct > 1)) {
|
||||
/*
|
||||
* Too large length value.
|
||||
*/
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
if(oct == 0) {
|
||||
ber_tlv_len_t lenplusepsilon = (size_t)len + 1024;
|
||||
/*
|
||||
* Here length may be very close or equal to 2G.
|
||||
* However, the arithmetics used in some decoders
|
||||
* may add some (small) quantities to the length,
|
||||
* to check the resulting value against some limits.
|
||||
* This may result in integer wrap-around, which
|
||||
* we try to avoid by checking it earlier here.
|
||||
*/
|
||||
if(lenplusepsilon < 0) {
|
||||
/* Too large length value */
|
||||
return -1;
|
||||
}
|
||||
|
||||
*len_r = len;
|
||||
return skipped;
|
||||
}
|
||||
|
||||
return 0; /* Want more */
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
ssize_t
|
||||
ber_skip_length(asn_codec_ctx_t *opt_codec_ctx,
|
||||
int _is_constructed, const void *ptr, size_t size) {
|
||||
ber_tlv_len_t vlen; /* Length of V in TLV */
|
||||
ssize_t tl; /* Length of L in TLV */
|
||||
ssize_t ll; /* Length of L in TLV */
|
||||
size_t skip;
|
||||
|
||||
/*
|
||||
* Make sure we didn't exceed the maximum stack size.
|
||||
*/
|
||||
if(ASN__STACK_OVERFLOW_CHECK(opt_codec_ctx))
|
||||
return -1;
|
||||
|
||||
/*
|
||||
* Determine the size of L in TLV.
|
||||
*/
|
||||
ll = ber_fetch_length(_is_constructed, ptr, size, &vlen);
|
||||
if(ll <= 0) return ll;
|
||||
|
||||
/*
|
||||
* Definite length.
|
||||
*/
|
||||
if(vlen >= 0) {
|
||||
skip = ll + vlen;
|
||||
if(skip > size)
|
||||
return 0; /* Want more */
|
||||
return skip;
|
||||
}
|
||||
|
||||
/*
|
||||
* Indefinite length!
|
||||
*/
|
||||
ASN_DEBUG("Skipping indefinite length");
|
||||
for(skip = ll, ptr = ((const char *)ptr) + ll, size -= ll;;) {
|
||||
ber_tlv_tag_t tag;
|
||||
|
||||
/* Fetch the tag */
|
||||
tl = ber_fetch_tag(ptr, size, &tag);
|
||||
if(tl <= 0) return tl;
|
||||
|
||||
ll = ber_skip_length(opt_codec_ctx,
|
||||
BER_TLV_CONSTRUCTED(ptr),
|
||||
((const char *)ptr) + tl, size - tl);
|
||||
if(ll <= 0) return ll;
|
||||
|
||||
skip += tl + ll;
|
||||
|
||||
/*
|
||||
* This may be the end of the indefinite length structure,
|
||||
* two consecutive 0 octets.
|
||||
* Check if it is true.
|
||||
*/
|
||||
if(((const uint8_t *)ptr)[0] == 0
|
||||
&& ((const uint8_t *)ptr)[1] == 0)
|
||||
return skip;
|
||||
|
||||
ptr = ((const char *)ptr) + tl + ll;
|
||||
size -= tl + ll;
|
||||
}
|
||||
|
||||
/* UNREACHABLE */
|
||||
}
|
||||
|
||||
size_t
|
||||
der_tlv_length_serialize(ber_tlv_len_t len, void *bufp, size_t size) {
|
||||
size_t required_size; /* Size of len encoding */
|
||||
uint8_t *buf = (uint8_t *)bufp;
|
||||
uint8_t *end;
|
||||
size_t i;
|
||||
|
||||
if(len <= 127) {
|
||||
/* Encoded in 1 octet */
|
||||
if(size) *buf = (uint8_t)len;
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Compute the size of the subsequent bytes.
|
||||
*/
|
||||
for(required_size = 1, i = 8; i < 8 * sizeof(len); i += 8) {
|
||||
if(len >> i)
|
||||
required_size++;
|
||||
else
|
||||
break;
|
||||
}
|
||||
|
||||
if(size <= required_size)
|
||||
return required_size + 1;
|
||||
|
||||
*buf++ = (uint8_t)(0x80 | required_size); /* Length of the encoding */
|
||||
|
||||
/*
|
||||
* Produce the len encoding, space permitting.
|
||||
*/
|
||||
end = buf + required_size;
|
||||
for(i -= 8; buf < end; i -= 8, buf++)
|
||||
*buf = (uint8_t)(len >> i);
|
||||
|
||||
return required_size + 1;
|
||||
}
|
||||
|
||||
@@ -1,53 +0,0 @@
|
||||
// Copyright (c) 2016-2023 The Hush developers
|
||||
// Distributed under the GPLv3 software license, see the accompanying
|
||||
// file COPYING or https://www.gnu.org/licenses/gpl-3.0.en.html
|
||||
/*-
|
||||
* Copyright (c) 2003 Lev Walkin <vlm@lionet.info>. All rights reserved.
|
||||
* Redistribution and modifications are permitted subject to BSD license.
|
||||
*/
|
||||
#ifndef _BER_TLV_LENGTH_H_
|
||||
#define _BER_TLV_LENGTH_H_
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
typedef ssize_t ber_tlv_len_t;
|
||||
|
||||
/*
|
||||
* This function tries to fetch the length of the BER TLV value and place it
|
||||
* in *len_r.
|
||||
* RETURN VALUES:
|
||||
* 0: More data expected than bufptr contains.
|
||||
* -1: Fatal error deciphering length.
|
||||
* >0: Number of bytes used from bufptr.
|
||||
* On return with >0, len_r is constrained as -1..MAX, where -1 mean
|
||||
* that the value is of indefinite length.
|
||||
*/
|
||||
ssize_t ber_fetch_length(int _is_constructed, const void *bufptr, size_t size,
|
||||
ber_tlv_len_t *len_r);
|
||||
|
||||
/*
|
||||
* This function expects bufptr to be positioned over L in TLV.
|
||||
* It returns number of bytes occupied by L and V together, suitable
|
||||
* for skipping. The function properly handles indefinite length.
|
||||
* RETURN VALUES:
|
||||
* Standard {-1,0,>0} convention.
|
||||
*/
|
||||
ssize_t ber_skip_length(
|
||||
struct asn_codec_ctx_s *opt_codec_ctx, /* optional context */
|
||||
int _is_constructed, const void *bufptr, size_t size);
|
||||
|
||||
/*
|
||||
* This function serializes the length (L from TLV) in DER format.
|
||||
* It always returns number of bytes necessary to represent the length,
|
||||
* it is a caller's responsibility to check the return value
|
||||
* against the supplied buffer's size.
|
||||
*/
|
||||
size_t der_tlv_length_serialize(ber_tlv_len_t len, void *bufptr, size_t size);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _BER_TLV_LENGTH_H_ */
|
||||
@@ -1,147 +0,0 @@
|
||||
// Copyright (c) 2016-2023 The Hush developers
|
||||
// Distributed under the GPLv3 software license, see the accompanying
|
||||
// file COPYING or https://www.gnu.org/licenses/gpl-3.0.en.html
|
||||
/*-
|
||||
* Copyright (c) 2003, 2004 Lev Walkin <vlm@lionet.info>. All rights reserved.
|
||||
* Redistribution and modifications are permitted subject to BSD license.
|
||||
*/
|
||||
#include <asn_internal.h>
|
||||
#include <ber_tlv_tag.h>
|
||||
#include <errno.h>
|
||||
|
||||
ssize_t
|
||||
ber_fetch_tag(const void *ptr, size_t size, ber_tlv_tag_t *tag_r) {
|
||||
ber_tlv_tag_t val;
|
||||
ber_tlv_tag_t tclass;
|
||||
size_t skipped;
|
||||
|
||||
if(size == 0)
|
||||
return 0;
|
||||
|
||||
val = *(const uint8_t *)ptr;
|
||||
tclass = (val >> 6);
|
||||
if((val &= 0x1F) != 0x1F) {
|
||||
/*
|
||||
* Simple form: everything encoded in a single octet.
|
||||
* Tag Class is encoded using two least significant bits.
|
||||
*/
|
||||
*tag_r = (val << 2) | tclass;
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Each octet contains 7 bits of useful information.
|
||||
* The MSB is 0 if it is the last octet of the tag.
|
||||
*/
|
||||
for(val = 0, ptr = ((const char *)ptr) + 1, skipped = 2;
|
||||
skipped <= size;
|
||||
ptr = ((const char *)ptr) + 1, skipped++) {
|
||||
unsigned int oct = *(const uint8_t *)ptr;
|
||||
if(oct & 0x80) {
|
||||
val = (val << 7) | (oct & 0x7F);
|
||||
/*
|
||||
* Make sure there are at least 9 bits spare
|
||||
* at the MS side of a value.
|
||||
*/
|
||||
if(val >> ((8 * sizeof(val)) - 9)) {
|
||||
/*
|
||||
* We would not be able to accomodate
|
||||
* any more tag bits.
|
||||
*/
|
||||
return -1;
|
||||
}
|
||||
} else {
|
||||
val = (val << 7) | oct;
|
||||
*tag_r = (val << 2) | tclass;
|
||||
return skipped;
|
||||
}
|
||||
}
|
||||
|
||||
return 0; /* Want more */
|
||||
}
|
||||
|
||||
|
||||
ssize_t
|
||||
ber_tlv_tag_fwrite(ber_tlv_tag_t tag, FILE *f) {
|
||||
char buf[sizeof("[APPLICATION ]") + 32];
|
||||
ssize_t ret;
|
||||
|
||||
ret = ber_tlv_tag_snprint(tag, buf, sizeof(buf));
|
||||
if(ret >= (ssize_t)sizeof(buf) || ret < 2) {
|
||||
errno = EPERM;
|
||||
return -1;
|
||||
}
|
||||
|
||||
return fwrite(buf, 1, ret, f);
|
||||
}
|
||||
|
||||
ssize_t
|
||||
ber_tlv_tag_snprint(ber_tlv_tag_t tag, char *buf, size_t size) {
|
||||
char *type = 0;
|
||||
int ret;
|
||||
|
||||
switch(tag & 0x3) {
|
||||
case ASN_TAG_CLASS_UNIVERSAL: type = "UNIVERSAL "; break;
|
||||
case ASN_TAG_CLASS_APPLICATION: type = "APPLICATION "; break;
|
||||
case ASN_TAG_CLASS_CONTEXT: type = ""; break;
|
||||
case ASN_TAG_CLASS_PRIVATE: type = "PRIVATE "; break;
|
||||
}
|
||||
|
||||
ret = snprintf(buf, size, "[%s%u]", type, ((unsigned)tag) >> 2);
|
||||
if(ret <= 0 && size) buf[0] = '\0'; /* against broken libc's */
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
char *
|
||||
ber_tlv_tag_string(ber_tlv_tag_t tag) {
|
||||
static char buf[sizeof("[APPLICATION ]") + 32];
|
||||
|
||||
(void)ber_tlv_tag_snprint(tag, buf, sizeof(buf));
|
||||
|
||||
return buf;
|
||||
}
|
||||
|
||||
|
||||
size_t
|
||||
ber_tlv_tag_serialize(ber_tlv_tag_t tag, void *bufp, size_t size) {
|
||||
int tclass = BER_TAG_CLASS(tag);
|
||||
ber_tlv_tag_t tval = BER_TAG_VALUE(tag);
|
||||
uint8_t *buf = (uint8_t *)bufp;
|
||||
uint8_t *end;
|
||||
size_t required_size;
|
||||
size_t i;
|
||||
|
||||
if(tval <= 30) {
|
||||
/* Encoded in 1 octet */
|
||||
if(size) buf[0] = (tclass << 6) | tval;
|
||||
return 1;
|
||||
} else if(size) {
|
||||
*buf++ = (tclass << 6) | 0x1F;
|
||||
size--;
|
||||
}
|
||||
|
||||
/*
|
||||
* Compute the size of the subsequent bytes.
|
||||
*/
|
||||
for(required_size = 1, i = 7; i < 8 * sizeof(tval); i += 7) {
|
||||
if(tval >> i)
|
||||
required_size++;
|
||||
else
|
||||
break;
|
||||
}
|
||||
|
||||
if(size < required_size)
|
||||
return required_size + 1;
|
||||
|
||||
/*
|
||||
* Fill in the buffer, space permitting.
|
||||
*/
|
||||
end = buf + required_size - 1;
|
||||
for(i -= 7; buf < end; i -= 7, buf++)
|
||||
*buf = 0x80 | ((tval >> i) & 0x7F);
|
||||
*buf = (tval & 0x7F); /* Last octet without high bit */
|
||||
|
||||
return required_size + 1;
|
||||
}
|
||||
|
||||
@@ -1,63 +0,0 @@
|
||||
// Copyright (c) 2016-2023 The Hush developers
|
||||
// Distributed under the GPLv3 software license, see the accompanying
|
||||
// file COPYING or https://www.gnu.org/licenses/gpl-3.0.en.html
|
||||
/*-
|
||||
* Copyright (c) 2003, 2004 Lev Walkin <vlm@lionet.info>. All rights reserved.
|
||||
* Redistribution and modifications are permitted subject to BSD license.
|
||||
*/
|
||||
#ifndef _BER_TLV_TAG_H_
|
||||
#define _BER_TLV_TAG_H_
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
enum asn_tag_class {
|
||||
ASN_TAG_CLASS_UNIVERSAL = 0, /* 0b00 */
|
||||
ASN_TAG_CLASS_APPLICATION = 1, /* 0b01 */
|
||||
ASN_TAG_CLASS_CONTEXT = 2, /* 0b10 */
|
||||
ASN_TAG_CLASS_PRIVATE = 3 /* 0b11 */
|
||||
};
|
||||
typedef unsigned ber_tlv_tag_t; /* BER TAG from Tag-Length-Value */
|
||||
|
||||
/*
|
||||
* Tag class is encoded together with tag value for optimization purposes.
|
||||
*/
|
||||
#define BER_TAG_CLASS(tag) ((tag) & 0x3)
|
||||
#define BER_TAG_VALUE(tag) ((tag) >> 2)
|
||||
#define BER_TLV_CONSTRUCTED(tagptr) (((*(const uint8_t *)tagptr)&0x20)?1:0)
|
||||
|
||||
#define BER_TAGS_EQUAL(tag1, tag2) ((tag1) == (tag2))
|
||||
|
||||
/*
|
||||
* Several functions for printing the TAG in the canonical form
|
||||
* (i.e. "[PRIVATE 0]").
|
||||
* Return values correspond to their libc counterparts (if any).
|
||||
*/
|
||||
ssize_t ber_tlv_tag_snprint(ber_tlv_tag_t tag, char *buf, size_t buflen);
|
||||
ssize_t ber_tlv_tag_fwrite(ber_tlv_tag_t tag, FILE *);
|
||||
char *ber_tlv_tag_string(ber_tlv_tag_t tag);
|
||||
|
||||
|
||||
/*
|
||||
* This function tries to fetch the tag from the input stream.
|
||||
* RETURN VALUES:
|
||||
* 0: More data expected than bufptr contains.
|
||||
* -1: Fatal error deciphering tag.
|
||||
* >0: Number of bytes used from bufptr. tag_r will contain the tag.
|
||||
*/
|
||||
ssize_t ber_fetch_tag(const void *bufptr, size_t size, ber_tlv_tag_t *tag_r);
|
||||
|
||||
/*
|
||||
* This function serializes the tag (T from TLV) in BER format.
|
||||
* It always returns number of bytes necessary to represent the tag,
|
||||
* it is a caller's responsibility to check the return value
|
||||
* against the supplied buffer's size.
|
||||
*/
|
||||
size_t ber_tlv_tag_serialize(ber_tlv_tag_t tag, void *bufptr, size_t size);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _BER_TLV_TAG_H_ */
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,60 +0,0 @@
|
||||
// Copyright (c) 2016-2023 The Hush developers
|
||||
// Distributed under the GPLv3 software license, see the accompanying
|
||||
// file COPYING or https://www.gnu.org/licenses/gpl-3.0.en.html
|
||||
/*-
|
||||
* Copyright (c) 2003, 2004, 2005 Lev Walkin <vlm@lionet.info>.
|
||||
* All rights reserved.
|
||||
* Redistribution and modifications are permitted subject to BSD license.
|
||||
*/
|
||||
#ifndef _CONSTR_CHOICE_H_
|
||||
#define _CONSTR_CHOICE_H_
|
||||
|
||||
#include "asn_application.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
typedef const struct asn_CHOICE_specifics_s {
|
||||
/*
|
||||
* Target structure description.
|
||||
*/
|
||||
int struct_size; /* Size of the target structure. */
|
||||
int ctx_offset; /* Offset of the asn_codec_ctx_t member */
|
||||
int pres_offset; /* Identifier of the present member */
|
||||
int pres_size; /* Size of the identifier (enum) */
|
||||
|
||||
/*
|
||||
* Tags to members mapping table.
|
||||
*/
|
||||
const asn_TYPE_tag2member_t *tag2el;
|
||||
int tag2el_count;
|
||||
|
||||
/* Canonical ordering of CHOICE elements, for PER */
|
||||
int *canonical_order;
|
||||
|
||||
/*
|
||||
* Extensions-related stuff.
|
||||
*/
|
||||
int ext_start; /* First member of extensions, or -1 */
|
||||
} asn_CHOICE_specifics_t;
|
||||
|
||||
/*
|
||||
* A set specialized functions dealing with the CHOICE type.
|
||||
*/
|
||||
asn_struct_free_f CHOICE_free;
|
||||
asn_struct_print_f CHOICE_print;
|
||||
asn_constr_check_f CHOICE_constraint;
|
||||
ber_type_decoder_f CHOICE_decode_ber;
|
||||
der_type_encoder_f CHOICE_encode_der;
|
||||
xer_type_decoder_f CHOICE_decode_xer;
|
||||
xer_type_encoder_f CHOICE_encode_xer;
|
||||
per_type_decoder_f CHOICE_decode_uper;
|
||||
per_type_encoder_f CHOICE_encode_uper;
|
||||
asn_outmost_tag_f CHOICE_outmost_tag;
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _CONSTR_CHOICE_H_ */
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,63 +0,0 @@
|
||||
// Copyright (c) 2016-2023 The Hush developers
|
||||
// Distributed under the GPLv3 software license, see the accompanying
|
||||
// file COPYING or https://www.gnu.org/licenses/gpl-3.0.en.html
|
||||
/*-
|
||||
* Copyright (c) 2003, 2004 Lev Walkin <vlm@lionet.info>. All rights reserved.
|
||||
* Redistribution and modifications are permitted subject to BSD license.
|
||||
*/
|
||||
#ifndef _CONSTR_SEQUENCE_H_
|
||||
#define _CONSTR_SEQUENCE_H_
|
||||
|
||||
#include "asn_application.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
typedef const struct asn_SEQUENCE_specifics_s {
|
||||
/*
|
||||
* Target structure description.
|
||||
*/
|
||||
int struct_size; /* Size of the target structure. */
|
||||
int ctx_offset; /* Offset of the asn_struct_ctx_t member */
|
||||
|
||||
/*
|
||||
* Tags to members mapping table (sorted).
|
||||
*/
|
||||
const asn_TYPE_tag2member_t *tag2el;
|
||||
int tag2el_count;
|
||||
|
||||
/*
|
||||
* Optional members of the extensions root (roms) or additions (aoms).
|
||||
* Meaningful for PER.
|
||||
*/
|
||||
const int *oms; /* Optional MemberS */
|
||||
int roms_count; /* Root optional members count */
|
||||
int aoms_count; /* Additions optional members count */
|
||||
|
||||
/*
|
||||
* Description of an extensions group.
|
||||
*/
|
||||
int ext_after; /* Extensions start after this member */
|
||||
int ext_before; /* Extensions stop before this member */
|
||||
} asn_SEQUENCE_specifics_t;
|
||||
|
||||
|
||||
/*
|
||||
* A set specialized functions dealing with the SEQUENCE type.
|
||||
*/
|
||||
asn_struct_free_f SEQUENCE_free;
|
||||
asn_struct_print_f SEQUENCE_print;
|
||||
asn_constr_check_f SEQUENCE_constraint;
|
||||
ber_type_decoder_f SEQUENCE_decode_ber;
|
||||
der_type_encoder_f SEQUENCE_encode_der;
|
||||
xer_type_decoder_f SEQUENCE_decode_xer;
|
||||
xer_type_encoder_f SEQUENCE_encode_xer;
|
||||
per_type_decoder_f SEQUENCE_decode_uper;
|
||||
per_type_encoder_f SEQUENCE_encode_uper;
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _CONSTR_SEQUENCE_H_ */
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user