Project

General

Profile

Trusted Platform Module 2.0 » History » Version 126

Andreas Steffen, 02.01.2021 13:14

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 96 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 1 Andreas Steffen
  ./configure --enable-tss-tss2 --enable-tpm  ...
37 96 Andreas Steffen
38 117 Andreas Steffen
With the strongSwan [[IpsecPki|pki]] tool we can now list the persistent key stored under the handle *0x81010001*
39 96 Andreas Steffen
<pre>
40 96 Andreas Steffen
pki --print --type priv --keyid 0x81010001 --debug 2
41 97 Andreas Steffen
</pre>
42 98 Andreas Steffen
With debug level 2 some basic information on the TPM device is shown; A second generation Intel firmware TPM running on the Intel Management Engine is employed. Both SHA1 and SHA256 PCR banks are available:
43 97 Andreas Steffen
<pre>
44 96 Andreas Steffen
TPM 2.0 - manufacturer: INTC (Intel) rev: 01.38 2018 
45 96 Andreas Steffen
TPM 2.0 - algorithms: RSA SHA1 HMAC AES MGF1 KEYEDHASH XOR SHA256 RSASSA RSAES RSAPSS OAEP ECDSA ECDH ECDAA ECSCHNORR KDF1_SP800_56A KDF1_SP800_108 ECC SYMCIPHER CTR OFB CBC CFB ECB
46 96 Andreas Steffen
TPM 2.0 - ECC curves: NIST_P256 BN_P256
47 96 Andreas Steffen
TPM 2.0 - PCR banks: SHA1 SHA256
48 97 Andreas Steffen
</pre>
49 99 Andreas Steffen
Apparently the analyzed persistent key can be used for encryption only because no signature algorithm is defined:
50 97 Andreas Steffen
<pre>
51 96 Andreas Steffen
TPM 2.0 via TSS2 v2 available
52 96 Andreas Steffen
signature algorithm is NULL with ERROR hash
53 97 Andreas Steffen
</pre>
54 118 Andreas Steffen
Debug level 2 shows that [[IpsecPki|pki]] extracts the public key from the TPM and converts it into a standard PKCS#1 format:
55 97 Andreas Steffen
<pre>
56 96 Andreas Steffen
L0 - subjectPublicKeyInfo:
57 96 Andreas Steffen
L1 - algorithm:
58 96 Andreas Steffen
L2 - algorithmIdentifier:
59 96 Andreas Steffen
L3 - algorithm:
60 96 Andreas Steffen
  'rsaEncryption'
61 96 Andreas Steffen
L1 - subjectPublicKey:
62 96 Andreas Steffen
-- > --
63 96 Andreas Steffen
L0 - RSAPublicKey:
64 96 Andreas Steffen
L1 - modulus:
65 96 Andreas Steffen
L1 - publicExponent:
66 96 Andreas Steffen
-- < --
67 97 Andreas Steffen
</pre>
68 98 Andreas Steffen
At the end of the output the fingerprint of the 2048 bit RSA key is listed:
69 97 Andreas Steffen
<pre>
70 96 Andreas Steffen
  privkey:   RSA 2048 bits
71 96 Andreas Steffen
  keyid:     ee:c7:bf:5a:de:0f:11:84:2c:86:2b:69:84:ba:65:b9:81:d2:a9:45
72 1 Andreas Steffen
  subjkey:   df:f2:e9:e7:79:98:f0:d2:0b:62:db:c0:5c:2c:eb:45:73:85:e9:79
73 97 Andreas Steffen
</pre>
74 7 Andreas Steffen
75 20 Andreas Steffen
h2. Derive a Persistent RSA Endorsement Key
76 1 Andreas Steffen
77 116 Andreas Steffen
The "tpm2_createek":https://github.com/tpm2-software/tpm2-tools/blob/5.0/man/tpm2_createek.1.md 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 *0x81010002*
78 11 Andreas Steffen
79 100 Andreas Steffen
 tpm2_createek -G rsa -c 0x81010002
80 1 Andreas Steffen
81 119 Andreas Steffen
Using the "tpm2_getcap":https://github.com/tpm2-software/tpm2-tools/blob/5.0/man/tpm2_getcap.1.md command we can check that the newly derived Endorsement Key has been persisted in the NV RAM
82 100 Andreas Steffen
<pre>
83 100 Andreas Steffen
tpm2_getcap handles-persistent
84 100 Andreas Steffen
- 0x81000001
85 100 Andreas Steffen
- 0x81000002
86 100 Andreas Steffen
- 0x81010001
87 100 Andreas Steffen
- 0x81010002
88 100 Andreas Steffen
</pre>
89 101 Andreas Steffen
Listing the key properties shows that the 2048 bit Endorsement Key already exists under the handle *0x81010001* analyzed in the previous section
90 1 Andreas Steffen
<pre>
91 123 Andreas Steffen
pki --print --type priv --keyid 0x81010002
92 100 Andreas Steffen
TPM 2.0 via TSS2 v2 available
93 100 Andreas Steffen
signature algorithm is NULL with ERROR hash
94 100 Andreas Steffen
  privkey:   RSA 2048 bits
95 100 Andreas Steffen
  keyid:     ee:c7:bf:5a:de:0f:11:84:2c:86:2b:69:84:ba:65:b9:81:d2:a9:45
96 100 Andreas Steffen
  subjkey:   df:f2:e9:e7:79:98:f0:d2:0b:62:db:c0:5c:2c:eb:45:73:85:e9:79
97 100 Andreas Steffen
</pre>
98 1 Andreas Steffen
99 126 Andreas Steffen
h3. Delete Persisted Keys
100 126 Andreas Steffen
101 119 Andreas Steffen
We therefore delete the duplicate key with the following "tpm2_evictcontrol":https://github.com/tpm2-software/tpm2-tools/blob/5.0/man/tpm2_evictcontrol.1.md command
102 100 Andreas Steffen
<pre>
103 100 Andreas Steffen
tpm2_evictcontrol -c 0x81010002
104 100 Andreas Steffen
persistent-handle: 0x81010002
105 100 Andreas Steffen
action: evicted
106 100 Andreas Steffen
</pre>
107 100 Andreas Steffen
The key removal can be verified with
108 100 Andreas Steffen
<pre>
109 100 Andreas Steffen
tpm2_getcap handles-persistent
110 100 Andreas Steffen
- 0x81000001
111 100 Andreas Steffen
- 0x81000002
112 102 Andreas Steffen
- 0x81010001
113 100 Andreas Steffen
</pre>
114 1 Andreas Steffen
115 103 Andreas Steffen
h2. Derive a Persistent ECC Endorsement Key
116 103 Andreas Steffen
117 120 Andreas Steffen
Again using the "tpm2_createek":https://github.com/tpm2-software/tpm2-tools/blob/5.0/man/tpm2_createek.1.md command we derive a 256 bit ECC Endorsement Key (EK) in a deterministic way from the secret _Endorsement Primary Seed_ *unique* to each TPM device and make the key persistent in the non-volatile memory of the TPM under the object handle *0x81010002*:
118 103 Andreas Steffen
119 103 Andreas Steffen
 tpm2_createek -G ecc -c 0x81010002 -u ek_ecc.pub
120 103 Andreas Steffen
121 103 Andreas Steffen
Optionally we saved the public key in a TPM 2.0 proprietary format in the file *ek_ecc.pub*. The fingerprint of the ECC EK private key can be directly displayed with the command
122 105 Andreas Steffen
123 105 Andreas Steffen
<pre>
124 111 Andreas Steffen
pki --print --type priv --keyid 0x81010002
125 104 Andreas Steffen
TPM 2.0 via TSS2 v2 available
126 104 Andreas Steffen
signature algorithm is NULL with ERROR hash
127 103 Andreas Steffen
  privkey:   ECDSA 256 bits
128 103 Andreas Steffen
  keyid:     25:db:73:13:0f:c9:c8:91:68:30:8e:02:89:c1:0d:65:bd:ad:69:2a
129 103 Andreas Steffen
  subjkey:   9c:b9:fb:b0:32:81:24:82:a7:07:b2:bd:bd:d3:7c:2b:22:7f:74:bf
130 103 Andreas Steffen
</pre>
131 103 Andreas Steffen
132 103 Andreas Steffen
h2. Endorsement Key Certificates
133 103 Andreas Steffen
134 115 Andreas Steffen
h3. Fetched via URL
135 1 Andreas Steffen
136 115 Andreas Steffen
Endorsement Key certificates issued for Intel firmware TPMs can be automatically downloaded from an Intel web server using the "tpm2_getcertificate":https://github.com/tpm2-software/tpm2-tools/blob/5.0/man/tpm2_getekcertificate.1.md command:
137 115 Andreas Steffen
138 112 Andreas Steffen
 tpm2_getekcertificate -o ek_ecc.crt -u ek_ecc.pub
139 106 Andreas Steffen
140 121 Andreas Steffen
For successful retrieval the public key *ek_ecc.pub* in the TPM 2.0 proprietary format is required. Using the [[IpsecPki|pki]] tool we can list the downloaded EK certificate belonging to the ECC key:
141 106 Andreas Steffen
<pre>
142 106 Andreas Steffen
pki --print --type x509 --in ek_ecc.crt
143 106 Andreas Steffen
  subject:  ""
144 106 Andreas Steffen
  issuer:   "C=US, ST=CA, L=Santa Clara, O=Intel Corporation, OU=TPM EK intermediate for CNL_EPID_POST_B1LP_PROD_2 pid:9, CN=www.intel.com"
145 106 Andreas Steffen
  validity:  not before Sep 04 02:00:00 2019, ok
146 106 Andreas Steffen
             not after  Jan 01 00:59:59 2050, ok (expires in 10600 days)
147 106 Andreas Steffen
  serial:    07:99:3b:c6:88:aa:7d:72:b0:24:24:05:09:01:bb:42:55:70:1a:43
148 106 Andreas Steffen
  altNames:  tcg-at-tpmManufacturer=id:494E5443, tcg-at-tpmModel=CNL, tcg-at-tpmVersion=id:00020000
149 106 Andreas Steffen
  CRL URIs:  https://trustedservices.intel.com/content/CRL/ekcert/CNLEPIDPOSTB1LPPROD2_EK_Device.crl
150 106 Andreas Steffen
  certificatePolicies:
151 106 Andreas Steffen
             1.2.840.113741.1.5.2.1
152 106 Andreas Steffen
             CPS: https://trustedservices.intel.com/content/CRL/ekcert/EKcertPolicyStatement.pdf
153 106 Andreas Steffen
  authkeyId: 17:a0:05:75:d0:5e:58:e3:88:12:10:bb:98:b1:04:5b:b4:c3:06:39
154 106 Andreas Steffen
  subjkeyId: 9c:b9:fb:b0:32:81:24:82:a7:07:b2:bd:bd:d3:7c:2b:22:7f:74:bf
155 106 Andreas Steffen
  pubkey:    ECDSA 256 bits
156 106 Andreas Steffen
  keyid:     25:db:73:13:0f:c9:c8:91:68:30:8e:02:89:c1:0d:65:bd:ad:69:2a
157 106 Andreas Steffen
  subjkey:   9c:b9:fb:b0:32:81:24:82:a7:07:b2:bd:bd:d3:7c:2b:22:7f:74:bf
158 106 Andreas Steffen
</pre>
159 121 Andreas Steffen
For the RSA 2048 Endorsement Key we first have to extract the public keyfile *ek_rsa.pub* in the TPM 2.0 proprietary format using the "tpm2_readpublic":https://github.com/tpm2-software/tpm2-tools/blob/5.0/man/tpm2_readpublic.1.md command because we forgot to do this in the first place:
160 109 Andreas Steffen
161 110 Andreas Steffen
 tpm2_readpublic -Q -c 0x81010001 -o ek_rsa.pub
162 106 Andreas Steffen
163 110 Andreas Steffen
Now we can retrieve the RSA EK certificate, too:
164 106 Andreas Steffen
165 114 Andreas Steffen
 tpm2_getekcertificate -o ek_rsa.crt -u ek_rsa.pub
166 106 Andreas Steffen
167 106 Andreas Steffen
and view the contents with
168 106 Andreas Steffen
<pre>
169 106 Andreas Steffen
pki --print --type x509 --in ek_rsa.crt
170 106 Andreas Steffen
  subject:  ""
171 106 Andreas Steffen
  issuer:   "C=US, ST=CA, L=Santa Clara, O=Intel Corporation, OU=TPM EK intermediate for CNL_EPID_POST_B1LP_PROD_2 pid:9, CN=www.intel.com"
172 106 Andreas Steffen
  validity:  not before Sep 04 02:00:00 2019, ok
173 106 Andreas Steffen
             not after  Jan 01 00:59:59 2050, ok (expires in 10600 days)
174 106 Andreas Steffen
  serial:    14:26:0b:eb:12:a2:82:87:af:3b:75:e0:a1:a4:87:60:72:95:55:92
175 106 Andreas Steffen
  altNames:  tcg-at-tpmManufacturer=id:494E5443, tcg-at-tpmModel=CNL, tcg-at-tpmVersion=id:00020000
176 106 Andreas Steffen
  CRL URIs:  https://trustedservices.intel.com/content/CRL/ekcert/CNLEPIDPOSTB1LPPROD2_EK_Device.crl
177 106 Andreas Steffen
  certificatePolicies:
178 106 Andreas Steffen
             1.2.840.113741.1.5.2.1
179 106 Andreas Steffen
             CPS: https://trustedservices.intel.com/content/CRL/ekcert/EKcertPolicyStatement.pdf
180 106 Andreas Steffen
  authkeyId: 17:a0:05:75:d0:5e:58:e3:88:12:10:bb:98:b1:04:5b:b4:c3:06:39
181 106 Andreas Steffen
  subjkeyId: df:f2:e9:e7:79:98:f0:d2:0b:62:db:c0:5c:2c:eb:45:73:85:e9:79
182 106 Andreas Steffen
  pubkey:    RSA 2048 bits
183 106 Andreas Steffen
  keyid:     ee:c7:bf:5a:de:0f:11:84:2c:86:2b:69:84:ba:65:b9:81:d2:a9:45
184 106 Andreas Steffen
  subjkey:   df:f2:e9:e7:79:98:f0:d2:0b:62:db:c0:5c:2c:eb:45:73:85:e9:79
185 1 Andreas Steffen
</pre>
186 1 Andreas Steffen
187 115 Andreas Steffen
We can easily check that in both EK certificates the key fingerprints (__keyid__ and __subjkey__) match with those of the EK keys persisted in the TPM.
188 115 Andreas Steffen
189 115 Andreas Steffen
h3. Stored in Non-Volatile RAM
190 115 Andreas Steffen
191 115 Andreas Steffen
Most hardware TPMs are shipped with their Endorsement Key Certificates stored in NV RAM. E.g. on an STMicroelectronics TPM device the following data objects are stored in an NV index:
192 115 Andreas Steffen
<pre>
193 115 Andreas Steffen
tpm2_getcap handles-nv-index
194 115 Andreas Steffen
- 0x1410001
195 115 Andreas Steffen
- 0x1410002
196 115 Andreas Steffen
- 0x1410004
197 115 Andreas Steffen
- 0x1880001
198 115 Andreas Steffen
- 0x1880011
199 115 Andreas Steffen
- 0x1C00002
200 115 Andreas Steffen
- 0x1C0000A
201 115 Andreas Steffen
- 0x1C00012
202 115 Andreas Steffen
- 0x1C10102
203 115 Andreas Steffen
- 0x1C10103
204 115 Andreas Steffen
- 0x1C10104
205 115 Andreas Steffen
- 0x1C101C0
206 115 Andreas Steffen
</pre>
207 115 Andreas Steffen
Using the "tpm2_nvreadpublic":https://github.com/tpm2-software/tpm2-tools/blob/5.0/man/tpm2_nvreadpublic.1.md command we can look for large data objects which are prime candidates for X.509 certificates:
208 115 Andreas Steffen
<pre>
209 115 Andreas Steffen
tpm2_nvreadpublic
210 115 Andreas Steffen
  ...
211 115 Andreas Steffen
0x1c00002:
212 115 Andreas Steffen
  name: 000b5c112bd5f410d0abe96a50e94ff721a005c32567e4b1112ab0a8fb7e0289b7f2
213 115 Andreas Steffen
  hash algorithm:
214 115 Andreas Steffen
    friendly: sha256
215 115 Andreas Steffen
    value: 0xB
216 115 Andreas Steffen
  attributes:
217 115 Andreas Steffen
    friendly: ppwrite|writedefine|write_stclear|ppread|ownerread|authread|no_da|written|platformcreate
218 115 Andreas Steffen
    value: 0x1600762
219 115 Andreas Steffen
  size: 1033
220 115 Andreas Steffen
221 115 Andreas Steffen
0x1c0000a:
222 115 Andreas Steffen
  name: 000b1948300e66afad594b7a8e8368d53ddd36908fb2b46dd7b5a88051b50e4047ab
223 115 Andreas Steffen
  hash algorithm:
224 115 Andreas Steffen
    friendly: sha256
225 115 Andreas Steffen
    value: 0xB
226 115 Andreas Steffen
  attributes:
227 115 Andreas Steffen
    friendly: ppwrite|writedefine|write_stclear|ppread|ownerread|authread|no_da|written|platformcreate
228 115 Andreas Steffen
    value: 0x1600762
229 115 Andreas Steffen
  size: 639
230 115 Andreas Steffen
231 115 Andreas Steffen
0x1c00012:
232 115 Andreas Steffen
  name: 000cde411e123085083eedb1c9312e08dd8d229df6a5e16996035a2e3000d860b372c924de0354a6af4c7886656d2065814f
233 115 Andreas Steffen
  hash algorithm:
234 115 Andreas Steffen
    friendly: sha384
235 115 Andreas Steffen
    value: 0xC
236 115 Andreas Steffen
  attributes:
237 115 Andreas Steffen
    friendly: ppwrite|writedefine|write_stclear|ppread|ownerread|authread|no_da|written|platformcreate
238 115 Andreas Steffen
    value: 0x1600762
239 115 Andreas Steffen
  size: 707
240 115 Andreas Steffen
  ...
241 115 Andreas Steffen
</pre>
242 115 Andreas Steffen
We can use the pki tool to directly list the properties of the EK certificates:
243 115 Andreas Steffen
<pre>
244 115 Andreas Steffen
pki --print --type x509 --keyid 0x01c00002
245 115 Andreas Steffen
TPM 2.0 via TSS2 v2 available
246 115 Andreas Steffen
loaded certificate from TPM NV index 0x01c00002
247 115 Andreas Steffen
  subject:  ""
248 115 Andreas Steffen
  issuer:   "C=CH, O=STMicroelectronics NV, CN=STM TPM EK Intermediate CA 06"
249 115 Andreas Steffen
  validity:  not before Feb 11 01:00:00 2020, ok
250 115 Andreas Steffen
             not after  Jan 01 01:00:00 2031, ok (expires in 3650 days)
251 115 Andreas Steffen
  serial:    72:78:a1:2c:87:b6:aa:45:c4:1f:57:ff:d1:3d:cf:93:42:34:b9:c9
252 115 Andreas Steffen
  altNames:  tcg-at-tpmManufacturer=id:53544D20, tcg-at-tpmModel=ST33HTPHAHD4, tcg-at-tpmVersion=id:00010101
253 115 Andreas Steffen
  authkeyId: fb:17:d7:0d:73:48:70:e9:19:c4:e8:e6:03:97:5e:66:4e:0e:43:de
254 115 Andreas Steffen
  subjkeyId: e9:3d:51:32:04:42:73:3e:fc:bb:9e:f8:0c:21:9a:53:ec:73:80:94
255 115 Andreas Steffen
  pubkey:    RSA 2048 bits
256 115 Andreas Steffen
  keyid:     d3:e3:71:79:df:32:53:34:60:0f:1f:38:dc:d4:6d:53:59:1b:c5:3c
257 115 Andreas Steffen
  subjkey:   e9:3d:51:32:04:42:73:3e:fc:bb:9e:f8:0c:21:9a:53:ec:73:80:94
258 115 Andreas Steffen
</pre>
259 115 Andreas Steffen
<pre>
260 115 Andreas Steffen
pki --print --type x509 --keyid 0x01c0000a
261 115 Andreas Steffen
TPM 2.0 via TSS2 v2 available
262 115 Andreas Steffen
loaded certificate from TPM NV index 0x01c0000a
263 115 Andreas Steffen
  subject:  ""
264 115 Andreas Steffen
  issuer:   "C=CH, O=STMicroelectronics NV, CN=STM TPM ECC Intermediate CA 02"
265 115 Andreas Steffen
  validity:  not before Mar 09 01:00:00 2020, ok
266 115 Andreas Steffen
             not after  Jan 01 01:00:00 2031, ok (expires in 3650 days)
267 115 Andreas Steffen
  serial:    51:e8:fc:b2:64:8d:1d:36:a5:bc:d7:c9:63:c1:d6:de:e7:25:09:a4
268 115 Andreas Steffen
  altNames:  tcg-at-tpmManufacturer=id:53544D20, tcg-at-tpmModel=ST33HTPHAHD4, tcg-at-tpmVersion=id:00010101
269 115 Andreas Steffen
  authkeyId: 66:2d:8f:1c:ec:df:f1:47:a8:b6:f0:ea:29:6a:f7:f2:4c:ad:f9:cf
270 115 Andreas Steffen
  subjkeyId: d1:e8:fc:b2:64:8d:1d:36:a5:bc:d7:c9:63:c1:d6:de:e7:25:09:a4
271 115 Andreas Steffen
  pubkey:    ECDSA 256 bits
272 115 Andreas Steffen
  keyid:     8b:62:31:bf:08:9d:39:74:6d:05:fd:35:eb:2e:13:64:12:86:03:16
273 115 Andreas Steffen
  subjkey:   d1:e8:fc:b2:64:8d:1d:36:a5:bc:d7:c9:63:c1:d6:de:e7:25:09:a4
274 115 Andreas Steffen
</pre>
275 115 Andreas Steffen
or we can first retrieve the binary certificate blob from the NV RAM using the "tpm2_nvread":https://github.com/tpm2-software/tpm2-tools/blob/5.0/man/tpm2_nvread.1.md command:
276 115 Andreas Steffen
277 115 Andreas Steffen
 tpm2_nvread 0x01c00012 -C o -o ek_ecc384.crt
278 115 Andreas Steffen
279 115 Andreas Steffen
and then list the properties of the EK certificate file:
280 115 Andreas Steffen
<pre>
281 115 Andreas Steffen
pki --print --type x509 --in ek_ecc384.crt 
282 115 Andreas Steffen
  subject:  ""
283 115 Andreas Steffen
  issuer:   "C=CH, O=STMicroelectronics NV, CN=STM TPM ECC384 Intermediate CA 01"
284 115 Andreas Steffen
  validity:  not before Feb 08 01:00:00 2020, ok
285 115 Andreas Steffen
             not after  Jan 01 01:00:00 2031, ok (expires in 3650 days)
286 115 Andreas Steffen
  serial:    39:ed:ae:d4:89:9e:52:08:9f:42:8a:f5:d5:58:7b:50:a6:24:f3:63
287 115 Andreas Steffen
  altNames:  tcg-at-tpmManufacturer=id:53544D20, tcg-at-tpmModel=ST33HTPHAHD4, tcg-at-tpmVersion=id:00010101
288 115 Andreas Steffen
  authkeyId: bd:96:3e:9a:d5:74:aa:d9:4f:ad:6c:bf:41:6d:d8:5b:4a:55:99:42
289 115 Andreas Steffen
  subjkeyId: b9:ed:ae:d4:89:9e:52:08:9f:42:8a:f5:d5:58:7b:50:a6:24:f3:63
290 115 Andreas Steffen
  pubkey:    ECDSA 384 bits
291 115 Andreas Steffen
  keyid:     04:68:52:c4:00:ab:10:75:82:57:99:45:1e:7c:12:01:5a:8e:50:c9
292 115 Andreas Steffen
  subjkey:   b9:ed:ae:d4:89:9e:52:08:9f:42:8a:f5:d5:58:7b:50:a6:24:f3:63
293 115 Andreas Steffen
</pre>
294 122 Andreas Steffen
We see that the STMicroelectronics devices supports 384 bit ECC keys.
295 107 Andreas Steffen
296 11 Andreas Steffen
h2. Generate a Persistent RSA Attestation Key
297 20 Andreas Steffen
298 124 Andreas Steffen
A 2048 bit RSA Attestation Key (AK) bound to the EK with handle *0x81010001* can be created with the "tpm2_createak":https://github.com/tpm2-software/tpm2-tools/blob/5.0/man/tpm2_createak.1.md command:
299 25 Andreas Steffen
300 124 Andreas Steffen
  tpm2_createak -C 0x81010001 -G rsa -g sha256 -s rsassa -c ak_rsa.ctx -u ak_rsa.pub -n ak_rsa.name
301 1 Andreas Steffen
302 124 Andreas Steffen
and made persistent under the handle *0x81010003* with the "tpm2_evictcontrol":https://github.com/tpm2-software/tpm2-tools/blob/5.0/man/tpm2_evictcontrol.1.md command:
303 124 Andreas Steffen
<pre>
304 124 Andreas Steffen
tpm2_evictcontrol -C o -c ak_rsa.ctx 0x81010003
305 124 Andreas Steffen
persistent-handle: 0x81010003
306 124 Andreas Steffen
action: persisted
307 124 Andreas Steffen
</pre>
308 125 Andreas Steffen
The properties of the RSA AK which is a signing key can be displayed with the command
309 124 Andreas Steffen
<pre>
310 124 Andreas Steffen
pki --print --type priv --keyid 0x81010003
311 124 Andreas Steffen
TPM 2.0 via TSS2 v2 available
312 124 Andreas Steffen
signature algorithm is RSASSA with SHA256 hash
313 124 Andreas Steffen
  privkey:   RSA 2048 bits
314 124 Andreas Steffen
  keyid:     df:b7:8f:95:61:8f:70:84:f4:03:e8:7e:83:a6:dd:5f:c5:ff:72:b5
315 124 Andreas Steffen
  subjkey:   48:82:62:15:74:a2:10:c5:75:70:c2:d6:7d:59:9f:22:d9:4f:9c:07
316 124 Andreas Steffen
</pre>
317 13 Andreas Steffen
318 13 Andreas Steffen
h2. Generate a Persistent ECC Attestation Key
319 84 Andreas Steffen
320 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
321 13 Andreas Steffen
322 13 Andreas Steffen
 tpm2_getpubak -E 0x81010003 -g ecc -D sha256 -s ecdsa -k 0x81010004 -f ak_ecc4.pub -n ak_ecc4.name
323 50 Andreas Steffen
324 13 Andreas Steffen
The AK public key can be exported in PKCS#1 format from the TPM using the *pki* tool
325 52 Andreas Steffen
326 13 Andreas Steffen
 pki --pub --keyid 0x81010004 > ak_ecc_pub.der
327 14 Andreas Steffen
328 1 Andreas Steffen
The fingerprint of the ECC AK public key can be displayed with the command
329 1 Andreas Steffen
330 1 Andreas Steffen
 pki --print --type pub --in ak_ecc_pub.der
331 15 Andreas Steffen
  pubkey:    ECDSA 256 bits
332 20 Andreas Steffen
  keyid:     71:49:7c:42:41:e7:c6:81:bc:31:73:f0:0f:7e:4a:e1:2d:53:00:38
333 15 Andreas Steffen
  subjkey:   c7:0e:63:f8:7f:6f:f6:55:00:e5:05:7f:5a:3e:6b:6c:e7:d2:d5:13
334 15 Andreas Steffen
335 15 Andreas Steffen
h2. Generate Another ECC Attestation Key
336 85 Andreas Steffen
337 15 Andreas Steffen
Multiple AK keys bound to a common EK key can be generated
338 68 Andreas Steffen
339 15 Andreas Steffen
 tpm2_getpubak -E 0x81010003 -g ecc -D sha256 -s ecdsa -k 0x81010005 -f ak_ecc5.pub -n ak_ecc5.name
340 68 Andreas Steffen
341 15 Andreas Steffen
The fingerprint of the second ECC AK private key can be displayed with the command
342 15 Andreas Steffen
343 15 Andreas Steffen
 pki --print --type priv --in 0x81010005
344 15 Andreas Steffen
  pubkey:    ECDSA 256 bits
345 19 Andreas Steffen
  keyid:     c4:b4:9c:95:27:9e:ce:81:2f:98:42:c8:1b:f0:54:ff:d4:d1:24:34
346 15 Andreas Steffen
  subjkey:   cf:44:f4:f7:9d:97:09:ad:b1:09:3a:8e:6f:23:eb:9f:2c:35:94:c9
347 15 Andreas Steffen
348 15 Andreas Steffen
h2. Remove a Persistent Key Object
349 15 Andreas Steffen
350 1 Andreas Steffen
Since the non-volatile memory of the TPM is limited any persistent key object can be removed to free storage space.
351 18 Andreas Steffen
The following tpm2-tools command removes the ECC AK key with persistent handle 0x81010005
352 18 Andreas Steffen
353 18 Andreas Steffen
 tpm2_evictcontrol -A o -H 0x81010005 -S 0x81010005
354 18 Andreas Steffen
355 18 Andreas Steffen
h2. List Persistent Objects
356 18 Andreas Steffen
357 18 Andreas Steffen
The following tpm2-tools command lists all persistent objects stored by the TPM in non-volatile memory
358 18 Andreas Steffen
359 18 Andreas Steffen
 tpm2_listpersistent
360 18 Andreas Steffen
361 18 Andreas Steffen
<pre>
362 18 Andreas Steffen
6 persistent objects defined.
363 18 Andreas Steffen
364 18 Andreas Steffen
0. Persistent handle: 0x81000001
365 18 Andreas Steffen
{
366 18 Andreas Steffen
        Type: 0x23
367 18 Andreas Steffen
        Hash algorithm(nameAlg): 0xb
368 18 Andreas Steffen
        Attributes: 0x30072
369 18 Andreas Steffen
}
370 18 Andreas Steffen
1. Persistent handle: 0x81000002
371 18 Andreas Steffen
{
372 18 Andreas Steffen
        Type: 0x23
373 18 Andreas Steffen
        Hash algorithm(nameAlg): 0xb
374 18 Andreas Steffen
        Attributes: 0x60072
375 18 Andreas Steffen
}
376 18 Andreas Steffen
2. Persistent handle: 0x81010001
377 18 Andreas Steffen
{
378 18 Andreas Steffen
        Type: 0x1
379 18 Andreas Steffen
        Hash algorithm(nameAlg): 0xb
380 18 Andreas Steffen
        Attributes: 0x300b2
381 18 Andreas Steffen
}
382 18 Andreas Steffen
3. Persistent handle: 0x81010002
383 18 Andreas Steffen
{
384 18 Andreas Steffen
        Type: 0x1
385 18 Andreas Steffen
        Hash algorithm(nameAlg): 0xb
386 18 Andreas Steffen
        Attributes: 0x50072
387 18 Andreas Steffen
}
388 18 Andreas Steffen
4. Persistent handle: 0x81010003
389 18 Andreas Steffen
{
390 18 Andreas Steffen
        Type: 0x23
391 18 Andreas Steffen
        Hash algorithm(nameAlg): 0xb
392 18 Andreas Steffen
        Attributes: 0x300b2
393 18 Andreas Steffen
}
394 18 Andreas Steffen
5. Persistent handle: 0x81010004
395 18 Andreas Steffen
{
396 18 Andreas Steffen
        Type: 0x23
397 18 Andreas Steffen
        Hash algorithm(nameAlg): 0xb
398 13 Andreas Steffen
        Attributes: 0x50072
399 41 Andreas Steffen
}
400 41 Andreas Steffen
</pre>
401 41 Andreas Steffen
402 41 Andreas Steffen
h2. Create a Demo Root CA
403 41 Andreas Steffen
404 41 Andreas Steffen
The following *pki* command creates a 256 bit ECDSA private key for the Demo CA
405 41 Andreas Steffen
<pre>
406 41 Andreas Steffen
pki --gen --type ecdsa --size 256 --outform pem > demoCaKey.pem
407 41 Andreas Steffen
</pre>
408 41 Andreas Steffen
409 41 Andreas Steffen
Next we create a self-signed Root CA certificate
410 41 Andreas Steffen
<pre>
411 42 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
412 41 Andreas Steffen
</pre>
413 42 Andreas Steffen
414 41 Andreas Steffen
h2. Issue an RSA AIK Certificate
415 41 Andreas Steffen
416 41 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
417 41 Andreas Steffen
<pre>
418 42 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
419 41 Andreas Steffen
</pre>
420 42 Andreas Steffen
421 41 Andreas Steffen
h2. Issue an ECC AIK Certificate
422 41 Andreas Steffen
423 41 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
424 47 Andreas Steffen
<pre>
425 49 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
426 47 Andreas Steffen
</pre>
427 50 Andreas Steffen
428 47 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
429 49 Andreas Steffen
<pre>
430 49 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
431 47 Andreas Steffen
</pre>
432 47 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
433 47 Andreas Steffen
<pre>
434 54 Andreas Steffen
pki --issue --cacert demoCaCert.pem --cakey demoCaKey.pem --type pkcs10 --in ak_ecc_req.der --lifetime 3651 > raspi5_ak_ecc_Cert.der
435 54 Andreas Steffen
</pre>
436 55 Andreas Steffen
437 54 Andreas Steffen
h2. Store the ECC AIK Certificate in the NV RAM of the TPM
438 54 Andreas Steffen
439 63 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
440 54 Andreas Steffen
<pre>
441 54 Andreas Steffen
ls -l raspi5_ak_ecc_Cert.der
442 54 Andreas Steffen
-rw-r--r-- 1 root root 449 Feb 17  2017 raspi5_ak_ecc_Cert.der
443 54 Andreas Steffen
</pre>
444 54 Andreas Steffen
445 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
446 54 Andreas Steffen
<pre>
447 54 Andreas Steffen
tpm2_nvdefine -x 0x01800004 -a 0x40000001 -s 449 -t 0x2000A
448 54 Andreas Steffen
</pre>
449 70 Andreas Steffen
450 54 Andreas Steffen
Then we write the certificate file to the NV RAM destination
451 54 Andreas Steffen
<pre>
452 62 Andreas Steffen
tpm2_nvwrite -x 0x01800004 -a 0x40000001 raspi5_ak_ecc_Cert.der
453 54 Andreas Steffen
</pre>
454 62 Andreas Steffen
455 57 Andreas Steffen
h2. List of NV Indexes
456 57 Andreas Steffen
457 57 Andreas Steffen
A list of all defined NV indexes can be obtained with
458 55 Andreas Steffen
459 54 Andreas Steffen
 tpm2_nvlist
460 54 Andreas Steffen
461 54 Andreas Steffen
<pre>
462 54 Andreas Steffen
2 NV indexes defined.
463 54 Andreas Steffen
464 54 Andreas Steffen
  0. NV Index: 0x1500015
465 54 Andreas Steffen
  {
466 54 Andreas Steffen
	Hash algorithm(nameAlg):4
467 54 Andreas Steffen
 	The Index attributes(attributes):0x44040004
468 54 Andreas Steffen
 	The size of the data area(dataSize):4
469 54 Andreas Steffen
   }
470 54 Andreas Steffen
  1. NV Index: 0x1800004
471 1 Andreas Steffen
  {
472 1 Andreas Steffen
	Hash algorithm(nameAlg):11
473 62 Andreas Steffen
 	The Index attributes(attributes):0x2002000a
474 62 Andreas Steffen
 	The size of the data area(dataSize):449
475 62 Andreas Steffen
   }
476 62 Andreas Steffen
</pre>
477 62 Andreas Steffen
478 62 Andreas Steffen
h2. Remove NV Index
479 62 Andreas Steffen
480 54 Andreas Steffen
The memory assigned to a given NV index can be released with the command
481 54 Andreas Steffen
<pre>
482 30 Andreas Steffen
tpm2_nvrelease -x 0x01800001 -a 0x40000001
483 1 Andreas Steffen
</pre>
484 23 Andreas Steffen
485 1 Andreas Steffen
h2. Configure TPM Private Key Access via VICI Interface
486 7 Andreas Steffen
487 1 Andreas Steffen
Configuration of TPM private key access as tokens in the secrets section of *swanctl.conf*
488 1 Andreas Steffen
489 46 Andreas Steffen
 secrets {
490 1 Andreas Steffen
    token_ak_rsa {
491 1 Andreas Steffen
       handle = 81010002
492 7 Andreas Steffen
       pin = 123456
493 1 Andreas Steffen
    }
494 1 Andreas Steffen
    token_ak_ecc {
495 46 Andreas Steffen
       handle = 81010004
496 30 Andreas Steffen
    }
497 30 Andreas Steffen
}
498 30 Andreas Steffen
Since the use of the RSA AK private key is password-protected, the PIN *123456* is added.
499 30 Andreas Steffen
500 30 Andreas Steffen
h2. Define IPsec Connection with RSA AK Client Key
501 30 Andreas Steffen
502 30 Andreas Steffen
This connection configuration in *swanctl.conf* uses the RSA AK certificate for client authentication
503 30 Andreas Steffen
<pre>
504 30 Andreas Steffen
connections {
505 30 Andreas Steffen
   rsa {
506 30 Andreas Steffen
      local_addrs  = 10.10.0.105
507 30 Andreas Steffen
      remote_addrs = 10.10.0.104
508 30 Andreas Steffen
509 30 Andreas Steffen
      local {
510 30 Andreas Steffen
         auth = pubkey 
511 30 Andreas Steffen
         certs = raspi5_ak_rsa_Cert.der
512 30 Andreas Steffen
      }
513 30 Andreas Steffen
      remote {
514 30 Andreas Steffen
         auth = pubkey 
515 30 Andreas Steffen
         id = raspi4.example.com
516 30 Andreas Steffen
      }
517 30 Andreas Steffen
      children {
518 30 Andreas Steffen
         rsa {
519 30 Andreas Steffen
            mode = transport
520 30 Andreas Steffen
            esp_proposals = aes128-sha256-curve25519
521 30 Andreas Steffen
         }
522 30 Andreas Steffen
      }
523 30 Andreas Steffen
      version = 2
524 30 Andreas Steffen
      proposals = aes128-sha256-curve25519
525 30 Andreas Steffen
   }
526 30 Andreas Steffen
}
527 30 Andreas Steffen
</pre>
528 58 Andreas Steffen
529 30 Andreas Steffen
h2. Define IPsec Connection with ECC AK Client Key
530 30 Andreas Steffen
531 30 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
532 30 Andreas Steffen
<pre>
533 30 Andreas Steffen
connections {
534 30 Andreas Steffen
   ecc {
535 30 Andreas Steffen
      local_addrs  = 10.10.0.105
536 1 Andreas Steffen
      remote_addrs = 10.10.0.104
537 58 Andreas Steffen
538 58 Andreas Steffen
      local {
539 58 Andreas Steffen
         auth = pubkey
540 30 Andreas Steffen
         cert-tpm {
541 30 Andreas Steffen
            handle = 0x01800004
542 30 Andreas Steffen
         }
543 30 Andreas Steffen
      }
544 30 Andreas Steffen
      remote {
545 30 Andreas Steffen
         auth = pubkey
546 30 Andreas Steffen
         id = raspi4.example.com
547 30 Andreas Steffen
      }
548 30 Andreas Steffen
      children {
549 30 Andreas Steffen
         ecc {
550 30 Andreas Steffen
            mode = transport
551 30 Andreas Steffen
            esp_proposals = aes128-sha256-curve25519
552 30 Andreas Steffen
         }
553 30 Andreas Steffen
      }
554 30 Andreas Steffen
      version = 2
555 30 Andreas Steffen
      proposals = aes128-sha256-curve25519
556 29 Andreas Steffen
   }
557 29 Andreas Steffen
}
558 29 Andreas Steffen
</pre>
559 29 Andreas Steffen
560 29 Andreas Steffen
h2. Starting the strongSwan Daemon
561 29 Andreas Steffen
562 29 Andreas Steffen
<pre>
563 29 Andreas Steffen
systemctl start strongswan-swanctl
564 44 Andreas Steffen
</pre>
565 44 Andreas Steffen
566 44 Andreas Steffen
<pre>
567 44 Andreas Steffen
Feb 19 10:52:01 raspi5 systemd[1]: Starting strongSwan IPsec IKEv1/IKEv2 daemon using swanctl...
568 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
569 1 Andreas Steffen
Feb 19 10:52:01 raspi5 charon-systemd[21165]: spawning 16 worker threads
570 1 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'
571 59 Andreas Steffen
Feb 19 10:52:01 raspi5 charon-systemd[21165]: loaded certificate 'C=US, O=TNC Demo, CN=TNC Demo CA'
572 1 Andreas Steffen
</pre>
573 44 Andreas Steffen
574 53 Andreas Steffen
The RSA AK private key is attached to the *charon-systemd* daemon via the TPM 2.0 resource manager
575 44 Andreas Steffen
<pre>
576 73 Andreas Steffen
Feb 19 10:52:01 raspi5 charon-systemd[21165]: TPM 2.0 - manufacturer: IFX (SLB9670) rev: 01.16 2015
577 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
578 44 Andreas Steffen
Feb 19 10:52:01 raspi5 charon-systemd[21165]: TPM 2.0 - ECC curves: NIST_P256 BN_P256
579 1 Andreas Steffen
Feb 19 10:52:01 raspi5 charon-systemd[21165]: TPM 2.0 via TSS2 v2 available
580 1 Andreas Steffen
Feb 19 10:52:01 raspi5 charon-systemd[21165]: AIK signature algorithm is RSASSA with SHA256 hash
581 1 Andreas Steffen
Feb 19 10:52:01 raspi5 charon-systemd[21165]: loaded RSA private key from token
582 44 Andreas Steffen
F</pre>
583 44 Andreas Steffen
584 53 Andreas Steffen
The ECC AK private key is attached to the *charon-systemd* daemon via the TPM 2.0 resource manager
585 44 Andreas Steffen
<pre>
586 73 Andreas Steffen
Feb 19 10:52:01 raspi5 charon-systemd[21165]: TPM 2.0 - manufacturer: IFX (SLB9670) rev: 01.16 2015
587 1 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
588 1 Andreas Steffen
Feb 19 10:52:02 raspi5 charon-systemd[21165]: TPM 2.0 - ECC curves: NIST_P256 BN_P256
589 1 Andreas Steffen
Feb 19 10:52:02 raspi5 charon-systemd[21165]: TPM 2.0 via TSS2 v2 available
590 59 Andreas Steffen
Feb 19 10:52:02 raspi5 charon-systemd[21165]: AIK signature algorithm is ECDSA with SHA256 hash
591 59 Andreas Steffen
Feb 19 10:52:02 raspi5 charon-systemd[21165]: loaded ECDSA private key from token
592 59 Andreas Steffen
</pre>
593 59 Andreas Steffen
594 59 Andreas Steffen
The ECC AIK certificate is loaded by the *charon-systemd* daemon via the TPM 2.0 resource manager
595 59 Andreas Steffen
<pre>
596 73 Andreas Steffen
Feb 19 10:52:02 raspi5 charon-systemd[21165]: TPM 2.0 - manufacturer: IFX (SLB9670) rev: 01.16 2015
597 60 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
598 59 Andreas Steffen
Feb 19 10:52:02 raspi5 charon-systemd[21165]: TPM 2.0 - ECC curves: NIST_P256 BN_P256
599 59 Andreas Steffen
Feb 19 10:52:02 raspi5 charon-systemd[21165]: TPM 2.0 via TSS2 v2 available
600 59 Andreas Steffen
Feb 19 10:52:02 raspi5 charon-systemd[21165]: loaded certificate from TPM NV index 0x01800004
601 59 Andreas Steffen
</pre>
602 1 Andreas Steffen
603 1 Andreas Steffen
The two connection definitions are received by the *charon-systemd* daemon from the *swanctl* command line tool via the VICI interface
604 1 Andreas Steffen
<pre>
605 44 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'
606 59 Andreas Steffen
Feb 19 10:52:02 raspi5 charon-systemd[21165]: added vici connection: rsa
607 59 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'
608 59 Andreas Steffen
Feb 19 10:52:02 raspi5 charon-systemd[21165]: added vici connection: ecc
609 59 Andreas Steffen
</pre>
610 44 Andreas Steffen
611 44 Andreas Steffen
The *swanctl* command line tool reports its actions
612 44 Andreas Steffen
<pre>
613 44 Andreas Steffen
Feb 19 10:52:02 raspi5 swanctl[21183]: loaded certificate from '/etc/swanctl/x509/raspi5_ak_rsa_Cert.der'
614 44 Andreas Steffen
Feb 19 10:52:02 raspi5 swanctl[21183]: loaded certificate from '/etc/swanctl/x509ca/demoCaCert.pem'
615 44 Andreas Steffen
Feb 19 10:52:02 raspi5 swanctl[21183]: loaded key token_ak_rsa from token [keyid: f49e857dde4e67f5fb870398673f207cf33f2b66]
616 44 Andreas Steffen
Feb 19 10:52:02 raspi5 swanctl[21183]: loaded key token_ak_ecc from token [keyid: c70e63f87f6ff65500e5057f5a3e6b6ce7d2d513]
617 31 Andreas Steffen
Feb 19 10:52:02 raspi5 swanctl[21183]: loaded connection 'rsa'
618 31 Andreas Steffen
Feb 19 10:52:02 raspi5 swanctl[21183]: loaded connection 'ecc'
619 31 Andreas Steffen
Feb 19 10:52:02 raspi5 swanctl[21183]: successfully loaded 2 connections, 0 unloaded
620 44 Andreas Steffen
</pre>
621 31 Andreas Steffen
622 31 Andreas Steffen
<pre>
623 31 Andreas Steffen
Feb 19 10:52:02 raspi5 systemd[1]: Started strongSwan IPsec IKEv1/IKEv2 daemon using swanctl.
624 31 Andreas Steffen
</pre>
625 31 Andreas Steffen
626 31 Andreas Steffen
The following *swanctl* command shows the two loaded connections
627 31 Andreas Steffen
<pre>
628 31 Andreas Steffen
swanctl --list-conns
629 31 Andreas Steffen
</pre>
630 31 Andreas Steffen
631 31 Andreas Steffen
<pre>
632 31 Andreas Steffen
rsa: IKEv2, reauthentication every 10800s, no rekeying
633 31 Andreas Steffen
  local:  10.10.0.105
634 31 Andreas Steffen
  remote: 10.10.0.104
635 31 Andreas Steffen
  local public key authentication:
636 31 Andreas Steffen
    id: C=US, O=TNC Demo, OU=AIK RSA, CN=raspi5.example.com
637 31 Andreas Steffen
    certs: C=US, O=TNC Demo, OU=AIK RSA, CN=raspi5.example.com
638 31 Andreas Steffen
  remote public key authentication:
639 31 Andreas Steffen
    id: raspi4.example.com
640 31 Andreas Steffen
  rsa: TRANSPORT, rekeying every 3600s or 300000000 bytes or 500000 packets
641 31 Andreas Steffen
    local:  dynamic
642 31 Andreas Steffen
    remote: dynamic
643 31 Andreas Steffen
</pre>
644 31 Andreas Steffen
645 31 Andreas Steffen
<pre>
646 31 Andreas Steffen
ecc: IKEv2, reauthentication every 10800s, no rekeying
647 31 Andreas Steffen
  local:  10.10.0.105
648 31 Andreas Steffen
  remote: 10.10.0.104
649 31 Andreas Steffen
  local public key authentication:
650 31 Andreas Steffen
    id: C=US, O=TNC Demo, OU=AIK ECC, CN=raspi5.example.com
651 31 Andreas Steffen
    certs: C=US, O=TNC Demo, OU=AIK ECC, CN=raspi5.example.com
652 31 Andreas Steffen
  remote public key authentication:
653 32 Andreas Steffen
    id: raspi4.example.com
654 31 Andreas Steffen
  ecc: TRANSPORT, rekeying every 3600s or 300000000 bytes or 500000 packets
655 31 Andreas Steffen
    local:  dynamic
656 31 Andreas Steffen
    remote: dynamic
657 31 Andreas Steffen
</pre>
658 31 Andreas Steffen
659 31 Andreas Steffen
The loaded certificates can also be displayed
660 31 Andreas Steffen
<pre>
661 31 Andreas Steffen
swanctl --list-certs
662 31 Andreas Steffen
</pre>
663 31 Andreas Steffen
664 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)
665 31 Andreas Steffen
<pre>
666 31 Andreas Steffen
List of X.509 End Entity Certificates
667 31 Andreas Steffen
668 31 Andreas Steffen
  subject:  "C=US, O=TNC Demo, OU=AIK RSA, CN=raspi5.example.com"
669 31 Andreas Steffen
  issuer:   "C=US, O=TNC Demo, CN=TNC Demo CA"
670 31 Andreas Steffen
  validity:  not before Feb 19 09:33:43 2017, ok
671 31 Andreas Steffen
             not after  Aug 29 10:33:43 2026, ok (expires in 3477 days)
672 31 Andreas Steffen
  serial:    11:57:33:3e:2a:8e:8a:32
673 31 Andreas Steffen
  altNames:  raspi5.example.com
674 31 Andreas Steffen
  authkeyId: 21:02:7e:2d:de:8b:77:48:75:de:56:2f:b5:d4:62:ec:c3:09:15:f2
675 31 Andreas Steffen
  subjkeyId: f4:9e:85:7d:de:4e:67:f5:fb:87:03:98:67:3f:20:7c:f3:3f:2b:66
676 31 Andreas Steffen
  pubkey:    RSA 2048 bits, has private key
677 31 Andreas Steffen
  keyid:     71:21:f5:d4:7e:59:4a:88:16:ca:57:85:98:3d:36:a7:b1:d5:75:fa
678 31 Andreas Steffen
  subjkey:   f4:9e:85:7d:de:4e:67:f5:fb:87:03:98:67:3f:20:7c:f3:3f:2b:66
679 31 Andreas Steffen
680 31 Andreas Steffen
  subject:  "C=US, O=TNC Demo, OU=AIK ECC, CN=raspi5.example.com"
681 31 Andreas Steffen
  issuer:   "C=US, O=TNC Demo, CN=TNC Demo CA"
682 31 Andreas Steffen
  validity:  not before Feb 17 23:17:19 2017, ok
683 31 Andreas Steffen
             not after  Aug 30 00:17:19 2026, ok (expires in 3478 days)
684 31 Andreas Steffen
  serial:    52:9d:3e:42:6f:71:63:3d
685 31 Andreas Steffen
  altNames:  raspi5.example.com
686 31 Andreas Steffen
  authkeyId: 21:02:7e:2d:de:8b:77:48:75:de:56:2f:b5:d4:62:ec:c3:09:15:f2
687 31 Andreas Steffen
  subjkeyId: c7:0e:63:f8:7f:6f:f6:55:00:e5:05:7f:5a:3e:6b:6c:e7:d2:d5:13
688 31 Andreas Steffen
  pubkey:    ECDSA 256 bits, has private key
689 31 Andreas Steffen
  keyid:     71:49:7c:42:41:e7:c6:81:bc:31:73:f0:0f:7e:4a:e1:2d:53:00:38
690 31 Andreas Steffen
  subjkey:   c7:0e:63:f8:7f:6f:f6:55:00:e5:05:7f:5a:3e:6b:6c:e7:d2:d5:13
691 31 Andreas Steffen
</pre>
692 31 Andreas Steffen
693 31 Andreas Steffen
<pre>
694 1 Andreas Steffen
List of X.509 CA Certificates
695 32 Andreas Steffen
696 32 Andreas Steffen
  subject:  "C=US, O=TNC Demo, CN=TNC Demo CA"
697 43 Andreas Steffen
  issuer:   "C=US, O=TNC Demo, CN=TNC Demo CA"
698 32 Andreas Steffen
  validity:  not before Aug 31 10:29:27 2016, ok
699 38 Andreas Steffen
             not after  Aug 31 10:29:27 2026, ok (expires in 3479 days)
700 32 Andreas Steffen
  serial:    02:c8:85:e1:ef:fa:8f:20
701 32 Andreas Steffen
  flags:     CA CRLSign self-signed 
702 32 Andreas Steffen
  subjkeyId: 21:02:7e:2d:de:8b:77:48:75:de:56:2f:b5:d4:62:ec:c3:09:15:f2
703 32 Andreas Steffen
  pubkey:    ECDSA 256 bits
704 32 Andreas Steffen
  keyid:     a1:b5:e0:29:d0:4c:a7:62:bd:ca:a3:b4:af:18:42:2c:4a:01:55:9a
705 32 Andreas Steffen
  subjkey:   21:02:7e:2d:de:8b:77:48:75:de:56:2f:b5:d4:62:ec:c3:09:15:f2
706 32 Andreas Steffen
</pre>
707 32 Andreas Steffen
708 32 Andreas Steffen
h2. IKEv2 Authentication with RSA AIK Certificate
709 32 Andreas Steffen
710 32 Andreas Steffen
With the following *swanctl* command the "rsa" connection is established
711 32 Andreas Steffen
<pre>
712 32 Andreas Steffen
swanctl --initiate --child rsa
713 45 Andreas Steffen
</pre>
714 32 Andreas Steffen
715 40 Andreas Steffen
<pre>
716 40 Andreas Steffen
Feb 19 10:52:21 raspi5 charon-systemd[21165]: vici initiate 'rsa'
717 32 Andreas Steffen
Feb 19 10:52:21 raspi5 charon-systemd[21165]: initiating IKE_SA rsa[1] to 10.10.0.104
718 32 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 ]
719 32 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)
720 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)
721 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 ]
722 32 Andreas Steffen
Feb 19 10:52:21 raspi5 charon-systemd[21165]: received strongSwan vendor ID
723 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"
724 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"
725 32 Andreas Steffen
</pre>
726 32 Andreas Steffen
727 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.
728 32 Andreas Steffen
<pre>
729 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
730 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"
731 32 Andreas Steffen
</pre>
732 32 Andreas Steffen
<pre>
733 32 Andreas Steffen
Feb 19 10:52:24 raspi5 charon-systemd[21165]: establishing CHILD_SA rsa
734 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) ]
735 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)
736 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)
737 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) ]
738 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"
739 32 Andreas Steffen
Feb 19 10:52:24 raspi5 charon-systemd[21165]:   using certificate "C=US, O=TNC Demo, CN=raspi4.example.com"
740 38 Andreas Steffen
Feb 19 10:52:24 raspi5 charon-systemd[21165]:   using trusted ca certificate "C=US, O=TNC Demo, CN=TNC Demo CA"
741 32 Andreas Steffen
Feb 19 10:52:24 raspi5 charon-systemd[21165]:   reached self-signed root ca with a path length of 0
742 32 Andreas Steffen
Feb 19 10:52:24 raspi5 charon-systemd[21165]: authentication of 'raspi4.example.com' with ECDSA_WITH_SHA256_DER successful
743 32 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]
744 32 Andreas Steffen
Feb 19 10:52:24 raspi5 charon-systemd[21165]: scheduling reauthentication in 10507s
745 32 Andreas Steffen
Feb 19 10:52:24 raspi5 charon-systemd[21165]: maximum IKE_SA lifetime 11587s
746 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
747 32 Andreas Steffen
Feb 19 10:52:24 raspi5 charon-systemd[21165]: received AUTH_LIFETIME of 10103s, scheduling reauthentication in 9023s
748 32 Andreas Steffen
Feb 19 10:52:24 raspi5 charon-systemd[21165]: peer supports MOBIKE
749 32 Andreas Steffen
</pre>
750 32 Andreas Steffen
751 32 Andreas Steffen
The following *swanctl* command shows the established IPsec connection
752 32 Andreas Steffen
<pre>
753 32 Andreas Steffen
 swanctl --list-sas
754 32 Andreas Steffen
</pre>
755 32 Andreas Steffen
<pre>
756 32 Andreas Steffen
rsa: #1, ESTABLISHED, IKEv2, 7ba3b4d06c051ecb_i* 14e1769a8aeb7f28_r
757 32 Andreas Steffen
  local  'C=US, O=TNC Demo, OU=AIK RSA, CN=raspi5.example.com' @ 10.10.0.105[4500]
758 38 Andreas Steffen
  remote 'raspi4.example.com' @ 10.10.0.104[4500]
759 33 Andreas Steffen
  AES_CBC-128/HMAC_SHA2_256_128/PRF_HMAC_SHA2_256/CURVE_25519
760 33 Andreas Steffen
  established 252s ago, reauth in 8771s
761 33 Andreas Steffen
  rsa: #1, reqid 1, INSTALLED, TRANSPORT, ESP:AES_CBC-128/HMAC_SHA2_256_128
762 33 Andreas Steffen
    installed 252s ago, rekeying in 3258s, expires in 3708s
763 33 Andreas Steffen
    in  c23deb9d,    640 bytes,    10 packets,     3s ago
764 33 Andreas Steffen
    out ce48d08e,    640 bytes,    10 packets,     3s ago
765 33 Andreas Steffen
    local  10.10.0.105/32
766 33 Andreas Steffen
    remote 10.10.0.104/32
767 33 Andreas Steffen
</pre>
768 33 Andreas Steffen
769 33 Andreas Steffen
With this *swanctl* command the "rsa" connection is terminated
770 33 Andreas Steffen
<pre>
771 33 Andreas Steffen
swanctl --terminate --ike rsa
772 33 Andreas Steffen
</pre>
773 33 Andreas Steffen
774 43 Andreas Steffen
<pre>
775 32 Andreas Steffen
Feb 19 10:59:16 raspi5 charon-systemd[21165]: vici terminate IKE_SA 'rsa'
776 38 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]
777 32 Andreas Steffen
Feb 19 10:59:16 raspi5 charon-systemd[21165]: sending DELETE for IKE_SA rsa[1]
778 32 Andreas Steffen
Feb 19 10:59:16 raspi5 charon-systemd[21165]: generating INFORMATIONAL request 2 [ D ]
779 33 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)
780 33 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)
781 33 Andreas Steffen
Feb 19 10:59:16 raspi5 charon-systemd[21165]: parsed INFORMATIONAL response 2 [ ]
782 33 Andreas Steffen
Feb 19 10:59:16 raspi5 charon-systemd[21165]: IKE_SA deleted
783 33 Andreas Steffen
</pre>
784 33 Andreas Steffen
785 33 Andreas Steffen
h2. IKEv2 Authentication with ECC AIK Certificate
786 33 Andreas Steffen
787 33 Andreas Steffen
Next we initiate the "ecc" connection
788 33 Andreas Steffen
<pre>
789 33 Andreas Steffen
swanctl --initiate --child ecc
790 45 Andreas Steffen
</pre>
791 33 Andreas Steffen
792 40 Andreas Steffen
<pre>
793 40 Andreas Steffen
Feb 19 11:00:32 raspi5 charon-systemd[21165]: vici initiate 'ecc'
794 33 Andreas Steffen
Feb 19 11:00:32 raspi5 charon-systemd[21165]: initiating IKE_SA ecc[2] to 10.10.0.104
795 33 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 ]
796 33 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)
797 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)
798 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 ]
799 33 Andreas Steffen
Feb 19 11:00:32 raspi5 charon-systemd[21165]: received strongSwan vendor ID
800 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"
801 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"
802 33 Andreas Steffen
</pre>
803 33 Andreas Steffen
804 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.
805 33 Andreas Steffen
<pre>
806 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
807 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"
808 33 Andreas Steffen
</pre>
809 33 Andreas Steffen
<pre>
810 33 Andreas Steffen
Feb 19 11:00:34 raspi5 charon-systemd[21165]: establishing CHILD_SA ecc
811 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) ]
812 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)
813 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)
814 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) ]
815 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"
816 33 Andreas Steffen
Feb 19 11:00:34 raspi5 charon-systemd[21165]:   using certificate "C=US, O=TNC Demo, CN=raspi4.example.com"
817 39 Andreas Steffen
Feb 19 11:00:34 raspi5 charon-systemd[21165]:   using trusted ca certificate "C=US, O=TNC Demo, CN=TNC Demo CA"
818 33 Andreas Steffen
Feb 19 11:00:34 raspi5 charon-systemd[21165]:   reached self-signed root ca with a path length of 0
819 33 Andreas Steffen
Feb 19 11:00:34 raspi5 charon-systemd[21165]: authentication of 'raspi4.example.com' with ECDSA_WITH_SHA256_DER successful
820 33 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]
821 33 Andreas Steffen
Feb 19 11:00:34 raspi5 charon-systemd[21165]: scheduling reauthentication in 10180s
822 33 Andreas Steffen
Feb 19 11:00:34 raspi5 charon-systemd[21165]: maximum IKE_SA lifetime 11260s
823 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
824 33 Andreas Steffen
Feb 19 11:00:34 raspi5 charon-systemd[21165]: received AUTH_LIFETIME of 9880s, scheduling reauthentication in 8800s
825 33 Andreas Steffen
Feb 19 11:00:34 raspi5 charon-systemd[21165]: peer supports MOBIKE
826 33 Andreas Steffen
</pre>
827 33 Andreas Steffen
828 33 Andreas Steffen
The establed IKE and CHILD SAs are displayed
829 33 Andreas Steffen
<pre>
830 33 Andreas Steffen
 swanctl --list-sas
831 1 Andreas Steffen
</pre>
832 1 Andreas Steffen
<pre>
833 34 Andreas Steffen
ecc: #2, ESTABLISHED, IKEv2, b7f2652777b0996a_i* 12282b5964ff0658_r
834 34 Andreas Steffen
  local  'C=US, O=TNC Demo, OU=AIK ECC, CN=raspi5.example.com' @ 10.10.0.105[4500]
835 39 Andreas Steffen
  remote 'raspi4.example.com' @ 10.10.0.104[4500]
836 34 Andreas Steffen
  AES_CBC-128/HMAC_SHA2_256_128/PRF_HMAC_SHA2_256/CURVE_25519
837 34 Andreas Steffen
  established 126s ago, reauth in 8674s
838 34 Andreas Steffen
  ecc: #2, reqid 2, INSTALLED, TRANSPORT, ESP:AES_CBC-128/HMAC_SHA2_256_128
839 34 Andreas Steffen
    installed 126s ago, rekeying in 3252s, expires in 3834s
840 34 Andreas Steffen
    in  c2c16cd0,    320 bytes,     5 packets,     2s ago
841 34 Andreas Steffen
    out c47ea6f6,    320 bytes,     5 packets,     2s ago
842 34 Andreas Steffen
    local  10.10.0.105/32
843 34 Andreas Steffen
    remote 10.10.0.104/32
844 34 Andreas Steffen
</pre>
845 34 Andreas Steffen
846 34 Andreas Steffen
The IKE and CHILD SAs are terminated
847 34 Andreas Steffen
<pre>
848 34 Andreas Steffen
swanctl --terminate --ike ecc
849 34 Andreas Steffen
</pre>
850 34 Andreas Steffen
851 34 Andreas Steffen
<pre>
852 34 Andreas Steffen
Feb 19 11:04:32 raspi5 charon-systemd[21165]: vici terminate IKE_SA 'ecc'
853 39 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]
854 34 Andreas Steffen
Feb 19 11:04:32 raspi5 charon-systemd[21165]: sending DELETE for IKE_SA ecc[2]
855 34 Andreas Steffen
Feb 19 11:04:32 raspi5 charon-systemd[21165]: generating INFORMATIONAL request 2 [ D ]
856 34 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)
857 1 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)
858 1 Andreas Steffen
Feb 19 11:04:32 raspi5 charon-systemd[21165]: parsed INFORMATIONAL response 2 [ ]
859 1 Andreas Steffen
Feb 19 11:04:32 raspi5 charon-systemd[21165]: IKE_SA deleted
860 1 Andreas Steffen
</pre>