diff options
author | Adam Ierymenko <adam.ierymenko@gmail.com> | 2013-07-04 16:56:19 -0400 |
---|---|---|
committer | Adam Ierymenko <adam.ierymenko@gmail.com> | 2013-07-04 16:56:19 -0400 |
commit | 150850b80012f852521c9935145cf966946334d5 (patch) | |
tree | c082369f2fef2515cfa2e4acf1b83250a3963158 /node/EllipticCurveKey.hpp | |
download | infinitytier-150850b80012f852521c9935145cf966946334d5.tar.gz infinitytier-150850b80012f852521c9935145cf966946334d5.zip |
New git repository for release - version 0.2.0 tagged
Diffstat (limited to 'node/EllipticCurveKey.hpp')
-rw-r--r-- | node/EllipticCurveKey.hpp | 124 |
1 files changed, 124 insertions, 0 deletions
diff --git a/node/EllipticCurveKey.hpp b/node/EllipticCurveKey.hpp new file mode 100644 index 00000000..5a7b895f --- /dev/null +++ b/node/EllipticCurveKey.hpp @@ -0,0 +1,124 @@ +/* + * ZeroTier One - Global Peer to Peer Ethernet + * Copyright (C) 2012-2013 ZeroTier Networks LLC + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + * -- + * + * ZeroTier may be used and distributed under the terms of the GPLv3, which + * are available at: http://www.gnu.org/licenses/gpl-3.0.html + * + * If you would like to embed ZeroTier into a commercial application or + * redistribute it in a modified binary form, please contact ZeroTier Networks + * LLC. Start here: http://www.zerotier.com/ + */ + +#ifndef _ZT_ELLIPTICCURVEKEY_H +#define _ZT_ELLIPTICCURVEKEY_H + +#include <string> +#include <algorithm> +#include <string.h> +#include "Utils.hpp" + +/** + * Key type ID for identifying our use of NIST-P-521 + * + * If in the future other types of keys are supported (post-quantum crypto?) + * then we'll need a key type 2, etc. When keys are stored in the database + * they are prefixed by this key type ID byte. + */ +#define ZT_KEY_TYPE 1 + +#define ZT_EC_OPENSSL_CURVE NID_secp521r1 +#define ZT_EC_CURVE_NAME "NIST-P-521" +#define ZT_EC_PRIME_BYTES 66 +#define ZT_EC_PUBLIC_KEY_BYTES (ZT_EC_PRIME_BYTES + 1) +#define ZT_EC_PRIVATE_KEY_BYTES ZT_EC_PRIME_BYTES +#define ZT_EC_MAX_BYTES ZT_EC_PUBLIC_KEY_BYTES + +namespace ZeroTier { + +class EllipticCurveKeyPair; + +/** + * An elliptic curve public or private key + */ +class EllipticCurveKey +{ + friend class EllipticCurveKeyPair; + +public: + EllipticCurveKey() + throw() : + _bytes(0) + { + } + + EllipticCurveKey(const void *data,unsigned int len) + throw() + { + if (len <= ZT_EC_MAX_BYTES) { + _bytes = len; + memcpy(_key,data,len); + } else _bytes = 0; + } + + EllipticCurveKey(const EllipticCurveKey &k) + throw() + { + _bytes = k._bytes; + memcpy(_key,k._key,_bytes); + } + + inline EllipticCurveKey &operator=(const EllipticCurveKey &k) + throw() + { + _bytes = k._bytes; + memcpy(_key,k._key,_bytes); + return *this; + } + + inline void set(const void *data,unsigned int len) + throw() + { + if (len <= ZT_EC_MAX_BYTES) { + _bytes = len; + memcpy(_key,data,len); + } else _bytes = 0; + } + + inline const unsigned char *data() const throw() { return _key; } + inline unsigned int size() const throw() { return _bytes; } + inline std::string toHex() const throw() { return Utils::hex(_key,_bytes); } + + inline unsigned char operator[](const unsigned int i) const throw() { return _key[i]; } + + inline bool operator==(const EllipticCurveKey &k) const throw() { return ((_bytes == k._bytes)&&(!memcmp(_key,k._key,_bytes))); } + inline bool operator<(const EllipticCurveKey &k) const throw() { return std::lexicographical_compare(_key,&_key[_bytes],k._key,&k._key[k._bytes]); } + inline bool operator!=(const EllipticCurveKey &k) const throw() { return !(*this == k); } + inline bool operator>(const EllipticCurveKey &k) const throw() { return (k < *this); } + inline bool operator<=(const EllipticCurveKey &k) const throw() { return !(k < *this); } + inline bool operator>=(const EllipticCurveKey &k) const throw() { return !(*this < k); } + +private: + unsigned int _bytes; + unsigned char _key[ZT_EC_MAX_BYTES]; +}; + +} // namespace ZeroTier + +#endif + |