Skip to content

Commit 73baf43

Browse files
authored
feat: adds support for E2E TLS connection between AMT and RPS (#2598)
* feat: adds support for E2E TLS connection between AMT and RPS# * refactor: ccm should commit changes
1 parent 8a44e96 commit 73baf43

25 files changed

Lines changed: 1147 additions & 193 deletions

src/DataProcessor.ts

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,10 @@ export class DataProcessor {
7979
await this.handleConnectionReset(clientMsg, clientId)
8080
break
8181
}
82+
case ClientMethods.PORT_SWITCH_ACK: {
83+
await this.handlePortSwitchAck(clientMsg, clientId)
84+
break
85+
}
8286
default: {
8387
const uuid = clientMsg.payload.uuid ? clientMsg.payload.uuid : devices[clientId].ClientData.payload.uuid
8488
throw new RPSError(`Device ${uuid} Not a supported method received from AMT device`)
@@ -151,9 +155,6 @@ export class DataProcessor {
151155
this.logger.warn(`WSMAN RESPONSE: parse failed`)
152156
rejectValue = new UNEXPECTED_PARSE_ERROR()
153157
} else {
154-
const actionMatch = xmlBody.match(/<a:Action>([^<]+)<\/a:Action>/)
155-
const action = actionMatch ? actionMatch[1].split('/').pop() : 'unknown'
156-
this.logger.debug(`WSMAN RESPONSE: ${action}`)
157158
this.logger.debug(`WSMAN RESPONSE XML:\n${xmlBody}`)
158159
}
159160
} else {
@@ -253,6 +254,15 @@ export class DataProcessor {
253254
}
254255
}
255256

257+
async handlePortSwitchAck(clientMsg: ClientMsg, clientId: string): Promise<void> {
258+
const clientObj = devices[clientId]
259+
this.logger.info(`PORT_SWITCH_ACK received from rpc-go for device ${clientObj?.uuid}`)
260+
261+
if (clientObj?.pendingPromise != null && clientObj.resolve != null) {
262+
clientObj.resolve('port_switch_ack')
263+
}
264+
}
265+
256266
async handleConnectionReset(clientMsg: ClientMsg, clientId: string): Promise<void> {
257267
const clientObj = devices[clientId]
258268
this.logger.warn(`CONNECTION RESET from rpc-go`)

src/NodeForge.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,4 +67,12 @@ export class NodeForge {
6767
createCert(): forge.pki.Certificate {
6868
return forge.pki.createCertificate()
6969
}
70+
71+
privateKeyFromPem(pem: string): forge.pki.PrivateKey {
72+
return forge.pki.privateKeyFromPem(pem)
73+
}
74+
75+
certificateFromPem(pem: string): forge.pki.Certificate {
76+
return forge.pki.certificateFromPem(pem)
77+
}
7078
}

src/Validator.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,11 @@ export class Validator implements IValidator {
8080
this.logger.info(`Device ${payload.uuid} has TLS enforced - enabling TLS tunnel mode`)
8181
}
8282
}
83+
// Extract TLS tunnel activation flag from payload
84+
if (msg.payload.tlsTunnel === true) {
85+
clientObj.tlsTunnelActivation = true
86+
this.logger.info(`Device ${payload.uuid} requested TLS tunnel activation`)
87+
}
8388
// Check for client requested action and profile activation
8489
const profile: AMTConfiguration | null = await this.configurator.profileManager.getAmtProfile(
8590
payload.profile,

src/certs/amt-odca.ts

Lines changed: 20 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -8,55 +8,27 @@
88
* These are public Intel certificates used to validate AMT device certificates
99
* when TLS is enforced on the AMT platform.
1010
*
11-
* Certificate sources:
12-
* - Intel(R) Client Platform Root Certificate Authority
13-
* - Intel AMT RCFG certificates
11+
* Certificate source: src/certs/OnDie_CA_RootCA_Certificate.cer
1412
*/
1513
export const AMT_ODCA_ROOT_CERTS: string[] = [
16-
// Intel(R) CSME FW RCFG Certificate
17-
// This root CA is used for AMT Remote Configuration
14+
// Intel OnDie CA Root Certificate (ECC P-384, valid 2019-2049)
15+
// Subject: O=Intel Corporation, OU=OnDie CA Root Cert Signing, CN=www.intel.com
1816
`-----BEGIN CERTIFICATE-----
19-
MIICwjCCAaqgAwIBAgIQT5cMYuWRhpjgXKkJ8PPbIjANBgkqhkiG9w0BAQsFADBE
20-
MRQwEgYDVQQHEwtTYW50YSBDbGFyYTELMAkGA1UECBMCQ0ExCzAJBgNVBAYTAlVT
21-
MRIwEAYDVQQKEwlJbnRlbChSKSAwHhcNMjEwNjAxMDAwMDAwWhcNNDkxMjMxMjM1
22-
OTU5WjBEMRQwEgYDVQQHEwtTYW50YSBDbGFyYTELMAkGA1UECBMCQ0ExCzAJBgNV
23-
BAYTAlVTMRIwEAYDVQQKEwlJbnRlbChSKSAwggEiMA0GCSqGSIb3DQEBAQUAA4IB
24-
DwAwggEKAoIBAQCr4N3e8kljVeacnP5LchxH3nk5TEiKgqvPCG4HGMJUJlakfLcN
25-
bwGHNdZdSqI4D7E+H0X5B/9v8yQVJXfsMpqvgtqPCH4H8z8xsHIVCJvJLLlA+PqI
26-
8pVLAMEaRH2cjIAIYDu3gOxOPSH8Bx+BI9Xje6Lf8IqIHn5LR8YL2gtn0Xpf+EfV
27-
G8RaXrN7sNhVRNCy7ZQ1DP5C+0XCduRHCa8Zqa6pzmazrVBT4jCIPnZp6wN5RAYW
28-
pXWv1C5nZ4FW3lFP4JdqoBFZrXxNO8fE3hQhZqWLchGODu+RMDqjFNOCkYBc8GCJ
29-
j8LyM7McbS5nyFoqhwl0DErcCSHfPJP8DXMZ5Jf3AgMBAAGjFTATMBEGA1UdEwEB
30-
/wQHMAUBAf8CAQAwDQYJKoZIhvcNAQELBQADggEBAHj6V8E6S3T9g8EhI3NLpaCP
31-
3P2N/e6z3vFVJDDFVKFc4PTThgFg4J+EjIAg1VvAAYfW0wj+7Ly8SHIrWBh4CJkX
32-
VVfwdXF2W2pFBeXcAMQHqQ7F8lAhSpaGpE8VqQ6YL7V9hOaAGy1b8t93v+7h1BVo
33-
uJdj1S2P9v7YhNU1Kn6g8X7CsS3TqFOlQLBp2hE7qIaT0cIxU6wd9rKzNNBPi1MR
34-
lLm7h5oJag19B1h+ppD0c0BDVpdcqdCFbBf7DmzzuMqB2OCqX8+6h5hj8JJLRCFT
35-
x+RkGxccVfgGkNB0hDXEPp56vluWd9kDGiVPqDL73aHrcpSb8/BY5h5T5xFl6js=
36-
-----END CERTIFICATE-----`,
37-
38-
// Intel AMT Remote Configuration Root CA
39-
// Alternative root CA for AMT device certificates
40-
`-----BEGIN CERTIFICATE-----
41-
MIIDkDCCAnigAwIBAgIQT0cAanSqxS4HblMrI2TFADANBgkqhkiG9w0BAQsFADBf
42-
MQswCQYDVQQGEwJVUzEYMBYGA1UEChMPVS5TLiBHb3Zlcm5tZW50MQwwCgYDVQQL
43-
EwNEb0QxDDAKBgNVBAsTA1BLSTEWMBQGA1UEAxMNRG9EIFJvb3QgQ0EgMzAeFw0x
44-
MjA0MDUxMzQzNThaFw0zNzEyMzExMzQzNThaMF8xCzAJBgNVBAYTAlVTMRgwFgYD
45-
VQQKEw9VLlMuIEdvdmVybm1lbnQxDDAKBgNVBAsTA0RvRDEMMAoGA1UECxMDUEtJ
46-
MRYwFAYDVQQDEw1Eb0QgUm9vdCBDQSAzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
47-
MIIBCgKCAQEAq6EcqasGJCC9k9J6hCOJxPYHHdKfVJLCE8p2qGGBD08f6e8RADax
48-
8u3XNMPRM0QB6LjKaHpMPkdR5WSbQrTqPN04BOZgDq1rrqREXsMzb4siDkn0J2x0
49-
HIB2kRTDtT8VBC7JSCPlMFpZvluYwpAgJkH3AZ0yw8D0mqrKWzN0GYPRJYBeEdG7
50-
9R6A8tF0MZBqkRAMBGM6KtD8UewJ5NIpqmxexvHyGIl0JVMJBsivfXYJzMHXm8H5
51-
9N4cgS/rH5YMkAqN5F/MWMMP5O1ZB0aN7N5FQqW5wgQ2pjDhkUI5Fa1p3J1j+K9v
52-
e3WXz6Q4j+U/n9z4E0ozj0Q+y0+B7dWHBwIDAQABo0IwQDAdBgNVHQ4EFgQUbIqU
53-
Y559IcHI7UXNDS8dkzQ39JowDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMB
54-
Af8wDQYJKoZIhvcNAQELBQADggEBAJ17j0qUFlyPNZjfU2G1jwxNvJQP1TwZ3YL4
55-
QL67jk+E7ji0W8j3gU5JLJ4x/fdOUh0a6X/uh1HZrxsm24bIOzrV0nx3CpLs3WZM
56-
bf0lWFiPBNbQZUzVLz1GdLhJPBLn5WNBhJYL0D7HqZSJitRmPJLttNfoVPolSKI1
57-
FRQ6G0HHfLrnBg1TECQ0iFJsRJzRjWw6YnFf6xDy0EfOZPbCOzU9I3QBRLXL1swk
58-
Xz5EeRXNKEP2QRh1q9rnQSNJo3cIuvHBZzT9r+aPNrNJp6hFvkCAVvWjfH/tf/T2
59-
d6QakmgMNmgZNAiMp6ms1P1gkjxFlSsG3Nz8L/WNQBLEP2xEAeg=
17+
MIICujCCAj6gAwIBAgIUPLLiHTrwySRtWxR4lxKLlu7MJ7wwDAYIKoZIzj0EAwMF
18+
ADCBiTELMAkGA1UEBgwCVVMxCzAJBgNVBAgMAkNBMRQwEgYDVQQHDAtTYW50YSBD
19+
bGFyYTEaMBgGA1UECgwRSW50ZWwgQ29ycG9yYXRpb24xIzAhBgNVBAsMGk9uRGll
20+
IENBIFJvb3QgQ2VydCBTaWduaW5nMRYwFAYDVQQDDA13d3cuaW50ZWwuY29tMB4X
21+
DTE5MDQwMzAwMDAwMFoXDTQ5MTIzMTIzNTk1OVowgYkxCzAJBgNVBAYMAlVTMQsw
22+
CQYDVQQIDAJDQTEUMBIGA1UEBwwLU2FudGEgQ2xhcmExGjAYBgNVBAoMEUludGVs
23+
IENvcnBvcmF0aW9uMSMwIQYDVQQLDBpPbkRpZSBDQSBSb290IENlcnQgU2lnbmlu
24+
ZzEWMBQGA1UEAwwNd3d3LmludGVsLmNvbTB2MBAGByqGSM49AgEGBSuBBAAiA2IA
25+
BK8SfB2UflvXZqb5Kc3+lokrABHWazvNER2axPURP64HILkXChPB0OEX5hLB7Okw
26+
7Dy6oFqB5tQVDupgfvUX/SgYBEaDdG5rCVFrGAis6HX5TA2ewQmj14r2ncHBgnpp
27+
B6NjMGEwHwYDVR0jBBgwFoAUtFjJ9uQIQKPyWMg5eG6ujgqNnDgwDwYDVR0TAQH/
28+
BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFLRYyfbkCECj8ljIOXhu
29+
ro4KjZw4MAwGCCqGSM49BAMDBQADaAAwZQIxAP9B4lFF86uvpHmkcp61cWaU565a
30+
yE3p7ezu9haLE/lPLh5hFQfmTi1nm/sG3JEXMQIwNpKfHoDmUTrUyezhhfv3GG+1
31+
CqBXstmCYH40buj9jKW3pHWc71s9arEmPWli7I8U
6032
-----END CERTIFICATE-----`
6133
]
6234

@@ -65,8 +37,6 @@ d6QakmgMNmgZNAiMp6ms1P1gkjxFlSsG3Nz8L/WNQBLEP2xEAeg=
6537
* Used to validate that certificates are issued by Intel AMT ODCA.
6638
*/
6739
export const AMT_ALLOWED_ISSUERS = [
68-
'iAMT CSME IDevID RCFG',
69-
'AMT RCFG',
70-
'Intel(R) CSME',
71-
'Intel(R)'
40+
'OnDie CA Root Cert Signing',
41+
'Intel Corporation'
7242
]

src/interfaces/ISecretManagerService.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ export interface DeviceCredentials {
99
AMT_PASSWORD: string | null
1010
MPS_PASSWORD?: string // only required for CIRA
1111
MEBX_PASSWORD?: string | null
12+
TLS_ISSUED_CERTIFICATE?: string
1213
version?: string
1314
}
1415

src/models/RCS.Config.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,7 @@ export interface ClientObject {
126126
resolve: (value: unknown) => void
127127
reject: (value: unknown) => void
128128
tlsEnforced?: boolean
129+
tlsTunnelActivation?: boolean
129130
tlsTunnelManager?: TLSTunnelManager
130131
tlsTunnelNeedsReset?: boolean
131132
tlsTunnelSessionId?: string // Current TLS session ID for filtering stale data
@@ -200,6 +201,9 @@ export interface TLSConfigFlow {
200201
commitLocalTLS?: boolean
201202
getTimeSynch?: boolean
202203
setTimeSynch?: boolean
204+
rootCertKey?: any
205+
issuedCertPEM?: string
206+
mpsRootCertPEM?: string
203207
}
204208

205209
export interface mpsServer {
@@ -240,6 +244,7 @@ export interface Payload {
240244
client: string
241245
profile?: any
242246
tlsEnforced?: boolean
247+
tlsTunnel?: boolean
243248
}
244249

245250
export interface ConnectionObject {
@@ -271,7 +276,9 @@ export enum ClientMethods {
271276
HEARTBEAT = 'heartbeat_response',
272277
MAINTENANCE = 'maintenance',
273278
TLS_DATA = 'tls_data',
274-
CONNECTION_RESET = 'connection_reset'
279+
CONNECTION_RESET = 'connection_reset',
280+
PORT_SWITCH = 'port_switch',
281+
PORT_SWITCH_ACK = 'port_switch_ack'
275282
}
276283

277284
export interface apiResponse {

0 commit comments

Comments
 (0)