#include "ops.h"
void rustsimplicity_0_6_sha256_confidential(unsigned char evenPrefix, unsigned char oddPrefix, sha256_context* ctx, const confidential* conf) {
switch (conf->prefix) {
case NONE: sha256_uchar(ctx, 0x00); return;
case EXPLICIT: sha256_uchar(ctx, 0x01); break;
case EVEN_Y: sha256_uchar(ctx, evenPrefix); break;
case ODD_Y: sha256_uchar(ctx, oddPrefix); break;
}
sha256_hash(ctx, &conf->data);
}
void rustsimplicity_0_6_sha256_confAsset(sha256_context* ctx, const confidential* asset) {
rustsimplicity_0_6_sha256_confidential(0x0a, 0x0b, ctx, asset);
}
void rustsimplicity_0_6_sha256_confNonce(sha256_context* ctx, const confidential* nonce) {
rustsimplicity_0_6_sha256_confidential(0x02, 0x03, ctx, nonce);
}
void rustsimplicity_0_6_sha256_confAmt(sha256_context* ctx, const confAmount* amt) {
switch (amt->prefix) {
case NONE: SIMPLICITY_UNREACHABLE;
case EXPLICIT:
sha256_uchar(ctx, 0x01);
sha256_u64be(ctx, amt->explicit);
return;
case EVEN_Y:
case ODD_Y:
sha256_uchar(ctx, EVEN_Y == amt->prefix ? 0x08 : 0x09);
sha256_hash(ctx, &amt->confidential);
return;
}
}
sha256_midstate rustsimplicity_0_6_generateIssuanceEntropy(const outpoint* op, const sha256_midstate* contract) {
uint32_t block[16];
unsigned char buf[32];
sha256_midstate result;
{
sha256_context ctx = sha256_init(result.s);
sha256_fromMidstate(buf, op->txid.s);
sha256_uchars(&ctx, buf, 32);
sha256_u32le(&ctx, op->ix);
sha256_finalize(&ctx);
}
{
sha256_context ctx = sha256_init(&block[0]);
sha256_fromMidstate(buf, result.s);
sha256_uchars(&ctx, buf, 32);
sha256_finalize(&ctx);
}
memcpy(&block[8], contract->s, sizeof(contract->s));
sha256_iv(result.s);
rustsimplicity_0_6_sha256_compression(result.s, block);
return result;
}
sha256_midstate rustsimplicity_0_6_calculateAsset(const sha256_midstate* entropy) {
uint32_t block[16] = {0};
sha256_midstate result;
memcpy(&block[0], entropy->s, sizeof(entropy->s));
sha256_iv(result.s);
rustsimplicity_0_6_sha256_compression(result.s, block);
return result;
}
sha256_midstate rustsimplicity_0_6_calculateToken(const sha256_midstate* entropy, confPrefix prefix) {
uint32_t block[16] = {0};
sha256_midstate result;
memcpy(&block[0], entropy->s, sizeof(entropy->s));
block[8] = is_confidential(prefix) ? 0x02000000 : 0x01000000;
sha256_iv(result.s);
rustsimplicity_0_6_sha256_compression(result.s, block);
return result;
}
sha256_midstate rustsimplicity_0_6_make_tapleaf(unsigned char version, const sha256_midstate* cmr) {
sha256_midstate result;
sha256_midstate tapleafTag;
{
static unsigned char tagName[] = "TapLeaf/elements";
sha256_context ctx = sha256_init(tapleafTag.s);
sha256_uchars(&ctx, tagName, sizeof(tagName) - 1);
sha256_finalize(&ctx);
}
sha256_context ctx = sha256_init(result.s);
sha256_hash(&ctx, &tapleafTag);
sha256_hash(&ctx, &tapleafTag);
sha256_uchar(&ctx, version);
sha256_uchar(&ctx, 32);
sha256_hash(&ctx, cmr);
sha256_finalize(&ctx);
return result;
}
sha256_midstate rustsimplicity_0_6_make_tapbranch(const sha256_midstate* a, const sha256_midstate* b) {
sha256_midstate result;
sha256_midstate tapbranchTag;
{
static unsigned char tagName[] = "TapBranch/elements";
sha256_context ctx = sha256_init(tapbranchTag.s);
sha256_uchars(&ctx, tagName, sizeof(tagName) - 1);
sha256_finalize(&ctx);
}
sha256_context ctx = sha256_init(result.s);
sha256_hash(&ctx, &tapbranchTag);
sha256_hash(&ctx, &tapbranchTag);
if (sha256_cmp_be(a, b) < 0) {
sha256_hash(&ctx, a);
sha256_hash(&ctx, b);
} else {
sha256_hash(&ctx, b);
sha256_hash(&ctx, a);
}
sha256_finalize(&ctx);
return result;
}