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;  | ||