Security


Pada akhir pembahasan bab ini, siswa diharapkan mampu :

o Memahami dasar security dan kriptografi

o Memahami proteksi domains dan permissions

o Bagaimana menambahkan permissions pada MIDlet Suite

o Bagaimana membuat MIDlet Suite menggunakan NetBeans Mobility Pack

o Bagaimana membuat message digest menggunakan SATSA

o Bagaimana melakukan enkripsi menggunakan symmetric keys

7.2 Dasar Security

Kriptografi

Kriptografi adalah cabang dari ilmu matematika yang memiliki banyak fungsi dalam 

pengamanan data. Kriptografi adalah proses mengambil message dan menggunakan 

beberapa  fungsi  untuk  menggenerasi  materi  kriptografis  (sebuah  digest  atau 

message terenkripsi).

Kriptografi adalah salah satu dari teknologi yang digunakan dalam layanan security 

seperti integrity, confidentiality, identity dan non repudiation.

Tipe Security Services

Sebelum  kita  memasuki  bahasan  dasar  fungsi  kriptografi,  kita  pelajari  terlebih 

dahulu beberapa security services penting yang digunakan dalam sebuah aplikasi :

Authentification –  Adalah proses verifikasi  indentitas  dari  pengguna pada akhir 

jalur komunikasi.

Confidentiality – Jika kita mengirimkan data sensitive melalui sebuah jaringan, kita 

ingin memastikan bahwa hanya penerima yang dituju yang dapat membacanya.

Pengembangan Perangkat Mobile 1

Message EncryptedMessageENCODE Message

Secret Key Secret Key

ENCODE


Integrity –  Kita ingin memastikan bahwa data yang kita terima tidak mengalami 

pengubahan, penambahan ataupun pemisahan.

Non-repudiation  – Service  ini  dapat  menunjukkan  bukti  bahwa  pengirim  telah 

mengirimkan message, atau penerima telah menerima message.

Authorization  –  Untuk  memastikan  bahwa  user  memiliki  hak  akses  spesifik 

terhadap data penting maupun sumber data.

Message Digests

Sebuah message digest  juga disebut sebagai digital  fingerprint.  Sebuah message 

digest adalah sebuah kesimpulan matematis dari sebuah message atau file. Hal ini 

untuk memastikan integritas dari message atau file. Sehingga dapat memberikan 

informasi bahwa sebuah message telah mengalami perubahan atau tidak. Mengubah 

satu karakter dari sebuah file atau message dapat menyebabkan perubahan drastis 

dari message digest. Digest terbuat melalui sebuah proses yang sangat menyulitkan 

untuk membuat dua file atau message yang berbeda dengan message digest yang 

sama.

Sebuah message digest berfungsi dalam satu alur fungsi. Sebuah message digest 

relatif  mudah  untuk  diproses,  namun  sangat  sulit  jika  dilakukan  dengan  cara 

sebaliknya. Dari sebuah message digest, sangat sulit untuk mengolah dan membuat 

sebuah message yang dapat menghasilkan message digest yang sama.

Kriptografi Symmetric Key

Dengan kriptografi symmetric key, sebuah message dapat terenkripsi dan terdekripsi 

menggunakan  key  yang  sama.  Baik  pengirim  maupun  penerima  message  harus 

memiliki key yang sama supaya proses tersebut berjalan dengan sukses. Pengirim 

menggunakan  key  rahasia  untuk  mengenkripsi  message,  sedangkan  penerima 

menggunakan kunci yang sama untuk mendekripsi message. Sekali message telah 

terenkripsi, message tersebut dapat dikirimkan melalui jaringan tanpa dipahami oleh 

penyadap.

 

Pengembangan Perangkat Mobile 2

Message EncryptedMessageENCODE Message

Public Key Private Key

ENCODE


Kriptografi Asymmetric Key

Permasalahan  dari  symmetric  key  adalah  kedua  pihak  harus  memiliki  key  yang 

sama. Key tersebut harus dikirimkan secara aman menuju penerima dari beberapa 

sebab sehingga key dapat dicuri dan digunakan untuk mendekripsi sebuah message.

Dengan menggunakan asymmetric  keys,  pengirim mengenkripsi  message dengan 

menggunakan  public  key  penerima.  Kemudian  penerima  mendekripsi  message 

tersebut menggunakan private key. Private key hanya dimiliki oleh penerima. Antara 

private dan public key merupakan komplemen matematis sehingga message yang 

terenkripsi menggunakan public key dapat terdekripsi menggunakan private key. Hal 

tersebut  secara  komputasi  juga  sulit  untuk  membuat  private  key  ulang 

menggunakan public key.

Kriptografi Public Key

Algoritma  public  key  menuntut  penggunaan  complementary  key  secara  terpisah 

dalam proses  enkripsi  dan  dekripsi.  Hal  ini  menunjukkan  kepastian  bahwa akan 

memakan  waktu  yang  sangat  lama  untuk  mengetahui  private  key  melalui 

pengolahan public key. Tuntutan ini membuat distribusi public key menjadi mudah 

tanpa mengkhawatirkan kerahasiaan dari private key.

Algoritma public key yang amat popular adalah algortima RSA. Keamanan dari RSA 

telihat dari tingkat kesulitan faktorial numerik dalam cakupan yang besar.

Digital Signature

Sebuah  digital  signature  mirip  dengan  message  digest  kecuali  bahwa  digest 

dihasilkan oleh private key dari sebagian personal atau entitas. Public key digunakan 

dalam verifikasi bahwa message yang ditandai berasal dari penanda.

Key Management

Salah  satu  permasalahan  dari  kriptografi  public  key  adalah  key  management. 

Bagaimana anda mengetahui bahwa public key yang anda gunakan dalam verifikasi 

otentifikasi  dari  digital  signature  adalah  public  key  asli  yang  dikirimkan  oleh 

pengirim?

Pengembangan Perangkat Mobile 3

Message

Create Digest

Sender's

Private

Key

Encrypt

Encrypted 

Message Digest

Encrypted Digest

Message

Create Digest

Signature Generation Signature Verification

Sender's

Public

Key

Decrypt

Decrypted

Message Digest

Compare

Message Digest

Message Digest


Digital  Certificates adalah messages yang dibuat oleh Certification Authority (CA) 

yang  menyertakan  keabsahan  entitas  dari  public  key.  Pada  dasarnya,  Digital 

Certificates adalah container dari Public Keys.

Untuk  mendapatkan  sertifikat  dari  CA,  sebuah  entitas  menyertakan  dokumentasi 

yang  membuktikan  eksistensi  dari  identitas.  Setelah  melalui  proses  verifikasi 

identifikasi,  CA kemudian menandai  public  key  dari  identitas  yang menggunakan 

private key dari CA.

Namun kita  telah  menciptakan problem yang lain.  Bagaimana kita  memverifikasi 

bahwa public  key dari  CA adalah asli?  Anda akan mengetahui  bahwa kita  hanya 

membuat rangkaian dari keabsahan.

Solusinya  adalah  penandaan  certificate  secara  pribadi.  CA  menandai  public  key 

menggunakan private key yang sesuai. Kemudian certificate yang telah ditandai dan 

mengandung public key dari CA akan didistribusikan secara bebas. Hal ini dikenal 

sebagai root certificate. Certificate yang ditandai secara pribadi dapat dibuat dengan 

mudah oleh siapapun. Aplikasi  seperti  web browser dan email  umumnya disertai 

dengan root certificates dari Certificate Authorities yang diterima secara luas.

Pengembangan Perangkat Mobile 4


7.3 J2ME Security

Protection  Domains  –  Sebuah  protection  domains  mendefinisikan  rangkaian 

permissions yang disertakan pada MIDlet Suite. MIDP 2.0 menjelaskan bahwa paling 

tidak  terdapat  dua  buah  protection  domains  :  untrusted  dan  trusted  domains. 

Untrusted domains adalah pembatasan dimana akses terhadap protected API pada 

kondisi  default  tidak diijinkan. Seorang user secara eksplisit  harus mengatur tipe 

akses MIDlet Suite terhadap API. Untrusted MIDlets (berjalan di untrusted domains) 

tidak memerlukan user permission dalam mengakses protected API.

Untrusted dan trusted domain menyediakan akses yang tak terbatas pada Record 

Management, MIDlet life cycle, LDCUI, Game dan Multimedia API. Bagaimanapun, 

API untuk koneksi HTTP dan HTTPS menuntut kejelasan permissions dari user jika 

MIDlet Suite berjalan pada untrusted domain.

Sebuah protection domain adalah rangkaian dari ”Allowed” dan ”User” permissions 

yang diberikan kepada MIDlet Suite.

Permissions

Terdapat dua tipe mode interaksi permissions, mode Allowed dan User. Pada mode 

Allowed,  user  tidak  diminta  melakukan  pengaturan  permission  saat  MIDlet 

mengakses  sebuah  API  yang  terproteksi.  Sebuah  aplikasi  secara  otomatis 

memberikan hak akses terhadap resource dan interaksi dari user tidak diperlukan.

Dalam mode User, device menanyakan apakah user menginginkan untuk mencabut 

atau memberikan hak akses MIDlet terhadap resource.  Frekuensi dari pertanyaan 

bergantung pada mode interaksi yang dipilih oleh user.

Mode Interaksi User

Sebuah user permission memiliki salah satu dari 3 mode interaksi berikut :

Blanket  –  User  memberikan  permission  pada  MIDlet  Suite  untuk  mengakses 

resource  atau  API  secara  permanen.  User  tidak  akan  lagi  diminta  melakukan 

pengaturan  setiap  MIDlet  Suite  berjalan.  Permission  yang  ada  akan  tetap  eksis 

hingga MIDlet Suite dihapus dari device atau user merubah permission tersebut.

Membuat  sebuah  permission  adalah  salah  satu  dari  cara  pengamanan  akses 

terhadap restricted APIs.  Dalam MIDP, nama dari permission menggunakan nama 

dari  package  dari  API  tersebut  sebagai  prefix  dan  bersifat  case  sensitive.  Jika 

permission  tersebut  ditujukan  kepada  sebuah  class,  maka  penamaan  permission 

harus mengandung nama class dan package.

Sebuah MIDlet dapat menuntut adanya permission dengan mendeklarasikan MIDlet-

Permissions ataupun atribut MIDlet-Permissions-Opt pada application descriptor. Jika 

MIDlet  Suite menyertakan atribut  MIDlet-Permissions,  atribut  permission tersebut 

Pengembangan Perangkat Mobile 5


harus diberi hak akses terhadap protection domain. Jika hak akses tidak diberikan, 

maka proses instalasi akan dibatalkan.

Multiple permissions dituliskan menggunakan tanda koma (,) sebagai pemisah.

MIDlet-Permissions: javax.microedition.io.Connector.http

MIDlet-Permissions-Opt: javax.wireless.messaging.sms.receive,

 javax.wireless.messaging.sms.send

Membuat permissions pada MIDlet Suite menggunakan NetBeans Mobility Pack :

Pengembangan Perangkat Mobile 6


Trusted MIDlets – Sebuah MIDlet dapat diputuskan sebagai trusted application jika 

authentifikasi dan integritas dari file JAR dapat terverifikasi oleh device dan terbatas 

pada  sebuah  protection  domain.  Proses  verifikasi  dilakukan  oleh  device 

menggunakan certificates.

Menandai MIDlet pada NetBeans Mobility Pack :

Untuk memberi tanda pada MIDlet Suite menggunakan NetBeans Mobility Pack, buka 

project properties (klik kanan project name pada projects tab dan pilih Properties). 

Periksa bagian ”Sign Distribution” :

Pengembangan Perangkat Mobile 7


7.4 Menggunakan Security dan Trust Services 

API (SATSA)

Security and Trust Services API (SATSA) terdefinisi dalam Java Spesification Request 

(JSR) 177.  SATSA adalah sebuah pilihan package yang menyediakan APIs  untuk 

fungsi – fungsi security seperti manajemen digital signatures, pembuatan message 

digest  dan  digital  signatures,  berhubungan  dengan  Java  Cards  dan  operasi 

kriptografi lainnya.

Contoh  berikut  ini  menunjukkan  cara  pembuatan  message  digest  dan  enkripsi 

sebuah message menggunakan symmetric keys :

Membuat Message Digest :

/*

* DigestMidlet.java

*

*/

import javax.microedition.midlet.*;

import javax.microedition.lcdui.*;

import java.security.*;

public class DigestMidlet extends MIDlet {

public void startApp() {

String message = "I LOVE JENI!";

System.out.println("Generating digest for message: " + 

message);

byte[] digest = generateDigest(message.getBytes());

System.out.println("SHA-1 Digest:");

for (int i=0; i<digest.length; i++) {

System.out.print(digest[i] + " ");

}

System.out.println();

}

public void pauseApp() {

}

public void destroyApp(boolean unconditional) {

}

public byte[] generateDigest(byte[] message) {

String algorithm = "SHA-1";

int digestLength = 20; 

byte[] digest = new byte[digestLength];

try {

MessageDigest md;

md = MessageDigest.getInstance(algorithm);

md.update(message, 0, message.length);

md.digest(digest, 0, digestLength);

} catch (Exception e) {

System.out.println("Exception: " + e.getMessage());

}

return digest;

}

}

Pengembangan Perangkat Mobile 8


Sun Java Wireless Toolkit 2.3 menyediakan dukungan JSR 177 (atau SATSA) :

Proses Build dan Run file DigestMidlet :

1. Buka aplikasi Ktoolbar dari Wireless Toolkit :

2. Pilih “New Project” kemudian tentukan nama project dan class MIDlet :

Pengembangan Perangkat Mobile 9


3. Pilih “JWTI” sebagai Target Platform. Tandai pilihan “Security and Trust Services 

APIs (JSR 177) dan kilik “OK”.

4.  Buat file dengan nama DigestMidlet.java pada direktori : WTK/apps/SATSA/src

Pengembangan Perangkat Mobile 10


(WTK adalah direktori instalasi dari Sun Java Wireless Toolkit, secara default

adalah C:\WTK23, dan SATSA adalah nama project).

5. Klik ”Build” 

6. Klik  ”Run”  untuk  menjalankan  MIDlet  pada  emulator.  Jika  anda  menjalankan 

MIDlet pada emulator, anda tidak akan mendapatkan output grafis apapun. Output 

yang akan dihasilkan adalah berupa console pada WTK Tollbar.

Enkripsi dan Dekripsi Messages menggunakan symmetric keys :

/*

* SymmetricCipherMidlet.java

*

*/

import javax.microedition.midlet.*;

import javax.microedition.lcdui.*;

import java.security.*;

import java.security.spec.*;

import javax.crypto.*;

import javax.crypto.spec.*;

import javax.microedition.securityservice.*;

public class SymmetricCipherMidlet extends MIDlet {

private static final byte[] key = {

(byte) 0xab, (byte) 0xcd, (byte) 0xef, (byte) 0x88,

(byte) 0x12, (byte) 0x34, (byte) 0x56, (byte) 0x78

Pengembangan Perangkat Mobile 11


};

String message = "I LOVE JEDI!";

public SymmetricCipherMidlet() {

try {

System.out.println("Original Message: " + message);

printBytes(message.getBytes());

byte[] encryptedMessage =

encrypt("DES/ECB/PKCS5Padding", 

message.getBytes(), key, "DES");

System.out.println("Encrypted Message:");

printBytes(encryptedMessage);

byte[] decryptedMessage =

decrypt("DES/ECB/PKCS5Padding", 

encryptedMessage, key, "DES");

System.out.println("Decrypted Message:");

printBytes(decryptedMessage);

} catch (Exception e) {

System.out.println("Exception: " + e.getMessage());

e.printStackTrace();

}

}

private void printBytes(byte[] bytes) {

for (int i = 0; i<bytes.length; i++){

System.out.print(toHex(bytes[i]) + " ");

}

System.out.println();

}

private String toHex(byte b) {

char d1 = toHexDigit((byte) ((b>>4) & 0x0F));

char d2 = toHexDigit((byte) (b & 0x0F));

return ("0x"+d1+d2);

}

private char toHexDigit(byte x) {

if (x > 9) {

return ((char) ('A' + (x-10)));

} else {

return ((char) ('0' + x));

}

}

private byte[] encrypt(String algorithm,

byte[] message, byte[] keybytes, String keyAlgo)

throws NoSuchAlgorithmException, NoSuchPaddingException,

InvalidKeyException, ShortBufferException,

IllegalBlockSizeException, BadPaddingException {

Cipher cipher = Cipher.getInstance(algorithm);

Key key = new SecretKeySpec(keybytes, 0, keybytes.length, 

keyAlgo);

int blockSize = 16;

int cipherLength = 

((message.length / blockSize) 

+ ((message.length % blockSize) > 0 ? 1 : 0))

* blockSize;

cipher.init(Cipher.ENCRYPT_MODE, key);

byte[] cipherText = new byte[cipherLength];

cipher.doFinal(message, 0, message.length, cipherText, 0);

return(cipherText);

}

public byte[] decrypt(String algorithm,

byte[] cipherText, byte[] keybytes, String keyAlgo)

throws NoSuchAlgorithmException, NoSuchPaddingException,

InvalidKeyException, ShortBufferException,

IllegalBlockSizeException, BadPaddingException {

Pengembangan Perangkat Mobile 12


Cipher cipher = Cipher.getInstance(algorithm);

Key key = new SecretKeySpec(keybytes, 0, keybytes.length, 

keyAlgo);

cipher.init(Cipher.DECRYPT_MODE, key);

byte[] decrypted = new byte[message.length()];

cipher.doFinal(cipherText, 0, cipherText.length, decrypted, 

0);

return(decrypted);

}

public void startApp() {

}

public void pauseApp() {

}

public void destroyApp(boolean unconditional) {

}

}


Jaringan
Pada  bagian  ini,  kita  akan  belajar  bagaimana  menerapkan  sebuah  MIDlet  yang 
mempunyai kemampuan untuk koneksi kedalam jaringan. 
Pada bagian akhir dari sesi ini, siswa diharapkan dapat: 
• Mendeskripsikan  Generic  Connection  Framework,  dan  bagaimana  ia  dapat 
digunakan untuk mendukung method koneksi yang berbeda-beda. 
• Menspesifikasikan  parameter-parameter  koneksi  dengan  menggunakan  format 
pengalamatan GCF URL 
• Membuat koneksi HTTP/HTTPS 
• Menciptakan MIDlet dengan menggunakan TCP sockets dan UDP datagram 
6.1 Generic Connection Framework
Generic  Connection  Framework  mendukung  koneksi  packet  (socket)  dan  stream 
(datagram).  Sesuai  dengan  namanya,  framework  ini  menyediakan  API  dasar  bagi 
koneksi  di  CLDC.  Framework  ini  menyediakan  pondasi  umum dari  berbagai  koneksi 
seperti  HTTP,  socket,  dan  datagram.  Walaupun  Bluetooth  dan  serial  I/O  termasuk 
kedalam API ini, GCF menyediakan satu set API yang lebih generic dan mendasar yang 
menjadi abstraksi  dari  berbagai tipe koneksi.  Harus dicatat, bahwa tidak semua tipe 
koneksi dibutuhkan bagi implementasi sebuah MIDP device. 
6.1.1 Hirarki dari GCF Interface
Perluasan dari hirarki  GCF interface memungkinkan terjadinya generalization. Sebuah 
tipe koneksi yang baru mungkin dapat ditambahkan kepada framework ini dengan cara 
memperluas hirarki. 
Pengembangan Perangkat Mobile 1

Gambar 8.1: Hirarki dari GCF Interface 
Pengembangan Perangkat Mobile 2

6.1.2 GCF Connection URL
Parameter-parameter  koneksi  telah  dispesifikasikan  dengan  menggunakan  sebuah 
format pengalamatan: 
scheme://username:password@host:port/path;parameters
1. Scheme adalah sebuah protokol atau method koneksi. Misalnya: http,ftp, https. 
2. Username  bersifat  optional,  akan  tetapi  bila  kita  ingin  mendefinisikannya,  harus 
didahului dengan tanda @
3. Password juga bersifat optional dan hanya dapat dispesifikasikan jika username telah 
didefinisikan sebelumnya. Jika password didefinisikan, maka ia harus dipisahkan dari 
username dengan menggunakan tanda titik dua (:) 
4. Host – parameter ini wajib dicantumkan. Bisa berupa nama host atau fully qualified 
domain name (FQDN) atau alamat IP dari host yang dituju. 
5. Port – parameter ini juga bersifat optional. Jika tidak dispesifikasikan, maka default 
port akan digunakan 
6. Path
7. parameters – bersifat optional, tetapi harus didahuli dengan titik koma (;) apabila ia 
dicantumkan 
Jika kita menggunakan kurung siku untuk memberi tanda pada parameter-parameter 
yang bersifat optional pada format pengalamatan diatas, kita dapat mengubah format 
diatas menjadi seperti berikut: 
scheme://[username[:password]@]host[:port]/path[;parameters]
Format pengalamatan tersebut haruslah sesuai dengan Uniform Resource Indicator (URI) 
seperti yang didefinisikan pada RFC 2396.
Pada MIDP 2.0, hanya skema “http” dan “https” dibutuhkan untuk diimplementasikan 
pada device. 
Pengembangan Perangkat Mobile 3

6.2 Koneksi HTTP
6.2.1 Protokol HTTP 
HTTP merupakan kepanjangan dari HyperText Transfer Protocol. Ia merupakan protocol 
yang digunakan untuk memindahkan web pages dari web server (misal: www.sun.com) 
kepada web browser. Client(web browser) akan me-request sebuah web page dengan 
cara mespesifikasikan path dengan command Get atau POST.
Pada method GET, parameter telah dispesifikasikan dan dilekatkan pada URL. Sebagai 
contoh, untuk memberikan sebuah variable dengan nama “id” dan memiliki nilai 100 
kepada  index.jsp,  url  tersebut  akan  dispesifikasikan  sebagai  : 
“http://hostname/index.jsp?id=100”.  Parameter  tambahan dipisahkan  dengan  dengan 
tanda &, "http://hostname/index.jsp?id=100&page=2.
Jika method “POST” digunakan,  parameter  bukanlah menjadi  bagian dari  URL tetapi 
dikirim dengan pada baris terpisah pada command POST. 
Pengembangan Perangkat Mobile 4

Client / Web Browser HTTP Server
GET /index.jsp?id=100 HTTP/1.1
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Content-Type: text/html;charset=ISO-8859-1
Date: Wed, 18 Jun 2005 14:09:31 GMT
Connection: close
<html>
  <head>
    <title>Test Page</title>
  </head>
  <body>
  <h1 align="center">Test Page</h1>
  </body>
</html>
Gambar 8.2: Contoh dari transaksi HTTP GET 
Pengembangan Perangkat Mobile 5

Client / Web Browser HTTP Server
GET /non-existent.html HTTP/1.0
HTTP/1.1 404 /non-existent.html
Server: Apache-Coyote/1.1
Content-Type: text/html;charset=utf-8
Content-Length: 983
Date: Mon, 11 Jul 2005 13:21:01 GMT
Connection: close
<html><head><title>Apache  Tomcat/5.5.7  - 
Error report</title><style>...
<body><h1>HTTP Status 404</h1>
...
The requested resource (non-existent.html) 
is not available.
...
</body></html>
Gambar 8.3: Contoh dari transaksi HTTP GET dengan response error 
6.2.2 Menciptakan sebuah koneksi HTTP  
Anda dapat membuka sebuah koneksi HTTP dengan menggunakan Connector.open() dan 
meng-casting nya dengan salah satu dari ketiga interface berikut ini: StreamConnection, 
ContentConnection, dah HTTPConnection. Bagaimanapun, dengan StreamConnection dan 
ContentConnection,  Anda tidak dapat menspesifikasikan dan menurunkan parameter-
parameter spesifik dari HTTP dan juga result-nya. 
Bila  Anda  menggunakan  StreamConnection,  panjang  dari  sebuah  reply,  tidak  dapat 
ditentukan  sebelumnya.  Sedangkan  pada  ContentConnection  atau  HTTPConnection, 
selalu ada cara untuk menentukan panjang dari sebuah reply. Akan tetapi penentuan 
panjang  ini,  tidak  selalu  tersedia.  Oleh  karena  itu,  program  Anda  harus  bisa 
mendapatkan reply tersebut tanpa harus mengetahui panjang content terlebih dahulu. 
Pengembangan Perangkat Mobile 6

import javax.microedition.io.*;
HttpConnection connection = null;
InputStream iStream = null;
byte[] data = null;
        
try {
    connection = (HttpConnection) Connector.open("http://www.sun.com/"); 
    int code = connection.getResponseCode();
            
    switch (code){
        case HttpConnection.HTTP_OK:
            iStream = connection.openInputStream();
            int length = (int) connection.getLength();
            if (length > 0){
                data = new byte[length];
                int totalBytes = 0;
                int bytesRead = 0;
                while ((totalBytes < length) && (bytesRead > 0)) {
                    bytesRead = iStream.read(
                        data, totalBytes, length - totalBytes);
                    if (bytesRead > 0){
                        totalBytes += bytesRead;
                    }
                }
            } else {
//panjang tidak diketahui, baca tiap karakter
                ...
            }
            break;
        default:
            break;
    }
...
Pengembangan Perangkat Mobile 7

6.2.3 Handling HTTP Redirects
Terkadang server akan melakukan redirect dari sebuah browser/client ke web page yang 
lain  dengan  cara  me-reply  HTTP_MOVED_PERM  (301),  HTTP_MOVED_TEMP  (302), 
HTTP_SEE_OTHER  (303)  atau  HTTP_TEMP_REDIRECT  (307)  daripada  menggunakan 
reply HTTP_OK yang biasa dilakukan. Program Anda harus dapat mengidentifikasi-nya 
dengan  menggunakan  getResponseCose(),  mendapatkan  URI  yang  baru  dari  header 
dengan menggunakan getHeaderField(“Location”), dan mendapatkan kembali dokumen 
dari lokasi yang baru. 
int code = connection.getResponseCode();
   
switch(code){
    case HttpConnection.HTTP_MOVED_PERM:
    case HttpConnection.HTTP_MOVED_TEMP:
    case HttpConnection.HTTP_SEE_OTHER:
    case HttpConnection.HTTP_TEMP_REDIRECT:
        String newUrl = conn.getHeaderField("Location");
...
Pengembangan Perangkat Mobile 8

6.3 Koneksi HTTPS 
HTTPS adalah sebuah HTTP diatas sebuah koneksi secure transport. Membuka sebuah 
koneksi  HTTPS,  hampir  sama  untuk  membuka  koneksi  HTTP.  Perbedaan  utamanya 
adalah  URL  akan  memberikan  kepada  Connector.open()  dan  meng-casting  hasilnya 
kepada HttpsConnection class variable. 
Sebuah  tipe  exception  tambahan  juga  harus  dijalankan  melalui  Connector.open() 
misalnya  IllegalArgumentException,  ConnectionNotFoundException, 
java.io.IOException dan  SecurityException.  Sebuah CertificateException 
juga dapat dijalankan untuk melaporkan kesalahan pada certificate. 
import javax.microedition.io.*;
HttpsConnection connection = null;
InputStream iStream = null;
byte[] data = null;
        
try {
    connection = (HttpsConnection) Connector.open("https://www.sun.com/"); 
    int code = connection.getResponseCode();
    ...
} catch (CertificateException ce){
    switch (ce.getReason()){
        case CertificateException.EXPIRED:
        ...
    }
}
            
Pengembangan Perangkat Mobile 9

static byte BAD_EXTENSIONS 
          Mengindikasikan bahwa sertifikat  memiliki  extenstion yang tidak 
teridentifikasi. 
static byte BROKEN_CHAIN 
          Mengindikasikan bahwa sertifikat  terletak didalam sebuah rantai 
yang tidak terautentikasi pada mata rantai berikutnya. 
static byte CERTIFICATE_CHAIN_TOO_LONG 
          Mengindikasikan  bahwa  sertifikat  server  dari  rantai  tersebut 
melebihi panjang yang disepakati pada policy dari pembuat sertifikat. 
static byte EXPIRED 
          Mengindikasikan bahwa sertifikat  tersebut  telah  berakhir  jangka 
waktunya.
static byte INAPPROPRIATE_KEY_USAGE 
          Mengindikasikan  bahwa  public  key  dari  sertifikat  tersebut  telah 
digunakan  tidak  sesuai  dengan  ketetapan  yang  dibuat  oleh  pembuat 
sertifikat. 
static byte MISSING_SIGNATURE 
          Mengindikasikan bahwa object dari sertifikat tidak memiliki sebuah 
tanda tangan digital. 
static byte NOT_YET_VALID 
          Mengindikasikan bahwa sertifikat tersebut tidak berlaku. 
static byte ROOT_CA_EXPIRED 
          Mengindikasikan bahwa root dari public key CA telah habis jangka 
waktunya. 
static byte SITENAME_MISMATCH 
          Indicates a certificate does not contain the correct site name.
static byte UNAUTHORIZED_INTERMEDIATE_CA 
         Mengindikasikan  bahwa  ada  sebuah  sertifikat  intermediate 
certificate didalam rantai yang tidak punya otoritas sebagai intermediate 
CA.  
static byte UNRECOGNIZED_ISSUER 
        Mengindikasikan  bahwa  sertifikat  tersebut  telah  dikeluarkan  oleh 
entity yang tidak teridentifikasi.   
static byte UNSUPPORTED_PUBLIC_KEY_TYPE 
          Mengindikasikan  bahwa  tipe  public  key  didalam  sertifikat  tidak 
didukung oleh device. 
static byte UNSUPPORTED_SIGALG 
          Mengindikasikan  bahwa  sertifikat  telah  ditandatangani  dengan 
menggunakan algorithma yang tidak disupport. 
static byte VERIFICATION_FAILED 
          Mengindikasikan bahwa sertifikat tersebut gagal di-verifikasi. 
Gambar 8.4: Berbagai alasan pada CertificateException
(kutipan dari spesifikasi MIDP 2.0 – JSR 118)
Pengembangan Perangkat Mobile 10

6.4 TCP Sockets
Banyak implementasi dari HTTP dijalankan diatas layer TCP. Jika Anda mengirim data 
menggunakan layer TCP, data tersebut akan dipotong menjadi bagian yang lebih kecil 
yang disebut dengan packet. Layer TCK akan memastikan bahwa semua packet akan 
dikirim oleh sender dan diterima oleh recipient, dengan susunan yang sama seperti pada 
saat  ia  dikirimkan.  Jika  sebuah  packet  tidak  diterima  oleh  recipient,  ia  akan 
mengirimkannya kembali.  Hal  ini  berarti,  sekali  Anda mengirim sebuah pesan,  Anda 
dapat memastikan bahwa pesan tersebut akan berhasil dikirim kepada recipient dengan 
format yang sama seperti pada saat Anda mengirimkannya, tanpa ada data yang hilang 
atau  disisipi  (dihalangi  oleh  sebuah  siklus  tertentu  seperti  recipient  disconnect dari 
jaringan) . 
Layer TCP menangani reassembly dan retransmission pada packet secara transparan. 
Sebagai  contoh,  pada  protokol  HTTP  kita  tidak  perlu  khawatir  terhadir  prosess 
disassembly dan assembly packet karena hal ini akan dihandle pada layer TCP.
Kadang-kadang,  ukuran dari  pesan tersebut terkadang terlalu kecil  dan sangat tidak 
efisien untuk dikirimkan sebagai packet tunggal (overhead dari packet sangat tinggi jika 
dibandingkan dengan payload). Bayangkan banyak packet dikirimkan melalui jaringan 
dengan  satu  byte  payload  dan  multi  byte  overhead(misal  16  bytes).  Hal  ini  akan 
menyebabkan  jaringan  sangat  tidak  effisien,  banyak  packets  membanjiri  jaringan 
dengan hanya satu byte payload. 
Pada kasus ini,  implementasi  dari  TCP dimungkinkan untuk menunggu sebuah pesan 
dikirim dengan sukses. Pesan tersebut kemudian akan dipaket sebagai banyak pesan 
didalam  sebuah  packet  sebelum  dikirimkan.  Jika  hal  ini  terjadi,  maka  akan  terjadi 
keterlambatan pada koneksi. Jika aplikasi Anda menginginkan sesedikit mungkin terjadi 
keterlambatan, anda harus mengeset DELAY socket option ke nol (0). Atau jika aplikasi 
Anda  dapat  tetap  berjalan  dengan  beberapa  paket  yang  hilang  atau  tidak  tersusun 
secara benar, Anda mungkin harus mencoba menggunakan UDP atau koneksi datagram. 
Koneksi UDP juga menggunakan sesedikit mungkin overhead packet. 
SocketConnection conn =
    (SocketConnection) Connector.open("socket://www.sun.com:80");
client.setSocketOption(DELAY, 0);
InputStream iStream = conn.openInputStream();
OutputStream oStream = conn.openOutputStream();
os.write("GET / HTTP/1.0\n\n".getBytes());
int c = 0;
while((c = is.read()) != -1) {
    // memproses data yang diterima 
    ...
}
Pengembangan Perangkat Mobile 11

iStream.close();
oStream.close();
conn.close();
6.5 Server Sockets
Didalam  model  client-server,  server  akan  secara  terus  menerus  menunggu  sebuah 
koneksi  dari  client  atau  dari  port  tertentu  yang  telah  disetujui.  Kita  juga  dapat 
menggunakan  method  Connector.open  untuk  menciptakan  sebuah  server  socket. 
Sebuah  URL  akan  memberikan  sebuah  format  yang  sama  seperti  pada  TCP  socket 
kepada  method  open(),  dengan  nama  hostname  yang  dibiarkan  kosong  (misal 
socket://:8899). 
ServerSocketConnection conn =
    (ServerSocketConnection) Connector.open("socket://:8889");
// Dengarkan koneksi dari client 
SocketConnection client = (SocketConnection) conn.acceptAndOpen();
client.setSocketOption(DELAY, 0);
InputStream iStream = client.openInputStream();
OutputStream oStream = client.openOutputStream();
// baca/tulis untuk input/output streams
...
is.close();
os.close();
client.close();
server.close();
Pengembangan Perangkat Mobile 12

6.6 Datagrams
Koneksi  dari  TCP  socket  adalah  koneksi  yang  dapat  dipercaya.  Sebaliknya, 
tersampaikannya  pesan  dengan  menggunakan  packet  UDP  tidak  dijamin.  Tidak  ada 
jaminan  bahwa packet  yang  dikirimkan dengan  menggunakan paket  datagram akan 
diterima  oleh  pasangan.  Susunan  dari  packet  yang  diterima  juga  tidak  terpercaya. 
Susunan  packet  yang  dikirimkan  dimungkinkan  untuk  tidak  sama  dengan  susunan 
packet yang diterima. 
UDP datagrams atau packet digunakan apabila aplikasi dapat tetap berjalan walaupun 
ada packet yang hilang atau packet tersebut tidak lagi  memiliki susunan yang sama 
seperti yang dikirimkan. 
String url;
try {      
    if (isServer){  
        // memulai sebagai server, mendengarkan port 8888
        url = "datagram://:8888";
    } else {
//  memulai  sebagai  client,  koneksi  dengan  port  8888  sebagai 
//localhost 
        url = "datagram://localhost:8888";
    }
    dc = (DatagramConnection) Connector.open(url);
    while (true) {
        Datagram dgram = dc.newDatagram(128);
        dc.receive(dgram);
        if (isServer){
            // memulai sebagai server, mendapatkan alamat koneksi 
            // bagi pesan kita selama proses pengiriman              
            url = dgram.getAddress();
        }
        if (dgram.getLength() > 0){                                   
            String mesg =
                new String(dgram.getData(), 0, dgram.getLength()));
        }
    }
Pengembangan Perangkat Mobile 13

}
catch (IOException ioe) {}
catch (Exception e) {}
...
private void sendMesg(String line){
    try {
        byte[] bytes = line.getBytes();
        Datagram dgram = null;
     
        dgram = dc.newDatagram(bytes, bytes.length, url);
        dc.send(dgram);
    } catch (Exception ioe) {}
}