Project

General

Profile

Trusted Platform Module 2.0 » History » Version 66

Andreas Steffen, 11.12.2017 12:42

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 51 Andreas Steffen
h3. Install the TSS2 Software Stack and tpm2 Tools
8 51 Andreas Steffen
9 5 Andreas Steffen
In order to connect to a TPM 2.0 hardware or firmware device, the TSS2 software stack developed by Intel is needed. Because the official Ubuntu *tpm2-tss* package is rather outdated (e.g. since version 0.98 the TCTI interface to the TPM 2.0 resource manager has changed several times), strongSwan is currently based on a recent version directly drawn from the TPM2-TSS git repository https://github.com/01org/TPM2.0-TSS. Avoid any TCTI interface incompatibilities by fetching the latest *tpm2-tools* version from https://github.com/01org/tpm2.0-tools as well.
10 1 Andreas Steffen
11 11 Andreas Steffen
Build and install both the *tpm2-tss* stack and the *tpm2.0-tools*, start the *tpm2-resourcemgr* as a service in the background and try to connect to the TPM 2.0 by listing e.g. the contents of the SHA-1 bank of PCR registers
12 1 Andreas Steffen
13 7 Andreas Steffen
   
14 7 Andreas Steffen
 tpm2_listpcrs -g 0x0004
15 3 Andreas Steffen
16 18 Andreas Steffen
<pre>
17 18 Andreas Steffen
Bank/Algorithm: TPM_ALG_SHA1(0x0004)
18 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
19 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
20 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
21 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
22 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
23 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
24 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
25 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
26 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
27 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
28 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
29 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
30 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
31 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
32 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
33 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
34 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
35 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
36 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
37 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
38 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
39 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
40 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
41 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
42 18 Andreas Steffen
</pre>
43 1 Andreas Steffen
44 1 Andreas Steffen
A manual showing all *tpm2-tools* functions with their arguments can be found "here":https://github.com/01org/tpm2.0-tools/blob/master/manual.
45 51 Andreas Steffen
46 51 Andreas Steffen
h3. Enable the strongSwan tpm Plugin
47 51 Andreas Steffen
48 51 Andreas Steffen
The strongSwan libtpmtss *tpm* plugin and the TSS2 interface are enabled and built with the following options
49 51 Andreas Steffen
50 51 Andreas Steffen
  ./configure --enable-tss-tss2 --enable tpm  ...
51 7 Andreas Steffen
52 7 Andreas Steffen
h2. TPM 2.0 Algorithm IDs
53 7 Andreas Steffen
54 8 Andreas Steffen
h3. Hash Algorithms
55 8 Andreas Steffen
56 7 Andreas Steffen
|0x0004 |SHA-1     |
57 7 Andreas Steffen
|0x000B |SHA-2_256 |
58 7 Andreas Steffen
|0x000C |SHA-2_384 |
59 1 Andreas Steffen
|0x000D |SHA-2_512 |
60 7 Andreas Steffen
61 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.
62 1 Andreas Steffen
63 8 Andreas Steffen
h3. Public Key Types
64 8 Andreas Steffen
65 8 Andreas Steffen
|0x0001 |RSA |
66 8 Andreas Steffen
|0x0023 |ECC |
67 1 Andreas Steffen
68 22 Andreas Steffen
Currently RSA keys have a modulus size of 2048 bits and ECC keys are based on the 256 bit NIST curve.
69 22 Andreas Steffen
70 11 Andreas Steffen
h3. Signature Schemes
71 11 Andreas Steffen
72 11 Andreas Steffen
|0x0014 |RSASSA |
73 11 Andreas Steffen
|0x0016 |RSAPSS |
74 9 Andreas Steffen
|0x0018 |ECDSA  |
75 64 Andreas Steffen
76 66 Andreas Steffen
h2. TPM 2.0 Attributes
77 66 Andreas Steffen
78 64 Andreas Steffen
h3. Object Attributes
79 64 Andreas Steffen
80 64 Andreas Steffen
|0x00002 |fixedTPM             |
81 64 Andreas Steffen
|0x00004 |stClear              |
82 64 Andreas Steffen
|0x00010 |fixedParent          |
83 64 Andreas Steffen
|0x00020 |sensitiveDataOrigin  |
84 64 Andreas Steffen
|0x00040 |userWithAuth         |
85 64 Andreas Steffen
|0x00080 |adminWithPolicy      |
86 64 Andreas Steffen
|0x00400 |noDA                 |
87 64 Andreas Steffen
|0x00800 |encryptedDuplication |
88 64 Andreas Steffen
|0x10000 |restricted           |
89 64 Andreas Steffen
|0x20000 |decrypt              |
90 64 Andreas Steffen
|0x40000 |sign                 |
91 64 Andreas Steffen
92 65 Andreas Steffen
h3. NV Index Attributes
93 65 Andreas Steffen
94 65 Andreas Steffen
|0x00000001 |NV_PPWRITE        |
95 65 Andreas Steffen
|0x00000002 |NV_OWNERWRITE     |
96 65 Andreas Steffen
|0x00000004 |NV_AUTHWRITE      |
97 65 Andreas Steffen
|0x00000008 |NV_POLICYWRITE    |
98 65 Andreas Steffen
|0x000000F0 |NT                |
99 65 Andreas Steffen
|0x00000400 |NV_POLICY_DELETE  |
100 65 Andreas Steffen
|0x00000800 |NV_WRITELOCKED    |
101 65 Andreas Steffen
|0x00001000 |NV_WRITEALL       |
102 65 Andreas Steffen
|0x00002000 |NV_WRITEDEFINE    |
103 65 Andreas Steffen
|0x00004000 |NV_WRITE_STCLEAR  |
104 65 Andreas Steffen
|0x00008000 |NV_GLOBALLOCK     |
105 65 Andreas Steffen
|0x00010000 |NV_PPEREAD        |
106 65 Andreas Steffen
|0x00020000 |NV_OWNERREAD      |
107 65 Andreas Steffen
|0x00040000 |NV_AUTHREAD       |
108 65 Andreas Steffen
|0x00080000 |NV_POLICYREAD     |
109 65 Andreas Steffen
|0x02000000 |NV_NO_DA          |
110 65 Andreas Steffen
|0x04000000 |NV_ORDERLY        |
111 65 Andreas Steffen
|0x08000000 |NV_CLEAR_STCLEAR  |
112 65 Andreas Steffen
|0x10000000 |NV_READLOCKED     |
113 65 Andreas Steffen
|0x20000000 |NV_WRITTEN        |
114 65 Andreas Steffen
|0x40000000 |NV_PLATFORMCREATE |
115 65 Andreas Steffen
|0x80000000 |NV_READ_STCLEAR   |
116 64 Andreas Steffen
117 20 Andreas Steffen
h2. Derive a Persistent RSA Endorsement Key
118 1 Andreas Steffen
119 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
120 11 Andreas Steffen
121 24 Andreas Steffen
 tpm2_getpubek -H 0x81010001 -g 0x0001 -f ek_rsa.pub
122 9 Andreas Steffen
123 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
124 9 Andreas Steffen
125 50 Andreas Steffen
 pki --pub --keyid 0x81010001 --outform pem > ek_rsa_pub.pem
126 9 Andreas Steffen
127 9 Andreas Steffen
The fingerprint of the RSA EK public key can be displayed with the command
128 9 Andreas Steffen
129 9 Andreas Steffen
 pki --print --type pub --in ek_rsa_pub.pem
130 9 Andreas Steffen
  pubkey:    RSA 2048 bits
131 9 Andreas Steffen
  keyid:     d1:f1:49:84:36:44:e6:8c:d2:a6:69:ee:fd:b5:7d:56:2f:39:ff:58
132 1 Andreas Steffen
  subjkey:   c1:1b:8e:f1:c7:f8:8a:1e:9a:dd:7e:82:2f:7a:a3:f5:c0:e2:4d:7d
133 1 Andreas Steffen
134 20 Andreas Steffen
h2. Generate a Persistent RSA Attestation Key
135 11 Andreas Steffen
136 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
137 1 Andreas Steffen
138 46 Andreas Steffen
 tpm2_getpubak -E 0x81010001 -g 0x0001 -D 0x000B -s 0x0014 -k 0x81010002 -P 123456 -f ak_rsa2.pub -n ak_rsa2.name
139 12 Andreas Steffen
140 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
141 12 Andreas Steffen
142 50 Andreas Steffen
 pki --pub --keyid 0x81010002 --outform pem > ak_rsa_pub.pem
143 12 Andreas Steffen
144 12 Andreas Steffen
The fingerprint of the RSA AK public key can be displayed with the command
145 12 Andreas Steffen
146 12 Andreas Steffen
 pki --print --type pub --in ak_rsa_pub.pem
147 12 Andreas Steffen
  pubkey:    RSA 2048 bits
148 12 Andreas Steffen
  keyid:     71:21:f5:d4:7e:59:4a:88:16:ca:57:85:98:3d:36:a7:b1:d5:75:fa
149 12 Andreas Steffen
  subjkey:   f4:9e:85:7d:de:4e:67:f5:fb:87:03:98:67:3f:20:7c:f3:3f:2b:66
150 11 Andreas Steffen
151 20 Andreas Steffen
h2. Derive a Persistent ECC Endorsement Key
152 1 Andreas Steffen
153 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:
154 1 Andreas Steffen
155 24 Andreas Steffen
 tpm2_getpubek -H 0x81010003 -g 0x0023 -f ek_ecc.pub
156 9 Andreas Steffen
157 11 Andreas Steffen
The EK public key can be exported in PKCS#1 format from the TPM using the *pki* tool:
158 11 Andreas Steffen
159 50 Andreas Steffen
  pki --pub --keyid 0x81010003 > ek_ecc_pub.der
160 9 Andreas Steffen
161 9 Andreas Steffen
The fingerprint of the ECC EK public key can be displayed with the command
162 9 Andreas Steffen
163 10 Andreas Steffen
 pki --print --type pub --in ek_ecc_pub.der
164 9 Andreas Steffen
  pubkey:    ECDSA 256 bits
165 9 Andreas Steffen
  keyid:     7f:39:ca:e6:83:9b:a9:06:97:40:27:6a:e1:bf:8f:f5:9f:d3:a5:31
166 9 Andreas Steffen
  subjkey:   8b:43:4d:5e:5e:7b:ff:c2:54:4d:ef:88:cb:0c:7c:47:75:28:4d:09
167 9 Andreas Steffen
168 20 Andreas Steffen
h2. Generate a Persistent ECC Attestation Key
169 13 Andreas Steffen
170 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
171 13 Andreas Steffen
172 15 Andreas Steffen
 tpm2_getpubak -E 0x81010003 -g 0x0023 -D 0x000B -s 0x0018 -k 0x81010004 -f ak_ecc4.pub -n ak_ecc4.name
173 13 Andreas Steffen
174 13 Andreas Steffen
The AK public key can be exported in PKCS#1 format from the TPM using the *pki* tool
175 13 Andreas Steffen
176 50 Andreas Steffen
 pki --pub --keyid 0x81010004 > ak_ecc_pub.der
177 13 Andreas Steffen
178 52 Andreas Steffen
The fingerprint of the ECC AK public key can be displayed with the command
179 13 Andreas Steffen
180 14 Andreas Steffen
 pki --print --type pub --in ak_ecc_pub.der
181 1 Andreas Steffen
  pubkey:    ECDSA 256 bits
182 1 Andreas Steffen
  keyid:     71:49:7c:42:41:e7:c6:81:bc:31:73:f0:0f:7e:4a:e1:2d:53:00:38
183 1 Andreas Steffen
  subjkey:   c7:0e:63:f8:7f:6f:f6:55:00:e5:05:7f:5a:3e:6b:6c:e7:d2:d5:13
184 15 Andreas Steffen
185 20 Andreas Steffen
h2. Generate Another ECC Attestation Key
186 15 Andreas Steffen
187 15 Andreas Steffen
Multiple AK keys bound to a common EK key can be generated
188 15 Andreas Steffen
189 15 Andreas Steffen
 tpm2_getpubak -E 0x81010003 -g 0x0023 -D 0x000B -s 0x0018 -k 0x81010005 -f ak_ecc5.pub -n ak_ecc5.name
190 15 Andreas Steffen
191 15 Andreas Steffen
The AK public key can be exported in PKCS#1 format from the TPM using the *pki* tool
192 15 Andreas Steffen
193 50 Andreas Steffen
 pki --pub --keyid 0x81010005 > ak_ecc5_pub.der
194 15 Andreas Steffen
195 15 Andreas Steffen
The fingerprint of the second ECC AK public key can be displayed with the command
196 15 Andreas Steffen
197 15 Andreas Steffen
 pki --print --type pub --in ak_ecc5_pub.der
198 15 Andreas Steffen
  pubkey:    ECDSA 256 bits
199 15 Andreas Steffen
  keyid:     c4:b4:9c:95:27:9e:ce:81:2f:98:42:c8:1b:f0:54:ff:d4:d1:24:34
200 15 Andreas Steffen
  subjkey:   cf:44:f4:f7:9d:97:09:ad:b1:09:3a:8e:6f:23:eb:9f:2c:35:94:c9
201 15 Andreas Steffen
202 19 Andreas Steffen
h2. Remove a Persistent Key Object
203 15 Andreas Steffen
204 15 Andreas Steffen
Since the non-volatile memory of the TPM is limited any persistent key object can be removed to free storage space.
205 15 Andreas Steffen
The following tpm2-tools command removes the ECC AK key with persistent handle 0x81010005
206 15 Andreas Steffen
207 1 Andreas Steffen
 tpm2_evictcontrol -A o -H 0x81010005 -S 0x81010005
208 18 Andreas Steffen
209 18 Andreas Steffen
h2. List Persistent Objects
210 18 Andreas Steffen
211 18 Andreas Steffen
The following tpm2-tools command lists all persistent objects stored by the TPM in non-volatile memory
212 18 Andreas Steffen
213 18 Andreas Steffen
 tpm2_listpersistent
214 18 Andreas Steffen
215 18 Andreas Steffen
<pre>
216 18 Andreas Steffen
6 persistent objects defined.
217 18 Andreas Steffen
218 18 Andreas Steffen
0. Persistent handle: 0x81000001
219 18 Andreas Steffen
{
220 18 Andreas Steffen
        Type: 0x23
221 18 Andreas Steffen
        Hash algorithm(nameAlg): 0xb
222 18 Andreas Steffen
        Attributes: 0x30072
223 18 Andreas Steffen
}
224 18 Andreas Steffen
1. Persistent handle: 0x81000002
225 18 Andreas Steffen
{
226 18 Andreas Steffen
        Type: 0x23
227 18 Andreas Steffen
        Hash algorithm(nameAlg): 0xb
228 18 Andreas Steffen
        Attributes: 0x60072
229 18 Andreas Steffen
}
230 18 Andreas Steffen
2. Persistent handle: 0x81010001
231 18 Andreas Steffen
{
232 18 Andreas Steffen
        Type: 0x1
233 18 Andreas Steffen
        Hash algorithm(nameAlg): 0xb
234 18 Andreas Steffen
        Attributes: 0x300b2
235 18 Andreas Steffen
}
236 18 Andreas Steffen
3. Persistent handle: 0x81010002
237 18 Andreas Steffen
{
238 18 Andreas Steffen
        Type: 0x1
239 18 Andreas Steffen
        Hash algorithm(nameAlg): 0xb
240 18 Andreas Steffen
        Attributes: 0x50072
241 18 Andreas Steffen
}
242 18 Andreas Steffen
4. Persistent handle: 0x81010003
243 18 Andreas Steffen
{
244 18 Andreas Steffen
        Type: 0x23
245 18 Andreas Steffen
        Hash algorithm(nameAlg): 0xb
246 18 Andreas Steffen
        Attributes: 0x300b2
247 18 Andreas Steffen
}
248 18 Andreas Steffen
5. Persistent handle: 0x81010004
249 18 Andreas Steffen
{
250 18 Andreas Steffen
        Type: 0x23
251 18 Andreas Steffen
        Hash algorithm(nameAlg): 0xb
252 18 Andreas Steffen
        Attributes: 0x50072
253 18 Andreas Steffen
}
254 18 Andreas Steffen
</pre>
255 13 Andreas Steffen
256 41 Andreas Steffen
h2. Create a Demo Root CA
257 41 Andreas Steffen
258 41 Andreas Steffen
The following *pki* command creates a 256 bit ECDSA private key for the Demo CA
259 41 Andreas Steffen
<pre>
260 41 Andreas Steffen
pki --gen --type ecdsa --size 256 --outform pem > demoCaKey.pem
261 41 Andreas Steffen
</pre>
262 41 Andreas Steffen
263 41 Andreas Steffen
Next we create a self-signed Root CA certificate
264 41 Andreas Steffen
<pre>
265 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
266 41 Andreas Steffen
</pre>
267 41 Andreas Steffen
268 42 Andreas Steffen
h2. Issue an RSA AIK Certificate
269 41 Andreas Steffen
270 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
271 41 Andreas Steffen
<pre>
272 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
273 41 Andreas Steffen
</pre>
274 41 Andreas Steffen
275 42 Andreas Steffen
h2. Issue an ECC AIK Certificate
276 41 Andreas Steffen
277 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
278 41 Andreas Steffen
<pre>
279 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
280 41 Andreas Steffen
</pre>
281 47 Andreas Steffen
282 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
283 47 Andreas Steffen
<pre>
284 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
285 47 Andreas Steffen
</pre>
286 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
287 49 Andreas Steffen
<pre>
288 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
289 47 Andreas Steffen
</pre>
290 47 Andreas Steffen
291 54 Andreas Steffen
h2. Store the ECC AIK Certificate in the NV RAM of the TPM
292 54 Andreas Steffen
293 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
294 54 Andreas Steffen
<pre>
295 54 Andreas Steffen
ls -l raspi5_ak_ecc_Cert.der
296 63 Andreas Steffen
-rw-r--r-- 1 root root 449 Feb 17  2017 raspi5_ak_ecc_Cert.der
297 54 Andreas Steffen
</pre>
298 54 Andreas Steffen
299 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
300 54 Andreas Steffen
<pre>
301 54 Andreas Steffen
tpm2_nvdefine -x 0x01800004 -a 0x40000001 -s 449 -t 0x2000A
302 54 Andreas Steffen
</pre>
303 54 Andreas Steffen
304 54 Andreas Steffen
Then we write the certificate file to the NV RAM destination
305 54 Andreas Steffen
<pre>
306 54 Andreas Steffen
tpm2_nvwrite -x 0x01800004 -a 0x40000001 -f raspi5_ak_ecc_Cert.der
307 54 Andreas Steffen
</pre>
308 54 Andreas Steffen
309 62 Andreas Steffen
h2. List of NV Indexes
310 54 Andreas Steffen
311 62 Andreas Steffen
A list of all defined NV indexes can be obtained with
312 57 Andreas Steffen
313 57 Andreas Steffen
 tpm2_nvlist
314 57 Andreas Steffen
315 55 Andreas Steffen
<pre>
316 54 Andreas Steffen
2 NV indexes defined.
317 54 Andreas Steffen
318 54 Andreas Steffen
  0. NV Index: 0x1500015
319 54 Andreas Steffen
  {
320 54 Andreas Steffen
	Hash algorithm(nameAlg):4
321 54 Andreas Steffen
 	The Index attributes(attributes):0x44040004
322 54 Andreas Steffen
 	The size of the data area(dataSize):4
323 54 Andreas Steffen
   }
324 54 Andreas Steffen
  1. NV Index: 0x1800004
325 54 Andreas Steffen
  {
326 54 Andreas Steffen
	Hash algorithm(nameAlg):11
327 54 Andreas Steffen
 	The Index attributes(attributes):0x2002000a
328 1 Andreas Steffen
 	The size of the data area(dataSize):449
329 1 Andreas Steffen
   }
330 62 Andreas Steffen
</pre>
331 62 Andreas Steffen
332 62 Andreas Steffen
h2. Remove NV Index
333 62 Andreas Steffen
334 62 Andreas Steffen
The memory assigned to a given NV index can be released with the command
335 62 Andreas Steffen
<pre>
336 62 Andreas Steffen
tpm2_nvrelease -x 0x01800001 -a 0x40000001
337 54 Andreas Steffen
</pre>
338 54 Andreas Steffen
339 30 Andreas Steffen
h2. Configure TPM Private Key Access via VICI Interface
340 1 Andreas Steffen
341 23 Andreas Steffen
Configuration of TPM private key access as tokens in the secrets section of *swanctl.conf*
342 1 Andreas Steffen
343 7 Andreas Steffen
 secrets {
344 1 Andreas Steffen
    token_ak_rsa {
345 1 Andreas Steffen
       handle = 81010002
346 46 Andreas Steffen
       pin = 123456
347 1 Andreas Steffen
    }
348 1 Andreas Steffen
    token_ak_ecc {
349 7 Andreas Steffen
       handle = 81010004
350 1 Andreas Steffen
    }
351 1 Andreas Steffen
}
352 46 Andreas Steffen
Since the use of the RSA AK private key is password-protected, the PIN *123456* is added.
353 30 Andreas Steffen
354 30 Andreas Steffen
h2. Define IPsec Connection with RSA AK Client Key
355 30 Andreas Steffen
356 30 Andreas Steffen
This connection configuration in *swanctl.conf* uses the RSA AK certificate for client authentication
357 30 Andreas Steffen
<pre>
358 30 Andreas Steffen
connections {
359 30 Andreas Steffen
   rsa {
360 30 Andreas Steffen
      local_addrs  = 10.10.0.105
361 30 Andreas Steffen
      remote_addrs = 10.10.0.104
362 30 Andreas Steffen
363 30 Andreas Steffen
      local {
364 30 Andreas Steffen
         auth = pubkey 
365 30 Andreas Steffen
         certs = raspi5_ak_rsa_Cert.der
366 30 Andreas Steffen
      }
367 30 Andreas Steffen
      remote {
368 30 Andreas Steffen
         auth = pubkey 
369 30 Andreas Steffen
         id = raspi4.example.com
370 30 Andreas Steffen
      }
371 30 Andreas Steffen
      children {
372 30 Andreas Steffen
         rsa {
373 30 Andreas Steffen
            mode = transport
374 30 Andreas Steffen
            esp_proposals = aes128-sha256-curve25519
375 30 Andreas Steffen
         }
376 30 Andreas Steffen
      }
377 30 Andreas Steffen
      version = 2
378 30 Andreas Steffen
      proposals = aes128-sha256-curve25519
379 30 Andreas Steffen
   }
380 30 Andreas Steffen
}
381 30 Andreas Steffen
</pre>
382 30 Andreas Steffen
383 30 Andreas Steffen
h2. Define IPsec Connection with ECC AK Client Key
384 30 Andreas Steffen
385 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
386 30 Andreas Steffen
<pre>
387 30 Andreas Steffen
connections {
388 30 Andreas Steffen
   ecc {
389 30 Andreas Steffen
      local_addrs  = 10.10.0.105
390 30 Andreas Steffen
      remote_addrs = 10.10.0.104
391 30 Andreas Steffen
392 30 Andreas Steffen
      local {
393 1 Andreas Steffen
         auth = pubkey
394 58 Andreas Steffen
         cert-tpm {
395 58 Andreas Steffen
            handle = 0x01800004
396 58 Andreas Steffen
         }
397 30 Andreas Steffen
      }
398 30 Andreas Steffen
      remote {
399 30 Andreas Steffen
         auth = pubkey
400 30 Andreas Steffen
         id = raspi4.example.com
401 30 Andreas Steffen
      }
402 30 Andreas Steffen
      children {
403 30 Andreas Steffen
         ecc {
404 30 Andreas Steffen
            mode = transport
405 30 Andreas Steffen
            esp_proposals = aes128-sha256-curve25519
406 30 Andreas Steffen
         }
407 30 Andreas Steffen
      }
408 30 Andreas Steffen
      version = 2
409 30 Andreas Steffen
      proposals = aes128-sha256-curve25519
410 30 Andreas Steffen
   }
411 30 Andreas Steffen
}
412 30 Andreas Steffen
</pre>
413 29 Andreas Steffen
414 29 Andreas Steffen
h2. Starting the strongSwan Daemon
415 29 Andreas Steffen
416 29 Andreas Steffen
<pre>
417 29 Andreas Steffen
systemctl start strongswan-swanctl
418 29 Andreas Steffen
</pre>
419 29 Andreas Steffen
420 29 Andreas Steffen
<pre>
421 44 Andreas Steffen
Feb 19 10:52:01 raspi5 systemd[1]: Starting strongSwan IPsec IKEv1/IKEv2 daemon using swanctl...
422 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
423 44 Andreas Steffen
Feb 19 10:52:01 raspi5 charon-systemd[21165]: spawning 16 worker threads
424 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'
425 44 Andreas Steffen
Feb 19 10:52:01 raspi5 charon-systemd[21165]: loaded certificate 'C=US, O=TNC Demo, CN=TNC Demo CA'
426 1 Andreas Steffen
</pre>
427 1 Andreas Steffen
428 59 Andreas Steffen
The RSA AK private key is attached to the *charon-systemd* daemon via the TPM 2.0 resource manager
429 1 Andreas Steffen
<pre>
430 44 Andreas Steffen
Feb 19 10:52:01 raspi5 resourcemgr[531]: Accept socket:  0xc
431 44 Andreas Steffen
Feb 19 10:52:01 raspi5 resourcemgr[531]: Resource Manager Other CMD Server accepted client
432 44 Andreas Steffen
Feb 19 10:52:01 raspi5 resourcemgr[531]: Accept socket:  0xd
433 44 Andreas Steffen
Feb 19 10:52:01 raspi5 resourcemgr[531]: Resource Manager TPM CMD Server accepted client
434 53 Andreas Steffen
Feb 19 10:52:01 raspi5 charon-systemd[21165]: TPM 2.0 - manufacturer: IFX (SLB9670) rev: 01.16 2015
435 44 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
436 44 Andreas Steffen
Feb 19 10:52:01 raspi5 charon-systemd[21165]: TPM 2.0 - ECC curves: NIST_P256 BN_P256
437 44 Andreas Steffen
Feb 19 10:52:01 raspi5 charon-systemd[21165]: TPM 2.0 via TSS2 available
438 44 Andreas Steffen
Feb 19 10:52:01 raspi5 charon-systemd[21165]: AIK signature algorithm is RSASSA with SHA256 hash
439 44 Andreas Steffen
Feb 19 10:52:01 raspi5 charon-systemd[21165]: loaded RSA private key from token
440 1 Andreas Steffen
F</pre>
441 1 Andreas Steffen
442 59 Andreas Steffen
The ECC AK private key is attached to the *charon-systemd* daemon via the TPM 2.0 resource manager
443 29 Andreas Steffen
<pre>
444 44 Andreas Steffen
Feb 19 10:52:01 raspi5 resourcemgr[531]: Accept socket:  0x6
445 44 Andreas Steffen
Feb 19 10:52:01 raspi5 resourcemgr[531]: Resource Manager Other CMD Server accepted client
446 44 Andreas Steffen
Feb 19 10:52:01 raspi5 resourcemgr[531]: Accept socket:  0x7
447 44 Andreas Steffen
Feb 19 10:52:01 raspi5 resourcemgr[531]: Resource Manager TPM CMD Server accepted client
448 53 Andreas Steffen
Feb 19 10:52:01 raspi5 charon-systemd[21165]: TPM 2.0 - manufacturer: IFX (SLB9670) rev: 01.16 2015
449 44 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
450 44 Andreas Steffen
Feb 19 10:52:02 raspi5 charon-systemd[21165]: TPM 2.0 - ECC curves: NIST_P256 BN_P256
451 1 Andreas Steffen
Feb 19 10:52:02 raspi5 charon-systemd[21165]: TPM 2.0 via TSS2 available
452 1 Andreas Steffen
Feb 19 10:52:02 raspi5 charon-systemd[21165]: AIK signature algorithm is ECDSA with SHA256 hash
453 1 Andreas Steffen
Feb 19 10:52:02 raspi5 charon-systemd[21165]: loaded ECDSA private key from token
454 59 Andreas Steffen
</pre>
455 1 Andreas Steffen
456 59 Andreas Steffen
The ECC AIK certificate is loaded by the *charon-systemd* daemon via the TPM 2.0 resource manager
457 1 Andreas Steffen
<pre>
458 59 Andreas Steffen
Feb 19 10:52:02 raspi5 resourcemgr[531]: Accept socket:  0x8
459 59 Andreas Steffen
Feb 19 10:52:02 raspi5 resourcemgr[531]: Resource Manager Other CMD Server accepted client
460 59 Andreas Steffen
Feb 19 10:52:02 raspi5 resourcemgr[531]: Accept socket:  0x9
461 59 Andreas Steffen
Feb 19 10:52:02 raspi5 resourcemgr[531]: Resource Manager TPM CMD Server accepted client
462 59 Andreas Steffen
Feb 19 10:52:02 raspi5 charon-systemd[21165]: TPM 2.0 - manufacturer: IFX (SLB9670) rev: 01.16 2015
463 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
464 59 Andreas Steffen
Feb 19 10:52:02 raspi5 charon-systemd[21165]: TPM 2.0 - ECC curves: NIST_P256 BN_P256
465 59 Andreas Steffen
Feb 19 10:52:02 raspi5 charon-systemd[21165]: TPM 2.0 via TSS2 available
466 59 Andreas Steffen
Feb 19 10:52:02 raspi5 charon-systemd[21165]: loaded certificate from TPM NV index 0x01800004
467 60 Andreas Steffen
Feb 19 10:52:02 raspi5 resourcemgr[531]: OtherCmdServer died (Other CMD), socket: 0x8.
468 60 Andreas Steffen
Feb 19 10:52:02 raspi5 resourcemgr[531]: TpmCmdServer died (TPM CMD), rval: 0x00000000, socket: 0x9
469 59 Andreas Steffen
</pre>
470 59 Andreas Steffen
471 59 Andreas Steffen
The two connection definitions are received by the *charon-systemd* daemon from the *swanctl* command line tool via the VICI interface
472 59 Andreas Steffen
<pre>
473 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'
474 1 Andreas Steffen
Feb 19 10:52:02 raspi5 charon-systemd[21165]: added vici connection: rsa
475 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'
476 44 Andreas Steffen
Feb 19 10:52:02 raspi5 charon-systemd[21165]: added vici connection: ecc
477 59 Andreas Steffen
</pre>
478 59 Andreas Steffen
479 59 Andreas Steffen
The *swanctl* command line tool reports its actions
480 59 Andreas Steffen
<pre>
481 44 Andreas Steffen
Feb 19 10:52:02 raspi5 swanctl[21183]: loaded certificate from '/etc/swanctl/x509/raspi5_ak_rsa_Cert.der'
482 44 Andreas Steffen
Feb 19 10:52:02 raspi5 swanctl[21183]: loaded certificate from '/etc/swanctl/x509ca/demoCaCert.pem'
483 44 Andreas Steffen
Feb 19 10:52:02 raspi5 swanctl[21183]: loaded key token_ak_rsa from token [keyid: f49e857dde4e67f5fb870398673f207cf33f2b66]
484 44 Andreas Steffen
Feb 19 10:52:02 raspi5 swanctl[21183]: loaded key token_ak_ecc from token [keyid: c70e63f87f6ff65500e5057f5a3e6b6ce7d2d513]
485 44 Andreas Steffen
Feb 19 10:52:02 raspi5 swanctl[21183]: loaded connection 'rsa'
486 44 Andreas Steffen
Feb 19 10:52:02 raspi5 swanctl[21183]: loaded connection 'ecc'
487 44 Andreas Steffen
Feb 19 10:52:02 raspi5 swanctl[21183]: successfully loaded 2 connections, 0 unloaded
488 31 Andreas Steffen
</pre>
489 31 Andreas Steffen
490 31 Andreas Steffen
<pre>
491 44 Andreas Steffen
Feb 19 10:52:02 raspi5 systemd[1]: Started strongSwan IPsec IKEv1/IKEv2 daemon using swanctl.
492 31 Andreas Steffen
</pre>
493 31 Andreas Steffen
494 31 Andreas Steffen
The following *swanctl* command shows the two loaded connections
495 31 Andreas Steffen
<pre>
496 31 Andreas Steffen
swanctl --list-conns
497 31 Andreas Steffen
</pre>
498 31 Andreas Steffen
499 31 Andreas Steffen
<pre>
500 31 Andreas Steffen
rsa: IKEv2, reauthentication every 10800s, no rekeying
501 31 Andreas Steffen
  local:  10.10.0.105
502 31 Andreas Steffen
  remote: 10.10.0.104
503 31 Andreas Steffen
  local public key authentication:
504 31 Andreas Steffen
    id: C=US, O=TNC Demo, OU=AIK RSA, CN=raspi5.example.com
505 31 Andreas Steffen
    certs: C=US, O=TNC Demo, OU=AIK RSA, CN=raspi5.example.com
506 31 Andreas Steffen
  remote public key authentication:
507 31 Andreas Steffen
    id: raspi4.example.com
508 31 Andreas Steffen
  rsa: TRANSPORT, rekeying every 3600s or 300000000 bytes or 500000 packets
509 31 Andreas Steffen
    local:  dynamic
510 31 Andreas Steffen
    remote: dynamic
511 31 Andreas Steffen
</pre>
512 31 Andreas Steffen
513 31 Andreas Steffen
<pre>
514 31 Andreas Steffen
ecc: IKEv2, reauthentication every 10800s, no rekeying
515 31 Andreas Steffen
  local:  10.10.0.105
516 31 Andreas Steffen
  remote: 10.10.0.104
517 31 Andreas Steffen
  local public key authentication:
518 31 Andreas Steffen
    id: C=US, O=TNC Demo, OU=AIK ECC, CN=raspi5.example.com
519 31 Andreas Steffen
    certs: C=US, O=TNC Demo, OU=AIK ECC, CN=raspi5.example.com
520 31 Andreas Steffen
  remote public key authentication:
521 31 Andreas Steffen
    id: raspi4.example.com
522 31 Andreas Steffen
  ecc: TRANSPORT, rekeying every 3600s or 300000000 bytes or 500000 packets
523 31 Andreas Steffen
    local:  dynamic
524 32 Andreas Steffen
    remote: dynamic
525 31 Andreas Steffen
</pre>
526 31 Andreas Steffen
527 31 Andreas Steffen
The loaded certificates can also be displayed
528 31 Andreas Steffen
<pre>
529 31 Andreas Steffen
swanctl --list-certs
530 31 Andreas Steffen
</pre>
531 31 Andreas Steffen
532 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)
533 31 Andreas Steffen
<pre>
534 31 Andreas Steffen
List of X.509 End Entity Certificates
535 31 Andreas Steffen
536 31 Andreas Steffen
  subject:  "C=US, O=TNC Demo, OU=AIK RSA, CN=raspi5.example.com"
537 31 Andreas Steffen
  issuer:   "C=US, O=TNC Demo, CN=TNC Demo CA"
538 31 Andreas Steffen
  validity:  not before Feb 19 09:33:43 2017, ok
539 31 Andreas Steffen
             not after  Aug 29 10:33:43 2026, ok (expires in 3477 days)
540 31 Andreas Steffen
  serial:    11:57:33:3e:2a:8e:8a:32
541 31 Andreas Steffen
  altNames:  raspi5.example.com
542 31 Andreas Steffen
  authkeyId: 21:02:7e:2d:de:8b:77:48:75:de:56:2f:b5:d4:62:ec:c3:09:15:f2
543 31 Andreas Steffen
  subjkeyId: f4:9e:85:7d:de:4e:67:f5:fb:87:03:98:67:3f:20:7c:f3:3f:2b:66
544 31 Andreas Steffen
  pubkey:    RSA 2048 bits, has private key
545 31 Andreas Steffen
  keyid:     71:21:f5:d4:7e:59:4a:88:16:ca:57:85:98:3d:36:a7:b1:d5:75:fa
546 31 Andreas Steffen
  subjkey:   f4:9e:85:7d:de:4e:67:f5:fb:87:03:98:67:3f:20:7c:f3:3f:2b:66
547 31 Andreas Steffen
548 31 Andreas Steffen
  subject:  "C=US, O=TNC Demo, OU=AIK ECC, CN=raspi5.example.com"
549 31 Andreas Steffen
  issuer:   "C=US, O=TNC Demo, CN=TNC Demo CA"
550 31 Andreas Steffen
  validity:  not before Feb 17 23:17:19 2017, ok
551 31 Andreas Steffen
             not after  Aug 30 00:17:19 2026, ok (expires in 3478 days)
552 31 Andreas Steffen
  serial:    52:9d:3e:42:6f:71:63:3d
553 31 Andreas Steffen
  altNames:  raspi5.example.com
554 31 Andreas Steffen
  authkeyId: 21:02:7e:2d:de:8b:77:48:75:de:56:2f:b5:d4:62:ec:c3:09:15:f2
555 31 Andreas Steffen
  subjkeyId: c7:0e:63:f8:7f:6f:f6:55:00:e5:05:7f:5a:3e:6b:6c:e7:d2:d5:13
556 31 Andreas Steffen
  pubkey:    ECDSA 256 bits, has private key
557 31 Andreas Steffen
  keyid:     71:49:7c:42:41:e7:c6:81:bc:31:73:f0:0f:7e:4a:e1:2d:53:00:38
558 31 Andreas Steffen
  subjkey:   c7:0e:63:f8:7f:6f:f6:55:00:e5:05:7f:5a:3e:6b:6c:e7:d2:d5:13
559 31 Andreas Steffen
</pre>
560 31 Andreas Steffen
561 31 Andreas Steffen
<pre>
562 31 Andreas Steffen
List of X.509 CA Certificates
563 31 Andreas Steffen
564 31 Andreas Steffen
  subject:  "C=US, O=TNC Demo, CN=TNC Demo CA"
565 1 Andreas Steffen
  issuer:   "C=US, O=TNC Demo, CN=TNC Demo CA"
566 32 Andreas Steffen
  validity:  not before Aug 31 10:29:27 2016, ok
567 32 Andreas Steffen
             not after  Aug 31 10:29:27 2026, ok (expires in 3479 days)
568 43 Andreas Steffen
  serial:    02:c8:85:e1:ef:fa:8f:20
569 32 Andreas Steffen
  flags:     CA CRLSign self-signed 
570 38 Andreas Steffen
  subjkeyId: 21:02:7e:2d:de:8b:77:48:75:de:56:2f:b5:d4:62:ec:c3:09:15:f2
571 32 Andreas Steffen
  pubkey:    ECDSA 256 bits
572 32 Andreas Steffen
  keyid:     a1:b5:e0:29:d0:4c:a7:62:bd:ca:a3:b4:af:18:42:2c:4a:01:55:9a
573 32 Andreas Steffen
  subjkey:   21:02:7e:2d:de:8b:77:48:75:de:56:2f:b5:d4:62:ec:c3:09:15:f2
574 32 Andreas Steffen
</pre>
575 32 Andreas Steffen
576 32 Andreas Steffen
h2. IKEv2 Authentication with RSA AIK Certificate
577 32 Andreas Steffen
578 32 Andreas Steffen
With the following *swanctl* command the "rsa" connection is established
579 32 Andreas Steffen
<pre>
580 32 Andreas Steffen
swanctl --initiate --child rsa
581 32 Andreas Steffen
</pre>
582 32 Andreas Steffen
583 32 Andreas Steffen
<pre>
584 45 Andreas Steffen
Feb 19 10:52:21 raspi5 charon-systemd[21165]: vici initiate 'rsa'
585 32 Andreas Steffen
Feb 19 10:52:21 raspi5 charon-systemd[21165]: initiating IKE_SA rsa[1] to 10.10.0.104
586 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 ]
587 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)
588 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)
589 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 ]
590 32 Andreas Steffen
Feb 19 10:52:21 raspi5 charon-systemd[21165]: received strongSwan vendor ID
591 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"
592 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"
593 32 Andreas Steffen
</pre>
594 32 Andreas Steffen
595 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.
596 32 Andreas Steffen
<pre>
597 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
598 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"
599 32 Andreas Steffen
</pre>
600 32 Andreas Steffen
<pre>
601 32 Andreas Steffen
Feb 19 10:52:24 raspi5 charon-systemd[21165]: establishing CHILD_SA rsa
602 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) ]
603 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)
604 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)
605 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) ]
606 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"
607 32 Andreas Steffen
Feb 19 10:52:24 raspi5 charon-systemd[21165]:   using certificate "C=US, O=TNC Demo, CN=raspi4.example.com"
608 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"
609 32 Andreas Steffen
Feb 19 10:52:24 raspi5 charon-systemd[21165]:   reached self-signed root ca with a path length of 0
610 32 Andreas Steffen
Feb 19 10:52:24 raspi5 charon-systemd[21165]: authentication of 'raspi4.example.com' with ECDSA_WITH_SHA256_DER successful
611 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]
612 32 Andreas Steffen
Feb 19 10:52:24 raspi5 charon-systemd[21165]: scheduling reauthentication in 10507s
613 32 Andreas Steffen
Feb 19 10:52:24 raspi5 charon-systemd[21165]: maximum IKE_SA lifetime 11587s
614 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
615 32 Andreas Steffen
Feb 19 10:52:24 raspi5 charon-systemd[21165]: received AUTH_LIFETIME of 10103s, scheduling reauthentication in 9023s
616 32 Andreas Steffen
Feb 19 10:52:24 raspi5 charon-systemd[21165]: peer supports MOBIKE
617 32 Andreas Steffen
</pre>
618 32 Andreas Steffen
619 32 Andreas Steffen
The following *swanctl* command shows the established IPsec connection
620 32 Andreas Steffen
<pre>
621 32 Andreas Steffen
 swanctl --list-sas
622 32 Andreas Steffen
</pre>
623 32 Andreas Steffen
<pre>
624 32 Andreas Steffen
rsa: #1, ESTABLISHED, IKEv2, 7ba3b4d06c051ecb_i* 14e1769a8aeb7f28_r
625 32 Andreas Steffen
  local  'C=US, O=TNC Demo, OU=AIK RSA, CN=raspi5.example.com' @ 10.10.0.105[4500]
626 32 Andreas Steffen
  remote 'raspi4.example.com' @ 10.10.0.104[4500]
627 32 Andreas Steffen
  AES_CBC-128/HMAC_SHA2_256_128/PRF_HMAC_SHA2_256/CURVE_25519
628 32 Andreas Steffen
  established 252s ago, reauth in 8771s
629 38 Andreas Steffen
  rsa: #1, reqid 1, INSTALLED, TRANSPORT, ESP:AES_CBC-128/HMAC_SHA2_256_128
630 33 Andreas Steffen
    installed 252s ago, rekeying in 3258s, expires in 3708s
631 33 Andreas Steffen
    in  c23deb9d,    640 bytes,    10 packets,     3s ago
632 33 Andreas Steffen
    out ce48d08e,    640 bytes,    10 packets,     3s ago
633 33 Andreas Steffen
    local  10.10.0.105/32
634 33 Andreas Steffen
    remote 10.10.0.104/32
635 33 Andreas Steffen
</pre>
636 33 Andreas Steffen
637 33 Andreas Steffen
With this *swanctl* command the "rsa" connection is terminated
638 33 Andreas Steffen
<pre>
639 33 Andreas Steffen
swanctl --terminate --ike rsa
640 33 Andreas Steffen
</pre>
641 33 Andreas Steffen
642 33 Andreas Steffen
<pre>
643 33 Andreas Steffen
Feb 19 10:59:16 raspi5 charon-systemd[21165]: vici terminate IKE_SA 'rsa'
644 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]
645 43 Andreas Steffen
Feb 19 10:59:16 raspi5 charon-systemd[21165]: sending DELETE for IKE_SA rsa[1]
646 32 Andreas Steffen
Feb 19 10:59:16 raspi5 charon-systemd[21165]: generating INFORMATIONAL request 2 [ D ]
647 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)
648 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)
649 32 Andreas Steffen
Feb 19 10:59:16 raspi5 charon-systemd[21165]: parsed INFORMATIONAL response 2 [ ]
650 33 Andreas Steffen
Feb 19 10:59:16 raspi5 charon-systemd[21165]: IKE_SA deleted
651 33 Andreas Steffen
</pre>
652 33 Andreas Steffen
653 33 Andreas Steffen
h2. IKEv2 Authentication with ECC AIK Certificate
654 33 Andreas Steffen
655 33 Andreas Steffen
Next we initiate the "ecc" connection
656 33 Andreas Steffen
<pre>
657 33 Andreas Steffen
swanctl --initiate --child ecc
658 33 Andreas Steffen
</pre>
659 33 Andreas Steffen
660 33 Andreas Steffen
<pre>
661 45 Andreas Steffen
Feb 19 11:00:32 raspi5 charon-systemd[21165]: vici initiate 'ecc'
662 33 Andreas Steffen
Feb 19 11:00:32 raspi5 charon-systemd[21165]: initiating IKE_SA ecc[2] to 10.10.0.104
663 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 ]
664 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)
665 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)
666 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 ]
667 33 Andreas Steffen
Feb 19 11:00:32 raspi5 charon-systemd[21165]: received strongSwan vendor ID
668 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"
669 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"
670 33 Andreas Steffen
</pre>
671 33 Andreas Steffen
672 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.
673 33 Andreas Steffen
<pre>
674 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
675 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"
676 33 Andreas Steffen
</pre>
677 33 Andreas Steffen
<pre>
678 33 Andreas Steffen
Feb 19 11:00:34 raspi5 charon-systemd[21165]: establishing CHILD_SA ecc
679 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) ]
680 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)
681 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)
682 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) ]
683 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"
684 33 Andreas Steffen
Feb 19 11:00:34 raspi5 charon-systemd[21165]:   using certificate "C=US, O=TNC Demo, CN=raspi4.example.com"
685 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"
686 33 Andreas Steffen
Feb 19 11:00:34 raspi5 charon-systemd[21165]:   reached self-signed root ca with a path length of 0
687 33 Andreas Steffen
Feb 19 11:00:34 raspi5 charon-systemd[21165]: authentication of 'raspi4.example.com' with ECDSA_WITH_SHA256_DER successful
688 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]
689 33 Andreas Steffen
Feb 19 11:00:34 raspi5 charon-systemd[21165]: scheduling reauthentication in 10180s
690 33 Andreas Steffen
Feb 19 11:00:34 raspi5 charon-systemd[21165]: maximum IKE_SA lifetime 11260s
691 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
692 33 Andreas Steffen
Feb 19 11:00:34 raspi5 charon-systemd[21165]: received AUTH_LIFETIME of 9880s, scheduling reauthentication in 8800s
693 33 Andreas Steffen
Feb 19 11:00:34 raspi5 charon-systemd[21165]: peer supports MOBIKE
694 33 Andreas Steffen
</pre>
695 33 Andreas Steffen
696 33 Andreas Steffen
The establed IKE and CHILD SAs are displayed
697 33 Andreas Steffen
<pre>
698 33 Andreas Steffen
 swanctl --list-sas
699 33 Andreas Steffen
</pre>
700 33 Andreas Steffen
<pre>
701 33 Andreas Steffen
ecc: #2, ESTABLISHED, IKEv2, b7f2652777b0996a_i* 12282b5964ff0658_r
702 1 Andreas Steffen
  local  'C=US, O=TNC Demo, OU=AIK ECC, CN=raspi5.example.com' @ 10.10.0.105[4500]
703 1 Andreas Steffen
  remote 'raspi4.example.com' @ 10.10.0.104[4500]
704 34 Andreas Steffen
  AES_CBC-128/HMAC_SHA2_256_128/PRF_HMAC_SHA2_256/CURVE_25519
705 34 Andreas Steffen
  established 126s ago, reauth in 8674s
706 39 Andreas Steffen
  ecc: #2, reqid 2, INSTALLED, TRANSPORT, ESP:AES_CBC-128/HMAC_SHA2_256_128
707 34 Andreas Steffen
    installed 126s ago, rekeying in 3252s, expires in 3834s
708 34 Andreas Steffen
    in  c2c16cd0,    320 bytes,     5 packets,     2s ago
709 34 Andreas Steffen
    out c47ea6f6,    320 bytes,     5 packets,     2s ago
710 34 Andreas Steffen
    local  10.10.0.105/32
711 34 Andreas Steffen
    remote 10.10.0.104/32
712 34 Andreas Steffen
</pre>
713 34 Andreas Steffen
714 34 Andreas Steffen
The IKE and CHILD SAs are terminated
715 34 Andreas Steffen
<pre>
716 34 Andreas Steffen
swanctl --terminate --ike ecc
717 34 Andreas Steffen
</pre>
718 34 Andreas Steffen
719 34 Andreas Steffen
<pre>
720 34 Andreas Steffen
Feb 19 11:04:32 raspi5 charon-systemd[21165]: vici terminate IKE_SA 'ecc'
721 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]
722 34 Andreas Steffen
Feb 19 11:04:32 raspi5 charon-systemd[21165]: sending DELETE for IKE_SA ecc[2]
723 34 Andreas Steffen
Feb 19 11:04:32 raspi5 charon-systemd[21165]: generating INFORMATIONAL request 2 [ D ]
724 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)
725 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)
726 34 Andreas Steffen
Feb 19 11:04:32 raspi5 charon-systemd[21165]: parsed INFORMATIONAL response 2 [ ]
727 34 Andreas Steffen
Feb 19 11:04:32 raspi5 charon-systemd[21165]: IKE_SA deleted
728 1 Andreas Steffen
</pre>
729 39 Andreas Steffen
730 34 Andreas Steffen
h2. Stopping the strongSwan Daemon
731 34 Andreas Steffen
732 34 Andreas Steffen
Stop the *strongswan-swanctl* systemd service
733 34 Andreas Steffen
<pre>
734 1 Andreas Steffen
systemctl stop strongswan-swanctl
735 38 Andreas Steffen
</pre>
736 39 Andreas Steffen
737 34 Andreas Steffen
The strongSwan daemon is stopped
738 34 Andreas Steffen
<pre>
739 34 Andreas Steffen
Feb 19 11:06:02 raspi5 systemd[1]: Stopping strongSwan IPsec IKEv1/IKEv2 daemon using swanctl...
740 34 Andreas Steffen
Feb 19 11:06:02 raspi5 charon-systemd[21165]: SIGTERM received, shutting down
741 34 Andreas Steffen
Feb 19 11:06:02 raspi5 systemd[1]: Stopped strongSwan IPsec IKEv1/IKEv2 daemon using swanctl.
742 29 Andreas Steffen
</pre>
743 1 Andreas Steffen
744 1 Andreas Steffen
The two TPM sockets attaching the RSA and ECC AK private keys via the TPM 2.0 resource managers are released
745 1 Andreas Steffen
<pre>
746 1 Andreas Steffen
Feb 19 11:06:02 raspi5 resourcemgr[531]: TpmCmdServer died (TPM CMD), rval: 0x00000000, socket: 0x7.
747 1 Andreas Steffen
Feb 19 11:06:02 raspi5 resourcemgr[531]: OtherCmdServer died (Other CMD), socket: 0x6.
748 1 Andreas Steffen
Feb 19 11:06:02 raspi5 resourcemgr[531]: TpmCmdServer died (TPM CMD), rval: 0x00000000, socket: 0xd.
749 1 Andreas Steffen
Feb 19 11:06:02 raspi5 resourcemgr[531]: OtherCmdServer died (Other CMD), socket: 0xc.
750 1 Andreas Steffen
</pre>