BAB 4 IMPLEMENTASI DAN PENGUJIAN Implementasi dan pengujian sistem secure fax terdiri dari beberapa tahap sebagai berikut : •
persiapan target hardware berupa dua buah Single Board Computer beserta perangkat power supply, monitor, keyboard, floppy disk dan floppy disk drive, dan dua buah modem;
•
proses build sistem operasi pada host PC;
•
proses implementasi aplikasi secure fax;
•
integrasi sistem operasi dan aplikasi, menghasilkan sebuah file image;
•
instalasi file image ke floppy disk untuk di-boot oleh target hardware;
•
pengujian dengan mula-mula secure fax pertama menerima dokumen fax, melakukan enkripsi, mengirimkan fax terenkripsi ke secure fax kedua, kemudian secure fax kedua menerima fax terenkripsi yang sama dari secure fax pertama, melakukan dekripsi, dan mengirim dokumen fax. Single Board Computer yang pertama adalah SBC-456/E. Beberapa fitur
penting yang dimilikinya antara lain (spesifikasi lengkap dapat dilihat pada Lampiran A) : •
Onboard AMD 486DX5-133 CPU (SQFP),
•
memori EDO RAM,
•
10Base-T Ethernet Realtek RTL8139,
•
dukungan DiskOnChip hingga 288 MB,
•
PC/104 expansion connector.
42
Gambar 4.1: SBC-456/E
Sedangkan Single Board Computer kedua adalah PCM-5335. Fitur-fitur yang penting adalah (spesifikasi lengkap dapat dilihat pada Lampiran B) : •
Embedded Low Power 2.0V NS GX1-300 MHz CPU,
•
memori SDRAM SODIMM sampai dengan 512MB,
•
Realtek RTL8139 10/100 Mbps Ethernet,
•
Type I CompactFlash Socket,
•
PC/104 expansion connector.
Gambar 4.2: PCM-5335, sisi atas (kiri) dan sisi bawah (kanan)
43
Untuk pengiriman fax dan komunikasi dengan secure fax lain, digunakan modem dengan tipe PCM-5600, yang merupakan sebuah modem dengan interface PC/104.
4.1. Implementasi Sistem Operasi Distribusi eCos tersedia dalam versi Linux dan Windows. Dalam perancangan ini digunakan versi Linux. 4.1.1. Host Development System Untuk pengembangan sistem secure fax, digunakan host PC dengan sistem operasi Ubuntu 6.06 (Dapper Drake), yang merupakan sebuah distro GNU/Linux. Ubuntu sudah menyediakan distribusi eCos pada online repository yang dimilikinya, dan seperti distro-distro Linux lain yang menggunakan apt sebagai package manager, instalasi paket di Ubuntu dapat dilakukan dengan mudah. Instalasi eCos dapat dilakukan dengan membuka shell terminal dan mengetikkan perintah : $ sudo apt-get install ecos ecosconfig
yang akan otomatis mendownload paket distribusi eCos (ecos) serta tool yang diperlukan untuk melakukan konfigurasi eCos pada host (ecosconfig) dalam bentuk debian package (file .deb) dan melakukan instalasinya. Instalasi paket di Ubuntu juga dapat dilakukan tanpa perlu menggunakan shell jika diinginkan, yaitu dengan Synaptic Package Manager, yang pada dasarnya hanya merupakan GUI frontend untuk apt di GNOME (yang merupakan desktop manager default di Ubuntu). Namun ketika dicoba membuat aplikasi Hello, World! sederhana untuk eCos synthetic target (yaitu eCos dijalankan di atas kernel Linux untuk simulasi), ternyata terdapat masalah. Setelah dicari di Internet, solusi yang didapatkan adalah meng-upgrade source code eCos menggunakan Concurrent Versions System (CVS). Yang pertama dilakukan untuk ini adalah melakukan instalasi CVS client. Karena sudah ada di repository Ubuntu, instalasi dapat dilakukan dengan :
44
$ sudo apt-get install cvs
Kemudian untuk meng-upgrade eCos, CVS client dijalankan dengan perintah : $ cvs -z3 -d \ :pserver:
[email protected]:/cvs/ecos co -P ecos
Ketika perintah tersebut dieksekusi, direktori yang aktif (working directory) adalah direktori yang akan menjadi direktori repository eCos yang baru. Terakhir dilakukan setting environment variable ECOS_REPOSITORY agar tool konfigurasi eCos menggunakan source code eCos yang baru didownload dari CVS, yaitu pada shell bash atau sh dengan perintah : $ export ECOS_REPOSITORY=
/packages
misalnya jika direktori source eCos adalah /home/yusdi/ecos-cvs/ maka perintah tersebut menjadi : $ export ECOS_REPOSITORY=/home/yusdi/ecos-cvs/packages
Untuk melakukan cross-compiling di host PC untuk embedded target, diperlukan toolchain yang sesuai. Dalam hal ini karena target hardware adalah PC dengan prosesor i386, maka digunakan GNU toolchain untuk i386, yang didownload dari ftp://ecos.sourceware.org/pub/ecos/gnutools/i386linux. File yang didownload adalah ecoscentric-gnutools-i386-elf-1.4-2.i386linux.tar.bz2. 4.1.2. Building Kernel dan Paket Pada paket eCos untuk Linux, tersedia dua perangkat dalam membangun sistem operasi eCos, yaitu ecosconfig dengan tampilan text-based dan configtool dengan tampilan GUI. Pada perancangan ini digunakan ecosconfig untuk membuat template eCos dan membuat build tree dari konfigurasi eCos, sedangkan configtool hanya digunakan untuk melakukan konfigurasi.
45
Gambar 4.3: Diagram alir proses build eCos
Proses membangun kernel dan paket dimulai dengan memilih template yang sesuai dengan target hardware. Pada perancangan ini dipilih template default yang memasukkan semua paket standard untuk platform i386pc. Hal ini dilakukan untuk mempermudah pemilihan dan konfigurasi komponen yang ada. Perintah untuk membuat template tersebut adalah : $ ecosconfig new pc default
Argumen new menginstruksikan ecosconfig untuk membentuk sebuah konfigurasi baru; argumen pc menunjukkan bahwa target hardware yang digunakan adalah i386pc; dan argumen default menunjukkan bahwa semua paket standard yang tersedia pada template akan dimasukkan dalam file konfigurasi. Hasil perintah ini adalah sebuah file konfigurasi ecos.ecc. File ini kemudian diedit dengan bantuan configtool. Perintah untuk menjalankan configtool untuk mengedit file tersebut adalah : $ configtool ecos.ecc
yang akan membuka window GUI untuk konfigurasi eCos. Tampilan window ini dapat dilihat pada Gambar 4.4. Dengan menggunakan configtool, eCos dikonfigurasi agar sesuai dengan rancangan pada bagian 3.2. 46
Gambar 4.4: Tampilan GUI eCos Confguration Tool
Pertama ditambahkan dua buah paket, yaitu RAM Filesystem dan File IO. Keduanya berguna agar eCos dapat menulis dan membaca file, secara khusus adalah di RAM dengan menggunakan filesystem ramfs. Selain penambahan paket dilakukan juga pengurangan paket, yaitu paket Math yang merupakan implementasi library matematika. Karena aplikasi tidak memerlukan library matematika maka paket tersebut dapat dihilangkan. Di bawah ini adalah beberapa konfigurasi eCos yang diubah dari template default yang digunakan.
eCos HAL i386 architecture i386 PC target Startup Type Opsi ini digunakan untuk mengatur bagaimana PC akan melakukan booting ke eCos. Untuk SBC-456/E, karena booting akan dilakukan dengan floppy, maka opsi ini diisi dengan nilai FLOPPY. Sedangkan untuk PCM-5335 yang akan melakukan booting eCos pada CompactFlash, diperlukan boot loader. Boot loader yang akan digunakan adalah GRand Unified Boot loader (GRUB), jadi
47
opsi ini diisi dengan nilai GRUB.
eCos HAL i386 architecture i386 PC target Output to PC Screen Secara default eCos akan menggunakan serial port untuk mengirimkan output seperti output dari printf(). Untuk membuat agar eCos menggunakan monitor untuk menampilkan output, opsi ini harus dibuat aktif.
I/O Subsystem Serial Device Drivers Support non-blocking read and write calls Opsi ini diaktifkan agar. ketika membaca dan menulis ke serial port, eCos tidak perlu menunggu sampai data tersedia.
I/O Subsystem Serial Device Drivers Flow Control Opsi ini diaktifkan agar.eCos mendukung flow control dalam komunikasi serial, baik secara software maupun hardware. Pada bagian flow control diatur juga agar metode flow control yang digunakan secara default adalah secara hardware menggunakan sinyal RTS (Request To Send) dan CTS (Clear To Send).
I/O Subsystem Serial Device Drivers TTY-mode serial device drivers Walaupun tidak diperlukan untuk komunikasi serial, driver serial mode TTY diperlukan untuk output ke layar monitor, karena pada eCos hal tersebut dibuat dengan infrastruktur serial device, jadi opsi ini diaktifkan.
I/O Subsystem Serial Device Drivers Termios compatible TTY driver Opsi ini tidak diaktifkan karena aplikasi tidak memerlukan dukungan POSIX termios, tetapi cukup implementasi serial driver yang sederhana.
I/O Subsystem Serial Device Drivers Hardware serial device drivers Hardware serial device driver adalah implementasi driver serial port yang paling sederhana di eCos, dan digunakan dalam aplikasi secure fax, karena itu opsi ini diaktifkan. Diaktifkan juga PC serial port 0 driver dan PC serial port 1 driver, keduanya berada pada subbagian PC serial device drivers dari bagian ini. Serial port 0 (COM1) diberi nama /dev/ser0, sedangkan serial port 1 (COM2) diberi nama /dev/ser1.
RAM Filesystem Simple, malloc()-based, implementation Implementasi dengan malloc() adalah implementasi paling sederhana dari ramfs yang didukung eCos, dan sudah cukup untuk aplikasi yang akan dibuat, karena itu opsi ini diaktifkan. Implementasi ramfs lain yang didukung eCos adalah 48
dengan membuat blok-blok pada RAM. Perlu juga dipastikan bahwa opsi Global Command Prefix, yaitu awalan dari perintah-perintah yang akan digunakan untuk melakukan build eCos, sudah sesuai dengan toolchain yang digunakan. Dalam hal ini prefix tersebut adalah i386-elf dan template yang default untuk i386pc sudah mengatur prefix ini dengan benar. Setelah selesai konfigurasi, file ecos.ecc disimpan kembali dan selanjutnya dibuat build tree dengan menggunakan ecosconfig, yaitu dengan perintah : $ ecosconfig tree
Terakhir, library eCos dibuat dengan perintah : $ make
Hasilnya adalah static library pada subdirektori install/lib yang siap di-link dengan aplikasi untuk menjadi file image.
4.2. Implementasi Rangkaian Line Telepon Seharusnya, semua komunikasi yang terjadi pada sistem secure fax, baik komunikasi dengan mesin fax maupun dengan modem di secure fax lain, terjadi melalui jaringan telepon. Hal ini menjadi masalah karena pada produk akhir yang diinginkan, secure fax harus dapat berkomunikasi langsung dengan mesin fax tanpa melalui jaringan telepon publik. Dan pada tahap pengujian jauh lebih memudahkan apabila tidak perlu tersedia jaringan telepon untuk pengujian. Karena itulah dibuat rangkaian yang dapat menghubungkan langsung dua buah perangkat jaringan telepon seperti modem. Rangkaian ini dibuat mengikuti referensi dari http://www.epanorama.net/documents/telecom/fax_to_modem.html yang menjelaskan cara membuat interface antara fax dengan modem. Skematik rangkaian yang dibuat dapat dilihat pada Gambar 4.5.
49
Gambar 4.5: Skematik rangkaian line telepon
Rangkaian ini berhasil menghubungkan dua buah modem secara langsung, tetapi kekurangannya adalah rangkaian ini tidak dapat memberikan ring voltage sehingga modem tidak dapat langsung mendeteksi apabila terdapat panggilan.
4.3. Implementasi Aplikasi Aplikasi secure fax dibuat dengan mengimplementasikan rancangan pada bagian 3.3.2 dengan menggunakan bahasa pemrograman C. Kecuali implementasi program enkripsi dan dekripsi AES untuk satu blok, semua source code aplikasi secure fax ditulis sendiri dari awal. Source code lengkap aplikasi secure fax (kecuali program AES) dapat dilihat di Lampiran D. 4.3.1. Implementasi Circular Buffer Komunikasi antara aplikasi dengan modem dilakukan secara serial. Dalam komunikasi tersebut, serial port dapat menerima data dari modem kapan saja, dan aplikasi belum tentu siap mengolah data tersebut langsung begitu data diterima. Komunikasi serial sendiri ditangani oleh sistem operasi eCos dan eCos tentu saja sudah menyediakan buffer untuk menampung data dari serial port. Tetapi eCos membuat abstraksi untuk pengaksesan serial buffer tersebut sehingga aplikasi hanya dapat mengambil data dari buffer tersebut dan begitu data tersebut diambil, data dibuang dari buffer. Kenyataannya, respons dari modem umumnya berupa character string yang diakhiri oleh kombinasi karakter , sehingga jauh lebih memudahkan apabila pengambilan data dari serial buffer langsung berupa string tersebut dan tidak ada data yang diambil dari buffer apabila kombinasi karakter 50
tersebut belum ditemukan. Implementasi buffer yang dipilih adalah sebuah circular buffer. Circular buffer adalah struktur data yang menggunakan sebuah buffer dengan besar yang tertentu (fixed) dan awal dan akhirnya tersambung. Circular buffer menggunakan dua buah pointer, yaitu read pointer dan write pointer untuk menentukan di index mana data akan ditulis atau dibaca. Gambar 4.6 mengilustrasikan sebuah circular buffer.
Gambar 4.6: Circular Buffer
Keuntungan dari penggunaan circular buffer adalah :
tidak perlu terjadi pemindahan data pada penulisan atau pembacaan data ke dan dari buffer, karena yang perlu dipindahkan hanya pointer saja, sehingga lebih baik daripada buffer biasa dalam hal performance;
adanya pointer yang terpisah untuk menulis dan membaca data memungkinkan adanya dua proses berbeda untuk menulis dan membaca buffer (salah satu tujuan awal aplikasi secure fax ini menggunakan circular buffer juga adalah agar dengan menggunakan multithreading di eCos dimungkinkan adanya thread khusus yang menulis data dari modem ke circular buffer setiap saat dan thread lain yang perlu memproses respons dari modem tinggal mengakses buffer tersebut, tetapi hal ini belum diimplementasikan). Deklarasi struktur data dan fungsi-fungsi circular buffer ada pada file
CircularBuffer.h dan implementasinya di CircularBuffer.c.
51
Berikut adalah deklarasi struktur data circular buffer : typedef struct { char* data; unsigned long unsigned long unsigned long unsigned long } CircularBuffer;
size; readIndex; writeIndex; available;
Pada struktur data tersebut, data adalah dynamic array untuk menyimpan data, size adalah ukuran buffer dalam byte, readIndex dan writeIndex adalah read pointer dan write pointer, dan available untuk menyimpan berapa data yang pada saat itu tersedia di buffer. Namun demikian struktur data buffer ini dirancang agar aplikasi yang menggunakannya tidak mengakses langsung member variable dari struktur data ini, melainkan menggunakan beberapa fungsi yang berfungsi sebagai interface ke buffer, yaitu:
CircularBuffer* createBuffer(unsigned long size)
untuk membuat buffer dengan ukuran tertentu,
void freeBuffer(CircularBuffer* pBuffer)
untuk membebaskan data buffer dari memori,
unsigned long getAvailable(CircularBuffer* pBuffer)
untuk mendapatkan jumlah data yang tersimpan di buffer,
char readByte(CircularBuffer* pBuffer)
untuk membaca satu byte dari buffer,
BOOL writeByte(CircularBuffer* pBuffer, char data)
untuk menulis satu byte ke buffer,
int readArray(CircularBuffer* pBuffer, char data[], int n)
untuk membaca sejumlah byte data dari buffer,
int writeArray(CircularBuffer* pBuffer, char data[], int n)
untuk menulis sejumlah byte data ke buffer,
int readLine(CircularBuffer* pBuffer, char data[], int n)
untuk membaca satu baris data (yaitu sampai ditemukan karakter ) dari buffer, berguna untuk mengambil respons dari modem. 52
Keterangan yang jauh lebih lengkap dengan penjelasan parameter dan return value dari tiap fungsi dapat dilihat pada file CircularBuffer.h. Implementasi circular buffer ini tidak menggunakan fitur apapun dari eCos dan secara umum bersifat platform-independent (dan application-independent, struktur data ini dapat digunakan untuk aplikasi lain selain secure fax ini). 4.3.2. Implementasi Struktur Data Fax Struktur data fax dibuat seperti yang dirancang pada bagian 3.3.3 dengan menggunakan struct di C. Struktur data ini beserta deklarasi fungsi-fungsi yang berhubungan dengannya terdapat pada file FaxData.h, sedangkan implementasi fungsi-fungsi tersebut terdapat pada file FaxData.c. Berikut adalah deklarasi struktur data fax : typedef struct FaxPage { FILE* pFile; char filename[MAX_FILENAME_CHARS]; int dataSize; BOOL fileIsOpened; struct FaxPage* pNextPage; } Page; typedef struct { Page* pFirstPage; int totalPage; } FaxData;
Dalam struktur data Page ditambahkan juga variabel fileIsOpened yang gunanya hanya untuk mengetahui apakah file sedang dalam keadaan dibuka. Fungsi-fungsi yang berhubungan dengan struktur data fax adalah:
FaxData* createFaxData()
untuk membuat data fax baru,
void freeFaxData(FaxData* pFax)
untuk membebaskan sebuah data fax dari memori,
Page* createNewPage(FaxData* pFax)
untuk menambahkan halaman baru pada data fax,
53
Page* getPage(FaxData* pFax, int page)
untuk mengambil data halaman tertentu dari sebuah data fax,
void openFileInPage(Page* pPage, const char* attr)
untuk membuka file halaman fax,
void closeFileInPage(Page* pPage)
untuk menutup file halaman fax. Keterangan yang jauh lebih lengkap dengan penjelasan parameter dan return value dari tiap fungsi dapat dilihat pada file FaxData.h. Sama seperti circular buffer, implementasi struktur data fax ini tidak menggunakan fitur apapun dari eCos dan bersifat platform-independent. Struktur data ini juga dapat digunakan pada aplikasi lain apabila diinginkan, tetapi struktur data ini dirancang secara khusus untuk aplikasi secure fax sehingga belum tentu cocok untuk aplikasi lain.. 4.3.3. Implementasi Fungsi Modem dan Fax File modem.h berisi deklarasi fungsi-fungsi yang berhubungan dengan modem dan file modem.c berisi implementasi dari fungsi-fungsi tersebut. Fungsi-fungsi yang berhubungan dengan modem adalah sebagai berikut :
BOOL initDataMode(cyg_io_handle_t serialHandle, const char* localID)
untuk menginisialisasi modem dengan menggunakan mode data,
BOOL initFaxMode(cyg_io_handle_t serialHandle, const char* localID)
untuk menginisialisasi modem dengan menggunakan mode fax,
BOOL sendFax(cyg_io_handle_t serialHandle, Buffer* pBuffer, FaxData* pFax, const char* dialString)
untuk mengirim fax dengan menggunakan mode fax,
FaxData* receiveFax(cyg_io_handle_t serialHandle, Buffer* pBuffer)
untuk menerima fax dengan menggunakan mode fax,
BOOL sendFaxData(cyg_io_handle_t serialHandle, Buffer* pBuffer, FaxData* pFax, const char* dialString)
untuk mengirim fax dengan menggunakan mode data, 54
FaxData* receiveFaxData(cyg_io_handle_t serialHandle, Buffer* pBuffer)
untuk menerima fax dengan menggunakan mode data. Tipe data cyg_io_handle_t adalah untuk data yang digunakan eCos sebagai semacam referensi ke I/O port, dalam hal ini adalah serial port. Tipe data Buffer
adalah sama dengan CircularBuffer, hanya penamaan lain dengan
menggunakan #define (atau bisa juga dengan typedef), tujuannya agar implementasi buffer dapat diubah dengan mudah apabila diinginkan tanpa perlu memodifikasi fungsi-fungsi yang menggunakannya, selama masih memiliki API yang sama. Implementasi fungsi inisialisasi modem mengikuti perintah-perintah AT command seperti yang dijelaskan di bagian 2.5.2. Fungsi pengiriman dan penerimaan fax dengan mode fax dibuat dengan menggunakan AT command seperti pada Tabel 2.3 dan Tabel 2.4. Terakhir, fungsi pengiriman dan penerimaan data fax dengan mode data dibuat mengikuti protokol yang didefinisikan pada bagian 3.3.4. Penjelasan dari fungsi-fungsi ini yang lebih lengkap dapat dilihat pada file modem.h. Dalam implementasinya, fungsi-fungsi modem menggunakan fungsi komunikasi serial port dari eCos, sehingga dapat dikatakan bahwa implementasi di modem.c hanya spesifik untuk sistem operasi eCos. Walaupun demikian, dengan mengimplementasikan ulang serial port API yang dimiliki eCos menggunakan fungsi komunikasi serial yang didukung sistem operasi lain, fungsi-fungsi modem ini dapat dijalankan secara native oleh sistem operasi tersebut (file ecos_linux.c mengimplementasikan sebagian serial port API eCos dengan menggunakan POSIX termios sehingga fungsi-fungsi modem dapat dijalankan di GNU/Linux, lihat bagian 4.3.5). 4.3.4. Implementasi Fungsi Kriptografi Seperti sudah disebutkan sebelumnya, algoritma kriptografi yang digunakan untuk enkripsi dan dekripsi data fax adalah AES. Implementasi AES ini tidak dibuat sendiri, tetapi menggunakan library AES yang ditulis oleh Dr Brian Gladman, dan
55
dilisensi dengan permissive (BSD-style) license sehingga dapat digunakan di dalam aplikasi secure fax ini. Library AES tersebut dapat didownload dari Internet pada alamat http://fp.gladman.plus.com/cryptography_technology/rijndael/index.htm. Namun demikian fungsi-fungsi yang disediakan dari library tersebut hanya melakukan operasi pada satu blok data, sehingga perlu diimplementasikan sendiri fungsi untuk melakukan operasi pada data dengan ukuran sembarang yang akan memanggil fungsi AES pada blok-blok data dengan menggunakan salah satu mode operasi untuk block cipher. Secara khusus juga karena aplikasi secure fax menyimpan data fax dalam file, maka diperlukan juga fungsi untuk enkripsi dan dekripsi data di file. Mode operasi yang dipilih untuk enkripsi dan dekripsi adalah Cipher Block Chaining (CBC), tetapi initialization vector untuk sementara dibuat berupa nilai 0. Fungsi yang dibuat ini juga sekaligus dapat berfungsi sebagai sebuah abstraction layer, sehingga apabila suatu saat diinginkan penggunaan library AES lain, atau bahkan algoritma enkripsi lain, hal tersebut dapat dilakukan dengan mudah tanpa perlu mengubah bagian lain dari program secure fax. Fungsi-fungsi kriptografi dideklarasikan di crypto.h dan cryptofax.h, dengan implementasinya di crypto.c dan cryptofax.c. File crypto.h dan crypto.c berisi fungsi-fungsi yang tidak bergantung pada aplikasi secure fax dan dapat digunakan untuk aplikasi lain apabila diinginkan, sedangkan file cryptofax.h dan cryptofax.c berisi fungsi yang spesifik untuk aplikasi secure fax karena menggunakan struktur data fax yang dideklarasikan di file FaxData.h. Fungsi-fungsi yang dideklarasikan dalam crypto.h dan cryptofax.h adalah:
int getEncryptedSize(int s)
untuk menghitung ukuran ciphertext jika diketahui ukuran data asalnya,
void encryptData(BYTE data[], int len, BYTE key[])
untuk mengenkripsi data,
void decryptData(BYTE data[], int len, BYTE key[])
untuk mendekripsi data terenkripsi,
void encryptFile(FILE* pFile, int len, BYTE key[])
untuk mengenkripsi file,,
void decryptFile(FILE* pFile, int len, BYTE key[])
untuk mendekripsi file terenkripsi, 56
void encryptFax(FaxData* pFax, BYTE key[])
untuk mengenkripsi data fax,
void decryptFax(FaxData* pFax, BYTE key[])
untuk mendekripsi data fax terenkripsi. Tipe data BYTE hanya nama lain yang diberikan untuk unsigned char (bilangan bulat tanpa tanda dengan ukuran 8 bit / 1 byte). Sebetulnya masih ada beberapa fungsi tambahan yang dideklarasikan di file crypto.h, yaitu fungsi-fungsi yang berhubungan dengan public-key cryptography yang nantinya akan diperlukan, tetapi saat ini belum ada implementasinya. Fungsifungsi ini serta penjelasan yang lengkap untuk semua fungsi lainnya dapat dilihat pada file crypto.h dan cryptofax.h. Fungsi-fungsi kriptografi ini tidak bergantung pada eCos sehingga sifatnya platform-independent dan dapat berjalan pada hardware dan sistem operasi apapun yang mendukung program C. Tetapi justru diperlukan sedikit modifikasi pada sebuah file header dari library AES yang digunakan untuk membuatnya dapat digunakan dengan eCos, karena file aesopt.h meng-include file <endian.h> yang ternyata tidak dimiliki eCos. File tersebut berguna untuk menentukan byte order dari platform yang digunakan (little endian atau big endian). Solusi untuk masalah tersebut adalah mendefinisikan secara manual di file aesopt.h sebagai berikut : #define PLATFORM_BYTE_ORDER AES_LITTLE_ENDIAN
yang berarti menentukan bahwa byte order dari platform yang dipakai adalah little endian (prosesor yang digunakan memiliki arsitektur Intel x86). 4.3.5. Implementasi Program Utama Sampai pada bagian ini semua fungsi besar dari sistem, yaitu mengirim dan menerima data fax dengan mode fax dan mode data, serta enkripsi dan dekripsi data fax, telah diimplementasikan. Yang tersisa adalah membuat program utama yang menggunakan fungsi-fungsi tersebut. Secara umum yang dilakukan program ini adalah sesuai rancangan aplikasi di bagian 3.3.2.
57
Program utama diimplementasikan pada file main.c. Secara umum yang dilakukan program ini hanya melakukan semua inisialisasi yang diperlukan ketika aplikasi berjalan di awal, yaitu mount filesystem ramfs, konfigurasi serial port, konfigurasi input device (dalam hal ini keyboard), inisialisasi modem, dan membuat circular buffer untuk menyimpan data dari serial port; dan selanjutnya baru menjalankan program yang sesungguhnya. Program ini terdiri dari 4 buah fungsi yang selalu dijalankan bergantian: 1. readSerial1(), tugasnya adalah membaca data apapun dari modem yang terhubung dengan mesin fax dan menuliskannya ke buffer serial untuk modem tersebut; 2. readSerial2(), tugasnya sama seperti readSerial1(), tetapi modem yang dibaca adalah modem yang terhubung dengan remote secure fax, dan data yang dibaca ditulis ke buffer serial untuk modem tersebut; 3. ringListener1(), tugasnya adalah selalu membaca buffer untuk modem yang terhubung ke mesin fax, dan apabila terbaca adanya panggilan dari mesin fax, menjalankan prosedur untuk menerima fax, enkripsi, dan mengirimkannya ke remote secure fax; 4. ringListener2(), tugasnya adalah selalu membaca buffer untuk modem yang terhubung dengan remote secure fax, dan apabila terbaca adanya panggilan, menjalankan prosedur untuk menerima fax terenkripsi, dekripsi, dan mengirimkannya ke mesin fax. Apabila dideteksi terjadinya panggilan dari mesin fax, program akan langsung memanggil receiveFax() untuk menerima fax. Setelah fax diterima, fax dienkripsi dengan memanggil encryptFax() (user juga dapat memilih untuk tidak mengenkripsi jika diinginkan) dan hasilnya dikirimkan kembali melalui modem dengan menggunakan sendFaxData(). Sebelum dikirim ke remote secure fax, user dapat memasukkan nomor telepon tujuan apabila diinginkan. Jika dideteksi adanya panggilan dari remote secure fax, program akan menerima fax terenkripsi dengan receiveFaxData() dan kecuali user meminta untuk tidak melakukan dekripsi, program akan melakukan dekripsi data tersebut dengan decryptFax(). Terakhir, fax dikirimkan dengan sendFax(). 58
Satu hal yang perlu diperhatikan adalah bahwa program tidak dapat begitu saja mendeteksi adanya panggilan, karena seperti yang sudah dijelaskan, rangkaian line telepon yang digunakan tidak dapat memberikan ring voltage sehingga modem tidak dapat mendeteksi adanya panggilan. Karena itu untuk sementara dibuat semacam simulator untuk mensimulasikan terjadinya panggilan, yaitu apabila pengguna menekan suatu tombol tertentu pada keyboard, program akan menulis RING ke buffer sehingga bagian program yang memeriksa buffer akan mendeteksi adanya panggilan tanpa perlu tahu apakah itu dari modem atau dari simulator. Artinya, apabila diinginkan mekanisme lain untuk mensimulasikan terjadinya panggilan (atau apabila nantinya rangkaian dapat memberikan ring voltage) yang perlu diubah hanya bagian ring simulator saja tanpa perlu modifikasi pada bagian program lainnya. Simulator ini dibuat menjadi fungsi kelima selain empat fungsi yang dijelaskan di atas. 4.3.6. Implementasi Program di Linux untuk Pengujian Pada pengujian sistem secure fax, sistem harus mengirimkan data fax antar modem dalam mode data dengan menggunakan protokol yang dirancang khusus untuk sistem ini. Untuk dapat mencoba melakukan pengiriman data fax dengan mode data antara secure fax (embedded target) dengan host PC, protokol pengiriman data yang sama perlu dibuat sehingga dapat berjalan di PC. Fungsi-fungsi yang diperlukan adalah fungsi-fungsi yang sama dengan yang dideklarasikan di file modem.h. Namun seperti sudah disebutkan di atas, fungsifungsi ini diimplementasikan dengan menggunakan beberapa API dari eCos sehingga tidak dapat begitu saja dijalankan pada sistem operasi lain. Untuk mengatasi masalah tersebut, dibuat implementasi ulang sebagian eCos API, terutama serial port API yang digunakan dalam secure fax dengan menggunakan POSIX termios yang merupakan metode untuk komunikasi serial pada sistem Unix (misalnya GNU/Linux, BSD, dan Solaris). Fungsi-fungsi ini dideklarasikan di ecos_linux.h dan diimplementasikan di ecos_linux.c. Fungsifungsi tersebut adalah:
void cyg_io_write(cyg_io_handle_t fd, char buf[], int* pLen)
untuk menulis data ke serial port, 59
void cyg_io_read(cyg_io_handle_t fd, char buf[], int* pLen)
untuk membaca data dari serial port,
void cyg_thread_delay(int delay)
untuk membuat delay. Pada fungsi-fungsi serial, parameter yang seharusnya adalah I/O handle pada eCos digantikan dengan data termios yang dibuka. Pada file modem.h dan modem.c digunakan perintah kondisi dari preprocessor untuk menentukan apakah program akan di-build untuk eCos atau untuk Linux. Misalnya pada awal modem.h, untuk meng-include file yang benar dibuat sebagai berikut: #ifdef LINUX #include "ecos_linux.h" #else #include #include #endif
yang berarti file modem.h akan meng-include ecos_linux.h jika program akan di-build untuk Linux dan akan meng-include header file dari eCos jika program akan di-build untuk eCos. Pendefinisian macro LINUX dilakukan dengan menggunakan option -D dari gcc (bisa juga menggunakan define directive pada source code). Selanjutnya adalah membuat program untuk Linux yang pada dasarnya sangat mirip dengan program utama secure fax, yaitu melakukan inisialisasi serial port (tetapi menggunakan POSIX termios), inisialisasi modem, dan akhirnya menerima data fax dengan mode data dan mengirimkannya kembali dengan mode data juga. Program ini dibuat pada file linuxtest.c.
60
4.3.7. Pembuatan Makefile Untuk mengotomatisasi proses build file image dan instalasi ke floppy disk dan CompactFlash, dibuat Makefile sehingga proses build dapat dilakukan dengan cepat menggunakan program make. Tabel 4.1 menunjukkan beberapa build target yang penting yang dapat dibuat dengan menggunakan make. Beberapa file lain yang dapat dibuat adalah object file-object file hasil compile source code-source code yang dibuat. Tabel 4.1: Beberapa build target yang penting pada Makefile Build target
Yang dilakukan
all
Membuat securefax.bin dan linuxtest
install
Melakukan instalasi ke floppy / ke CompactFlash
securefax.bin
Mengubah format executable (securefax.elf) dari elf ke binary yang siap ditulis ke floppy
securefax.elf
Linking object file-object file menjadi executable
linuxtest
Membuat program untuk pengujian di Linux
clean
Menghapus semua executable dan object code yang dibuat Makefile yang digunakan untuk SBC-456/E dan PCM-5335 sedikit berbeda,
yaitu pada bagian install. Pada Makefile untuk SBC-456/E, make install akan mendownload securefax.bin ke floppy, sedangkan pada Makefile untuk PCM-5335, make install
akan mengcopy securefax.elf ke CompactFlash.
4.4. Pengujian 4.4.1. Pengujian sebagian Program Aplikasi di Host PC Sebelum diujikan pada embedded target, beberapa bagian program yang tidak bergantung pada eCos diujikan dulu pada PC. Hal ini dilakukan karena melakukan debugging di PC lebih mudah daripada di embedded target. Yang dapat diuji di PC adalah circular buffer, struktur data fax, dan fungsi-fungsi kriptografi. Pengujian buffer dilakukan dengan membuat sebuah buffer dan melakukan operasi-operasi seperti menulis data ke buffer, membaca data yang ada, serta membaca berapa data yang sedang ada di buffer. Dicoba juga kondisi-kondisi 61
seperti penulisan pada saat buffer penuh dan membaca data lebih banyak dari yang tersedia. Pengujian struktur data fax dan fungsi kriptografi digabungkan, yaitu setelah fungsi kriptografi dicobakan pada data biasa, dicoba dilakukan enkripsi dan dekripsi data yang tersimpan pada struktur data fax yang dibuat. Karena struktur data fax menyimpan data dalam file, pemeriksaan apakah data sebelum dienkripsi dengan setelah didekripsi identik dapat dilakukan dengan membandingkan file yang dihasilkan. Cara yang digunakan adalah dengan melakukan hash terhadap file yang dihasilkan menggunakan MD5. Pada Linux file dapat di-hash dengan MD5 menggunakan perintah : md5sum
4.4.2. Pengujian Rangkaian Line Telepon Untuk menguji rangkaian line telepon yang dibuat, dicoba komunikasi antara dua buah modem dengan menggunakan mode data melalui rangkaian tersebut. Modem yang pertama terhubung dengan host PC, dan modem kedua terpasang pada SBC. Pada host PC digunakan aplikasi GtkTerm, yang merupakan serial port terminal untuk GNOME. Untuk SBC dibuat program serial port terminal sederhana berbasis eCos yang ditulis dengan bahasa pemrograman C. Untuk membuka koneksi antara dua modem tersebut dalam mode data, pada salah satu modem dikirimkan perintah ATD, yang merupakan AT Command untuk melakukan dial. Setelah itu pada modem yang satu lagi diberikan perintah ATA untuk menjawab panggilan dari modem yang pertama. Karena koneksi terjadi maka disimpulkan bahwa rangkaian bekerja dengan baik. 4.4.3. Pembuatan File Image Pembuatan file image yang nantinya akan dimasukkan ke floppy disk atau CompactFlash terdiri dari beberapa tahap. Pertama, setelah sistem operasi eCos telah disiapkan, setiap source code harus di-compile menjadi object file: Misalnya untuk meng-compile file main.c
62
menjadi main.o : $ i386-elf-gcc -Iwork/install/include -c main.c
Subdirektori work adalah direktori eCos yang dibuat. Yang perlu diperhatikan di sini adalah digunakan cross-compiler untuk i386 yang generik, bukan gcc bawaan Linux agar object code yang dihasilkan tidak mengandung referensi ke system call Linux, melainkan ke fungsi-fungsi dari eCos yang nantinya akan di-link secara statik. Selain itu perlu dibuat agar compiler mencari header file yang diperlukan di work/install/include, yaitu header file dari eCos. Setelah semua source code yang diperlukan di-compile menjadi object file, selanjutnya semua object code di-link, termasuk dengan library eCos yang sudah dibuild sebelumnya. Perintah yang digunakan adalah : $ i386-elf-gcc -o securefax.elf -Lwork/install/lib main.o \ CircularBuffer.o cryptofax.o crypto.o FaxData.o aescrypt.o \ aeskey.o aestab.o -Ttarget.ld -nostdlib
Hasil dari linking ini, securefax.elf, merupakan executable dengan format Executable and Linkable File (ELF). Untuk dapat dimasukkan ke floppy dan dapat di-boot oleh target hardware melalui floppy, file ini perlu diubah menjadi binary biasa dengan perintah : $ i386-elf-objcopy -O binary securefax.elf securefax.bin
Hasilnya adalah securefax.bin, file image yang siap dimasukkan ke floppy. Dengan adanya Makefile yang dibuat, semua proses di atas dapat dilakukan dengan mudah dengan perintah : $ make securefax.bin
4.4.4. Instalasi File Image ke Floppy Disk Untuk instalasi file image ke floppy disk yang akan di-boot oleh SBC456/E, digunakan file securefax.bin. File ini dimasukkan ke floppy dengan 63
menggunakan utility dd yang disediakan Linux : $ dd conv=sync if=securefax.bin of=/dev/fd0
Perintah di atas akan memasukkan file image ke floppy dan floppy siap untuk di-boot oleh target hardware. Dengan Makefile yang dibuat, proses instalasi ke floppy dapat dilakukan dengan perintah : $ make install
yang juga akan secara otomatis membuat file image jika sebelumnya tidak ada atau tidak up-to-date. 4.4.5. Instalasi File Image ke CompactFlash Untuk instalasi ke CompactFlash yang akan di-boot oleh PCM-5335, pertama-tama diperlukan boot loader. Boot loader yang digunakan adalah GRand Unified Boot loader (GRUB). Begitu CompactFlash dipasang di host PC, Ubuntu langsung mengenali device tersebut dan otomatis melakukan mount pada direktori /media/usbdisk. Kebetulan filesystem yang digunakan adalah FAT dan filesystem tersebut telah didukung oleh GRUB sehingga tidak perlu diubah lagi. Selanjutnya dibuat direktori /boot pada CompactFlash dan di dalam direktori tersebut dibuat lagi subdirektori grub (sehingga path absolut menjadi /boot/grub). Di situlah file-file yang diperlukan GRUB akan diletakkan. File-file tersebut kemudian didownload dari ftp://alpha.gnu.org/gnu/grub/ dalam bentuk satu buah file tar.gz, yaitu grub-0.97i386-pc.tar.gz. Setelah di-extract, file-file di dalamnya dimasukkan pada direktori /boot/grub di CompactFlash yang sebelumnya telah disiapkan. File image yang digunakan untuk booting dengan GRUB adalah file yang dalam format ELF, yaitu securefax.elf. File ini diletakkan pada direktori /boot di CompactFlash. Dengan Makefile yang dibuat, proses ini dapat dilakukan dengan mengetikkan : $ make install
64
Untuk memudahkan proses booting, dibuat file /boot/grub/menu.lst pada CompactFlash yang berguna untuk membuat GRUB menampilkan menu, sehingga booting tidak perlu dilakukan dengan mengetikkan perintah-perintah pada shell GRUB. Isi dari file tersebut adalah : default 0 timeout 10
title eCos - Secure Fax root (hd0,0) kernel /boot/securefax.elf boot
Baris default 0 berarti pilihan yang secara default dipilih adalah pilihan pertama. Baris timeout 10 berarti jika dalam 10 detik tidak ada input dari user, pilihan default otomatis dipilih. Baris title merupakan awal dari suatu pilihan menu, dan diikuti oleh nama pilihan. Baris di bawah title sampai ditemukan title
berikutnya merupakan perintah yang akan dijalankan (pada file ini hanya
dibuat satu buah pilihan) GRUB jika pilihan tersebut dipilih. Perintah root (hd0,0)
digunakan agar GRUB membaca partisi pertama dari disk pertama, dalam
hal ini adalah CompactFlash (pada GRUB, disk pertama akan diberi nama hd0, disk kedua hd1, dan seterusnya). Perintah kernel /boot/securefax.elf memberitahukan GRUB bahwa kernel file /boot/securefax.elf digunakan sebagai kernel. Terakhir, perintah boot digunakan untuk melakukan booting. Namun semua hal di atas tidak dapat begitu saja membuat CompactFlash menjadi bootable. Agar dapat di-boot, GRUB harus di-install pada Master Boot Record (MBR) dari CompactFlash. Hal ini dilakukan dengan mula-mula masuk ke shell GRUB dari host PC, yaitu dengan membuka shell terminal dan menjalankan perintah : $ grub
Kemudian shell grub akan muncul. Penamaan device di GRUB berbeda dengan di 65
Linux, karena GRUB langsung membaca dari BIOS, sehingga harus diyakinkan terlebih dahulu bahwa instalasi dilakukan ke device yang benar. Karena pada host PC hanya ada satu harddisk dan CompactFlash, maka kemungkinan besar CompactFlash adalah hd1. Perintah : grub> root (hd1,0)
menginstruksikan GRUB untuk membaca partisi pertama dari device hd1 sebagai root directory. Karena GRUB memberitahukan bahwa partisi tersebut memiliki filesystem FAT sedangkan filesystem partisi pertama dari harddisk di PC bukan FAT dan filesystem dari partisi di CompactFlash memang betul adalah FAT, disimpulkan bahwa hd1 adalah CompactFlash. Penulisan ke MBR dari CompactFlash dilakukan dengan perintah : grub> setup (hd1)
Kemudian CompactFlash dipasang pada PCM-5335 dan dicoba booting dari PCM-5335 ke CompactFlash. Menu GRUB akan muncul, dan pilihan eCos Secure Fax dapat dipilih untuk melakukan booting ke aplikasi secure fax. 4.4.6. Instalasi efax di Host PC Untuk pengujian, pengiriman fax akan dilakukan antara host PC dengan embedded target. Untuk itu diperlukan aplikasi pada host PC yang dapat mengirim dan menerima fax. Aplikasi yang dipilih adalah efax, program fax yang sederhana dan mudah digunakan untuk sistem GNU/Linux. Program efax sudah tersedia di online repository Ubuntu, sehingga instalasi efax dapat dilakukan hanya dengan membuka shell terminal dan mengetikkan perintah : $ sudo apt-get install efax
yang secara otomatis akan men-download binary program efax dalam bentuk debian package (file .deb) serta semua dependency yang diperlukan, dan
66
melakukan instalasi. Selanjutnya program efax siap untuk digunakan. Instalasi efax juga dapat dilakukan dengan Synaptic Package Manager, GUI frontend untuk apt, jika diinginkan. 4.4.7. Uji Kerja Secure Fax Untuk menguji kerja secure fax, digunakan empat perangkat, yaitu dua buah mesin fax dan dua buah sistem secure fax. Sepasang mesin fax dan secure fax berfungsi sebagai pengirim, dan sepasang lainnya menjadi penerima. Fax dikirimkan dari mesin fax pengirim ke secure fax pengirim, kemudian fax terenkripsi dikirimkan dari secure fax pengirim ke secure fax penerima, untuk kemudian didekripsi dan dikirimkan ke mesin fax penerima. Namun pada awal pengujian fungsi mesin fax digantikan oleh program efax yang berjalan di host PC, dan komunikasi antar secure fax disimulasikan dengan program yang berjalan di host PC. Hal ini dilakukan karena dengan menggunakan program yang berjalan di host PC debugging dapat lebih mudah dilakukan, terutama karena efax akan memberikan pesan yang detail mengenai setiap operasi yang dilakukan. Gambar 4.7 menunjukkan skema pengujian ini dengan efax.
Gambar 4.7: Skema pengujian sistem secure fax menggunakan efax
67
Sebelum pengujian dilakukan, perlu dibuat file yang akan menjadi dokumen fax yang dapat dikirimkan oleh efax. Program efax dapat membaca beberapa jenis file, seperti TIFF dan PostScript. Pada pengujian ini digunakan PostScript, yang dibuat dengan menggunakan OpenOffice.org Writer. Pertama, fax dikirimkan menggunakan efax di PC ke secure fax. Untuk mengirimkan fax dengan efax, program dijalankan dengan perintah : $ fax DEV=ttyS0 CLASSINIT=”-o2” send -v -m tes.ps
Pada perintah di atas, fax merupakan shell script yang sudah tersedia dari instalasi efax untuk memanggil program efax secara lebih mudah. DEV=ttyS0 berguna untuk menentukan bahwa serial port yang digunakan adalah /dev/ttyS0, sedangkan CLASSINIT=-o2 digunakan untuk menentukan bahwa kelas pengiriman fax yang digunakan adalah kelas 2. Option -v digunakan untuk mengaktifkan verbose message, yaitu agar output dari program efax memberikan status yang lengkap, option -m berguna agar efax mengirim fax tanpa menunggu dialtone, dan terakhir tes.ps adalah nama file postscript yang dibuat. Setelah fax diterima oleh secure fax, fax akan dienkripsi dan dikirimkan kembali ke host PC. Pada host PC program yang berjalan untuk menerima fax terenkripsi adalah program linuxtest yang telah diimplementasikan. Selanjutnya program tersebut akan mengembalikan fax terenkripsi yang sama ke secure fax, kali ini mensimulasikan kerja secure fax sebagai penerima. Fax tersebut didekripsi kembali menjadi fax semula dan dikirimkan kembali ke host PC yang menjalankan program efax. Untuk menerima fax dengan menggunakan efax, program dijalankan dengan perintah : $ fax DEV=ttyS0 CLASSINIT=”-o2” receive -v received-fax
Pada perintah tersebut received-fax akan menjadi bagian dari nama file dari fax yang diterima (nama file lengkap yang disimpan oleh efax adalah receivedfax.001).
68
Hasilnya didapatkan fax yang sangat mirip dengan fax yang semula dibuat, berarti pengujian berhasil dan sistem secure fax berhasil melakukan fungsinya. Selanjutnya baru dilakukan pengujian yang sesungguhnya dengan menggunakan dua mesin fax dan dua buah sistem secure fax. Pengujian ini ditunjukkan pada Gambar 4.8.
Gambar 4.8: Skema pengujian secure fax dengan mesin fax dan PABX
Pengujian
ini
lebih
menggambarkan
penggunaan
alat
ini
yang
sesungguhnya, hanya saja jaringan telepon disimulasikan dengan menggunakan PABX. Sama seperti pengujian dengan efax dan PC, pengujian ini juga berhasil, di mana fax akhir yang diterima mesin fax sama seperti dokumen fax yang pertama dikirimkan.
69