Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

49 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

libjmentrance - Library Data Entrance Jasa Marga

libjmentrance merupakan library untuk melakukan decrypt data entrance tol yang ditulis oleh peralatan tol dengan software Toll Collector Jasa Marga.

Library tersedia untuk Linux dalam 4 arsitektur, diantaranya:

  • amd64 - Intel/AMD x86 dengan 64bit
  • aarch64 - ARM 64bit
  • armv7 - ARM 32bit
  • i386 - Intel 32bit

Sedangkan untuk QNX/NTO hanya disediakan arsitektur i386 (Intel/AMD x86 dengan 32bit)

Untuk windows tersedia dalam bentuk dll native dan managed (.net) disertai example untuk invoke pada c#, juga tersedia berupa cli-tools executable. (Lihat folder windows)

Binary Build Library

libjmentrance dibangun sebagai static library untuk C/C++ yang dapat digunakan pada environment gcc.

File library terdiri dari 2 jenis extension *.a (pada direktori lib) atau *.o (pada direktori obj). Aplikasi Toll Collector dapat memilih salah-satu format sesuai dengan kebutuhannya.

Berikut adalah nama-nama file binary untuk library beserta keterangan arsitektur dan platformnya:

  • libjmentrance-amd64.a / libjmentrance-amd64.o - Linux x86 64bit
  • libjmentrance-aarch64.a / libjmentrance-aarch64.o - Linux ARM 64bit
  • libjmentrance-armv7.a / libjmentrance-armv7.o - Linux ARMv7
  • libjmentrance-i386.a / libjmentrance-i386.o - Linux x86 32bit
  • libjmentrance-i386-qnx.a / libjmentrance-i386-qnx.o - QNX/NTO x86 32bit

Binary untuk ARM non Linux (Cortex-M non-linux)

Untuk keperluan library diluar linux, misalnya micro-controller berbasis arm, dapat menggunakan library pada folder lib atau obj berikut:

  • libjmentrance-noneabi-arm.a
  • libjmentrance-noneabi-arm.o

DLL untuk Windows dan C#

Library berupa DLL dan contoh penggunaan/pinvoke C# untuk windows dapat ditemukan pada folder windows

  • windows/jmentrance.dll dll library
  • windows/Program.cs contoh pinvoke dalam c#

Deklarasi method pada c#

/* PInvoke jmentrance */
[DllImport("jmentrance.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
internal static extern int jmentrance_decrypt([MarshalAs(UnmanagedType.LPStr)] string pubkey,
    [MarshalAs(UnmanagedType.LPStr)] string cluster_id,
    [MarshalAs(UnmanagedType.LPStr)] string sn,
    [MarshalAs(UnmanagedType.LPStr)] string input,
    [MarshalAs(UnmanagedType.LPStr)] StringBuilder output, int output_len);

Contoh fungsi

/* Output Buffer */
StringBuilder output = new StringBuilder(45);

/* HIMBARA */
string sn = "7546000012122780"; /* Gunakan sn kartu untuk HIMBARA */
string data = "615870B6B93F44ABB07EEADCB581CBC6FFFFFFFFFFFF";
int ret = jmentrance_decrypt(pubkey, clusterid, sn, data, output, 45);
Console.WriteLine("HIMBARA: "+ret+" = "+output);

Untuk status return, dapat dibaca lebih lanjut pada pembahasan Constants - Error Code.

CLI-Tools untuk Windows

CLI-Tools untuk windows dapat dilihat pada folder windows

  • windows/jmentrance.exe cli-tools
  • windows/test-windows.bat example penggunaan cli tools

Format CLI-Tools

jmentrance <public-key> <cluster-id> <card-sn> <encrypted-data>

Test Program

Test program dapat dilihat pada file example/libjmentrance-test.c, dan dapat di-build dengan build_test.sh (Hanya untuk Linux). Berikut command untuk melakukan build sesuai dengan arsitektur yang dituju:

# Build untuk x86 64bit
./build_test.sh

# Build untuk arm-64
./build_test.sh aarch64

# Build untuk arm-v7 32bit
./build_test.sh armv7

# Build untuk x86 32bit
./build_test.sh i386

Library Usage

Penyimpanan Data

Entrance tol Jasa Marga yang telah di-enkripsi akan memiliki panjang 16 bytes atau 32 hex-characters, sehingga dapat disimpan kedalam satu block mifare (BCA), atau pada penyimpanan data etoll yang dapat menampung sampai 44 karakter.

Untuk etoll (non-bca) libjmentrance hanya akan memproses 16 byte awal dan mengacuhkan sisanya, misalnya:

DATA DALAM KARTU   = 615870B6B93F44ABB07EEADCB581CBC6FFFFFFFFFFFF
YANG AKAN DIPROSES = 615870B6B93F44ABB07EEADCB581CBC6

Sehingga penggunaan library seperti ini tetap valid:

const char* sn = "7546000012122780";
const char* data = "615870B6B93F44ABB07EEADCB581CBC6FFFFFFFFFFFF";
char out[45] = {0};
ret = jmentrance_decrypt(jmentrance_jjs_pubkey, jmentrance_jjs_cluster_id,
                          sn, data, out, 45);

Block Data BCA

Data entrance akan disimpan pada block 44 (dalam satu block saja). Dan parameter sn pada fungsi jmentrance_decrypt diisi dengan hex-uuid (Bukan SN Kartu).

Block 45 akan berisi owner code pada byte pertama dengan konten 0x91 untuk entrance yang belum melakukan exit dan 0x90 untuk entrance yang telah melakukan exit.

Block 46 tidak digunakan.

Entrance pada Kartu Dinas

Kartu Dinas Format Delameta

Data entrance akan disimpan pada sector 9 block 0 (Atau absolute-block 36). Dan parameter sn pada fungsi jmentrance_decrypt diisi dengan hex-uuid.

Block 1 dan 2 pada sector 9 (Atau absolute-block 37 dan 38) akan berisi data kosong yang tidak akan digunakan.

Owner code akan disimpan pada sector 15 block 0 (Atau absolute-block 60) dengan kode owner 91 untuk data entrance yang belum melakukan exit dan 90 untuk entrance yang telah melakukan exit.

Berikut adalah key pada masing-masing sector:

  • Key B Sector 9 : CD3A50871064
  • Key B Sector 15 : AE19F1D3D7E9

Kartu dinas format ini menggunakan sistem whitelist, sehingga hanya kartu-kartu yang uuid nya terdaftar saja yang dapat ditransaksikan.

SECTOR BLOCK ABS KETERANGAN CONTOH
9 0 36 DATA ENTRANCE B348E69BBF66159A3FA17EDAFA45FADB
1 37 - 00000000000000000000000000000000
2 38 - 00000000000000000000000000000000
15 0 60 OWNER CODE 91000000000000000000000000000000

Contoh Decrypt:

if (ownercode==91){
  const char* sn = "F1259F1E";
  const char* data = "B348E69BBF66159A3FA17EDAFA45FADB";
  char out[45] = {0};
  ret = jmentrance_decrypt(pubkey, cluster_id, sn, data, out, 45);
}

Format Entrance JM Card

Data entrance akan disimpan pada block 16 (dalam satu block saja). Dan parameter sn pada fungsi jmentrance_decrypt diisi dengan hex-uuid (Bukan SN Kartu).

Block 17 akan berisi owner code pada byte pertama dengan konten 0x91 untuk entrance yang belum melakukan exit dan 0x90 untuk entrance yang telah melakukan exit.

Block 18 tidak digunakan.

Key untuk block 16, 17 dan 18 (Sektor 4) adalah:

  • Key A Sector 4 : 0CB0FFDCB72E
  • Key B Sector 4 : 0C6C47B41A72
SECTOR BLOCK ABS KETERANGAN CONTOH
4 0 16 DATA ENTRANCE B348E69BBF66159A3FA17EDAFA45FADB
1 17 OWNER CODE 91000000000000000000000000000000
2 18 - 00000000000000000000000000000000

Entrance Keys

Entrance tol Jasa Marga menggunakan enkripsi public & private key. Untuk melakukan decrypt library memerlukan public-key dan cluster-id. Setiap ruas memiliki key dan cluster-id yang berbeda-beda.

Berikut adalah data key & cluster-id yang dapat digunakan:

JJS

CLUSTER ID : ba24cc34

PUBLIC KEY

bad265420de99f9f78435d2207e44859ca4eba4af53650d50ed63466e3657225cf07967277e5093e25af511eeb9f1aabf61646db59df1e9722ad901851ffca3d

JMJ

CLUSTER ID : ba5cee4e

PUBLIC KEY

830d659aa4500b4fe5d0dd5c8e38e367a564a6fe846ed758b34884ee40dbfaefb5454b1f3b250eed2e52a93abbef99c5c142a9218f58198fda9da4e035ccdb3b

JBP

CLUSTER ID : ba14ee33

PUBLIC KEY

9eb796b173bb43f5cc081fe721a7113bd6137230e0432e522a5bc42beec04829d61f5bafc672f3746de1c555bc7c5ef9dbf994d869ef8a745993de8edc849641

Penggunaan Library pada Multi Ruas

Karena berbasis key, maka library sudah mendukung implementasi multiruas, dengan menyiapkan seleksi kondisi baik pada runtime atau compile time.

Contoh implementasi compile-time/macro

#ifdef TCT_JJS
  /* JJS */
  static const char* key =
    "bad265420de99f9f78435d2207e44859ca4eba4af53650d50ed63466e3657225cf07967277"
    "e5093e25af511eeb9f1aabf61646db59df1e9722ad901851ffca3d";
  static const char* cluster = "ba24cc34";
#endif

#ifdef TCT_JMJ
  /* JMJ */
  static const char* key =
    "830d659aa4500b4fe5d0dd5c8e38e367a564a6fe846ed758b34884ee40dbfaefb5454b1f3b"
    "250eed2e52a93abbef99c5c142a9218f58198fda9da4e035ccdb3b";
  static const char* cluster = "ba5cee4e";
#endif

#ifdef TCT_JBP
  /* JBP */
  static const char* key =
    "9eb796b173bb43f5cc081fe721a7113bd6137230e0432e522a5bc42beec04829d61f5bafc6"
    "72f3746de1c555bc7c5ef9dbf994d869ef8a745993de8edc849641";
  static const char* cluster = "ba14ee33";
#endif

/* Baca Data */
int status = jmentrance_decrypt(key, cluster, sn, data, output45);

Contoh implementasi pada runtime

char* key ="";
char* cluster = "ba24cc34";

if (ini_tct_jjs){
  key =
    "bad265420de99f9f78435d2207e44859ca4eba4af53650d50ed63466e3657225cf07967277"
    "e5093e25af511eeb9f1aabf61646db59df1e9722ad901851ffca3d";
  cluster = "ba24cc34";
}
else if (ini_tct_jmj){
  key =
    "830d659aa4500b4fe5d0dd5c8e38e367a564a6fe846ed758b34884ee40dbfaefb5454b1f3b"
    "250eed2e52a93abbef99c5c142a9218f58198fda9da4e035ccdb3b";
  cluster = "ba5cee4e";
}
else if (ini_tct_jbp){
  key =
    "9eb796b173bb43f5cc081fe721a7113bd6137230e0432e522a5bc42beec04829d61f5bafc6"
    "72f3746de1c555bc7c5ef9dbf994d869ef8a745993de8edc849641";
  cluster = "ba14ee33";
}

/* Baca Data */
int status = jmentrance_decrypt(key, cluster, sn, data, output45);

Struktur Output Data

Output dari jmentrance_decrypt merupakan hex-string dengan format sebagai berikut:

LOKASI UKURAN KETERANGAN KODE DETAIL
0 1 NO CABANG CB -
1 1 NO GERBANG GB -
2 1 NO GARDU GD -
3 1 NO GERBANG EXIT EX 00 Bila belum exit
4-5 2 INST ID INST 0003 untuk Jasa Marga
6 1 TANGGAL TRANSAKSI DD DD
7 1 BULAN TRANSAKSI MM MM
8 1 TAHUN TRANSAKSI YY YY 23 untuk 2023
9 1 JAM TRANSAKSI HH HH format 24 jam
10 1 MENIT TRANSAKSI II MM
11 1 DETIK TRANSAKSI SS SS
12 1 STATUS ST 00 Belum exit, 01 Sudah exit
13 1 JENIS JN Tidak dipakai
14 1 GOLONGAN GL 1 s/d 5
15-17 4 ID PETUGAS IDPETG -
18 1 Direction DR Tidak dipakai
19-21 3 CHECKSUM CHKSUM -

Test Output

TEST DATA JJS
=============
TEST BCA/DINAS
  UUID      : AB56EE01
  ENCRYPTED : 05A4B618A982AA55D61C1284684923E7
  DECRYPTED : 25610400000329112315375500000212553200001569
  ERR-CODE  : 0

TEST ETOLL NON BCA (BELUM EXIT)
  UUID      : 6013500130684476
  ENCRYPTED : 4D4619FADD5E111F2604AF9453A52D9D
  DECRYPTED : 25640100000329112315375500000110101000042189
  ERR-CODE  : 0

TEST ETOLL NON BCA (SUDAH EXIT)
  UUID      : 7546000012122780
  ENCRYPTED : 615870B6B93F44ABB07EEADCB581CBC6FFFFFFFFFFFF
  DECRYPTED : 25640163000329112315375501000312121200051726
  ERR-CODE  : 0



TEST DATA JMJ
=============
JJS MANDIRI
  UUID      : 6032982864461171
  ENCRYPTED : 7813822AEBB9A40540A6B9E87306F195FFFFFFFFFFFF
  DECRYPTED : 45300100000306082408181400000115149800006594
  ERR-CODE  : 0

JJS BCA
  UUID      : 15CC8081
  ENCRYPTED : 71634CB6147414803B8E57A42E26FEF2
  DECRYPTED : 45300100000306082408183000000215149800040738
  ERR-CODE  : 0

JJS BRI
  UUID      : 6013500418244902
  ENCRYPTED : B31818BEB247BDB46CF4AD672FD0973DFFFFFFFFFFFF
  DECRYPTED : 45300100000306082408184300000315149800043806
  ERR-CODE  : 0

JJS BNI
  UUID      : 7546130008699754
  ENCRYPTED : 92BAAF2F1BF8226473031612D12362B4FFFFFFFFFFFF
  DECRYPTED : 45300100000306082408185300000415149800009831
  ERR-CODE  : 0


TEST DATA JPB
=============
JPB BRI
  UUID      : 6013500418244902
  ENCRYPTED : D200B2200E12C10C485613599C689BFFFFFFFFFFFFFF
  DECRYPTED : 46610300000317102411262700000400000000002064
  ERR-CODE  : 0

JPB BNI
  UUID      : 7546130008699754
  ENCRYPTED : 138FA85DFF210C3F00852AA3E3CDA43DFFFFFFFFFFFF
  DECRYPTED : 46610500000317102411262700000100000000018444
  ERR-CODE  : 0

JPB MANDIRI
  UUID      : 6032982864461171
  ENCRYPTED : C779EA3A11A0935327AB5887E50049E8FFFFFFFFFFFF
  DECRYPTED : 46630100000317102411262700000300000000006877
  ERR-CODE  : 0

JPB BCA
  UUID      : 15CC8081
  ENCRYPTED : 21D0D1A46DFF034FF22FC2D0B743AFAE
  DECRYPTED : 46620300000317102411262700000500000000027593
  ERR-CODE  : 0

Contoh Parsing Data Output

DECRYPTED:      45300100000306082408185300000415149800009831
============================================================
CB GB DG EX INST DD MM YY HH II SS ST JN GL IDPETG DR CHKSUM
45 30 01 00 0003 06 08 24 08 18 53 00 00 04 151498 00 009831


DECRYPTED:      45300100000306082408184300000315149800043806
============================================================
CB GB DG EX INST DD MM YY HH II SS ST JN GL IDPETG DR CHKSUM
45 30 01 00 0003 06 08 24 08 18 43 00 00 03 151498 00 043806


DECRYPTED:      25640163000329112315375501000312121200051726
============================================================
CB GB DG EX INST DD MM YY HH II SS ST JN GL IDPETG DR CHKSUM
25 64 01 63 0003 29 11 23 15 37 55 01 00 03 121212 00 051726
         ^                          ^
         +--------------------------+
    Kartu sudah exit bila field ini bukan 00


DECRYPTED:      25610400000329112315375500000212553200001569
============================================================
CB GB DG EX INST DD MM YY HH II SS ST JN GL IDPETG DR CHKSUM
25 61 04 00 0003 29 11 23 15 37 55 00 00 02 125532 00 001569


DECRYPTED:      45300100000306082408181400000115149800006594
============================================================
CB GB DG EX INST DD MM YY HH II SS ST JN GL IDPETG DR CHKSUM
45 30 01 00 0003 06 08 24 08 18 14 00 00 01 151498 00 006594


JMCard-NG - Kartu Dinas Jasa Marga New-Generation

Kartu Tol Perusahaan Jasa Marga New Generation (KTP JM-NG) adalah sistem pembayaran elektronik yang dirancang untuk mendukung transaksi kartu dinas pada ruas tol yang dikelola oleh Jasa Marga Group. Dokumen ini menjelaskan spesifikasi teknis, penggunaan library, serta mekanisme integrasi yang diperlukan untuk membaca dan mendekripsi data kartu KTP JM-NG, termasuk proses verifikasi dan dekripsi signature yang digunakan sebagai bagian dari mekanisme autentikasi transaksi berbasis whitelist kartu dinas.

Library untuk membaca dan memproses data kartu JMCard-NG dapat dilakukan dengan menggunakan library libjmentrance. Terdapat dua fungsi yaitu:

  • jmcard_ng_decrypt()
  • jmcard_ng()

Struktur Penyimpanan Data Kartu pada Mifare

Sectors Blok ABS Data
0 0 0 UID
1 1
2 2
3 3 Key Sectors
1 0 4 Data KTP Block-0
1 5 Data KTP Block-1
2 6 Data KTP Block-2
3 7 Key Sectors
2 0 8
1 9
2 10
3 11 Key Sectors
3 0 12 Data Entrance
1 13
2 14 Owner Code
3 15 Key Sectors

Mifare Key

Untuk membaca sektor-1 pada kartu mifare JMCard-NG, dapat menggunakan kunci berikut:

  • Key-A: 2177A6F53421

Untuk melakukan baca-tulis entrance sektor-3 pada kartu mifare JMCard-NG, dapat menggunakan kunci berikut:

  • Key-A: FFFFFFFFFFFF

Flow Proses Validasi JMCard-NG

  • Pembacaan dan Parsing Kartu JMCard-NG
    1. Baca UUID
    2. Baca block-0, block-1, block-2 di dalam sektor-1 pada kartu mifare dengan Key-A 2177A6F53421
    3. Jalankan fungsi jmcard_ng
    4. Bila parsing berhasil, data kartu bisa digunakan dengan format jmcard_ng_t
  • Validasi Ruas
    1. Pastikan konfigurasi ruas GTO telah dilakukan menggunakan fungsi jmcard_ng_config_ruas. Fungsi konfigurasi ini bisa hanya dilakukan sekali ketika program GTO dijalankan.
    2. Lakukan pembacaan dan parsing kartu jmcard-ng seperti langkah sebelumnya
    3. Gunakan fungsi jmcard_ng_cek_ruas untuk mengetahui/memvalidasi kartu tersebut bisa transaksi pada gardu.
  • Validasi Whitelist
    1. Tap Kartu, dan baca UUID
    2. Cari uuid pada database whitelist, dan ambil signature dari whitelist tersebut
    3. Lakukan validasi signature menggunakan fungsi jmcard_ng_decrypt
    4. Hasil parsing berupa text tersusun dengan format whitelist (Lihat Format Signature Whitelist)

Format Signature Whitelist

Signature whitelist secara data disimpan ter-enkripsi, dapat dilakukan decrypt dengan menggunakan jmcard_ng_decrypt, yang akan menghasilkan string dengan format berikut:

CONTOH: 
3A011320280519B73F8BE37D6FD112
>> 3 A 01 13 20280519 B73F8BE3 7D6FD112
3        : Harus berisi "3" atau signature tidak valid
a        : Status Kartu (a. Aktif, b. Tidak Aktif)
01       : Kode Ruas
13       : Nomor Gerbang
20280519 : Kadaluarsa YYYYMMDD
B73F8BE3 : Signature Value (Berubah setiap update data)
7D6FD112 : UUID Kartu

Melakukan Decrypt Data Personal

Untuk melakukan decrypt data personal pada JMCard-NG, dapat menggunakan jmcard_ng() dengan menyertakan data hexadecimal dari Sektor-1 (Block 0, Block 1 dan Block 2) beserta UUID kartu.

Hasil decrypt berupa struktur data jmcard_ng_t

Contoh penggunaan jmcard_ng()

#include <libjmentrance.h>
#include <stdio.h>

// Fungsi untuk menampilkan data jmcard-ng
void dump_jmcard_ng(jmcard_ng_t* jmcard) {
  printf("- RUAS BYTE 1: %08X\n", jmcard->ruas1);
  printf("- RUAS BYTE 2: %08X\n", jmcard->ruas2);
  printf("- RUAS STRING : %s\n", jmcard->ruas);
  printf("- EXPIRE DATE : %s\n", jmcard->expire);
  printf("- TIPE KARTU  : %d\n", jmcard->tipe);
  printf("- NO KARTU    : %s\n", jmcard->nokartu);
  printf("- UID         : %s\n", jmcard->uid);
  printf("- STATUS      : %u\n", jmcard->status);
  printf("\n");
}

// Fungsi untuk test parsing jmcard-ng
void test_parsing_jmcard_ng() {
  jmcard_ng_t jmcard = {0};

  // UUID Kartu: 33627705
  const char* uuid = "33627705";

  // Mifare Sector-1 Block 0, 1, 2
  // Baca sektor-1 blok 0, 1, 2 menggunakan fungsi pembaca kartu mifare,
  // lalu masukkan data blok tersebut ke fungsi jmcard_ng untuk didekripsi.
  // Gunakan key A berikut: "2177A6F53421"
  const char* block0 = "8B55DA5B230324EEF53281FDA91CF617";
  const char* block1 = "7FE86B1B9EB8E52C4240F52AA89362FE";
  const char* block2 = "856AD4EAC610A53F317CAB5573568138";

  // Decrypt jmcard-ng data
  uint8_t ret = jmcard_ng(&jmcard, uuid, block0, block1, block2);

  // Tampilkan hasil decrypt
  printf("DECRYPTED DATA %s\n", ret == 0 ? "SUCCESS" : "FAILED");
  if (ret == 0) {
    // Decrypt berhasil, tampilkan data jmcard-ng
    dump_jmcard_ng(&jmcard);

    // Cek validasi ruas
    int ruas_valid = jmcard_ng_cek_ruas(jmcard.ruas1, jmcard.ruas2);
    printf("CEK RUAS:\n");
    printf("- JUMLAH RUAS VALID: %d\n", ruas_valid);
    printf("- STATUS RUAS.     : %s\n", ruas_valid > 0 ? "OK" : "RUAS LAIN");
    printf("\n");
  } else {
    // Decrypt gagal, tampilkan error
    printf("DECRYPT ERROR : %u\n", ret);
    switch (ret) {
      case JMCARD_NG_ERR_CKSUM:
        printf("- INVALID CHECKSUM\n");
        break;
      case JMCARD_NG_ERR_SIG:
        printf("- UUID NOT MATCH / SIGNATURE INVALID\n");
        break;
      case JMCARD_NG_ERR_DECRYPT:
        printf("- INVALID DECRYPT RESULT\n");
        break;
      case JMCARD_NG_ERR_DATA:
        printf("- INVALID RAW DATA\n");
        break;
      case JMCARD_NG_ERR_READ:
        printf("- ERROR READING DATA\n");
        break;
      case JMCARD_NG_ERR_AUTH:
        printf("- AUTHENTICATION ERROR\n");
        break;
    }
  }
}

void whitelist_validation(const char* uuid, const char* whitelist_signature) {
  // Decrypt signature whitelist
  char out[128] = {0};  // Buffer untuk menyimpan hasil decrypt
  uint8_t r = jmcard_ng_decrypt(whitelist_signature, out);

  // Tampilkan hasil decrypt
  printf("UUID: %s\n", uuid);
  printf("DECRYPT WHITELIST SIGNATURE %s\n", r == 1 ? "SUCCESS" : "FAILED");
  if (r == 1) {
    printf("- DECRYPTED SIGNATURE: %s\n", out);
  } else {
    printf("- DECRYPT ERROR: %u\n", r);
  }
  printf("\n");
}

void test_whitelist_ktp() {
  // Test whitelist signature untuk beberapa UUID
  whitelist_validation("7D6FD112",
                       "7c030aa5f13280567ae477fba52232f2cfbf2c813053100499df33d"
                       "5956264ae72344b7708b9995d4ebe9a1b666d40ea");
  whitelist_validation("2595D4A0",
                       "8d578b5884c43ab546d10716edef65f37eb26612394b688e753340b"
                       "99544bcce108bde269094a90e842aa89a6b31afb6");
  whitelist_validation("DC7425D4",
                       "5ec00535d1c2effda1c28005bac1f576de2f16abab1c7355c719576"
                       "f1c87c29aba05c55f65658b14f484bc3cc589cf77");
}

int main() {
  jmcard_ng_t jmcard = {0};

  // Konfigurasi Ruas pada GTO
  // Silahkan baca dokumentasi `jmcard_ng_config_ruas` untuk format konfigurasi
  // ruas yang benar.
  //
  // Contoh: Harus ada ruas 1, atau ruas 2 dan 3, atau ruas 4
  jmcard_ng_config_ruas("1, 2+3, 4");

  // Test parsing jmcard-ng dengan data contoh. Data ini diambil dari kartu asli
  // yang sudah didekripsi menggunakan alat dekripsi lain. Pastikan data blok
  // yang digunakan benar agar hasil parsing sesuai dengan data asli kartu.
  test_parsing_jmcard_ng();

  // Test validasi whitelist KTP dengan beberapa UUID dan signature whitelist
  test_whitelist_ktp();

  return 0;
}

Contoh di atas akan menghasilkan output sebagai berikut:

DECRYPTED DATA SUCCESS
- RUAS BYTE 1: 00000001
- RUAS BYTE 2: 00000000
- RUAS STRING : 0000000000000001
- EXPIRE DATE : 20261231
- TIPE KARTU  : 1
- NO KARTU    : 01000141033000002
- UID         : 33627705
- STATUS      : 1

CEK RUAS:
- JUMLAH RUAS VALID: 1
- STATUS RUAS.     : OK

UUID: 7D6FD112
DECRYPT WHITELIST SIGNATURE SUCCESS
- DECRYPTED SIGNATURE: 3a011320280519b73f8be37d6fd112

UUID: 2595D4A0
DECRYPT WHITELIST SIGNATURE SUCCESS
- DECRYPTED SIGNATURE: 3a01132028051973f09cd52595d4a0

UUID: DC7425D4
DECRYPT WHITELIST SIGNATURE SUCCESS
- DECRYPTED SIGNATURE: 3a01012028051909f879ccdc7425d4

Referensi Library

Berikut adalah referensi lengkap dari libjmentrance yang terbagi kedalam 2 segment diantaranya:

  • Function - Merupakan fungsi-fungsi yang terdapat dalam library.
  • Constants - Merupakan kumpulan nilai konstanta yang digunakan pada library

Daftar Isi


Struktur Data

jmcard_ng_t

Struktur data JMCARD_NG yang akan digunakan untuk menyimpan data hasil decrypt kartu JMCard-NG

typedef struct {
  uint32_t ruas1;   /* ruas segment 1 */
  uint32_t ruas2;   /* ruas segment 2 */
  char ruas[17];    /* ruas string */
  char expire[9];   /* expire date string */
  int tipe;         /* jenis kartu 1. operasi, 2. karyawan, 3.mitra */
  char nokartu[32]; /* nomor kartu string */
  char uid[9];      /* uid string */
  uint8_t status;   /* status error validasi kartu. */
} jmcard_ng_t;

Functions

jmentrance_decrypt()

Decrypt raw data (hex string) yang didapatkan dari kartu menjadi output standar data entrance (hex string)

Arguments

  • pubkey : Public-key untuk decrypt
  • cluster_id : Cluster-id key
  • sn : Nomor kartu etoll atau uuid untuk BCA
  • input : Hex string input
  • output : Hex string output
  • output_length : Length dari output buffer

Return Value

  • Error Code. Lihat JMENTRANCE_OK atau JMENTRANCE_ERR_*
int jmentrance_decrypt(
    const char *pubkey,
    const char *cluster_id,
    const char *sn,
    const char *input,
    char *output,
    size_t output_length
);

jmcard_ng_decrypt()

Decrypt raw data (hex string) yang didapatkan dari data whitelist untuk JM Card

Arguments

  • ciphersrc : String cipher hex untuk di-decrypt
  • out : Buffer untuk menyimpan hasil (min 256 bytes)

Return Value

  • 0 gagal, 1 berhasil
uint8_t jmcard_ng_decrypt(
    const char *ciphersrc,
    char *out
);

jmcard_ng()

Decrypt raw data (hex string) yang didapatkan dari block kartu mifare JMCard-NG menjadi struktur data jmcard_ng_t

Arguments

  • pubkey : Public-key untuk decrypt
  • cluster_id : Cluster-id key
  • sn : Nomor kartu etoll atau uuid untuk BCA
  • input : Hex string input
  • output : Hex string output
  • output_length : Length dari output buffer

Return Value

  • Error Code. Lihat JMCARD_NG_OK atau JMCARD_NG_ERR_*
uint8_t jmcard_ng(
    jmcard_ng_t *out,
    const char *uuid,
    const char *block0,
    const char *block1,
    const char *block2
);

jmcard_ng_config_ruas()

Konfigurasi list ruas yang valid untuk kartu JMCard-NG. Fungsi ini digunakan untuk menentukan ruas mana saja yang dianggap valid saat melakukan validasi kartu. Gunakan koma untuk memisahkan ruas, dan gunakan tanda plus untuk kombinasi ruas. Contoh: - "1, 2, 3" -> hanya ruas 1, 2, dan 3 yang valid - "1+2, 3" -> harus ada ruas 1 dan 2, atau memikiki ruas 3

Arguments

  • config_ruas : String daftar ruas dan kombinasi ruas

Return Value

  • void
void jmcard_ng_config_ruas(
    const char *config_ruas
);

jmcard_ng_cek_ruas()

Konfigurasi list ruas yang valid untuk kartu JMCard-NG. Fungsi ini digunakan untuk menentukan ruas mana saja yang dianggap valid saat melakukan validasi kartu.

Arguments

  • ruas1 : Ruas segment 1 yang didapat dari kartu (jmcard_ng_t)
  • ruas2 : Ruas segment 2 yang didapat dari kartu (jmcard_ng_t)

Return Value

  • int Jumlah kombinasi ruas yang valid, 0 jika tidak ada yang valid
int jmcard_ng_cek_ruas(
    uint32_t ruas1,
    uint32_t ruas2
);

Constants

Error Code

NAME VALUE Keterangan
JMENTRANCE_OK 0 Tidak terjadi error
JMENTRANCE_ERR_LENGTH 1 Length data error
JMENTRANCE_ERR_CHECKSUM 2 Checksum error
JMENTRANCE_ERR_SIG 3 Signature error
JMENTRANCE_ERR_DATA 4 Input Data error
JMENTRANCE_ERR_BUFSZ 5 not enough buffer size
JMCARD_NG_OK 0 Tidak terjadi error
JMCARD_NG_ERR_CKSUM 1 INVALID CRC32
JMCARD_NG_ERR_SIG 2 UUID NOT MATCH
JMCARD_NG_ERR_DECRYPT 4 INVALID DECRYPT RESULT
JMCARD_NG_ERR_DATA 8 INVALID RAW DATA INVALID
JMCARD_NG_ERR_READ 16 INVALID RAW DATA INVALID
JMCARD_NG_ERR_AUTH 32 INVALID RAW DATA INVALID

About

Library Data Entrance Jasa Marga

Topics

Resources

Stars

2 stars

Watchers

4 watching

Forks

Releases

Packages

Contributors

Languages