Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
docs:techref:bootloader:cfe [2021/12/18 18:48] – [CFE Secure Boot] mandrake-leedocs:techref:bootloader:cfe [2023/10/12 16:42] (current) – [Table] systemcrash
Line 3: Line 3:
  
   * [[wp>Common Firmware Environment]]   * [[wp>Common Firmware Environment]]
-  * [[http://www.linux-mips.org/wiki/Common_Firmware_Environment]] +  * [[http://www.linux-mips.org/wiki/Common_Firmware_Environment]] (registration dead) 
-  * [[http://www.broadcom.com/docs/SiByte/README-1.4.2.txt]]+  * Broadcom CFE sources for some test boards 
 +    * [[https://web.archive.org/web/20090510103115if_/http://www.broadcom.com/docs/SiByte/README-1.4.2.txt|README-1.4.2.txt]] (readme) 
 +    * [[https://docs.broadcom.com/docs-and-downloads/docs/eula_download/cfe-1.4.2-src.tar.bz2|cfe-1.4.2-src.tar.bz2]] ''1.9M'' (source) 
 +    * [[https://docs.broadcom.com/docs-and-downloads/docs/eula_download/samplesw-1.3.tar.bz2|samplesw-1.3.tar.bz2]] ''0.3M'' (examples in C and [[../instructionset/mips64_mips64|MIPS64]] assembly) 
 +    * [[https://docs.broadcom.com/docs-and-downloads/docs/eula_download/broadcom_2006a_410_RELEASE-NOTES.txt|broadcom_2006a_410_RELEASE-NOTES.txt]] (tool readme) 
 +    * [[https://docs.broadcom.com/docs-and-downloads/docs/eula_download/broadcom_2006a_410.src.tar.bz2|broadcom_2006a_410.src.tar.bz2]] ''69.2M'' (tool source)
  
 ===== Using the CFE ===== ===== Using the CFE =====
-[[http://melbourne.wireless.org.au/files/wrt54/cfe.pdf]]+[[https://web.archive.org/web/20071114051120if_/http://melbourne.wireless.org.au/files/wrt54/cfe.pdf|CFE Functional Specification]]
  
 [[https://github.com/blackfuel/asuswrt-rt-ax88u/blob/master/release/src-rt-5.02axhnd/docs/customerDocs/BCM963XX_bootloader_appnote-963XX-AN102-SWRDS.pdf|BCM963XX Bootloader Appnote]] [[https://github.com/blackfuel/asuswrt-rt-ax88u/blob/master/release/src-rt-5.02axhnd/docs/customerDocs/BCM963XX_bootloader_appnote-963XX-AN102-SWRDS.pdf|BCM963XX Bootloader Appnote]]
Line 104: Line 109:
  
 ===== bcm63xx CFE ===== ===== bcm63xx CFE =====
-bcm63xx CFE is totally different when compared with bcm47xx. The NVRAM is totally different, without any settings stored outside the CFE partition, they are totally embedded into CFE. The CLI has different commands, probably with less options. And almost always there is a web server available for flashing. Less options but more fool-proof.+bcm63xx CFE is totally different to bcm47xx. The NVRAM is different, with no settings stored outside the CFE partition, they are embedded into CFE. The CLI has different commands, probably with fewer options. And almost always there is a web server available for flashing. Fewer options but more fool-proof.
  
 To access CFE you need to attach a [[docs:techref:hardware:port.serial|serial]] console. To get a prompt just press any key while powering the device up. To access CFE you need to attach a [[docs:techref:hardware:port.serial|serial]] console. To get a prompt just press any key while powering the device up.
Line 110: Line 115:
 This is a typical output when starting up the CFE and entering the CLI: This is a typical output when starting up the CFE and entering the CLI:
  
-<code>DGND3700 Boot Code V1.0.8+<code>DGND3700 Boot Code V1.0.8
 CFE version 1.0.37-104.4 for BCM96368 (32bit,SP,BE) CFE version 1.0.37-104.4 for BCM96368 (32bit,SP,BE)
 Build Date: Mon Feb 21 17:59:46 CST 2011 (finerain@moonlight) Build Date: Mon Feb 21 17:59:46 CST 2011 (finerain@moonlight)
Line 141: Line 146:
 Auto run second count down: 1 Auto run second count down: 1
 CFE>  CFE> 
-CFE></code> +CFE> 
 +</code>
 ==== Using CFE web (http) server ==== ==== Using CFE web (http) server ====
 It's probably the most user friendly way of installing firmware. But sometimes some manufacturers decide to disable it (very uncommon).  It's probably the most user friendly way of installing firmware. But sometimes some manufacturers decide to disable it (very uncommon). 
Line 202: Line 207:
 | 0x4       | 0x4      | :::           | Magic number 2 | 0x0006CC7E | In decimal = 445566                                                                                                     | | 0x4       | 0x4      | :::           | Magic number 2 | 0x0006CC7E | In decimal = 445566                                                                                                     |
 | 0x8       | 0x4      | :::           | Version        | 0x00000001 |                                                                                                      | | 0x8       | 0x4      | :::           | Version        | 0x00000001 |                                                                                                      |
-| 0x0c      | 0x4      | :::           SBI length     | variable   | Length in bytes of the SBI chunk                                                                     |+| 0x0c      | 0x4      | :::           SBI_length     | variable   | Length in bytes of Unauth Header + SBI                                                                     |
 | 0x10      | 0x4      | :::           | JAM CRC32      | variable   | JAM CRC32 of all the previous elements                                                               | | 0x10      | 0x4      | :::           | JAM CRC32      | variable   | JAM CRC32 of all the previous elements                                                               |
 | 0x14      | variable |      SBI      |                |            |                                                                                                      | | 0x14      | variable |      SBI      |                |            |                                                                                                      |
Line 214: Line 219:
 | 0x41c     | 0x100    | :::              | op.cot.sig     | variable   | SHA256 signature of op.cot.bin. Key must be in SoC                                                                       | | 0x41c     | 0x100    | :::              | op.cot.sig     | variable   | SHA256 signature of op.cot.bin. Key must be in SoC                                                                       |
 | 0x51c     | variable | :::              | cferom.bin     | variable   | This is the actual machine code that will be executed                                                | | 0x51c     | variable | :::              | cferom.bin     | variable   | This is the actual machine code that will be executed                                                |
-end-0x104 | 0x100    | :::              | SHA256 sig     | variable   | This is the SHA256 signature of al the previous SBI elements. Key is the one declared in mfg.oem.bin | +SBI_length-0x104 | 0x100    | :::              | SHA256 sig     | variable   | This is the SHA256 signature of all the previous SBI elements. Key is the one declared in mfg.oem.bin | 
-end-0x4   | 0x4      | :::              | JAM CRC32      | variable   | This is the JAM CRC32 of all the previous SBI elements except SHA256 sig.                            |+SBI_length-0x4   | 0x4      | :::              | JAM CRC32      | variable   | This is the JAM CRC32 of all the previous SBI elements except SHA256 sig.                            |
  
 From the sources, we can reverse the structure of mfg.oem.bin: From the sources, we can reverse the structure of mfg.oem.bin:
Line 230: Line 235:
 WIP WIP
  
 +\\
 +=== In the search of the RoT password ===
 +If the PBL password was known, **we could develop any bootloader** with or without the CoT characteristic. It is most likely that this will never be exposed being Broadcom so obscure with their products.
 +
 +However, we must remain attentive to the GPL bundles that pop up from time to time.
 +
 +More precisely, in the following repo [[https://github.com/blackfuel/asuswrt-rt-ax88u/tree/master/release/src-rt-5.02axhnd/cfe/cfe/board/bcm63xx_btrm/data/gen3_common/mfg_creds_req/rot|RoT]] lies a capital piece of information.
 +
 +Basically the [[https://github.com/blackfuel/asuswrt-rt-ax88u/blob/master/release/src-rt-5.02axhnd/cfe/cfe/board/bcm63xx_btrm/data/gen3_common/mfg_creds_req/rot/readme.txt|readme.txt]] file is saying that at least for GEN3:
 +<code>
 +The file Krot-mfg-encrypted.pem is aes-128-cbc encrypted with the same pass-phrase that encrypts the files bcm63xx_encr*.c located in the cfe/cfe/board/bcm63xx_btrm/src direcotry. After the file is decrypted, the pem file contains both the private and public portion of the RSA key Krot-mfg.
 +</code>
 +
 +This means:
 +  * The PBL MFG password is encrypted in the file Krot-mfg-encrypted.pem
 +  * The password must be declared in the files bcm63xx_encr*.c, lying in /src
 +  * Analysing the script [[https://github.com/blackfuel/asuswrt-rt-ax88u/blob/master/release/src-rt-5.02axhnd/cfe/cfe/board/bcm63xx_btrm/data/gen3_common/mfg_creds_req/rot/make_new_target.sh|make_new_target.sh]], a possible name for this file is "bcm63xx_encr3_clr.c"
 +
 +Therefore **we must focus on finding "bcm63xx_encr3_clr.c"** in order to support GEN3 CoT. We might think that there must be a file "bcm63xx_encr2_clr.c" for GEN2 and so on.
  
 +\\
 === Sources === === Sources ===
   * [[https://github.com/RMerl/asuswrt-merlin.ng/tree/master/release/src-rt-5.02axhnd.675x/hostTools/SecureBootUtils|Secure Boot folder]]   * [[https://github.com/RMerl/asuswrt-merlin.ng/tree/master/release/src-rt-5.02axhnd.675x/hostTools/SecureBootUtils|Secure Boot folder]]
   * [[https://github.com/RMerl/asuswrt-merlin.ng/tree/master/release/src-rt-5.02axhnd.675x/hostTools/PerlLib/BRCM|BCM Perl library folder]]   * [[https://github.com/RMerl/asuswrt-merlin.ng/tree/master/release/src-rt-5.02axhnd.675x/hostTools/PerlLib/BRCM|BCM Perl library folder]]
 +  * [[https://github.com/blackfuel/asuswrt-rt-ax88u/tree/master/release/src-rt-5.02axhnd/cfe/cfe/board/bcm63xx_btrm/data/gen3_common/mfg_creds_req/rot|RoT]]
  
  
Line 259: Line 285:
 ==== CFE HEADER ==== ==== CFE HEADER ====
 At the begining of CFE, outside the NVRAM area there exist three interesting parameters: At the begining of CFE, outside the NVRAM area there exist three interesting parameters:
-^ Offsets ^ parameter ^ possible values ^^ size ^ +^ Offsets      ^ parameter                           ^ possible values                                                                                                                                         |^ size                       
-| 0x010-0x013 | **BpGetSdramSize** | 8MB 1 CHIP\\ 16MB 1 CHIP\\ 32MB 1 CHIP\\ 64MB 2 CHIP\\ 32MB 2 CHIP\\ 16MB 2 CHIP\\ 64MB 1 CHIP | **0**\\ **1**\\ **2**\\ **3**\\ **4**\\ **5**\\ **6** | 4 bytes\\ (unsigned long) | +| 0x010-0x013  | **BpGetSdramSize**                  | 8MB 1 CHIP\\ 16MB 1 CHIP\\ 32MB 1 CHIP\\ 64MB 2 CHIP\\ 32MB 2 CHIP\\ 16MB 2 CHIP\\ 64MB 1 CHIP  | **0**\\ **1**\\ **2**\\ **3**\\ **4**\\ **5**\\ **6**  | 4 bytes\\ (unsigned long)  
-| 0x014-0x017 | **BpGetCMTThread**\\ (Main Thread) | core0\\ core1 | **0**\\ **1** | 4 bytes\\ (unsigned long) | +| 0x014-0x017  | **BpGetCMTThread**\\ (Main Thread)  | core0\\ core1                                                                                   | **0**\\ **1**                                          | 4 bytes\\ (unsigned long)  
-| 0x570 | **CFE Version** | any |  |+| 0x570        | **CFE Version**                     | any e.g. "cfe-v"                                                                                                                                       | 5                          | 
 +| 0x575        | **CFE Version Number**              | any                                                                                             | 1.0.38-114.101                                         | 5                          | 
 +| 0x57A        | **unused**                          |                                                                                                                                                        | 6                          |
  
 === NVRAM === === NVRAM ===
Line 283: Line 311:
 | {{:meta:48px-dialog-warning.svg.png|}} | Not all bcm63xx CFEs share this structure, some CFEs seem to have additional parameters like **PsiSize**, **Country**, **SerialNumber**, etc. As a result of this the CheckSum maybe located at different offsets and therefore the calculation is different. The **EMPTY** space isn't used to calculate the CheckSum | | {{:meta:48px-dialog-warning.svg.png|}} | Not all bcm63xx CFEs share this structure, some CFEs seem to have additional parameters like **PsiSize**, **Country**, **SerialNumber**, etc. As a result of this the CheckSum maybe located at different offsets and therefore the calculation is different. The **EMPTY** space isn't used to calculate the CheckSum |
  
-^ NVRAM version>=5 (usually found in BCM6328, BCM6362, BCM6368, BCM6816) ^^^^ +^ NVRAM version>=5 (usually found in BCM6328, BCM6362, BCM6368, BCM6816)                                                                                                                                                                                                                                                                                        |||| 
-^ Offsets ^ parameter ^^ size (bytes) ^ +^ Offsets                                                                 ^ parameter                                                                                                                                                                                                                                                             |^ size (bytes)  
-| 0x580 | **NVRAM Version** || 4 | +| 0x580                                                                   | **NVRAM Version**                                                                                                                                                                                                                                                     || 4             
-| 0x584 | **BOOT LINE** | e=192.168.1.1 (Board IP)\\ h=192.168.1.100 (Host IP)\\ g=  (Gateway IP)\\  r=f/h (run from flash/host)\\ f=vmlinux (if r=h)\\ i=bcm963xx_fs_kernel\\ d=3 (delay, 0=forever prompt)\\ p=0 (boot image, 0=latest, 1=previous) | 256 | +| 0x584                                                                   | **BOOT LINE**                           | e=192.168.1.1 (Board IP)\\ h=192.168.1.100 (Host IP)\\ g=  (Gateway IP)\\  r=f/h (run from flash/host)\\ f=vmlinux (if r=h)\\ i=bcm963xx_fs_kernel\\ d=3 (delay, 0=forever prompt)\\ p=0 (boot image, 0=latest, 1=previous)  | 256           
-| 0x684 | **Board ID** || 16 | +| 0x684                                                                   | **Board ID**                            e.g. "96328avng"                                                                                                                                                                                                             | 16            
-| 0x694 | **Main Thread** || 4 | +| 0x694                                                                   | **Main Thread**                                                                                                                                                                                                                                                       || 4             
-| 0x698 | **Psi size** || 4 | +| 0x698                                                                   | **Psi size**                                                                                                                                                                                                                                                          || 4             
-| 0x69C | **Number MAC Addresses** || 4 | +| 0x69C                                                                   | **Number MAC Addresses**                1-32                                                                                                                                                                                                                         | 4             
-| 0x6A0 | **Base MAC Address** || 6 | +| 0x6A0                                                                   | **Base MAC Address**                                                                                                                                                                                                                                                  || 6             
-| 0x6A6 | **reserved** || +| 0x6A6                                                                   | **is default set flag**                                                                                                                                                                                                                                               || 1             | 
-| 0x6A8 | **old CheckSum** || 4 | +| 0x6A7                                                                   | **allocate space for backup PSI flag**  |                                                                                                                                                                                                                              | 1             
-| 0x6AC | **gpon Serial Number** || 13 | +| 0x6A8                                                                   | **old v4 CheckSum**                                                                                                                                                                                                                                                   || 4             
-| 0x6B9 | **gpon Password** || 11 | +| 0x6AC                                                                   | **gpon Serial Number**                                                                                                                                                                                                                                                || 13            
-| 0x6C4 | **wps Device Pin** || 8 | +| 0x6B9                                                                   | **gpon Password**                                                                                                                                                                                                                                                     || 11            
-| 0x6CC | **wlan Params** || 256 | +| 0x6C4                                                                   | **WPS Device Pin**                                                                                                                                                                                                                                                    || 8             
-| 0x7CC | **Syslog Size** || 4 | +| 0x6CC                                                                   | **WLAN Params**                                                                                                                                                                                                                                                       || 256           
-| 0x7D0 | **Nand Part Ofs Kb** || 20 | +| 0x7CC                                                                   | **Syslog Size**                                                                                                                                                                                                                                                       || 4             
-| 0x7E4 | **Nand Part Size Kb** || 20 | +| 0x7D0                                                                   | **NAND Part Ofs Kb**                                                                                                                                                                                                                                                  || 20            
-| 0x7F8 | **Voice Board Id** || 16 | +| 0x7E4                                                                   | **NAND Part Size Kb**                                                                                                                                                                                                                                                 || 20            
-| 0x808 | **afe Id** || 8 | +| 0x7F8                                                                   | **Voice Board ID**                                                                                                                                                                                                                                                    || 16            
-| 0x810 | **Unused** || 364 +| 0x808                                                                   | **AFE ID**                              Primary AFE ID + Bonding AFE ID (4+4)                                                                                                                                                                                        | 8             
-| 0x97C | **CheckSum** || 4 |+| 0x810                                                                   | **OptoRxPower Reading**                                                                                                                                                                                                                                               || 2             | 
 +| 0x812                                                                   | **OptoRxPower Offset**                                                                                                                                                                                                                                                || 2             | 
 +| 0x814                                                                   | **OptoTxPower Reading**                                                                                                                                                                                                                                               || 2             | 
 +| 0x816                                                                   | **unused**                                                                                                                                                                                                                                                            || 58            | 
 +| 0x850                                                                   | **Flash Block Size**                                                                                                                                                                                                                                                  || 1             | 
 +| 0x851                                                                   | **AuxFS Size Percentage**                                                                                                                                                                                                                                             || 1             | 
 +| 0x852                                                                   | **unused**                              |                                                                                                                                                                                                                              | 169           | 
 +| 0x8FB                                                                   | **Reset to Default CFG Flag**                                                                                                                                                                                                                                         || 1             | 
 +| 0x8FC                                                                   | **Model Name**                                                                                                                                                                                                                                                        || 32            | 
 +| 0x91C                                                                   | **DES Key**                                                                                                                                                                                                                                                           || 32            | 
 +| 0x93C                                                                   | **WEP Key**                                                                                                                                                                                                                                                           || 32            | 
 +| 0x95C                                                                   | **Serial Number**                       | e.g. "684624H153031359"                                                                                                                                                                                                      | 32            
 +| 0x97C                                                                   | **CheckSum**                                                                                                                                                                                                                                                          || 4             | 
 +| 0x980                                                                   | --end--                                                                                                                                                                                                                                                               || Total: 1024   |
  
 NVRAM versions >=5 always have the checksum placed at the end of the NVRAM. NVRAM versions >=5 always have the checksum placed at the end of the NVRAM.
  • Last modified: 2021/12/18 18:48
  • by mandrake-lee