diff options
Diffstat (limited to 'src/libpts/tcg')
-rw-r--r-- | src/libpts/tcg/pts/tcg_pts_attr_aik.c (renamed from src/libpts/tcg/tcg_pts_attr_aik.c) | 0 | ||||
-rw-r--r-- | src/libpts/tcg/pts/tcg_pts_attr_aik.h (renamed from src/libpts/tcg/tcg_pts_attr_aik.h) | 2 | ||||
-rw-r--r-- | src/libpts/tcg/pts/tcg_pts_attr_dh_nonce_finish.c (renamed from src/libpts/tcg/tcg_pts_attr_dh_nonce_finish.c) | 0 | ||||
-rw-r--r-- | src/libpts/tcg/pts/tcg_pts_attr_dh_nonce_finish.h (renamed from src/libpts/tcg/tcg_pts_attr_dh_nonce_finish.h) | 2 | ||||
-rw-r--r-- | src/libpts/tcg/pts/tcg_pts_attr_dh_nonce_params_req.c (renamed from src/libpts/tcg/tcg_pts_attr_dh_nonce_params_req.c) | 0 | ||||
-rw-r--r-- | src/libpts/tcg/pts/tcg_pts_attr_dh_nonce_params_req.h (renamed from src/libpts/tcg/tcg_pts_attr_dh_nonce_params_req.h) | 2 | ||||
-rw-r--r-- | src/libpts/tcg/pts/tcg_pts_attr_dh_nonce_params_resp.c (renamed from src/libpts/tcg/tcg_pts_attr_dh_nonce_params_resp.c) | 0 | ||||
-rw-r--r-- | src/libpts/tcg/pts/tcg_pts_attr_dh_nonce_params_resp.h (renamed from src/libpts/tcg/tcg_pts_attr_dh_nonce_params_resp.h) | 2 | ||||
-rw-r--r-- | src/libpts/tcg/pts/tcg_pts_attr_file_meas.c (renamed from src/libpts/tcg/tcg_pts_attr_file_meas.c) | 0 | ||||
-rw-r--r-- | src/libpts/tcg/pts/tcg_pts_attr_file_meas.h (renamed from src/libpts/tcg/tcg_pts_attr_file_meas.h) | 2 | ||||
-rw-r--r-- | src/libpts/tcg/pts/tcg_pts_attr_gen_attest_evid.c (renamed from src/libpts/tcg/tcg_pts_attr_gen_attest_evid.c) | 0 | ||||
-rw-r--r-- | src/libpts/tcg/pts/tcg_pts_attr_gen_attest_evid.h (renamed from src/libpts/tcg/tcg_pts_attr_gen_attest_evid.h) | 2 | ||||
-rw-r--r-- | src/libpts/tcg/pts/tcg_pts_attr_get_aik.c (renamed from src/libpts/tcg/tcg_pts_attr_get_aik.c) | 0 | ||||
-rw-r--r-- | src/libpts/tcg/pts/tcg_pts_attr_get_aik.h (renamed from src/libpts/tcg/tcg_pts_attr_get_aik.h) | 2 | ||||
-rw-r--r-- | src/libpts/tcg/pts/tcg_pts_attr_get_tpm_version_info.c (renamed from src/libpts/tcg/tcg_pts_attr_get_tpm_version_info.c) | 0 | ||||
-rw-r--r-- | src/libpts/tcg/pts/tcg_pts_attr_get_tpm_version_info.h (renamed from src/libpts/tcg/tcg_pts_attr_get_tpm_version_info.h) | 2 | ||||
-rw-r--r-- | src/libpts/tcg/pts/tcg_pts_attr_meas_algo.c (renamed from src/libpts/tcg/tcg_pts_attr_meas_algo.c) | 0 | ||||
-rw-r--r-- | src/libpts/tcg/pts/tcg_pts_attr_meas_algo.h (renamed from src/libpts/tcg/tcg_pts_attr_meas_algo.h) | 2 | ||||
-rw-r--r-- | src/libpts/tcg/pts/tcg_pts_attr_proto_caps.c (renamed from src/libpts/tcg/tcg_pts_attr_proto_caps.c) | 0 | ||||
-rw-r--r-- | src/libpts/tcg/pts/tcg_pts_attr_proto_caps.h (renamed from src/libpts/tcg/tcg_pts_attr_proto_caps.h) | 2 | ||||
-rw-r--r-- | src/libpts/tcg/pts/tcg_pts_attr_req_file_meas.c (renamed from src/libpts/tcg/tcg_pts_attr_req_file_meas.c) | 0 | ||||
-rw-r--r-- | src/libpts/tcg/pts/tcg_pts_attr_req_file_meas.h (renamed from src/libpts/tcg/tcg_pts_attr_req_file_meas.h) | 2 | ||||
-rw-r--r-- | src/libpts/tcg/pts/tcg_pts_attr_req_file_meta.c (renamed from src/libpts/tcg/tcg_pts_attr_req_file_meta.c) | 0 | ||||
-rw-r--r-- | src/libpts/tcg/pts/tcg_pts_attr_req_file_meta.h (renamed from src/libpts/tcg/tcg_pts_attr_req_file_meta.h) | 2 | ||||
-rw-r--r-- | src/libpts/tcg/pts/tcg_pts_attr_req_func_comp_evid.c (renamed from src/libpts/tcg/tcg_pts_attr_req_func_comp_evid.c) | 0 | ||||
-rw-r--r-- | src/libpts/tcg/pts/tcg_pts_attr_req_func_comp_evid.h (renamed from src/libpts/tcg/tcg_pts_attr_req_func_comp_evid.h) | 2 | ||||
-rw-r--r-- | src/libpts/tcg/pts/tcg_pts_attr_simple_comp_evid.c (renamed from src/libpts/tcg/tcg_pts_attr_simple_comp_evid.c) | 0 | ||||
-rw-r--r-- | src/libpts/tcg/pts/tcg_pts_attr_simple_comp_evid.h (renamed from src/libpts/tcg/tcg_pts_attr_simple_comp_evid.h) | 2 | ||||
-rw-r--r-- | src/libpts/tcg/pts/tcg_pts_attr_simple_evid_final.c (renamed from src/libpts/tcg/tcg_pts_attr_simple_evid_final.c) | 0 | ||||
-rw-r--r-- | src/libpts/tcg/pts/tcg_pts_attr_simple_evid_final.h (renamed from src/libpts/tcg/tcg_pts_attr_simple_evid_final.h) | 2 | ||||
-rw-r--r-- | src/libpts/tcg/pts/tcg_pts_attr_tpm_version_info.c (renamed from src/libpts/tcg/tcg_pts_attr_tpm_version_info.c) | 0 | ||||
-rw-r--r-- | src/libpts/tcg/pts/tcg_pts_attr_tpm_version_info.h (renamed from src/libpts/tcg/tcg_pts_attr_tpm_version_info.h) | 2 | ||||
-rw-r--r-- | src/libpts/tcg/pts/tcg_pts_attr_unix_file_meta.c (renamed from src/libpts/tcg/tcg_pts_attr_unix_file_meta.c) | 0 | ||||
-rw-r--r-- | src/libpts/tcg/pts/tcg_pts_attr_unix_file_meta.h (renamed from src/libpts/tcg/tcg_pts_attr_unix_file_meta.h) | 2 | ||||
-rw-r--r-- | src/libpts/tcg/swid/tcg_swid_attr_req.c | 329 | ||||
-rw-r--r-- | src/libpts/tcg/swid/tcg_swid_attr_req.h | 103 | ||||
-rw-r--r-- | src/libpts/tcg/swid/tcg_swid_attr_tag_id_inv.c | 325 | ||||
-rw-r--r-- | src/libpts/tcg/swid/tcg_swid_attr_tag_id_inv.h | 88 | ||||
-rw-r--r-- | src/libpts/tcg/swid/tcg_swid_attr_tag_inv.c | 313 | ||||
-rw-r--r-- | src/libpts/tcg/swid/tcg_swid_attr_tag_inv.h | 88 | ||||
-rw-r--r-- | src/libpts/tcg/tcg_attr.c | 61 | ||||
-rw-r--r-- | src/libpts/tcg/tcg_attr.h | 12 |
42 files changed, 1308 insertions, 45 deletions
diff --git a/src/libpts/tcg/tcg_pts_attr_aik.c b/src/libpts/tcg/pts/tcg_pts_attr_aik.c index 17a8db5d6..17a8db5d6 100644 --- a/src/libpts/tcg/tcg_pts_attr_aik.c +++ b/src/libpts/tcg/pts/tcg_pts_attr_aik.c diff --git a/src/libpts/tcg/tcg_pts_attr_aik.h b/src/libpts/tcg/pts/tcg_pts_attr_aik.h index 758fd58db..0962432e9 100644 --- a/src/libpts/tcg/tcg_pts_attr_aik.h +++ b/src/libpts/tcg/pts/tcg_pts_attr_aik.h @@ -23,7 +23,7 @@ typedef struct tcg_pts_attr_aik_t tcg_pts_attr_aik_t; -#include "tcg_attr.h" +#include "tcg/tcg_attr.h" #include "pa_tnc/pa_tnc_attr.h" #include <credentials/certificates/certificate.h> diff --git a/src/libpts/tcg/tcg_pts_attr_dh_nonce_finish.c b/src/libpts/tcg/pts/tcg_pts_attr_dh_nonce_finish.c index 6119b4973..6119b4973 100644 --- a/src/libpts/tcg/tcg_pts_attr_dh_nonce_finish.c +++ b/src/libpts/tcg/pts/tcg_pts_attr_dh_nonce_finish.c diff --git a/src/libpts/tcg/tcg_pts_attr_dh_nonce_finish.h b/src/libpts/tcg/pts/tcg_pts_attr_dh_nonce_finish.h index 57cb5a9b6..efe6fd153 100644 --- a/src/libpts/tcg/tcg_pts_attr_dh_nonce_finish.h +++ b/src/libpts/tcg/pts/tcg_pts_attr_dh_nonce_finish.h @@ -23,7 +23,7 @@ typedef struct tcg_pts_attr_dh_nonce_finish_t tcg_pts_attr_dh_nonce_finish_t; -#include "tcg_attr.h" +#include "tcg/tcg_attr.h" #include "pa_tnc/pa_tnc_attr.h" #include "pts/pts_meas_algo.h" diff --git a/src/libpts/tcg/tcg_pts_attr_dh_nonce_params_req.c b/src/libpts/tcg/pts/tcg_pts_attr_dh_nonce_params_req.c index 7761b977d..7761b977d 100644 --- a/src/libpts/tcg/tcg_pts_attr_dh_nonce_params_req.c +++ b/src/libpts/tcg/pts/tcg_pts_attr_dh_nonce_params_req.c diff --git a/src/libpts/tcg/tcg_pts_attr_dh_nonce_params_req.h b/src/libpts/tcg/pts/tcg_pts_attr_dh_nonce_params_req.h index 22e1bd189..024648abb 100644 --- a/src/libpts/tcg/tcg_pts_attr_dh_nonce_params_req.h +++ b/src/libpts/tcg/pts/tcg_pts_attr_dh_nonce_params_req.h @@ -24,7 +24,7 @@ typedef struct tcg_pts_attr_dh_nonce_params_req_t tcg_pts_attr_dh_nonce_params_req_t; -#include "tcg_attr.h" +#include "tcg/tcg_attr.h" #include "pa_tnc/pa_tnc_attr.h" #include "pts/pts_dh_group.h" diff --git a/src/libpts/tcg/tcg_pts_attr_dh_nonce_params_resp.c b/src/libpts/tcg/pts/tcg_pts_attr_dh_nonce_params_resp.c index eb0d0e533..eb0d0e533 100644 --- a/src/libpts/tcg/tcg_pts_attr_dh_nonce_params_resp.c +++ b/src/libpts/tcg/pts/tcg_pts_attr_dh_nonce_params_resp.c diff --git a/src/libpts/tcg/tcg_pts_attr_dh_nonce_params_resp.h b/src/libpts/tcg/pts/tcg_pts_attr_dh_nonce_params_resp.h index aaf85ef37..72046d2ed 100644 --- a/src/libpts/tcg/tcg_pts_attr_dh_nonce_params_resp.h +++ b/src/libpts/tcg/pts/tcg_pts_attr_dh_nonce_params_resp.h @@ -24,7 +24,7 @@ typedef struct tcg_pts_attr_dh_nonce_params_resp_t tcg_pts_attr_dh_nonce_params_resp_t; -#include "tcg_attr.h" +#include "tcg/tcg_attr.h" #include "pa_tnc/pa_tnc_attr.h" #include "pts/pts_dh_group.h" #include "pts/pts_meas_algo.h" diff --git a/src/libpts/tcg/tcg_pts_attr_file_meas.c b/src/libpts/tcg/pts/tcg_pts_attr_file_meas.c index b9095f5be..b9095f5be 100644 --- a/src/libpts/tcg/tcg_pts_attr_file_meas.c +++ b/src/libpts/tcg/pts/tcg_pts_attr_file_meas.c diff --git a/src/libpts/tcg/tcg_pts_attr_file_meas.h b/src/libpts/tcg/pts/tcg_pts_attr_file_meas.h index 8d50cd9c6..4f155f05b 100644 --- a/src/libpts/tcg/tcg_pts_attr_file_meas.h +++ b/src/libpts/tcg/pts/tcg_pts_attr_file_meas.h @@ -23,7 +23,7 @@ typedef struct tcg_pts_attr_file_meas_t tcg_pts_attr_file_meas_t; -#include "tcg_attr.h" +#include "tcg/tcg_attr.h" #include "pa_tnc/pa_tnc_attr.h" #include "pts/pts.h" #include "pts/pts_file_meas.h" diff --git a/src/libpts/tcg/tcg_pts_attr_gen_attest_evid.c b/src/libpts/tcg/pts/tcg_pts_attr_gen_attest_evid.c index f263747a3..f263747a3 100644 --- a/src/libpts/tcg/tcg_pts_attr_gen_attest_evid.c +++ b/src/libpts/tcg/pts/tcg_pts_attr_gen_attest_evid.c diff --git a/src/libpts/tcg/tcg_pts_attr_gen_attest_evid.h b/src/libpts/tcg/pts/tcg_pts_attr_gen_attest_evid.h index 88f070406..38909b025 100644 --- a/src/libpts/tcg/tcg_pts_attr_gen_attest_evid.h +++ b/src/libpts/tcg/pts/tcg_pts_attr_gen_attest_evid.h @@ -23,7 +23,7 @@ typedef struct tcg_pts_attr_gen_attest_evid_t tcg_pts_attr_gen_attest_evid_t; -#include "tcg_attr.h" +#include "tcg/tcg_attr.h" #include "pa_tnc/pa_tnc_attr.h" /** diff --git a/src/libpts/tcg/tcg_pts_attr_get_aik.c b/src/libpts/tcg/pts/tcg_pts_attr_get_aik.c index cf944d2a9..cf944d2a9 100644 --- a/src/libpts/tcg/tcg_pts_attr_get_aik.c +++ b/src/libpts/tcg/pts/tcg_pts_attr_get_aik.c diff --git a/src/libpts/tcg/tcg_pts_attr_get_aik.h b/src/libpts/tcg/pts/tcg_pts_attr_get_aik.h index aca890a20..120100e59 100644 --- a/src/libpts/tcg/tcg_pts_attr_get_aik.h +++ b/src/libpts/tcg/pts/tcg_pts_attr_get_aik.h @@ -23,7 +23,7 @@ typedef struct tcg_pts_attr_get_aik_t tcg_pts_attr_get_aik_t; -#include "tcg_attr.h" +#include "tcg/tcg_attr.h" #include "pa_tnc/pa_tnc_attr.h" /** diff --git a/src/libpts/tcg/tcg_pts_attr_get_tpm_version_info.c b/src/libpts/tcg/pts/tcg_pts_attr_get_tpm_version_info.c index 647c426ed..647c426ed 100644 --- a/src/libpts/tcg/tcg_pts_attr_get_tpm_version_info.c +++ b/src/libpts/tcg/pts/tcg_pts_attr_get_tpm_version_info.c diff --git a/src/libpts/tcg/tcg_pts_attr_get_tpm_version_info.h b/src/libpts/tcg/pts/tcg_pts_attr_get_tpm_version_info.h index 360049690..711a1d50c 100644 --- a/src/libpts/tcg/tcg_pts_attr_get_tpm_version_info.h +++ b/src/libpts/tcg/pts/tcg_pts_attr_get_tpm_version_info.h @@ -24,7 +24,7 @@ typedef struct tcg_pts_attr_get_tpm_version_info_t tcg_pts_attr_get_tpm_version_info_t; -#include "tcg_attr.h" +#include "tcg/tcg_attr.h" #include "pa_tnc/pa_tnc_attr.h" /** diff --git a/src/libpts/tcg/tcg_pts_attr_meas_algo.c b/src/libpts/tcg/pts/tcg_pts_attr_meas_algo.c index a4dac9070..a4dac9070 100644 --- a/src/libpts/tcg/tcg_pts_attr_meas_algo.c +++ b/src/libpts/tcg/pts/tcg_pts_attr_meas_algo.c diff --git a/src/libpts/tcg/tcg_pts_attr_meas_algo.h b/src/libpts/tcg/pts/tcg_pts_attr_meas_algo.h index 758100bbc..88d1be0aa 100644 --- a/src/libpts/tcg/tcg_pts_attr_meas_algo.h +++ b/src/libpts/tcg/pts/tcg_pts_attr_meas_algo.h @@ -23,7 +23,7 @@ typedef struct tcg_pts_attr_meas_algo_t tcg_pts_attr_meas_algo_t; -#include "tcg_attr.h" +#include "tcg/tcg_attr.h" #include "pts/pts_meas_algo.h" #include "pa_tnc/pa_tnc_attr.h" diff --git a/src/libpts/tcg/tcg_pts_attr_proto_caps.c b/src/libpts/tcg/pts/tcg_pts_attr_proto_caps.c index 6473ea808..6473ea808 100644 --- a/src/libpts/tcg/tcg_pts_attr_proto_caps.c +++ b/src/libpts/tcg/pts/tcg_pts_attr_proto_caps.c diff --git a/src/libpts/tcg/tcg_pts_attr_proto_caps.h b/src/libpts/tcg/pts/tcg_pts_attr_proto_caps.h index cc59f4ef1..c2478da0b 100644 --- a/src/libpts/tcg/tcg_pts_attr_proto_caps.h +++ b/src/libpts/tcg/pts/tcg_pts_attr_proto_caps.h @@ -23,7 +23,7 @@ typedef struct tcg_pts_attr_proto_caps_t tcg_pts_attr_proto_caps_t; -#include "tcg_attr.h" +#include "tcg/tcg_attr.h" #include "pa_tnc/pa_tnc_attr.h" #include "pts/pts_proto_caps.h" diff --git a/src/libpts/tcg/tcg_pts_attr_req_file_meas.c b/src/libpts/tcg/pts/tcg_pts_attr_req_file_meas.c index f0bc7cf60..f0bc7cf60 100644 --- a/src/libpts/tcg/tcg_pts_attr_req_file_meas.c +++ b/src/libpts/tcg/pts/tcg_pts_attr_req_file_meas.c diff --git a/src/libpts/tcg/tcg_pts_attr_req_file_meas.h b/src/libpts/tcg/pts/tcg_pts_attr_req_file_meas.h index 85a6b9a43..135c088bf 100644 --- a/src/libpts/tcg/tcg_pts_attr_req_file_meas.h +++ b/src/libpts/tcg/pts/tcg_pts_attr_req_file_meas.h @@ -23,7 +23,7 @@ typedef struct tcg_pts_attr_req_file_meas_t tcg_pts_attr_req_file_meas_t; -#include "tcg_attr.h" +#include "tcg/tcg_attr.h" #include "pa_tnc/pa_tnc_attr.h" /** diff --git a/src/libpts/tcg/tcg_pts_attr_req_file_meta.c b/src/libpts/tcg/pts/tcg_pts_attr_req_file_meta.c index e475cd35b..e475cd35b 100644 --- a/src/libpts/tcg/tcg_pts_attr_req_file_meta.c +++ b/src/libpts/tcg/pts/tcg_pts_attr_req_file_meta.c diff --git a/src/libpts/tcg/tcg_pts_attr_req_file_meta.h b/src/libpts/tcg/pts/tcg_pts_attr_req_file_meta.h index 311418be2..9aa1b93d6 100644 --- a/src/libpts/tcg/tcg_pts_attr_req_file_meta.h +++ b/src/libpts/tcg/pts/tcg_pts_attr_req_file_meta.h @@ -23,7 +23,7 @@ typedef struct tcg_pts_attr_req_file_meta_t tcg_pts_attr_req_file_meta_t; -#include "tcg_attr.h" +#include "tcg/tcg_attr.h" #include "pa_tnc/pa_tnc_attr.h" /** diff --git a/src/libpts/tcg/tcg_pts_attr_req_func_comp_evid.c b/src/libpts/tcg/pts/tcg_pts_attr_req_func_comp_evid.c index 5249fa2ad..5249fa2ad 100644 --- a/src/libpts/tcg/tcg_pts_attr_req_func_comp_evid.c +++ b/src/libpts/tcg/pts/tcg_pts_attr_req_func_comp_evid.c diff --git a/src/libpts/tcg/tcg_pts_attr_req_func_comp_evid.h b/src/libpts/tcg/pts/tcg_pts_attr_req_func_comp_evid.h index 749413c2e..2c0b8a974 100644 --- a/src/libpts/tcg/tcg_pts_attr_req_func_comp_evid.h +++ b/src/libpts/tcg/pts/tcg_pts_attr_req_func_comp_evid.h @@ -23,7 +23,7 @@ typedef struct tcg_pts_attr_req_func_comp_evid_t tcg_pts_attr_req_func_comp_evid_t; -#include "tcg_attr.h" +#include "tcg/tcg_attr.h" #include "pts/components/pts_comp_func_name.h" #include "pa_tnc/pa_tnc_attr.h" diff --git a/src/libpts/tcg/tcg_pts_attr_simple_comp_evid.c b/src/libpts/tcg/pts/tcg_pts_attr_simple_comp_evid.c index 40f380ab4..40f380ab4 100644 --- a/src/libpts/tcg/tcg_pts_attr_simple_comp_evid.c +++ b/src/libpts/tcg/pts/tcg_pts_attr_simple_comp_evid.c diff --git a/src/libpts/tcg/tcg_pts_attr_simple_comp_evid.h b/src/libpts/tcg/pts/tcg_pts_attr_simple_comp_evid.h index 494418261..628fad621 100644 --- a/src/libpts/tcg/tcg_pts_attr_simple_comp_evid.h +++ b/src/libpts/tcg/pts/tcg_pts_attr_simple_comp_evid.h @@ -23,7 +23,7 @@ typedef struct tcg_pts_attr_simple_comp_evid_t tcg_pts_attr_simple_comp_evid_t; -#include "tcg_attr.h" +#include "tcg/tcg_attr.h" #include "pts/components/pts_comp_evidence.h" #include "pa_tnc/pa_tnc_attr.h" diff --git a/src/libpts/tcg/tcg_pts_attr_simple_evid_final.c b/src/libpts/tcg/pts/tcg_pts_attr_simple_evid_final.c index baadd943f..baadd943f 100644 --- a/src/libpts/tcg/tcg_pts_attr_simple_evid_final.c +++ b/src/libpts/tcg/pts/tcg_pts_attr_simple_evid_final.c diff --git a/src/libpts/tcg/tcg_pts_attr_simple_evid_final.h b/src/libpts/tcg/pts/tcg_pts_attr_simple_evid_final.h index 6778afbdc..1fac2e1ce 100644 --- a/src/libpts/tcg/tcg_pts_attr_simple_evid_final.h +++ b/src/libpts/tcg/pts/tcg_pts_attr_simple_evid_final.h @@ -23,7 +23,7 @@ typedef struct tcg_pts_attr_simple_evid_final_t tcg_pts_attr_simple_evid_final_t; -#include "tcg_attr.h" +#include "tcg/tcg_attr.h" #include "tcg_pts_attr_meas_algo.h" #include "pa_tnc/pa_tnc_attr.h" diff --git a/src/libpts/tcg/tcg_pts_attr_tpm_version_info.c b/src/libpts/tcg/pts/tcg_pts_attr_tpm_version_info.c index b776cb662..b776cb662 100644 --- a/src/libpts/tcg/tcg_pts_attr_tpm_version_info.c +++ b/src/libpts/tcg/pts/tcg_pts_attr_tpm_version_info.c diff --git a/src/libpts/tcg/tcg_pts_attr_tpm_version_info.h b/src/libpts/tcg/pts/tcg_pts_attr_tpm_version_info.h index 4ac18fb9e..e03b57f79 100644 --- a/src/libpts/tcg/tcg_pts_attr_tpm_version_info.h +++ b/src/libpts/tcg/pts/tcg_pts_attr_tpm_version_info.h @@ -23,7 +23,7 @@ typedef struct tcg_pts_attr_tpm_version_info_t tcg_pts_attr_tpm_version_info_t; -#include "tcg_attr.h" +#include "tcg/tcg_attr.h" #include "pa_tnc/pa_tnc_attr.h" /** diff --git a/src/libpts/tcg/tcg_pts_attr_unix_file_meta.c b/src/libpts/tcg/pts/tcg_pts_attr_unix_file_meta.c index f96371b8b..f96371b8b 100644 --- a/src/libpts/tcg/tcg_pts_attr_unix_file_meta.c +++ b/src/libpts/tcg/pts/tcg_pts_attr_unix_file_meta.c diff --git a/src/libpts/tcg/tcg_pts_attr_unix_file_meta.h b/src/libpts/tcg/pts/tcg_pts_attr_unix_file_meta.h index ad9794b45..2118d3920 100644 --- a/src/libpts/tcg/tcg_pts_attr_unix_file_meta.h +++ b/src/libpts/tcg/pts/tcg_pts_attr_unix_file_meta.h @@ -23,7 +23,7 @@ typedef struct tcg_pts_attr_file_meta_t tcg_pts_attr_file_meta_t; -#include "tcg_attr.h" +#include "tcg/tcg_attr.h" #include "pa_tnc/pa_tnc_attr.h" #include "pts/pts.h" #include "pts/pts_file_meta.h" diff --git a/src/libpts/tcg/swid/tcg_swid_attr_req.c b/src/libpts/tcg/swid/tcg_swid_attr_req.c new file mode 100644 index 000000000..b8e7962c1 --- /dev/null +++ b/src/libpts/tcg/swid/tcg_swid_attr_req.c @@ -0,0 +1,329 @@ +/* + * Copyright (C) 2013 Andreas Steffen + * HSR Hochschule fuer Technik Rapperswil + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + */ + +#include "tcg_swid_attr_req.h" + +#include "swid/swid_tag_id.h" + +#include <pa_tnc/pa_tnc_msg.h> +#include <bio/bio_writer.h> +#include <bio/bio_reader.h> +#include <utils/debug.h> +#include <collections/linked_list.h> + +typedef struct private_tcg_swid_attr_req_t private_tcg_swid_attr_req_t; + +/** + * SWID Request + * see section 4.7 of TCG TNC SWID Message and Attributes for IF-M + * + * 1 2 3 + * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * |Reserved |C|S|R| Tag ID Count | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | Request ID | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | Earliest EID | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | Tag Creator Length | Tag Creator (variable length) | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | Unique Software ID Length |Unique Software ID (var length)| + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + */ + +#define SWID_REQ_SIZE 12 +#define SWID_REQ_RESERVED_MASK 0x03 + +/** + * Private data of an tcg_swid_attr_req_t object. + */ +struct private_tcg_swid_attr_req_t { + + /** + * Public members of tcg_swid_attr_req_t + */ + tcg_swid_attr_req_t public; + + /** + * Vendor-specific attribute type + */ + pen_type_t type; + + /** + * Attribute value + */ + chunk_t value; + + /** + * Noskip flag + */ + bool noskip_flag; + + /** + * SWID request flags + */ + u_int8_t flags; + + /** + * Request ID + */ + u_int32_t request_id; + + /** + * Earliest EID + */ + u_int32_t earliest_eid; + + /** + * List of Target Tag Identifiers + */ + swid_inventory_t *targets; + + /** + * Reference count + */ + refcount_t ref; +}; + +METHOD(pa_tnc_attr_t, get_type, pen_type_t, + private_tcg_swid_attr_req_t *this) +{ + return this->type; +} + +METHOD(pa_tnc_attr_t, get_value, chunk_t, + private_tcg_swid_attr_req_t *this) +{ + return this->value; +} + +METHOD(pa_tnc_attr_t, get_noskip_flag, bool, + private_tcg_swid_attr_req_t *this) +{ + return this->noskip_flag; +} + +METHOD(pa_tnc_attr_t, set_noskip_flag,void, + private_tcg_swid_attr_req_t *this, bool noskip) +{ + this->noskip_flag = noskip; +} + +METHOD(pa_tnc_attr_t, build, void, + private_tcg_swid_attr_req_t *this) +{ + bio_writer_t *writer; + chunk_t tag_creator, unique_sw_id; + swid_tag_id_t *tag_id; + enumerator_t *enumerator; + + if (this->value.ptr) + { + return; + } + + writer = bio_writer_create(SWID_REQ_SIZE); + writer->write_uint8 (writer, this->flags); + writer->write_uint24(writer, this->targets->get_count(this->targets)); + writer->write_uint32(writer, this->request_id); + writer->write_uint32(writer, this->earliest_eid); + + enumerator = this->targets->create_enumerator(this->targets); + while (enumerator->enumerate(enumerator, &tag_id)) + { + tag_creator = tag_id->get_tag_creator(tag_id); + unique_sw_id = tag_id->get_unique_sw_id(tag_id, NULL); + writer->write_data16(writer, tag_creator); + writer->write_data16(writer, unique_sw_id); + } + enumerator->destroy(enumerator); + + this->value = writer->extract_buf(writer); + writer->destroy(writer); +} + +METHOD(pa_tnc_attr_t, process, status_t, + private_tcg_swid_attr_req_t *this, u_int32_t *offset) +{ + bio_reader_t *reader; + u_int32_t tag_id_count; + chunk_t tag_creator, unique_sw_id; + swid_tag_id_t *tag_id; + + if (this->value.len < SWID_REQ_SIZE) + { + DBG1(DBG_TNC, "insufficient data for SWID Request"); + *offset = 0; + return FAILED; + } + + reader = bio_reader_create(this->value); + reader->read_uint8 (reader, &this->flags); + reader->read_uint24(reader, &tag_id_count); + reader->read_uint32(reader, &this->request_id); + reader->read_uint32(reader, &this->earliest_eid); + + if (this->request_id == 0) + { + *offset = 4; + return FAILED; + } + *offset = SWID_REQ_SIZE; + + this->flags &= SWID_REQ_RESERVED_MASK; + + while (tag_id_count--) + { + if (!reader->read_data16(reader, &tag_creator)) + { + DBG1(DBG_TNC, "insufficient data for Tag Creator field"); + return FAILED; + } + *offset += 2 + tag_creator.len; + + if (!reader->read_data16(reader, &unique_sw_id)) + { + DBG1(DBG_TNC, "insufficient data for Unique Software ID"); + return FAILED; + } + *offset += 2 + unique_sw_id.len; + + tag_id = swid_tag_id_create(tag_creator, unique_sw_id, chunk_empty); + this->targets->add(this->targets, tag_id); + } + reader->destroy(reader); + + return SUCCESS; +} + +METHOD(pa_tnc_attr_t, get_ref, pa_tnc_attr_t*, + private_tcg_swid_attr_req_t *this) +{ + ref_get(&this->ref); + return &this->public.pa_tnc_attribute; +} + +METHOD(pa_tnc_attr_t, destroy, void, + private_tcg_swid_attr_req_t *this) +{ + if (ref_put(&this->ref)) + { + this->targets->destroy(this->targets); + free(this->value.ptr); + free(this); + } +} + +METHOD(tcg_swid_attr_req_t, get_flags, u_int8_t, + private_tcg_swid_attr_req_t *this) +{ + return this->flags; +} + +METHOD(tcg_swid_attr_req_t, get_request_id, u_int32_t, + private_tcg_swid_attr_req_t *this) +{ + return this->request_id; +} + +METHOD(tcg_swid_attr_req_t, get_earliest_eid, u_int32_t, + private_tcg_swid_attr_req_t *this) +{ + return this->earliest_eid; +} + +METHOD(tcg_swid_attr_req_t, add_target, void, + private_tcg_swid_attr_req_t *this, swid_tag_id_t *tag_id) +{ + this->targets->add(this->targets, tag_id); +} + +METHOD(tcg_swid_attr_req_t, get_targets, swid_inventory_t*, + private_tcg_swid_attr_req_t *this) +{ + return this->targets; +} + +/** + * Described in header. + */ +pa_tnc_attr_t *tcg_swid_attr_req_create(u_int8_t flags, u_int32_t request_id, + u_int32_t eid) +{ + private_tcg_swid_attr_req_t *this; + + INIT(this, + .public = { + .pa_tnc_attribute = { + .get_type = _get_type, + .get_value = _get_value, + .get_noskip_flag = _get_noskip_flag, + .set_noskip_flag = _set_noskip_flag, + .build = _build, + .process = _process, + .get_ref = _get_ref, + .destroy = _destroy, + }, + .get_flags = _get_flags, + .get_request_id = _get_request_id, + .get_earliest_eid = _get_earliest_eid, + .add_target = _add_target, + .get_targets = _get_targets, + }, + .type = { PEN_TCG, TCG_SWID_REQUEST }, + .flags = flags & SWID_REQ_RESERVED_MASK, + .request_id = request_id, + .earliest_eid = eid, + .targets = swid_inventory_create(FALSE), + .ref = 1, + ); + + return &this->public.pa_tnc_attribute; +} + +/** + * Described in header. + */ +pa_tnc_attr_t *tcg_swid_attr_req_create_from_data(chunk_t data) +{ + private_tcg_swid_attr_req_t *this; + + INIT(this, + .public = { + .pa_tnc_attribute = { + .get_type = _get_type, + .get_value = _get_value, + .get_noskip_flag = _get_noskip_flag, + .set_noskip_flag = _set_noskip_flag, + .build = _build, + .process = _process, + .get_ref = _get_ref, + .destroy = _destroy, + }, + .get_flags = _get_flags, + .get_request_id = _get_request_id, + .get_earliest_eid = _get_earliest_eid, + .add_target = _add_target, + .get_targets = _get_targets, + }, + .type = { PEN_TCG, TCG_SWID_REQUEST }, + .value = chunk_clone(data), + .targets = swid_inventory_create(FALSE), + .ref = 1, + ); + + return &this->public.pa_tnc_attribute; +} diff --git a/src/libpts/tcg/swid/tcg_swid_attr_req.h b/src/libpts/tcg/swid/tcg_swid_attr_req.h new file mode 100644 index 000000000..851b68d3b --- /dev/null +++ b/src/libpts/tcg/swid/tcg_swid_attr_req.h @@ -0,0 +1,103 @@ +/* + * Copyright (C) 2013 Andreas Steffen + * HSR Hochschule fuer Technik Rapperswil + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + */ + +/** + * @defgroup tcg_swid_attr_req tcg_swid_attr_req + * @{ @ingroup tcg_attr + */ + +#ifndef TCG_SWID_ATTR_REQ_H_ +#define TCG_SWID_ATTR_REQ_H_ + +typedef struct tcg_swid_attr_req_t tcg_swid_attr_req_t; +typedef enum tcg_swid_attr_req_flag_t tcg_swid_attr_req_flag_t; + +enum tcg_swid_attr_req_flag_t { + TCG_SWID_ATTR_REQ_FLAG_NONE = 0, + TCG_SWID_ATTR_REQ_FLAG_R = (1 << 0), + TCG_SWID_ATTR_REQ_FLAG_S = (1 << 1), + TCG_SWID_ATTR_REQ_FLAG_C = (1 << 2) +}; + +#include "tcg/tcg_attr.h" +#include "swid/swid_tag_id.h" +#include "swid/swid_inventory.h" +#include "pa_tnc/pa_tnc_attr.h" + +/** + * Class implementing the TCG SWID Request attribute + */ +struct tcg_swid_attr_req_t { + + /** + * Public PA-TNC attribute interface + */ + pa_tnc_attr_t pa_tnc_attribute; + + /** + * Get SWID request flags + * + * @return Flags + */ + u_int8_t (*get_flags)(tcg_swid_attr_req_t *this); + + /** + * Get Request ID + * + * @return Request ID + */ + u_int32_t (*get_request_id)(tcg_swid_attr_req_t *this); + + /** + * Get Earliest EID + * + * @return Event ID + */ + u_int32_t (*get_earliest_eid)(tcg_swid_attr_req_t *this); + + /** + * Add Tag ID + * + * @param tag_id SWID Tag ID (is not cloned by constructor!) + */ + void (*add_target)(tcg_swid_attr_req_t *this, swid_tag_id_t *tag_id); + + /** + * Create Tag ID enumerator + * + * @return Get a list of target tag IDs + */ + swid_inventory_t* (*get_targets)(tcg_swid_attr_req_t *this); + +}; + +/** + * Creates an tcg_swid_attr_req_t object + * + * @param flags Sets the C|S|R flags + * @param request_id Request ID + * @param eid Earliest Event ID + */ +pa_tnc_attr_t* tcg_swid_attr_req_create(u_int8_t flags, u_int32_t request_id, + u_int32_t eid); + +/** + * Creates an tcg_swid_attr_req_t object from received data + * + * @param value unparsed attribute value + */ +pa_tnc_attr_t* tcg_swid_attr_req_create_from_data(chunk_t value); + +#endif /** TCG_SWID_ATTR_REQ_H_ @}*/ diff --git a/src/libpts/tcg/swid/tcg_swid_attr_tag_id_inv.c b/src/libpts/tcg/swid/tcg_swid_attr_tag_id_inv.c new file mode 100644 index 000000000..429919edd --- /dev/null +++ b/src/libpts/tcg/swid/tcg_swid_attr_tag_id_inv.c @@ -0,0 +1,325 @@ +/* + * Copyright (C) 2013 Andreas Steffen + * HSR Hochschule fuer Technik Rapperswil + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + */ + +#include "tcg_swid_attr_tag_id_inv.h" + +#include <pa_tnc/pa_tnc_msg.h> +#include <bio/bio_writer.h> +#include <bio/bio_reader.h> +#include <utils/debug.h> + + +typedef struct private_tcg_swid_attr_tag_id_inv_t private_tcg_swid_attr_tag_id_inv_t; + +/** + * SWID Tag Identifier Inventory + * see section 4.8 of TCG TNC SWID Message and Attributes for IF-M + * + * 1 2 3 + * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | Reserved | Tag ID Count | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | Request ID Copy | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | EID Epoch | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | Last EID | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | Tag Creator Length | Tag Creator (variable length) | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | Unique Software ID Length |Unique Software ID (var length)| + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | Unique Sequence ID Length |Unique Sequence ID (var length)| + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + */ + +#define SWID_TAG_ID_INV_SIZE 16 +#define SWID_TAG_ID_INV_RESERVED 0x00 + +/** + * Private data of an tcg_swid_attr_tag_id_inv_t object. + */ +struct private_tcg_swid_attr_tag_id_inv_t { + + /** + * Public members of tcg_swid_attr_tag_id_inv_t + */ + tcg_swid_attr_tag_id_inv_t public; + + /** + * Vendor-specific attribute type + */ + pen_type_t type; + + /** + * Attribute value + */ + chunk_t value; + + /** + * Noskip flag + */ + bool noskip_flag; + + /** + * Request ID + */ + u_int32_t request_id; + + /** + * Event ID Epoch + */ + u_int32_t eid_epoch; + + /** + * Last Event ID + */ + u_int32_t last_eid; + + /** + * SWID Tag ID Inventory + */ + swid_inventory_t *inventory; + + /** + * Reference count + */ + refcount_t ref; +}; + +METHOD(pa_tnc_attr_t, get_type, pen_type_t, + private_tcg_swid_attr_tag_id_inv_t *this) +{ + return this->type; +} + +METHOD(pa_tnc_attr_t, get_value, chunk_t, + private_tcg_swid_attr_tag_id_inv_t *this) +{ + return this->value; +} + +METHOD(pa_tnc_attr_t, get_noskip_flag, bool, + private_tcg_swid_attr_tag_id_inv_t *this) +{ + return this->noskip_flag; +} + +METHOD(pa_tnc_attr_t, set_noskip_flag,void, + private_tcg_swid_attr_tag_id_inv_t *this, bool noskip) +{ + this->noskip_flag = noskip; +} + +METHOD(pa_tnc_attr_t, build, void, + private_tcg_swid_attr_tag_id_inv_t *this) +{ + bio_writer_t *writer; + swid_tag_id_t *tag_id; + chunk_t tag_creator, unique_sw_id, unique_seq_id; + enumerator_t *enumerator; + + if (this->value.ptr) + { + return; + } + + writer = bio_writer_create(SWID_TAG_ID_INV_SIZE); + writer->write_uint8 (writer, SWID_TAG_ID_INV_RESERVED); + writer->write_uint24(writer, this->inventory->get_count(this->inventory)); + writer->write_uint32(writer, this->request_id); + writer->write_uint32(writer, this->eid_epoch); + writer->write_uint32(writer, this->last_eid); + + enumerator = this->inventory->create_enumerator(this->inventory); + while (enumerator->enumerate(enumerator, &tag_id)) + { + tag_creator = tag_id->get_tag_creator(tag_id); + unique_sw_id = tag_id->get_unique_sw_id(tag_id, &unique_seq_id); + writer->write_data16(writer, tag_creator); + writer->write_data16(writer, unique_sw_id); + writer->write_data16(writer, unique_seq_id); + } + enumerator->destroy(enumerator); + + this->value = writer->extract_buf(writer); + writer->destroy(writer); +} + +METHOD(pa_tnc_attr_t, process, status_t, + private_tcg_swid_attr_tag_id_inv_t *this, u_int32_t *offset) +{ + bio_reader_t *reader; + u_int32_t tag_id_count; + u_int8_t reserved; + chunk_t tag_creator, unique_sw_id, unique_seq_id; + swid_tag_id_t *tag_id; + + if (this->value.len < SWID_TAG_ID_INV_SIZE) + { + DBG1(DBG_TNC, "insufficient data for SWID Tag Identifier Inventory"); + *offset = 0; + return FAILED; + } + + reader = bio_reader_create(this->value); + reader->read_uint8 (reader, &reserved); + reader->read_uint24(reader, &tag_id_count); + reader->read_uint32(reader, &this->request_id); + reader->read_uint32(reader, &this->eid_epoch); + reader->read_uint32(reader, &this->last_eid); + *offset = SWID_TAG_ID_INV_SIZE; + + while (tag_id_count--) + { + if (!reader->read_data16(reader, &tag_creator)) + { + DBG1(DBG_TNC, "insufficient data for Tag Creator field"); + return FAILED; + } + *offset += 2 + tag_creator.len; + + if (!reader->read_data16(reader, &unique_sw_id)) + { + DBG1(DBG_TNC, "insufficient data for Unique Software ID"); + return FAILED; + } + *offset += 2 + unique_sw_id.len; + + if (!reader->read_data16(reader, &unique_seq_id)) + { + DBG1(DBG_TNC, "insufficient data for Unique Sequence ID"); + return FAILED; + } + *offset += 2 + unique_seq_id.len; + + tag_id = swid_tag_id_create(tag_creator, unique_sw_id, unique_seq_id); + this->inventory->add(this->inventory, tag_id); + } + reader->destroy(reader); + + return SUCCESS; +} + +METHOD(pa_tnc_attr_t, get_ref, pa_tnc_attr_t*, + private_tcg_swid_attr_tag_id_inv_t *this) +{ + ref_get(&this->ref); + return &this->public.pa_tnc_attribute; +} + +METHOD(pa_tnc_attr_t, destroy, void, + private_tcg_swid_attr_tag_id_inv_t *this) +{ + if (ref_put(&this->ref)) + { + this->inventory->destroy(this->inventory); + free(this->value.ptr); + free(this); + } +} + +METHOD(tcg_swid_attr_tag_id_inv_t, get_request_id, u_int32_t, + private_tcg_swid_attr_tag_id_inv_t *this) +{ + return this->request_id; +} + +METHOD(tcg_swid_attr_tag_id_inv_t, get_last_eid, u_int32_t, + private_tcg_swid_attr_tag_id_inv_t *this, u_int32_t *eid_epoch) +{ + if (eid_epoch) + { + *eid_epoch = this->eid_epoch; + } + return this->last_eid; +} + +METHOD(tcg_swid_attr_tag_id_inv_t, get_inventory, swid_inventory_t*, + private_tcg_swid_attr_tag_id_inv_t *this) +{ + return this->inventory; +} + +/** + * Described in header. + */ +pa_tnc_attr_t *tcg_swid_attr_tag_id_inv_create(u_int32_t request_id, + u_int32_t eid_epoch, + u_int32_t eid, + swid_inventory_t *inventory) +{ + private_tcg_swid_attr_tag_id_inv_t *this; + + INIT(this, + .public = { + .pa_tnc_attribute = { + .get_type = _get_type, + .get_value = _get_value, + .get_noskip_flag = _get_noskip_flag, + .set_noskip_flag = _set_noskip_flag, + .build = _build, + .process = _process, + .get_ref = _get_ref, + .destroy = _destroy, + }, + .get_request_id = _get_request_id, + .get_last_eid = _get_last_eid, + .get_inventory = _get_inventory, + }, + .type = { PEN_TCG, TCG_SWID_TAG_ID_INVENTORY }, + .request_id = request_id, + .eid_epoch = eid_epoch, + .last_eid = eid, + .inventory = inventory, + .ref = 1, + ); + + return &this->public.pa_tnc_attribute; +} + + +/** + * Described in header. + */ +pa_tnc_attr_t *tcg_swid_attr_tag_id_inv_create_from_data(chunk_t data) +{ + private_tcg_swid_attr_tag_id_inv_t *this; + + INIT(this, + .public = { + .pa_tnc_attribute = { + .get_type = _get_type, + .get_value = _get_value, + .get_noskip_flag = _get_noskip_flag, + .set_noskip_flag = _set_noskip_flag, + .build = _build, + .process = _process, + .get_ref = _get_ref, + .destroy = _destroy, + }, + .get_request_id = _get_request_id, + .get_last_eid = _get_last_eid, + .get_inventory = _get_inventory, + }, + .type = { PEN_TCG, TCG_SWID_TAG_ID_INVENTORY }, + .value = chunk_clone(data), + .inventory = swid_inventory_create(FALSE), + .ref = 1, + ); + + return &this->public.pa_tnc_attribute; +} diff --git a/src/libpts/tcg/swid/tcg_swid_attr_tag_id_inv.h b/src/libpts/tcg/swid/tcg_swid_attr_tag_id_inv.h new file mode 100644 index 000000000..1a0cbe7d2 --- /dev/null +++ b/src/libpts/tcg/swid/tcg_swid_attr_tag_id_inv.h @@ -0,0 +1,88 @@ +/* + * Copyright (C) 2013 Andreas Steffen + * HSR Hochschule fuer Technik Rapperswil + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + */ + +/** + * @defgroup tcg_swid_attr_tag_id_inv tcg_swid_attr_tag_id_inv + * @{ @ingroup tcg_attr + */ + +#ifndef TCG_SWID_ATTR_TAG_ID_INV_H_ +#define TCG_SWID_ATTR_TAG_ID_INV_H_ + +typedef struct tcg_swid_attr_tag_id_inv_t tcg_swid_attr_tag_id_inv_t; + +#include "tcg/tcg_attr.h" +#include "swid/swid_tag_id.h" +#include "swid/swid_inventory.h" + +#include <pa_tnc/pa_tnc_attr.h> + +/** + * Class implementing the TCG SWID Tag Identifier Inventory attribute + * + */ +struct tcg_swid_attr_tag_id_inv_t { + + /** + * Public PA-TNC attribute interface + */ + pa_tnc_attr_t pa_tnc_attribute; + + /** + * Get Request ID + * + * @return Request ID + */ + u_int32_t (*get_request_id)(tcg_swid_attr_tag_id_inv_t *this); + + /** + * Get Last Event ID + * + * @param eid_epoch Event ID Epoch + * @return Last Event ID + */ + u_int32_t (*get_last_eid)(tcg_swid_attr_tag_id_inv_t *this, + u_int32_t *eid_epoch); + + /** + * Get Inventory of SWID tag IDs + * + * @result SWID Tag ID Inventory + */ + swid_inventory_t* (*get_inventory)(tcg_swid_attr_tag_id_inv_t *this); + +}; + +/** + * Creates an tcg_swid_attr_tag_id_inv_t object + * + * @param request_id Copy of the Request ID + * @param eid_epoch Event ID Epoch + * @param eid Last Event ID + * @param inventory SWID Tag Inventory + */ +pa_tnc_attr_t* tcg_swid_attr_tag_id_inv_create(u_int32_t request_id, + u_int32_t eid_epoch, + u_int32_t eid, + swid_inventory_t *inventory); + +/** + * Creates an tcg_swid_attr_tag_id_inv_t object from received data + * + * @param value unparsed attribute value + */ +pa_tnc_attr_t* tcg_swid_attr_tag_id_inv_create_from_data(chunk_t value); + +#endif /** TCG_SWID_ATTR_TAG_ID_INV_H_ @}*/ diff --git a/src/libpts/tcg/swid/tcg_swid_attr_tag_inv.c b/src/libpts/tcg/swid/tcg_swid_attr_tag_inv.c new file mode 100644 index 000000000..82b9ef958 --- /dev/null +++ b/src/libpts/tcg/swid/tcg_swid_attr_tag_inv.c @@ -0,0 +1,313 @@ +/* + * Copyright (C) 2013 Andreas Steffen + * HSR Hochschule fuer Technik Rapperswil + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + */ + +#include "tcg_swid_attr_tag_inv.h" + +#include <pa_tnc/pa_tnc_msg.h> +#include <bio/bio_writer.h> +#include <bio/bio_reader.h> +#include <utils/debug.h> + + +typedef struct private_tcg_swid_attr_tag_inv_t private_tcg_swid_attr_tag_inv_t; + +/** + * SWID Tag Inventory + * see section 4.10 of TCG TNC SWID Message and Attributes for IF-M + * + * 1 2 3 + * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | Reserved | Tag ID Count | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | Request ID Copy | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | EID Epoch | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | Last EID | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | Unique Sequence ID Length |Unique Sequence ID (var length)| + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | Tag Length | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | Tag (Variable) | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + */ + +#define SWID_TAG_INV_SIZE 16 +#define SWID_TAG_INV_RESERVED 0x00 + +/** + * Private data of an tcg_swid_attr_tag_inv_t object. + */ +struct private_tcg_swid_attr_tag_inv_t { + + /** + * Public members of tcg_swid_attr_tag_inv_t + */ + tcg_swid_attr_tag_inv_t public; + + /** + * Vendor-specific attribute type + */ + pen_type_t type; + + /** + * Attribute value + */ + chunk_t value; + + /** + * Noskip flag + */ + bool noskip_flag; + + /** + * Request ID + */ + u_int32_t request_id; + + /** + * Event ID Epoch + */ + u_int32_t eid_epoch; + + /** + * Last Event ID + */ + u_int32_t last_eid; + + /** + * SWID Tag Inventory + */ + swid_inventory_t *inventory; + + /** + * Reference count + */ + refcount_t ref; +}; + +METHOD(pa_tnc_attr_t, get_type, pen_type_t, + private_tcg_swid_attr_tag_inv_t *this) +{ + return this->type; +} + +METHOD(pa_tnc_attr_t, get_value, chunk_t, + private_tcg_swid_attr_tag_inv_t *this) +{ + return this->value; +} + +METHOD(pa_tnc_attr_t, get_noskip_flag, bool, + private_tcg_swid_attr_tag_inv_t *this) +{ + return this->noskip_flag; +} + +METHOD(pa_tnc_attr_t, set_noskip_flag,void, + private_tcg_swid_attr_tag_inv_t *this, bool noskip) +{ + this->noskip_flag = noskip; +} + +METHOD(pa_tnc_attr_t, build, void, + private_tcg_swid_attr_tag_inv_t *this) +{ + bio_writer_t *writer; + swid_tag_t *tag; + enumerator_t *enumerator; + + if (this->value.ptr) + { + return; + } + + writer = bio_writer_create(SWID_TAG_INV_SIZE); + writer->write_uint8 (writer, SWID_TAG_INV_RESERVED); + writer->write_uint24(writer, this->inventory->get_count(this->inventory)); + writer->write_uint32(writer, this->request_id); + writer->write_uint32(writer, this->eid_epoch); + writer->write_uint32(writer, this->last_eid); + + enumerator = this->inventory->create_enumerator(this->inventory); + while (enumerator->enumerate(enumerator, &tag)) + { + writer->write_data16(writer, tag->get_unique_seq_id(tag)); + writer->write_data32(writer, tag->get_encoding(tag)); + } + enumerator->destroy(enumerator); + + this->value = writer->extract_buf(writer); + writer->destroy(writer); +} + +METHOD(pa_tnc_attr_t, process, status_t, + private_tcg_swid_attr_tag_inv_t *this, u_int32_t *offset) +{ + bio_reader_t *reader; + u_int32_t tag_count; + u_int8_t reserved; + chunk_t tag_encoding, unique_seq_id; + swid_tag_t *tag; + + if (this->value.len < SWID_TAG_INV_SIZE) + { + DBG1(DBG_TNC, "insufficient data for SWID Tag Inventory"); + *offset = 0; + return FAILED; + } + + reader = bio_reader_create(this->value); + reader->read_uint8 (reader, &reserved); + reader->read_uint24(reader, &tag_count); + reader->read_uint32(reader, &this->request_id); + reader->read_uint32(reader, &this->eid_epoch); + reader->read_uint32(reader, &this->last_eid); + *offset = SWID_TAG_INV_SIZE; + + while (tag_count--) + { + if (!reader->read_data16(reader, &unique_seq_id)) + { + DBG1(DBG_TNC, "insufficient data for Unique Sequence ID"); + return FAILED; + } + *offset += 2 + unique_seq_id.len; + + if (!reader->read_data32(reader, &tag_encoding)) + { + DBG1(DBG_TNC, "insufficient data for Tag"); + return FAILED; + } + *offset += 4 + tag_encoding.len; + + tag = swid_tag_create(tag_encoding, unique_seq_id); + this->inventory->add(this->inventory, tag); + } + reader->destroy(reader); + + return SUCCESS; +} + +METHOD(pa_tnc_attr_t, get_ref, pa_tnc_attr_t*, + private_tcg_swid_attr_tag_inv_t *this) +{ + ref_get(&this->ref); + return &this->public.pa_tnc_attribute; +} + +METHOD(pa_tnc_attr_t, destroy, void, + private_tcg_swid_attr_tag_inv_t *this) +{ + if (ref_put(&this->ref)) + { + this->inventory->destroy(this->inventory); + free(this->value.ptr); + free(this); + } +} + +METHOD(tcg_swid_attr_tag_inv_t, get_request_id, u_int32_t, + private_tcg_swid_attr_tag_inv_t *this) +{ + return this->request_id; +} + +METHOD(tcg_swid_attr_tag_inv_t, get_last_eid, u_int32_t, + private_tcg_swid_attr_tag_inv_t *this, u_int32_t *eid_epoch) +{ + if (eid_epoch) + { + *eid_epoch = this->eid_epoch; + } + return this->last_eid; +} + +METHOD(tcg_swid_attr_tag_inv_t, get_inventory, swid_inventory_t*, + private_tcg_swid_attr_tag_inv_t *this) +{ + return this->inventory; +} + +/** + * Described in header. + */ +pa_tnc_attr_t *tcg_swid_attr_tag_inv_create(u_int32_t request_id, + u_int32_t eid_epoch, u_int32_t eid, + swid_inventory_t *inventory) +{ + private_tcg_swid_attr_tag_inv_t *this; + + INIT(this, + .public = { + .pa_tnc_attribute = { + .get_type = _get_type, + .get_value = _get_value, + .get_noskip_flag = _get_noskip_flag, + .set_noskip_flag = _set_noskip_flag, + .build = _build, + .process = _process, + .get_ref = _get_ref, + .destroy = _destroy, + }, + .get_request_id = _get_request_id, + .get_last_eid = _get_last_eid, + .get_inventory = _get_inventory, + }, + .type = { PEN_TCG, TCG_SWID_TAG_INVENTORY }, + .request_id = request_id, + .eid_epoch = eid_epoch, + .last_eid = eid, + .inventory = inventory, + .ref = 1, + ); + + return &this->public.pa_tnc_attribute; +} + + +/** + * Described in header. + */ +pa_tnc_attr_t *tcg_swid_attr_tag_inv_create_from_data(chunk_t data) +{ + private_tcg_swid_attr_tag_inv_t *this; + + INIT(this, + .public = { + .pa_tnc_attribute = { + .get_type = _get_type, + .get_value = _get_value, + .get_noskip_flag = _get_noskip_flag, + .set_noskip_flag = _set_noskip_flag, + .build = _build, + .process = _process, + .get_ref = _get_ref, + .destroy = _destroy, + }, + .get_request_id = _get_request_id, + .get_last_eid = _get_last_eid, + .get_inventory = _get_inventory, + }, + .type = { PEN_TCG, TCG_SWID_TAG_INVENTORY }, + .value = chunk_clone(data), + .inventory = swid_inventory_create(TRUE), + .ref = 1, + ); + + return &this->public.pa_tnc_attribute; +} diff --git a/src/libpts/tcg/swid/tcg_swid_attr_tag_inv.h b/src/libpts/tcg/swid/tcg_swid_attr_tag_inv.h new file mode 100644 index 000000000..433f55ee0 --- /dev/null +++ b/src/libpts/tcg/swid/tcg_swid_attr_tag_inv.h @@ -0,0 +1,88 @@ +/* + * Copyright (C) 2013 Andreas Steffen + * HSR Hochschule fuer Technik Rapperswil + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + */ + +/** + * @defgroup tcg_swid_attr_tag_inv tcg_swid_attr_tag_inv + * @{ @ingroup tcg_attr + */ + +#ifndef TCG_SWID_ATTR_TAG_INV_H_ +#define TCG_SWID_ATTR_TAG_INV_H_ + +typedef struct tcg_swid_attr_tag_inv_t tcg_swid_attr_tag_inv_t; + +#include "tcg/tcg_attr.h" +#include "swid/swid_tag.h" +#include "swid/swid_inventory.h" + +#include <pa_tnc/pa_tnc_attr.h> + +/** + * Class implementing the TCG SWID Tag Inventory attribute + * + */ +struct tcg_swid_attr_tag_inv_t { + + /** + * Public PA-TNC attribute interface + */ + pa_tnc_attr_t pa_tnc_attribute; + + /** + * Get Request ID + * + * @return Request ID + */ + u_int32_t (*get_request_id)(tcg_swid_attr_tag_inv_t *this); + + /** + * Get Last Event ID + * + * @param eid_epoch Event ID Epoch + * @return Last Event ID + */ + u_int32_t (*get_last_eid)(tcg_swid_attr_tag_inv_t *this, + u_int32_t *eid_epoch); + + /** + * Get Inventory of SWID tags + * + * @result SWID Tag Inventory + */ + swid_inventory_t* (*get_inventory)(tcg_swid_attr_tag_inv_t *this); + +}; + +/** + * Creates an tcg_swid_attr_tag_inv_t object + * + * @param request_id Copy of the Request ID + * @param eid_epoch Event ID Epoch + * @param eid Last Event ID + * @param inventory SWID Tag Inventory + */ +pa_tnc_attr_t* tcg_swid_attr_tag_inv_create(u_int32_t request_id, + u_int32_t eid_epoch, + u_int32_t eid, + swid_inventory_t *inventory); + +/** + * Creates an tcg_swid_attr_tag_inv_t object from received data + * + * @param value unparsed attribute value + */ +pa_tnc_attr_t* tcg_swid_attr_tag_inv_create_from_data(chunk_t value); + +#endif /** TCG_SWID_ATTR_TAG_INV_H_ @}*/ diff --git a/src/libpts/tcg/tcg_attr.c b/src/libpts/tcg/tcg_attr.c index b91bf8283..f9c6c46cf 100644 --- a/src/libpts/tcg/tcg_attr.c +++ b/src/libpts/tcg/tcg_attr.c @@ -13,23 +13,26 @@ */ #include "tcg_attr.h" -#include "tcg/tcg_pts_attr_proto_caps.h" -#include "tcg/tcg_pts_attr_dh_nonce_params_req.h" -#include "tcg/tcg_pts_attr_dh_nonce_params_resp.h" -#include "tcg/tcg_pts_attr_dh_nonce_finish.h" -#include "tcg/tcg_pts_attr_meas_algo.h" -#include "tcg/tcg_pts_attr_get_tpm_version_info.h" -#include "tcg/tcg_pts_attr_tpm_version_info.h" -#include "tcg/tcg_pts_attr_get_aik.h" -#include "tcg/tcg_pts_attr_aik.h" -#include "tcg/tcg_pts_attr_req_func_comp_evid.h" -#include "tcg/tcg_pts_attr_gen_attest_evid.h" -#include "tcg/tcg_pts_attr_simple_comp_evid.h" -#include "tcg/tcg_pts_attr_simple_evid_final.h" -#include "tcg/tcg_pts_attr_req_file_meas.h" -#include "tcg/tcg_pts_attr_file_meas.h" -#include "tcg/tcg_pts_attr_req_file_meta.h" -#include "tcg/tcg_pts_attr_unix_file_meta.h" +#include "tcg/pts/tcg_pts_attr_proto_caps.h" +#include "tcg/pts/tcg_pts_attr_dh_nonce_params_req.h" +#include "tcg/pts/tcg_pts_attr_dh_nonce_params_resp.h" +#include "tcg/pts/tcg_pts_attr_dh_nonce_finish.h" +#include "tcg/pts/tcg_pts_attr_meas_algo.h" +#include "tcg/pts/tcg_pts_attr_get_tpm_version_info.h" +#include "tcg/pts/tcg_pts_attr_tpm_version_info.h" +#include "tcg/pts/tcg_pts_attr_get_aik.h" +#include "tcg/pts/tcg_pts_attr_aik.h" +#include "tcg/pts/tcg_pts_attr_req_func_comp_evid.h" +#include "tcg/pts/tcg_pts_attr_gen_attest_evid.h" +#include "tcg/pts/tcg_pts_attr_simple_comp_evid.h" +#include "tcg/pts/tcg_pts_attr_simple_evid_final.h" +#include "tcg/pts/tcg_pts_attr_req_file_meas.h" +#include "tcg/pts/tcg_pts_attr_file_meas.h" +#include "tcg/pts/tcg_pts_attr_req_file_meta.h" +#include "tcg/pts/tcg_pts_attr_unix_file_meta.h" +#include "tcg/swid/tcg_swid_attr_req.h" +#include "tcg/swid/tcg_swid_attr_tag_id_inv.h" +#include "tcg/swid/tcg_swid_attr_tag_inv.h" ENUM_BEGIN(tcg_attr_names, TCG_SCAP_REFERENCES, TCG_SCAP_SUMMARY_RESULTS, @@ -39,15 +42,17 @@ ENUM_BEGIN(tcg_attr_names, TCG_SCAP_REFERENCES, "SCAP Assessment", "SCAP Results", "SCAP Summary Results"); -ENUM_NEXT(tcg_attr_names, TCG_SWID_INVENTORY_REQUEST, - TCG_SWID_TAG_IDENTIFIER_RESPONSE, +ENUM_NEXT(tcg_attr_names, TCG_SWID_REQUEST, + TCG_SWID_TAG_EVENTS, TCG_SCAP_SUMMARY_RESULTS, - "SWID Inventory Request", - "SWID Tag Response", - "SWID Tag Identifier Response"); + "SWID Request", + "SWID Tag Identifier Inventory", + "SWID Tag Identifier Events", + "SWID Tag Inventory", + "SWID Tag Events"); ENUM_NEXT(tcg_attr_names, TCG_PTS_REQ_FUNC_COMP_EVID, TCG_PTS_REQ_FUNC_COMP_EVID, - TCG_SWID_TAG_IDENTIFIER_RESPONSE, + TCG_SWID_TAG_EVENTS, "Request Functional Component Evidence"); ENUM_NEXT(tcg_attr_names, TCG_PTS_GEN_ATTEST_EVID, TCG_PTS_GEN_ATTEST_EVID, @@ -170,6 +175,12 @@ pa_tnc_attr_t* tcg_attr_create_from_data(u_int32_t type, chunk_t value) { switch (type) { + case TCG_SWID_REQUEST: + return tcg_swid_attr_req_create_from_data(value); + case TCG_SWID_TAG_ID_INVENTORY: + return tcg_swid_attr_tag_id_inv_create_from_data(value); + case TCG_SWID_TAG_INVENTORY: + return tcg_swid_attr_tag_inv_create_from_data(value); case TCG_PTS_REQ_PROTO_CAPS: return tcg_pts_attr_proto_caps_create_from_data(value, TRUE); case TCG_PTS_PROTO_CAPS: @@ -208,6 +219,10 @@ pa_tnc_attr_t* tcg_attr_create_from_data(u_int32_t type, chunk_t value) return tcg_pts_attr_req_file_meta_create_from_data(value); case TCG_PTS_UNIX_FILE_META: return tcg_pts_attr_unix_file_meta_create_from_data(value); + /* unsupported TCG/SWID attributes */ + case TCG_SWID_TAG_ID_EVENTS: + case TCG_SWID_TAG_EVENTS: + /* unsupported TCG/PTS attributes */ case TCG_PTS_REQ_TEMPL_REF_MANI_SET_META: case TCG_PTS_TEMPL_REF_MANI_SET_META: case TCG_PTS_UPDATE_TEMPL_REF_MANI: diff --git a/src/libpts/tcg/tcg_attr.h b/src/libpts/tcg/tcg_attr.h index ed6c97619..085dae650 100644 --- a/src/libpts/tcg/tcg_attr.h +++ b/src/libpts/tcg/tcg_attr.h @@ -31,7 +31,7 @@ typedef enum tcg_attr_t tcg_attr_t; */ enum tcg_attr_t { - /* SCAP Messages */ + /* SCAP Attributes */ TCG_SCAP_REFERENCES = 0x00000001, TCG_SCAP_CAPS_AND_INVENTORY = 0x00000002, TCG_SCAP_CONTENT = 0x00000003, @@ -39,10 +39,12 @@ enum tcg_attr_t { TCG_SCAP_RESULTS = 0x00000005, TCG_SCAP_SUMMARY_RESULTS = 0x00000006, - /* SWID Messages */ - TCG_SWID_INVENTORY_REQUEST = 0x00000011, - TCG_SWID_TAG_RESPONSE = 0x00000012, - TCG_SWID_TAG_IDENTIFIER_RESPONSE = 0x00000013, + /* SWID Attributes */ + TCG_SWID_REQUEST = 0x00000011, + TCG_SWID_TAG_ID_INVENTORY = 0x00000012, + TCG_SWID_TAG_ID_EVENTS = 0x00000013, + TCG_SWID_TAG_INVENTORY = 0x00000014, + TCG_SWID_TAG_EVENTS = 0x00000015, /* PTS Protocol Negotiations */ TCG_PTS_REQ_PROTO_CAPS = 0x01000000, |