Skip to content

Commit 40123b8

Browse files
author
zhiminghufighting
committed
out-of-tree attester/verifier instances support
Fixes: #24 Signed-off-by: zhiminghufighting <[email protected]>
1 parent d727c57 commit 40123b8

File tree

37 files changed

+248
-95
lines changed

37 files changed

+248
-95
lines changed

src/attesters/nullattester/main.c

+1
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ static enclave_attester_opts_t nullattester_opts = {
2424
.api_version = ENCLAVE_ATTESTER_API_VERSION_DEFAULT,
2525
.flags = ENCLAVE_ATTESTER_FLAGS_DEFAULT,
2626
.name = "nullattester",
27+
.oid = "",
2728
.priority = 0,
2829
.pre_init = nullattester_pre_init,
2930
.init = nullattester_init,

src/attesters/sev-snp/main.c

+2
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
#include <stdio.h>
88
#include <rats-tls/attester.h>
99
#include <rats-tls/log.h>
10+
#include "sev_snp.h"
1011

1112
extern enclave_attester_err_t enclave_attester_register(enclave_attester_opts_t *opts);
1213
extern enclave_attester_err_t sev_snp_attester_pre_init(void);
@@ -22,6 +23,7 @@ static enclave_attester_opts_t sev_snp_attester_opts = {
2223
.api_version = ENCLAVE_ATTESTER_API_VERSION_DEFAULT,
2324
.flags = ENCLAVE_ATTESTER_OPTS_FLAGS_SNP_GUEST,
2425
.name = "sev_snp",
26+
.oid = SNP_REPORT_OID,
2527
.priority = 42,
2628
.pre_init = sev_snp_attester_pre_init,
2729
.init = sev_snp_attester_init,

src/attesters/sev-snp/sev_snp.h

+2
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
* https://www.amd.com/system/files/TechDocs/56860.pdf for details.
1616
*/
1717

18+
#define SNP_REPORT_OID "1.2.840.113741.1337.20"
19+
1820
/* 2.2 TCB Version
1921
* A version string that represents the version of the firmware
2022
*/

src/attesters/sgx-ecdsa/collect_evidence.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ enclave_attester_err_t sgx_ecdsa_collect_evidence(enclave_attester_ctx_t *ctx,
115115
return SGX_ECDSA_ATTESTER_ERR_CODE((int)qe3_ret);
116116
}
117117

118-
sgx_status = ocall_qe_get_quote(&qe3_ret, &app_report, quote_size, evidence->ecdsa.quote);
118+
sgx_status = ocall_qe_get_quote(&qe3_ret, &app_report, quote_size, evidence->evidence.report);
119119
if (SGX_SUCCESS != sgx_status || ENCLAVE_ATTESTER_ERR_NONE != qe3_ret) {
120120
RTLS_ERR("sgx_qe_get_quote(): 0x%04x, 0x%04x\n", sgx_status, qe3_ret);
121121
return SGX_ECDSA_ATTESTER_ERR_CODE((int)qe3_ret);
@@ -128,7 +128,7 @@ enclave_attester_err_t sgx_ecdsa_collect_evidence(enclave_attester_ctx_t *ctx,
128128
* format of quote as sgx_ecdsa.
129129
*/
130130
snprintf(evidence->type, sizeof(evidence->type), "%s", "sgx_ecdsa");
131-
evidence->ecdsa.quote_len = quote_size;
131+
evidence->evidence.report_len = quote_size;
132132

133133
return ENCLAVE_ATTESTER_ERR_NONE;
134134
}

src/attesters/sgx-ecdsa/main.c

+2
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
#include <stdio.h>
88
#include <rats-tls/attester.h>
99
#include <rats-tls/log.h>
10+
#include "sgx_ecdsa.h"
1011

1112
extern enclave_attester_err_t enclave_attester_register(enclave_attester_opts_t *opts);
1213
extern enclave_attester_err_t sgx_ecdsa_attester_pre_init(void);
@@ -24,6 +25,7 @@ static enclave_attester_opts_t sgx_ecdsa_attester_opts = {
2425
.api_version = ENCLAVE_ATTESTER_API_VERSION_DEFAULT,
2526
.flags = ENCLAVE_ATTESTER_OPTS_FLAGS_SGX_ENCLAVE,
2627
.name = "sgx_ecdsa",
28+
.oid = ECDSA_QUOTE_OID,
2729
.priority = 52,
2830
.pre_init = sgx_ecdsa_attester_pre_init,
2931
.init = sgx_ecdsa_attester_init,

src/attesters/sgx-ecdsa/sgx_ecdsa.h

+3-1
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,10 @@
99

1010
#include <sgx_urts.h>
1111

12+
#define ECDSA_QUOTE_OID "1.2.840.113741.1337.6"
13+
1214
typedef struct {
1315
sgx_enclave_id_t eid;
1416
} sgx_ecdsa_ctx_t;
1517

16-
#endif
18+
#endif

src/attesters/sgx-la/collect_evidence.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,8 @@ enclave_attester_err_t sgx_la_collect_evidence(enclave_attester_ctx_t *ctx,
3737
return SGX_LA_ATTESTER_ERR_CODE((int)generate_evidence_ret);
3838
}
3939

40-
memcpy(evidence->la.report, &isv_report, sizeof(isv_report));
41-
evidence->la.report_len = sizeof(isv_report);
40+
memcpy(evidence->evidence.report, &isv_report, sizeof(isv_report));
41+
evidence->evidence.report_len = sizeof(isv_report);
4242

4343
snprintf(evidence->type, sizeof(evidence->type), "%s", "sgx_la");
4444

src/attesters/sgx-la/main.c

+2
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
#include <stdio.h>
88
#include <rats-tls/attester.h>
99
#include <rats-tls/log.h>
10+
#include "sgx_la.h"
1011

1112
extern enclave_attester_err_t enclave_attester_register(enclave_attester_opts_t *);
1213
extern enclave_attester_err_t sgx_la_attester_pre_init(void);
@@ -22,6 +23,7 @@ static enclave_attester_opts_t sgx_la_attester_opts = {
2223
.api_version = ENCLAVE_ATTESTER_API_VERSION_DEFAULT,
2324
.flags = ENCLAVE_ATTESTER_OPTS_FLAGS_SGX_ENCLAVE,
2425
.name = "sgx_la",
26+
.oid = LA_REPORT_OID,
2527
.priority = 15,
2628
.pre_init = sgx_la_attester_pre_init,
2729
.init = sgx_la_attester_init,

src/attesters/sgx-la/sgx_la.h

+2
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99

1010
#include "sgx_eid.h"
1111

12+
#define LA_REPORT_OID "1.2.840.113741.1337.14"
13+
1214
typedef struct {
1315
sgx_enclave_id_t eid;
1416
} sgx_la_ctx_t;

src/attesters/tdx-ecdsa/cleanup.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
#include <rats-tls/log.h>
88
#include <rats-tls/attester.h>
9-
#include "../../verifiers/tdx-ecdsa/tdx-ecdsa.h"
9+
#include "../../verifiers/tdx-ecdsa/tdx_ecdsa.h"
1010

1111
enclave_attester_err_t tdx_ecdsa_attester_cleanup(enclave_attester_ctx_t *ctx)
1212
{

src/attesters/tdx-ecdsa/collect_evidence.c

+4-4
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
#include <rats-tls/log.h>
1111
#include <rats-tls/attester.h>
1212
#include <stddef.h>
13-
#include "../../verifiers/tdx-ecdsa/tdx-ecdsa.h"
13+
#include "../../verifiers/tdx-ecdsa/tdx_ecdsa.h"
1414

1515
#define VSOCK
1616

@@ -88,8 +88,8 @@ enclave_attester_err_t tdx_ecdsa_collect_evidence(enclave_attester_ctx_t *ctx,
8888
{
8989
RTLS_DEBUG("ctx %p, evidence %p, algo %d, hash %p\n", ctx, evidence, algo, hash);
9090

91-
evidence->tdx.quote_len = sizeof(evidence->tdx.quote);
92-
if (tdx_gen_quote(hash, evidence->tdx.quote, &evidence->tdx.quote_len)) {
91+
evidence->evidence.report_len = sizeof(evidence->evidence.report);
92+
if (tdx_gen_quote(hash, evidence->evidence.report, &evidence->evidence.report_len)) {
9393
RTLS_ERR("failed to generate quote\n");
9494
return -ENCLAVE_ATTESTER_ERR_INVALID;
9595
}
@@ -101,7 +101,7 @@ enclave_attester_err_t tdx_ecdsa_collect_evidence(enclave_attester_ctx_t *ctx,
101101
*/
102102
snprintf(evidence->type, sizeof(evidence->type), "tdx_ecdsa");
103103

104-
RTLS_DEBUG("ctx %p, evidence %p, quote_size %d\n", ctx, evidence, evidence->tdx.quote_len);
104+
RTLS_DEBUG("ctx %p, evidence %p, quote_size %d\n", ctx, evidence, evidence->evidence.report_len);
105105

106106
return ENCLAVE_ATTESTER_ERR_NONE;
107107
}

src/attesters/tdx-ecdsa/init.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
#include <string.h>
88
#include <rats-tls/log.h>
99
#include <rats-tls/attester.h>
10-
#include "../../verifiers/tdx-ecdsa/tdx-ecdsa.h"
10+
#include "../../verifiers/tdx-ecdsa/tdx_ecdsa.h"
1111

1212
enclave_attester_err_t tdx_ecdsa_attester_init(enclave_attester_ctx_t *ctx,
1313
rats_tls_cert_algo_t algo)

src/attesters/tdx-ecdsa/main.c

+2
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
#include <stdio.h>
88
#include <rats-tls/attester.h>
99
#include <rats-tls/log.h>
10+
#include "tdx_ecdsa.h"
1011

1112
extern enclave_attester_err_t enclave_attester_register(enclave_attester_opts_t *opts);
1213
extern enclave_attester_err_t tdx_ecdsa_attester_pre_init(void);
@@ -22,6 +23,7 @@ static enclave_attester_opts_t tdx_ecdsa_attester_opts = {
2223
.api_version = ENCLAVE_ATTESTER_API_VERSION_DEFAULT,
2324
.flags = ENCLAVE_ATTESTER_OPTS_FLAGS_TDX_GUEST,
2425
.name = "tdx_ecdsa",
26+
.oid = TDX_QUOTE_OID,
2527
.priority = 42,
2628
.pre_init = tdx_ecdsa_attester_pre_init,
2729
.init = tdx_ecdsa_attester_init,

src/verifiers/tdx-ecdsa/tdx-ecdsa.h renamed to src/attesters/tdx-ecdsa/tdx_ecdsa.h

+1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
#include <rats-tls/api.h>
1111

1212
#define TDX_NUM_RTMRS 4
13+
#define TDX_QUOTE_OID "1.2.840.113741.1337.8"
1314

1415
typedef struct {
1516
uint8_t mrowner[SHA384_HASH_SIZE];

src/crypto_wrappers/openssl/gen_cert.c

+15-17
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,9 @@
88
#include <rats-tls/log.h>
99
#include <rats-tls/crypto_wrapper.h>
1010
#include <rats-tls/oid.h>
11+
#include <rats-tls/attester.h>
1112
#include "openssl.h"
13+
#include "internal/attester.h"
1214

1315
#define CERT_SERIAL_NUMBER 9527
1416

@@ -145,26 +147,22 @@ crypto_wrapper_err_t openssl_gen_cert(crypto_wrapper_ctx_t *ctx, rats_tls_cert_a
145147
if (!x509_extension_add(cert, ias_report_signature_oid, epid->ias_report_signature,
146148
epid->ias_report_signature_len))
147149
goto err;
148-
} else if (!strcmp(cert_info->evidence.type, "sgx_ecdsa")) {
149-
ecdsa_attestation_evidence_t *ecdsa = &cert_info->evidence.ecdsa;
150-
151-
if (!x509_extension_add(cert, ecdsa_quote_oid, ecdsa->quote, ecdsa->quote_len))
152-
goto err;
153-
} else if (!strcmp(cert_info->evidence.type, "sgx_la")) {
154-
la_attestation_evidence_t *la = &cert_info->evidence.la;
155-
156-
if (!x509_extension_add(cert, la_report_oid, la->report, la->report_len))
157-
goto err;
158-
} else if (!strcmp(cert_info->evidence.type, "tdx_ecdsa")) {
159-
tdx_attestation_evidence_t *tdx = &cert_info->evidence.tdx;
150+
}
160151

161-
if (!x509_extension_add(cert, tdx_quote_oid, tdx->quote, tdx->quote_len))
152+
enclave_attester_opts_t *opts = NULL;
153+
for(int i = 0; i < registerd_enclave_attester_nums; ++i) {
154+
opts = enclave_attesters_opts[i];
155+
if (!opts) {
156+
RTLS_DEBUG("registerd enclave_attesters_opts is null.\n");
162157
goto err;
163-
} else if (!strcmp(cert_info->evidence.type, "sev_snp")) {
164-
snp_attestation_evidence_t *snp = &cert_info->evidence.snp;
158+
}
165159

166-
if (!x509_extension_add(cert, snp_report_oid, snp->report, snp->report_len))
167-
goto err;
160+
if (!strcmp(cert_info->evidence.type, opts->name)) {
161+
tee_attestation_evidence_t *evidence = &cert_info->evidence.evidence;
162+
if (!x509_extension_add(cert, opts->oid, evidence->report, evidence->report_len))
163+
goto err;
164+
break;
165+
}
168166
}
169167

170168
ret = -CRYPTO_WRAPPER_ERR_CERT;

src/include/rats-tls/attester.h

+2
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ typedef struct {
3232
uint8_t api_version;
3333
unsigned long flags;
3434
const char name[ENCLAVE_ATTESTER_TYPE_NAME_SIZE];
35+
const char oid[OID_LENGTH];
3536
/* Different attester instances may generate the same format of attester,
3637
* e.g, sgx_ecdsa and sgx_ecdsa_qve both generate the format "sgx_ecdsa".
3738
* By default, the value of type equals to name.
@@ -42,6 +43,7 @@ typedef struct {
4243
/* Optional */
4344
enclave_attester_err_t (*pre_init)(void);
4445
enclave_attester_err_t (*init)(enclave_attester_ctx_t *ctx, rats_tls_cert_algo_t algo);
46+
enclave_attester_err_t (*tee_aware)(void);
4547
enclave_attester_err_t (*extend_cert)(enclave_attester_ctx_t *ctx,
4648
const rats_tls_cert_info_t *cert_info);
4749
enclave_attester_err_t (*collect_evidence)(enclave_attester_ctx_t *ctx,

src/include/rats-tls/cert.h

+4-20
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
#ifndef _ENCLAVE_CERT_H
88
#define _ENCLAVE_CERT_H
99

10+
#define OID_LENGTH 64
11+
1012
typedef struct {
1113
const unsigned char *organization;
1214
const unsigned char *organization_unit;
@@ -24,34 +26,16 @@ typedef struct {
2426
uint32_t ias_report_signature_len;
2527
} attestation_verification_report_t;
2628

27-
typedef struct {
28-
uint8_t quote[8192];
29-
uint32_t quote_len;
30-
} ecdsa_attestation_evidence_t;
31-
32-
typedef struct {
33-
uint8_t report[8192];
34-
uint32_t report_len;
35-
} la_attestation_evidence_t;
36-
37-
typedef struct {
38-
uint8_t quote[8192];
39-
uint32_t quote_len;
40-
} tdx_attestation_evidence_t;
41-
4229
typedef struct {
4330
uint8_t report[8192];
4431
uint32_t report_len;
45-
} snp_attestation_evidence_t;
32+
} tee_attestation_evidence_t;
4633

4734
typedef struct {
4835
char type[ENCLAVE_ATTESTER_TYPE_NAME_SIZE];
4936
union {
5037
attestation_verification_report_t epid;
51-
ecdsa_attestation_evidence_t ecdsa;
52-
la_attestation_evidence_t la;
53-
tdx_attestation_evidence_t tdx;
54-
snp_attestation_evidence_t snp;
38+
tee_attestation_evidence_t evidence;
5539
};
5640
} attestation_evidence_t;
5741

src/include/rats-tls/oid.h

-4
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,5 @@
1010
#define ias_root_cert_oid "1.2.840.113741.1337.3"
1111
#define ias_leaf_cert_oid "1.2.840.113741.1337.4"
1212
#define ias_report_signature_oid "1.2.840.113741.1337.5"
13-
#define ecdsa_quote_oid "1.2.840.113741.1337.6"
14-
#define la_report_oid "1.2.840.113741.1337.14"
15-
#define tdx_quote_oid "1.2.840.113741.1337.8"
16-
#define snp_report_oid "1.2.840.113741.1337.20"
1713

1814
#endif

src/include/rats-tls/verifier.h

+1
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ typedef struct {
3131
uint8_t api_version;
3232
unsigned long flags;
3333
const char name[ENCLAVE_VERIFIER_TYPE_NAME_SIZE];
34+
const char oid[OID_LENGTH];
3435
/* Different attester instances may generate the same format of verifier,
3536
* e.g, sgx_ecdsa and sgx_ecdsa_qve both generate the format "sgx_ecdsa".
3637
* By default, the value of type equals to name.

src/sgx/untrust/sgx_ecdsa_ocall.c

+3-3
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ enclave_verifier_err_t ocall_ecdsa_verify_evidence(__attribute__((unused))
7777
return -ENCLAVE_VERIFIER_ERR_NO_MEM;
7878
}
7979

80-
memcpy(pquote, evidence->ecdsa.quote, evidence->ecdsa.quote_len);
80+
memcpy(pquote, evidence->evidence.report, evidence->evidence.report_len);
8181

8282
uint32_t quote_size = (uint32_t)sizeof(sgx_quote3_t) + pquote->signature_data_len;
8383
RTLS_DEBUG("quote size is %d, quote signature_data_len is %d\n", quote_size,
@@ -141,7 +141,7 @@ enclave_verifier_err_t ocall_ecdsa_verify_evidence(__attribute__((unused))
141141

142142
current_time = time(NULL);
143143

144-
dcap_ret = sgx_qv_verify_quote(evidence->ecdsa.quote, (uint32_t)quote_size, NULL,
144+
dcap_ret = sgx_qv_verify_quote(evidence->evidence.report, (uint32_t)quote_size, NULL,
145145
current_time, &collateral_expiration_status,
146146
&quote_verification_result, qve_report_info,
147147
supplemental_data_size, p_supplemental_data);
@@ -155,7 +155,7 @@ enclave_verifier_err_t ocall_ecdsa_verify_evidence(__attribute__((unused))
155155

156156
if (!strcmp(name, "sgx_ecdsa_qve")) {
157157
sgx_ret = sgx_tvl_verify_qve_report_and_identity(
158-
enclave_id, &verify_qveid_ret, evidence->ecdsa.quote, (uint32_t)quote_size,
158+
enclave_id, &verify_qveid_ret, evidence->evidence.report, (uint32_t)quote_size,
159159
qve_report_info, current_time, collateral_expiration_status,
160160
quote_verification_result, p_supplemental_data, supplemental_data_size,
161161
qve_isvsvn_threshold);

src/sgx/untrust/sgx_la_ocall.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ enclave_verifier_err_t ocall_la_verify_evidence(enclave_verifier_ctx_t *ctx,
2626
RTLS_DEBUG("ctx %p, evidence %p, hash %p\n", ctx, evidence, hash);
2727

2828
/* Firstly verify hash value */
29-
sgx_report_t *lreport = (sgx_report_t *)evidence->la.report;
29+
sgx_report_t *lreport = (sgx_report_t *)evidence->evidence.report;
3030

3131
if (memcmp(hash, lreport->body.report_data.d, hash_len) != 0) {
3232
RTLS_ERR("unmatched hash value in evidence\n");
@@ -45,7 +45,7 @@ enclave_verifier_err_t ocall_la_verify_evidence(enclave_verifier_ctx_t *ctx,
4545
return SGX_LA_VERIFIER_ERR_CODE((int)qe3_ret);
4646
}
4747

48-
qe3_ret = sgx_qe_get_quote((sgx_report_t *)evidence->la.report, quote_size, quote);
48+
qe3_ret = sgx_qe_get_quote((sgx_report_t *)evidence->evidence.report, quote_size, quote);
4949
if (SGX_QL_SUCCESS != qe3_ret) {
5050
RTLS_ERR("failed to get quote %04x\n", qe3_ret);
5151
return SGX_LA_VERIFIER_ERR_CODE((int)qe3_ret);

0 commit comments

Comments
 (0)