beaglebone_vboot.txt 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608
  1. Verified Boot on the Beaglebone Black
  2. =====================================
  3. Introduction
  4. ------------
  5. Before reading this, please read verified-boot.txt and signature.txt. These
  6. instructions are for mainline U-Boot from v2014.07 onwards.
  7. There is quite a bit of documentation in this directory describing how
  8. verified boot works in U-Boot. There is also a test which runs through the
  9. entire process of signing an image and running U-Boot (sandbox) to check it.
  10. However, it might be useful to also have an example on a real board.
  11. Beaglebone Black is a fairly common board so seems to be a reasonable choice
  12. for an example of how to enable verified boot using U-Boot.
  13. First a note that may to help avoid confusion. U-Boot and Linux both use
  14. device tree. They may use the same device tree source, but it is seldom useful
  15. for them to use the exact same binary from the same place. More typically,
  16. U-Boot has its device tree packaged wtih it, and the kernel's device tree is
  17. packaged with the kernel. In particular this is important with verified boot,
  18. since U-Boot's device tree must be immutable. If it can be changed then the
  19. public keys can be changed and verified boot is useless. An attacker can
  20. simply generate a new key and put his public key into U-Boot so that
  21. everything verifies. On the other hand the kernel's device tree typically
  22. changes when the kernel changes, so it is useful to package an updated device
  23. tree with the kernel binary. U-Boot supports the latter with its flexible FIT
  24. format (Flat Image Tree).
  25. Overview
  26. --------
  27. The steps are roughly as follows:
  28. 1. Build U-Boot for the board, with the verified boot options enabled.
  29. 2. Obtain a suitable Linux kernel
  30. 3. Create a Image Tree Source file (ITS) file describing how you want the
  31. kernel to be packaged, compressed and signed.
  32. 4. Create a key pair
  33. 5. Sign the kernel
  34. 6. Put the public key into U-Boot's image
  35. 7. Put U-Boot and the kernel onto the board
  36. 8. Try it
  37. Step 1: Build U-Boot
  38. --------------------
  39. a. Set up the environment variable to point to your toolchain. You will need
  40. this for U-Boot and also for the kernel if you build it. For example if you
  41. installed a Linaro version manually it might be something like:
  42. export CROSS_COMPILE=/opt/linaro/gcc-linaro-arm-linux-gnueabihf-4.8-2013.08_linux/bin/arm-linux-gnueabihf-
  43. or if you just installed gcc-arm-linux-gnueabi then it might be
  44. export CROSS_COMPILE=arm-linux-gnueabi-
  45. b. Configure and build U-Boot with verified boot enabled:
  46. export ARCH=arm
  47. export UBOOT=/path/to/u-boot
  48. cd $UBOOT
  49. # You can add -j10 if you have 10 CPUs to make it faster
  50. make O=b/am335x_boneblack_vboot am335x_boneblack_vboot_config all
  51. export UOUT=$UBOOT/b/am335x_boneblack_vboot
  52. c. You will now have a U-Boot image:
  53. file b/am335x_boneblack_vboot/u-boot-dtb.img
  54. b/am335x_boneblack_vboot/u-boot-dtb.img: u-boot legacy uImage, U-Boot 2014.07-rc2-00065-g2f69f8, Firmware/ARM, Firmware Image (Not compressed), 395375 bytes, Sat May 31 16:19:04 2014, Load Address: 0x80800000, Entry Point: 0x00000000, Header CRC: 0x0ABD6ACA, Data CRC: 0x36DEF7E4
  55. Step 2: Build Linux
  56. --------------------
  57. a. Find the kernel image ('Image') and device tree (.dtb) file you plan to
  58. use. In our case it is am335x-boneblack.dtb and it is built with the kernel.
  59. At the time of writing an SD Boot image can be obtained from here:
  60. http://www.elinux.org/Beagleboard:Updating_The_Software#Image_For_Booting_From_microSD
  61. You can write this to an SD card and then mount it to extract the kernel and
  62. device tree files.
  63. You can also build a kernel. Instructions for this are are here:
  64. http://elinux.org/Building_BBB_Kernel
  65. or you can use your favourite search engine. Following these instructions
  66. produces a kernel Image and device tree files. For the record the steps were:
  67. export KERNEL=/path/to/kernel
  68. cd $KERNEL
  69. git clone git://github.com/beagleboard/kernel.git .
  70. git checkout v3.14
  71. ./patch.sh
  72. cp configs/beaglebone kernel/arch/arm/configs/beaglebone_defconfig
  73. cd kernel
  74. make beaglebone_defconfig
  75. make uImage dtbs # -j10 if you have 10 CPUs
  76. export OKERNEL=$KERNEL/kernel/arch/arm/boot
  77. c. You now have the 'Image' and 'am335x-boneblack.dtb' files needed to boot.
  78. Step 3: Create the ITS
  79. ----------------------
  80. Set up a directory for your work.
  81. export WORK=/path/to/dir
  82. cd $WORK
  83. Put this into a file in that directory called sign.its:
  84. /dts-v1/;
  85. / {
  86. description = "Beaglebone black";
  87. #address-cells = <1>;
  88. images {
  89. kernel {
  90. data = /incbin/("Image.lzo");
  91. type = "kernel";
  92. arch = "arm";
  93. os = "linux";
  94. compression = "lzo";
  95. load = <0x80008000>;
  96. entry = <0x80008000>;
  97. hash-1 {
  98. algo = "sha1";
  99. };
  100. };
  101. fdt-1 {
  102. description = "beaglebone-black";
  103. data = /incbin/("am335x-boneblack.dtb");
  104. type = "flat_dt";
  105. arch = "arm";
  106. compression = "none";
  107. hash-1 {
  108. algo = "sha1";
  109. };
  110. };
  111. };
  112. configurations {
  113. default = "conf-1";
  114. conf-1 {
  115. kernel = "kernel";
  116. fdt = "fdt-1";
  117. signature-1 {
  118. algo = "sha1,rsa2048";
  119. key-name-hint = "dev";
  120. sign-images = "fdt", "kernel";
  121. };
  122. };
  123. };
  124. };
  125. The explanation for this is all in the documentation you have already read.
  126. But briefly it packages a kernel and device tree, and provides a single
  127. configuration to be signed with a key named 'dev'. The kernel is compressed
  128. with LZO to make it smaller.
  129. Step 4: Create a key pair
  130. -------------------------
  131. See signature.txt for details on this step.
  132. cd $WORK
  133. mkdir keys
  134. openssl genrsa -F4 -out keys/dev.key 2048
  135. openssl req -batch -new -x509 -key keys/dev.key -out keys/dev.crt
  136. Note: keys/dev.key contains your private key and is very secret. If anyone
  137. gets access to that file they can sign kernels with it. Keep it secure.
  138. Step 5: Sign the kernel
  139. -----------------------
  140. We need to use mkimage (which was built when you built U-Boot) to package the
  141. Linux kernel into a FIT (Flat Image Tree, a flexible file format that U-Boot
  142. can load) using the ITS file you just created.
  143. At the same time we must put the public key into U-Boot device tree, with the
  144. 'required' property, which tells U-Boot that this key must be verified for the
  145. image to be valid. You will make this key available to U-Boot for booting in
  146. step 6.
  147. ln -s $OKERNEL/dts/am335x-boneblack.dtb
  148. ln -s $OKERNEL/Image
  149. ln -s $UOUT/u-boot-dtb.img
  150. cp $UOUT/arch/arm/dts/am335x-boneblack.dtb am335x-boneblack-pubkey.dtb
  151. lzop Image
  152. $UOUT/tools/mkimage -f sign.its -K am335x-boneblack-pubkey.dtb -k keys -r image.fit
  153. You should see something like this:
  154. FIT description: Beaglebone black
  155. Created: Sun Jun 1 12:50:30 2014
  156. Image 0 (kernel)
  157. Description: unavailable
  158. Created: Sun Jun 1 12:50:30 2014
  159. Type: Kernel Image
  160. Compression: lzo compressed
  161. Data Size: 7790938 Bytes = 7608.34 kB = 7.43 MB
  162. Architecture: ARM
  163. OS: Linux
  164. Load Address: 0x80008000
  165. Entry Point: 0x80008000
  166. Hash algo: sha1
  167. Hash value: c94364646427e10f423837e559898ef02c97b988
  168. Image 1 (fdt-1)
  169. Description: beaglebone-black
  170. Created: Sun Jun 1 12:50:30 2014
  171. Type: Flat Device Tree
  172. Compression: uncompressed
  173. Data Size: 31547 Bytes = 30.81 kB = 0.03 MB
  174. Architecture: ARM
  175. Hash algo: sha1
  176. Hash value: cb09202f889d824f23b8e4404b781be5ad38a68d
  177. Default Configuration: 'conf-1'
  178. Configuration 0 (conf-1)
  179. Description: unavailable
  180. Kernel: kernel
  181. FDT: fdt-1
  182. Now am335x-boneblack-pubkey.dtb contains the public key and image.fit contains
  183. the signed kernel. Jump to step 6 if you like, or continue reading to increase
  184. your understanding.
  185. You can also run fit_check_sign to check it:
  186. $UOUT/tools/fit_check_sign -f image.fit -k am335x-boneblack-pubkey.dtb
  187. which results in:
  188. Verifying Hash Integrity ... sha1,rsa2048:dev+
  189. ## Loading kernel from FIT Image at 7fc6ee469000 ...
  190. Using 'conf-1' configuration
  191. Verifying Hash Integrity ...
  192. sha1,rsa2048:dev+
  193. OK
  194. Trying 'kernel' kernel subimage
  195. Description: unavailable
  196. Created: Sun Jun 1 12:50:30 2014
  197. Type: Kernel Image
  198. Compression: lzo compressed
  199. Data Size: 7790938 Bytes = 7608.34 kB = 7.43 MB
  200. Architecture: ARM
  201. OS: Linux
  202. Load Address: 0x80008000
  203. Entry Point: 0x80008000
  204. Hash algo: sha1
  205. Hash value: c94364646427e10f423837e559898ef02c97b988
  206. Verifying Hash Integrity ...
  207. sha1+
  208. OK
  209. Unimplemented compression type 4
  210. ## Loading fdt from FIT Image at 7fc6ee469000 ...
  211. Using 'conf-1' configuration
  212. Trying 'fdt-1' fdt subimage
  213. Description: beaglebone-black
  214. Created: Sun Jun 1 12:50:30 2014
  215. Type: Flat Device Tree
  216. Compression: uncompressed
  217. Data Size: 31547 Bytes = 30.81 kB = 0.03 MB
  218. Architecture: ARM
  219. Hash algo: sha1
  220. Hash value: cb09202f889d824f23b8e4404b781be5ad38a68d
  221. Verifying Hash Integrity ...
  222. sha1+
  223. OK
  224. Loading Flat Device Tree ... OK
  225. ## Loading ramdisk from FIT Image at 7fc6ee469000 ...
  226. Using 'conf-1' configuration
  227. Could not find subimage node
  228. Signature check OK
  229. At the top, you see "sha1,rsa2048:dev+". This means that it checked an RSA key
  230. of size 2048 bits using SHA1 as the hash algorithm. The key name checked was
  231. 'dev' and the '+' means that it verified. If it showed '-' that would be bad.
  232. Once the configuration is verified it is then possible to rely on the hashes
  233. in each image referenced by that configuration. So fit_check_sign goes on to
  234. load each of the images. We have a kernel and an FDT but no ramkdisk. In each
  235. case fit_check_sign checks the hash and prints sha1+ meaning that the SHA1
  236. hash verified. This means that none of the images has been tampered with.
  237. There is a test in test/vboot which uses U-Boot's sandbox build to verify that
  238. the above flow works.
  239. But it is fun to do this by hand, so you can load image.fit into a hex editor
  240. like ghex, and change a byte in the kernel:
  241. $UOUT/tools/fit_info -f image.fit -n /images/kernel -p data
  242. NAME: kernel
  243. LEN: 7790938
  244. OFF: 168
  245. This tells us that the kernel starts at byte offset 168 (decimal) in image.fit
  246. and extends for about 7MB. Try changing a byte at 0x2000 (say) and run
  247. fit_check_sign again. You should see something like:
  248. Verifying Hash Integrity ... sha1,rsa2048:dev+
  249. ## Loading kernel from FIT Image at 7f5a39571000 ...
  250. Using 'conf-1' configuration
  251. Verifying Hash Integrity ...
  252. sha1,rsa2048:dev+
  253. OK
  254. Trying 'kernel' kernel subimage
  255. Description: unavailable
  256. Created: Sun Jun 1 13:09:21 2014
  257. Type: Kernel Image
  258. Compression: lzo compressed
  259. Data Size: 7790938 Bytes = 7608.34 kB = 7.43 MB
  260. Architecture: ARM
  261. OS: Linux
  262. Load Address: 0x80008000
  263. Entry Point: 0x80008000
  264. Hash algo: sha1
  265. Hash value: c94364646427e10f423837e559898ef02c97b988
  266. Verifying Hash Integrity ...
  267. sha1 error
  268. Bad hash value for 'hash-1' hash node in 'kernel' image node
  269. Bad Data Hash
  270. ## Loading fdt from FIT Image at 7f5a39571000 ...
  271. Using 'conf-1' configuration
  272. Trying 'fdt-1' fdt subimage
  273. Description: beaglebone-black
  274. Created: Sun Jun 1 13:09:21 2014
  275. Type: Flat Device Tree
  276. Compression: uncompressed
  277. Data Size: 31547 Bytes = 30.81 kB = 0.03 MB
  278. Architecture: ARM
  279. Hash algo: sha1
  280. Hash value: cb09202f889d824f23b8e4404b781be5ad38a68d
  281. Verifying Hash Integrity ...
  282. sha1+
  283. OK
  284. Loading Flat Device Tree ... OK
  285. ## Loading ramdisk from FIT Image at 7f5a39571000 ...
  286. Using 'conf-1' configuration
  287. Could not find subimage node
  288. Signature check Bad (error 1)
  289. It has detected the change in the kernel.
  290. You can also be sneaky and try to switch images, using the libfdt utilities
  291. that come with dtc (package name is device-tree-compiler but you will need a
  292. recent version like 1.4:
  293. dtc -v
  294. Version: DTC 1.4.0
  295. First we can check which nodes are actually hashed by the configuration:
  296. fdtget -l image.fit /
  297. images
  298. configurations
  299. fdtget -l image.fit /configurations
  300. conf-1
  301. fdtget -l image.fit /configurations/conf-1
  302. signature-1
  303. fdtget -p image.fit /configurations/conf-1/signature-1
  304. hashed-strings
  305. hashed-nodes
  306. timestamp
  307. signer-version
  308. signer-name
  309. value
  310. algo
  311. key-name-hint
  312. sign-images
  313. fdtget image.fit /configurations/conf-1/signature-1 hashed-nodes
  314. / /configurations/conf-1 /images/fdt-1 /images/fdt-1/hash /images/kernel /images/kernel/hash-1
  315. This gives us a bit of a look into the signature that mkimage added. Note you
  316. can also use fdtdump to list the entire device tree.
  317. Say we want to change the kernel that this configuration uses
  318. (/images/kernel). We could just put a new kernel in the image, but we will
  319. need to change the hash to match. Let's simulate that by changing a byte of
  320. the hash:
  321. fdtget -tx image.fit /images/kernel/hash-1 value
  322. c9436464 6427e10f 423837e5 59898ef0 2c97b988
  323. fdtput -tx image.fit /images/kernel/hash-1 value c9436464 6427e10f 423837e5 59898ef0 2c97b981
  324. Now check it again:
  325. $UOUT/tools/fit_check_sign -f image.fit -k am335x-boneblack-pubkey.dtb
  326. Verifying Hash Integrity ... sha1,rsa2048:devrsa_verify_with_keynode: RSA failed to verify: -13
  327. rsa_verify_with_keynode: RSA failed to verify: -13
  328. -
  329. Failed to verify required signature 'key-dev'
  330. Signature check Bad (error 1)
  331. This time we don't even get as far as checking the images, since the
  332. configuration signature doesn't match. We can't change any hashes without the
  333. signature check noticing. The configuration is essentially locked. U-Boot has
  334. a public key for which it requires a match, and will not permit the use of any
  335. configuration that does not match that public key. The only way the
  336. configuration will match is if it was signed by the matching private key.
  337. It would also be possible to add a new signature node that does match your new
  338. configuration. But that won't work since you are not allowed to change the
  339. configuration in any way. Try it with a fresh (valid) image if you like by
  340. running the mkimage link again. Then:
  341. fdtput -p image.fit /configurations/conf-1/signature-1 value fred
  342. $UOUT/tools/fit_check_sign -f image.fit -k am335x-boneblack-pubkey.dtb
  343. Verifying Hash Integrity ... -
  344. sha1,rsa2048:devrsa_verify_with_keynode: RSA failed to verify: -13
  345. rsa_verify_with_keynode: RSA failed to verify: -13
  346. -
  347. Failed to verify required signature 'key-dev'
  348. Signature check Bad (error 1)
  349. Of course it would be possible to add an entirely new configuration and boot
  350. with that, but it still needs to be signed, so it won't help.
  351. 6. Put the public key into U-Boot's image
  352. -----------------------------------------
  353. Having confirmed that the signature is doing its job, let's try it out in
  354. U-Boot on the board. U-Boot needs access to the public key corresponding to
  355. the private key that you signed with so that it can verify any kernels that
  356. you sign.
  357. cd $UBOOT
  358. make O=b/am335x_boneblack_vboot EXT_DTB=${WORK}/am335x-boneblack-pubkey.dtb
  359. Here we are overriding the normal device tree file with our one, which
  360. contains the public key.
  361. Now you have a special U-Boot image with the public key. It can verify can
  362. kernel that you sign with the private key as in step 5.
  363. If you like you can take a look at the public key information that mkimage
  364. added to U-Boot's device tree:
  365. fdtget -p am335x-boneblack-pubkey.dtb /signature/key-dev
  366. required
  367. algo
  368. rsa,r-squared
  369. rsa,modulus
  370. rsa,n0-inverse
  371. rsa,num-bits
  372. key-name-hint
  373. This has information about the key and some pre-processed values which U-Boot
  374. can use to verify against it. These values are obtained from the public key
  375. certificate by mkimage, but require quite a bit of code to generate. To save
  376. code space in U-Boot, the information is extracted and written in raw form for
  377. U-Boot to easily use. The same mechanism is used in Google's Chrome OS.
  378. Notice the 'required' property. This marks the key as required - U-Boot will
  379. not boot any image that does not verify against this key.
  380. 7. Put U-Boot and the kernel onto the board
  381. -------------------------------------------
  382. The method here varies depending on how you are booting. For this example we
  383. are booting from an micro-SD card with two partitions, one for U-Boot and one
  384. for Linux. Put it into your machine and write U-Boot and the kernel to it.
  385. Here the card is /dev/sde:
  386. cd $WORK
  387. export UDEV=/dev/sde1 # Change thes two lines to the correct device
  388. export KDEV=/dev/sde2
  389. sudo mount $UDEV /mnt/tmp && sudo cp $UOUT/u-boot-dtb.img /mnt/tmp/u-boot.img && sleep 1 && sudo umount $UDEV
  390. sudo mount $KDEV /mnt/tmp && sudo cp $WORK/image.fit /mnt/tmp/boot/image.fit && sleep 1 && sudo umount $KDEV
  391. 8. Try it
  392. ---------
  393. Boot the board using the commands below:
  394. setenv bootargs console=ttyO0,115200n8 quiet root=/dev/mmcblk0p2 ro rootfstype=ext4 rootwait
  395. ext2load mmc 0:2 82000000 /boot/image.fit
  396. bootm 82000000
  397. You should then see something like this:
  398. U-Boot# setenv bootargs console=ttyO0,115200n8 quiet root=/dev/mmcblk0p2 ro rootfstype=ext4 rootwait
  399. U-Boot# ext2load mmc 0:2 82000000 /boot/image.fit
  400. 7824930 bytes read in 589 ms (12.7 MiB/s)
  401. U-Boot# bootm 82000000
  402. ## Loading kernel from FIT Image at 82000000 ...
  403. Using 'conf-1' configuration
  404. Verifying Hash Integrity ... sha1,rsa2048:dev+ OK
  405. Trying 'kernel' kernel subimage
  406. Description: unavailable
  407. Created: 2014-06-01 19:32:54 UTC
  408. Type: Kernel Image
  409. Compression: lzo compressed
  410. Data Start: 0x820000a8
  411. Data Size: 7790938 Bytes = 7.4 MiB
  412. Architecture: ARM
  413. OS: Linux
  414. Load Address: 0x80008000
  415. Entry Point: 0x80008000
  416. Hash algo: sha1
  417. Hash value: c94364646427e10f423837e559898ef02c97b988
  418. Verifying Hash Integrity ... sha1+ OK
  419. ## Loading fdt from FIT Image at 82000000 ...
  420. Using 'conf-1' configuration
  421. Trying 'fdt-1' fdt subimage
  422. Description: beaglebone-black
  423. Created: 2014-06-01 19:32:54 UTC
  424. Type: Flat Device Tree
  425. Compression: uncompressed
  426. Data Start: 0x8276e2ec
  427. Data Size: 31547 Bytes = 30.8 KiB
  428. Architecture: ARM
  429. Hash algo: sha1
  430. Hash value: cb09202f889d824f23b8e4404b781be5ad38a68d
  431. Verifying Hash Integrity ... sha1+ OK
  432. Booting using the fdt blob at 0x8276e2ec
  433. Uncompressing Kernel Image ... OK
  434. Loading Device Tree to 8fff5000, end 8ffffb3a ... OK
  435. Starting kernel ...
  436. [ 0.582377] omap_init_mbox: hwmod doesn't have valid attrs
  437. [ 2.589651] musb-hdrc musb-hdrc.0.auto: Failed to request rx1.
  438. [ 2.595830] musb-hdrc musb-hdrc.0.auto: musb_init_controller failed with status -517
  439. [ 2.606470] musb-hdrc musb-hdrc.1.auto: Failed to request rx1.
  440. [ 2.612723] musb-hdrc musb-hdrc.1.auto: musb_init_controller failed with status -517
  441. [ 2.940808] drivers/rtc/hctosys.c: unable to open rtc device (rtc0)
  442. [ 7.248889] libphy: PHY 4a101000.mdio:01 not found
  443. [ 7.253995] net eth0: phy 4a101000.mdio:01 not found on slave 1
  444. systemd-fsck[83]: Angstrom: clean, 50607/218160 files, 306348/872448 blocks
  445. .---O---.
  446. | | .-. o o
  447. | | |-----.-----.-----.| | .----..-----.-----.
  448. | | | __ | ---'| '--.| .-'| | |
  449. | | | | | |--- || --'| | | ' | | | |
  450. '---'---'--'--'--. |-----''----''--' '-----'-'-'-'
  451. -' |
  452. '---'
  453. The Angstrom Distribution beaglebone ttyO0
  454. Angstrom v2012.12 - Kernel 3.14.1+
  455. beaglebone login:
  456. At this point your kernel has been verified and you can be sure that it is one
  457. that you signed. As an exercise, try changing image.fit as in step 5 and see
  458. what happens.
  459. Further Improvements
  460. --------------------
  461. Several of the steps here can be easily automated. In particular it would be
  462. capital if signing and packaging a kernel were easy, perhaps a simple make
  463. target in the kernel.
  464. Some mention of how to use multiple .dtb files in a FIT might be useful.
  465. U-Boot's verified boot mechanism has not had a robust and independent security
  466. review. Such a review should look at the implementation and its resistance to
  467. attacks.
  468. Perhaps the verified boot feature could could be integrated into the Amstrom
  469. distribution.
  470. Simon Glass
  471. sjg@chromium.org
  472. 2-June-14