#!/usr/bin/env python3 """ Build a labeled dataset of crypto vs non-crypto Linux ELF binaries. Strategy: - Compile ~50 crypto C programs (using OpenSSL, custom AES/SHA/MD5/DES/RC4/RSA implementations) - Compile ~50 non-crypto C programs (sorting, string ops, math, file I/O, data structures) - Each program is compiled with multiple flags (-O0, -O2, -Os, -static, -pie, stripped/unstripped) giving ~6 variants per source = ~600 total binaries - Label: 1 = uses cryptographic algorithm, 0 = no crypto """ import os import subprocess import json import shutil CRYPTO_DIR = "/app/sources/crypto" NONCRYPTO_DIR = "/app/sources/noncrypto" BIN_DIR = "/app/binaries" os.makedirs(CRYPTO_DIR, exist_ok=True) os.makedirs(NONCRYPTO_DIR, exist_ok=True) os.makedirs(BIN_DIR, exist_ok=True) # ============================================================ # CRYPTO SOURCE FILES — programs that use crypto algorithms # ============================================================ crypto_sources = {} # --- OpenSSL-linked programs --- crypto_sources["openssl_aes_encrypt.c"] = r""" #include #include #include #include int main() { unsigned char key[32], iv[16], plaintext[1024], ciphertext[1040]; int len, ciphertext_len; RAND_bytes(key, 32); RAND_bytes(iv, 16); memset(plaintext, 'A', 1024); EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new(); EVP_EncryptInit_ex(ctx, EVP_aes_256_cbc(), NULL, key, iv); EVP_EncryptUpdate(ctx, ciphertext, &len, plaintext, 1024); ciphertext_len = len; EVP_EncryptFinal_ex(ctx, ciphertext + len, &len); ciphertext_len += len; EVP_CIPHER_CTX_free(ctx); printf("AES-256-CBC encrypted %d bytes to %d bytes\n", 1024, ciphertext_len); return 0; } """ crypto_sources["openssl_sha256.c"] = r""" #include #include #include int main() { const char *msg = "Hello, World! This is a SHA-256 test message."; unsigned char hash[32]; unsigned int len; EVP_MD_CTX *ctx = EVP_MD_CTX_new(); EVP_DigestInit_ex(ctx, EVP_sha256(), NULL); EVP_DigestUpdate(ctx, msg, strlen(msg)); EVP_DigestFinal_ex(ctx, hash, &len); EVP_MD_CTX_free(ctx); printf("SHA-256: "); for(int i=0; i<32; i++) printf("%02x", hash[i]); printf("\n"); return 0; } """ crypto_sources["openssl_rsa.c"] = r""" #include #include #include #include #include int main() { EVP_PKEY *pkey = EVP_PKEY_new(); EVP_PKEY_CTX *ctx = EVP_PKEY_CTX_new_id(EVP_PKEY_RSA, NULL); EVP_PKEY_keygen_init(ctx); EVP_PKEY_CTX_set_rsa_keygen_bits(ctx, 2048); EVP_PKEY_keygen(ctx, &pkey); EVP_PKEY_CTX_free(ctx); printf("RSA-2048 key generated\n"); EVP_PKEY_free(pkey); return 0; } """ crypto_sources["openssl_hmac.c"] = r""" #include #include #include #include int main() { const char *key = "my_secret_key"; const char *data = "message to authenticate"; unsigned char result[EVP_MAX_MD_SIZE]; unsigned int len; HMAC(EVP_sha256(), key, strlen(key), (unsigned char*)data, strlen(data), result, &len); printf("HMAC-SHA256: "); for(unsigned int i=0; i #include #include int main() { const char *msg = "MD5 hash test string for crypto detection"; unsigned char hash[16]; unsigned int len; EVP_MD_CTX *ctx = EVP_MD_CTX_new(); EVP_DigestInit_ex(ctx, EVP_md5(), NULL); EVP_DigestUpdate(ctx, msg, strlen(msg)); EVP_DigestFinal_ex(ctx, hash, &len); EVP_MD_CTX_free(ctx); printf("MD5: "); for(int i=0; i<16; i++) printf("%02x", hash[i]); printf("\n"); return 0; } """ crypto_sources["openssl_sha512.c"] = r""" #include #include #include int main() { const char *msg = "SHA-512 test"; unsigned char hash[64]; unsigned int len; EVP_MD_CTX *ctx = EVP_MD_CTX_new(); EVP_DigestInit_ex(ctx, EVP_sha512(), NULL); EVP_DigestUpdate(ctx, msg, strlen(msg)); EVP_DigestFinal_ex(ctx, hash, &len); EVP_MD_CTX_free(ctx); printf("SHA-512: "); for(int i=0; i<64; i++) printf("%02x", hash[i]); printf("\n"); return 0; } """ crypto_sources["openssl_chacha20.c"] = r""" #include #include #include #include int main() { unsigned char key[32], nonce[12], plaintext[256], ciphertext[272]; int len; RAND_bytes(key, 32); RAND_bytes(nonce, 12); memset(plaintext, 'X', 256); EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new(); EVP_EncryptInit_ex(ctx, EVP_chacha20_poly1305(), NULL, key, nonce); EVP_EncryptUpdate(ctx, ciphertext, &len, plaintext, 256); EVP_EncryptFinal_ex(ctx, ciphertext + len, &len); EVP_CIPHER_CTX_free(ctx); printf("ChaCha20-Poly1305 encrypted\n"); return 0; } """ crypto_sources["openssl_ecdsa.c"] = r""" #include #include #include #include #include int main() { EVP_PKEY *pkey = NULL; EVP_PKEY_CTX *ctx = EVP_PKEY_CTX_new_id(EVP_PKEY_EC, NULL); EVP_PKEY_keygen_init(ctx); EVP_PKEY_CTX_set_ec_paramgen_curve_nid(ctx, NID_X9_62_prime256v1); EVP_PKEY_keygen(ctx, &pkey); EVP_PKEY_CTX_free(ctx); // Sign const char *msg = "ECDSA test message"; EVP_MD_CTX *mdctx = EVP_MD_CTX_new(); EVP_DigestSignInit(mdctx, NULL, EVP_sha256(), NULL, pkey); EVP_DigestSignUpdate(mdctx, msg, strlen(msg)); size_t siglen; EVP_DigestSignFinal(mdctx, NULL, &siglen); unsigned char sig[512]; EVP_DigestSignFinal(mdctx, sig, &siglen); EVP_MD_CTX_free(mdctx); printf("ECDSA signature: %zu bytes\n", siglen); EVP_PKEY_free(pkey); return 0; } """ crypto_sources["openssl_pbkdf2.c"] = r""" #include #include #include int main() { const char *password = "my_password_123"; unsigned char salt[16] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}; unsigned char key[32]; PKCS5_PBKDF2_HMAC(password, strlen(password), salt, 16, 100000, EVP_sha256(), 32, key); printf("PBKDF2-derived key: "); for(int i=0; i<32; i++) printf("%02x", key[i]); printf("\n"); return 0; } """ crypto_sources["openssl_aes_gcm.c"] = r""" #include #include #include #include int main() { unsigned char key[16], iv[12], plaintext[512], ciphertext[528], tag[16]; int len; RAND_bytes(key, 16); RAND_bytes(iv, 12); memset(plaintext, 'B', 512); EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new(); EVP_EncryptInit_ex(ctx, EVP_aes_128_gcm(), NULL, NULL, NULL); EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_SET_IVLEN, 12, NULL); EVP_EncryptInit_ex(ctx, NULL, NULL, key, iv); EVP_EncryptUpdate(ctx, ciphertext, &len, plaintext, 512); EVP_EncryptFinal_ex(ctx, ciphertext + len, &len); EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_GET_TAG, 16, tag); EVP_CIPHER_CTX_free(ctx); printf("AES-128-GCM encrypted\n"); return 0; } """ # --- Custom / Embedded crypto implementations (no OpenSSL) --- crypto_sources["custom_aes_sbox.c"] = r""" #include #include #include // AES S-box (full) static const uint8_t sbox[256] = { 0x63,0x7c,0x77,0x7b,0xf2,0x6b,0x6f,0xc5,0x30,0x01,0x67,0x2b,0xfe,0xd7,0xab,0x76, 0xca,0x82,0xc9,0x7d,0xfa,0x59,0x47,0xf0,0xad,0xd4,0xa2,0xaf,0x9c,0xa4,0x72,0xc0, 0xb7,0xfd,0x93,0x26,0x36,0x3f,0xf7,0xcc,0x34,0xa5,0xe5,0xf1,0x71,0xd8,0x31,0x15, 0x04,0xc7,0x23,0xc3,0x18,0x96,0x05,0x9a,0x07,0x12,0x80,0xe2,0xeb,0x27,0xb2,0x75, 0x09,0x83,0x2c,0x1a,0x1b,0x6e,0x5a,0xa0,0x52,0x3b,0xd6,0xb3,0x29,0xe3,0x2f,0x84, 0x53,0xd1,0x00,0xed,0x20,0xfc,0xb1,0x5b,0x6a,0xcb,0xbe,0x39,0x4a,0x4c,0x58,0xcf, 0xd0,0xef,0xaa,0xfb,0x43,0x4d,0x33,0x85,0x45,0xf9,0x02,0x7f,0x50,0x3c,0x9f,0xa8, 0x51,0xa3,0x40,0x8f,0x92,0x9d,0x38,0xf5,0xbc,0xb6,0xda,0x21,0x10,0xff,0xf3,0xd2, 0xcd,0x0c,0x13,0xec,0x5f,0x97,0x44,0x17,0xc4,0xa7,0x7e,0x3d,0x64,0x5d,0x19,0x73, 0x60,0x81,0x4f,0xdc,0x22,0x2a,0x90,0x88,0x46,0xee,0xb8,0x14,0xde,0x5e,0x0b,0xdb, 0xe0,0x32,0x3a,0x0a,0x49,0x06,0x24,0x5c,0xc2,0xd3,0xac,0x62,0x91,0x95,0xe4,0x79, 0xe7,0xc8,0x37,0x6d,0x8d,0xd5,0x4e,0xa9,0x6c,0x56,0xf4,0xea,0x65,0x7a,0xae,0x08, 0xba,0x78,0x25,0x2e,0x1c,0xa6,0xb4,0xc6,0xe8,0xdd,0x74,0x1f,0x4b,0xbd,0x8b,0x8a, 0x70,0x3e,0xb5,0x66,0x48,0x03,0xf6,0x0e,0x61,0x35,0x57,0xb9,0x86,0xc1,0x1d,0x9e, 0xe1,0xf8,0x98,0x11,0x69,0xd9,0x8e,0x94,0x9b,0x1e,0x87,0xe9,0xce,0x55,0x28,0xdf, 0x8c,0xa1,0x89,0x0d,0xbf,0xe6,0x42,0x68,0x41,0x99,0x2d,0x0f,0xb0,0x54,0xbb,0x16 }; static const uint8_t rcon[10] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x1b,0x36}; void sub_bytes(uint8_t state[16]) { for(int i=0; i<16; i++) state[i] = sbox[state[i]]; } void shift_rows(uint8_t s[16]) { uint8_t t; t=s[1]; s[1]=s[5]; s[5]=s[9]; s[9]=s[13]; s[13]=t; t=s[2]; s[2]=s[10]; s[10]=t; t=s[6]; s[6]=s[14]; s[14]=t; t=s[15]; s[15]=s[11]; s[11]=s[7]; s[7]=s[3]; s[3]=t; } uint8_t xtime(uint8_t x) { return (x<<1) ^ (((x>>7)&1) * 0x1b); } void mix_columns(uint8_t s[16]) { for(int i=0; i<4; i++) { uint8_t a=s[4*i], b=s[4*i+1], c=s[4*i+2], d=s[4*i+3]; uint8_t e=a^b^c^d; s[4*i]^=e^xtime(a^b); s[4*i+1]^=e^xtime(b^c); s[4*i+2]^=e^xtime(c^d); s[4*i+3]^=e^xtime(d^a); } } void add_round_key(uint8_t s[16], const uint8_t rk[16]) { for(int i=0; i<16; i++) s[i]^=rk[i]; } int main() { uint8_t key[16]={0x2b,0x7e,0x15,0x16,0x28,0xae,0xd2,0xa6,0xab,0xf7,0x15,0x88,0x09,0xcf,0x4f,0x3c}; uint8_t pt[16]={0x32,0x43,0xf6,0xa8,0x88,0x5a,0x30,0x8d,0x31,0x31,0x98,0xa2,0xe0,0x37,0x07,0x34}; uint8_t state[16]; memcpy(state, pt, 16); add_round_key(state, key); for(int r=0; r<9; r++) { sub_bytes(state); shift_rows(state); mix_columns(state); add_round_key(state, key); } sub_bytes(state); shift_rows(state); add_round_key(state, key); printf("AES output: "); for(int i=0; i<16; i++) printf("%02x", state[i]); printf("\n"); return 0; } """ crypto_sources["custom_sha256.c"] = r""" #include #include #include static const uint32_t K[64] = { 0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5,0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5, 0xd807aa98,0x12835b01,0x243185be,0x550c7dc3,0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174, 0xe49b69c1,0xefbe4786,0x0fc19dc6,0x240ca1cc,0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da, 0x983e5152,0xa831c66d,0xb00327c8,0xbf597fc7,0xc6e00bf3,0xd5a79147,0x06ca6351,0x14292967, 0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13,0x650a7354,0x766a0abb,0x81c2c92e,0x92722c85, 0xa2bfe8a1,0xa81a664b,0xc24b8b70,0xc76c51a3,0xd192e819,0xd6990624,0xf40e3585,0x106aa070, 0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5,0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3, 0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208,0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2 }; #define ROTR(x,n) (((x)>>(n))|((x)<<(32-(n)))) #define CH(x,y,z) (((x)&(y))^((~(x))&(z))) #define MAJ(x,y,z) (((x)&(y))^((x)&(z))^((y)&(z))) #define EP0(x) (ROTR(x,2)^ROTR(x,13)^ROTR(x,22)) #define EP1(x) (ROTR(x,6)^ROTR(x,11)^ROTR(x,25)) #define SIG0(x) (ROTR(x,7)^ROTR(x,18)^((x)>>3)) #define SIG1(x) (ROTR(x,17)^ROTR(x,19)^((x)>>10)) void sha256(const uint8_t *data, size_t len, uint8_t hash[32]) { uint32_t h[8] = {0x6a09e667,0xbb67ae85,0x3c6ef372,0xa54ff53a,0x510e527f,0x9b05688c,0x1f83d9ab,0x5be0cd19}; // simplified: just process first block uint32_t w[64]={0}; for(int i=0;i<16&&i*4<(int)len;i++) { w[i]=(data[i*4]<<24)|(data[i*4+1]<<16)|(data[i*4+2]<<8)|data[i*4+3]; } for(int i=16;i<64;i++) w[i]=SIG1(w[i-2])+w[i-7]+SIG0(w[i-15])+w[i-16]; uint32_t a=h[0],b=h[1],c=h[2],d=h[3],e=h[4],f=h[5],g=h[6],hh=h[7]; for(int i=0;i<64;i++){ uint32_t t1=hh+EP1(e)+CH(e,f,g)+K[i]+w[i]; uint32_t t2=EP0(a)+MAJ(a,b,c); hh=g;g=f;f=e;e=d+t1;d=c;c=b;b=a;a=t1+t2; } h[0]+=a;h[1]+=b;h[2]+=c;h[3]+=d;h[4]+=e;h[5]+=f;h[6]+=g;h[7]+=hh; for(int i=0;i<8;i++){hash[i*4]=h[i]>>24;hash[i*4+1]=h[i]>>16;hash[i*4+2]=h[i]>>8;hash[i*4+3]=h[i];} } int main() { const char *msg = "abc"; uint8_t hash[32]; sha256((const uint8_t*)msg, 3, hash); printf("SHA-256('abc')="); for(int i=0;i<32;i++) printf("%02x",hash[i]); printf("\n"); return 0; } """ crypto_sources["custom_md5.c"] = r""" #include #include #include #define F(x,y,z) (((x)&(y))|((~(x))&(z))) #define G(x,y,z) (((x)&(z))|((y)&(~(z)))) #define H(x,y,z) ((x)^(y)^(z)) #define I(x,y,z) ((y)^((x)|(~(z)))) #define ROTL(x,n) (((x)<<(n))|((x)>>(32-(n)))) static const uint32_t T[64] = { 0xd76aa478,0xe8c7b756,0x242070db,0xc1bdceee,0xf57c0faf,0x4787c62a,0xa8304613,0xfd469501, 0x698098d8,0x8b44f7af,0xffff5bb1,0x895cd7be,0x6b901122,0xfd987193,0xa679438e,0x49b40821, 0xf61e2562,0xc040b340,0x265e5a51,0xe9b6c7aa,0xd62f105d,0x02441453,0xd8a1e681,0xe7d3fbc8, 0x21e1cde6,0xc33707d6,0xf4d50d87,0x455a14ed,0xa9e3e905,0xfcefa3f8,0x676f02d9,0x8d2a4c8a, 0xfffa3942,0x8771f681,0x6d9d6122,0xfde5380c,0xa4beea44,0x4bdecfa9,0xf6bb4b60,0xbebfbc70, 0x289b7ec6,0xeaa127fa,0xd4ef3085,0x04881d05,0xd9d4d039,0xe6db99e5,0x1fa27cf8,0xc4ac5665, 0xf4292244,0x432aff97,0xab9423a7,0xfc93a039,0x655b59c3,0x8f0ccc92,0xffeff47d,0x85845dd1, 0x6fa87e4f,0xfe2ce6e0,0xa3014314,0x4e0811a1,0xf7537e82,0xbd3af235,0x2ad7d2bb,0xeb86d391 }; void md5_simple(const uint8_t *msg, size_t len, uint8_t digest[16]) { uint32_t a0=0x67452301, b0=0xefcdab89, c0=0x98badcfe, d0=0x10325476; uint8_t block[64] = {0}; memcpy(block, msg, len < 55 ? len : 55); block[len] = 0x80; uint64_t bits = len * 8; memcpy(block+56, &bits, 8); uint32_t *M = (uint32_t*)block; uint32_t A=a0,B=b0,C=c0,D=d0; for(int i=0;i<64;i++){ uint32_t Func,g; if(i<16){Func=F(B,C,D);g=i;} else if(i<32){Func=G(B,C,D);g=(5*i+1)%16;} else if(i<48){Func=H(B,C,D);g=(3*i+5)%16;} else{Func=I(B,C,D);g=(7*i)%16;} uint32_t temp=D; D=C; C=B; static const int s[64]={7,12,17,22,7,12,17,22,7,12,17,22,7,12,17,22, 5,9,14,20,5,9,14,20,5,9,14,20,5,9,14,20, 4,11,16,23,4,11,16,23,4,11,16,23,4,11,16,23, 6,10,15,21,6,10,15,21,6,10,15,21,6,10,15,21}; B=B+ROTL(A+Func+T[i]+M[g],s[i]); A=temp; } a0+=A;b0+=B;c0+=C;d0+=D; memcpy(digest,&a0,4);memcpy(digest+4,&b0,4);memcpy(digest+8,&c0,4);memcpy(digest+12,&d0,4); } int main(){ uint8_t d[16]; md5_simple((uint8_t*)"hello",5,d); printf("MD5: ");for(int i=0;i<16;i++)printf("%02x",d[i]);printf("\n"); return 0; } """ crypto_sources["custom_rc4.c"] = r""" #include #include #include typedef struct { uint8_t S[256]; int i,j; } RC4_CTX; void rc4_init(RC4_CTX *ctx, const uint8_t *key, int keylen) { for(int i=0;i<256;i++) ctx->S[i]=i; int j=0; for(int i=0;i<256;i++){ j=(j+ctx->S[i]+key[i%keylen])&0xff; uint8_t t=ctx->S[i];ctx->S[i]=ctx->S[j];ctx->S[j]=t; } ctx->i=ctx->j=0; } void rc4_crypt(RC4_CTX *ctx, uint8_t *data, int len) { for(int n=0;ni=(ctx->i+1)&0xff; ctx->j=(ctx->j+ctx->S[ctx->i])&0xff; uint8_t t=ctx->S[ctx->i];ctx->S[ctx->i]=ctx->S[ctx->j];ctx->S[ctx->j]=t; data[n]^=ctx->S[(ctx->S[ctx->i]+ctx->S[ctx->j])&0xff]; } } int main(){ RC4_CTX ctx; uint8_t key[]="SecretKey"; uint8_t data[]="Hello, RC4 stream cipher!"; int len=strlen((char*)data); rc4_init(&ctx,key,9); rc4_crypt(&ctx,data,len); printf("RC4 encrypted: ");for(int i=0;i #include #include // DES initial permutation table (subset for structure) static const int IP[64]={ 58,50,42,34,26,18,10,2,60,52,44,36,28,20,12,4, 62,54,46,38,30,22,14,6,64,56,48,40,32,24,16,8, 57,49,41,33,25,17,9,1,59,51,43,35,27,19,11,3, 61,53,45,37,29,21,13,5,63,55,47,39,31,23,15,7 }; static const int E[48]={ 32,1,2,3,4,5,4,5,6,7,8,9,8,9,10,11,12,13, 12,13,14,15,16,17,16,17,18,19,20,21,20,21,22,23,24,25, 24,25,26,27,28,29,28,29,30,31,32,1 }; // DES S-boxes (S1 only for demo) static const uint8_t SBOX1[4][16]={ {14,4,13,1,2,15,11,8,3,10,6,12,5,9,0,7}, {0,15,7,4,14,2,13,1,10,6,12,11,9,5,3,8}, {4,1,14,8,13,6,2,11,15,12,9,7,3,10,5,0}, {15,12,8,2,4,9,1,7,5,11,3,14,10,0,6,13} }; void des_demo(uint8_t block[8], uint8_t key[8]) { // Simplified DES-like round for structure uint8_t L[4], R[4]; memcpy(L, block, 4); memcpy(R, block+4, 4); for(int round=0; round<16; round++) { uint8_t temp[4]; memcpy(temp, R, 4); for(int i=0;i<4;i++) R[i] = L[i] ^ SBOX1[round%4][R[i]%16] ^ key[i]; memcpy(L, temp, 4); } memcpy(block, L, 4); memcpy(block+4, R, 4); } int main(){ uint8_t block[8]={0x01,0x23,0x45,0x67,0x89,0xAB,0xCD,0xEF}; uint8_t key[8]={0x13,0x34,0x57,0x79,0x9B,0xBC,0xDF,0xF1}; des_demo(block,key); printf("DES output: ");for(int i=0;i<8;i++)printf("%02x",block[i]);printf("\n"); return 0; } """ crypto_sources["custom_sha1.c"] = r""" #include #include #include #define ROTL32(x,n) (((x)<<(n))|((x)>>(32-(n)))) void sha1_block(uint32_t h[5], const uint8_t block[64]) { uint32_t w[80]; for(int i=0;i<16;i++) w[i]=(block[4*i]<<24)|(block[4*i+1]<<16)|(block[4*i+2]<<8)|block[4*i+3]; for(int i=16;i<80;i++) w[i]=ROTL32(w[i-3]^w[i-8]^w[i-14]^w[i-16],1); uint32_t a=h[0],b=h[1],c=h[2],d=h[3],e=h[4]; for(int i=0;i<80;i++){ uint32_t f,k; if(i<20){f=(b&c)|((~b)&d);k=0x5A827999;} else if(i<40){f=b^c^d;k=0x6ED9EBA1;} else if(i<60){f=(b&c)|(b&d)|(c&d);k=0x8F1BBCDC;} else{f=b^c^d;k=0xCA62C1D6;} uint32_t t=ROTL32(a,5)+f+e+k+w[i];e=d;d=c;c=ROTL32(b,30);b=a;a=t; } h[0]+=a;h[1]+=b;h[2]+=c;h[3]+=d;h[4]+=e; } int main(){ uint32_t h[5]={0x67452301,0xEFCDAB89,0x98BADCFE,0x10325476,0xC3D2E1F0}; uint8_t block[64]={0}; const char *msg="abc"; memcpy(block,msg,3);block[3]=0x80;block[62]=0;block[63]=24; sha1_block(h,block); printf("SHA-1: ");for(int i=0;i<5;i++)printf("%08x",h[i]);printf("\n"); return 0; } """ crypto_sources["custom_chacha20.c"] = r""" #include #include #include #define QR(a,b,c,d) (a+=b,d^=a,d=((d)<<16)|((d)>>16), \ c+=d,b^=c,b=((b)<<12)|((b)>>20), \ a+=b,d^=a,d=((d)<<8)|((d)>>24), \ c+=d,b^=c,b=((b)<<7)|((b)>>25)) void chacha20_block(uint32_t out[16], const uint32_t in[16]) { uint32_t x[16]; memcpy(x, in, 64); for(int i=0; i<10; i++) { QR(x[0],x[4],x[8],x[12]); QR(x[1],x[5],x[9],x[13]); QR(x[2],x[6],x[10],x[14]); QR(x[3],x[7],x[11],x[15]); QR(x[0],x[5],x[10],x[15]); QR(x[1],x[6],x[11],x[12]); QR(x[2],x[7],x[8],x[13]); QR(x[3],x[4],x[9],x[14]); } for(int i=0;i<16;i++) out[i]=x[i]+in[i]; } int main(){ uint32_t state[16]={0x61707865,0x3320646e,0x79622d32,0x6b206574, 1,2,3,4,5,6,7,8,0,0,0x09000000,0x4a000000}; uint32_t out[16]; chacha20_block(out, state); printf("ChaCha20 block: ");for(int i=0;i<16;i++)printf("%08x ",out[i]);printf("\n"); return 0; } """ crypto_sources["custom_blowfish.c"] = r""" #include #include #include // Blowfish P-array init values (subset) static uint32_t P[18]={ 0x243F6A88,0x85A308D3,0x13198A2E,0x03707344,0xA4093822,0x299F31D0, 0x082EFA98,0xEC4E6C89,0x452821E6,0x38D01377,0xBE5466CF,0x34E90C6C, 0xC0AC29B7,0xC97C50DD,0x3F84D5B5,0xB5470917,0x9216D5D9,0x8979FB1B }; // S-box 0 (first 16 values for demo) static uint32_t S0[256]; void bf_init(const uint8_t *key, int keylen) { for(int i=0;i<256;i++) S0[i]=i*0x01010101; for(int i=0;i<18;i++) P[i]^=((uint32_t)key[i%keylen]<<24)|((uint32_t)key[(i+1)%keylen]<<16)| ((uint32_t)key[(i+2)%keylen]<<8)|key[(i+3)%keylen]; } uint32_t bf_f(uint32_t x) { return S0[(x>>24)&0xff]+S0[(x>>16)&0xff]^S0[(x>>8)&0xff]+S0[x&0xff]; } void bf_encrypt(uint32_t *L, uint32_t *R) { for(int i=0;i<16;i+=2){ *L^=P[i]; *R^=bf_f(*L)^P[i+1]; uint32_t t=*L;*L=*R;*R=t; } uint32_t t=*L;*L=*R;*R=t; *R^=P[16]; *L^=P[17]; } int main(){ bf_init((uint8_t*)"TestKey!",8); uint32_t L=0xFEDCBA98,R=0x76543210; bf_encrypt(&L,&R); printf("Blowfish: %08x%08x\n",L,R); return 0; } """ crypto_sources["custom_xor_cipher.c"] = r""" #include #include #include // XOR cipher with key expansion (simple but still crypto) void xor_encrypt(uint8_t *data, int len, const uint8_t *key, int keylen) { for(int i=0; i> 5); // rotate data[i] ^= (uint8_t)(i * 0x37 + 0x42); } } int main() { uint8_t data[] = "Sensitive data to encrypt with XOR cipher"; uint8_t key[] = "MySecretKey123"; int len = strlen((char*)data); xor_encrypt(data, len, key, strlen((char*)key)); printf("XOR cipher output: "); for(int i=0; i #include #include #include int main() { // Generate random key material unsigned char key[32]; RAND_bytes(key, 32); printf("Random key: "); for(int i=0; i<32; i++) printf("%02x", key[i]); printf("\n"); // Generate DH params EVP_PKEY *params = NULL; EVP_PKEY_CTX *pctx = EVP_PKEY_CTX_new_id(EVP_PKEY_DH, NULL); EVP_PKEY_paramgen_init(pctx); EVP_PKEY_CTX_set_dh_paramgen_prime_len(pctx, 1024); printf("DH parameter generation initialized\n"); EVP_PKEY_CTX_free(pctx); return 0; } """ crypto_sources["tls_client.c"] = r""" #include #include #include int main() { SSL_library_init(); SSL_load_error_strings(); OpenSSL_add_all_algorithms(); const SSL_METHOD *method = TLS_client_method(); SSL_CTX *ctx = SSL_CTX_new(method); if(!ctx) { printf("SSL_CTX creation failed\n"); return 1; } printf("TLS client context created with method: %s\n", SSL_get_version(SSL_new(ctx))); SSL_CTX_free(ctx); EVP_cleanup(); return 0; } """ # ============================================================ # NON-CRYPTO SOURCE FILES — no cryptographic operations # ============================================================ noncrypto_sources = {} noncrypto_sources["bubble_sort.c"] = r""" #include void bubble_sort(int arr[], int n) { for(int i=0; iarr[j+1]) { int t=arr[j]; arr[j]=arr[j+1]; arr[j+1]=t; } } int main() { int arr[] = {64, 34, 25, 12, 22, 11, 90, 1, 55, 33}; int n = 10; bubble_sort(arr, n); printf("Sorted: "); for(int i=0; i void swap(int *a, int *b) { int t=*a; *a=*b; *b=t; } int partition(int arr[], int low, int high) { int pivot=arr[high], i=low-1; for(int j=low; j #include void merge(int arr[], int l, int m, int r) { int n1=m-l+1, n2=r-m; int *L=malloc(n1*sizeof(int)), *R=malloc(n2*sizeof(int)); for(int i=0;i #include typedef struct Node { int data; struct Node *next; } Node; Node* insert(Node *head, int val) { Node *n = malloc(sizeof(Node)); n->data = val; n->next = head; return n; } void print_list(Node *head) { while(head) { printf("%d -> ", head->data); head = head->next; } printf("NULL\n"); } void free_list(Node *head) { while(head) { Node *t=head; head=head->next; free(t); } } int main() { Node *head = NULL; for(int i=10; i>=1; i--) head = insert(head, i); print_list(head); free_list(head); return 0; } """ noncrypto_sources["binary_tree.c"] = r""" #include #include typedef struct Node { int key; struct Node *left, *right; } Node; Node* newNode(int k) { Node *n=malloc(sizeof(Node)); n->key=k; n->left=n->right=NULL; return n; } Node* insert(Node *root, int k) { if(!root) return newNode(k); if(kkey) root->left=insert(root->left,k); else if(k>root->key) root->right=insert(root->right,k); return root; } void inorder(Node *root) { if(root) { inorder(root->left); printf("%d ",root->key); inorder(root->right); } } int main() { Node *root=NULL; int keys[]={50,30,20,40,70,60,80}; for(int i=0;i<7;i++) root=insert(root,keys[i]); printf("Inorder: "); inorder(root); printf("\n"); return 0; } """ noncrypto_sources["matrix_mult.c"] = r""" #include #define N 4 void multiply(int A[N][N], int B[N][N], int C[N][N]) { for(int i=0;i #include #include int count_words(const char *s) { int c=0, in=0; while(*s) { if(isspace(*s)) in=0; else if(!in) { in=1; c++; } s++; } return c; } void reverse(char *s) { int n=strlen(s); for(int i=0;i long long fib_iter(int n) { if(n<=1) return n; long long a=0,b=1; for(int i=2;i<=n;i++) { long long t=a+b; a=b; b=t; } return b; } long long fib_rec(int n) { return n<=1?n:fib_rec(n-1)+fib_rec(n-2); } int main() { printf("Iterative fib(30)=%lld\n", fib_iter(30)); printf("Recursive fib(20)=%lld\n", fib_rec(20)); for(int i=0;i<20;i++) printf("%lld ", fib_iter(i)); printf("\n"); return 0; } """ noncrypto_sources["file_copy.c"] = r""" #include #include int main() { FILE *src = tmpfile(), *dst = tmpfile(); if(!src||!dst) { printf("tmpfile failed\n"); return 1; } const char *data = "This is test data for file copy operations.\nLine 2\nLine 3\n"; fputs(data, src); rewind(src); char buf[1024]; size_t n; while((n=fread(buf,1,sizeof(buf),src))>0) fwrite(buf,1,n,dst); rewind(dst); while(fgets(buf,sizeof(buf),dst)) printf("%s", buf); fclose(src); fclose(dst); return 0; } """ noncrypto_sources["calculator.c"] = r""" #include #include double add(double a, double b) { return a+b; } double sub(double a, double b) { return a-b; } double mul(double a, double b) { return a*b; } double divide(double a, double b) { return b!=0?a/b:0; } double power(double a, double b) { return pow(a,b); } int main() { printf("10+5=%.1f\n", add(10,5)); printf("10-5=%.1f\n", sub(10,5)); printf("10*5=%.1f\n", mul(10,5)); printf("10/3=%.4f\n", divide(10,3)); printf("2^10=%.0f\n", power(2,10)); printf("sqrt(144)=%.0f\n", sqrt(144)); printf("sin(pi/4)=%.4f\n", sin(M_PI/4)); return 0; } """ noncrypto_sources["hashtable.c"] = r""" #include #include #include #define TABLE_SIZE 64 typedef struct Entry { char *key; int value; struct Entry *next; } Entry; Entry *table[TABLE_SIZE]; unsigned hash(const char *key) { unsigned h=0; while(*key) h = h*31 + *key++; return h % TABLE_SIZE; } void put(const char *key, int value) { unsigned idx = hash(key); Entry *e = malloc(sizeof(Entry)); e->key = strdup(key); e->value = value; e->next = table[idx]; table[idx] = e; } int get(const char *key) { unsigned idx = hash(key); for(Entry *e=table[idx]; e; e=e->next) if(strcmp(e->key, key)==0) return e->value; return -1; } int main() { put("apple", 1); put("banana", 2); put("cherry", 3); put("date", 4); put("elderberry", 5); printf("apple=%d banana=%d cherry=%d\n", get("apple"), get("banana"), get("cherry")); return 0; } """ noncrypto_sources["prime_sieve.c"] = r""" #include #include #define MAX 10000 int sieve[MAX]; void eratosthenes() { memset(sieve, 1, sizeof(sieve)); sieve[0]=sieve[1]=0; for(int i=2;i*i #include #define MAX 100 typedef struct { int data[MAX]; int top; } Stack; void init(Stack *s) { s->top=-1; } int push(Stack *s, int v) { if(s->top>=MAX-1) return 0; s->data[++s->top]=v; return 1; } int pop(Stack *s, int *v) { if(s->top<0) return 0; *v=s->data[s->top--]; return 1; } int peek(Stack *s) { return s->top>=0?s->data[s->top]:-1; } int main() { Stack s; init(&s); for(int i=1;i<=10;i++) push(&s,i*i); printf("Stack (top to bottom): "); int v; while(pop(&s,&v)) printf("%d ",v); printf("\n"); return 0; } """ noncrypto_sources["graph_bfs.c"] = r""" #include #define V 6 int adj[V][V]={{0,1,1,0,0,0},{1,0,0,1,1,0},{1,0,0,0,1,0},{0,1,0,0,0,1},{0,1,1,0,0,1},{0,0,0,1,1,0}}; void bfs(int start) { int visited[V]={0}, queue[V], front=0, rear=0; visited[start]=1; queue[rear++]=start; printf("BFS from %d: ", start); while(front #include #include // Simple JSON-like key extractor void extract_keys(const char *json) { int in_key=0; const char *p=json; while(*p) { if(*p=='"') { if(!in_key) { in_key=1; printf("Key: "); } else { in_key=0; printf("\n"); while(*p && *p!=':' && *p!=',') p++; } } else if(in_key) putchar(*p); p++; } } int main() { const char *json = "{\"name\":\"Alice\",\"age\":30,\"city\":\"NYC\",\"score\":95.5}"; printf("Parsing: %s\n", json); extract_keys(json); return 0; } """ noncrypto_sources["compression_rle.c"] = r""" #include #include int rle_encode(const char *in, char *out, int maxout) { int oi=0, n=strlen(in); for(int i=0; i #include int match_star(char c, const char *regex, const char *text); int match_here(const char *regex, const char *text) { if(regex[0]=='\0') return 1; if(regex[1]=='*') return match_star(regex[0], regex+2, text); if(regex[0]=='$' && regex[1]=='\0') return *text=='\0'; if(*text!='\0' && (regex[0]=='.' || regex[0]==*text)) return match_here(regex+1, text+1); return 0; } int match_star(char c, const char *regex, const char *text) { do { if(match_here(regex, text)) return 1; } while(*text!='\0' && (*text++==c || c=='.')); return 0; } int match(const char *regex, const char *text) { if(regex[0]=='^') return match_here(regex+1, text); do { if(match_here(regex, text)) return 1; } while(*text++!='\0'); return 0; } int main() { printf("match 'ab*c' in 'abbbbc': %d\n", match("ab*c", "abbbbc")); printf("match '^hello' in 'hello world': %d\n", match("^hello", "hello world")); printf("match 'x.z' in 'xyz': %d\n", match("x.z", "xyz")); return 0; } """ noncrypto_sources["memory_pool.c"] = r""" #include #include #include #define POOL_SIZE 4096 #define BLOCK_SIZE 64 typedef struct { char pool[POOL_SIZE]; int used[POOL_SIZE/BLOCK_SIZE]; int count; } MemPool; void pool_init(MemPool *p) { memset(p->used,0,sizeof(p->used)); p->count=POOL_SIZE/BLOCK_SIZE; } void* pool_alloc(MemPool *p) { for(int i=0;icount;i++) if(!p->used[i]) { p->used[i]=1; return p->pool+i*BLOCK_SIZE; } return NULL; } void pool_free(MemPool *p, void *ptr) { int idx=((char*)ptr-p->pool)/BLOCK_SIZE; if(idx>=0&&idxcount) p->used[idx]=0; } int main() { MemPool pool; pool_init(&pool); void *ptrs[10]; for(int i=0;i<10;i++) { ptrs[i]=pool_alloc(&pool); printf("Alloc %d: %p\n",i,ptrs[i]); } for(int i=0;i<10;i+=2) pool_free(&pool,ptrs[i]); printf("Freed even blocks, re-allocating...\n"); for(int i=0;i<5;i++) printf("Re-alloc: %p\n", pool_alloc(&pool)); return 0; } """ noncrypto_sources["image_process.c"] = r""" #include #include #define W 100 #define H 100 unsigned char img[H][W]; void fill(unsigned char val) { for(int i=0;it?255:0; } int main() { fill(128); draw_rect(10,10,30,30,255); draw_rect(50,50,40,40,0); printf("Avg brightness: %.1f\n", avg_brightness()); threshold(128); printf("After threshold: %.1f\n", avg_brightness()); return 0; } """ noncrypto_sources["signal_process.c"] = r""" #include #include #define N 256 double signal_data[N]; void generate_signal() { for(int i=0;i=0&&idx/dev/null" ret = subprocess.run(cmd, shell=True, capture_output=True) if ret.returncode == 0: results.append({ "binary_path": out_path, "binary_name": out_name, "source": os.path.basename(src_path), "label": label, "label_name": "crypto" if label == 1 else "non_crypto", "opt_level": cfg["suffix"], "compile_flags": cfg["flags"], }) compiled += 1 else: failed += 1 return results # Compile crypto sources for name in sorted(crypto_sources.keys()): src = os.path.join(CRYPTO_DIR, name) base = name.replace(".c", "") metadata.extend(compile_source(src, base, 1, compile_configs)) # Compile non-crypto sources for name in sorted(noncrypto_sources.keys()): src = os.path.join(NONCRYPTO_DIR, name) base = name.replace(".c", "") metadata.extend(compile_source(src, base, 0, compile_configs)) print(f"\nCompiled: {compiled} binaries ({failed} failed)") print(f"Crypto: {sum(1 for m in metadata if m['label']==1)}") print(f"Non-crypto: {sum(1 for m in metadata if m['label']==0)}") # Save metadata with open("/app/binary_metadata.json", "w") as f: json.dump(metadata, f, indent=2) print(f"\nMetadata saved to /app/binary_metadata.json")