00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #include "prcKeyRegistry.h"
00016 #include "config_prc.h"
00017
00018
00019
00020
00021
00022 #ifdef HAVE_OPENSSL
00023
00024 #include "openssl/pem.h"
00025
00026 PrcKeyRegistry *PrcKeyRegistry::_global_ptr = NULL;
00027
00028
00029
00030
00031
00032
00033
00034 PrcKeyRegistry::
00035 PrcKeyRegistry() {
00036 }
00037
00038
00039
00040
00041
00042
00043 PrcKeyRegistry::
00044 ~PrcKeyRegistry() {
00045 prc_cat.error()
00046 << "Internal error--PrcKeyRegistry destructor called!\n";
00047 }
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061 void PrcKeyRegistry::
00062 record_keys(const KeyDef *key_def, int num_keys) {
00063 for (int i = 0; i < num_keys; i++) {
00064 const KeyDef *def = &key_def[i];
00065 if (def->_data != (char *)NULL) {
00066
00067 while ((int)_keys.size() <= i) {
00068 Key key;
00069 key._def = NULL;
00070 key._pkey = NULL;
00071 key._generated_time = 0;
00072 _keys.push_back(key);
00073 }
00074 if (_keys[i]._def != def) {
00075 if (_keys[i]._pkey != (EVP_PKEY *)NULL) {
00076 EVP_PKEY_free(_keys[i]._pkey);
00077 _keys[i]._pkey = NULL;
00078 }
00079 _keys[i]._def = def;
00080 _keys[i]._generated_time = def->_generated_time;
00081 }
00082 }
00083 }
00084 }
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095 void PrcKeyRegistry::
00096 set_key(int n, EVP_PKEY *pkey, time_t generated_time) {
00097
00098 while ((int)_keys.size() <= n) {
00099 Key key;
00100 key._def = NULL;
00101 key._pkey = NULL;
00102 key._generated_time = 0;
00103 _keys.push_back(key);
00104 }
00105 _keys[n]._def = NULL;
00106 if (_keys[n]._pkey != (EVP_PKEY *)NULL) {
00107 EVP_PKEY_free(_keys[n]._pkey);
00108 _keys[n]._pkey = NULL;
00109 }
00110 _keys[n]._pkey = pkey;
00111 _keys[n]._generated_time = generated_time;
00112 }
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122 int PrcKeyRegistry::
00123 get_num_keys() const {
00124 return _keys.size();
00125 }
00126
00127
00128
00129
00130
00131
00132
00133 EVP_PKEY *PrcKeyRegistry::
00134 get_key(int n) const {
00135 nassertr(n >= 0 && n < (int)_keys.size(), (EVP_PKEY *)NULL);
00136
00137 if (_keys[n]._def != (KeyDef *)NULL) {
00138 if (_keys[n]._pkey == (EVP_PKEY *)NULL) {
00139
00140 const KeyDef *def = _keys[n]._def;
00141 BIO *mbio = BIO_new_mem_buf((void *)def->_data, def->_length);
00142 EVP_PKEY *pkey = PEM_read_bio_PUBKEY(mbio, NULL, NULL, NULL);
00143 ((PrcKeyRegistry *)this)->_keys[n]._pkey = pkey;
00144 BIO_free(mbio);
00145
00146 if (pkey == (EVP_PKEY *)NULL) {
00147
00148 ((PrcKeyRegistry *)this)->_keys[n]._def = NULL;
00149 }
00150 }
00151 }
00152
00153 return _keys[n]._pkey;
00154 }
00155
00156
00157
00158
00159
00160
00161
00162 time_t PrcKeyRegistry::
00163 get_generated_time(int n) const {
00164 nassertr(n >= 0 && n < (int)_keys.size(), 0);
00165
00166 return _keys[n]._generated_time;
00167 }
00168
00169
00170
00171
00172
00173
00174 PrcKeyRegistry *PrcKeyRegistry::
00175 get_global_ptr() {
00176 if (_global_ptr == (PrcKeyRegistry *)NULL) {
00177 _global_ptr = new PrcKeyRegistry;
00178 }
00179 return _global_ptr;
00180 }
00181
00182 #endif // HAVE_OPENSSL