Project

General

Profile

Trusted Platform Module 2.0 » History » Version 90

Andreas Steffen, 01.01.2021 17:23

1 17 Andreas Steffen
h1. Trusted Platform Module 2.0
2 1 Andreas Steffen
3 6 Andreas Steffen
{{>toc}}
4 6 Andreas Steffen
5 51 Andreas Steffen
h2. Connect to a TPM 2.0 Device
6 1 Andreas Steffen
7 88 Andreas Steffen
h3. Install the tpm2-tss Software Stack and the tpm2-tools Command Set
8 51 Andreas Steffen
9 90 Andreas Steffen
In order to connect to a TPM 2.0 hardware or firmware device a software stack implementing the "TCG TSS 2.0 System Level API":https://trustedcomputinggroup.org/resource/tcg-tss-2-0-system-level-api-sapi-specification/ is needed. An excellent open source "tpm2-tss":https://github.com/tpm2-software/tpm2-tss library is available from the "tpm2-software":https://github.com/tpm2-software project which also offers a set of "tpm2-tools":https://github.com/tpm2-software/tpm2-tools which itself uses the "TCG TSS 2.0 Enhanced System Level API":https://trustedcomputinggroup.org/resource/tcg-tss-2-0-enhanced-system-api-esapi-specification/.
10 1 Andreas Steffen
11 89 Andreas Steffen
When using the latest *strongswan-5.9.1* version with a *Linux 5.4* kernel or newer, we recommend these latest versions:
12 1 Andreas Steffen
13 89 Andreas Steffen
* *tpm2-tss* version 3.0.3: https://github.com/tpm2-software/tpm2-tss/releases/tag/3.0.3
14 79 Andreas Steffen
15 89 Andreas Steffen
* *tpm2-tools* version 5.0: https://github.com/tpm2-software/tpm2-tools/releases/tag/5.0
16 79 Andreas Steffen
17 90 Andreas Steffen
Support for earlier strongSwan versions and Linux kernels can be found [[TpmPluginOld|here]].
18 71 Andreas Steffen
19 71 Andreas Steffen
As a test to connect to the TPM 2.0 by listing e.g. the contents of the SHA-1 bank of PCR registers
20 7 Andreas Steffen
   
21 75 Andreas Steffen
 tpm2_pcrlist -g sha1
22 3 Andreas Steffen
23 18 Andreas Steffen
<pre>
24 18 Andreas Steffen
Bank/Algorithm: TPM_ALG_SHA1(0x0004)
25 3 Andreas Steffen
PCR_00: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
26 3 Andreas Steffen
PCR_01: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
27 3 Andreas Steffen
PCR_02: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
28 3 Andreas Steffen
PCR_03: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
29 3 Andreas Steffen
PCR_04: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
30 3 Andreas Steffen
PCR_05: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
31 3 Andreas Steffen
PCR_06: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
32 3 Andreas Steffen
PCR_07: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
33 3 Andreas Steffen
PCR_08: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
34 3 Andreas Steffen
PCR_09: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
35 3 Andreas Steffen
PCR_10: a9 45 e7 0f 42 a2 79 f0 78 ca d4 64 60 39 39 da 9d 6a d1 a5
36 3 Andreas Steffen
PCR_11: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
37 3 Andreas Steffen
PCR_12: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
38 3 Andreas Steffen
PCR_13: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
39 3 Andreas Steffen
PCR_14: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
40 3 Andreas Steffen
PCR_15: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
41 3 Andreas Steffen
PCR_16: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
42 3 Andreas Steffen
PCR_17: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
43 3 Andreas Steffen
PCR_18: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
44 3 Andreas Steffen
PCR_19: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
45 3 Andreas Steffen
PCR_20: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
46 1 Andreas Steffen
PCR_21: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
47 1 Andreas Steffen
PCR_22: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
48 1 Andreas Steffen
PCR_23: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
49 18 Andreas Steffen
</pre>
50 1 Andreas Steffen
51 76 Andreas Steffen
A manual showing all *tpm2-tools* functions with their arguments can be found "here":https://github.com/tpm2-software/tpm2-tools/tree/3.1.0/man.
52 51 Andreas Steffen
53 51 Andreas Steffen
h3. Enable the strongSwan tpm Plugin
54 51 Andreas Steffen
55 51 Andreas Steffen
The strongSwan libtpmtss *tpm* plugin and the TSS2 interface are enabled and built with the following options
56 51 Andreas Steffen
57 78 Jean-François Hren
  ./configure --enable-tss-tss2 --enable-tpm  ...
58 7 Andreas Steffen
59 7 Andreas Steffen
h2. TPM 2.0 Algorithm IDs
60 7 Andreas Steffen
61 8 Andreas Steffen
h3. Hash Algorithms
62 8 Andreas Steffen
63 7 Andreas Steffen
|0x0004 |SHA-1     |
64 7 Andreas Steffen
|0x000B |SHA-2_256 |
65 7 Andreas Steffen
|0x000C |SHA-2_384 |
66 1 Andreas Steffen
|0x000D |SHA-2_512 |
67 7 Andreas Steffen
68 28 Andreas Steffen
Currently available TPM 2.0 devices like the Infineon *Optiga SLB 9670 VQ2.0* hardware TPM or Intel's *PTT* firmware TPM integrated into the Management Engine starting with the 4th generation (Haswell) of the *Core* processor family, support the *SHA-1* and *SHA-2_256* algorithms.
69 1 Andreas Steffen
70 8 Andreas Steffen
h3. Public Key Types
71 8 Andreas Steffen
72 8 Andreas Steffen
|0x0001 |RSA |
73 8 Andreas Steffen
|0x0023 |ECC |
74 1 Andreas Steffen
75 22 Andreas Steffen
Currently RSA keys have a modulus size of 2048 bits and ECC keys are based on the 256 bit NIST curve.
76 22 Andreas Steffen
77 11 Andreas Steffen
h3. Signature Schemes
78 11 Andreas Steffen
79 11 Andreas Steffen
|0x0014 |RSASSA |
80 11 Andreas Steffen
|0x0016 |RSAPSS |
81 9 Andreas Steffen
|0x0018 |ECDSA  |
82 64 Andreas Steffen
83 66 Andreas Steffen
h2. TPM 2.0 Attributes
84 66 Andreas Steffen
85 64 Andreas Steffen
h3. Object Attributes
86 64 Andreas Steffen
87 64 Andreas Steffen
|0x00002 |fixedTPM             |
88 64 Andreas Steffen
|0x00004 |stClear              |
89 64 Andreas Steffen
|0x00010 |fixedParent          |
90 64 Andreas Steffen
|0x00020 |sensitiveDataOrigin  |
91 64 Andreas Steffen
|0x00040 |userWithAuth         |
92 64 Andreas Steffen
|0x00080 |adminWithPolicy      |
93 64 Andreas Steffen
|0x00400 |noDA                 |
94 64 Andreas Steffen
|0x00800 |encryptedDuplication |
95 64 Andreas Steffen
|0x10000 |restricted           |
96 64 Andreas Steffen
|0x20000 |decrypt              |
97 64 Andreas Steffen
|0x40000 |sign                 |
98 64 Andreas Steffen
99 65 Andreas Steffen
h3. NV Index Attributes
100 65 Andreas Steffen
101 65 Andreas Steffen
|0x00000001 |NV_PPWRITE        |
102 65 Andreas Steffen
|0x00000002 |NV_OWNERWRITE     |
103 65 Andreas Steffen
|0x00000004 |NV_AUTHWRITE      |
104 65 Andreas Steffen
|0x00000008 |NV_POLICYWRITE    |
105 65 Andreas Steffen
|0x000000F0 |NT                |
106 65 Andreas Steffen
|0x00000400 |NV_POLICY_DELETE  |
107 65 Andreas Steffen
|0x00000800 |NV_WRITELOCKED    |
108 65 Andreas Steffen
|0x00001000 |NV_WRITEALL       |
109 65 Andreas Steffen
|0x00002000 |NV_WRITEDEFINE    |
110 65 Andreas Steffen
|0x00004000 |NV_WRITE_STCLEAR  |
111 65 Andreas Steffen
|0x00008000 |NV_GLOBALLOCK     |
112 65 Andreas Steffen
|0x00010000 |NV_PPEREAD        |
113 65 Andreas Steffen
|0x00020000 |NV_OWNERREAD      |
114 65 Andreas Steffen
|0x00040000 |NV_AUTHREAD       |
115 65 Andreas Steffen
|0x00080000 |NV_POLICYREAD     |
116 65 Andreas Steffen
|0x02000000 |NV_NO_DA          |
117 65 Andreas Steffen
|0x04000000 |NV_ORDERLY        |
118 65 Andreas Steffen
|0x08000000 |NV_CLEAR_STCLEAR  |
119 65 Andreas Steffen
|0x10000000 |NV_READLOCKED     |
120 65 Andreas Steffen
|0x20000000 |NV_WRITTEN        |
121 65 Andreas Steffen
|0x40000000 |NV_PLATFORMCREATE |
122 65 Andreas Steffen
|0x80000000 |NV_READ_STCLEAR   |
123 64 Andreas Steffen
124 20 Andreas Steffen
h2. Derive a Persistent RSA Endorsement Key
125 1 Andreas Steffen
126 25 Andreas Steffen
The following tpm2-tools command derives a 2048 bit RSA Endorsement Key (EK) in a deterministic way from the secret _Endorsement Primary Seed_ *unique* to each TPM device and makes the key persistent in the non-volatile memory of the TPM under the object handle 0x81010001
127 11 Andreas Steffen
128 82 Andreas Steffen
 tpm2_getpubek -H 0x81010001 -g rsa -f ek_rsa.pub
129 9 Andreas Steffen
130 27 Andreas Steffen
The EK public key stored in the ek_rsa.pub file is encoded in a TPM 2.0 proprietary format but the key can be exported from the TPM in the regular PKCS#1 format using the *pki* tool
131 9 Andreas Steffen
132 50 Andreas Steffen
 pki --pub --keyid 0x81010001 --outform pem > ek_rsa_pub.pem
133 9 Andreas Steffen
134 9 Andreas Steffen
The fingerprint of the RSA EK public key can be displayed with the command
135 9 Andreas Steffen
136 9 Andreas Steffen
 pki --print --type pub --in ek_rsa_pub.pem
137 9 Andreas Steffen
  pubkey:    RSA 2048 bits
138 9 Andreas Steffen
  keyid:     d1:f1:49:84:36:44:e6:8c:d2:a6:69:ee:fd:b5:7d:56:2f:39:ff:58
139 1 Andreas Steffen
  subjkey:   c1:1b:8e:f1:c7:f8:8a:1e:9a:dd:7e:82:2f:7a:a3:f5:c0:e2:4d:7d
140 1 Andreas Steffen
141 20 Andreas Steffen
h2. Generate a Persistent RSA Attestation Key
142 11 Andreas Steffen
143 12 Andreas Steffen
A 2048 bit RSA Attestation Key (AK) bound to the EK with handle 0x81010001 can be created and made persistent under the handle 0x81010002 with the following tpm2-tools command
144 1 Andreas Steffen
145 83 Andreas Steffen
 tpm2_getpubak -E 0x81010001 -g rsa -D sha256 -s rsassa -k 0x81010002 -P 123456 -f ak_rsa2.pub -n ak_rsa2.name
146 12 Andreas Steffen
147 46 Andreas Steffen
This AK key is protected by the PIN (-P parameter) *123456*. The AK public key can now be exported in PKCS#1 format from the TPM using the *pki* tool
148 12 Andreas Steffen
149 50 Andreas Steffen
 pki --pub --keyid 0x81010002 --outform pem > ak_rsa_pub.pem
150 12 Andreas Steffen
151 12 Andreas Steffen
The fingerprint of the RSA AK public key can be displayed with the command
152 12 Andreas Steffen
153 12 Andreas Steffen
 pki --print --type pub --in ak_rsa_pub.pem
154 12 Andreas Steffen
  pubkey:    RSA 2048 bits
155 12 Andreas Steffen
  keyid:     71:21:f5:d4:7e:59:4a:88:16:ca:57:85:98:3d:36:a7:b1:d5:75:fa
156 12 Andreas Steffen
  subjkey:   f4:9e:85:7d:de:4e:67:f5:fb:87:03:98:67:3f:20:7c:f3:3f:2b:66
157 11 Andreas Steffen
158 20 Andreas Steffen
h2. Derive a Persistent ECC Endorsement Key
159 1 Andreas Steffen
160 25 Andreas Steffen
The following tpm2-tools command derives a 256 bit ECC Endorsement Key (EK) in a deterministic way from the secret _Endorsement Primary Seed_ *unique* to each TPM device and makes the key persistent in the non-volatile memory of the TPM under the object handle 0x81010003:
161 1 Andreas Steffen
162 82 Andreas Steffen
 tpm2_getpubek -H 0x81010003 -g ecc -f ek_ecc.pub
163 9 Andreas Steffen
164 67 Andreas Steffen
Without exporting the public key first the fingerprint of the ECC EK private key can be directly displayed with the command
165 9 Andreas Steffen
166 67 Andreas Steffen
 pki --print --type priv --keyid 0x81010003
167 9 Andreas Steffen
  pubkey:    ECDSA 256 bits
168 9 Andreas Steffen
  keyid:     7f:39:ca:e6:83:9b:a9:06:97:40:27:6a:e1:bf:8f:f5:9f:d3:a5:31
169 9 Andreas Steffen
  subjkey:   8b:43:4d:5e:5e:7b:ff:c2:54:4d:ef:88:cb:0c:7c:47:75:28:4d:09
170 9 Andreas Steffen
171 20 Andreas Steffen
h2. Generate a Persistent ECC Attestation Key
172 13 Andreas Steffen
173 13 Andreas Steffen
A 256 bit ECC Attestation Key (AK) bound to the EK with handle 0x81010003 can be created and made persistent under the handle 0x81010004 with the following tpm2-tools command
174 13 Andreas Steffen
175 84 Andreas Steffen
 tpm2_getpubak -E 0x81010003 -g ecc -D sha256 -s ecdsa -k 0x81010004 -f ak_ecc4.pub -n ak_ecc4.name
176 13 Andreas Steffen
177 13 Andreas Steffen
The AK public key can be exported in PKCS#1 format from the TPM using the *pki* tool
178 13 Andreas Steffen
179 50 Andreas Steffen
 pki --pub --keyid 0x81010004 > ak_ecc_pub.der
180 13 Andreas Steffen
181 52 Andreas Steffen
The fingerprint of the ECC AK public key can be displayed with the command
182 13 Andreas Steffen
183 14 Andreas Steffen
 pki --print --type pub --in ak_ecc_pub.der
184 1 Andreas Steffen
  pubkey:    ECDSA 256 bits
185 1 Andreas Steffen
  keyid:     71:49:7c:42:41:e7:c6:81:bc:31:73:f0:0f:7e:4a:e1:2d:53:00:38
186 1 Andreas Steffen
  subjkey:   c7:0e:63:f8:7f:6f:f6:55:00:e5:05:7f:5a:3e:6b:6c:e7:d2:d5:13
187 15 Andreas Steffen
188 20 Andreas Steffen
h2. Generate Another ECC Attestation Key
189 15 Andreas Steffen
190 15 Andreas Steffen
Multiple AK keys bound to a common EK key can be generated
191 15 Andreas Steffen
192 85 Andreas Steffen
 tpm2_getpubak -E 0x81010003 -g ecc -D sha256 -s ecdsa -k 0x81010005 -f ak_ecc5.pub -n ak_ecc5.name
193 15 Andreas Steffen
194 68 Andreas Steffen
The fingerprint of the second ECC AK private key can be displayed with the command
195 15 Andreas Steffen
196 68 Andreas Steffen
 pki --print --type priv --in 0x81010005
197 15 Andreas Steffen
  pubkey:    ECDSA 256 bits
198 15 Andreas Steffen
  keyid:     c4:b4:9c:95:27:9e:ce:81:2f:98:42:c8:1b:f0:54:ff:d4:d1:24:34
199 15 Andreas Steffen
  subjkey:   cf:44:f4:f7:9d:97:09:ad:b1:09:3a:8e:6f:23:eb:9f:2c:35:94:c9
200 15 Andreas Steffen
201 19 Andreas Steffen
h2. Remove a Persistent Key Object
202 15 Andreas Steffen
203 15 Andreas Steffen
Since the non-volatile memory of the TPM is limited any persistent key object can be removed to free storage space.
204 15 Andreas Steffen
The following tpm2-tools command removes the ECC AK key with persistent handle 0x81010005
205 15 Andreas Steffen
206 1 Andreas Steffen
 tpm2_evictcontrol -A o -H 0x81010005 -S 0x81010005
207 18 Andreas Steffen
208 18 Andreas Steffen
h2. List Persistent Objects
209 18 Andreas Steffen
210 18 Andreas Steffen
The following tpm2-tools command lists all persistent objects stored by the TPM in non-volatile memory
211 18 Andreas Steffen
212 18 Andreas Steffen
 tpm2_listpersistent
213 18 Andreas Steffen
214 18 Andreas Steffen
<pre>
215 18 Andreas Steffen
6 persistent objects defined.
216 18 Andreas Steffen
217 18 Andreas Steffen
0. Persistent handle: 0x81000001
218 18 Andreas Steffen
{
219 18 Andreas Steffen
        Type: 0x23
220 18 Andreas Steffen
        Hash algorithm(nameAlg): 0xb
221 18 Andreas Steffen
        Attributes: 0x30072
222 18 Andreas Steffen
}
223 18 Andreas Steffen
1. Persistent handle: 0x81000002
224 18 Andreas Steffen
{
225 18 Andreas Steffen
        Type: 0x23
226 18 Andreas Steffen
        Hash algorithm(nameAlg): 0xb
227 18 Andreas Steffen
        Attributes: 0x60072
228 18 Andreas Steffen
}
229 18 Andreas Steffen
2. Persistent handle: 0x81010001
230 18 Andreas Steffen
{
231 18 Andreas Steffen
        Type: 0x1
232 18 Andreas Steffen
        Hash algorithm(nameAlg): 0xb
233 18 Andreas Steffen
        Attributes: 0x300b2
234 18 Andreas Steffen
}
235 18 Andreas Steffen
3. Persistent handle: 0x81010002
236 18 Andreas Steffen
{
237 18 Andreas Steffen
        Type: 0x1
238 18 Andreas Steffen
        Hash algorithm(nameAlg): 0xb
239 18 Andreas Steffen
        Attributes: 0x50072
240 18 Andreas Steffen
}
241 18 Andreas Steffen
4. Persistent handle: 0x81010003
242 18 Andreas Steffen
{
243 18 Andreas Steffen
        Type: 0x23
244 18 Andreas Steffen
        Hash algorithm(nameAlg): 0xb
245 18 Andreas Steffen
        Attributes: 0x300b2
246 18 Andreas Steffen
}
247 18 Andreas Steffen
5. Persistent handle: 0x81010004
248 18 Andreas Steffen
{
249 18 Andreas Steffen
        Type: 0x23
250 18 Andreas Steffen
        Hash algorithm(nameAlg): 0xb
251 18 Andreas Steffen
        Attributes: 0x50072
252 18 Andreas Steffen
}
253 18 Andreas Steffen
</pre>
254 13 Andreas Steffen
255 41 Andreas Steffen
h2. Create a Demo Root CA
256 41 Andreas Steffen
257 41 Andreas Steffen
The following *pki* command creates a 256 bit ECDSA private key for the Demo CA
258 41 Andreas Steffen
<pre>
259 41 Andreas Steffen
pki --gen --type ecdsa --size 256 --outform pem > demoCaKey.pem
260 41 Andreas Steffen
</pre>
261 41 Andreas Steffen
262 41 Andreas Steffen
Next we create a self-signed Root CA certificate
263 41 Andreas Steffen
<pre>
264 41 Andreas Steffen
pki --self --ca --type ecdsa --in demoCaKey.pem --dn="C=US, O=TNC Demo, CN=TNC Demo CA" --lifetime 3652 --outform pem > demoCaCert.pem
265 41 Andreas Steffen
</pre>
266 41 Andreas Steffen
267 42 Andreas Steffen
h2. Issue an RSA AIK Certificate
268 41 Andreas Steffen
269 42 Andreas Steffen
Based on the RSA AK public key exported from the TPM, the following *pki* command generates an Attestation Identity Key (AIK) certificate signed by the Demo CA
270 41 Andreas Steffen
<pre>
271 41 Andreas Steffen
pki --issue --cacert demoCaCert.pem --cakey demoCaKey.pem --type pub --in ak_rsa_pub.der --dn "C=US, O=TNC Demo, OU=AIK RSA, CN=raspi5.example.com" --san raspi5.example.com --lifetime 3651 > raspi5_ak_rsa_Cert.der
272 41 Andreas Steffen
</pre>
273 41 Andreas Steffen
274 42 Andreas Steffen
h2. Issue an ECC AIK Certificate
275 41 Andreas Steffen
276 42 Andreas Steffen
Based on the ECC AK public key exported from the TPM, the following *pki* command generates an Attestation Identity Key (AIK) certificate signed by the Demo CA
277 41 Andreas Steffen
<pre>
278 41 Andreas Steffen
pki --issue --cacert demoCaCert.pem --cakey demoCaKey.pem --type pub --in ak_ecc_pub.der --dn "C=US, O=TNC Demo, OU=AIK ECC, CN=raspi5.example.com" --san raspi5.example.com --lifetime 3651 > raspi5_ak_ecc_Cert.der
279 41 Andreas Steffen
</pre>
280 47 Andreas Steffen
281 49 Andreas Steffen
Many certification authorities issue certificates based on PKCS#10 certificate requests. This approach is also possible. First a certificate request is generated on the host the TPM resides on
282 47 Andreas Steffen
<pre>
283 50 Andreas Steffen
 pki --req --keyid 0x81010004 --dn "C=US, O=TNC Demo, OU=AIK ECC, CN=raspi5.example.com" --san raspi5.example.com > ak_ecc_req.der
284 47 Andreas Steffen
</pre>
285 49 Andreas Steffen
When you are prompted for a smartcard PIN just press <enter> since this TPM private key is not protected by a PIN. In a second step the CA issues the AIK certificate based on the PKCS#10 certificate request
286 49 Andreas Steffen
<pre>
287 47 Andreas Steffen
pki --issue --cacert demoCaCert.pem --cakey demoCaKey.pem --type pkcs10 --in ak_ecc_req.der --lifetime 3651 > raspi5_ak_ecc_Cert.der
288 47 Andreas Steffen
</pre>
289 47 Andreas Steffen
290 54 Andreas Steffen
h2. Store the ECC AIK Certificate in the NV RAM of the TPM
291 54 Andreas Steffen
292 55 Andreas Steffen
A TPM 2.0 has a certain amount of Non Volatile Random Access Memory (NV RAM) that can be used to store arbitrary data, e.g. the X.509 certificates matching the persistent keys. IF both the certificates and keys are persisted in the TPM then the system disk of the host can be reformatted at any time without loosing the machine or user credentials.As with smartcards the needed amount of memory must be reserved first so we check the size of the X.509 ECC certificate
293 54 Andreas Steffen
<pre>
294 54 Andreas Steffen
ls -l raspi5_ak_ecc_Cert.der
295 63 Andreas Steffen
-rw-r--r-- 1 root root 449 Feb 17  2017 raspi5_ak_ecc_Cert.der
296 54 Andreas Steffen
</pre>
297 54 Andreas Steffen
298 54 Andreas Steffen
We then define a memory location with a size of 449 bytes that can be accessed via the handle 0x01800004 which is also called the NV index
299 54 Andreas Steffen
<pre>
300 54 Andreas Steffen
tpm2_nvdefine -x 0x01800004 -a 0x40000001 -s 449 -t 0x2000A
301 54 Andreas Steffen
</pre>
302 54 Andreas Steffen
303 54 Andreas Steffen
Then we write the certificate file to the NV RAM destination
304 54 Andreas Steffen
<pre>
305 70 Andreas Steffen
tpm2_nvwrite -x 0x01800004 -a 0x40000001 raspi5_ak_ecc_Cert.der
306 54 Andreas Steffen
</pre>
307 54 Andreas Steffen
308 62 Andreas Steffen
h2. List of NV Indexes
309 54 Andreas Steffen
310 62 Andreas Steffen
A list of all defined NV indexes can be obtained with
311 57 Andreas Steffen
312 57 Andreas Steffen
 tpm2_nvlist
313 57 Andreas Steffen
314 55 Andreas Steffen
<pre>
315 54 Andreas Steffen
2 NV indexes defined.
316 54 Andreas Steffen
317 54 Andreas Steffen
  0. NV Index: 0x1500015
318 54 Andreas Steffen
  {
319 54 Andreas Steffen
	Hash algorithm(nameAlg):4
320 54 Andreas Steffen
 	The Index attributes(attributes):0x44040004
321 54 Andreas Steffen
 	The size of the data area(dataSize):4
322 54 Andreas Steffen
   }
323 54 Andreas Steffen
  1. NV Index: 0x1800004
324 54 Andreas Steffen
  {
325 54 Andreas Steffen
	Hash algorithm(nameAlg):11
326 54 Andreas Steffen
 	The Index attributes(attributes):0x2002000a
327 1 Andreas Steffen
 	The size of the data area(dataSize):449
328 1 Andreas Steffen
   }
329 62 Andreas Steffen
</pre>
330 62 Andreas Steffen
331 62 Andreas Steffen
h2. Remove NV Index
332 62 Andreas Steffen
333 62 Andreas Steffen
The memory assigned to a given NV index can be released with the command
334 62 Andreas Steffen
<pre>
335 62 Andreas Steffen
tpm2_nvrelease -x 0x01800001 -a 0x40000001
336 54 Andreas Steffen
</pre>
337 54 Andreas Steffen
338 30 Andreas Steffen
h2. Configure TPM Private Key Access via VICI Interface
339 1 Andreas Steffen
340 23 Andreas Steffen
Configuration of TPM private key access as tokens in the secrets section of *swanctl.conf*
341 1 Andreas Steffen
342 7 Andreas Steffen
 secrets {
343 1 Andreas Steffen
    token_ak_rsa {
344 1 Andreas Steffen
       handle = 81010002
345 46 Andreas Steffen
       pin = 123456
346 1 Andreas Steffen
    }
347 1 Andreas Steffen
    token_ak_ecc {
348 7 Andreas Steffen
       handle = 81010004
349 1 Andreas Steffen
    }
350 1 Andreas Steffen
}
351 46 Andreas Steffen
Since the use of the RSA AK private key is password-protected, the PIN *123456* is added.
352 30 Andreas Steffen
353 30 Andreas Steffen
h2. Define IPsec Connection with RSA AK Client Key
354 30 Andreas Steffen
355 30 Andreas Steffen
This connection configuration in *swanctl.conf* uses the RSA AK certificate for client authentication
356 30 Andreas Steffen
<pre>
357 30 Andreas Steffen
connections {
358 30 Andreas Steffen
   rsa {
359 30 Andreas Steffen
      local_addrs  = 10.10.0.105
360 30 Andreas Steffen
      remote_addrs = 10.10.0.104
361 30 Andreas Steffen
362 30 Andreas Steffen
      local {
363 30 Andreas Steffen
         auth = pubkey 
364 30 Andreas Steffen
         certs = raspi5_ak_rsa_Cert.der
365 30 Andreas Steffen
      }
366 30 Andreas Steffen
      remote {
367 30 Andreas Steffen
         auth = pubkey 
368 30 Andreas Steffen
         id = raspi4.example.com
369 30 Andreas Steffen
      }
370 30 Andreas Steffen
      children {
371 30 Andreas Steffen
         rsa {
372 30 Andreas Steffen
            mode = transport
373 30 Andreas Steffen
            esp_proposals = aes128-sha256-curve25519
374 30 Andreas Steffen
         }
375 30 Andreas Steffen
      }
376 30 Andreas Steffen
      version = 2
377 30 Andreas Steffen
      proposals = aes128-sha256-curve25519
378 30 Andreas Steffen
   }
379 30 Andreas Steffen
}
380 30 Andreas Steffen
</pre>
381 30 Andreas Steffen
382 30 Andreas Steffen
h2. Define IPsec Connection with ECC AK Client Key
383 30 Andreas Steffen
384 58 Andreas Steffen
This connection configuration in *swanctl.conf* references the ECC AK certificate used for client authentication via its handle, i.e. the NV index
385 30 Andreas Steffen
<pre>
386 30 Andreas Steffen
connections {
387 30 Andreas Steffen
   ecc {
388 30 Andreas Steffen
      local_addrs  = 10.10.0.105
389 30 Andreas Steffen
      remote_addrs = 10.10.0.104
390 30 Andreas Steffen
391 30 Andreas Steffen
      local {
392 1 Andreas Steffen
         auth = pubkey
393 58 Andreas Steffen
         cert-tpm {
394 58 Andreas Steffen
            handle = 0x01800004
395 58 Andreas Steffen
         }
396 30 Andreas Steffen
      }
397 30 Andreas Steffen
      remote {
398 30 Andreas Steffen
         auth = pubkey
399 30 Andreas Steffen
         id = raspi4.example.com
400 30 Andreas Steffen
      }
401 30 Andreas Steffen
      children {
402 30 Andreas Steffen
         ecc {
403 30 Andreas Steffen
            mode = transport
404 30 Andreas Steffen
            esp_proposals = aes128-sha256-curve25519
405 30 Andreas Steffen
         }
406 30 Andreas Steffen
      }
407 30 Andreas Steffen
      version = 2
408 30 Andreas Steffen
      proposals = aes128-sha256-curve25519
409 30 Andreas Steffen
   }
410 30 Andreas Steffen
}
411 30 Andreas Steffen
</pre>
412 29 Andreas Steffen
413 29 Andreas Steffen
h2. Starting the strongSwan Daemon
414 29 Andreas Steffen
415 29 Andreas Steffen
<pre>
416 29 Andreas Steffen
systemctl start strongswan-swanctl
417 29 Andreas Steffen
</pre>
418 29 Andreas Steffen
419 29 Andreas Steffen
<pre>
420 44 Andreas Steffen
Feb 19 10:52:01 raspi5 systemd[1]: Starting strongSwan IPsec IKEv1/IKEv2 daemon using swanctl...
421 44 Andreas Steffen
Feb 19 10:52:01 raspi5 charon-systemd[21165]: loaded plugins: charon-systemd charon-systemd random nonce x509 constraints openssl pem pkcs1 pkcs8 pkcs12 pubkey mgf1 ntru curve25519 eap-identity eap-ttls eap-tnc tnc-tnccs tnc-imc tnccs-20 socket-default kernel-netlink vici tpm
422 44 Andreas Steffen
Feb 19 10:52:01 raspi5 charon-systemd[21165]: spawning 16 worker threads
423 44 Andreas Steffen
Feb 19 10:52:01 raspi5 charon-systemd[21165]: loaded certificate 'C=US, O=TNC Demo, OU=AIK RSA, CN=raspi5.example.com'
424 44 Andreas Steffen
Feb 19 10:52:01 raspi5 charon-systemd[21165]: loaded certificate 'C=US, O=TNC Demo, CN=TNC Demo CA'
425 1 Andreas Steffen
</pre>
426 1 Andreas Steffen
427 59 Andreas Steffen
The RSA AK private key is attached to the *charon-systemd* daemon via the TPM 2.0 resource manager
428 1 Andreas Steffen
<pre>
429 44 Andreas Steffen
Feb 19 10:52:01 raspi5 charon-systemd[21165]: TPM 2.0 - manufacturer: IFX (SLB9670) rev: 01.16 2015
430 53 Andreas Steffen
Feb 19 10:52:01 raspi5 charon-systemd[21165]: TPM 2.0 - algorithms: RSA SHA1 HMAC AES KEYEDHASH XOR SHA256 RSASSA RSAES RSAPSS OAEP ECDSA ECDH SM2 KDF1_SP800_56A KDF1_SP800_108 ECC SYMCIPHER CFB
431 44 Andreas Steffen
Feb 19 10:52:01 raspi5 charon-systemd[21165]: TPM 2.0 - ECC curves: NIST_P256 BN_P256
432 73 Andreas Steffen
Feb 19 10:52:01 raspi5 charon-systemd[21165]: TPM 2.0 via TSS2 v2 available
433 44 Andreas Steffen
Feb 19 10:52:01 raspi5 charon-systemd[21165]: AIK signature algorithm is RSASSA with SHA256 hash
434 44 Andreas Steffen
Feb 19 10:52:01 raspi5 charon-systemd[21165]: loaded RSA private key from token
435 1 Andreas Steffen
F</pre>
436 1 Andreas Steffen
437 1 Andreas Steffen
The ECC AK private key is attached to the *charon-systemd* daemon via the TPM 2.0 resource manager
438 44 Andreas Steffen
<pre>
439 44 Andreas Steffen
Feb 19 10:52:01 raspi5 charon-systemd[21165]: TPM 2.0 - manufacturer: IFX (SLB9670) rev: 01.16 2015
440 53 Andreas Steffen
Feb 19 10:52:01 raspi5 charon-systemd[21165]: TPM 2.0 - algorithms: RSA SHA1 HMAC AES KEYEDHASH XOR SHA256 RSASSA RSAES RSAPSS OAEP ECDSA ECDH SM2 KDF1_SP800_56A KDF1_SP800_108 ECC SYMCIPHER CFB
441 44 Andreas Steffen
Feb 19 10:52:02 raspi5 charon-systemd[21165]: TPM 2.0 - ECC curves: NIST_P256 BN_P256
442 73 Andreas Steffen
Feb 19 10:52:02 raspi5 charon-systemd[21165]: TPM 2.0 via TSS2 v2 available
443 1 Andreas Steffen
Feb 19 10:52:02 raspi5 charon-systemd[21165]: AIK signature algorithm is ECDSA with SHA256 hash
444 1 Andreas Steffen
Feb 19 10:52:02 raspi5 charon-systemd[21165]: loaded ECDSA private key from token
445 1 Andreas Steffen
</pre>
446 59 Andreas Steffen
447 59 Andreas Steffen
The ECC AIK certificate is loaded by the *charon-systemd* daemon via the TPM 2.0 resource manager
448 59 Andreas Steffen
<pre>
449 59 Andreas Steffen
Feb 19 10:52:02 raspi5 charon-systemd[21165]: TPM 2.0 - manufacturer: IFX (SLB9670) rev: 01.16 2015
450 59 Andreas Steffen
Feb 19 10:52:02 raspi5 charon-systemd[21165]: TPM 2.0 - algorithms: RSA SHA1 HMAC AES KEYEDHASH XOR SHA256 RSASSA RSAES RSAPSS OAEP ECDSA ECDH SM2 KDF1_SP800_56A KDF1_SP800_108 ECC SYMCIPHER CFB
451 59 Andreas Steffen
Feb 19 10:52:02 raspi5 charon-systemd[21165]: TPM 2.0 - ECC curves: NIST_P256 BN_P256
452 73 Andreas Steffen
Feb 19 10:52:02 raspi5 charon-systemd[21165]: TPM 2.0 via TSS2 v2 available
453 60 Andreas Steffen
Feb 19 10:52:02 raspi5 charon-systemd[21165]: loaded certificate from TPM NV index 0x01800004
454 59 Andreas Steffen
</pre>
455 59 Andreas Steffen
456 59 Andreas Steffen
The two connection definitions are received by the *charon-systemd* daemon from the *swanctl* command line tool via the VICI interface
457 59 Andreas Steffen
<pre>
458 1 Andreas Steffen
Feb 19 10:52:02 raspi5 charon-systemd[21165]:   id not specified, defaulting to cert subject 'C=US, O=TNC Demo, OU=AIK RSA, CN=raspi5.example.com'
459 1 Andreas Steffen
Feb 19 10:52:02 raspi5 charon-systemd[21165]: added vici connection: rsa
460 1 Andreas Steffen
Feb 19 10:52:02 raspi5 charon-systemd[21165]:   id not specified, defaulting to cert subject 'C=US, O=TNC Demo, OU=AIK ECC, CN=raspi5.example.com'
461 44 Andreas Steffen
Feb 19 10:52:02 raspi5 charon-systemd[21165]: added vici connection: ecc
462 59 Andreas Steffen
</pre>
463 59 Andreas Steffen
464 59 Andreas Steffen
The *swanctl* command line tool reports its actions
465 59 Andreas Steffen
<pre>
466 44 Andreas Steffen
Feb 19 10:52:02 raspi5 swanctl[21183]: loaded certificate from '/etc/swanctl/x509/raspi5_ak_rsa_Cert.der'
467 44 Andreas Steffen
Feb 19 10:52:02 raspi5 swanctl[21183]: loaded certificate from '/etc/swanctl/x509ca/demoCaCert.pem'
468 44 Andreas Steffen
Feb 19 10:52:02 raspi5 swanctl[21183]: loaded key token_ak_rsa from token [keyid: f49e857dde4e67f5fb870398673f207cf33f2b66]
469 44 Andreas Steffen
Feb 19 10:52:02 raspi5 swanctl[21183]: loaded key token_ak_ecc from token [keyid: c70e63f87f6ff65500e5057f5a3e6b6ce7d2d513]
470 44 Andreas Steffen
Feb 19 10:52:02 raspi5 swanctl[21183]: loaded connection 'rsa'
471 44 Andreas Steffen
Feb 19 10:52:02 raspi5 swanctl[21183]: loaded connection 'ecc'
472 44 Andreas Steffen
Feb 19 10:52:02 raspi5 swanctl[21183]: successfully loaded 2 connections, 0 unloaded
473 31 Andreas Steffen
</pre>
474 31 Andreas Steffen
475 31 Andreas Steffen
<pre>
476 44 Andreas Steffen
Feb 19 10:52:02 raspi5 systemd[1]: Started strongSwan IPsec IKEv1/IKEv2 daemon using swanctl.
477 31 Andreas Steffen
</pre>
478 31 Andreas Steffen
479 31 Andreas Steffen
The following *swanctl* command shows the two loaded connections
480 31 Andreas Steffen
<pre>
481 31 Andreas Steffen
swanctl --list-conns
482 31 Andreas Steffen
</pre>
483 31 Andreas Steffen
484 31 Andreas Steffen
<pre>
485 31 Andreas Steffen
rsa: IKEv2, reauthentication every 10800s, no rekeying
486 31 Andreas Steffen
  local:  10.10.0.105
487 31 Andreas Steffen
  remote: 10.10.0.104
488 31 Andreas Steffen
  local public key authentication:
489 31 Andreas Steffen
    id: C=US, O=TNC Demo, OU=AIK RSA, CN=raspi5.example.com
490 31 Andreas Steffen
    certs: C=US, O=TNC Demo, OU=AIK RSA, CN=raspi5.example.com
491 31 Andreas Steffen
  remote public key authentication:
492 31 Andreas Steffen
    id: raspi4.example.com
493 31 Andreas Steffen
  rsa: TRANSPORT, rekeying every 3600s or 300000000 bytes or 500000 packets
494 31 Andreas Steffen
    local:  dynamic
495 31 Andreas Steffen
    remote: dynamic
496 31 Andreas Steffen
</pre>
497 31 Andreas Steffen
498 31 Andreas Steffen
<pre>
499 31 Andreas Steffen
ecc: IKEv2, reauthentication every 10800s, no rekeying
500 31 Andreas Steffen
  local:  10.10.0.105
501 31 Andreas Steffen
  remote: 10.10.0.104
502 31 Andreas Steffen
  local public key authentication:
503 31 Andreas Steffen
    id: C=US, O=TNC Demo, OU=AIK ECC, CN=raspi5.example.com
504 31 Andreas Steffen
    certs: C=US, O=TNC Demo, OU=AIK ECC, CN=raspi5.example.com
505 31 Andreas Steffen
  remote public key authentication:
506 31 Andreas Steffen
    id: raspi4.example.com
507 31 Andreas Steffen
  ecc: TRANSPORT, rekeying every 3600s or 300000000 bytes or 500000 packets
508 31 Andreas Steffen
    local:  dynamic
509 32 Andreas Steffen
    remote: dynamic
510 31 Andreas Steffen
</pre>
511 31 Andreas Steffen
512 31 Andreas Steffen
The loaded certificates can also be displayed
513 31 Andreas Steffen
<pre>
514 31 Andreas Steffen
swanctl --list-certs
515 31 Andreas Steffen
</pre>
516 31 Andreas Steffen
517 31 Andreas Steffen
You can clearly see that the connection between the AK certificates and their matching AK private key has been established (..., has private key)
518 31 Andreas Steffen
<pre>
519 31 Andreas Steffen
List of X.509 End Entity Certificates
520 31 Andreas Steffen
521 31 Andreas Steffen
  subject:  "C=US, O=TNC Demo, OU=AIK RSA, CN=raspi5.example.com"
522 31 Andreas Steffen
  issuer:   "C=US, O=TNC Demo, CN=TNC Demo CA"
523 31 Andreas Steffen
  validity:  not before Feb 19 09:33:43 2017, ok
524 31 Andreas Steffen
             not after  Aug 29 10:33:43 2026, ok (expires in 3477 days)
525 31 Andreas Steffen
  serial:    11:57:33:3e:2a:8e:8a:32
526 31 Andreas Steffen
  altNames:  raspi5.example.com
527 31 Andreas Steffen
  authkeyId: 21:02:7e:2d:de:8b:77:48:75:de:56:2f:b5:d4:62:ec:c3:09:15:f2
528 31 Andreas Steffen
  subjkeyId: f4:9e:85:7d:de:4e:67:f5:fb:87:03:98:67:3f:20:7c:f3:3f:2b:66
529 31 Andreas Steffen
  pubkey:    RSA 2048 bits, has private key
530 31 Andreas Steffen
  keyid:     71:21:f5:d4:7e:59:4a:88:16:ca:57:85:98:3d:36:a7:b1:d5:75:fa
531 31 Andreas Steffen
  subjkey:   f4:9e:85:7d:de:4e:67:f5:fb:87:03:98:67:3f:20:7c:f3:3f:2b:66
532 31 Andreas Steffen
533 31 Andreas Steffen
  subject:  "C=US, O=TNC Demo, OU=AIK ECC, CN=raspi5.example.com"
534 31 Andreas Steffen
  issuer:   "C=US, O=TNC Demo, CN=TNC Demo CA"
535 31 Andreas Steffen
  validity:  not before Feb 17 23:17:19 2017, ok
536 31 Andreas Steffen
             not after  Aug 30 00:17:19 2026, ok (expires in 3478 days)
537 31 Andreas Steffen
  serial:    52:9d:3e:42:6f:71:63:3d
538 31 Andreas Steffen
  altNames:  raspi5.example.com
539 31 Andreas Steffen
  authkeyId: 21:02:7e:2d:de:8b:77:48:75:de:56:2f:b5:d4:62:ec:c3:09:15:f2
540 31 Andreas Steffen
  subjkeyId: c7:0e:63:f8:7f:6f:f6:55:00:e5:05:7f:5a:3e:6b:6c:e7:d2:d5:13
541 31 Andreas Steffen
  pubkey:    ECDSA 256 bits, has private key
542 31 Andreas Steffen
  keyid:     71:49:7c:42:41:e7:c6:81:bc:31:73:f0:0f:7e:4a:e1:2d:53:00:38
543 31 Andreas Steffen
  subjkey:   c7:0e:63:f8:7f:6f:f6:55:00:e5:05:7f:5a:3e:6b:6c:e7:d2:d5:13
544 31 Andreas Steffen
</pre>
545 31 Andreas Steffen
546 31 Andreas Steffen
<pre>
547 31 Andreas Steffen
List of X.509 CA Certificates
548 31 Andreas Steffen
549 31 Andreas Steffen
  subject:  "C=US, O=TNC Demo, CN=TNC Demo CA"
550 1 Andreas Steffen
  issuer:   "C=US, O=TNC Demo, CN=TNC Demo CA"
551 32 Andreas Steffen
  validity:  not before Aug 31 10:29:27 2016, ok
552 32 Andreas Steffen
             not after  Aug 31 10:29:27 2026, ok (expires in 3479 days)
553 43 Andreas Steffen
  serial:    02:c8:85:e1:ef:fa:8f:20
554 32 Andreas Steffen
  flags:     CA CRLSign self-signed 
555 38 Andreas Steffen
  subjkeyId: 21:02:7e:2d:de:8b:77:48:75:de:56:2f:b5:d4:62:ec:c3:09:15:f2
556 32 Andreas Steffen
  pubkey:    ECDSA 256 bits
557 32 Andreas Steffen
  keyid:     a1:b5:e0:29:d0:4c:a7:62:bd:ca:a3:b4:af:18:42:2c:4a:01:55:9a
558 32 Andreas Steffen
  subjkey:   21:02:7e:2d:de:8b:77:48:75:de:56:2f:b5:d4:62:ec:c3:09:15:f2
559 32 Andreas Steffen
</pre>
560 32 Andreas Steffen
561 32 Andreas Steffen
h2. IKEv2 Authentication with RSA AIK Certificate
562 32 Andreas Steffen
563 32 Andreas Steffen
With the following *swanctl* command the "rsa" connection is established
564 32 Andreas Steffen
<pre>
565 32 Andreas Steffen
swanctl --initiate --child rsa
566 32 Andreas Steffen
</pre>
567 32 Andreas Steffen
568 32 Andreas Steffen
<pre>
569 45 Andreas Steffen
Feb 19 10:52:21 raspi5 charon-systemd[21165]: vici initiate 'rsa'
570 32 Andreas Steffen
Feb 19 10:52:21 raspi5 charon-systemd[21165]: initiating IKE_SA rsa[1] to 10.10.0.104
571 40 Andreas Steffen
Feb 19 10:52:21 raspi5 charon-systemd[21165]: generating IKE_SA_INIT request 0 [ SA KE No N(NATD_S_IP) N(NATD_D_IP) N(FRAG_SUP) N(HASH_ALG) N(REDIR_SUP) V ]
572 40 Andreas Steffen
Feb 19 10:52:21 raspi5 charon-systemd[21165]: sending packet: from 10.10.0.105[500] to 10.10.0.104[500] (1257 bytes)
573 32 Andreas Steffen
Feb 19 10:52:21 raspi5 charon-systemd[21165]: received packet: from 10.10.0.104[500] to 10.10.0.105[500] (1259 bytes)
574 32 Andreas Steffen
Feb 19 10:52:21 raspi5 charon-systemd[21165]: parsed IKE_SA_INIT response 0 [ SA KE No N(NATD_S_IP) N(NATD_D_IP) CERTREQ N(HASH_ALG) V ]
575 32 Andreas Steffen
Feb 19 10:52:21 raspi5 charon-systemd[21165]: received strongSwan vendor ID
576 32 Andreas Steffen
Feb 19 10:52:21 raspi5 charon-systemd[21165]: received cert request for "C=US, O=TNC Demo, CN=TNC Demo CA"
577 32 Andreas Steffen
Feb 19 10:52:21 raspi5 charon-systemd[21165]: sending cert request for "C=US, O=TNC Demo, CN=TNC Demo CA"
578 32 Andreas Steffen
</pre>
579 32 Andreas Steffen
580 32 Andreas Steffen
The RSA AK private key stored in the TPM 2.0 is used to generate an *RSA_EMSA_PKCS1_SHA2_256* signature which is sent in the AUTH payload of the IKE_AUTH request. The matching client certificate is sent int the CERT payload.
581 32 Andreas Steffen
<pre>
582 32 Andreas Steffen
Feb 19 10:52:24 raspi5 charon-systemd[21165]: authentication of 'C=US, O=TNC Demo, OU=AIK RSA, CN=raspi5.example.com' (myself) with RSA_EMSA_PKCS1_SHA2_256 successful
583 32 Andreas Steffen
Feb 19 10:52:24 raspi5 charon-systemd[21165]: sending end entity cert "C=US, O=TNC Demo, OU=AIK RSA, CN=raspi5.example.com"
584 32 Andreas Steffen
</pre>
585 32 Andreas Steffen
<pre>
586 32 Andreas Steffen
Feb 19 10:52:24 raspi5 charon-systemd[21165]: establishing CHILD_SA rsa
587 32 Andreas Steffen
Feb 19 10:52:24 raspi5 charon-systemd[21165]: generating IKE_AUTH request 1 [ IDi CERT CERTREQ IDr AUTH N(USE_TRANSP) SA TSi TSr N(MOBIKE_SUP) N(ADD_6_ADDR) N(EAP_ONLY) N(MSG_ID_SYN_SUP) ]
588 32 Andreas Steffen
Feb 19 10:52:24 raspi5 charon-systemd[21165]: sending packet: from 10.10.0.105[4500] to 10.10.0.104[4500] (1296 bytes)
589 32 Andreas Steffen
Feb 19 10:52:24 raspi5 charon-systemd[21165]: received packet: from 10.10.0.104[4500] to 10.10.0.105[4500] (752 bytes)
590 32 Andreas Steffen
Feb 19 10:52:24 raspi5 charon-systemd[21165]: parsed IKE_AUTH response 1 [ IDr CERT AUTH N(USE_TRANSP) SA TSi TSr N(AUTH_LFT) N(MOBIKE_SUP) N(NO_ADD_ADDR) ]
591 32 Andreas Steffen
Feb 19 10:52:24 raspi5 charon-systemd[21165]: received end entity cert "C=US, O=TNC Demo, CN=raspi4.example.com"
592 32 Andreas Steffen
Feb 19 10:52:24 raspi5 charon-systemd[21165]:   using certificate "C=US, O=TNC Demo, CN=raspi4.example.com"
593 32 Andreas Steffen
Feb 19 10:52:24 raspi5 charon-systemd[21165]:   using trusted ca certificate "C=US, O=TNC Demo, CN=TNC Demo CA"
594 32 Andreas Steffen
Feb 19 10:52:24 raspi5 charon-systemd[21165]:   reached self-signed root ca with a path length of 0
595 32 Andreas Steffen
Feb 19 10:52:24 raspi5 charon-systemd[21165]: authentication of 'raspi4.example.com' with ECDSA_WITH_SHA256_DER successful
596 38 Andreas Steffen
Feb 19 10:52:24 raspi5 charon-systemd[21165]: IKE_SA rsa[1] established between 10.10.0.105[C=US, O=TNC Demo, OU=AIK RSA, CN=raspi5.example.com]...10.10.0.104[raspi4.example.com]
597 32 Andreas Steffen
Feb 19 10:52:24 raspi5 charon-systemd[21165]: scheduling reauthentication in 10507s
598 32 Andreas Steffen
Feb 19 10:52:24 raspi5 charon-systemd[21165]: maximum IKE_SA lifetime 11587s
599 32 Andreas Steffen
Feb 19 10:52:24 raspi5 charon-systemd[21165]: CHILD_SA rsa{1} established with SPIs c23deb9d_i ce48d08e_o and TS 10.10.0.105/32 === 10.10.0.104/32
600 32 Andreas Steffen
Feb 19 10:52:24 raspi5 charon-systemd[21165]: received AUTH_LIFETIME of 10103s, scheduling reauthentication in 9023s
601 32 Andreas Steffen
Feb 19 10:52:24 raspi5 charon-systemd[21165]: peer supports MOBIKE
602 32 Andreas Steffen
</pre>
603 32 Andreas Steffen
604 32 Andreas Steffen
The following *swanctl* command shows the established IPsec connection
605 32 Andreas Steffen
<pre>
606 32 Andreas Steffen
 swanctl --list-sas
607 32 Andreas Steffen
</pre>
608 32 Andreas Steffen
<pre>
609 32 Andreas Steffen
rsa: #1, ESTABLISHED, IKEv2, 7ba3b4d06c051ecb_i* 14e1769a8aeb7f28_r
610 32 Andreas Steffen
  local  'C=US, O=TNC Demo, OU=AIK RSA, CN=raspi5.example.com' @ 10.10.0.105[4500]
611 32 Andreas Steffen
  remote 'raspi4.example.com' @ 10.10.0.104[4500]
612 32 Andreas Steffen
  AES_CBC-128/HMAC_SHA2_256_128/PRF_HMAC_SHA2_256/CURVE_25519
613 32 Andreas Steffen
  established 252s ago, reauth in 8771s
614 38 Andreas Steffen
  rsa: #1, reqid 1, INSTALLED, TRANSPORT, ESP:AES_CBC-128/HMAC_SHA2_256_128
615 33 Andreas Steffen
    installed 252s ago, rekeying in 3258s, expires in 3708s
616 33 Andreas Steffen
    in  c23deb9d,    640 bytes,    10 packets,     3s ago
617 33 Andreas Steffen
    out ce48d08e,    640 bytes,    10 packets,     3s ago
618 33 Andreas Steffen
    local  10.10.0.105/32
619 33 Andreas Steffen
    remote 10.10.0.104/32
620 33 Andreas Steffen
</pre>
621 33 Andreas Steffen
622 33 Andreas Steffen
With this *swanctl* command the "rsa" connection is terminated
623 33 Andreas Steffen
<pre>
624 33 Andreas Steffen
swanctl --terminate --ike rsa
625 33 Andreas Steffen
</pre>
626 33 Andreas Steffen
627 33 Andreas Steffen
<pre>
628 33 Andreas Steffen
Feb 19 10:59:16 raspi5 charon-systemd[21165]: vici terminate IKE_SA 'rsa'
629 33 Andreas Steffen
Feb 19 10:59:16 raspi5 charon-systemd[21165]: deleting IKE_SA rsa[1] between 10.10.0.105[C=US, O=TNC Demo, OU=AIK RSA, CN=raspi5.example.com]...10.10.0.104[raspi4.example.com]
630 43 Andreas Steffen
Feb 19 10:59:16 raspi5 charon-systemd[21165]: sending DELETE for IKE_SA rsa[1]
631 32 Andreas Steffen
Feb 19 10:59:16 raspi5 charon-systemd[21165]: generating INFORMATIONAL request 2 [ D ]
632 38 Andreas Steffen
Feb 19 10:59:16 raspi5 charon-systemd[21165]: sending packet: from 10.10.0.105[4500] to 10.10.0.104[4500] (80 bytes)
633 32 Andreas Steffen
Feb 19 10:59:16 raspi5 charon-systemd[21165]: received packet: from 10.10.0.104[4500] to 10.10.0.105[4500] (80 bytes)
634 32 Andreas Steffen
Feb 19 10:59:16 raspi5 charon-systemd[21165]: parsed INFORMATIONAL response 2 [ ]
635 33 Andreas Steffen
Feb 19 10:59:16 raspi5 charon-systemd[21165]: IKE_SA deleted
636 33 Andreas Steffen
</pre>
637 33 Andreas Steffen
638 33 Andreas Steffen
h2. IKEv2 Authentication with ECC AIK Certificate
639 33 Andreas Steffen
640 33 Andreas Steffen
Next we initiate the "ecc" connection
641 33 Andreas Steffen
<pre>
642 33 Andreas Steffen
swanctl --initiate --child ecc
643 33 Andreas Steffen
</pre>
644 33 Andreas Steffen
645 33 Andreas Steffen
<pre>
646 45 Andreas Steffen
Feb 19 11:00:32 raspi5 charon-systemd[21165]: vici initiate 'ecc'
647 33 Andreas Steffen
Feb 19 11:00:32 raspi5 charon-systemd[21165]: initiating IKE_SA ecc[2] to 10.10.0.104
648 40 Andreas Steffen
Feb 19 11:00:32 raspi5 charon-systemd[21165]: generating IKE_SA_INIT request 0 [ SA KE No N(NATD_S_IP) N(NATD_D_IP) N(FRAG_SUP) N(HASH_ALG) N(REDIR_SUP) V ]
649 40 Andreas Steffen
Feb 19 11:00:32 raspi5 charon-systemd[21165]: sending packet: from 10.10.0.105[500] to 10.10.0.104[500] (1257 bytes)
650 33 Andreas Steffen
Feb 19 11:00:32 raspi5 charon-systemd[21165]: received packet: from 10.10.0.104[500] to 10.10.0.105[500] (1259 bytes)
651 33 Andreas Steffen
Feb 19 11:00:32 raspi5 charon-systemd[21165]: parsed IKE_SA_INIT response 0 [ SA KE No N(NATD_S_IP) N(NATD_D_IP) CERTREQ N(HASH_ALG) V ]
652 33 Andreas Steffen
Feb 19 11:00:32 raspi5 charon-systemd[21165]: received strongSwan vendor ID
653 33 Andreas Steffen
Feb 19 11:00:32 raspi5 charon-systemd[21165]: received cert request for "C=US, O=TNC Demo, CN=TNC Demo CA"
654 33 Andreas Steffen
Feb 19 11:00:32 raspi5 charon-systemd[21165]: sending cert request for "C=US, O=TNC Demo, CN=TNC Demo CA"
655 33 Andreas Steffen
</pre>
656 33 Andreas Steffen
657 33 Andreas Steffen
The ECC AK private key stored in the TPM 2.0 is used to generate an *ECDSA_WITH_SHA256_DER* signature which is sent in the AUTH payload of the IKE_AUTH request. The matching client certificate is sent int the CERT payload.
658 33 Andreas Steffen
<pre>
659 33 Andreas Steffen
Feb 19 11:00:34 raspi5 charon-systemd[21165]: authentication of 'C=US, O=TNC Demo, OU=AIK ECC, CN=raspi5.example.com' (myself) with ECDSA_WITH_SHA256_DER successful
660 33 Andreas Steffen
Feb 19 11:00:34 raspi5 charon-systemd[21165]: sending end entity cert "C=US, O=TNC Demo, OU=AIK ECC, CN=raspi5.example.com"
661 33 Andreas Steffen
</pre>
662 33 Andreas Steffen
<pre>
663 33 Andreas Steffen
Feb 19 11:00:34 raspi5 charon-systemd[21165]: establishing CHILD_SA ecc
664 33 Andreas Steffen
Feb 19 11:00:34 raspi5 charon-systemd[21165]: generating IKE_AUTH request 1 [ IDi CERT CERTREQ IDr AUTH N(USE_TRANSP) SA TSi TSr N(MOBIKE_SUP) N(ADD_6_ADDR) N(EAP_ONLY) N(MSG_ID_SYN_SUP) ]
665 33 Andreas Steffen
Feb 19 11:00:34 raspi5 charon-systemd[21165]: sending packet: from 10.10.0.105[4500] to 10.10.0.104[4500] (912 bytes)
666 33 Andreas Steffen
Feb 19 11:00:34 raspi5 charon-systemd[21165]: received packet: from 10.10.0.104[4500] to 10.10.0.105[4500] (752 bytes)
667 33 Andreas Steffen
Feb 19 11:00:34 raspi5 charon-systemd[21165]: parsed IKE_AUTH response 1 [ IDr CERT AUTH N(USE_TRANSP) SA TSi TSr N(AUTH_LFT) N(MOBIKE_SUP) N(NO_ADD_ADDR) ]
668 33 Andreas Steffen
Feb 19 11:00:34 raspi5 charon-systemd[21165]: received end entity cert "C=US, O=TNC Demo, CN=raspi4.example.com"
669 33 Andreas Steffen
Feb 19 11:00:34 raspi5 charon-systemd[21165]:   using certificate "C=US, O=TNC Demo, CN=raspi4.example.com"
670 33 Andreas Steffen
Feb 19 11:00:34 raspi5 charon-systemd[21165]:   using trusted ca certificate "C=US, O=TNC Demo, CN=TNC Demo CA"
671 33 Andreas Steffen
Feb 19 11:00:34 raspi5 charon-systemd[21165]:   reached self-signed root ca with a path length of 0
672 33 Andreas Steffen
Feb 19 11:00:34 raspi5 charon-systemd[21165]: authentication of 'raspi4.example.com' with ECDSA_WITH_SHA256_DER successful
673 39 Andreas Steffen
Feb 19 11:00:34 raspi5 charon-systemd[21165]: IKE_SA ecc[2] established between 10.10.0.105[C=US, O=TNC Demo, OU=AIK ECC, CN=raspi5.example.com]...10.10.0.104[raspi4.example.com]
674 33 Andreas Steffen
Feb 19 11:00:34 raspi5 charon-systemd[21165]: scheduling reauthentication in 10180s
675 33 Andreas Steffen
Feb 19 11:00:34 raspi5 charon-systemd[21165]: maximum IKE_SA lifetime 11260s
676 33 Andreas Steffen
Feb 19 11:00:34 raspi5 charon-systemd[21165]: CHILD_SA ecc{2} established with SPIs c2c16cd0_i c47ea6f6_o and TS 10.10.0.105/32 === 10.10.0.104/32
677 33 Andreas Steffen
Feb 19 11:00:34 raspi5 charon-systemd[21165]: received AUTH_LIFETIME of 9880s, scheduling reauthentication in 8800s
678 33 Andreas Steffen
Feb 19 11:00:34 raspi5 charon-systemd[21165]: peer supports MOBIKE
679 33 Andreas Steffen
</pre>
680 33 Andreas Steffen
681 33 Andreas Steffen
The establed IKE and CHILD SAs are displayed
682 33 Andreas Steffen
<pre>
683 33 Andreas Steffen
 swanctl --list-sas
684 33 Andreas Steffen
</pre>
685 33 Andreas Steffen
<pre>
686 33 Andreas Steffen
ecc: #2, ESTABLISHED, IKEv2, b7f2652777b0996a_i* 12282b5964ff0658_r
687 1 Andreas Steffen
  local  'C=US, O=TNC Demo, OU=AIK ECC, CN=raspi5.example.com' @ 10.10.0.105[4500]
688 1 Andreas Steffen
  remote 'raspi4.example.com' @ 10.10.0.104[4500]
689 34 Andreas Steffen
  AES_CBC-128/HMAC_SHA2_256_128/PRF_HMAC_SHA2_256/CURVE_25519
690 34 Andreas Steffen
  established 126s ago, reauth in 8674s
691 39 Andreas Steffen
  ecc: #2, reqid 2, INSTALLED, TRANSPORT, ESP:AES_CBC-128/HMAC_SHA2_256_128
692 34 Andreas Steffen
    installed 126s ago, rekeying in 3252s, expires in 3834s
693 34 Andreas Steffen
    in  c2c16cd0,    320 bytes,     5 packets,     2s ago
694 34 Andreas Steffen
    out c47ea6f6,    320 bytes,     5 packets,     2s ago
695 34 Andreas Steffen
    local  10.10.0.105/32
696 34 Andreas Steffen
    remote 10.10.0.104/32
697 34 Andreas Steffen
</pre>
698 34 Andreas Steffen
699 34 Andreas Steffen
The IKE and CHILD SAs are terminated
700 34 Andreas Steffen
<pre>
701 34 Andreas Steffen
swanctl --terminate --ike ecc
702 34 Andreas Steffen
</pre>
703 34 Andreas Steffen
704 34 Andreas Steffen
<pre>
705 34 Andreas Steffen
Feb 19 11:04:32 raspi5 charon-systemd[21165]: vici terminate IKE_SA 'ecc'
706 34 Andreas Steffen
Feb 19 11:04:32 raspi5 charon-systemd[21165]: deleting IKE_SA ecc[2] between 10.10.0.105[C=US, O=TNC Demo, OU=AIK ECC, CN=raspi5.example.com]...10.10.0.104[raspi4.example.com]
707 34 Andreas Steffen
Feb 19 11:04:32 raspi5 charon-systemd[21165]: sending DELETE for IKE_SA ecc[2]
708 34 Andreas Steffen
Feb 19 11:04:32 raspi5 charon-systemd[21165]: generating INFORMATIONAL request 2 [ D ]
709 39 Andreas Steffen
Feb 19 11:04:32 raspi5 charon-systemd[21165]: sending packet: from 10.10.0.105[4500] to 10.10.0.104[4500] (80 bytes)
710 34 Andreas Steffen
Feb 19 11:04:32 raspi5 charon-systemd[21165]: received packet: from 10.10.0.104[4500] to 10.10.0.105[4500] (80 bytes)
711 34 Andreas Steffen
Feb 19 11:04:32 raspi5 charon-systemd[21165]: parsed INFORMATIONAL response 2 [ ]
712 34 Andreas Steffen
Feb 19 11:04:32 raspi5 charon-systemd[21165]: IKE_SA deleted
713 1 Andreas Steffen
</pre>