zx_status_t merkle_tree_create(const void* data, size_t data_len, void* tree, size_t tree_len, void* out, size_t out_len) { zx_status_t rc; Digest digest; if ((rc = MerkleTree::Create(data, data_len, tree, tree_len, &digest)) != ZX_OK) { return rc; } return digest.CopyTo(static_cast<uint8_t*>(out), out_len); }
zx_status_t merkle_tree_create_final(merkle_tree_t* mt, void* tree, void* out, size_t out_len) { // Must have a wrapper object. if (!mt) { return ZX_ERR_INVALID_ARGS; } // Take possession of the wrapper object. That way, we'll clean up // automatically. fbl::unique_ptr<merkle_tree_t> mt_uniq(mt); // Call the C++ function. zx_status_t rc; Digest digest; if ((rc = mt_uniq->obj.CreateFinal(tree, &digest)) != ZX_OK) { return rc; } return digest.CopyTo(static_cast<uint8_t*>(out), out_len); }