X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Fkey.cc;h=a5e92aac67d75474d454b8976db5085233281b02;hb=4bd57fbbac67ac04ec47a9765b9f278aa1691851;hp=e7f34c04113d91ba34ab0888ccb731285e1048f3;hpb=f9cba324c8160a70b108d9e5b60a4ccad6ee9be2;p=libdcp.git diff --git a/src/key.cc b/src/key.cc index e7f34c04..a5e92aac 100644 --- a/src/key.cc +++ b/src/key.cc @@ -1,5 +1,5 @@ /* - Copyright (C) 2013-2014 Carl Hetherington + Copyright (C) 2013-2021 Carl Hetherington This file is part of libdcp. @@ -16,57 +16,82 @@ You should have received a copy of the GNU General Public License along with libdcp. If not, see . + In addition, as a special exception, the copyright holders give + permission to link the code of portions of this program with the + OpenSSL library under certain conditions as described in each + individual source file, and distribute linked combinations + including the two. + + You must obey the GNU General Public License in all respects + for all of the code used other than OpenSSL. If you modify + file(s) with this exception, you may extend this exception to your + version of the file(s), but you are not obligated to do so. If you + do not wish to do so, delete this exception statement from your + version. If you delete this exception statement from all source + files in the program, then also delete it here. */ + /** @file src/key.cc - * @brief Key class. + * @brief Key class */ + #include "key.h" -#include "AS_DCP.h" -#include "KM_prng.h" -#include "KM_util.h" -#include +#include "dcp_assert.h" +#include +#include +#include #include #include + using std::string; -using std::stringstream; using std::setw; using std::setfill; using namespace dcp; -Key::Key () - : _value (new uint8_t[ASDCP::KeyLen]) + +Key::Key (int length) + : _value (new uint8_t[length]) + , _length (length) { Kumu::FortunaRNG rng; - rng.FillRandom (_value, ASDCP::KeyLen); + rng.FillRandom (_value, _length); } -Key::Key (uint8_t const * value) - : _value (new uint8_t[ASDCP::KeyLen]) + +Key::Key (uint8_t const * value, int length) + : _value (new uint8_t[length]) + , _length (length) { - memcpy (_value, value, ASDCP::KeyLen); + memcpy (_value, value, _length); } + Key::Key (string value) - : _value (new uint8_t[ASDCP::KeyLen]) + : _value (new uint8_t[value.length() / 2]) + , _length (value.length() / 2) { - unsigned int length; - Kumu::hex2bin (value.c_str(), _value, ASDCP::KeyLen, &length); + unsigned int length_done; + Kumu::hex2bin (value.c_str(), _value, _length, &length_done); } + Key::Key (Key const & other) - : _value (new uint8_t[ASDCP::KeyLen]) + : _value (new uint8_t[other._length]) + , _length (other._length) { - memcpy (_value, other._value, ASDCP::KeyLen); + memcpy (_value, other._value, _length); } + Key::~Key () { delete[] _value; } + Key & Key::operator= (Key const & other) { @@ -74,31 +99,40 @@ Key::operator= (Key const & other) return *this; } - memcpy (_value, other._value, ASDCP::KeyLen); + _length = other._length; + memcpy (_value, other._value, _length); return *this; } + string Key::hex () const { - stringstream g; - - for (unsigned int i = 0; i < ASDCP::KeyLen; ++i) { - g << setw(2) << setfill('0') << std::hex << static_cast (_value[i]); + char buffer[_length * 2 + 1]; + + char* p = buffer; + for (int i = 0; i < _length; ++i) { +#ifdef LIBDCP_WINDOWS + __mingw_snprintf (p, 3, "%02hhx", _value[i]); +#else + snprintf (p, 3, "%02hhx", _value[i]); +#endif + p += 2; } - return g.str (); + return buffer; } + bool dcp::operator== (Key const & a, Key const & b) { - return memcmp (a.value(), b.value(), ASDCP::KeyLen) == 0; + return a.length() == b.length() && memcmp(a.value(), b.value(), a.length()) == 0; } + bool dcp::operator!= (Key const & a, Key const & b) { return !(a == b); } -