OpenDDS  Snapshot(2023/04/28-20:55)
LocalAuthCredentialData.cpp
Go to the documentation of this file.
1 /*
2  * Distributed under the OpenDDS License.
3  * See: http://www.OpenDDS.org/license.html
4  */
5 
7 
9 #include "dds/DCPS/debug.h"
13 
14 #include <algorithm>
15 #include <cstring>
16 #include <cerrno>
17 
19 
20 namespace OpenDDS {
21 namespace Security {
22 
23 using namespace CommonUtilities;
24 
26 {
27  const DDS::OctetSeq& perm_data = permissions_data_;
28  const DDS::OctetSeq& topic_data = participant_topic_data_;
29 
30  DDS::BinaryPropertySeq hash_data;
32 
33  DDS::BinaryProperty_t cid, cperm, cpdata, cdsign_algo, ckagree_algo;
34 
35  cid.name = "c.id";
36  cid.value = pubcert_.original_bytes();
37  cid.propagate = true;
38 
39  cperm.name = "c.perm";
40  cperm.value = perm_data;
41  cperm.propagate = true;
42 
43  cpdata.name = "c.pdata";
44  cpdata.value = topic_data;
45  cpdata.propagate = true;
46 
47  cdsign_algo.name = "c.dsign_algo";
48  const char* cdsign_algo_str = pubcert_.dsign_algo();
49  cdsign_algo.value.length(static_cast<unsigned int>(std::strlen(cdsign_algo_str)) + 1);
50  std::memcpy(cdsign_algo.value.get_buffer(), cdsign_algo_str, cdsign_algo.value.length());
51  cdsign_algo.propagate = true;
52 
53  ckagree_algo.name = "c.kagree_algo";
54  const char* ckagree_algo_str = dh_.kagree_algo();
55  ckagree_algo.value.length(static_cast<unsigned int>(std::strlen(ckagree_algo_str)) + 1);
56  std::memcpy(ckagree_algo.value.get_buffer(), ckagree_algo_str, ckagree_algo.value.length());
57  ckagree_algo.propagate = true;
58 
59  *inserter = cid;
60  *inserter = cperm;
61  *inserter = cpdata;
62  *inserter = cdsign_algo;
63  *inserter = ckagree_algo;
64 
65  return SSL::hash_serialized(hash_data, dst);
66 }
67 
69 {
70 }
71 
73 {
74 }
75 
78 {
79  const char* cperm = TokenReader(src).get_property_value("dds.perm.cert");
80  if (!cperm) {
81  set_security_error(ex, -1, 0,
82  "LocalAuthCredentialData::load_access_permissions: "
83  "no 'dds.perm.cert' property provided");
84  return false;
85  }
86 
87  const size_t len = std::strlen(cperm);
88  access_permissions_.length(static_cast<CORBA::ULong>(len + 1));
89  std::memcpy(&access_permissions_[0], cperm, len + 1); // copies the NULL
90 
91  return true;
92 }
93 
95 {
97  ACE_DEBUG((LM_DEBUG, "(%P|%t) LocalAuthCredentialData::load: Number of Properties: %i\n", props.length()));
98  }
99 
100  std::string pkey_uri, password;
101  for (unsigned int i = 0; i < props.length(); ++i) {
102  const std::string name = props[i].name.in(), value = props[i].value.in();
103 
105  ACE_DEBUG((LM_DEBUG, "(%P|%t) LocalAuthCredentialData::load: property %i: %C: %C\n",
106  i, name.c_str(), value.c_str()));
107  }
108 
110  ca_cert_.reset(new SSL::Certificate(value));
111 
112  } else if (name == DDS::Security::Properties::AuthPrivateKey) {
113  pkey_uri = value;
114 
116  participant_cert_.reset(new SSL::Certificate(value));
117 
118  } else if (name == DDS::Security::Properties::AuthPassword) {
119  password = value;
120 
121  }
122  }
123 
124  if (!pkey_uri.empty()) {
125  participant_pkey_.reset(new SSL::PrivateKey(pkey_uri, password));
126  }
127 
128  if (!ca_cert_) {
129  set_security_error(ex, -1, 0, "LocalAuthCredentialData::load: failed to load CA certificate");
130  return false;
131 
132  } else if (!participant_cert_) {
133  set_security_error(ex, -1, 0, "LocalAuthCredentialData::load: failed to load participant certificate");
134  return false;
135 
136  } else if (!participant_pkey_) {
137  set_security_error(ex, -1, 0, "LocalAuthCredentialData::load: failed to load participant private key");
138  return false;
139  }
140 
141  return true;
142 }
143 
144 }
145 }
146 
const char AuthPassword[]
Definition: Properties.h:22
#define ACE_DEBUG(X)
bool load_credentials(const DDS::PropertySeq &props, DDS::Security::SecurityException &ex)
const LogLevel::Value value
Definition: debug.cpp:61
Implements some simple wrapper functions to provide a const API around the Token data structure as sp...
Definition: TokenReader.h:40
bool load_access_permissions(const DDS::Security::PermissionsCredentialToken &src, DDS::Security::SecurityException &ex)
int hash_serialized(const DDS::BinaryPropertySeq &src, DDS::OctetSeq &dst)
const char AuthIdentityCA[]
Definition: Properties.h:20
const char AuthPrivateKey[]
Definition: Properties.h:23
LM_DEBUG
DDS::BinaryPropertySeq BinaryPropertySeq
DDS::PropertySeq PropertySeq
Definition: RtpsCore.idl:49
sequence< octet > OctetSeq
Definition: DdsDcpsCore.idl:64
const char * get_property_value(const std::string &property_name) const
Definition: TokenReader.cpp:42
const char *const name
Definition: debug.cpp:60
OpenDDS_Dcps_Export unsigned int DCPS_debug_level
Definition: debug.cpp:30
const char AuthIdentityCertificate[]
Definition: Properties.h:21
#define OPENDDS_END_VERSIONED_NAMESPACE_DECL
bool set_security_error(DDS::Security::SecurityException &ex, int code, int minor_code, const char *message)
int operator()(DDS::OctetSeq &dst) const
The Internal API and Implementation of OpenDDS.
Definition: AddressCache.h:28