test_aes_encryptor.cpp
Go to the documentation of this file.
1 /*********************************************************************
2 * Software License Agreement (BSD License)
3 *
4 * Copyright (c) 2017, Open Source Robotics Foundation
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 *
11 * * Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 * * Redistributions in binary form must reproduce the above
14 * copyright notice, this list of conditions and the following
15 * disclaimer in the documentation and/or other materials provided
16 * with the distribution.
17 * * Neither the name of Willow Garage, Inc. nor the names of its
18 * contributors may be used to endorse or promote products derived
19 * from this software without specific prior written permission.
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
24 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
25 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
26 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
27 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
28 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
29 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
31 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
32 * POSSIBILITY OF SUCH DAMAGE.
33 *********************************************************************/
34 
35 #include <cstdio>
36 
37 #include <boost/filesystem.hpp>
38 
39 #include <gtest/gtest.h>
40 
41 #include <gpgme.h>
42 
43 #include "std_msgs/String.h"
44 
45 #include "rosbag/bag.h"
46 #include "rosbag/aes_encryptor.h"
47 #include "rosbag/gpgme_utils.h"
48 #include "rosbag/view.h"
49 
50 const char *GPG_KEY_USER = "Foo00";
51 const char *GPG_PRIVATE_SUBKEY = "-----BEGIN PGP PRIVATE KEY BLOCK-----\n"
52  "Version: GnuPG v1\n\n"
53  "lQEVBFn3acoBCACwhq4iofk2V3/4yQy9++pHa3D4SPJdt1G/h83D+t9m95FoTHZl"
54  "zIY5bjKAKQ+NI6u5eQKNndAA7QLg8UGML6VqO7wmlxYSMOqRc4i0QMuUTA87hK4u"
55  "ozcHnjwaRhQzapwhnAMUu4058DIUyTus7ugD81C6y0nNT2PPwQzKifMmMcIgBvKm"
56  "vio7IK1A2tOsyQJD3jo99ZQhxq/eOQIwCs/BZfxu0OWnSJkx98Rsf7w3GC8tqhWK"
57  "avt/rBaFVoS3eZMkgQfT/ep92dYSLi/3/1pMtAt3kEVw3ZrvrCi47KDhpuaIV0kI"
58  "WlfHJF/YBNFbe4rRNwmQ5PkZYW1IwR14A+QFABEBAAH+B2UCR05VAbQqRm9vMDAg"
59  "KEEgR1BHIGtleSBmb3IgdGVzdCBjYXNlcykgPGJhckBiYXo+iQE4BBMBAgAiBQJZ"
60  "92nKAhsDBgsJCAcDAgYVCAIJCgsEFgIDAQIeAQIXgAAKCRCvPh8IgO8IzWTJB/9d"
61  "PO8BrpXtm/tosaGJFHT8FDt4PerCoKD6SqKj6HDrSU8tgUh+qLd+S1SkZ9Zg+yLq"
62  "ccCTeUg40XEvcKeTob8hWbTMKdl1cijM1jJCAUTe9zZd7URHoEkNWdEgA/saCZUj"
63  "TDeImYNcvv93SisKldf4gd67vkBETB4kEY7v7EE2YTge12S1vd9/9Ra6ZQn/qJSh"
64  "aPfZ5RfL1FEexQW+h2+bfpxW+ej/s2uM05AdEMmmGDaSVpimpPDkfF2YX4ESM7cl"
65  "fQzn1sCyVeHQWYvvEFTChdPlIR+gMZUhW+KicEqKsCDleh/jnSG/OoVZQkzec6Kt"
66  "zls7NO+fqIqFDLrNBWMTnQOXBFn3acoBCAClwRyFmeIkocrnodiqViqoGaBPOrwh"
67  "2NTaPvoiinwYwqUb9TynsrosEZTfjxfzDBawFG/nuBB7y0LhQYJKIEW6dKBT3HRe"
68  "hdhzfhZEaGGLwWxCqq5yywDt0JWrT92BX8hzwxKquRs3fynFGuW9YG5pdQ/wC3Na"
69  "j4uXg5Qy5wJZ0tqi/AiMIZTZGXBc/nP7rP7sryu3BYAXSPndx1mZYbSU1K5vBL3f"
70  "FkDAkon++cvF1+5D9Aoy1ukVmYn5fEhB4GoZwJEYCtgYofY5Fwbb7NsGHqrLBUgv"
71  "PwD5khZQ092rXEYPqkYrJ7vRX3/LdO4gmJupD1e1U2sRBOgzD/Pfw15FABEBAAEA"
72  "B/jMvmgLEV+bbnffNZpszcocE8Rjbw1mT/7Vl2bxCsmUr73uIFSTQxXRIMoZlRmO"
73  "dLWRrleo/3tc/UT0+fZoRJFrTjK88j5ag933PR2Zm1X/S9DgT7wQSOrc13Ts0mUD"
74  "aff4lMTr5J5kmZLGHx4beazpCM0Y0tM40TPVu10bg1srJUyCJgmqPJD0sbBfCBcT"
75  "jY99eWdT7tMr60G1Xw487RMXr/5eT7V2jcTe6JRivzQwvcsx1TuPWJajXY/l8BUJ"
76  "C7DitQP9x5DrA3s7qDxVbqiD0xrzCFc5FuOpcG2yV7LCuvT1144a1teCBh/gIoxh"
77  "EAnethtCVlmEufH74guq9ikEAMiZTkgsMNNHGtl7zNDc5ZEW22ESbrq81sbW9Z2p"
78  "CEvFU2HUsUQRkun6BcGpewTD+IOv2nSLlZQHEue4Ny9k7d4dWSew1ab3FMk9klpX"
79  "C7SEPYYDnZ8Ar+3nFozxKI3D1BvR374jSf2akMuIITteCnMXhvMLLFsk1Dz5zuWX"
80  "ARGfBADTiDyw387tZoR0Mhsiw1FwDJRISNYnC5YxWWzpDPfrZ3HZD44PqdwcxgBd"
81  "Uvtr8BtWHxs3skzn3oeNFT0yhVJi2Bn0QvGMIuGWBnhUvASv/rM3Zt22G5dCUVyz"
82  "RVGr1yx2xSZnVOeXQRSfp9yevAixcC8ATa8GUx9K8OSP/0NtmwP/Z5nW5s0WoG1H"
83  "Yna4s5bhNJ1y6Jue7bhw0gKXhx/9RNilTmq7NU6vTc1vqj0nw5e45WpojqZvSt0f"
84  "+bEL5eW+YnFb0MLJ9gIey4QZbOJeHB1xOaqz54Fnf8t9MmV/efLKvTHdj/WFM3fL"
85  "Z2iesAjK4hCyB2raeD9SOCP2ofztcmpIGYkBHwQYAQIACQUCWfdpygIbDAAKCRCv"
86  "Ph8IgO8Izd2IB/sFNTx/3l4mX9NUvyTpEhXKseti7JncjxZblUTV5MJ154nrfb2w"
87  "Xc81OmPmEDtE0PxTjYVasBD3lZNyLglw9kPpS5qZXU8kO4D6kNjRhdgKd/GqNHSo"
88  "U1LqutU/nbJc5H3AtGMLhg4Afa9xsYIRcszgtyWBbYCJ1MhkBaROAY42VzOyOi6z"
89  "pHOsnQH3xGlOdBYLeIvStCVP4XmHw/Mcx7LVnIfx48MFxVDw1iDiZej0K3cO24Ne"
90  "dSCgzJUVZQ5K4fTSu2xq1jD5zgWZ/Iu8PvAl5skKzgB2HpDVxIMVAELvxaMgKh3S"
91  "LYxADpgShsNtJiU/Dbn8jA+BlK/77fGnkvnc"
92  "=YcIw"
93  "-----END PGP PRIVATE KEY BLOCK-----";
94 const char *MESSAGE = "message foo";
95 const char *TOPIC_NAME = "topic_bar";
96 
97 void importGpgKey(gpgme_ctx_t &ctx) {
98  gpgme_data_t key_data;
99  gpgme_error_t err = gpgme_data_new_from_mem(&key_data, GPG_PRIVATE_SUBKEY, std::strlen(GPG_PRIVATE_SUBKEY), 1);
100  if (err) {
101  gpgme_release(ctx);
102  FAIL() << "gpgme_data_new_from_mem returned " << gpgme_strerror(err);
103  }
104  err = gpgme_op_import(ctx, key_data);
105  if (err) {
106  gpgme_data_release(key_data);
107  gpgme_release(ctx);
108  FAIL() << "gpgme_op_import returned " << gpgme_strerror(err);
109  }
110  gpgme_import_result_t res = gpgme_op_import_result(ctx);
111  EXPECT_TRUE(res->imports);
112  gpgme_data_release(key_data);
113 }
114 
115 TEST(AesCbcEncryptor, EncryptAndDecryptBag) {
116  // Import key
118  gpgme_ctx_t ctx;
119  gpgme_error_t err = gpgme_new(&ctx);
120  if (err) {
121  FAIL() << "Failed to create a GPG context: " << gpgme_strerror(err);
122  }
123  importGpgKey(ctx);
124 
125  // Test if the key has been imported
126  gpgme_key_t key;
127  try {
128  rosbag::getGpgKey(ctx, GPG_KEY_USER, key);
129  }
130  catch (rosbag::BagException const& e) {
131  gpgme_release(ctx);
132  FAIL() << "Failed to get the imported GPG key: " << e.what();
133  }
134 
135  // Write a message to an encrypted bag file
136  char temp_dir_templ[] = "/tmp/bagXXXXXX";
137  char *temp_dir = mkdtemp(temp_dir_templ);
138  std::string bag_file_name = std::string(temp_dir) + "/foo.bag";
139  rosbag::Bag bag(bag_file_name, rosbag::bagmode::Write);
140  bag.setEncryptorPlugin("rosbag/AesCbcEncryptor", GPG_KEY_USER);
141  std_msgs::String msg;
142  msg.data = MESSAGE;
143  bag.write(TOPIC_NAME, ros::TIME_MIN, msg);
144  bag.close();
145 
146  // Test the message decrypted from the bag file
147  bag.open(bag_file_name, rosbag::bagmode::Read);
148  rosbag::View view(bag);
149  EXPECT_EQ(view.size(), 1u);
150  EXPECT_EQ(TOPIC_NAME, view.begin()->getTopic());
151  EXPECT_EQ(MESSAGE, view.begin()->instantiate<std_msgs::String>()->data);
152  bag.close();
153 
154  // Remove the bag file
155  boost::filesystem::remove(bag_file_name);
156  // Delete the key
157  gpgme_op_delete(ctx, key, 1);
158  // Release GPG context
159  gpgme_release(ctx);
160 }
161 
162 int main(int argc, char **argv) {
163  testing::InitGoogleTest(&argc, argv);
164  return RUN_ALL_TESTS();
165 }
gpgme_utils.h
rosbag::Bag
Definition: bag.h:131
rosbag::View::size
uint32_t size()
Definition: view.cpp:226
GPG_PRIVATE_SUBKEY
const char * GPG_PRIVATE_SUBKEY
Definition: test_aes_encryptor.cpp:51
TOPIC_NAME
const char * TOPIC_NAME
Definition: test_aes_encryptor.cpp:95
rosbag::Bag::setEncryptorPlugin
void setEncryptorPlugin(const std::string &plugin_name, const std::string &plugin_param=std::string())
Set encryptor of the bag file.
Definition: bag.cpp:219
rosbag::initGpgme
void initGpgme()
Initialize GPGME library.
Definition: gpgme_utils.cpp:74
TEST
TEST(AesCbcEncryptor, EncryptAndDecryptBag)
Definition: test_aes_encryptor.cpp:115
rosbag::Bag::close
void close()
Close the bag file.
Definition: bag.cpp:165
aes_encryptor.h
rosbag::bagmode::Read
@ Read
Definition: bag.h:185
rosbag::BagException
Base class for rosbag exceptions.
Definition: exceptions.h:75
MESSAGE
const char * MESSAGE
Definition: test_aes_encryptor.cpp:94
GPG_KEY_USER
const char * GPG_KEY_USER
Definition: test_aes_encryptor.cpp:50
ros::TIME_MIN
const Time TIME_MIN(0, 1)
rosbag::View
Definition: view.h:80
rosbag::bagmode::Write
@ Write
Definition: bag.h:184
bag.h
rosbag::getGpgKey
void getGpgKey(gpgme_ctx_t &ctx, std::string const &user, gpgme_key_t &key)
Get GPG key.
Definition: gpgme_utils.cpp:85
rosbag::Bag::write
void write(std::string const &topic, ros::MessageEvent< T > const &event)
Write a message into the bag file.
Definition: bag.h:369
main
int main(int argc, char **argv)
Definition: test_aes_encryptor.cpp:162
view.h
importGpgKey
void importGpgKey(gpgme_ctx_t &ctx)
Definition: test_aes_encryptor.cpp:97
rosbag::Bag::open
void open(std::string const &filename, uint32_t mode=bagmode::Read)
Open a bag file.
Definition: bag.cpp:105
rosbag::View::begin
iterator begin()
Simply copy the merge_queue state into the iterator.
Definition: view.cpp:218


rosbag_storage
Author(s): Dirk Thomas , Jacob Perron
autogenerated on Sat Sep 14 2024 02:59:52