Project

General

Profile

Trusted Platform Module 2.0 » History » Version 95

Andreas Steffen, 01.01.2021 17:47

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 91 Andreas Steffen
In order to test if we can connect to the TPM 2.0 device we list all persistent keys stored in the Non-Volatile (NV) RAM:
20 3 Andreas Steffen
<pre>
21 91 Andreas Steffen
tpm2_getcap handles-persistent
22 91 Andreas Steffen
- 0x81000001
23 91 Andreas Steffen
- 0x81000002
24 91 Andreas Steffen
- 0x81010001
25 18 Andreas Steffen
</pre>
26 1 Andreas Steffen
27 93 Andreas Steffen
A manual showing all *tpm2-tools* functions with their arguments can be found "here":https://github.com/tpm2-software/tpm2-tools/tree/5.0/man. The access to the */dev/tpmrm0* TPM resource manager device requires *root* rights on most Linux platforms. But e.g. with Ubuntu, adding the user to the *tss* group enables direct access to the TPM device:
28 92 Andreas Steffen
<pre>
29 92 Andreas Steffen
sudo usermod -a -G tss <username>
30 92 Andreas Steffen
</pre>
31 51 Andreas Steffen
 
32 51 Andreas Steffen
h3. Enable the strongSwan tpm Plugin
33 51 Andreas Steffen
34 51 Andreas Steffen
The strongSwan libtpmtss *tpm* plugin and the TSS2 interface are enabled and built with the following options
35 51 Andreas Steffen
36 78 Jean-François Hren
  ./configure --enable-tss-tss2 --enable-tpm  ...
37 7 Andreas Steffen
38 20 Andreas Steffen
h2. Derive a Persistent RSA Endorsement Key
39 1 Andreas Steffen
40 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
41 11 Andreas Steffen
42 82 Andreas Steffen
 tpm2_getpubek -H 0x81010001 -g rsa -f ek_rsa.pub
43 9 Andreas Steffen
44 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
45 9 Andreas Steffen
46 50 Andreas Steffen
 pki --pub --keyid 0x81010001 --outform pem > ek_rsa_pub.pem
47 9 Andreas Steffen
48 9 Andreas Steffen
The fingerprint of the RSA EK public key can be displayed with the command
49 9 Andreas Steffen
50 9 Andreas Steffen
 pki --print --type pub --in ek_rsa_pub.pem
51 9 Andreas Steffen
  pubkey:    RSA 2048 bits
52 9 Andreas Steffen
  keyid:     d1:f1:49:84:36:44:e6:8c:d2:a6:69:ee:fd:b5:7d:56:2f:39:ff:58
53 1 Andreas Steffen
  subjkey:   c1:1b:8e:f1:c7:f8:8a:1e:9a:dd:7e:82:2f:7a:a3:f5:c0:e2:4d:7d
54 1 Andreas Steffen
55 20 Andreas Steffen
h2. Generate a Persistent RSA Attestation Key
56 11 Andreas Steffen
57 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
58 1 Andreas Steffen
59 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
60 12 Andreas Steffen
61 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
62 12 Andreas Steffen
63 50 Andreas Steffen
 pki --pub --keyid 0x81010002 --outform pem > ak_rsa_pub.pem
64 12 Andreas Steffen
65 12 Andreas Steffen
The fingerprint of the RSA AK public key can be displayed with the command
66 12 Andreas Steffen
67 12 Andreas Steffen
 pki --print --type pub --in ak_rsa_pub.pem
68 12 Andreas Steffen
  pubkey:    RSA 2048 bits
69 12 Andreas Steffen
  keyid:     71:21:f5:d4:7e:59:4a:88:16:ca:57:85:98:3d:36:a7:b1:d5:75:fa
70 12 Andreas Steffen
  subjkey:   f4:9e:85:7d:de:4e:67:f5:fb:87:03:98:67:3f:20:7c:f3:3f:2b:66
71 11 Andreas Steffen
72 20 Andreas Steffen
h2. Derive a Persistent ECC Endorsement Key
73 1 Andreas Steffen
74 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:
75 1 Andreas Steffen
76 82 Andreas Steffen
 tpm2_getpubek -H 0x81010003 -g ecc -f ek_ecc.pub
77 9 Andreas Steffen
78 67 Andreas Steffen
Without exporting the public key first the fingerprint of the ECC EK private key can be directly displayed with the command
79 9 Andreas Steffen
80 67 Andreas Steffen
 pki --print --type priv --keyid 0x81010003
81 9 Andreas Steffen
  pubkey:    ECDSA 256 bits
82 9 Andreas Steffen
  keyid:     7f:39:ca:e6:83:9b:a9:06:97:40:27:6a:e1:bf:8f:f5:9f:d3:a5:31
83 9 Andreas Steffen
  subjkey:   8b:43:4d:5e:5e:7b:ff:c2:54:4d:ef:88:cb:0c:7c:47:75:28:4d:09
84 9 Andreas Steffen
85 20 Andreas Steffen
h2. Generate a Persistent ECC Attestation Key
86 13 Andreas Steffen
87 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
88 13 Andreas Steffen
89 84 Andreas Steffen
 tpm2_getpubak -E 0x81010003 -g ecc -D sha256 -s ecdsa -k 0x81010004 -f ak_ecc4.pub -n ak_ecc4.name
90 13 Andreas Steffen
91 13 Andreas Steffen
The AK public key can be exported in PKCS#1 format from the TPM using the *pki* tool
92 13 Andreas Steffen
93 50 Andreas Steffen
 pki --pub --keyid 0x81010004 > ak_ecc_pub.der
94 13 Andreas Steffen
95 52 Andreas Steffen
The fingerprint of the ECC AK public key can be displayed with the command
96 13 Andreas Steffen
97 14 Andreas Steffen
 pki --print --type pub --in ak_ecc_pub.der
98 1 Andreas Steffen
  pubkey:    ECDSA 256 bits
99 1 Andreas Steffen
  keyid:     71:49:7c:42:41:e7:c6:81:bc:31:73:f0:0f:7e:4a:e1:2d:53:00:38
100 1 Andreas Steffen
  subjkey:   c7:0e:63:f8:7f:6f:f6:55:00:e5:05:7f:5a:3e:6b:6c:e7:d2:d5:13
101 15 Andreas Steffen
102 20 Andreas Steffen
h2. Generate Another ECC Attestation Key
103 15 Andreas Steffen
104 15 Andreas Steffen
Multiple AK keys bound to a common EK key can be generated
105 15 Andreas Steffen
106 85 Andreas Steffen
 tpm2_getpubak -E 0x81010003 -g ecc -D sha256 -s ecdsa -k 0x81010005 -f ak_ecc5.pub -n ak_ecc5.name
107 15 Andreas Steffen
108 68 Andreas Steffen
The fingerprint of the second ECC AK private key can be displayed with the command
109 15 Andreas Steffen
110 68 Andreas Steffen
 pki --print --type priv --in 0x81010005
111 15 Andreas Steffen
  pubkey:    ECDSA 256 bits
112 15 Andreas Steffen
  keyid:     c4:b4:9c:95:27:9e:ce:81:2f:98:42:c8:1b:f0:54:ff:d4:d1:24:34
113 15 Andreas Steffen
  subjkey:   cf:44:f4:f7:9d:97:09:ad:b1:09:3a:8e:6f:23:eb:9f:2c:35:94:c9
114 15 Andreas Steffen
115 19 Andreas Steffen
h2. Remove a Persistent Key Object
116 15 Andreas Steffen
117 15 Andreas Steffen
Since the non-volatile memory of the TPM is limited any persistent key object can be removed to free storage space.
118 15 Andreas Steffen
The following tpm2-tools command removes the ECC AK key with persistent handle 0x81010005
119 15 Andreas Steffen
120 1 Andreas Steffen
 tpm2_evictcontrol -A o -H 0x81010005 -S 0x81010005
121 18 Andreas Steffen
122 18 Andreas Steffen
h2. List Persistent Objects
123 18 Andreas Steffen
124 18 Andreas Steffen
The following tpm2-tools command lists all persistent objects stored by the TPM in non-volatile memory
125 18 Andreas Steffen
126 18 Andreas Steffen
 tpm2_listpersistent
127 18 Andreas Steffen
128 18 Andreas Steffen
<pre>
129 18 Andreas Steffen
6 persistent objects defined.
130 18 Andreas Steffen
131 18 Andreas Steffen
0. Persistent handle: 0x81000001
132 18 Andreas Steffen
{
133 18 Andreas Steffen
        Type: 0x23
134 18 Andreas Steffen
        Hash algorithm(nameAlg): 0xb
135 18 Andreas Steffen
        Attributes: 0x30072
136 18 Andreas Steffen
}
137 18 Andreas Steffen
1. Persistent handle: 0x81000002
138 18 Andreas Steffen
{
139 18 Andreas Steffen
        Type: 0x23
140 18 Andreas Steffen
        Hash algorithm(nameAlg): 0xb
141 18 Andreas Steffen
        Attributes: 0x60072
142 18 Andreas Steffen
}
143 18 Andreas Steffen
2. Persistent handle: 0x81010001
144 18 Andreas Steffen
{
145 18 Andreas Steffen
        Type: 0x1
146 18 Andreas Steffen
        Hash algorithm(nameAlg): 0xb
147 18 Andreas Steffen
        Attributes: 0x300b2
148 18 Andreas Steffen
}
149 18 Andreas Steffen
3. Persistent handle: 0x81010002
150 18 Andreas Steffen
{
151 18 Andreas Steffen
        Type: 0x1
152 18 Andreas Steffen
        Hash algorithm(nameAlg): 0xb
153 18 Andreas Steffen
        Attributes: 0x50072
154 18 Andreas Steffen
}
155 18 Andreas Steffen
4. Persistent handle: 0x81010003
156 18 Andreas Steffen
{
157 18 Andreas Steffen
        Type: 0x23
158 18 Andreas Steffen
        Hash algorithm(nameAlg): 0xb
159 18 Andreas Steffen
        Attributes: 0x300b2
160 18 Andreas Steffen
}
161 18 Andreas Steffen
5. Persistent handle: 0x81010004
162 18 Andreas Steffen
{
163 18 Andreas Steffen
        Type: 0x23
164 18 Andreas Steffen
        Hash algorithm(nameAlg): 0xb
165 18 Andreas Steffen
        Attributes: 0x50072
166 18 Andreas Steffen
}
167 18 Andreas Steffen
</pre>
168 13 Andreas Steffen
169 41 Andreas Steffen
h2. Create a Demo Root CA
170 41 Andreas Steffen
171 41 Andreas Steffen
The following *pki* command creates a 256 bit ECDSA private key for the Demo CA
172 41 Andreas Steffen
<pre>
173 41 Andreas Steffen
pki --gen --type ecdsa --size 256 --outform pem > demoCaKey.pem
174 41 Andreas Steffen
</pre>
175 41 Andreas Steffen
176 41 Andreas Steffen
Next we create a self-signed Root CA certificate
177 41 Andreas Steffen
<pre>
178 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
179 41 Andreas Steffen
</pre>
180 41 Andreas Steffen
181 42 Andreas Steffen
h2. Issue an RSA AIK Certificate
182 41 Andreas Steffen
183 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
184 41 Andreas Steffen
<pre>
185 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
186 41 Andreas Steffen
</pre>
187 41 Andreas Steffen
188 42 Andreas Steffen
h2. Issue an ECC AIK Certificate
189 41 Andreas Steffen
190 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
191 41 Andreas Steffen
<pre>
192 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
193 41 Andreas Steffen
</pre>
194 47 Andreas Steffen
195 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
196 47 Andreas Steffen
<pre>
197 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
198 47 Andreas Steffen
</pre>
199 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
200 49 Andreas Steffen
<pre>
201 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
202 47 Andreas Steffen
</pre>
203 47 Andreas Steffen
204 54 Andreas Steffen
h2. Store the ECC AIK Certificate in the NV RAM of the TPM
205 54 Andreas Steffen
206 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
207 54 Andreas Steffen
<pre>
208 54 Andreas Steffen
ls -l raspi5_ak_ecc_Cert.der
209 63 Andreas Steffen
-rw-r--r-- 1 root root 449 Feb 17  2017 raspi5_ak_ecc_Cert.der
210 54 Andreas Steffen
</pre>
211 54 Andreas Steffen
212 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
213 54 Andreas Steffen
<pre>
214 54 Andreas Steffen
tpm2_nvdefine -x 0x01800004 -a 0x40000001 -s 449 -t 0x2000A
215 54 Andreas Steffen
</pre>
216 54 Andreas Steffen
217 54 Andreas Steffen
Then we write the certificate file to the NV RAM destination
218 54 Andreas Steffen
<pre>
219 70 Andreas Steffen
tpm2_nvwrite -x 0x01800004 -a 0x40000001 raspi5_ak_ecc_Cert.der
220 54 Andreas Steffen
</pre>
221 54 Andreas Steffen
222 62 Andreas Steffen
h2. List of NV Indexes
223 54 Andreas Steffen
224 62 Andreas Steffen
A list of all defined NV indexes can be obtained with
225 57 Andreas Steffen
226 57 Andreas Steffen
 tpm2_nvlist
227 57 Andreas Steffen
228 55 Andreas Steffen
<pre>
229 54 Andreas Steffen
2 NV indexes defined.
230 54 Andreas Steffen
231 54 Andreas Steffen
  0. NV Index: 0x1500015
232 54 Andreas Steffen
  {
233 54 Andreas Steffen
	Hash algorithm(nameAlg):4
234 54 Andreas Steffen
 	The Index attributes(attributes):0x44040004
235 54 Andreas Steffen
 	The size of the data area(dataSize):4
236 54 Andreas Steffen
   }
237 54 Andreas Steffen
  1. NV Index: 0x1800004
238 54 Andreas Steffen
  {
239 54 Andreas Steffen
	Hash algorithm(nameAlg):11
240 54 Andreas Steffen
 	The Index attributes(attributes):0x2002000a
241 1 Andreas Steffen
 	The size of the data area(dataSize):449
242 1 Andreas Steffen
   }
243 62 Andreas Steffen
</pre>
244 62 Andreas Steffen
245 62 Andreas Steffen
h2. Remove NV Index
246 62 Andreas Steffen
247 62 Andreas Steffen
The memory assigned to a given NV index can be released with the command
248 62 Andreas Steffen
<pre>
249 62 Andreas Steffen
tpm2_nvrelease -x 0x01800001 -a 0x40000001
250 54 Andreas Steffen
</pre>
251 54 Andreas Steffen
252 30 Andreas Steffen
h2. Configure TPM Private Key Access via VICI Interface
253 1 Andreas Steffen
254 23 Andreas Steffen
Configuration of TPM private key access as tokens in the secrets section of *swanctl.conf*
255 1 Andreas Steffen
256 7 Andreas Steffen
 secrets {
257 1 Andreas Steffen
    token_ak_rsa {
258 1 Andreas Steffen
       handle = 81010002
259 46 Andreas Steffen
       pin = 123456
260 1 Andreas Steffen
    }
261 1 Andreas Steffen
    token_ak_ecc {
262 7 Andreas Steffen
       handle = 81010004
263 1 Andreas Steffen
    }
264 1 Andreas Steffen
}
265 46 Andreas Steffen
Since the use of the RSA AK private key is password-protected, the PIN *123456* is added.
266 30 Andreas Steffen
267 30 Andreas Steffen
h2. Define IPsec Connection with RSA AK Client Key
268 30 Andreas Steffen
269 30 Andreas Steffen
This connection configuration in *swanctl.conf* uses the RSA AK certificate for client authentication
270 30 Andreas Steffen
<pre>
271 30 Andreas Steffen
connections {
272 30 Andreas Steffen
   rsa {
273 30 Andreas Steffen
      local_addrs  = 10.10.0.105
274 30 Andreas Steffen
      remote_addrs = 10.10.0.104
275 30 Andreas Steffen
276 30 Andreas Steffen
      local {
277 30 Andreas Steffen
         auth = pubkey 
278 30 Andreas Steffen
         certs = raspi5_ak_rsa_Cert.der
279 30 Andreas Steffen
      }
280 30 Andreas Steffen
      remote {
281 30 Andreas Steffen
         auth = pubkey 
282 30 Andreas Steffen
         id = raspi4.example.com
283 30 Andreas Steffen
      }
284 30 Andreas Steffen
      children {
285 30 Andreas Steffen
         rsa {
286 30 Andreas Steffen
            mode = transport
287 30 Andreas Steffen
            esp_proposals = aes128-sha256-curve25519
288 30 Andreas Steffen
         }
289 30 Andreas Steffen
      }
290 30 Andreas Steffen
      version = 2
291 30 Andreas Steffen
      proposals = aes128-sha256-curve25519
292 30 Andreas Steffen
   }
293 30 Andreas Steffen
}
294 30 Andreas Steffen
</pre>
295 30 Andreas Steffen
296 30 Andreas Steffen
h2. Define IPsec Connection with ECC AK Client Key
297 30 Andreas Steffen
298 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
299 30 Andreas Steffen
<pre>
300 30 Andreas Steffen
connections {
301 30 Andreas Steffen
   ecc {
302 30 Andreas Steffen
      local_addrs  = 10.10.0.105
303 30 Andreas Steffen
      remote_addrs = 10.10.0.104
304 30 Andreas Steffen
305 30 Andreas Steffen
      local {
306 1 Andreas Steffen
         auth = pubkey
307 58 Andreas Steffen
         cert-tpm {
308 58 Andreas Steffen
            handle = 0x01800004
309 58 Andreas Steffen
         }
310 30 Andreas Steffen
      }
311 30 Andreas Steffen
      remote {
312 30 Andreas Steffen
         auth = pubkey
313 30 Andreas Steffen
         id = raspi4.example.com
314 30 Andreas Steffen
      }
315 30 Andreas Steffen
      children {
316 30 Andreas Steffen
         ecc {
317 30 Andreas Steffen
            mode = transport
318 30 Andreas Steffen
            esp_proposals = aes128-sha256-curve25519
319 30 Andreas Steffen
         }
320 30 Andreas Steffen
      }
321 30 Andreas Steffen
      version = 2
322 30 Andreas Steffen
      proposals = aes128-sha256-curve25519
323 30 Andreas Steffen
   }
324 30 Andreas Steffen
}
325 30 Andreas Steffen
</pre>
326 29 Andreas Steffen
327 29 Andreas Steffen
h2. Starting the strongSwan Daemon
328 29 Andreas Steffen
329 29 Andreas Steffen
<pre>
330 29 Andreas Steffen
systemctl start strongswan-swanctl
331 29 Andreas Steffen
</pre>
332 29 Andreas Steffen
333 29 Andreas Steffen
<pre>
334 44 Andreas Steffen
Feb 19 10:52:01 raspi5 systemd[1]: Starting strongSwan IPsec IKEv1/IKEv2 daemon using swanctl...
335 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
336 44 Andreas Steffen
Feb 19 10:52:01 raspi5 charon-systemd[21165]: spawning 16 worker threads
337 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'
338 44 Andreas Steffen
Feb 19 10:52:01 raspi5 charon-systemd[21165]: loaded certificate 'C=US, O=TNC Demo, CN=TNC Demo CA'
339 1 Andreas Steffen
</pre>
340 1 Andreas Steffen
341 59 Andreas Steffen
The RSA AK private key is attached to the *charon-systemd* daemon via the TPM 2.0 resource manager
342 1 Andreas Steffen
<pre>
343 44 Andreas Steffen
Feb 19 10:52:01 raspi5 charon-systemd[21165]: TPM 2.0 - manufacturer: IFX (SLB9670) rev: 01.16 2015
344 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
345 44 Andreas Steffen
Feb 19 10:52:01 raspi5 charon-systemd[21165]: TPM 2.0 - ECC curves: NIST_P256 BN_P256
346 73 Andreas Steffen
Feb 19 10:52:01 raspi5 charon-systemd[21165]: TPM 2.0 via TSS2 v2 available
347 44 Andreas Steffen
Feb 19 10:52:01 raspi5 charon-systemd[21165]: AIK signature algorithm is RSASSA with SHA256 hash
348 44 Andreas Steffen
Feb 19 10:52:01 raspi5 charon-systemd[21165]: loaded RSA private key from token
349 1 Andreas Steffen
F</pre>
350 1 Andreas Steffen
351 1 Andreas Steffen
The ECC AK private key is attached to the *charon-systemd* daemon via the TPM 2.0 resource manager
352 44 Andreas Steffen
<pre>
353 44 Andreas Steffen
Feb 19 10:52:01 raspi5 charon-systemd[21165]: TPM 2.0 - manufacturer: IFX (SLB9670) rev: 01.16 2015
354 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
355 44 Andreas Steffen
Feb 19 10:52:02 raspi5 charon-systemd[21165]: TPM 2.0 - ECC curves: NIST_P256 BN_P256
356 73 Andreas Steffen
Feb 19 10:52:02 raspi5 charon-systemd[21165]: TPM 2.0 via TSS2 v2 available
357 1 Andreas Steffen
Feb 19 10:52:02 raspi5 charon-systemd[21165]: AIK signature algorithm is ECDSA with SHA256 hash
358 1 Andreas Steffen
Feb 19 10:52:02 raspi5 charon-systemd[21165]: loaded ECDSA private key from token
359 1 Andreas Steffen
</pre>
360 59 Andreas Steffen
361 59 Andreas Steffen
The ECC AIK certificate is loaded by the *charon-systemd* daemon via the TPM 2.0 resource manager
362 59 Andreas Steffen
<pre>
363 59 Andreas Steffen
Feb 19 10:52:02 raspi5 charon-systemd[21165]: TPM 2.0 - manufacturer: IFX (SLB9670) rev: 01.16 2015
364 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
365 59 Andreas Steffen
Feb 19 10:52:02 raspi5 charon-systemd[21165]: TPM 2.0 - ECC curves: NIST_P256 BN_P256
366 73 Andreas Steffen
Feb 19 10:52:02 raspi5 charon-systemd[21165]: TPM 2.0 via TSS2 v2 available
367 60 Andreas Steffen
Feb 19 10:52:02 raspi5 charon-systemd[21165]: loaded certificate from TPM NV index 0x01800004
368 59 Andreas Steffen
</pre>
369 59 Andreas Steffen
370 59 Andreas Steffen
The two connection definitions are received by the *charon-systemd* daemon from the *swanctl* command line tool via the VICI interface
371 59 Andreas Steffen
<pre>
372 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'
373 1 Andreas Steffen
Feb 19 10:52:02 raspi5 charon-systemd[21165]: added vici connection: rsa
374 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'
375 44 Andreas Steffen
Feb 19 10:52:02 raspi5 charon-systemd[21165]: added vici connection: ecc
376 59 Andreas Steffen
</pre>
377 59 Andreas Steffen
378 59 Andreas Steffen
The *swanctl* command line tool reports its actions
379 59 Andreas Steffen
<pre>
380 44 Andreas Steffen
Feb 19 10:52:02 raspi5 swanctl[21183]: loaded certificate from '/etc/swanctl/x509/raspi5_ak_rsa_Cert.der'
381 44 Andreas Steffen
Feb 19 10:52:02 raspi5 swanctl[21183]: loaded certificate from '/etc/swanctl/x509ca/demoCaCert.pem'
382 44 Andreas Steffen
Feb 19 10:52:02 raspi5 swanctl[21183]: loaded key token_ak_rsa from token [keyid: f49e857dde4e67f5fb870398673f207cf33f2b66]
383 44 Andreas Steffen
Feb 19 10:52:02 raspi5 swanctl[21183]: loaded key token_ak_ecc from token [keyid: c70e63f87f6ff65500e5057f5a3e6b6ce7d2d513]
384 44 Andreas Steffen
Feb 19 10:52:02 raspi5 swanctl[21183]: loaded connection 'rsa'
385 44 Andreas Steffen
Feb 19 10:52:02 raspi5 swanctl[21183]: loaded connection 'ecc'
386 44 Andreas Steffen
Feb 19 10:52:02 raspi5 swanctl[21183]: successfully loaded 2 connections, 0 unloaded
387 31 Andreas Steffen
</pre>
388 31 Andreas Steffen
389 31 Andreas Steffen
<pre>
390 44 Andreas Steffen
Feb 19 10:52:02 raspi5 systemd[1]: Started strongSwan IPsec IKEv1/IKEv2 daemon using swanctl.
391 31 Andreas Steffen
</pre>
392 31 Andreas Steffen
393 31 Andreas Steffen
The following *swanctl* command shows the two loaded connections
394 31 Andreas Steffen
<pre>
395 31 Andreas Steffen
swanctl --list-conns
396 31 Andreas Steffen
</pre>
397 31 Andreas Steffen
398 31 Andreas Steffen
<pre>
399 31 Andreas Steffen
rsa: IKEv2, reauthentication every 10800s, no rekeying
400 31 Andreas Steffen
  local:  10.10.0.105
401 31 Andreas Steffen
  remote: 10.10.0.104
402 31 Andreas Steffen
  local public key authentication:
403 31 Andreas Steffen
    id: C=US, O=TNC Demo, OU=AIK RSA, CN=raspi5.example.com
404 31 Andreas Steffen
    certs: C=US, O=TNC Demo, OU=AIK RSA, CN=raspi5.example.com
405 31 Andreas Steffen
  remote public key authentication:
406 31 Andreas Steffen
    id: raspi4.example.com
407 31 Andreas Steffen
  rsa: TRANSPORT, rekeying every 3600s or 300000000 bytes or 500000 packets
408 31 Andreas Steffen
    local:  dynamic
409 31 Andreas Steffen
    remote: dynamic
410 31 Andreas Steffen
</pre>
411 31 Andreas Steffen
412 31 Andreas Steffen
<pre>
413 31 Andreas Steffen
ecc: IKEv2, reauthentication every 10800s, no rekeying
414 31 Andreas Steffen
  local:  10.10.0.105
415 31 Andreas Steffen
  remote: 10.10.0.104
416 31 Andreas Steffen
  local public key authentication:
417 31 Andreas Steffen
    id: C=US, O=TNC Demo, OU=AIK ECC, CN=raspi5.example.com
418 31 Andreas Steffen
    certs: C=US, O=TNC Demo, OU=AIK ECC, CN=raspi5.example.com
419 31 Andreas Steffen
  remote public key authentication:
420 31 Andreas Steffen
    id: raspi4.example.com
421 31 Andreas Steffen
  ecc: TRANSPORT, rekeying every 3600s or 300000000 bytes or 500000 packets
422 31 Andreas Steffen
    local:  dynamic
423 32 Andreas Steffen
    remote: dynamic
424 31 Andreas Steffen
</pre>
425 31 Andreas Steffen
426 31 Andreas Steffen
The loaded certificates can also be displayed
427 31 Andreas Steffen
<pre>
428 31 Andreas Steffen
swanctl --list-certs
429 31 Andreas Steffen
</pre>
430 31 Andreas Steffen
431 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)
432 31 Andreas Steffen
<pre>
433 31 Andreas Steffen
List of X.509 End Entity Certificates
434 31 Andreas Steffen
435 31 Andreas Steffen
  subject:  "C=US, O=TNC Demo, OU=AIK RSA, CN=raspi5.example.com"
436 31 Andreas Steffen
  issuer:   "C=US, O=TNC Demo, CN=TNC Demo CA"
437 31 Andreas Steffen
  validity:  not before Feb 19 09:33:43 2017, ok
438 31 Andreas Steffen
             not after  Aug 29 10:33:43 2026, ok (expires in 3477 days)
439 31 Andreas Steffen
  serial:    11:57:33:3e:2a:8e:8a:32
440 31 Andreas Steffen
  altNames:  raspi5.example.com
441 31 Andreas Steffen
  authkeyId: 21:02:7e:2d:de:8b:77:48:75:de:56:2f:b5:d4:62:ec:c3:09:15:f2
442 31 Andreas Steffen
  subjkeyId: f4:9e:85:7d:de:4e:67:f5:fb:87:03:98:67:3f:20:7c:f3:3f:2b:66
443 31 Andreas Steffen
  pubkey:    RSA 2048 bits, has private key
444 31 Andreas Steffen
  keyid:     71:21:f5:d4:7e:59:4a:88:16:ca:57:85:98:3d:36:a7:b1:d5:75:fa
445 31 Andreas Steffen
  subjkey:   f4:9e:85:7d:de:4e:67:f5:fb:87:03:98:67:3f:20:7c:f3:3f:2b:66
446 31 Andreas Steffen
447 31 Andreas Steffen
  subject:  "C=US, O=TNC Demo, OU=AIK ECC, CN=raspi5.example.com"
448 31 Andreas Steffen
  issuer:   "C=US, O=TNC Demo, CN=TNC Demo CA"
449 31 Andreas Steffen
  validity:  not before Feb 17 23:17:19 2017, ok
450 31 Andreas Steffen
             not after  Aug 30 00:17:19 2026, ok (expires in 3478 days)
451 31 Andreas Steffen
  serial:    52:9d:3e:42:6f:71:63:3d
452 31 Andreas Steffen
  altNames:  raspi5.example.com
453 31 Andreas Steffen
  authkeyId: 21:02:7e:2d:de:8b:77:48:75:de:56:2f:b5:d4:62:ec:c3:09:15:f2
454 31 Andreas Steffen
  subjkeyId: c7:0e:63:f8:7f:6f:f6:55:00:e5:05:7f:5a:3e:6b:6c:e7:d2:d5:13
455 31 Andreas Steffen
  pubkey:    ECDSA 256 bits, has private key
456 31 Andreas Steffen
  keyid:     71:49:7c:42:41:e7:c6:81:bc:31:73:f0:0f:7e:4a:e1:2d:53:00:38
457 31 Andreas Steffen
  subjkey:   c7:0e:63:f8:7f:6f:f6:55:00:e5:05:7f:5a:3e:6b:6c:e7:d2:d5:13
458 31 Andreas Steffen
</pre>
459 31 Andreas Steffen
460 31 Andreas Steffen
<pre>
461 31 Andreas Steffen
List of X.509 CA Certificates
462 31 Andreas Steffen
463 31 Andreas Steffen
  subject:  "C=US, O=TNC Demo, CN=TNC Demo CA"
464 1 Andreas Steffen
  issuer:   "C=US, O=TNC Demo, CN=TNC Demo CA"
465 32 Andreas Steffen
  validity:  not before Aug 31 10:29:27 2016, ok
466 32 Andreas Steffen
             not after  Aug 31 10:29:27 2026, ok (expires in 3479 days)
467 43 Andreas Steffen
  serial:    02:c8:85:e1:ef:fa:8f:20
468 32 Andreas Steffen
  flags:     CA CRLSign self-signed 
469 38 Andreas Steffen
  subjkeyId: 21:02:7e:2d:de:8b:77:48:75:de:56:2f:b5:d4:62:ec:c3:09:15:f2
470 32 Andreas Steffen
  pubkey:    ECDSA 256 bits
471 32 Andreas Steffen
  keyid:     a1:b5:e0:29:d0:4c:a7:62:bd:ca:a3:b4:af:18:42:2c:4a:01:55:9a
472 32 Andreas Steffen
  subjkey:   21:02:7e:2d:de:8b:77:48:75:de:56:2f:b5:d4:62:ec:c3:09:15:f2
473 32 Andreas Steffen
</pre>
474 32 Andreas Steffen
475 32 Andreas Steffen
h2. IKEv2 Authentication with RSA AIK Certificate
476 32 Andreas Steffen
477 32 Andreas Steffen
With the following *swanctl* command the "rsa" connection is established
478 32 Andreas Steffen
<pre>
479 32 Andreas Steffen
swanctl --initiate --child rsa
480 32 Andreas Steffen
</pre>
481 32 Andreas Steffen
482 32 Andreas Steffen
<pre>
483 45 Andreas Steffen
Feb 19 10:52:21 raspi5 charon-systemd[21165]: vici initiate 'rsa'
484 32 Andreas Steffen
Feb 19 10:52:21 raspi5 charon-systemd[21165]: initiating IKE_SA rsa[1] to 10.10.0.104
485 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 ]
486 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)
487 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)
488 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 ]
489 32 Andreas Steffen
Feb 19 10:52:21 raspi5 charon-systemd[21165]: received strongSwan vendor ID
490 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"
491 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"
492 32 Andreas Steffen
</pre>
493 32 Andreas Steffen
494 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.
495 32 Andreas Steffen
<pre>
496 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
497 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"
498 32 Andreas Steffen
</pre>
499 32 Andreas Steffen
<pre>
500 32 Andreas Steffen
Feb 19 10:52:24 raspi5 charon-systemd[21165]: establishing CHILD_SA rsa
501 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) ]
502 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)
503 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)
504 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) ]
505 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"
506 32 Andreas Steffen
Feb 19 10:52:24 raspi5 charon-systemd[21165]:   using certificate "C=US, O=TNC Demo, CN=raspi4.example.com"
507 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"
508 32 Andreas Steffen
Feb 19 10:52:24 raspi5 charon-systemd[21165]:   reached self-signed root ca with a path length of 0
509 32 Andreas Steffen
Feb 19 10:52:24 raspi5 charon-systemd[21165]: authentication of 'raspi4.example.com' with ECDSA_WITH_SHA256_DER successful
510 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]
511 32 Andreas Steffen
Feb 19 10:52:24 raspi5 charon-systemd[21165]: scheduling reauthentication in 10507s
512 32 Andreas Steffen
Feb 19 10:52:24 raspi5 charon-systemd[21165]: maximum IKE_SA lifetime 11587s
513 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
514 32 Andreas Steffen
Feb 19 10:52:24 raspi5 charon-systemd[21165]: received AUTH_LIFETIME of 10103s, scheduling reauthentication in 9023s
515 32 Andreas Steffen
Feb 19 10:52:24 raspi5 charon-systemd[21165]: peer supports MOBIKE
516 32 Andreas Steffen
</pre>
517 32 Andreas Steffen
518 32 Andreas Steffen
The following *swanctl* command shows the established IPsec connection
519 32 Andreas Steffen
<pre>
520 32 Andreas Steffen
 swanctl --list-sas
521 32 Andreas Steffen
</pre>
522 32 Andreas Steffen
<pre>
523 32 Andreas Steffen
rsa: #1, ESTABLISHED, IKEv2, 7ba3b4d06c051ecb_i* 14e1769a8aeb7f28_r
524 32 Andreas Steffen
  local  'C=US, O=TNC Demo, OU=AIK RSA, CN=raspi5.example.com' @ 10.10.0.105[4500]
525 32 Andreas Steffen
  remote 'raspi4.example.com' @ 10.10.0.104[4500]
526 32 Andreas Steffen
  AES_CBC-128/HMAC_SHA2_256_128/PRF_HMAC_SHA2_256/CURVE_25519
527 32 Andreas Steffen
  established 252s ago, reauth in 8771s
528 38 Andreas Steffen
  rsa: #1, reqid 1, INSTALLED, TRANSPORT, ESP:AES_CBC-128/HMAC_SHA2_256_128
529 33 Andreas Steffen
    installed 252s ago, rekeying in 3258s, expires in 3708s
530 33 Andreas Steffen
    in  c23deb9d,    640 bytes,    10 packets,     3s ago
531 33 Andreas Steffen
    out ce48d08e,    640 bytes,    10 packets,     3s ago
532 33 Andreas Steffen
    local  10.10.0.105/32
533 33 Andreas Steffen
    remote 10.10.0.104/32
534 33 Andreas Steffen
</pre>
535 33 Andreas Steffen
536 33 Andreas Steffen
With this *swanctl* command the "rsa" connection is terminated
537 33 Andreas Steffen
<pre>
538 33 Andreas Steffen
swanctl --terminate --ike rsa
539 33 Andreas Steffen
</pre>
540 33 Andreas Steffen
541 33 Andreas Steffen
<pre>
542 33 Andreas Steffen
Feb 19 10:59:16 raspi5 charon-systemd[21165]: vici terminate IKE_SA 'rsa'
543 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]
544 43 Andreas Steffen
Feb 19 10:59:16 raspi5 charon-systemd[21165]: sending DELETE for IKE_SA rsa[1]
545 32 Andreas Steffen
Feb 19 10:59:16 raspi5 charon-systemd[21165]: generating INFORMATIONAL request 2 [ D ]
546 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)
547 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)
548 32 Andreas Steffen
Feb 19 10:59:16 raspi5 charon-systemd[21165]: parsed INFORMATIONAL response 2 [ ]
549 33 Andreas Steffen
Feb 19 10:59:16 raspi5 charon-systemd[21165]: IKE_SA deleted
550 33 Andreas Steffen
</pre>
551 33 Andreas Steffen
552 33 Andreas Steffen
h2. IKEv2 Authentication with ECC AIK Certificate
553 33 Andreas Steffen
554 33 Andreas Steffen
Next we initiate the "ecc" connection
555 33 Andreas Steffen
<pre>
556 33 Andreas Steffen
swanctl --initiate --child ecc
557 33 Andreas Steffen
</pre>
558 33 Andreas Steffen
559 33 Andreas Steffen
<pre>
560 45 Andreas Steffen
Feb 19 11:00:32 raspi5 charon-systemd[21165]: vici initiate 'ecc'
561 33 Andreas Steffen
Feb 19 11:00:32 raspi5 charon-systemd[21165]: initiating IKE_SA ecc[2] to 10.10.0.104
562 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 ]
563 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)
564 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)
565 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 ]
566 33 Andreas Steffen
Feb 19 11:00:32 raspi5 charon-systemd[21165]: received strongSwan vendor ID
567 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"
568 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"
569 33 Andreas Steffen
</pre>
570 33 Andreas Steffen
571 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.
572 33 Andreas Steffen
<pre>
573 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
574 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"
575 33 Andreas Steffen
</pre>
576 33 Andreas Steffen
<pre>
577 33 Andreas Steffen
Feb 19 11:00:34 raspi5 charon-systemd[21165]: establishing CHILD_SA ecc
578 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) ]
579 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)
580 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)
581 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) ]
582 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"
583 33 Andreas Steffen
Feb 19 11:00:34 raspi5 charon-systemd[21165]:   using certificate "C=US, O=TNC Demo, CN=raspi4.example.com"
584 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"
585 33 Andreas Steffen
Feb 19 11:00:34 raspi5 charon-systemd[21165]:   reached self-signed root ca with a path length of 0
586 33 Andreas Steffen
Feb 19 11:00:34 raspi5 charon-systemd[21165]: authentication of 'raspi4.example.com' with ECDSA_WITH_SHA256_DER successful
587 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]
588 33 Andreas Steffen
Feb 19 11:00:34 raspi5 charon-systemd[21165]: scheduling reauthentication in 10180s
589 33 Andreas Steffen
Feb 19 11:00:34 raspi5 charon-systemd[21165]: maximum IKE_SA lifetime 11260s
590 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
591 33 Andreas Steffen
Feb 19 11:00:34 raspi5 charon-systemd[21165]: received AUTH_LIFETIME of 9880s, scheduling reauthentication in 8800s
592 33 Andreas Steffen
Feb 19 11:00:34 raspi5 charon-systemd[21165]: peer supports MOBIKE
593 33 Andreas Steffen
</pre>
594 33 Andreas Steffen
595 33 Andreas Steffen
The establed IKE and CHILD SAs are displayed
596 33 Andreas Steffen
<pre>
597 33 Andreas Steffen
 swanctl --list-sas
598 33 Andreas Steffen
</pre>
599 33 Andreas Steffen
<pre>
600 33 Andreas Steffen
ecc: #2, ESTABLISHED, IKEv2, b7f2652777b0996a_i* 12282b5964ff0658_r
601 1 Andreas Steffen
  local  'C=US, O=TNC Demo, OU=AIK ECC, CN=raspi5.example.com' @ 10.10.0.105[4500]
602 1 Andreas Steffen
  remote 'raspi4.example.com' @ 10.10.0.104[4500]
603 34 Andreas Steffen
  AES_CBC-128/HMAC_SHA2_256_128/PRF_HMAC_SHA2_256/CURVE_25519
604 34 Andreas Steffen
  established 126s ago, reauth in 8674s
605 39 Andreas Steffen
  ecc: #2, reqid 2, INSTALLED, TRANSPORT, ESP:AES_CBC-128/HMAC_SHA2_256_128
606 34 Andreas Steffen
    installed 126s ago, rekeying in 3252s, expires in 3834s
607 34 Andreas Steffen
    in  c2c16cd0,    320 bytes,     5 packets,     2s ago
608 34 Andreas Steffen
    out c47ea6f6,    320 bytes,     5 packets,     2s ago
609 34 Andreas Steffen
    local  10.10.0.105/32
610 34 Andreas Steffen
    remote 10.10.0.104/32
611 34 Andreas Steffen
</pre>
612 34 Andreas Steffen
613 34 Andreas Steffen
The IKE and CHILD SAs are terminated
614 34 Andreas Steffen
<pre>
615 34 Andreas Steffen
swanctl --terminate --ike ecc
616 34 Andreas Steffen
</pre>
617 34 Andreas Steffen
618 34 Andreas Steffen
<pre>
619 34 Andreas Steffen
Feb 19 11:04:32 raspi5 charon-systemd[21165]: vici terminate IKE_SA 'ecc'
620 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]
621 34 Andreas Steffen
Feb 19 11:04:32 raspi5 charon-systemd[21165]: sending DELETE for IKE_SA ecc[2]
622 34 Andreas Steffen
Feb 19 11:04:32 raspi5 charon-systemd[21165]: generating INFORMATIONAL request 2 [ D ]
623 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)
624 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)
625 34 Andreas Steffen
Feb 19 11:04:32 raspi5 charon-systemd[21165]: parsed INFORMATIONAL response 2 [ ]
626 34 Andreas Steffen
Feb 19 11:04:32 raspi5 charon-systemd[21165]: IKE_SA deleted
627 1 Andreas Steffen
</pre>