Cryptosystem: Difference between revisions
 Improve SBK/SSK stuff.  | 
				 Document SSK generation.  | 
				||
| Line 12: | Line 12: | ||
The SSK is derived on boot via the SBK, the 32-bit console-unique "Device Key", and hardware information stored in fuses.  | The SSK is derived on boot via the SBK, the 32-bit console-unique "Device Key", and hardware information stored in fuses.  | ||
Pseudocode for the derivation is as follows:  | |||
  void generateSSK() {  | |||
      char keyBuffer[0x10]; // Used to store keydata  | |||
      uint hwInfoBuffer[4]; // Used to store info about hardware from fuses  | |||
      uint deviceKey = getDeviceKey(); // Reads 32-bit device key from FUSE_PRIVATE_KEY4.  | |||
      for (int i = 0; i < 4; i++) { // Keybuffer = deviceKey || deviceKey || deviceKey || deviceKey  | |||
          ((uint *)keyBuffer)[i] = deviceKey;  | |||
      }  | |||
      encryptWithSBK(keyBuffer); // keyBuffer = AES-ECB(SBK, deviceKey || {...})  | |||
      // Set up Hardware info buffer  | |||
      uint vendor_code = *((uint *)0x7000FA00) & 0x0000000F; // FUSE_VENDOR_CODE  | |||
      uint fab_code    = *((uint *)0x7000FA04) & 0x0000000F; // FUSE_FAB_CODE  | |||
      uint lot_code_0  = *((uint *)0x7000FA08) & 0xFFFFFFFF; // FUSE_LOT_CODE_0  | |||
      uint lot_code_1  = *((uint *)0x7000FA0C) & 0x0FFFFFFF; // FUSE_LOT_CODE_1  | |||
      uint wafer_id    = *((uint *)0x7000FA10) & 0x0000003F; // FUSE_WAFER_ID  | |||
      uint x_coord     = *((uint *)0x7000FA14) & 0x000001FF; // FUSE_X_COORDINATE  | |||
      uint y_coord     = *((uint *)0x7000FA18) & 0x000001FF; // FUSE_Y_COORDINATE  | |||
      uint unk_hw_fuse = *((uint *)0x7000FA20) & 0x0000003F; // Unknown cached fuse.  | |||
      // HARDWARE_INFO_BUFFER = unk_hw_fuse || Y_COORD || X_COORD || WAFER_ID || LOT_CODE || FAB_CODE || VENDOR_ID  | |||
      hwInfoBuffer[0] = (lot_code_1 << 30) | (wafer_id << 24) | (x_coord << 15) | (y_coord << 6) | unk_hw_fuse;  | |||
      hwInfoBuffer[1] = (lot_code_0 << 26) | (lot_code_1 >> 2);  | |||
      hwInfoBuffer[2] = (fab_code << 26) | (lot_code_0 >> 6);  | |||
      hwInfoBuffer[3] = vendor_code;  | |||
      for (int i = 0; i < 0x10; i++) { // keyBuffer = XOR(AES-ECB(SBK, deviceKey || {...}), HARDWARE_INFO_BUFFER)  | |||
          keyBuffer[i] ^= ((char *)hwInfoBuffer)[i];  | |||
      }  | |||
      encryptWithSBK(keyBuffer); // keyBuffer = AES-ECB(SBK, XOR(AES-ECB(SBK, deviceKey || {...}), HARDWARE_INFO_BUFFER))  | |||
      setKeyslot(KEYSLOT_SSK, keyBuffer); SSK = keyBuffer.  | |||
  }  | |||
== Falcon coprocessor ==  | == Falcon coprocessor ==  | ||
The falcon processor (TSEC) stores a special console-unique key (that will be referred to as the "tsec key").  | The falcon processor (TSEC) stores a special console-unique key (that will be referred to as the "tsec key").  | ||