Cipher Fayadh
Block cipher Feistel 128-bit dengan fungsi putaran sigma-delta
Loading...
Searching...
No Matches
bench_modes.cpp File Reference

Benchmark throughput mode operasi, serial (1 thread) vs paralel (OpenMP). More...

#include <algorithm>
#include <chrono>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <fstream>
#include <string>
#include <vector>
#include "cipher.hpp"
#include "modes.hpp"

Classes

struct  Op
 Satu operasi yang dibenchmark. More...

Typedefs

using ModeFn = util::Bytes (*)(const BlockCipher &, const uint8_t *, const util::Bytes &)
 Signature fungsi mode, sama dengan yang dipakai container.

Functions

static uint64_t next_rand ()
 PRNG deterministik (xorshift64).
static void fill_random (uint8_t *p, size_t n)
 Isi buffer dengan byte acak dari next_rand().
static void set_threads (int n)
 Atur jumlah thread OpenMP. Tidak berbuat apa-apa tanpa OpenMP.
static double time_median (ModeFn fn, const BlockCipher &c, const uint8_t *iv, const util::Bytes &in, int reps, util::Bytes &result)
 Jalankan fn sebanyak reps kali dan ambil waktu median.
static std::string cpu_name ()
 Ambil nama CPU dari /proc/cpuinfo (Linux).
static void usage (const char *prog)
 Cetak cara pakai lalu keluar.
int main (int argc, char **argv)
 Benchmark semua mode × ukuran, serial vs paralel.

Variables

static const Op OPS []
 Daftar operasi yang dibenchmark (mode × arah enkripsi/dekripsi).
static uint64_t rng_state = 0x123456789ABCDEF0ULL
 State PRNG. Seed tetap supaya hasil uji bisa direproduksi.

Detailed Description

Benchmark throughput mode operasi, serial (1 thread) vs paralel (OpenMP).

Yang diukur hanya fungsi mode di modes:: (tanpa I/O, CMAC, atau padding), berbeda dengan benchmark di tests/e2e.sh yang mengukur CLI end-to-end.

Untuk tiap operasi dan ukuran data, fungsi dijalankan beberapa kali dengan 1 thread lalu dengan semua thread, dan waktu median yang dipakai. Output serial dan paralel juga dibandingkan byte demi byte.

Data plaintext, kunci, dan IV deterministik (seed tetap), jadi hasilnya bisa direproduksi.

Jalankan dengan:

make bench # tabel ke stdout
make bench BENCH_ARGS="--sizes 1,16 --reps 3"
make bench-csv # simpan ke docs/report/data/bench.csv

Opsi:

  • --csv output CSV (info mesin dikirim ke stderr)
  • --reps N jumlah pengulangan per pengukuran (default 5)
  • --sizes A,B,.. ukuran data dalam MiB (default 1,16,64)
  • --threads N jumlah thread untuk run paralel (default semua thread)

Function Documentation

◆ cpu_name()

std::string cpu_name ( )
static

Ambil nama CPU dari /proc/cpuinfo (Linux).

Returns
Nama CPU, atau "unknown" kalau tidak tersedia.

◆ fill_random()

void fill_random ( uint8_t * p,
size_t n )
static

Isi buffer dengan byte acak dari next_rand().

Parameters
[out]pBuffer tujuan.
[in]nJumlah byte yang diisi.

◆ main()

int main ( int argc,
char ** argv )

Benchmark semua mode × ukuran, serial vs paralel.

Parameters
[in]argcJumlah argumen.
[in]argvArgumen (lihat opsi di deskripsi file).
Returns
0 kalau output serial dan paralel identik di semua kasus, 1 kalau ada yang beda.

◆ next_rand()

uint64_t next_rand ( )
static

PRNG deterministik (xorshift64).

Returns
Nilai acak 64 bit berikutnya.
Note
Bukan PRNG kriptografis, hanya untuk generate test data.

◆ set_threads()

void set_threads ( int n)
static

Atur jumlah thread OpenMP. Tidak berbuat apa-apa tanpa OpenMP.

Parameters
[in]nJumlah thread.

◆ time_median()

double time_median ( ModeFn fn,
const BlockCipher & c,
const uint8_t * iv,
const util::Bytes & in,
int reps,
util::Bytes & result )
static

Jalankan fn sebanyak reps kali dan ambil waktu median.

Parameters
[in]fnFungsi mode yang diukur.
[in]cCipher.
[in]ivIV / counter awal.
[in]inData masukan.
[in]repsJumlah pengulangan.
[out]resultOutput dari run terakhir (untuk dibandingkan).
Returns
Waktu median dalam detik.

◆ usage()

void usage ( const char * prog)
static

Cetak cara pakai lalu keluar.

Parameters
[in]progNama program.

Variable Documentation

◆ OPS

const Op OPS[]
static
Initial value:
= {
{"ECB", "enc", modes::ecb_encrypt, nullptr, "parallel"},
{"ECB", "dec", modes::ecb_decrypt, modes::ecb_encrypt, "parallel"},
{"CBC", "enc", modes::cbc_encrypt, nullptr, "serial (by definition)"},
{"CBC", "dec", modes::cbc_decrypt, modes::cbc_encrypt, "parallel"},
{"CFB", "enc", modes::cfb_encrypt, nullptr, "serial (by definition)"},
{"CFB", "dec", modes::cfb_decrypt, modes::cfb_encrypt, "parallel"},
{"OFB", "enc", modes::ofb_crypt, nullptr, "serial (by definition)"},
{"CTR", "enc", modes::ctr_crypt, nullptr, "parallel"},
}
util::Bytes ecb_encrypt(const BlockCipher &cipher, const uint8_t *iv, const util::Bytes &in)
Enkripsi data menggunakan mode Electronic Codebook (ECB).
Definition modes.cpp:20
util::Bytes ctr_crypt(const BlockCipher &cipher, const uint8_t *iv, const util::Bytes &in)
Enkripsi/dekripsi data menggunakan mode Counter (CTR).
Definition modes.cpp:172
util::Bytes ofb_crypt(const BlockCipher &cipher, const uint8_t *iv, const util::Bytes &in)
Enkripsi/dekripsi data menggunakan mode Output Feedback (OFB).
Definition modes.cpp:152
util::Bytes ecb_decrypt(const BlockCipher &cipher, const uint8_t *iv, const util::Bytes &in)
Dekripsi data menggunakan mode Electronic Codebook (ECB).
Definition modes.cpp:38
util::Bytes cfb_decrypt(const BlockCipher &cipher, const uint8_t *iv, const util::Bytes &in)
Dekripsi data menggunakan mode Cipher Feedback (CFB-128 full block).
Definition modes.cpp:127
util::Bytes cbc_decrypt(const BlockCipher &cipher, const uint8_t *iv, const util::Bytes &in)
Dekripsi data menggunakan mode Cipher Block Chaining (CBC).
Definition modes.cpp:79
util::Bytes cbc_encrypt(const BlockCipher &cipher, const uint8_t *iv, const util::Bytes &in)
Enkripsi data menggunakan mode Cipher Block Chaining (CBC).
Definition modes.cpp:56
util::Bytes cfb_encrypt(const BlockCipher &cipher, const uint8_t *iv, const util::Bytes &in)
Enkripsi data menggunakan mode Cipher Feedback (CFB-128 full block).
Definition modes.cpp:106

Daftar operasi yang dibenchmark (mode × arah enkripsi/dekripsi).