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