diff --git a/src/libimcv/plugins/imv_attestation/data.sql b/src/libimcv/plugins/imv_attestation/data.sql new file mode 100644 index 000000000..6d7533858 --- /dev/null +++ b/src/libimcv/plugins/imv_attestation/data.sql @@ -0,0 +1,245 @@ +/* Products */ + +INSERT INTO products ( + name +) VALUES ( + 'Ubuntu 11.4 i686' +); + +INSERT INTO products ( + name +) VALUES ( + 'Ubuntu 11.4 x86_64' +); + +INSERT INTO products ( + name +) VALUES ( + 'CentOS release 5.6 (Final) x86_64' +); + +/* Files */ + +INSERT INTO files ( + type, path + ) VALUES ( + 0, '/lib/i386-linux-gnu/libdl.so.2' +); + +INSERT INTO files ( + type, path + ) VALUES ( + 0, '/lib/x86_64-linux-gnu/libdl.so.2' +); + +INSERT INTO files ( + type, path + ) VALUES ( + 0, '/lib/libdl.so.2' +); + +INSERT INTO files ( + type, path + ) VALUES ( + 0, '/sbin/iptables' +); +INSERT INTO files ( + type, path + ) VALUES ( + 0, '/lib/libxtables.so.5' +); + +INSERT INTO product_file ( + product, file +) VALUES ( + 1, 1 +); + +INSERT INTO product_file ( + product, file +) VALUES ( + 1, 4 +); + +INSERT INTO product_file ( + product, file +) VALUES ( + 1, 5 +); + +INSERT INTO product_file ( + product, file +) VALUES ( + 2, 2 +); + +INSERT INTO product_file ( + product, file +) VALUES ( + 2, 4 +); + +INSERT INTO product_file ( + product, file +) VALUES ( + 2, 5 +); + +INSERT INTO product_file ( + product, file +) VALUES ( + 3, 3 +); + +INSERT INTO product_file ( + product, file +) VALUES ( + 3, 4 +); + +/* File Hashes */ + +INSERT INTO file_hashes ( + file, product, algo, hash +) VALUES ( + 1, 1, 32768, X'409bb1a97e26ea1144cdd6801b8159f17f376b8f' +); + +INSERT INTO file_hashes ( + file, product, algo, hash +) VALUES ( + 1, 1, 16384, X'675172775cfd2b73ed1e249e4a730921f06c2f86fffdce4c71674cc654f37ed7' +); + +INSERT INTO file_hashes ( + file, product, algo, hash +) VALUES ( + 1, 1, 8192, X'abc8ce3fc99b6dcec6745ffc2f59e35372b9b126491480d04b0f93076beded06cccb27b61f1170868fada8cddefa7be4' +); + +INSERT INTO file_hashes ( + file, product, algo, hash +) VALUES ( + 2, 2, 32768, X'2a4047437e6fb346e2d854fc415e16b80e75bf6b' +); + +INSERT INTO file_hashes ( + file, product, algo, hash +) VALUES ( + 2, 2, 16384, X'86aa0bf93dade999277d963338402ed437271f3436f594a49ffca85b6c487523' +); + +INSERT INTO file_hashes ( + file, product, algo, hash +) VALUES ( + 2, 2, 8192, X'6090441219c0b478d294ae88e006d85ac0d94464573bcca7d180618a612bd170e3ee47c1545861b0f06fe0db85544c59' +); + +INSERT INTO file_hashes ( + file, product, algo, hash +) VALUES ( + 3, 3, 32768, X'07d8c0218a5b3469b409dc95cf8f77a341a595fb' +); + +INSERT INTO file_hashes ( + file, product, algo, hash +) VALUES ( + 3, 3, 16384, X'b083699fbc4c9f9e0d463361118904a3832670ad2fe3d6b42f811061188d509f' +); + +INSERT INTO file_hashes ( + file, product, algo, hash +) VALUES ( + 3, 3, 8192, X'b14908de476467a11a7a98835d1cf8317c7b80a684692426ddd7b0014e00b70b3d1b4fc1dd02ad440447612ee9dadb52' +); + +INSERT INTO file_hashes ( + file, product, algo, hash +) VALUES ( + 4, 1, 32768, X'ff6deca0eeb7a257205c5f0ab5f5d821ea184098' +); + +INSERT INTO file_hashes ( + file, product, algo, hash +) VALUES ( + 4, 1, 16384, X'5c84fdf7c529d3c65a001587eda641fe489f83961a621fe514e7852a842690d6' +); + +INSERT INTO file_hashes ( + file, product, algo, hash +) VALUES ( + 4, 1, 8192, X'8bd699f85f5b3efb27204b4699c518f871ef245d03b4bf8d1cc00456025017546030c2f493525754cffcd24cdbc03b21' +); + +INSERT INTO file_hashes ( + file, product, algo, hash +) VALUES ( + 4, 163842, 32768, X'1118805b490051637e93e592f4c71e0ee78a2422' +); + +INSERT INTO file_hashes ( + file, product, algo, hash +) VALUES ( + 4, 2, 16384, X'5ea7229ebef5dc8f9fb2118676b773dd62cf89dc21657e3b8fbbcbc70ee24bd3' +); + +INSERT INTO file_hashes ( + file, product, algo, hash +) VALUES ( + 4, 2, 8192, X'3b8da9e704e644eb7b196981624a2f6826c401d689e00ba47e42ff46351d27c6b9e91b1e8351ee01f66e5244b4c2a9b0' +); + +INSERT INTO file_hashes ( + file, product, algo, hash +) VALUES ( + 4, 3, 32768, X'b5cd500ec15d6bfcae15e0af1dc121df7114b97d' +); + +INSERT INTO file_hashes ( + file, product, algo, hash +) VALUES ( + 4, 3, 16384, X'b94f1cba12abb0ec79d207142526388ec0d127c4f2aad4a46a623a1f69bac84f' +); + +INSERT INTO file_hashes ( + file, product, algo, hash +) VALUES ( + 4, 3, 8192, X'6663d66ff0e93b1b8a1edcdbe45d64834e29dc9c2b1d23126fd370a85b2c56da5cadcbc65b6e8afbb1e18bea8e413bd1' +); + +INSERT INTO file_hashes ( + file, product, algo, hash +) VALUES ( + 5, 1, 32768, X'7a3ca72158e60b0c91e48a420848f1b693aea26c' +); + +INSERT INTO file_hashes ( + file, product, algo, hash +) VALUES ( + 5, 1, 16384, X'f9693c7d36c087d51f5012897fa0e8bb94081854d080c84f831f4d693d22f645' +); + +INSERT INTO file_hashes ( + file, product, algo, hash +) VALUES ( + 5, 1, 8192, X'4ec135e54c8840ab575fcdf00c66f996f763863ad30800b0f0a0b02e7899697d6ab9ccfe185ccbc16c19f38d0a27becb' +); + +INSERT INTO file_hashes ( + file, product, algo, hash +) VALUES ( + 5, 2, 32768, X'5d36a26856021d68a42f8bd7ca22365579d43891' +); + +INSERT INTO file_hashes ( + file, product, algo, hash +) VALUES ( + 5, 2, 16384, X'411be0558ad0cef33b437dafeed40104917e2079646524145abf9d05ddc6c1c5' +); + +INSERT INTO file_hashes ( + file, product, algo, hash +) VALUES ( + 5, 2, 8192, X'237f4691f9b780bec7aff217d64a9780ceed2973a41e86c92e0d6dab81cc5d13a9b99ba408302264f5665de1f42ef6e1' +); + diff --git a/src/libimcv/plugins/imv_attestation/imv_attestation.c b/src/libimcv/plugins/imv_attestation/imv_attestation.c index 118fbb849..5e8a8c9b8 100644 --- a/src/libimcv/plugins/imv_attestation/imv_attestation.c +++ b/src/libimcv/plugins/imv_attestation/imv_attestation.c @@ -269,10 +269,12 @@ static TNC_Result send_message(TNC_ConnectionID connection_id) measurement_req_entry_t *entry; pts_meas_algorithms_t communicated_caps; u_int32_t delimiter = SOLIDUS_UTF; + int id, type; + char *product, *path; /* Send Get TPM Version Information attribute */ communicated_caps = pts->get_proto_caps(pts); - if(communicated_caps & PTS_PROTO_CAPS_T) + if (communicated_caps & PTS_PROTO_CAPS_T) { pa_tnc_attr_t *attr_get_tpm_version, *attr_get_aik; @@ -291,6 +293,23 @@ static TNC_Result send_message(TNC_ConnectionID connection_id) /** * Add files to measure to PTS Request File Measurement attribute */ + product = "Ubuntu 11.4 i686"; + + if (!pts_db) + { + break; + } + enumerator = pts_db->create_file_enumerator(pts_db, product); + if (!enumerator) + { + break; + } + while (enumerator->enumerate(enumerator, &id, &type, &path)) + { + DBG2(DBG_IMV, "id = %d, type = %d, path = '%s'", id, type, path); + } + enumerator->destroy(enumerator); + enumerator = file_list->create_enumerator(file_list); while (enumerator->enumerate(enumerator, &entry)) { diff --git a/src/libimcv/plugins/imv_attestation/tables.sql b/src/libimcv/plugins/imv_attestation/tables.sql index 449d23312..0407d1e17 100644 --- a/src/libimcv/plugins/imv_attestation/tables.sql +++ b/src/libimcv/plugins/imv_attestation/tables.sql @@ -4,13 +4,13 @@ DROP TABLE IF EXISTS files; CREATE TABLE files ( id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, type INTEGER NOT NULL, - path TEXT NOT NULL, + path TEXT NOT NULL ); DROP TABLE IF EXISTS products; CREATE TABLE products ( id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, - name TEXT NOT NULL, + name TEXT NOT NULL ); DROP INDEX IF EXISTS products_name; CREATE INDEX products_name ON products ( @@ -24,3 +24,12 @@ CREATE TABLE product_file ( PRIMARY KEY (product, file) ); +DROP TABLE IF EXISTS file_hashes; +CREATE TABLE file_hashes ( + file INTEGER NOT NULL, + product INTEGER NOT NULL, + algo INTEGER NOT NULL, + hash BLOB NOT NULL, + PRIMARY KEY(file, product, algo) +); + diff --git a/src/libimcv/tcg/pts/pts_database.c b/src/libimcv/tcg/pts/pts_database.c index 916e88843..bcfa8c885 100644 --- a/src/libimcv/tcg/pts/pts_database.c +++ b/src/libimcv/tcg/pts/pts_database.c @@ -40,10 +40,17 @@ struct private_pts_database_t { }; METHOD(pts_database_t, create_file_enumerator, enumerator_t*, - private_pts_database_t *this, char *product, char *version) + private_pts_database_t *this, char *product) { - enumerator_t *e = NULL; + enumerator_t *e; + /* look for all entries belonging to a product in the files table */ + e = this->db->query(this->db, + "SELECT f.id, f.type, f.path FROM files AS f " + "JOIN product_file AS pf ON f.id = pf.file " + "JOIN products AS p ON p.id = pf.product " + "WHERE p.name = ?", + DB_TEXT, product, DB_INT, DB_INT, DB_TEXT); return e; } @@ -71,7 +78,8 @@ pts_database_t *pts_database_create(char *uri) if (!this->db) { - DBG1(DBG_TNC, "pts failed to connect to file database"); + DBG1(DBG_TNC, "failed to connect to PTS file measurement database '%s'", + uri); free(this); return NULL; } diff --git a/src/libimcv/tcg/pts/pts_database.h b/src/libimcv/tcg/pts/pts_database.h index 40d9ffaea..9675d60c4 100644 --- a/src/libimcv/tcg/pts/pts_database.h +++ b/src/libimcv/tcg/pts/pts_database.h @@ -35,11 +35,9 @@ struct pts_database_t { * Get files to be measured by PTS * * @product software product (os, vpn client, etc.) - * @param version release version * @return enumerator over all files matching a given release */ - enumerator_t* (*create_file_enumerator)(pts_database_t *this, char *product, - char *version); + enumerator_t* (*create_file_enumerator)(pts_database_t *this, char *product); /** * Destroys a pts_database_t object.