Line 959:
Line 959:
cxor($c6, $c6);
cxor($c6, $c6);
cxor($c7, $c7);
cxor($c7, $c7);
+
+
return;
+
</pre>
+
+
==== gen_tsec_key ====
+
This is the method responsible for generating the final TSEC key. It takes '''key_addr''' and '''key_type''' as arguments.
+
<pre>
+
// This will use TSEC DMA to look for 0x34C2E1DA in host1x scratch space
+
u32 host1x_res = check_host1x_magic();
+
+
// Failed to find magic word
+
if (host1x_res != 0)
+
return;
+
+
u32 crypto_reg_flag = 0x00000000;
+
+
// The next 0x02 xfer instructions will be overridden
+
// and target changes from DMA to crypto register
+
cxset(0x02);
+
+
// Transfer data to crypto register c0
+
xdst(0, (key_addr | crypto_reg_flag));
+
+
// Wait for all data loads/stores to finish
+
xdwait();
+
+
crypto_reg_flag = 0x00020000;
+
+
if (key_type == 0x01) // HOVI_EKS_01
+
{
+
// Load selected secret into crypto register c1
+
csecret($c1, 0x3F);
+
+
// Encrypt the auth signature with c1 and store in c1
+
csigenc($c1, $c1);
+
+
// Load selected secret into crypto register c2
+
csecret($c2, 0x00);
+
+
// Bind c2 register as the key for enc/dec operations
+
ckeyreg($c2);
+
+
// Encrypt the seed from key_addr and store in c2
+
cenc($c2, $c0);
+
+
// Bind c2 register as the key for enc/dec operations
+
ckeyreg($c2);
+
+
// Encrypt the auth signature with c2 and store in c2
+
csigenc($c2, $c2);
+
+
// Encrypt c1 and store in c2
+
cenc($c2, $c1);
+
+
// The next 0x02 xfer instructions will be overridden
+
// and target changes from DMA to crypto register
+
cxset(0x02);
+
+
// Transfer data from crypto register c2
+
xdld(0, (key_addr | crypto_reg_flag));
+
+
// Wait for all data loads/stores to finish
+
xdwait();
+
}
+
else if (key == 0x02) // HOVI_COMMON_01
+
{
+
// Load selected secret into crypto register c2
+
csecret($c2, 0x00);
+
+
// Bind c2 register as the key for enc/dec operations
+
ckeyreg($c2);
+
+
// Encrypt the seed from key_addr and store in c2
+
cenc($c2, $c0);
+
+
// Bind c2 register as the key for enc/dec operations
+
ckeyreg($c2);
+
+
// Encrypt the auth signature with c2 and store in c2
+
csigenc($c2, $c2);
+
+
// Encrypt c1 and store in c2
+
cenc($c2, $c1);
+
+
// The next 0x02 xfer instructions will be overridden
+
// and target changes from DMA to crypto register
+
cxset(0x02);
+
+
// Transfer data from crypto register c2
+
xdld(0, (key_addr | crypto_reg_flag));
+
+
// Wait for all data loads/stores to finish
+
xdwait();
+
}
+
+
// Use TSEC DMA to write the key in SOR1 registers
+
sor1_set_key(key_addr);
return;
return;