• Tidak ada hasil yang ditemukan

ANALISA DAN PERANCANGANANALISA DAN PERANCANGAN

2. Objek Penyusun Pesan SET

1.15 IMPLEMENTASI PROSES

Implementasi prototipe proses otorisasi antara merchant dan payment gateway

dibagi dalam dua modul. Modul pertama adalah proses otorisasi di merchant dan modul kedua adalah proses otorisasi di payment gateway.

Sesuai dengan diagram alur data yang terdapat pada analisa proses di bab tiga, implementasi ini dilakukan. Sebelumnya perlu dijelaskan bahwa apa yang

diimplementasikan ini hanyalah prototipe saja. Adapun keterbatasan dari protipe proses ini adalah :

1. Tidak memiliki basis data transaksi. Data transaksi yang digunakan diasumsikan. sudah ada dan tersimpan dalam file.

2. Tidak memiliki modul pemrosesan sertifikat. 3. Tidak memiliki modul antar muka dengan pemakai.

Sesuai dengan DAD Proses Otorisasi pada sub-bab 1.11, terdapat dua bagian proses di merchant, yaitu pembuatan authorization request dan pemrosesan authorization

response; dan dua bagian proses di payment gateway, yaitu pemrosesan authorization

request dan pembuatan authorization response. Seluruh proses diimplementasikan

berdasarkan DAD tersebut.

Pengiriman pesan antara merchant dan payment gateway menggunakan socket

TCP/IP dengan memanfaatkan library yang sudah ada di Java.

Berikut ini adalah potongan program proses pembuatan AuthReq. package digsec.set.application; import java.io.*; import java.net.*; import java.util.*; import sun.security.util.*; import java.security.*; import java.security.cert.*; import digsec.set.payment.component.*; import digsec.set.payment.component.SaleDetail.*; import digsec.set.core.pkcs.*; import digsec.set.core.crypto.*; import digsec.set.payment.message.AuthReqRes.*; import au.net.aba.crypto.provider.*; import cryptix.provider.Cryptix; import sun.misc.HexDumpEncoder; import digsec.set.payment.wrapper.*;

public class Merchant {

//--- network ---Socket mySock; DataInputStream input; DataOutputStream output; InetAddress gatewayAddress; int port;

//---Certicate and

X509Certificate p_cert;

PrivateKey m_priv;

//---Cardholder

Data---AVSData avsData;

BigInt specialProcessing = new BigInt(0);

BigInt cardSuspect = new BigInt(0);

boolean requestCardTypeInd = false;

//---Merchant Data---byte[] lid_M = {2,1,0,3,1,7}; MerTermIDs merTermIDs; MerchData merchData; MarketSpecAuthData marketSpecAuthData; //--- Earlier Transaction ---byte[] pi; OIData oiData; HODInput hodInput; TransIDs transIDs; BigInt authRetNum=null;

String paySysID = null;

//--- Merchant's Options

---boolean subsequentAuthInd = false;

boolean captureNow=true; //--- Current Transaction ---CurrencyAmount authReqAmt; SaleDetail saleDetail=null; //---flag---boolean splitRecurringPayment=false;

Gambar IV-8 Field-field pada AuthReq

Pada potongan program di atas terlihat sejumlah field yang sesuai dengan basis data yang dilambangkan pada DAD di bab tiga.

public MerchantP (InetAddress addr, int port) throws Exception { Security.addProvider(new ABAProvider()); Security.addProvider(new Cryptix());

gatewayAddress = addr; this.port = port;

initPrivateKeyCert(); initCardholderData(); initMerchantData(); initPreliminaryTransaction(); initCurrentTransaction(); initConnection(); run(); }

private void initCurrentTransaction () throws Exception { authReqAmt = hodInput.purchAmt;

}

private void initPreliminaryTransaction () throws Exception { FileInputStream fi = new FileInputStream("HODInput.dat"); byte[] input = new byte[fi.available()];

fi.read(input);

hodInput = new HODInput(new DerInputStream(input));

fi = new FileInputStream("OIData.dat"); input = new byte[fi.available()]; fi.read(input);

oiData = new OIData(new DerInputStream(input));

fi = new FileInputStream("PIDualSigned.dat"); pi = new byte[fi.available()];

fi.read(pi);

transIDs = oiData.transIDs;

}

private void initMerchantData() throws Exception {

FileInputStream fi = new FileInputStream("MerTermIDs.dat"); byte[] input = new byte[fi.available()];

fi.read(input); fi.close();

merTermIDs = new MerTermIDs(new DerInputStream(input));

fi = new FileInputStream("MerchData.dat"); input = new byte[fi.available()];

fi.read(input); fi.close();

merchData = new MerchData(new DerInputStream(input));

marketSpecAuthData = null; }

private void initCardholderData() throws Exception { FileInputStream fi = new FileInputStream(

"d:\\digsec\\progie\\arif\\source\\digsec\\set\\application\\avsData.dat"); byte[] input = new byte[fi.available()];

fi.read(input); fi.close();

avsData = new AVSData(new DerInputStream(input)); }

private void initPrivateKeyCert() throws Exception { //get payment-gateway's certificate

FileInputStream inStream = new FileInputStream(

"d:\\digsec\\progie\\arif\\source\\digsec\\set\\application\\keystore\\pg.cert"); CertificateFactory cf = CertificateFactory.getInstance("X.509");

p_cert = (X509Certificate)cf.generateCertificate(inStream); inStream.close();

//get merchant's certificate inStream = new FileInputStream(

"d:\\digsec\\progie\\arif\\source\\digsec\\set\\application\\keystore\\m.cert"); cf = CertificateFactory.getInstance("X.509");

m_cert = (X509Certificate)cf.generateCertificate(inStream); inStream.close();

//get merchant's private key inStream = new FileInputStream(

"d:\\digsec\\progie\\arif\\source\\digsec\\set\\application\\keystore\\m.jks"); java.security.KeyStore ks = java.security.KeyStore.getInstance("JKS", "SUN");

ks.load(inStream,"Merchant".toCharArray());

m_priv = (PrivateKey) ks.getKey("M", "Merchant".toCharArray()); }

private v oid initConnection() throws IOException { mySock = new Socket(gatewayAddress,port);

input = new DataInputStream(mySock.getInputStream()); output = new DataOutputStream(mySock.getOutputStream()); }

Gambar IV-9 Inisialisasi Data-Data yang Sebelumnya Diterima dari Cardholder

Potongan program di atas adalah tahap inisialisi, data-data yang diasumsikan diterima dari cardholder sebelumnya diambil dari file-file yang sudah dipersiapkan terlebih dahulu.

public void run() throws Exception {

Message msg = makeAuthReq(); output.write(composeWrapper(msg)); }

private byte[] composeWrapper(Message msg) throws Exception { MessageIDs messageIDs = new MessageIDs(transIDs.lid_C,

transIDs.lid_M, transIDs.xid); MessageHeader mh = new MessageHeader(new Date(), messageIDs,

oiData.rrpid, "DIGSEC"); MessageWrapper mw = new MessageWrapper(mh,msg);

DerOutputStream dout = new DerOutputStream(); mw.encode(dout);

return dout.toByteArray(); }

private AuthTags makeAuthTags() throws Exception {

RRTags rrTags = new RRTags(oiData.rrpid, merTermIDs); return new AuthTags(rrTags,transIDs,authRetNum); }

private AuthReq makeAuthReq() throws Exception {

//->->->->->->->->->-> AuthReqItem <-<-<-<-<-<-<-<-<-<-//make AuthTags

AuthTags authTags = makeAuthTags(); //make AuthReqPayload

AuthReqPayload authReqPayload = new AuthReqPayload(subsequentAuthInd, authReqAmt, avsData, specialProcessing, cardSuspect, requestCardTypeInd, hodInput.installRecurData, marketSpecAuthData, merchData); //make CheckDigest

HOD hod2 = new HOD(hodInput); HOIData hoiData = new HOIData(oiData);

CheckDigests checkDigest = new CheckDigests(hoiData,hod2); //make AuthReqItem

AuthReqItem authReqItem = new AuthReqItem(authTags, checkDigest, authReqPayload);

//->->->->->->->->-> Make SaleDetail <-<-<-<-<-<-<-<-<-<-//->->->->->->->->->-> Make AuthReq <-<-<-<-<-<-<-<-<-<-< AuthReqData authReqData = new AuthReqData(authReqItem,

captureNow, saleDetail); AuthReq ar = new AuthReq(m_cert,m_priv,p_cert,authReqData,pi); return ar;

}

Gambar IV-10 Proses-proses yang dibuat mendekati DAD Pembuatan AuthReq

Potongan program di atas dibuat sesuai dengan proses-proses yang ada pada proses pembuatan AuthReq.

113

PENGUJIAN

PENGUJIAN

Dokumen terkait