Blame view

doc/uImage.FIT/signature.txt 17.1 KB
3e569a6b1   Simon Glass   image: Add signin...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
  U-Boot FIT Signature Verification
  =================================
  
  Introduction
  ------------
  FIT supports hashing of images so that these hashes can be checked on
  loading. This protects against corruption of the image. However it does not
  prevent the substitution of one image for another.
  
  The signature feature allows the hash to be signed with a private key such
  that it can be verified using a public key later. Provided that the private
  key is kept secret and the public key is stored in a non-volatile place,
  any image can be verified in this way.
  
  See verified-boot.txt for more general information on verified boot.
  
  
  Concepts
  --------
  Some familiarity with public key cryptography is assumed in this section.
  
  The procedure for signing is as follows:
  
     - hash an image in the FIT
     - sign the hash with a private key to produce a signature
     - store the resulting signature in the FIT
  
  The procedure for verification is:
  
     - read the FIT
     - obtain the public key
     - extract the signature from the FIT
     - hash the image from the FIT
     - verify (with the public key) that the extracted signature matches the
         hash
  
  The signing is generally performed by mkimage, as part of making a firmware
  image for the device. The verification is normally done in U-Boot on the
  device.
  
  
  Algorithms
  ----------
  In principle any suitable algorithm can be used to sign and verify a hash.
  At present only one class of algorithms is supported: SHA1 hashing with RSA.
  This works by hashing the image to produce a 20-byte hash.
  
  While it is acceptable to bring in large cryptographic libraries such as
  openssl on the host side (e.g. mkimage), it is not desirable for U-Boot.
  For the run-time verification side, it is important to keep code and data
  size as small as possible.
  
  For this reason the RSA image verification uses pre-processed public keys
  which can be used with a very small amount of code - just some extraction
  of data from the FDT and exponentiation mod n. Code size impact is a little
  under 5KB on Tegra Seaboard, for example.
  
  It is relatively straightforward to add new algorithms if required. If
  another RSA variant is needed, then it can be added to the table in
  image-sig.c. If another algorithm is needed (such as DSA) then it can be
  placed alongside rsa.c, and its functions added to the table in image-sig.c
  also.
4c1d5c29b   Andreas Dannenberg   doc: clarify open...
63
64
65
  Creating an RSA key pair and certificate
  ----------------------------------------
  To create a new public/private key pair, size 2048 bits:
3e569a6b1   Simon Glass   image: Add signin...
66

e0f2f1553   Michael van der Westhuizen   Implement general...
67
68
  $ openssl genpkey -algorithm RSA -out keys/dev.key \
      -pkeyopt rsa_keygen_bits:2048 -pkeyopt rsa_keygen_pubexp:65537
3e569a6b1   Simon Glass   image: Add signin...
69

4c1d5c29b   Andreas Dannenberg   doc: clarify open...
70
  To create a certificate for this containing the public key:
3e569a6b1   Simon Glass   image: Add signin...
71
72
73
74
75
76
77
78
79
80
81
  
  $ openssl req -batch -new -x509 -key keys/dev.key -out keys/dev.crt
  
  If you like you can look at the public key also:
  
  $ openssl rsa -in keys/dev.key -pubout
  
  
  Device Tree Bindings
  --------------------
  The following properties are required in the FIT's signature node(s) to
e43f74ac0   Masahiro Yamada   doc: verified-boo...
82
  allow the signer to operate. These should be added to the .its file.
3e569a6b1   Simon Glass   image: Add signin...
83
  Signature nodes sit at the same level as hash nodes and are called
838404054   Andre Przywara   doc: FIT image: f...
84
  signature-1, signature-2, etc.
3e569a6b1   Simon Glass   image: Add signin...
85

6af5520fe   Masahiro Yamada   doc: verified-boo...
86
  - algo: Algorithm name (e.g. "sha1,rsa2048")
3e569a6b1   Simon Glass   image: Add signin...
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
  
  - key-name-hint: Name of key to use for signing. The keys will normally be in
  a single directory (parameter -k to mkimage). For a given key <name>, its
  private key is stored in <name>.key and the certificate is stored in
  <name>.crt.
  
  When the image is signed, the following properties are added (mandatory):
  
  - value: The signature data (e.g. 256 bytes for 2048-bit RSA)
  
  When the image is signed, the following properties are optional:
  
  - timestamp: Time when image was signed (standard Unix time_t format)
  
  - signer-name: Name of the signer (e.g. "mkimage")
  
  - signer-version: Version string of the signer (e.g. "2013.01")
  
  - comment: Additional information about the signer or image
e83cf2fbf   Philippe Reynes   doc: uImage.FIT: ...
106
107
  - padding: The padding algorithm, it may be pkcs-1.5 or pss,
  	if no value is provided we assume pkcs-1.5
4d0985295   Simon Glass   image: Add suppor...
108
109
  For config bindings (see Signed Configurations below), the following
  additional properties are optional:
3e569a6b1   Simon Glass   image: Add signin...
110

4d0985295   Simon Glass   image: Add suppor...
111
112
113
114
115
116
117
118
  - sign-images: A list of images to sign, each being a property of the conf
  node that contains then. The default is "kernel,fdt" which means that these
  two images will be looked up in the config and signed if present.
  
  For config bindings, these properties are added by the signer:
  
  - hashed-nodes: A list of nodes which were hashed by the signer. Each is
  	a string - the full path to node. A typical value might be:
838404054   Andre Przywara   doc: FIT image: f...
119
120
121
  	hashed-nodes = "/", "/configurations/conf-1", "/images/kernel",
  		"/images/kernel/hash-1", "/images/fdt-1",
  		"/images/fdt-1/hash-1";
4d0985295   Simon Glass   image: Add suppor...
122
123
124
125
126
127
  
  - hashed-strings: The start and size of the string region of the FIT that
  	was hashed
  
  Example: See sign-images.its for an example image tree source file and
  sign-configs.its for config signing.
3e569a6b1   Simon Glass   image: Add signin...
128
129
130
131
132
133
134
135
136
137
138
  
  
  Public Key Storage
  ------------------
  In order to verify an image that has been signed with a public key we need to
  have a trusted public key. This cannot be stored in the signed image, since
  it would be easy to alter. For this implementation we choose to store the
  public key in U-Boot's control FDT (using CONFIG_OF_CONTROL).
  
  Public keys should be stored as sub-nodes in a /signature node. Required
  properties are:
6af5520fe   Masahiro Yamada   doc: verified-boo...
139
  - algo: Algorithm name (e.g. "sha1,rsa2048")
3e569a6b1   Simon Glass   image: Add signin...
140
141
142
143
144
145
146
147
148
149
  
  Optional properties are:
  
  - key-name-hint: Name of key used for signing. This is only a hint since it
  is possible for the name to be changed. Verification can proceed by checking
  all available signing keys until one matches.
  
  - required: If present this indicates that the key must be verified for the
  image / configuration to be considered valid. Only required keys are
  normally verified by the FIT image booting algorithm. Valid values are
e43f74ac0   Masahiro Yamada   doc: verified-boo...
150
  "image" to force verification of all images, and "conf" to force verification
3e569a6b1   Simon Glass   image: Add signin...
151
152
153
154
155
156
157
158
159
  of the selected configuration (which then relies on hashes in the images to
  verify those).
  
  Each signing algorithm has its own additional properties.
  
  For RSA the following are mandatory:
  
  - rsa,num-bits: Number of key bits (e.g. 2048)
  - rsa,modulus: Modulus (N) as a big-endian multi-word integer
e0f2f1553   Michael van der Westhuizen   Implement general...
160
  - rsa,exponent: Public exponent (E) as a 64 bit unsigned integer
3e569a6b1   Simon Glass   image: Add signin...
161
162
  - rsa,r-squared: (2^num-bits)^2 as a big-endian multi-word integer
  - rsa,n0-inverse: -1 / modulus[0] mod 2^32
4d0985295   Simon Glass   image: Add suppor...
163
164
165
166
167
168
169
170
171
172
173
174
175
  Signed Configurations
  ---------------------
  While signing images is useful, it does not provide complete protection
  against several types of attack. For example, it it possible to create a
  FIT with the same signed images, but with the configuration changed such
  that a different one is selected (mix and match attack). It is also possible
  to substitute a signed image from an older FIT version into a newer FIT
  (roll-back attack).
  
  As an example, consider this FIT:
  
  / {
  	images {
838404054   Andre Przywara   doc: FIT image: f...
176
  		kernel-1 {
4d0985295   Simon Glass   image: Add suppor...
177
  			data = <data for kernel1>
838404054   Andre Przywara   doc: FIT image: f...
178
  			signature-1 {
4d0985295   Simon Glass   image: Add suppor...
179
180
181
182
  				algo = "sha1,rsa2048";
  				value = <...kernel signature 1...>
  			};
  		};
838404054   Andre Przywara   doc: FIT image: f...
183
  		kernel-2 {
4d0985295   Simon Glass   image: Add suppor...
184
  			data = <data for kernel2>
838404054   Andre Przywara   doc: FIT image: f...
185
  			signature-1 {
4d0985295   Simon Glass   image: Add suppor...
186
187
188
189
  				algo = "sha1,rsa2048";
  				value = <...kernel signature 2...>
  			};
  		};
838404054   Andre Przywara   doc: FIT image: f...
190
  		fdt-1 {
4d0985295   Simon Glass   image: Add suppor...
191
  			data = <data for fdt1>;
838404054   Andre Przywara   doc: FIT image: f...
192
  			signature-1 {
4d0985295   Simon Glass   image: Add suppor...
193
194
195
196
  				algo = "sha1,rsa2048";
  				vaue = <...fdt signature 1...>
  			};
  		};
838404054   Andre Przywara   doc: FIT image: f...
197
  		fdt-2 {
4d0985295   Simon Glass   image: Add suppor...
198
  			data = <data for fdt2>;
838404054   Andre Przywara   doc: FIT image: f...
199
  			signature-1 {
4d0985295   Simon Glass   image: Add suppor...
200
201
202
203
204
205
  				algo = "sha1,rsa2048";
  				vaue = <...fdt signature 2...>
  			};
  		};
  	};
  	configurations {
838404054   Andre Przywara   doc: FIT image: f...
206
207
208
209
  		default = "conf-1";
  		conf-1 {
  			kernel = "kernel-1";
  			fdt = "fdt-1";
4d0985295   Simon Glass   image: Add suppor...
210
  		};
838404054   Andre Przywara   doc: FIT image: f...
211
212
213
  		conf-1 {
  			kernel = "kernel-2";
  			fdt = "fdt-2";
4d0985295   Simon Glass   image: Add suppor...
214
215
216
217
218
219
220
221
  		};
  	};
  };
  
  Since both kernels are signed it is easy for an attacker to add a new
  configuration 3 with kernel 1 and fdt 2:
  
  	configurations {
838404054   Andre Przywara   doc: FIT image: f...
222
223
224
225
  		default = "conf-1";
  		conf-1 {
  			kernel = "kernel-1";
  			fdt = "fdt-1";
4d0985295   Simon Glass   image: Add suppor...
226
  		};
838404054   Andre Przywara   doc: FIT image: f...
227
228
229
  		conf-1 {
  			kernel = "kernel-2";
  			fdt = "fdt-2";
4d0985295   Simon Glass   image: Add suppor...
230
  		};
838404054   Andre Przywara   doc: FIT image: f...
231
232
233
  		conf-3 {
  			kernel = "kernel-1";
  			fdt = "fdt-2";
4d0985295   Simon Glass   image: Add suppor...
234
235
236
237
238
  		};
  	};
  
  With signed images, nothing protects against this. Whether it gains an
  advantage for the attacker is debatable, but it is not secure.
e43f74ac0   Masahiro Yamada   doc: verified-boo...
239
  To solve this problem, we support signed configurations. In this case it
4d0985295   Simon Glass   image: Add suppor...
240
241
242
243
244
245
246
  is the configurations that are signed, not the image. Each image has its
  own hash, and we include the hash in the configuration signature.
  
  So the above example is adjusted to look like this:
  
  / {
  	images {
838404054   Andre Przywara   doc: FIT image: f...
247
  		kernel-1 {
4d0985295   Simon Glass   image: Add suppor...
248
  			data = <data for kernel1>
838404054   Andre Przywara   doc: FIT image: f...
249
  			hash-1 {
4d0985295   Simon Glass   image: Add suppor...
250
251
252
253
  				algo = "sha1";
  				value = <...kernel hash 1...>
  			};
  		};
838404054   Andre Przywara   doc: FIT image: f...
254
  		kernel-2 {
4d0985295   Simon Glass   image: Add suppor...
255
  			data = <data for kernel2>
838404054   Andre Przywara   doc: FIT image: f...
256
  			hash-1 {
4d0985295   Simon Glass   image: Add suppor...
257
258
259
260
  				algo = "sha1";
  				value = <...kernel hash 2...>
  			};
  		};
838404054   Andre Przywara   doc: FIT image: f...
261
  		fdt-1 {
4d0985295   Simon Glass   image: Add suppor...
262
  			data = <data for fdt1>;
838404054   Andre Przywara   doc: FIT image: f...
263
  			hash-1 {
4d0985295   Simon Glass   image: Add suppor...
264
265
266
267
  				algo = "sha1";
  				value = <...fdt hash 1...>
  			};
  		};
838404054   Andre Przywara   doc: FIT image: f...
268
  		fdt-2 {
4d0985295   Simon Glass   image: Add suppor...
269
  			data = <data for fdt2>;
838404054   Andre Przywara   doc: FIT image: f...
270
  			hash-1 {
4d0985295   Simon Glass   image: Add suppor...
271
272
273
274
275
276
  				algo = "sha1";
  				value = <...fdt hash 2...>
  			};
  		};
  	};
  	configurations {
838404054   Andre Przywara   doc: FIT image: f...
277
278
279
280
281
  		default = "conf-1";
  		conf-1 {
  			kernel = "kernel-1";
  			fdt = "fdt-1";
  			signature-1 {
4d0985295   Simon Glass   image: Add suppor...
282
283
284
285
  				algo = "sha1,rsa2048";
  				value = <...conf 1 signature...>;
  			};
  		};
838404054   Andre Przywara   doc: FIT image: f...
286
287
288
289
  		conf-2 {
  			kernel = "kernel-2";
  			fdt = "fdt-2";
  			signature-1 {
4d0985295   Simon Glass   image: Add suppor...
290
291
292
293
294
295
296
297
298
299
  				algo = "sha1,rsa2048";
  				value = <...conf 1 signature...>;
  			};
  		};
  	};
  };
  
  
  You can see that we have added hashes for all images (since they are no
  longer signed), and a signature to each configuration. In the above example,
838404054   Andre Przywara   doc: FIT image: f...
300
301
302
  mkimage will sign configurations/conf-1, the kernel and fdt that are
  pointed to by the configuration (/images/kernel-1, /images/kernel-1/hash-1,
  /images/fdt-1, /images/fdt-1/hash-1) and the root structure of the image
4d0985295   Simon Glass   image: Add suppor...
303
  (so that it isn't possible to add or remove root nodes). The signature is
838404054   Andre Przywara   doc: FIT image: f...
304
  written into /configurations/conf-1/signature-1/value. It can easily be
4d0985295   Simon Glass   image: Add suppor...
305
306
  verified later even if the FIT has been signed with other keys in the
  meantime.
3e569a6b1   Simon Glass   image: Add signin...
307
308
309
310
311
312
313
314
315
316
317
318
319
320
  Verification
  ------------
  FITs are verified when loaded. After the configuration is selected a list
  of required images is produced. If there are 'required' public keys, then
  each image must be verified against those keys. This means that every image
  that might be used by the target needs to be signed with 'required' keys.
  
  This happens automatically as part of a bootm command when FITs are used.
  
  
  Enabling FIT Verification
  -------------------------
  In addition to the options to enable FIT itself, the following CONFIGs must
  be enabled:
e43f74ac0   Masahiro Yamada   doc: verified-boo...
321
  CONFIG_FIT_SIGNATURE - enable signing and verification in FITs
3e569a6b1   Simon Glass   image: Add signin...
322
  CONFIG_RSA - enable RSA algorithm for signing
21d29f7f9   Heiko Schocher   bootm: make use o...
323
324
325
  WARNING: When relying on signed FIT images with required signature check
  the legacy image format is default disabled by not defining
  CONFIG_IMAGE_FORMAT_LEGACY
3e569a6b1   Simon Glass   image: Add signin...
326
327
328
  
  Testing
  -------
e43f74ac0   Masahiro Yamada   doc: verified-boo...
329
  An easy way to test signing and verification is to use the test script
3e569a6b1   Simon Glass   image: Add signin...
330
331
332
333
334
335
336
337
338
339
340
341
342
  provided in test/vboot/vboot_test.sh. This uses sandbox (a special version
  of U-Boot which runs under Linux) to show the operation of a 'bootm'
  command loading and verifying images.
  
  A sample run is show below:
  
  $ make O=sandbox sandbox_config
  $ make O=sandbox
  $ O=sandbox ./test/vboot/vboot_test.sh
  Simple Verified Boot Test
  =========================
  
  Please see doc/uImage.FIT/verified-boot.txt for more information
646257d1f   Heiko Schocher   rsa: add sha256-r...
343
  /home/hs/ids/u-boot/sandbox/tools/mkimage -D -I dts -O dtb -p 2000
3e569a6b1   Simon Glass   image: Add signin...
344
  Build keys
646257d1f   Heiko Schocher   rsa: add sha256-r...
345
  do sha1 test
3e569a6b1   Simon Glass   image: Add signin...
346
347
348
349
350
351
352
353
  Build FIT with signed images
  Test Verified Boot Run: unsigned signatures:: OK
  Sign images
  Test Verified Boot Run: signed images: OK
  Build FIT with signed configuration
  Test Verified Boot Run: unsigned config: OK
  Sign images
  Test Verified Boot Run: signed config: OK
29a23f9d6   Heiko Schocher   tools, fit_check_...
354
  check signed config on the host
ce1400f69   Simon Glass   Enhance fit_check...
355
  Signature check OK
29a23f9d6   Heiko Schocher   tools, fit_check_...
356
357
  OK
  Test Verified Boot Run: signed config: OK
646257d1f   Heiko Schocher   rsa: add sha256-r...
358
359
360
361
362
363
364
365
366
367
  Test Verified Boot Run: signed config with bad hash: OK
  do sha256 test
  Build FIT with signed images
  Test Verified Boot Run: unsigned signatures:: OK
  Sign images
  Test Verified Boot Run: signed images: OK
  Build FIT with signed configuration
  Test Verified Boot Run: unsigned config: OK
  Sign images
  Test Verified Boot Run: signed config: OK
29a23f9d6   Heiko Schocher   tools, fit_check_...
368
  check signed config on the host
ce1400f69   Simon Glass   Enhance fit_check...
369
  Signature check OK
29a23f9d6   Heiko Schocher   tools, fit_check_...
370
371
  OK
  Test Verified Boot Run: signed config: OK
646257d1f   Heiko Schocher   rsa: add sha256-r...
372
  Test Verified Boot Run: signed config with bad hash: OK
3e569a6b1   Simon Glass   image: Add signin...
373
374
  
  Test passed
ce1400f69   Simon Glass   Enhance fit_check...
375

f1ca1fdeb   George McCollister   mkimage: Add supp...
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
  Hardware Signing with PKCS#11
  -----------------------------
  
  Securely managing private signing keys can challenging, especially when the
  keys are stored on the file system of a computer that is connected to the
  Internet. If an attacker is able to steal the key, they can sign malicious FIT
  images which will appear genuine to your devices.
  
  An alternative solution is to keep your signing key securely stored on hardware
  device like a smartcard, USB token or Hardware Security Module (HSM) and have
  them perform the signing. PKCS#11 is standard for interfacing with these crypto
  device.
  
  Requirements:
  Smartcard/USB token/HSM which can work with the pkcs11 engine
  openssl
  libp11 (provides pkcs11 engine)
  p11-kit (recommended to simplify setup)
  opensc (for smartcards and smartcard like USB devices)
  gnutls (recommended for key generation, p11tool)
  
  The following examples use the Nitrokey Pro. Instructions for other devices may vary.
  
  Notes on pkcs11 engine setup:
  
  Make sure p11-kit, opensc are installed and that p11-kit is setup to use opensc.
  /usr/share/p11-kit/modules/opensc.module should be present on your system.
  
  
  Generating Keys On the Nitrokey:
  
  $ gpg --card-edit
  
  Reader ...........: Nitrokey Nitrokey Pro (xxxxxxxx0000000000000000) 00 00
  Application ID ...: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
  Version ..........: 2.1
  Manufacturer .....: ZeitControl
  Serial number ....: xxxxxxxx
  Name of cardholder: [not set]
  Language prefs ...: de
  Sex ..............: unspecified
  URL of public key : [not set]
  Login data .......: [not set]
  Signature PIN ....: forced
  Key attributes ...: rsa2048 rsa2048 rsa2048
  Max. PIN lengths .: 32 32 32
  PIN retry counter : 3 0 3
  Signature counter : 0
  Signature key ....: [none]
  Encryption key....: [none]
  Authentication key: [none]
  General key info..: [none]
  
  gpg/card> generate
  Make off-card backup of encryption key? (Y/n) n
  
  Please note that the factory settings of the PINs are
    PIN = '123456' Admin PIN = '12345678'
  You should change them using the command --change-pin
  
  What keysize do you want for the Signature key? (2048) 4096
  The card will now be re-configured to generate a key of 4096 bits
  Note: There is no guarantee that the card supports the requested size.
    If the key generation does not succeed, please check the
    documentation of your card to see what sizes are allowed.
  What keysize do you want for the Encryption key? (2048) 4096
  The card will now be re-configured to generate a key of 4096 bits
  What keysize do you want for the Authentication key? (2048) 4096
  The card will now be re-configured to generate a key of 4096 bits
  Please specify how long the key should be valid.
    0 = key does not expire
    <n> = key expires in n days
    <n>w = key expires in n weeks
    <n>m = key expires in n months
    <n>y = key expires in n years
  Key is valid for? (0)
  Key does not expire at all
  Is this correct? (y/N) y
  
  GnuPG needs to construct a user ID to identify your key.
  
  Real name: John Doe
  Email address: john.doe@email.com
  Comment:
  You selected this USER-ID:
    "John Doe <john.doe@email.com>"
  
  Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? o
  
  
  Using p11tool to get the token URL:
  
  Depending on system configuration, gpg-agent may need to be killed first.
  
  $ p11tool --provider /usr/lib/opensc-pkcs11.so --list-tokens
  Token 0:
  URL: pkcs11:model=PKCS%2315%20emulated;manufacturer=ZeitControl;serial=000xxxxxxxxx;token=OpenPGP%20card%20%28User%20PIN%20%28sig%29%29
  Label: OpenPGP card (User PIN (sig))
  Type: Hardware token
  Manufacturer: ZeitControl
  Model: PKCS#15 emulated
  Serial: 000xxxxxxxxx
  Module: (null)
  
  
  Token 1:
  URL: pkcs11:model=PKCS%2315%20emulated;manufacturer=ZeitControl;serial=000xxxxxxxxx;token=OpenPGP%20card%20%28User%20PIN%29
  Label: OpenPGP card (User PIN)
  Type: Hardware token
  Manufacturer: ZeitControl
  Model: PKCS#15 emulated
  Serial: 000xxxxxxxxx
  Module: (null)
  
  Use the portion of the signature token URL after "pkcs11:" as the keydir argument (-k) to mkimage below.
  
  
  Use the URL of the token to list the private keys:
  
  $ p11tool --login --provider /usr/lib/opensc-pkcs11.so --list-privkeys \
  "pkcs11:model=PKCS%2315%20emulated;manufacturer=ZeitControl;serial=000xxxxxxxxx;token=OpenPGP%20card%20%28User%20PIN%20%28sig%29%29"
  Token 'OpenPGP card (User PIN (sig))' with URL 'pkcs11:model=PKCS%2315%20emulated;manufacturer=ZeitControl;serial=000xxxxxxxxx;token=OpenPGP%20card%20%28User%20PIN%20%28sig%29%29' requires user PIN
  Enter PIN:
  Object 0:
  URL: pkcs11:model=PKCS%2315%20emulated;manufacturer=ZeitControl;serial=000xxxxxxxxx;token=OpenPGP%20card%20%28User%20PIN%20%28sig%29%29;id=%01;object=Signature%20key;type=private
  Type: Private key
  Label: Signature key
  Flags: CKA_PRIVATE; CKA_NEVER_EXTRACTABLE; CKA_SENSITIVE;
  ID: 01
  
  Use the label, in this case "Signature key" as the key-name-hint in your FIT.
  
  Create the fitImage:
  $ ./tools/mkimage -f fit-image.its fitImage
  
  
  Sign the fitImage with the hardware key:
  
  $ ./tools/mkimage -F -k \
  "model=PKCS%2315%20emulated;manufacturer=ZeitControl;serial=000xxxxxxxxx;token=OpenPGP%20card%20%28User%20PIN%20%28sig%29%29" \
  -K u-boot.dtb -N pkcs11 -r fitImage
3e569a6b1   Simon Glass   image: Add signin...
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
  Future Work
  -----------
  - Roll-back protection using a TPM is done using the tpm command. This can
  be scripted, but we might consider a default way of doing this, built into
  bootm.
  
  
  Possible Future Work
  --------------------
  - Add support for other RSA/SHA variants, such as rsa4096,sha512.
  - Other algorithms besides RSA
  - More sandbox tests for failure modes
  - Passwords for keys/certificates
  - Perhaps implement OAEP
  - Enhance bootm to permit scripted signature verification (so that a script
  can verify an image but not actually boot it)
  
  
  Simon Glass
  sjg@chromium.org
  1-1-13