TSEC Firmware: Difference between revisions

No edit summary
No edit summary
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;