static void generate_bond_signature(tx_bond_t *bond) { shkey_t *sig_key; uint64_t crc; crc = (uint64_t)shcrc(bond->bond_sink, strlen(bond->bond_sink)); sig_key = shkey_cert(&bond->bond_key, crc, bond->bond_expire); memcpy(&bond->bond_sig, sig_key, sizeof(shkey_t)); shkey_free(&sig_key); }
void generate_asset_signature(tx_asset_t *asset, shpeer_t *peer) { shkey_t *sig_key; uint64_t crc; if (asset->ass.ass_expire == SHTIME_UNDEFINED) asset->ass.ass_expire = shtime_adj(shtime(), SHARE_DEFAULT_EXPIRE_TIME); crc = shcrc((unsigned char *)asset->ass_data, asset->ass_size); sig_key = shkey_cert(shpeer_kpriv(peer), crc, asset->ass.ass_expire); memcpy(&asset->ass.ass_sig, sig_key, sizeof(shkey_t)); shkey_free(&sig_key); }
int shkey_verify(shkey_t *sig, uint64_t crc, shkey_t *key, shtime_t stamp) { shkey_t *sha_key; char *ptr; int valid; sha_key = shkey_cert(key, crc, stamp); valid = shkey_cmp(sha_key, sig); shkey_free(&sha_key); if (!valid) return (SHERR_INVAL); return (0); }
/** Associated a particular context with releasing a ward. */ void txward_context_sign(tx_ward_t *ward, tx_context_t *ctx) { shkey_t *sig_key; if (!ward || !ctx) return; if (!shkey_cmp(&ward->ward_ref, &ctx->ctx_ref)) return (SHERR_INVAL); if (ward->ward_tx.tx_stamp == SHTIME_UNDEFINED) ward->ward_tx.tx_stamp = shtime(); sig_key = shkey_cert(&ctx->ctx_sig, shkey_crc(&ctx->ctx_ref), ward->ward_tx.tx_stamp); memcpy(&ward->ward_sig, sig_key, sizeof(ward->ward_sig)); shkey_free(&sig_key); }