Skip to content

Commit

Permalink
구매 구현 완료 👏
Browse files Browse the repository at this point in the history
  • Loading branch information
kyoungbinkim committed Mar 16, 2023
1 parent b44e5a5 commit be7e0bf
Show file tree
Hide file tree
Showing 7 changed files with 217 additions and 83 deletions.
4 changes: 4 additions & 0 deletions front/src/react/registerData.js
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,10 @@ const RegisterDataComponent = () => {
// console.log(reqBody)ㄴ
httpCli.post('/data/register/', reqBody).then(
async res => {
if(res.flag == false){
alert('fail.')
setLoading(false);
}
console.log(res)
alert('데이터 등록이 완료되었습니다.')
console.log(res.data);
Expand Down
129 changes: 118 additions & 11 deletions server/src/controller/genTradeController.js
Original file line number Diff line number Diff line change
@@ -1,13 +1,19 @@
import _ from 'lodash'
import fs from 'fs'
import mimc from '../core/crypto/mimc';
import Config from '../core/utils/config';
import Encryption from '../core/crypto/encryption';
import {
getDataEncKeyFromHct,
getDataInfoFromHct,
getUserInfoFormNickname
} from "../core/data/db.mysql";
import { getTradeContract } from "../core/contracts";


const pubEnc = new Encryption.publicKeyEncryption();


export const genTradeController = async (req, res) => {
try {
// console.log(req)
Expand All @@ -16,27 +22,61 @@ export const genTradeController = async (req, res) => {
const dataInfo = (await getDataInfoFromHct(h_ct))[0];
const usrInfo = await getUserInfoFormNickname(_.get(dataInfo, 'owner_nickname'));

console.log("usrInfo", JSON.stringify(usrInfo, null, 2));
console.log("usrInfo : ", JSON.stringify(usrInfo, null, 2));
console.log('dataInfo : ', JSON.stringify(dataInfo, null, 2));

const receipt = await getTradeContract().eth.getTransaction(tx_hash)
console.log(receipt);
// console.log(receipt);

const tmp = _.get(receipt, 'input').slice(10)
for(let i=0; i<27; i++ ){
console.log(i, tmp.slice(i*64, (i+1)*64),)
}
const data = _.get(receipt, 'input').slice(10)
// for(let i=0; i<27; i++ ){
// console.log(i, data.slice(i*64, (i+1)*64),)
// }

/*
pk_enc_cons,
pk_own_cons,
r_cm,
fee_own
fee_del
h_k
*/
const dec_ct = decrypCT(
_.get(receipt, 'input').slice(10),
_.get(usrInfo, 'sk_enc')
)
// console.log(dec_ct)

if(!checkCM(data, dec_ct, _.get(usrInfo, 'pk_own'), _.get(Config.keys, 'pk_own'))){
return res.send({
flag : false
})
}

const keyJson = await getDataEncKeyFromHct(h_ct)
console.log(keyJson)

const enc_key = _.get(keyJson, 'enc_key')
const data_path = _.get(keyJson, 'data_path')

console.log(dec_ct)
// 2 : g^r
// 3 : c1
// 12 ~ 17 : CT
const symEnc = new Encryption.symmetricKeyEncryption(enc_key)
const CT = _.get(JSON.parse(fs.readFileSync(data_path, 'utf-8')), 'ct_data');
// console.log(JSON.stringify(CT, null, 2))

const dec = symEnc.DecData(new Encryption.sCTdata(
_.get(CT, 'r'),
_.get(CT, 'ct')
));

// console.log(dec)
const dataString = hexStrToString(dec)
res.send({
flag: true
flag : true,
owner : _.get(usrInfo, 'nickname'),
title : _.get(dataInfo, 'title'),
key : enc_key,
h_ct : h_ct,
data : dataString
})
} catch (error) {
console.log(error)
Expand All @@ -46,6 +86,9 @@ export const genTradeController = async (req, res) => {
}
}

// 2 : g^r
// 3 : c1
// 12 ~ 17 : CT
const decrypCT = (data, sk_enc_peer) => {
const c0 = sliceData(data, 2)
const c1 = sliceData(data, 3)
Expand All @@ -61,6 +104,70 @@ const decrypCT = (data, sk_enc_peer) => {
)
}

// 4 : cm_own = Hash(pk_own_peer || r || fee_peer || h_k || pk_enc_cons)
// 5 : cm_del = Hash(pk_own_del || r || fee_del || h_k || pk_enc_cons)
const checkCM = (data, decCT, pk_own_peer, pk_own_del) =>{

const mimc7 = new mimc.MiMC7();

const cm_own = sliceData(data, 4)
const cm_del = sliceData(data, 5)

const [
pk_enc_cons,
pk_own_cons,
r_cm,
fee_own,
fee_del,
h_k ] = decCT

console.log(
" pk_own_peer : ", pk_own_peer, '\n',
'r_cm : ' , r_cm ,'\n',
'fee_own : ' , fee_own ,'\n',
'h_k : ' , h_k ,'\n',
'pk_enc_cons : ' , pk_enc_cons ,'\n',
)

const cm_own_calc = mimc7.hash(
pk_own_peer,
r_cm,
fee_own,
h_k,
pk_enc_cons
)
const cm_del_calc = mimc7.hash(
pk_own_del,
r_cm,
fee_del.padStart(64, '0'),
h_k,
pk_enc_cons
)

console.log(cm_own_calc,cm_own )
console.log(cm_del_calc, cm_del)

return cm_own_calc.padStart(64, '0') === cm_own.padStart(64, '0') && cm_del_calc.padStart(64, '0')===cm_del.padStart(64, '0')
}

const sliceData = (data ,idx) =>{
if(typeof data !== 'string') {throw Error('data must be string')}
return data.slice(idx * 64 , (idx+1) * 64)
}

/**
*
* @param {Array<String>} strArr
* @returns {string} readable data string
*/
const hexStrToString = (strArr) => {
let ret = ''
for (let i =0; i<Number(Config.dataBlockNum); i++){
if(strArr[i] === '0') continue;
console.log(strArr[i]);
ret += Buffer.from(strArr[i].padStart(64,'0'), 'hex')
}

console.log(ret, typeof ret)
return ret
}
132 changes: 70 additions & 62 deletions server/src/controller/registDataController.js
Original file line number Diff line number Diff line change
Expand Up @@ -26,81 +26,89 @@ const dataToHexStr = (data) => {


export const registDataController = async (req, res) => {
const loginTk = getLoginTk(req);
try {
const loginTk = getLoginTk(req);

console.log("loginTk : ",loginTk);
const usrInfo = await getUserInfo(loginTk);
console.log(usrInfo);
const addr = usrInfo['eoa_addr'];
const data = req.body['data'];
const pkOwn = usrInfo['pk_own'];
const usrInfo = await getUserInfo(loginTk);
const addr = usrInfo['eoa_addr'];
const data = req.body['data'];
const pkOwn = usrInfo['pk_own'];

const snarkInput = new SnarkInput.RegistData();

// upload data
snarkInput.uploadDataFromStr(data);
console.log("loginTk : ",loginTk);
console.log(usrInfo, data);

// upload pk_own
snarkInput.uploadPkOwn(pkOwn);
const snarkInput = new SnarkInput.RegistData();

// upload data
snarkInput.uploadDataFromStr(data);

// encrypt data to make ct_data
snarkInput.encryptData();
// upload pk_own
snarkInput.uploadPkOwn(pkOwn);

// make h_k h_data id_data
snarkInput.makeSnarkInput();
// encrypt data to make ct_data
snarkInput.encryptData();

libsnarkProver.uploadInputAndRunProof(snarkInput.toSnarkInputFormat(), "_" + snarkInput.gethCt());
const verifySnarkFormat = JSON.parse(snarkInput.toSnarkVerifyFormat());
// make h_k h_data id_data
snarkInput.makeSnarkInput();

const contractVerifyInput = registDataInputJsonToContractFormat(verifySnarkFormat);
const contractProof = getContractProof(snarkInput.gethCt(), `RegistData`);

// send regist data contract
console.log("proof", contractProof);
console.log("verify input", contractVerifyInput);
libsnarkProver.uploadInputAndRunProof(snarkInput.toSnarkInputFormat(), "_" + snarkInput.gethCt());
const verifySnarkFormat = JSON.parse(snarkInput.toSnarkVerifyFormat());

const receipt = await getTradeContract().registData(
contractProof,
contractVerifyInput,
)
const contractVerifyInput = registDataInputJsonToContractFormat(verifySnarkFormat);
const contractProof = getContractProof(snarkInput.gethCt(), `RegistData`);

// send regist data contract
console.log("proof", contractProof);
console.log("verify input", contractVerifyInput);

if(!(await getTradeContract().isRegisteredData(contractVerifyInput[3]))){
return res.send(false);
}
const receipt = await getTradeContract().registData(
contractProof,
contractVerifyInput,
)

const registerDataJson = _.merge(
{
"ct_data" : JSON.parse(snarkInput.getsCtData()),
'enc_key' : snarkInput.getEncKey(),
'h_ct' : snarkInput.gethCt(),
'h_data' : snarkInput.getIdData(),
'data_path' : fileStorePath + snarkInput.gethCt() + '.json',
'h_k' : snarkInput.gethK(),
},
usrInfo, req.body)

console.log(registerDataJson);
if(await registDataQuery(registerDataJson)){
try {
fs.writeFileSync(
registerDataJson['data_path'],
JSON.stringify(registerDataJson, null, 2)
)
return res.send(
{
flag : true,
receipt : receipt,
h_ct : snarkInput.gethCt(),
proof : contractProof,
contractAddr: getContractAddr(),
}
);
} catch (error) {
console.log(error);
if(!(await getTradeContract().isRegisteredData(contractVerifyInput[3]))){
return res.send(false);
}

const registerDataJson = _.merge(
{
"ct_data" : JSON.parse(snarkInput.getsCtData()),
'enc_key' : snarkInput.getEncKey(),
'h_ct' : snarkInput.gethCt(),
'h_data' : snarkInput.getIdData(),
'data_path' : fileStorePath + snarkInput.gethCt() + '.json',
'h_k' : snarkInput.gethK(),
},
usrInfo, req.body)

console.log(registerDataJson);
if(await registDataQuery(registerDataJson)){
try {
fs.writeFileSync(
registerDataJson['data_path'],
JSON.stringify(registerDataJson, null, 2)
)
return res.send(
{
flag : true,
receipt : receipt,
h_ct : snarkInput.gethCt(),
proof : contractProof,
contractAddr: getContractAddr(),
}
);
} catch (error) {
console.log(error);
return res.send({flag : false});
}
}
} catch (error) {
console.log(error);
return res.send({flag : false});
}


res.send(false);
// res.send({flag : false});
}

export const getLoginTk = (req) => {
Expand Down
2 changes: 1 addition & 1 deletion server/src/core/crypto/jwt.js
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ export function verify(token, sk) {


export const authMiddleWare = async (req, res, next) => {

// console.log('access-token', req.headers['access-token'], req.query.token)
const jwtHeader = JSON.parse((req.headers['access-token'] || req.query.token) ?? '{}')
console.log(jwtHeader, req.headers);
if(jwtHeader === {}){
Expand Down
17 changes: 16 additions & 1 deletion server/src/core/data/db.mysql.js
Original file line number Diff line number Diff line change
Expand Up @@ -234,7 +234,7 @@ export async function getMyData(nickname){

export async function getDataInfoFromHct(h_ct) {
const getDataInfoFromHctQuery =
`SELECT h_k, h_ct, h_data, owner_nickname FROM data WHERE h_ct='${h_ct}';`
`SELECT h_k, h_ct, h_data, owner_nickname, title FROM data WHERE h_ct='${h_ct}';`

const [rows] = await promiseConnection.execute(
getDataInfoFromHctQuery
Expand All @@ -243,6 +243,21 @@ export async function getDataInfoFromHct(h_ct) {
return rows
}

export async function getDataEncKeyFromHct(h_ct) {
try {
const getDataEncKeyFromHctQuery =
`SELECT enc_key, data_path FROM data WHERE h_ct='${h_ct}';`

const [rows] = await promiseConnection.execute(
getDataEncKeyFromHctQuery
);
// console.log(rows);
return rows[0]
} catch (error) {
console.log(error)
}
}

export async function getSkEncKey(lgTk) {
try {
const getSkQuery = `SELECT sk_enc FROM user where login_tk=?`
Expand Down
Loading

0 comments on commit be7e0bf

Please sign in to comment.