blob: 9b4d366d7eac7afb4e7877b29f3a9f250e54c873 [file] [log] [blame]
Joakim Bech8e5c5b32018-10-25 08:18:32 +02001.. _globalplatform_api:
2
3##################
4GlobalPlatform API
5##################
6Introduction
7************
8GlobalPlatform_ works across industries to identify, develop and publish
9specifications which facilitate the secure and interoperable deployment and
10management of multiple embedded applications on secure chip technology. OP-TEE
11has support for GlobalPlatform TEE Client API Specification_ v1.0 (GPD_SPE_007)
12and TEE Internal Core API Specification v1.1.2 (GPD_SPE_010).
13
14
15.. _tee_client_api:
16
17TEE Client API
18**************
19The TEE Client API describes and defines how a client running in a rich
20operating environment (REE) should communicate with the TEE. To identify a
21Trusted Application (TA) to be used, the client provides an UUID_. All TA's
22exposes one or several functions. Those functions corresponds to a so called
23``commandID`` which also is sent by the client.
24
25TEE Contexts
26============
27The TEE Context is used for creating a logical connection between the client and
28the TEE. The context must be initialized before the TEE Session can be created.
29When the client has completed a job running in secure world, it should finalize
30the context and thereby also release resources.
31
32TEE Sessions
33============
34Sessions are used to create logical connections between a client and a specific
35Trusted Application. When the session has been established the client has opened
36up the communication channel towards the specified Trusted Application
37identified by the ``UUID``. At this stage the client and the Trusted Application
38can start to exchange data.
39
40
41TEE Client API example / usage
42==============================
43Below you will find the main functions as defined by GlobalPlatform and are used
44in the communication between the client and the TEE.
45
46.. code-block:: c
47
48 TEEC_Result TEEC_InitializeContext(
49 const char* name,
50 TEEC_Context* context)
51
52 void TEEC_FinalizeContext(
53 TEEC_Context* context)
54
55 TEEC_Result TEEC_OpenSession (
56 TEEC_Context* context,
57 TEEC_Session* session,
58 const TEEC_UUID* destination,
59 uint32_t connectionMethod,
60 const void* connectionData,
61 TEEC_Operation* operation,
62 uint32_t* returnOrigin)
63
64 void TEEC_CloseSession (
65 TEEC_Session* session)
66
67 TEEC_Result TEEC_InvokeCommand(
68 TEEC_Session* session,
69 uint32_t commandID,
70 TEEC_Operation* operation,
71 uint32_t* returnOrigin)
72
73In principle the commands are called in this order:
74
75.. code-block:: c
76
77 TEEC_InitializeContext(...)
78 TEEC_OpenSession(...)
79 TEEC_InvokeCommand(...)
80 TEEC_CloseSession(...)
81 TEEC_FinalizeContext(...)
82
83It is not uncommon that ``TEEC_InvokeCommand(...)`` is called several times in
84a row when the session has been established.
85
86For a complete example, please see chapter **5.2 Example 1: Using the TEE Client
87API** in the GlobalPlatform TEE Client API Specification_ v1.0.
88
89
90.. _tee_internal_core_api:
91
92TEE Internal Core API
93*********************
94The Internal Core API is the API that is exposed to the Trusted Applications
95running in the secure world. The TEE Internal API consists of four major parts:
96
97 1. Trusted Storage API for Data and Keys
98 2. Cryptographic Operations API
99 3. Time API
100 4. Arithmetical API
101
102Examples / usage
103================
104Calling the Internal Core API is done in the same way as described above using
105Client API. The best place to find information how this should be done is in the
106TEE Internal Core API Specification_ v1.1.2 which contains many examples of how
107to call the various APIs. One can also have a look at the examples in the
108optee_examples_ git.
109
110
111.. _extensions:
112
113Extensions
114**********
115In addition to what is stated in :ref:`tee_internal_core_api`, there are some
116non-official extensions in OP-TEE.
117
118Trusted Applications should include header file ``tee_api_defines_extensions.h``
119to import the definitions of the extensions. For each extension, a configuration
120directive prefixed ``CFG_`` allows one to disable support for the extension when
121building the OP-TEE packages.
122
123Cache Maintenance Support
124=========================
125Following functions have been introduced in order to allow Trusted Applications
126to operate with the data cache:
127
128.. code-block:: c
129
130 TEE_Result TEE_CacheClean(char *buf, size_t len);
131 TEE_Result TEE_CacheFlush(char *buf, size_t len);
132 TEE_Result TEE_CacheInvalidate(char *buf, size_t len);
133
134These functions are available to any Trusted Application defined with the flag
135``TA_FLAG_CACHE_MAINTENANCE`` sets on. When not set, each function returns the
136error code ``TEE_ERROR_NOT_SUPPORTED``. Within these extensions, a Trusted
137Application is able to operate on the data cache, with the following
138specification:
139
140.. list-table::
141 :widths: 10 60
142 :header-rows: 1
143
144 * - Function
145 - Description
146
147 * - ``TEE_CacheClean()``
148 - Write back to memory any dirty data cache lines. The line is marked as
149 not dirty. The valid bit is unchanged.
150
151 * - ``TEE_CacheFlush()``
152 - Purges any valid data cache lines. Any dirty cache lines are first
153 written back to memory, then the cache line is invalidated.
154
155 * - ``TEE_CacheInvalidate()``
156 - Invalidate any valid data cache lines. Any dirty line are not written
157 back to memory.
158
159In the following two cases, the error code ``TEE_ERROR_ACCESS_DENIED`` is
160returned:
161
162 - The memory range has not the write access, that is
163 ``TEE_MEMORY_ACCESS_WRITE`` is not set.
164 - The memory is **not** user space memory.
165
166
167You may disable this extension by setting the following configuration variable
168in ``conf.mk``:
169
170.. code-block:: make
171
172 CFG_CACHE_API := n
173
174
175.. _rsassa_na1:
176
177PKCS#1 v1.5 RSASSA without hash OID
178===================================
179This extension adds identifer``TEE_ALG_RSASSA_PKCS1_V1_5`` to allow signing and
180verifying messages with RSASSA-PKCS1-v1_5, in `RFC 3447`_, without including the
181OID of the hash in the signature. You may disable this extension by setting the
182following configuration variable in ``conf.mk``:
183
184.. code-block:: make
185
186 CFG_CRYPTO_RSASSA_NA1 := n
187
188The TEE Internal Core API was extended with a new algorithm descriptor.
189
190.. list-table::
191 :widths: 10 60
192 :header-rows: 1
193
194 * - Algorithm
195 - Possible Modes
196
197 * - TEE_ALG_RSASSA_PKCS1_V1_5
198 - TEE_MODE_SIGN / TEE_MODE_VERIFY
199
200.. list-table::
201 :widths: 10 60
202 :header-rows: 1
203
204 * - Algorithm
205 - Identifier
206
207 * - TEE_ALG_RSASSA_PKCS1_V1_5
208 - 0xF0000830
209
210
211.. _concat_kdf:
212
213Concat KDF
214==========
215Support for the Concatenation Key Derivation Function (Concat KDF) according to
216`SP 800-56A`_ (*Recommendation for Pair-Wise Key Establishment Schemes Using
217Discrete Logarithm Cryptography*) can be found in OP-TEE. You may disable this
218extension by setting the following configuration variable in ``conf.mk``:
219
220.. code-block:: make
221
222 CFG_CRYPTO_CONCAT_KDF := n
223
224**Implementation notes**
225
226All key and parameter sizes **must** be multiples of 8 bits. That is:
227
228 - Input parameters: the shared secret (``Z``) and ``OtherInfo``.
229 - Output parameter: the derived key (``DerivedKeyingMaterial``).
230
231In addition, the maximum size of the derived key is limited by the size of an
232object of type ``TEE_TYPE_GENERIC_SECRET`` (512 bytes). This implementation does
233**not** enforce any requirement on the content of the ``OtherInfo`` parameter.
234It is the application's responsibility to make sure this parameter is
235constructed as specified by the NIST specification if compliance is desired.
236
237**API extension**
238
239To support Concat KDF, the :ref:`tee_internal_core_api` v1.1 was extended with
240new algorithm descriptors, new object types, and new object attributes as
241described below.
242
243**p.95 Add new object type to TEE_PopulateTransientObject**
244
245The following entry shall be added to **Table 5-8**:
246
247.. list-table::
248 :widths: 10 60
249 :header-rows: 1
250
251 * - Object type
252 - Parts
253
254 * - TEE_TYPE_CONCAT_KDF_Z
255 - The ``TEE_ATTR_CONCAT_KDF_Z`` part (input shared secret) must be
256 provided.
257
258**p.121 Add new algorithms for TEE_AllocateOperation**
259
260The following entry shall be added to **Table 6-3**:
261
262.. list-table::
263 :widths: 10 60
264 :header-rows: 1
265
266 * - Algorithm
267 - Possible Modes
268
269 * - TEE_ALG_CONCAT_KDF_SHA1_DERIVE_KEY
270 TEE_ALG_CONCAT_KDF_SHA224_DERIVE_KEY
271 TEE_ALG_CONCAT_KDF_SHA256_DERIVE_KEY
272 TEE_ALG_CONCAT_KDF_SHA384_DERIVE_KEY
273 TEE_ALG_CONCAT_KDF_SHA512_DERIVE_KEY
274 TEE_ALG_CONCAT_KDF_SHA512_DERIVE_KEY
275 - TEE_MODE_DERIVE
276
277**p.126 Explain usage of HKDF algorithms in TEE_SetOperationKey**
278
279In the bullet list about operation mode, the following shall be added:
280
281 - For the Concat KDF algorithms, the only supported mode is
282 ``TEE_MODE_DERIVE``.
283
284**p.150 Define TEE_DeriveKey input attributes for new algorithms**
285
286The following sentence shall be deleted:
287
288.. code-block:: none
289
290 The TEE_DeriveKey function can only be used with the algorithm
291 TEE_ALG_DH_DERIVE_SHARED_SECRET.
292
293The following entry shall be added to **Table 6-7**:
294
295.. list-table::
296 :header-rows: 1
297
298 * - Algorithm
299 - Possible operation parameters
300
301 * - TEE_ALG_CONCAT_KDF_SHA1_DERIVE_KEY
302 TEE_ALG_CONCAT_KDF_SHA224_DERIVE_KEY
303 TEE_ALG_CONCAT_KDF_SHA256_DERIVE_KEY
304 TEE_ALG_CONCAT_KDF_SHA384_DERIVE_KEY
305 TEE_ALG_CONCAT_KDF_SHA512_DERIVE_KEY
306 TEE_ALG_CONCAT_KDF_SHA512_DERIVE_KEY
307 - TEE_ATTR_CONCAT_KDF_DKM_LENGTH: up to 512 bytes. This parameter is
308 mandatory: TEE_ATTR_CONCAT_KDF_OTHER_INFO
309
310**p.152 Add new algorithm identifiers**
311
312The following entries shall be added to **Table 6-8**:
313
314.. list-table::
315 :header-rows: 1
316
317 * - Algorithm
318 - Identifier
319
320 * - TEE_ALG_CONCAT_KDF_SHA1_DERIVE_KEY
321 - 0x800020C1
322
323 * - TEE_ALG_CONCAT_KDF_SHA224_DERIVE_KEY
324 - 0x800030C1
325
326 * - TEE_ALG_CONCAT_KDF_SHA256_DERIVE_KEY
327 - 0x800040C1
328
329 * - TEE_ALG_CONCAT_KDF_SHA384_DERIVE_KEY
330 - 0x800050C1
331
332 * - TEE_ALG_CONCAT_KDF_SHA512_DERIVE_KEY
333 - 0x800060C1
334
335**p.154 Define new main algorithm**
336
337In **Table 6-9** in section 6.10.1, a new value shall be added to the value
338column for row bits ``[7:0]``:
339
340.. list-table::
341 :header-rows: 1
342
343 * - Bits
344 - Function
345 - Value
346
347 * - Bits [7:0]
348 - Identifiy the main underlying algorithm itself
349 - ...
350
351 0xC1: Concat KDF
352
353The function column for ``bits[15:12]`` shall also be modified to read:
354
355.. list-table::
356 :header-rows: 1
357
358 * - Bits
359 - Function
360 - Value
361
362 * - Bits [15:12]
363 - Define the message digest for asymmetric signature algorithms or Concat KDF
364 -
365
366**p.155 Add new object type for Concat KDF input shared secret**
367
368The following entry shall be added to **Table 6-10**:
369
370.. list-table::
371 :header-rows: 1
372
373 * - Name
374 - Identifier
375 - Possible sizes
376
377 * - TEE_TYPE_CONCAT_KDF_Z
378 - 0xA10000C1
379 - 8 to 4096 bits (multiple of 8)
380
381**p.156 Add new operation attributes for Concat KDF**
382
383The following entries shall be added to **Table 6-11**:
384
385.. list-table::
386 :header-rows: 1
387
388 * - Name
389 - Value
390 - Protection
391 - Type
392 - Comment
393
394 * - TEE_ATTR_CONCAT_KDF_Z
395 - 0xC00001C1
396 - Protected
397 - Ref
398 - The shared secret (``Z``)
399
400 * - TEE_ATTR_CONCAT_KDF_OTHER_INFO
401 - 0xD00002C1
402 - Public
403 - Ref
404 - ``OtherInfo``
405
406 * - TEE_ATTR_CONCAT_KDF_DKM_LENGTH
407 - 0xF00003C1
408 - Public
409 - Value
410 - The length (in bytes) of the derived keying material to be generated,
411 maximum 512. This is ``KeyDataLen`` / 8.
412
413
414.. _hkdf:
415
416HKDF
417====
418OP-TEE implements the *HMAC-based Extract-and-Expand Key Derivation Function
419(HKDF)* as specified in `RFC 5869`_. This file documents the extensions to the
420:ref:`tee_internal_core_api` v1.1 that were implemented to support this
421algorithm. Trusted Applications should include
422``<tee_api_defines_extensions.h>`` to import the definitions.
423
424Note that the implementation follows the recommendations of version 1.1 of the
425specification for adding new algorithms. It should make it compatible with
426future changes to the official specification. You can disable this extension by
427setting the following in ``conf.mk``:
428
429.. code-block:: make
430
431 CFG_CRYPTO_HKDF := n
432
433**p.95 Add new object type to TEE_PopulateTransientObject**
434
435The following entry shall be added to **Table 5-8**:
436
437.. list-table::
438 :header-rows: 1
439
440 * - Object type
441 - Parts
442
443 * - TEE_TYPE_HKDF_IKM
444 - The TEE_ATTR_HKDF_IKM (Input Keying Material) part must be provided.
445
446**p.121 Add new algorithms for TEE_AllocateOperation**
447
448The following entry shall be added to **Table 6-3**:
449
450.. list-table::
451 :header-rows: 1
452
453 * - Algorithm
454 - Possible Modes
455
456 * - TEE_ALG_HKDF_MD5_DERIVE_KEY
457 TEE_ALG_HKDF_SHA1_DERIVE_KEY
458 TEE_ALG_HKDF_SHA224_DERIVE_KEY
459 TEE_ALG_HKDF_SHA256_DERIVE_KEY
460 TEE_ALG_HKDF_SHA384_DERIVE_KEY
461 TEE_ALG_HKDF_SHA512_DERIVE_KEY
462 TEE_ALG_HKDF_SHA512_DERIVE_KEY
463 - TEE_MODE_DERIVE
464
465**p.126 Explain usage of HKDF algorithms in TEE_SetOperationKey**
466
467In the bullet list about operation mode, the following shall be added:
468
469 - For the HKDF algorithms, the only supported mode is TEE_MODE_DERIVE.
470
471**p.150 Define TEE_DeriveKey input attributes for new algorithms**
472
473The following sentence shall be deleted:
474
475.. code-block:: none
476
477 The TEE_DeriveKey function can only be used with the algorithm
478 TEE_ALG_DH_DERIVE_SHARED_SECRET
479
480The following entry shall be added to **Table 6-7**:
481
482.. list-table::
483 :header-rows: 1
484
485 * - Algorithm
486 - Possible operation parameters
487
488 * - TEE_ALG_HKDF_MD5_DERIVE_KEY
489 TEE_ALG_HKDF_SHA1_DERIVE_KEY
490 TEE_ALG_HKDF_SHA224_DERIVE_KEY
491 TEE_ALG_HKDF_SHA256_DERIVE_KEY
492 TEE_ALG_HKDF_SHA384_DERIVE_KEY
493 TEE_ALG_HKDF_SHA512_DERIVE_KEY
494 TEE_ALG_HKDF_SHA512_DERIVE_KEY
495 - TEE_ATTR_HKDF_OKM_LENGTH: Number of bytes in the Output Keying Material
496
497 TEE_ATTR_HKDF_SALT (optional) Salt to be used during the extract step
498
499 TEE_ATTR_HKDF_INFO (optional) Info to be used during the expand step
500
501**p.152 Add new algorithm identifiers**
502
503The following entries shall be added to **Table 6-8**:
504
505.. list-table::
506 :header-rows: 1
507
508 * - Algorithm
509 - Identifier
510
511 * - TEE_ALG_HKDF_MD5_DERIVE_KEY
512 - 0x800010C0
513
514 * - TEE_ALG_HKDF_SHA1_DERIVE_KEY
515 - 0x800020C0
516
517 * - TEE_ALG_HKDF_SHA224_DERIVE_KEY
518 - 0x800030C0
519
520 * - TEE_ALG_HKDF_SHA256_DERIVE_KEY
521 - 0x800040C0
522
523 * - TEE_ALG_HKDF_SHA384_DERIVE_KEY
524 - 0x800050C0
525
526 * - TEE_ALG_HKDF_SHA512_DERIVE_KEY
527 - 0x800060C0
528
529## p.154 Define new main algorithm
530
531In **Table 6-9** in section 6.10.1, a new value shall be added to the value column
532for row ``bits [7:0]``:
533
534.. list-table::
535 :header-rows: 1
536
537 * - Bits
538 - Function
539 - Value
540
541 * - Bits [7:0]
542 - Identifiy the main underlying algorithm itself
543 - ...
544
545 0xC0: HKDF
546
547The function column for ``bits[15:12]`` shall also be modified to read:
548
549.. list-table::
550 :header-rows: 1
551
552 * - Bits
553 - Function
554 - Value
555
556 * - Bits [15:12]
557 - Define the message digest for asymmetric signature algorithms or HKDF
558 -
559
560**p.155 Add new object type for HKDF input keying material**
561
562The following entry shall be added to **Table 6-10**:
563
564.. list-table::
565 :header-rows: 1
566
567 * - Name
568 - Identifier
569 - Possible sizes
570
571 * - TEE_TYPE_HKDF_IKM
572 - 0xA10000C0
573 - 8 to 4096 bits (multiple of 8)
574
575**p.156 Add new operation attributes for HKDF salt and info**
576
577The following entries shall be added to **Table 6-11**:
578
579.. list-table::
580 :widths: 40 10 10 10 40
581 :header-rows: 1
582
583 * - Name
584 - Value
585 - Protection
586 - Type
587 - Comment
588
589 * - TEE_ATTR_HKDF_IKM
590 - 0xC00001C0
591 - Protected
592 - Ref
593 -
594
595 * - TEE_ATTR_HKDF_SALT
596 - 0xD00002C0
597 - Public
598 - Ref
599 -
600
601 * - TEE_ATTR_HKDF_INFO
602 - 0xD00003C0
603 - Public
604 - Ref
605 -
606
607 * - TEE_ATTR_HKDF_OKM_LENGTH
608 - 0xF00004C0
609 - Public
610 - Value
611 -
612
613.. _pbkdf2:
614
615PBKDF2
616======
617This document describes the OP-TEE implementation of the key derivation
618function, *PBKDF2* as specified in `RFC 2898`_ section 5.2. This RFC is a
619republication of PKCS #5 v2.0 from RSA Laboratories' Public-Key Cryptography
620Standards (PKCS) series. You may disable this extension by setting the following
621configuration variable in ``conf.mk``:
622
623.. code-block:: make
624
625 CFG_CRYPTO_PBKDF2 := n
626
627**API extension**
628
629To support PBKDF2, the :ref:`tee_internal_core_api` v1.1 was extended with a new
630algorithm descriptor, new object types, and new object attributes as described
631below.
632
633**p.95 Add new object type to TEE_PopulateTransientObject**
634
635The following entry shall be added to **Table 5-8**:
636
637.. list-table::
638 :header-rows: 1
639
640 * - Object type
641 - Parts
642
643 * - TEE_TYPE_PBKDF2_PASSWORD
644 - The TEE_ATTR_PBKDF2_PASSWORD part must be provided.
645
646**p.121 Add new algorithms for TEE_AllocateOperation**
647
648The following entry shall be added to **Table 6-3**:
649
650.. list-table::
651 :header-rows: 1
652
653 * - Algorithm
654 - Possible Modes
655
656 * - TEE_ALG_PBKDF2_HMAC_SHA1_DERIVE_KEY
657 - TEE_MODE_DERIVE
658
659**p.126 Explain usage of PBKDF2 algorithm in TEE_SetOperationKey**
660
661In the bullet list about operation mode, the following shall be added:
662
663 - For the PBKDF2 algorithm, the only supported mode is TEE_MODE_DERIVE.
664
665**p.150 Define TEE_DeriveKey input attributes for new algorithms**
666
667The following sentence shall be deleted:
668
669.. code-block:: none
670
671 The TEE_DeriveKey function can only be used with the algorithm
672 TEE_ALG_DH_DERIVE_SHARED_SECRET
673
674The following entry shall be added to **Table 6-7**:
675
676.. list-table::
677 :header-rows: 1
678
679 * - Algorithm
680 - Possible operation parameters
681
682 * - TEE_ALG_PBKDF2_HMAC_SHA1_DERIVE_KEY
683 - TEE_ATTR_PBKDF2_DKM_LENGTH: up to 512 bytes. This parameter is
684 mandatory.
685
686 TEE_ATTR_PBKDF2_SALT
687
688 TEE_ATTR_PBKDF2_ITERATION_COUNT: This parameter is mandatory.
689
690**p.152 Add new algorithm identifiers**
691
692The following entries shall be added to **Table 6-8**:
693
694.. list-table::
695 :header-rows: 1
696
697 * - Algorithm
698 - Identifier
699
700 * - TEE_ALG_PBKDF2_HMAC_SHA1_DERIVE_KEY
701 - 0x800020C2
702
703**p.154 Define new main algorithm**
704
705In **Table 6-9** in section 6.10.1, a new value shall be added to the value
706column for row ``bits [7:0]``:
707
708.. list-table::
709 :header-rows: 1
710
711 * - Bits
712 - Function
713 - Value
714
715 * - Bits [7:0]
716 - Identifiy the main underlying algorithm itself
717 - ...
718
719 0xC2: PBKDF2
720
721The function column for ``bits[15:12]`` shall also be modified to read:
722
723.. list-table::
724 :header-rows: 1
725
726 * - Bits
727 - Function
728 - Value
729
730 * - Bits [15:12]
731 - Define the message digest for asymmetric signature algorithms or PBKDF2
732 -
733
734**p.155 Add new object type for PBKDF2 password**
735
736The following entry shall be added to **Table 6-10**:
737
738.. list-table::
739 :header-rows: 1
740
741 * - Name
742 - Identifier
743 - Possible sizes
744
745 * - TEE_TYPE_PBKDF2_PASSWORD
746 - 0xA10000C2
747 - 8 to 4096 bits (multiple of 8)
748
749**p.156 Add new operation attributes for Concat KDF**
750
751The following entries shall be added to **Table 6-11**:
752
753.. list-table::
754 :widths: 40 10 10 10 40
755 :header-rows: 1
756
757 * - Name
758 - Value
759 - Protection
760 - Type
761 - Comment
762
763 * - TEE_ATTR_PBKDF2_PASSWORD
764 - 0xC00001C2
765 - Protected
766 - Ref
767 -
768
769 * - TEE_ATTR_PBKDF2_SALT
770 - 0xD00002C2
771 - Public
772 - Ref
773 -
774
775 * - TEE_ATTR_PBKDF2_ITERATION_COUNT
776 - 0xF00003C2
777 - Public
778 - Value
779 -
780
781 * - TEE_ATTR_PBKDF2_DKM_LENGTH
782 - 0xF00004C2
783 - Public
784 - Value
785 - The length (in bytes) of the derived keying material to be generated,
786 maximum 512.
787
788
789.. _GlobalPlatform: https://globalplatform.org
790.. _optee_examples: https://github.com/linaro-swg/optee_examples
791.. _TZC-400: http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0504c/index.html
792.. _RFC 2898: https://www.ietf.org/rfc/rfc2898.txt
793.. _RFC 3447: https://tools.ietf.org/html/rfc3447#section-8.2
794.. _RFC 5869: https://tools.ietf.org/html/rfc5869
795.. _Specification: https://globalplatform.org/specs-library/?filter-committee=tee
796.. _SP 800-56A: http://csrc.nist.gov/publications/nistpubs/800-56A/SP800-56A_Revision1_Mar08-2007.pdf
797.. _UUID: https://en.wikipedia.org/wiki/Universally_unique_identifier