145 lines
4.3 KiB
C
145 lines
4.3 KiB
C
/*
|
||
* 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__
|
||
|
||
//////////////////////////////////////////////////////////////////////////////
|
||
|