summaryrefslogtreecommitdiff
path: root/cesar/cp/secu/src
diff options
context:
space:
mode:
authorschodet2009-05-25 14:56:26 +0000
committerschodet2009-05-25 14:56:26 +0000
commit61c1b6f37ba11fcb9ca7243c6404b7dfb49af4fa (patch)
tree5521e2d3a248dc671422d21ea072aa5ad6d60f74 /cesar/cp/secu/src
parent640c6d0f10f1222ddce5a96b32d3b9582c7864e8 (diff)
* cp/secu (re #368):
- added function to compute hardware decryption key. git-svn-id: svn+ssh://pessac/svn/cesar/trunk@4699 017c9cb6-072f-447c-8318-d5b54f68fe89
Diffstat (limited to 'cesar/cp/secu/src')
-rw-r--r--cesar/cp/secu/src/secu.c39
1 files changed, 39 insertions, 0 deletions
diff --git a/cesar/cp/secu/src/secu.c b/cesar/cp/secu/src/secu.c
index 2bda3e57b5..b2b3cc92c8 100644
--- a/cesar/cp/secu/src/secu.c
+++ b/cesar/cp/secu/src/secu.c
@@ -330,3 +330,42 @@ cp_secu_aes_cbc_decrypt (cp_secu_aes_t *ctx, u32 iv[4],
}
}
+/**
+ * Reverse key bits for each four key elements.
+ * \param in input key
+ * \param out output key
+ */
+extern inline void
+cp_secu_pbb_reverse (const u32 *in, u32 *out)
+{
+ u32 iw, ow;
+ uint i, j;
+ for (i = 0; i < 4; i++)
+ {
+ iw = in[i];
+ ow = 0;
+ for (j = 0; j < 32; j++)
+ {
+ ow <<= 1;
+ if (iw & 1)
+ ow |= 1;
+ iw >>= 1;
+ }
+ out[i] = ow;
+ }
+}
+
+void
+cp_secu_pbb_dec_gen (cp_key_t enc, cp_key_t *dec)
+{
+ u32 key[4];
+ cp_secu_aes_t aes;
+ /* Believe me or not, PBB key are in reversed order compared to other
+ * keys. */
+ cp_secu_pbb_reverse (enc.key, key);
+ /* Compute RKEY. */
+ aes_set_key (&aes, key);
+ /* Reverse one more time. */
+ cp_secu_pbb_reverse ((u32 *) aes.drk, dec->key);
+}
+