open_toontown_panda3d/dtool/src/prc/prcKeyRegistry.cxx

187 lines
6.3 KiB
C++

// Filename: prcKeyRegistry.cxx
// Created by: drose (19Oct04)
//
////////////////////////////////////////////////////////////////////
//
// PANDA 3D SOFTWARE
// Copyright (c) 2001 - 2004, Disney Enterprises, Inc. All rights reserved
//
// All use of this software is subject to the terms of the Panda 3d
// Software license. You should have received a copy of this license
// along with this source code; you will also find a current copy of
// the license at http://etc.cmu.edu/panda3d/docs/license/ .
//
// To contact the maintainers of this program write to
// panda3d-general@lists.sourceforge.net .
//
////////////////////////////////////////////////////////////////////
#include "prcKeyRegistry.h"
#include "config_prc.h"
// This file requires OpenSSL to compile, because we use routines in
// the OpenSSL library to manage keys and to sign and validate
// signatures.
#ifdef HAVE_OPENSSL
#include "openssl/pem.h"
PrcKeyRegistry *PrcKeyRegistry::_global_ptr = NULL;
////////////////////////////////////////////////////////////////////
// Function: PrcKeyRegistry::Constructor
// Access: Protected
// Description: There is only one PrcKeyRegistry in the world; use
// get_global_ptr() to get it.
////////////////////////////////////////////////////////////////////
PrcKeyRegistry::
PrcKeyRegistry() {
}
////////////////////////////////////////////////////////////////////
// Function: PrcKeyRegistry::Destructor
// Access: Protected
// Description:
////////////////////////////////////////////////////////////////////
PrcKeyRegistry::
~PrcKeyRegistry() {
prc_cat.error()
<< "Internal error--PrcKeyRegistry destructor called!\n";
}
////////////////////////////////////////////////////////////////////
// Function: PrcKeyRegistry::record_keys
// Access: Public
// Description: Records the list of public keys that are compiled
// into this executable. The pointer is assumed to be
// to an area of static memory that will not be
// destructed, so the data is not copied, but only the
// pointer is assigned.
//
// This method is normally called after including the
// code generated by the make-prc-key utility.
////////////////////////////////////////////////////////////////////
void PrcKeyRegistry::
record_keys(const KeyDef *key_def, int num_keys) {
for (int i = 0; i < num_keys; i++) {
const KeyDef *def = &key_def[i];
if (def->_data != (char *)NULL) {
// Clear the ith key.
while ((int)_keys.size() <= i) {
Key key;
key._def = NULL;
key._pkey = NULL;
key._generated_time = 0;
_keys.push_back(key);
}
if (_keys[i]._def != def) {
if (_keys[i]._pkey != (EVP_PKEY *)NULL) {
EVP_PKEY_free(_keys[i]._pkey);
_keys[i]._pkey = NULL;
}
_keys[i]._def = def;
_keys[i]._generated_time = def->_generated_time;
}
}
}
}
////////////////////////////////////////////////////////////////////
// Function: PrcKeyRegistry::set_key
// Access: Public
// Description: Sets the nth public key in the registry to the given
// value. The EVP_PKEY structure must have been
// properly allocated view EVP_PKEY_new(); its ownership
// is transferred to the registry and it will eventually
// be freed via EVP_PKEY_free().
////////////////////////////////////////////////////////////////////
void PrcKeyRegistry::
set_key(int n, EVP_PKEY *pkey, time_t generated_time) {
// Clear the nth key.
while ((int)_keys.size() <= n) {
Key key;
key._def = NULL;
key._pkey = NULL;
key._generated_time = 0;
_keys.push_back(key);
}
_keys[n]._def = NULL;
if (_keys[n]._pkey != (EVP_PKEY *)NULL) {
EVP_PKEY_free(_keys[n]._pkey);
_keys[n]._pkey = NULL;
}
_keys[n]._pkey = pkey;
_keys[n]._generated_time = generated_time;
}
////////////////////////////////////////////////////////////////////
// Function: PrcKeyRegistry::get_num_keys
// Access: Public
// Description: Returns the number of public keys in the registry.
// This is actually the highest index number + 1, which
// might not strictly be the number of keys, since there
// may be holes in the list.
////////////////////////////////////////////////////////////////////
int PrcKeyRegistry::
get_num_keys() const {
return _keys.size();
}
////////////////////////////////////////////////////////////////////
// Function: PrcKeyRegistry::get_key
// Access: Public
// Description: Returns the nth public key, or NULL if the nth key is
// not defined.
////////////////////////////////////////////////////////////////////
EVP_PKEY *PrcKeyRegistry::
get_key(int n) const {
nassertr(n >= 0 && n < (int)_keys.size(), (EVP_PKEY *)NULL);
if (_keys[n]._def != (KeyDef *)NULL) {
if (_keys[n]._pkey == (EVP_PKEY *)NULL) {
// Convert the def to a EVP_PKEY structure.
const KeyDef *def = _keys[n]._def;
BIO *mbio = BIO_new_mem_buf((void *)def->_data, def->_length);
EVP_PKEY *pkey = PEM_read_bio_PUBKEY(mbio, NULL, NULL, NULL);
((PrcKeyRegistry *)this)->_keys[n]._pkey = pkey;
BIO_free(mbio);
if (pkey == (EVP_PKEY *)NULL) {
// Couldn't read the bio for some reason.
((PrcKeyRegistry *)this)->_keys[n]._def = NULL;
}
}
}
return _keys[n]._pkey;
}
////////////////////////////////////////////////////////////////////
// Function: PrcKeyRegistry::get_generated_time
// Access: Public
// Description: Returns the timestamp at which the indicated key was
// generated, or 0 if the key is not defined.
////////////////////////////////////////////////////////////////////
time_t PrcKeyRegistry::
get_generated_time(int n) const {
nassertr(n >= 0 && n < (int)_keys.size(), 0);
return _keys[n]._generated_time;
}
////////////////////////////////////////////////////////////////////
// Function: PrcKeyRegistry::get_global_ptr
// Access: Public, Static
// Description:
////////////////////////////////////////////////////////////////////
PrcKeyRegistry *PrcKeyRegistry::
get_global_ptr() {
if (_global_ptr == (PrcKeyRegistry *)NULL) {
_global_ptr = new PrcKeyRegistry;
}
return _global_ptr;
}
#endif // HAVE_OPENSSL