drop table if exists bct_sign purge;
create blockchain table bct_sign (
id number,
fruit varchar2(20),
quantity number,
created_date date,
constraint bct_sign_pk primary key (id)
)
no drop until 0 days idle
no delete until 16 days after insert
hashing using "SHA2_512" version "v2";
insert into bct_sign (id, fruit, quantity, created_date) values (1, 'apple', 20, sysdate);
commit;
declare
l_dir varchar2(20) := 'CERT_DIR';
l_file_name varchar2(20) := 'id_1_signature.dat';
l_row_data blob;
l_buffer raw(4000);
l_inst_id binary_integer;
l_chain_id binary_integer;
l_seq_num binary_integer;
l_row_len binary_integer;
l_file utl_file.file_type;
begin
select orabctab_inst_id$, orabctab_chain_id$, orabctab_seq_num$
into l_inst_id, l_chain_id, l_seq_num
from bct_sign
where id = 1;
dbms_blockchain_table.get_bytes_for_row_signature(
schema_name => 'testuser1',
table_name => 'bct_sign',
instance_id => l_inst_id,
chain_id => l_chain_id,
sequence_id => l_seq_num,
data_format => 1,
row_data => l_row_data);
l_row_len := dbms_lob.getlength(l_row_data);
dbms_lob.read(l_row_data, l_row_len, 1, l_buffer);
l_file := utl_file.fopen(l_dir,l_file_name,'wb', 32767);
utl_file.put_raw(l_file, l_buffer, true);
utl_file.fclose(l_file);
end;
/
cd /home/oracle/my_wallet/
openssl dgst -sha512 \
-sign my-bct-test-key.der \
-out id_1_signature.dat.sha512 \
id_1_signature.dat
declare
l_dir varchar2(30) := 'CERT_DIR';
l_file_name varchar2(30) := 'id_1_signature.dat.sha512';
l_cert_id raw (16) := hextoraw('006EA851A3FE2E89E065000000000001');
l_inst_id binary_integer;
l_chain_id binary_integer;
l_sequence_no binary_integer;
l_hash raw(2000);
l_signature blob;
l_bfile bfile;
l_destoffset integer := 1;
l_srcoffset integer := 1;
begin
select orabctab_inst_id$, orabctab_chain_id$, orabctab_seq_num$, orabctab_hash$, orabctab_signature$
into l_inst_id, l_chain_id, l_sequence_no, l_hash, l_signature
from bct_sign
where id = 1;
if l_signature is not null then
raise_application_error(-20000, 'The row has already been signed.');
end if;
l_bfile := bfilename(l_dir, l_file_name);
if (dbms_lob.fileexists(l_bfile ) = 1) then
dbms_lob.createtemporary(l_signature, false);
dbms_lob.fileopen(l_bfile);
dbms_lob.loadblobfromfile(
dest_lob => l_signature,
src_bfile => l_bfile,
amount => dbms_lob.getlength(l_bfile),
dest_offset => l_destoffset,
src_offset => l_srcoffset
);
dbms_lob.fileclose(l_bfile);
dbms_blockchain_table.sign_row(
schema_name => 'testuser1',
table_name => 'bct_sign',
instance_id => l_inst_id,
chain_id => l_chain_id,
sequence_id => l_sequence_no,
hash => l_hash,
signature => l_signature,
certificate_guid => l_cert_id,
signature_algo => dbms_blockchain_table.sign_algo_rsa_sha2_512);
else
raise_application_error(-20001, 'must create the signature first');
end if;
end;
/
set linesize 120
column signature format a30
column cert_id format a35
select id,
fruit,
orabctab_signature$ as signature,
orabctab_signature_cert$ as cert_id
from bct_sign
where id = 1;
ID FRUIT SIGNATURE CERT_ID
---------- -------------------- ------------------------------ -----------------------------------
1 apple 240FB4F558B14DD035DBDD5E71012E 006EA851A3FE2E89E065000000000001
AB28775A47C7CC2720D6660B4F9F1B
DFE8F944FCD55AD7BE67400A82B0A8
C00281F405CD53401D85DF6272AE3E
1294A02B6901B6693515348482F7D5
5F861860FBF66ACB6DFB7C977DC87C
3F2C1A9C1ABFE79F30DD6F7AAA155F
4F4DCD3B37F6BDD4AEDED784B18E3A
0EAB72B23F53403
SQL>