Project

General

Profile

Trusted Platform Module 2.0 » History » Version 31

Andreas Steffen, 19.02.2017 10:43

1 17 Andreas Steffen
h1. Trusted Platform Module 2.0
2 1 Andreas Steffen
3 6 Andreas Steffen
{{>toc}}
4 6 Andreas Steffen
5 2 Andreas Steffen
h2. Connect to a TPM 2.0 device
6 2 Andreas Steffen
7 5 Andreas Steffen
In order to connect to a TPM 2.0 hardware or firmware device, the TSS2 software stack developed by Intel is needed. Because the official Ubuntu *tpm2-tss* package is rather outdated (e.g. since version 0.98 the TCTI interface to the TPM 2.0 resource manager has changed several times), strongSwan is currently based on a recent version directly drawn from the TPM2-TSS git repository https://github.com/01org/TPM2.0-TSS. Avoid any TCTI interface incompatibilities by fetching the latest *tpm2-tools* version from https://github.com/01org/tpm2.0-tools as well.
8 1 Andreas Steffen
9 11 Andreas Steffen
Build and install both the *tpm2-tss* stack and the *tpm2.0-tools*, start the *tpm2-resourcemgr* as a service in the background and try to connect to the TPM 2.0 by listing e.g. the contents of the SHA-1 bank of PCR registers
10 1 Andreas Steffen
11 7 Andreas Steffen
   
12 7 Andreas Steffen
 tpm2_listpcrs -g 0x0004
13 3 Andreas Steffen
14 18 Andreas Steffen
<pre>
15 18 Andreas Steffen
Bank/Algorithm: TPM_ALG_SHA1(0x0004)
16 3 Andreas Steffen
PCR_00: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
17 3 Andreas Steffen
PCR_01: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
18 3 Andreas Steffen
PCR_02: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
19 3 Andreas Steffen
PCR_03: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
20 3 Andreas Steffen
PCR_04: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
21 3 Andreas Steffen
PCR_05: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
22 3 Andreas Steffen
PCR_06: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
23 3 Andreas Steffen
PCR_07: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
24 3 Andreas Steffen
PCR_08: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
25 3 Andreas Steffen
PCR_09: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
26 3 Andreas Steffen
PCR_10: a9 45 e7 0f 42 a2 79 f0 78 ca d4 64 60 39 39 da 9d 6a d1 a5
27 3 Andreas Steffen
PCR_11: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
28 3 Andreas Steffen
PCR_12: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
29 3 Andreas Steffen
PCR_13: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
30 3 Andreas Steffen
PCR_14: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
31 3 Andreas Steffen
PCR_15: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
32 3 Andreas Steffen
PCR_16: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
33 3 Andreas Steffen
PCR_17: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
34 3 Andreas Steffen
PCR_18: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
35 3 Andreas Steffen
PCR_19: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
36 3 Andreas Steffen
PCR_20: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
37 1 Andreas Steffen
PCR_21: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
38 1 Andreas Steffen
PCR_22: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
39 1 Andreas Steffen
PCR_23: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
40 18 Andreas Steffen
</pre>
41 1 Andreas Steffen
42 7 Andreas Steffen
A manual showing all *tpm2-tools* functions with their arguments can be found "here":https://github.com/01org/tpm2.0-tools/blob/master/manual.
43 7 Andreas Steffen
44 7 Andreas Steffen
h2. TPM 2.0 Algorithm IDs
45 7 Andreas Steffen
46 8 Andreas Steffen
h3. Hash Algorithms
47 8 Andreas Steffen
48 7 Andreas Steffen
|0x0004 |SHA-1     |
49 7 Andreas Steffen
|0x000B |SHA-2_256 |
50 7 Andreas Steffen
|0x000C |SHA-2_384 |
51 1 Andreas Steffen
|0x000D |SHA-2_512 |
52 7 Andreas Steffen
53 28 Andreas Steffen
Currently available TPM 2.0 devices like the Infineon *Optiga SLB 9670 VQ2.0* hardware TPM or Intel's *PTT* firmware TPM integrated into the Management Engine starting with the 4th generation (Haswell) of the *Core* processor family, support the *SHA-1* and *SHA-2_256* algorithms.
54 1 Andreas Steffen
55 8 Andreas Steffen
h3. Public Key Types
56 8 Andreas Steffen
57 8 Andreas Steffen
|0x0001 |RSA |
58 8 Andreas Steffen
|0x0023 |ECC |
59 1 Andreas Steffen
60 22 Andreas Steffen
Currently RSA keys have a modulus size of 2048 bits and ECC keys are based on the 256 bit NIST curve.
61 22 Andreas Steffen
62 11 Andreas Steffen
h3. Signature Schemes
63 11 Andreas Steffen
64 11 Andreas Steffen
|0x0014 |RSASSA |
65 11 Andreas Steffen
|0x0016 |RSAPSS |
66 9 Andreas Steffen
|0x0018 |ECDSA  |
67 9 Andreas Steffen
                    
68 20 Andreas Steffen
h2. Derive a Persistent RSA Endorsement Key
69 1 Andreas Steffen
70 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
71 11 Andreas Steffen
72 24 Andreas Steffen
 tpm2_getpubek -H 0x81010001 -g 0x0001 -f ek_rsa.pub
73 9 Andreas Steffen
74 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
75 9 Andreas Steffen
76 12 Andreas Steffen
 pki --pub --keyid 81010001 --outform pem > ek_rsa_pub.pem
77 9 Andreas Steffen
78 9 Andreas Steffen
The fingerprint of the RSA EK public key can be displayed with the command
79 9 Andreas Steffen
80 9 Andreas Steffen
 pki --print --type pub --in ek_rsa_pub.pem
81 9 Andreas Steffen
  pubkey:    RSA 2048 bits
82 9 Andreas Steffen
  keyid:     d1:f1:49:84:36:44:e6:8c:d2:a6:69:ee:fd:b5:7d:56:2f:39:ff:58
83 1 Andreas Steffen
  subjkey:   c1:1b:8e:f1:c7:f8:8a:1e:9a:dd:7e:82:2f:7a:a3:f5:c0:e2:4d:7d
84 1 Andreas Steffen
85 20 Andreas Steffen
h2. Generate a Persistent RSA Attestation Key
86 11 Andreas Steffen
87 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
88 1 Andreas Steffen
89 15 Andreas Steffen
 tpm2_getpubak -E 0x81010001 -g 0x0001 -D 0x000B -s 0x0014 -k 0x81010002 -f ak_rsa2.pub -n ak_rsa2.name
90 12 Andreas Steffen
91 12 Andreas Steffen
The AK public key can be exported in PKCS#1 format from the TPM using the *pki* tool
92 12 Andreas Steffen
93 12 Andreas Steffen
 pki --pub --keyid 81010002 --outform pem > ak_rsa_pub.pem
94 12 Andreas Steffen
95 12 Andreas Steffen
The fingerprint of the RSA AK public key can be displayed with the command
96 12 Andreas Steffen
97 12 Andreas Steffen
 pki --print --type pub --in ak_rsa_pub.pem
98 12 Andreas Steffen
  pubkey:    RSA 2048 bits
99 12 Andreas Steffen
  keyid:     71:21:f5:d4:7e:59:4a:88:16:ca:57:85:98:3d:36:a7:b1:d5:75:fa
100 12 Andreas Steffen
  subjkey:   f4:9e:85:7d:de:4e:67:f5:fb:87:03:98:67:3f:20:7c:f3:3f:2b:66
101 11 Andreas Steffen
102 20 Andreas Steffen
h2. Derive a Persistent ECC Endorsement Key
103 1 Andreas Steffen
104 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:
105 1 Andreas Steffen
106 24 Andreas Steffen
 tpm2_getpubek -H 0x81010003 -g 0x0023 -f ek_ecc.pub
107 9 Andreas Steffen
108 11 Andreas Steffen
The EK public key can be exported in PKCS#1 format from the TPM using the *pki* tool:
109 11 Andreas Steffen
110 11 Andreas Steffen
  pki --pub --keyid 81010003 > ek_ecc_pub.der
111 9 Andreas Steffen
112 9 Andreas Steffen
The fingerprint of the ECC EK public key can be displayed with the command
113 9 Andreas Steffen
114 10 Andreas Steffen
 pki --print --type pub --in ek_ecc_pub.der
115 9 Andreas Steffen
  pubkey:    ECDSA 256 bits
116 9 Andreas Steffen
  keyid:     7f:39:ca:e6:83:9b:a9:06:97:40:27:6a:e1:bf:8f:f5:9f:d3:a5:31
117 9 Andreas Steffen
  subjkey:   8b:43:4d:5e:5e:7b:ff:c2:54:4d:ef:88:cb:0c:7c:47:75:28:4d:09
118 9 Andreas Steffen
119 20 Andreas Steffen
h2. Generate a Persistent ECC Attestation Key
120 13 Andreas Steffen
121 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
122 13 Andreas Steffen
123 15 Andreas Steffen
 tpm2_getpubak -E 0x81010003 -g 0x0023 -D 0x000B -s 0x0018 -k 0x81010004 -f ak_ecc4.pub -n ak_ecc4.name
124 13 Andreas Steffen
125 13 Andreas Steffen
The AK public key can be exported in PKCS#1 format from the TPM using the *pki* tool
126 13 Andreas Steffen
127 14 Andreas Steffen
 pki --pub --keyid 81010004 > ak_ecc_pub.der
128 13 Andreas Steffen
129 13 Andreas Steffen
The fingerprint of the RSA AK public key can be displayed with the command
130 13 Andreas Steffen
131 14 Andreas Steffen
 pki --print --type pub --in ak_ecc_pub.der
132 1 Andreas Steffen
  pubkey:    ECDSA 256 bits
133 1 Andreas Steffen
  keyid:     71:49:7c:42:41:e7:c6:81:bc:31:73:f0:0f:7e:4a:e1:2d:53:00:38
134 1 Andreas Steffen
  subjkey:   c7:0e:63:f8:7f:6f:f6:55:00:e5:05:7f:5a:3e:6b:6c:e7:d2:d5:13
135 15 Andreas Steffen
136 20 Andreas Steffen
h2. Generate Another ECC Attestation Key
137 15 Andreas Steffen
138 15 Andreas Steffen
Multiple AK keys bound to a common EK key can be generated
139 15 Andreas Steffen
140 15 Andreas Steffen
 tpm2_getpubak -E 0x81010003 -g 0x0023 -D 0x000B -s 0x0018 -k 0x81010005 -f ak_ecc5.pub -n ak_ecc5.name
141 15 Andreas Steffen
142 15 Andreas Steffen
The AK public key can be exported in PKCS#1 format from the TPM using the *pki* tool
143 15 Andreas Steffen
144 15 Andreas Steffen
 pki --pub --keyid 81010005 > ak_ecc5_pub.der
145 15 Andreas Steffen
146 15 Andreas Steffen
The fingerprint of the second ECC AK public key can be displayed with the command
147 15 Andreas Steffen
148 15 Andreas Steffen
 pki --print --type pub --in ak_ecc5_pub.der
149 15 Andreas Steffen
  pubkey:    ECDSA 256 bits
150 15 Andreas Steffen
  keyid:     c4:b4:9c:95:27:9e:ce:81:2f:98:42:c8:1b:f0:54:ff:d4:d1:24:34
151 15 Andreas Steffen
  subjkey:   cf:44:f4:f7:9d:97:09:ad:b1:09:3a:8e:6f:23:eb:9f:2c:35:94:c9
152 15 Andreas Steffen
153 19 Andreas Steffen
h2. Remove a Persistent Key Object
154 15 Andreas Steffen
155 15 Andreas Steffen
Since the non-volatile memory of the TPM is limited any persistent key object can be removed to free storage space.
156 15 Andreas Steffen
The following tpm2-tools command removes the ECC AK key with persistent handle 0x81010005
157 15 Andreas Steffen
158 1 Andreas Steffen
 tpm2_evictcontrol -A o -H 0x81010005 -S 0x81010005
159 18 Andreas Steffen
160 18 Andreas Steffen
h2. List Persistent Objects
161 18 Andreas Steffen
162 18 Andreas Steffen
The following tpm2-tools command lists all persistent objects stored by the TPM in non-volatile memory
163 18 Andreas Steffen
164 18 Andreas Steffen
 tpm2_listpersistent
165 18 Andreas Steffen
166 18 Andreas Steffen
<pre>
167 18 Andreas Steffen
6 persistent objects defined.
168 18 Andreas Steffen
169 18 Andreas Steffen
0. Persistent handle: 0x81000001
170 18 Andreas Steffen
{
171 18 Andreas Steffen
        Type: 0x23
172 18 Andreas Steffen
        Hash algorithm(nameAlg): 0xb
173 18 Andreas Steffen
        Attributes: 0x30072
174 18 Andreas Steffen
}
175 18 Andreas Steffen
1. Persistent handle: 0x81000002
176 18 Andreas Steffen
{
177 18 Andreas Steffen
        Type: 0x23
178 18 Andreas Steffen
        Hash algorithm(nameAlg): 0xb
179 18 Andreas Steffen
        Attributes: 0x60072
180 18 Andreas Steffen
}
181 18 Andreas Steffen
2. Persistent handle: 0x81010001
182 18 Andreas Steffen
{
183 18 Andreas Steffen
        Type: 0x1
184 18 Andreas Steffen
        Hash algorithm(nameAlg): 0xb
185 18 Andreas Steffen
        Attributes: 0x300b2
186 18 Andreas Steffen
}
187 18 Andreas Steffen
3. Persistent handle: 0x81010002
188 18 Andreas Steffen
{
189 18 Andreas Steffen
        Type: 0x1
190 18 Andreas Steffen
        Hash algorithm(nameAlg): 0xb
191 18 Andreas Steffen
        Attributes: 0x50072
192 18 Andreas Steffen
}
193 18 Andreas Steffen
4. Persistent handle: 0x81010003
194 18 Andreas Steffen
{
195 18 Andreas Steffen
        Type: 0x23
196 18 Andreas Steffen
        Hash algorithm(nameAlg): 0xb
197 18 Andreas Steffen
        Attributes: 0x300b2
198 18 Andreas Steffen
}
199 18 Andreas Steffen
5. Persistent handle: 0x81010004
200 18 Andreas Steffen
{
201 18 Andreas Steffen
        Type: 0x23
202 18 Andreas Steffen
        Hash algorithm(nameAlg): 0xb
203 18 Andreas Steffen
        Attributes: 0x50072
204 18 Andreas Steffen
}
205 18 Andreas Steffen
</pre>
206 13 Andreas Steffen
207 30 Andreas Steffen
h2. Configure TPM Private Key Access via VICI Interface
208 1 Andreas Steffen
209 23 Andreas Steffen
Configuration of TPM private key access as tokens in the secrets section of *swanctl.conf*
210 1 Andreas Steffen
211 7 Andreas Steffen
 secrets {
212 1 Andreas Steffen
    token_ak_rsa {
213 7 Andreas Steffen
       handle = 81010002
214 1 Andreas Steffen
    }
215 1 Andreas Steffen
    token_ak_ecc {
216 7 Andreas Steffen
       handle = 81010004
217 1 Andreas Steffen
    }
218 1 Andreas Steffen
}
219 30 Andreas Steffen
220 30 Andreas Steffen
h2. Define IPsec Connection with RSA AK Client Key
221 30 Andreas Steffen
222 30 Andreas Steffen
This connection configuration in *swanctl.conf* uses the RSA AK certificate for client authentication
223 30 Andreas Steffen
<pre>
224 30 Andreas Steffen
connections {
225 30 Andreas Steffen
   rsa {
226 30 Andreas Steffen
      local_addrs  = 10.10.0.105
227 30 Andreas Steffen
      remote_addrs = 10.10.0.104
228 30 Andreas Steffen
229 30 Andreas Steffen
      local {
230 30 Andreas Steffen
         auth = pubkey 
231 30 Andreas Steffen
         certs = raspi5_ak_rsa_Cert.der
232 30 Andreas Steffen
      }
233 30 Andreas Steffen
      remote {
234 30 Andreas Steffen
         auth = pubkey 
235 30 Andreas Steffen
         id = raspi4.example.com
236 30 Andreas Steffen
      }
237 30 Andreas Steffen
      children {
238 30 Andreas Steffen
         rsa {
239 30 Andreas Steffen
            mode = transport
240 30 Andreas Steffen
            esp_proposals = aes128-sha256-curve25519
241 30 Andreas Steffen
         }
242 30 Andreas Steffen
      }
243 30 Andreas Steffen
      version = 2
244 30 Andreas Steffen
      proposals = aes128-sha256-curve25519
245 30 Andreas Steffen
   }
246 30 Andreas Steffen
}
247 30 Andreas Steffen
</pre>
248 30 Andreas Steffen
249 30 Andreas Steffen
h2. Define IPsec Connection with ECC AK Client Key
250 30 Andreas Steffen
251 30 Andreas Steffen
This connection configuration in *swanctl.conf* uses the ECC AK certificate for client authentication
252 30 Andreas Steffen
<pre>
253 30 Andreas Steffen
connections {
254 30 Andreas Steffen
   ecc {
255 30 Andreas Steffen
      local_addrs  = 10.10.0.105
256 30 Andreas Steffen
      remote_addrs = 10.10.0.104
257 30 Andreas Steffen
258 30 Andreas Steffen
      local {
259 30 Andreas Steffen
         auth = pubkey
260 30 Andreas Steffen
         certs = raspi5_ak_ecc_Cert.der
261 30 Andreas Steffen
      }
262 30 Andreas Steffen
      remote {
263 30 Andreas Steffen
         auth = pubkey
264 30 Andreas Steffen
         id = raspi4.example.com
265 30 Andreas Steffen
      }
266 30 Andreas Steffen
      children {
267 30 Andreas Steffen
         ecc {
268 30 Andreas Steffen
            mode = transport
269 30 Andreas Steffen
            esp_proposals = aes128-sha256-curve25519
270 30 Andreas Steffen
         }
271 30 Andreas Steffen
      }
272 30 Andreas Steffen
      version = 2
273 30 Andreas Steffen
      proposals = aes128-sha256-curve25519
274 30 Andreas Steffen
   }
275 30 Andreas Steffen
}
276 30 Andreas Steffen
</pre>
277 29 Andreas Steffen
278 29 Andreas Steffen
h2. Starting the strongSwan Daemon
279 29 Andreas Steffen
280 29 Andreas Steffen
<pre>
281 29 Andreas Steffen
systemctl start strongswan-swanctl
282 29 Andreas Steffen
</pre>
283 29 Andreas Steffen
284 29 Andreas Steffen
<pre>
285 29 Andreas Steffen
Feb 19 09:35:14 raspi5 systemd[1]: Starting strongSwan IPsec IKEv1/IKEv2 daemon using swanctl...
286 29 Andreas Steffen
</pre>
287 29 Andreas Steffen
288 29 Andreas Steffen
The RSA AK private key is attached via the TPM 2.0 resource manager
289 29 Andreas Steffen
<pre>
290 29 Andreas Steffen
Feb 19 09:35:14 raspi5 resourcemgr[531]: Accept socket:  0xa
291 29 Andreas Steffen
Feb 19 09:35:14 raspi5 resourcemgr[531]: Resource Manager Other CMD Server accepted client
292 29 Andreas Steffen
Feb 19 09:35:14 raspi5 resourcemgr[531]: Accept socket:  0xb
293 29 Andreas Steffen
Feb 19 09:35:14 raspi5 resourcemgr[531]: Resource Manager TPM CMD Server accepted client
294 29 Andreas Steffen
Feb 19 09:35:14 raspi5 charon-systemd[20831]: 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
295 29 Andreas Steffen
Feb 19 09:35:15 raspi5 charon-systemd[20831]: TPM 2.0 - ECC curves: NIST_P256 BN_P256
296 29 Andreas Steffen
Feb 19 09:35:15 raspi5 charon-systemd[20831]: TPM 2.0 via TSS2 available
297 29 Andreas Steffen
Feb 19 09:35:15 raspi5 charon-systemd[20831]: AIK signature algorithm is RSASSA with SHA256 hash
298 29 Andreas Steffen
</pre>
299 29 Andreas Steffen
300 29 Andreas Steffen
The ECC AK private key is attached via the TPM 2.0 resource manager
301 29 Andreas Steffen
<pre>
302 29 Andreas Steffen
Feb 19 09:35:15 raspi5 resourcemgr[531]: Accept socket:  0x6
303 29 Andreas Steffen
Feb 19 09:35:15 raspi5 resourcemgr[531]: Resource Manager Other CMD Server accepted client
304 29 Andreas Steffen
Feb 19 09:35:15 raspi5 resourcemgr[531]: Accept socket:  0x7
305 29 Andreas Steffen
Feb 19 09:35:15 raspi5 resourcemgr[531]: Resource Manager TPM CMD Server accepted client
306 29 Andreas Steffen
Feb 19 09:35:15 raspi5 charon-systemd[20831]: 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
307 29 Andreas Steffen
Feb 19 09:35:15 raspi5 charon-systemd[20831]: TPM 2.0 - ECC curves: NIST_P256 BN_P256
308 29 Andreas Steffen
Feb 19 09:35:15 raspi5 charon-systemd[20831]: TPM 2.0 via TSS2 available
309 29 Andreas Steffen
Feb 19 09:35:15 raspi5 charon-systemd[20831]: AIK signature algorithm is ECDSA with SHA256 hash
310 29 Andreas Steffen
</pre>
311 29 Andreas Steffen
312 29 Andreas Steffen
The *swanctl* command line tool loads the RSA and ECC AK certificates as well as the demoCA root certificate and connects to the RSA and ECC private keys residing in the TPM
313 29 Andreas Steffen
<pre>
314 29 Andreas Steffen
Feb 19 09:35:15 raspi5 swanctl[20849]: loaded certificate from '/etc/swanctl/x509/raspi5_ak_rsa_Cert.der'
315 29 Andreas Steffen
Feb 19 09:35:15 raspi5 swanctl[20849]: loaded certificate from '/etc/swanctl/x509/raspi5_ak_ecc_Cert.der'
316 29 Andreas Steffen
Feb 19 09:35:15 raspi5 swanctl[20849]: loaded certificate from '/etc/swanctl/x509ca/demoCaCert.pem'
317 29 Andreas Steffen
Feb 19 09:35:15 raspi5 swanctl[20849]: loaded key token_ak_rsa from token [keyid: f49e857dde4e67f5fb870398673f207cf33f2b66]
318 29 Andreas Steffen
Feb 19 09:35:15 raspi5 swanctl[20849]: loaded key token_ak_ecc from token [keyid: c70e63f87f6ff65500e5057f5a3e6b6ce7d2d513]
319 29 Andreas Steffen
Feb 19 09:35:15 raspi5 swanctl[20849]: loaded connection 'rsa'
320 29 Andreas Steffen
Feb 19 09:35:15 raspi5 swanctl[20849]: loaded connection 'ecc'
321 29 Andreas Steffen
Feb 19 09:35:15 raspi5 swanctl[20849]: successfully loaded 2 connections, 0 unloaded
322 29 Andreas Steffen
</pre>
323 29 Andreas Steffen
324 29 Andreas Steffen
<pre>
325 29 Andreas Steffen
Feb 19 09:35:15 raspi5 systemd[1]: Started strongSwan IPsec IKEv1/IKEv2 daemon using swanctl.
326 29 Andreas Steffen
</pre>
327 31 Andreas Steffen
328 31 Andreas Steffen
The following *swanctl* command shows the two loaded connections
329 31 Andreas Steffen
<pre>
330 31 Andreas Steffen
swanctl --list-conns
331 31 Andreas Steffen
</pre>
332 31 Andreas Steffen
333 31 Andreas Steffen
<pre>
334 31 Andreas Steffen
rsa: IKEv2, reauthentication every 10800s, no rekeying
335 31 Andreas Steffen
  local:  10.10.0.105
336 31 Andreas Steffen
  remote: 10.10.0.104
337 31 Andreas Steffen
  local public key authentication:
338 31 Andreas Steffen
    id: C=US, O=TNC Demo, OU=AIK RSA, CN=raspi5.example.com
339 31 Andreas Steffen
    certs: C=US, O=TNC Demo, OU=AIK RSA, CN=raspi5.example.com
340 31 Andreas Steffen
  remote public key authentication:
341 31 Andreas Steffen
    id: raspi4.example.com
342 31 Andreas Steffen
  rsa: TRANSPORT, rekeying every 3600s or 300000000 bytes or 500000 packets
343 31 Andreas Steffen
    local:  dynamic
344 31 Andreas Steffen
    remote: dynamic
345 31 Andreas Steffen
</pre>
346 31 Andreas Steffen
347 31 Andreas Steffen
<pre>
348 31 Andreas Steffen
ecc: IKEv2, reauthentication every 10800s, no rekeying
349 31 Andreas Steffen
  local:  10.10.0.105
350 31 Andreas Steffen
  remote: 10.10.0.104
351 31 Andreas Steffen
  local public key authentication:
352 31 Andreas Steffen
    id: C=US, O=TNC Demo, OU=AIK ECC, CN=raspi5.example.com
353 31 Andreas Steffen
    certs: C=US, O=TNC Demo, OU=AIK ECC, CN=raspi5.example.com
354 31 Andreas Steffen
  remote public key authentication:
355 31 Andreas Steffen
    id: raspi4.example.com
356 31 Andreas Steffen
  ecc: TRANSPORT, rekeying every 3600s or 300000000 bytes or 500000 packets
357 31 Andreas Steffen
    local:  dynamic
358 31 Andreas Steffen
    remote: dynamic
359 31 Andreas Steffen
</pre>
360 31 Andreas Steffen
361 31 Andreas Steffen
The loaded certificates can also be displayed
362 31 Andreas Steffen
<pre>
363 31 Andreas Steffen
swanctl --list-certs
364 31 Andreas Steffen
</pre>
365 31 Andreas Steffen
366 31 Andreas Steffen
<pre>
367 31 Andreas Steffen
List of X.509 End Entity Certificates
368 31 Andreas Steffen
369 31 Andreas Steffen
  subject:  "C=US, O=TNC Demo, OU=AIK RSA, CN=raspi5.example.com"
370 31 Andreas Steffen
  issuer:   "C=US, O=TNC Demo, CN=TNC Demo CA"
371 31 Andreas Steffen
  validity:  not before Feb 19 09:33:43 2017, ok
372 31 Andreas Steffen
             not after  Aug 29 10:33:43 2026, ok (expires in 3477 days)
373 31 Andreas Steffen
  serial:    11:57:33:3e:2a:8e:8a:32
374 31 Andreas Steffen
  altNames:  raspi5.example.com
375 31 Andreas Steffen
  authkeyId: 21:02:7e:2d:de:8b:77:48:75:de:56:2f:b5:d4:62:ec:c3:09:15:f2
376 31 Andreas Steffen
  subjkeyId: f4:9e:85:7d:de:4e:67:f5:fb:87:03:98:67:3f:20:7c:f3:3f:2b:66
377 31 Andreas Steffen
  pubkey:    RSA 2048 bits, has private key
378 31 Andreas Steffen
  keyid:     71:21:f5:d4:7e:59:4a:88:16:ca:57:85:98:3d:36:a7:b1:d5:75:fa
379 31 Andreas Steffen
  subjkey:   f4:9e:85:7d:de:4e:67:f5:fb:87:03:98:67:3f:20:7c:f3:3f:2b:66
380 31 Andreas Steffen
381 31 Andreas Steffen
  subject:  "C=US, O=TNC Demo, OU=AIK ECC, CN=raspi5.example.com"
382 31 Andreas Steffen
  issuer:   "C=US, O=TNC Demo, CN=TNC Demo CA"
383 31 Andreas Steffen
  validity:  not before Feb 17 23:17:19 2017, ok
384 31 Andreas Steffen
             not after  Aug 30 00:17:19 2026, ok (expires in 3478 days)
385 31 Andreas Steffen
  serial:    52:9d:3e:42:6f:71:63:3d
386 31 Andreas Steffen
  altNames:  raspi5.example.com
387 31 Andreas Steffen
  authkeyId: 21:02:7e:2d:de:8b:77:48:75:de:56:2f:b5:d4:62:ec:c3:09:15:f2
388 31 Andreas Steffen
  subjkeyId: c7:0e:63:f8:7f:6f:f6:55:00:e5:05:7f:5a:3e:6b:6c:e7:d2:d5:13
389 31 Andreas Steffen
  pubkey:    ECDSA 256 bits, has private key
390 31 Andreas Steffen
  keyid:     71:49:7c:42:41:e7:c6:81:bc:31:73:f0:0f:7e:4a:e1:2d:53:00:38
391 31 Andreas Steffen
  subjkey:   c7:0e:63:f8:7f:6f:f6:55:00:e5:05:7f:5a:3e:6b:6c:e7:d2:d5:13
392 31 Andreas Steffen
</pre>
393 31 Andreas Steffen
You can clearly see that the connection between AK certificates and the matching AK private key has been established.
394 31 Andreas Steffen
395 31 Andreas Steffen
<pre>
396 31 Andreas Steffen
List of X.509 CA Certificates
397 31 Andreas Steffen
398 31 Andreas Steffen
  subject:  "C=US, O=TNC Demo, CN=TNC Demo CA"
399 31 Andreas Steffen
  issuer:   "C=US, O=TNC Demo, CN=TNC Demo CA"
400 31 Andreas Steffen
  validity:  not before Aug 31 10:29:27 2016, ok
401 31 Andreas Steffen
             not after  Aug 31 10:29:27 2026, ok (expires in 3479 days)
402 31 Andreas Steffen
  serial:    02:c8:85:e1:ef:fa:8f:20
403 31 Andreas Steffen
  flags:     CA CRLSign self-signed 
404 31 Andreas Steffen
  subjkeyId: 21:02:7e:2d:de:8b:77:48:75:de:56:2f:b5:d4:62:ec:c3:09:15:f2
405 31 Andreas Steffen
  pubkey:    ECDSA 256 bits
406 31 Andreas Steffen
  keyid:     a1:b5:e0:29:d0:4c:a7:62:bd:ca:a3:b4:af:18:42:2c:4a:01:55:9a
407 31 Andreas Steffen
  subjkey:   21:02:7e:2d:de:8b:77:48:75:de:56:2f:b5:d4:62:ec:c3:09:15:f2
408 29 Andreas Steffen
</pre>