diff --git a/bdk/sec/se.c b/bdk/sec/se.c index bc6fa44..24782dd 100644 --- a/bdk/sec/se.c +++ b/bdk/sec/se.c @@ -198,6 +198,27 @@ void se_aes_key_set(u32 ks, void *key, u32 size) } } +void se_aes_iv_set(u32 ks, void *iv) +{ + u32 *data = (u32 *)iv; + + for (u32 i = 0; i < TEGRA_SE_AES_MIN_KEY_SIZE / 4; i++) + { + SE(SE_KEYTABLE_REG_OFFSET) = SE_KEYTABLE_SLOT(ks) | SE_KEYTABLE_QUAD(QUAD_ORG_IV) | i; + SE(SE_KEYTABLE_DATA0_REG_OFFSET) = data[i]; + } +} + +void se_aes_key_get(u32 ks, void *key, u32 size) +{ + u32 *data = (u32 *)key; + for (u32 i = 0; i < size / 4; i++) + { + SE(SE_KEYTABLE_REG_OFFSET) = SE_KEYTABLE_SLOT(ks) | i; + data[i] = SE(SE_KEYTABLE_DATA0_REG_OFFSET); + } +} + void se_aes_key_clear(u32 ks) { for (u32 i = 0; i < TEGRA_SE_AES_MAX_KEY_SIZE / 4; i++) @@ -207,6 +228,16 @@ void se_aes_key_clear(u32 ks) } } +void se_aes_iv_clear(u32 ks) +{ + for (u32 i = 0; i < TEGRA_SE_AES_MIN_KEY_SIZE / 4; i++) + { + SE(SE_KEYTABLE_REG_OFFSET) = SE_KEYTABLE_SLOT(ks) | SE_KEYTABLE_QUAD(QUAD_ORG_IV) | i; + SE(SE_KEYTABLE_DATA0_REG_OFFSET) = 0; + } +} + + int se_aes_unwrap_key(u32 ks_dst, u32 ks_src, const void *input) { SE(SE_CONFIG_REG_OFFSET) = SE_CONFIG_DEC_ALG(ALG_AES_DEC) | SE_CONFIG_DST(DST_KEYTAB); @@ -336,6 +367,7 @@ int se_calc_sha256(void *hash, u32 *msg_left, const void *src, u32 src_size, u64 int res; u32 *hash32 = (u32 *)hash; + //! TODO: src_size must be 512 bit aligned if continuing and not last block for SHA256. if (src_size > 0xFFFFFF || (u32)hash % 4 || !hash) // Max 16MB - 1 chunks and aligned x4 hash buffer. return 0; diff --git a/bdk/sec/se.h b/bdk/sec/se.h index ba35088..4d3a92c 100644 --- a/bdk/sec/se.h +++ b/bdk/sec/se.h @@ -24,8 +24,12 @@ void se_key_acc_ctrl(u32 ks, u32 flags); u32 se_key_acc_ctrl_get(u32 ks); void se_get_aes_keys(u8 *buf, u8 *keys, u32 keysize); void se_aes_key_set(u32 ks, void *key, u32 size); +void se_aes_iv_set(u32 ks, void *iv); +void se_aes_key_get(u32 ks, void *key, u32 size); void se_aes_key_clear(u32 ks); +void se_aes_iv_clear(u32 ks); int se_aes_unwrap_key(u32 ks_dst, u32 ks_src, const void *input); +int se_aes_crypt_cbc(u32 ks, u32 enc, void *dst, u32 dst_size, const void *src, u32 src_size); int se_aes_crypt_ecb(u32 ks, u32 enc, void *dst, u32 dst_size, const void *src, u32 src_size); int se_aes_crypt_block_ecb(u32 ks, u32 enc, void *dst, const void *src); int se_aes_crypt_ctr(u32 ks, void *dst, u32 dst_size, const void *src, u32 src_size, void *ctr);