/*
* Copyright (c) 2013 a3955269 all rights reversed, no rights reserved.
*/
#ifndef __LIBCRYPT_SAMSUNG_H__
#define __LIBCRYPT_SAMSUNG_H__
//////////////////////////////////////////////////////////////////////////////
// Name Address Ordinal
// ---- ------- -------
// SECKM_AES_set_encrypt_key 000010D8
// SECKM_AES_set_decrypt_key 00001464
// SECKM_AES_encrypt 00001600
// SECKM_AES_decrypt 00001A10
// SECKM_aes_selftest 00001D94
// verify_EDK 00001F7C
// encrypt_dek 00001FC8
// decrypt_EDK 000020D4
// change_EDK 0000218C
// generate_dek_salt 000022A4
// create_EDK 000023A0
// free_DEK 000024DC
// alloc_DEK 000024F4
// SECKM_HMAC_SHA256 00002500
// SECKM_HMAC_SHA256_selftest 00002690
// pbkdf 000026FC
// pbkdf_selftest 00002898
// _SECKM_PRNG_get16 00002958
// SECKM_PRNG_get16 00002C48
// _SECKM_PRNG_init 00002C54
// SECKM_PRNG_selftest 00002F38
// SECKM_PRNG_set_seed 00002FF0
// SECKM_PRNG_init 00002FF8
// SECKM_SHA256_Transform 00003004
// SECKM_SHA256_Final 000031D8
// SECKM_SHA256_Update 00003330
// SECKM_SHA256_Init 000033FC
// SECKM_SHA2_selftest 00003430
// integrity_check 00003488
// update_system_property 00003580
// setsec_km_fips_status 00003630
// _all_checks 00003684
// get_fips_status 000036D4
// EDK Payload is defined as:
// Encrypted DEK – EDK itself
// HMAC of EDK (32 bytes ???)
// Salt 16 bytes
#define EDK_MAGIC 0x1001e4b1
#pragma pack(1)
typedef struct {
unsigned int magic; // EDK_MAGIC
unsigned int flags; // 2
unsigned int zeros[6];
} dek_t;
typedef struct {
unsigned char data[32];
} edk_t;
// size 0x70 -> 112
typedef struct {
dek_t dek;
edk_t edk;
unsigned char hmac[32];
unsigned char salt[16];
} edk_payload_t;
#pragma pack()
//////////////////////////////////////////////////////////////////////////////
int decrypt_EDK(
dek_t *dek, const edk_payload_t *edk, /*const*/ char *passwd);
typedef int (*decrypt_EDK_t)(
dek_t *dek, const edk_payload_t *edk, /*const*/ char *passwd);
int verify_EDK(const edk_payload_t *edk, const char *passwd);
//change_EDK()
//create_EDK()
// internally just mallocs 32 bytes
dek_t *alloc_DEK();
void free_DEK(dek_t *dek);
//encrypt_dek()
//generate_dek_salt()
//pbkdf(_buf_, "passwordPASSWORDpassword", 0x18, "saltSALTsaltSALTsaltSALTsaltSALTsalt", 0x24, 0x1000, 0x140);
int pbkdf(
void *buf, void *pw, int pwlen, void *salt, int saltlen, int hashcnt,
int keylen);
// getprop("rw.km_fips_status")
// "ready, undefined, error_selftest, error_integrity"
int get_fips_status();
//////////////////////////////////////////////////////////////////////////////
//
// libsec_ecryptfs.so (internally uses libkeyutils.so)
//
// Name Address Ordinal
// ---- ------- -------
// unmount_ecryptfs_drive 00000A78
// mount_ecryptfs_drive 00000B48
// fips_read_edk 00000E44
// fips_save_edk 00000EA4
// fips_create_edk 00000F20
// fips_change_password 00001018
// fips_delete_edk 00001124
//
// might depend on /data beeing mounted for reading /data/system/edk_p_sd
//
// filter
// 0: building options without file encryption filtering.
// 1: building options with media files filtering.
// 2: building options with all new files filtering.
int mount_ecryptfs_drive(
const char *passwd, const char *source, const char *target, int filter);
typedef int (*mount_ecryptfs_drive_t)(
const char *passwd, const char *source, const char *target, int filter);
// calls 2 times umount2(source, MNT_EXPIRE)
int unmount_ecryptfs_drive(
const char *source);
typedef int (*unmount_ecryptfs_drive_t)(
const char *source);
//////////////////////////////////////////////////////////////////////////////
#endif // #ifndef __LIBCRYPT_SAMSUNG_H__
//////////////////////////////////////////////////////////////////////////////