@@ -3,13 +3,13 @@ | |||||
* @author Mike Hamburg | * @author Mike Hamburg | ||||
* | * | ||||
* @copyright | * @copyright | ||||
* Copyright (c) 2015 Cryptography Research, Inc. \n | |||||
* Released under the MIT License. See LICENSE.txt for license information. | |||||
* Copyright (c) 2015 Cryptography Research, Inc. \n | |||||
* Released under the MIT License. See LICENSE.txt for license information. | |||||
* | * | ||||
* @brief A group of prime order p, C++ wrapper. | * @brief A group of prime order p, C++ wrapper. | ||||
* | * | ||||
* The Decaf library implements cryptographic operations on a an elliptic curve | * The Decaf library implements cryptographic operations on a an elliptic curve | ||||
* group of prime order p. It accomplishes this by using a twisted Edwards | |||||
* group of prime order p. It accomplishes this by using a twisted Edwards | |||||
* curve (isogenous to Curve25519) and wiping out the cofactor. | * curve (isogenous to Curve25519) and wiping out the cofactor. | ||||
* | * | ||||
* The formulas are all complete and have no special cases, except that | * The formulas are all complete and have no special cases, except that | ||||
@@ -97,10 +97,10 @@ public: | |||||
} | } | ||||
/** @brief Construct from decaf_scalar_t object. */ | /** @brief Construct from decaf_scalar_t object. */ | ||||
inline Scalar(const Wrapped &t = decaf_255_scalar_zero) NOEXCEPT { decaf_255_scalar_copy(s,t); } | |||||
inline Scalar(const Wrapped &t = decaf_255_scalar_zero) NOEXCEPT { decaf_255_scalar_copy(s,t); } | |||||
/** @brief Copy constructor. */ | /** @brief Copy constructor. */ | ||||
inline Scalar(const Scalar &x) NOEXCEPT { *this = x; } | |||||
inline Scalar(const Scalar &x) NOEXCEPT { *this = x; } | |||||
/** @brief Construct from arbitrary-length little-endian byte sequence. */ | /** @brief Construct from arbitrary-length little-endian byte sequence. */ | ||||
inline Scalar(const Block &buffer) NOEXCEPT { *this = buffer; } | inline Scalar(const Block &buffer) NOEXCEPT { *this = buffer; } | ||||
@@ -114,10 +114,10 @@ public: | |||||
} | } | ||||
/** @brief Assignment. */ | /** @brief Assignment. */ | ||||
inline Scalar& operator=(const Scalar &x) NOEXCEPT { decaf_255_scalar_copy(s,x.s); return *this; } | |||||
inline Scalar& operator=(const Scalar &x) NOEXCEPT { decaf_255_scalar_copy(s,x.s); return *this; } | |||||
/** @brief Assign from unsigned word. */ | /** @brief Assign from unsigned word. */ | ||||
inline Scalar& operator=(decaf_word_t w) NOEXCEPT { decaf_255_scalar_set_unsigned(s,w); return *this; } | |||||
inline Scalar& operator=(decaf_word_t w) NOEXCEPT { decaf_255_scalar_set_unsigned(s,w); return *this; } | |||||
/** @brief Assign from signed int. */ | /** @brief Assign from signed int. */ | ||||
inline Scalar& operator=(int w) NOEXCEPT { | inline Scalar& operator=(int w) NOEXCEPT { | ||||
@@ -146,27 +146,27 @@ public: | |||||
} | } | ||||
/** Add. */ | /** Add. */ | ||||
inline Scalar operator+ (const Scalar &q) const NOEXCEPT { Scalar r((NOINIT())); decaf_255_scalar_add(r.s,s,q.s); return r; } | |||||
inline Scalar operator+ (const Scalar &q) const NOEXCEPT { Scalar r((NOINIT())); decaf_255_scalar_add(r.s,s,q.s); return r; } | |||||
/** Add to this. */ | /** Add to this. */ | ||||
inline Scalar &operator+=(const Scalar &q) NOEXCEPT { decaf_255_scalar_add(s,s,q.s); return *this; } | |||||
inline Scalar &operator+=(const Scalar &q) NOEXCEPT { decaf_255_scalar_add(s,s,q.s); return *this; } | |||||
/** Subtract. */ | /** Subtract. */ | ||||
inline Scalar operator- (const Scalar &q) const NOEXCEPT { Scalar r((NOINIT())); decaf_255_scalar_sub(r.s,s,q.s); return r; } | |||||
inline Scalar operator- (const Scalar &q) const NOEXCEPT { Scalar r((NOINIT())); decaf_255_scalar_sub(r.s,s,q.s); return r; } | |||||
/** Subtract from this. */ | /** Subtract from this. */ | ||||
inline Scalar &operator-=(const Scalar &q) NOEXCEPT { decaf_255_scalar_sub(s,s,q.s); return *this; } | |||||
inline Scalar &operator-=(const Scalar &q) NOEXCEPT { decaf_255_scalar_sub(s,s,q.s); return *this; } | |||||
/** Multiply */ | /** Multiply */ | ||||
inline Scalar operator* (const Scalar &q) const NOEXCEPT { Scalar r((NOINIT())); decaf_255_scalar_mul(r.s,s,q.s); return r; } | |||||
inline Scalar operator* (const Scalar &q) const NOEXCEPT { Scalar r((NOINIT())); decaf_255_scalar_mul(r.s,s,q.s); return r; } | |||||
/** Multiply into this. */ | /** Multiply into this. */ | ||||
inline Scalar &operator*=(const Scalar &q) NOEXCEPT { decaf_255_scalar_mul(s,s,q.s); return *this; } | |||||
inline Scalar &operator*=(const Scalar &q) NOEXCEPT { decaf_255_scalar_mul(s,s,q.s); return *this; } | |||||
/** Negate */ | /** Negate */ | ||||
inline Scalar operator- () const NOEXCEPT { Scalar r((NOINIT())); decaf_255_scalar_sub(r.s,decaf_255_scalar_zero,s); return r; } | |||||
inline Scalar operator- () const NOEXCEPT { Scalar r((NOINIT())); decaf_255_scalar_sub(r.s,decaf_255_scalar_zero,s); return r; } | |||||
/** @brief Invert with Fermat's Little Theorem (slow!). If *this == 0, return 0. */ | |||||
/** @brief Invert with Fermat's Little Theorem (slow!). If *this == 0, return 0. */ | |||||
inline Scalar inverse() const throw(CryptoException) { | inline Scalar inverse() const throw(CryptoException) { | ||||
Scalar r; | Scalar r; | ||||
if (DECAF_SUCCESS != decaf_255_scalar_invert(r.s,s)) { | if (DECAF_SUCCESS != decaf_255_scalar_invert(r.s,s)) { | ||||
@@ -175,17 +175,17 @@ public: | |||||
return r; | return r; | ||||
} | } | ||||
/** @brief Divide by inverting q. If q == 0, return 0. */ | |||||
/** @brief Divide by inverting q. If q == 0, return 0. */ | |||||
inline Scalar operator/ (const Scalar &q) const throw(CryptoException) { return *this * q.inverse(); } | inline Scalar operator/ (const Scalar &q) const throw(CryptoException) { return *this * q.inverse(); } | ||||
/** @brief Divide by inverting q. If q == 0, return 0. */ | |||||
/** @brief Divide by inverting q. If q == 0, return 0. */ | |||||
inline Scalar &operator/=(const Scalar &q) throw(CryptoException) { return *this *= q.inverse(); } | inline Scalar &operator/=(const Scalar &q) throw(CryptoException) { return *this *= q.inverse(); } | ||||
/** @brief Compare in constant time */ | /** @brief Compare in constant time */ | ||||
inline bool operator!=(const Scalar &q) const NOEXCEPT { return !(*this == q); } | |||||
inline bool operator!=(const Scalar &q) const NOEXCEPT { return !(*this == q); } | |||||
/** @brief Compare in constant time */ | /** @brief Compare in constant time */ | ||||
inline bool operator==(const Scalar &q) const NOEXCEPT { return !!decaf_255_scalar_eq(s,q.s); } | |||||
inline bool operator==(const Scalar &q) const NOEXCEPT { return !!decaf_255_scalar_eq(s,q.s); } | |||||
/** @brief Scalarmul with scalar on left. */ | /** @brief Scalarmul with scalar on left. */ | ||||
inline Point operator* (const Point &q) const NOEXCEPT { return q * (*this); } | inline Point operator* (const Point &q) const NOEXCEPT { return q * (*this); } | ||||
@@ -268,7 +268,7 @@ public: | |||||
* | * | ||||
* @retval DECAF_SUCCESS the string was successfully decoded. | * @retval DECAF_SUCCESS the string was successfully decoded. | ||||
* @return DECAF_FAILURE the string was the wrong length, or wasn't the encoding of a point, | * @return DECAF_FAILURE the string was the wrong length, or wasn't the encoding of a point, | ||||
* or was the identity and allow_identity was DECAF_FALSE. Contents of the buffer are undefined. | |||||
* or was the identity and allow_identity was DECAF_FALSE. Contents of the buffer are undefined. | |||||
*/ | */ | ||||
static inline decaf_error_t __attribute__((warn_unused_result)) decode ( | static inline decaf_error_t __attribute__((warn_unused_result)) decode ( | ||||
Point &p, const FixedBlock<SER_BYTES> &buffer, decaf_bool_t allow_identity=DECAF_TRUE | Point &p, const FixedBlock<SER_BYTES> &buffer, decaf_bool_t allow_identity=DECAF_TRUE | ||||
@@ -309,7 +309,7 @@ public: | |||||
} | } | ||||
/** | /** | ||||
* @brief Encode to string. The identity encodes to the all-zero string. | |||||
* @brief Encode to string. The identity encodes to the all-zero string. | |||||
*/ | */ | ||||
inline operator SecureBuffer() const { | inline operator SecureBuffer() const { | ||||
SecureBuffer buffer(SER_BYTES); | SecureBuffer buffer(SER_BYTES); | ||||
@@ -326,42 +326,42 @@ public: | |||||
} | } | ||||
/** @brief Point add. */ | /** @brief Point add. */ | ||||
inline Point operator+ (const Point &q) const NOEXCEPT { Point r((NOINIT())); decaf_255_point_add(r.p,p,q.p); return r; } | |||||
inline Point operator+ (const Point &q) const NOEXCEPT { Point r((NOINIT())); decaf_255_point_add(r.p,p,q.p); return r; } | |||||
/** @brief Point add. */ | /** @brief Point add. */ | ||||
inline Point &operator+=(const Point &q) NOEXCEPT { decaf_255_point_add(p,p,q.p); return *this; } | |||||
inline Point &operator+=(const Point &q) NOEXCEPT { decaf_255_point_add(p,p,q.p); return *this; } | |||||
/** @brief Point subtract. */ | /** @brief Point subtract. */ | ||||
inline Point operator- (const Point &q) const NOEXCEPT { Point r((NOINIT())); decaf_255_point_sub(r.p,p,q.p); return r; } | |||||
inline Point operator- (const Point &q) const NOEXCEPT { Point r((NOINIT())); decaf_255_point_sub(r.p,p,q.p); return r; } | |||||
/** @brief Point subtract. */ | /** @brief Point subtract. */ | ||||
inline Point &operator-=(const Point &q) NOEXCEPT { decaf_255_point_sub(p,p,q.p); return *this; } | |||||
inline Point &operator-=(const Point &q) NOEXCEPT { decaf_255_point_sub(p,p,q.p); return *this; } | |||||
/** @brief Point negate. */ | /** @brief Point negate. */ | ||||
inline Point operator- () const NOEXCEPT { Point r((NOINIT())); decaf_255_point_negate(r.p,p); return r; } | |||||
inline Point operator- () const NOEXCEPT { Point r((NOINIT())); decaf_255_point_negate(r.p,p); return r; } | |||||
/** @brief Double the point out of place. */ | /** @brief Double the point out of place. */ | ||||
inline Point times_two () const NOEXCEPT { Point r((NOINIT())); decaf_255_point_double(r.p,p); return r; } | |||||
inline Point times_two () const NOEXCEPT { Point r((NOINIT())); decaf_255_point_double(r.p,p); return r; } | |||||
/** @brief Double the point in place. */ | /** @brief Double the point in place. */ | ||||
inline Point &double_in_place() NOEXCEPT { decaf_255_point_double(p,p); return *this; } | |||||
inline Point &double_in_place() NOEXCEPT { decaf_255_point_double(p,p); return *this; } | |||||
/** @brief Constant-time compare. */ | /** @brief Constant-time compare. */ | ||||
inline bool operator!=(const Point &q) const NOEXCEPT { return ! decaf_255_point_eq(p,q.p); } | |||||
inline bool operator!=(const Point &q) const NOEXCEPT { return ! decaf_255_point_eq(p,q.p); } | |||||
/** @brief Constant-time compare. */ | /** @brief Constant-time compare. */ | ||||
inline bool operator==(const Point &q) const NOEXCEPT { return !!decaf_255_point_eq(p,q.p); } | |||||
inline bool operator==(const Point &q) const NOEXCEPT { return !!decaf_255_point_eq(p,q.p); } | |||||
/** @brief Scalar multiply. */ | /** @brief Scalar multiply. */ | ||||
inline Point operator* (const Scalar &s) const NOEXCEPT { Point r((NOINIT())); decaf_255_point_scalarmul(r.p,p,s.s); return r; } | |||||
inline Point operator* (const Scalar &s) const NOEXCEPT { Point r((NOINIT())); decaf_255_point_scalarmul(r.p,p,s.s); return r; } | |||||
/** @brief Scalar multiply in place. */ | /** @brief Scalar multiply in place. */ | ||||
inline Point &operator*=(const Scalar &s) NOEXCEPT { decaf_255_point_scalarmul(p,p,s.s); return *this; } | |||||
inline Point &operator*=(const Scalar &s) NOEXCEPT { decaf_255_point_scalarmul(p,p,s.s); return *this; } | |||||
/** @brief Multiply by s.inverse(). If s=0, maps to the identity. */ | |||||
inline Point operator/ (const Scalar &s) const throw(CryptoException) { return (*this) * s.inverse(); } | |||||
/** @brief Multiply by s.inverse(). If s=0, maps to the identity. */ | |||||
inline Point operator/ (const Scalar &s) const throw(CryptoException) { return (*this) * s.inverse(); } | |||||
/** @brief Multiply by s.inverse(). If s=0, maps to the identity. */ | |||||
/** @brief Multiply by s.inverse(). If s=0, maps to the identity. */ | |||||
inline Point &operator/=(const Scalar &s) throw(CryptoException) { return (*this) *= s.inverse(); } | inline Point &operator/=(const Scalar &s) throw(CryptoException) { return (*this) *= s.inverse(); } | ||||
/** @brief Validate / sanity check */ | /** @brief Validate / sanity check */ | ||||
@@ -522,7 +522,7 @@ public: | |||||
#endif | #endif | ||||
/** | /** | ||||
* @brief Initilaize from point. Must allocate memory, and may throw. | |||||
* @brief Initilaize from point. Must allocate memory, and may throw. | |||||
*/ | */ | ||||
inline Precomputed &operator=(const Point &it) throw(std::bad_alloc) { | inline Precomputed &operator=(const Point &it) throw(std::bad_alloc) { | ||||
alloc(); | alloc(); | ||||
@@ -545,7 +545,7 @@ public: | |||||
/** @brief Fixed base scalarmul. */ | /** @brief Fixed base scalarmul. */ | ||||
inline Point operator* (const Scalar &s) const NOEXCEPT { Point r; decaf_255_precomputed_scalarmul(r.p,get(),s.s); return r; } | inline Point operator* (const Scalar &s) const NOEXCEPT { Point r; decaf_255_precomputed_scalarmul(r.p,get(),s.s); return r; } | ||||
/** @brief Multiply by s.inverse(). If s=0, maps to the identity. */ | |||||
/** @brief Multiply by s.inverse(). If s=0, maps to the identity. */ | |||||
inline Point operator/ (const Scalar &s) const throw(CryptoException) { return (*this) * s.inverse(); } | inline Point operator/ (const Scalar &s) const throw(CryptoException) { return (*this) * s.inverse(); } | ||||
/** @brief Return the table for the base point. */ | /** @brief Return the table for the base point. */ | ||||
@@ -3,13 +3,13 @@ | |||||
* @author Mike Hamburg | * @author Mike Hamburg | ||||
* | * | ||||
* @copyright | * @copyright | ||||
* Copyright (c) 2015 Cryptography Research, Inc. \n | |||||
* Released under the MIT License. See LICENSE.txt for license information. | |||||
* Copyright (c) 2015 Cryptography Research, Inc. \n | |||||
* Released under the MIT License. See LICENSE.txt for license information. | |||||
* | * | ||||
* @brief A group of prime order p, C++ wrapper. | * @brief A group of prime order p, C++ wrapper. | ||||
* | * | ||||
* The Decaf library implements cryptographic operations on a an elliptic curve | * The Decaf library implements cryptographic operations on a an elliptic curve | ||||
* group of prime order p. It accomplishes this by using a twisted Edwards | |||||
* group of prime order p. It accomplishes this by using a twisted Edwards | |||||
* curve (isogenous to Ed448-Goldilocks) and wiping out the cofactor. | * curve (isogenous to Ed448-Goldilocks) and wiping out the cofactor. | ||||
* | * | ||||
* The formulas are all complete and have no special cases, except that | * The formulas are all complete and have no special cases, except that | ||||
@@ -96,10 +96,10 @@ public: | |||||
} | } | ||||
/** @brief Construct from decaf_scalar_t object. */ | /** @brief Construct from decaf_scalar_t object. */ | ||||
inline Scalar(const Wrapped &t = decaf_448_scalar_zero) NOEXCEPT { decaf_448_scalar_copy(s,t); } | |||||
inline Scalar(const Wrapped &t = decaf_448_scalar_zero) NOEXCEPT { decaf_448_scalar_copy(s,t); } | |||||
/** @brief Copy constructor. */ | /** @brief Copy constructor. */ | ||||
inline Scalar(const Scalar &x) NOEXCEPT { *this = x; } | |||||
inline Scalar(const Scalar &x) NOEXCEPT { *this = x; } | |||||
/** @brief Construct from arbitrary-length little-endian byte sequence. */ | /** @brief Construct from arbitrary-length little-endian byte sequence. */ | ||||
inline Scalar(const Block &buffer) NOEXCEPT { *this = buffer; } | inline Scalar(const Block &buffer) NOEXCEPT { *this = buffer; } | ||||
@@ -113,10 +113,10 @@ public: | |||||
} | } | ||||
/** @brief Assignment. */ | /** @brief Assignment. */ | ||||
inline Scalar& operator=(const Scalar &x) NOEXCEPT { decaf_448_scalar_copy(s,x.s); return *this; } | |||||
inline Scalar& operator=(const Scalar &x) NOEXCEPT { decaf_448_scalar_copy(s,x.s); return *this; } | |||||
/** @brief Assign from unsigned word. */ | /** @brief Assign from unsigned word. */ | ||||
inline Scalar& operator=(decaf_word_t w) NOEXCEPT { decaf_448_scalar_set_unsigned(s,w); return *this; } | |||||
inline Scalar& operator=(decaf_word_t w) NOEXCEPT { decaf_448_scalar_set_unsigned(s,w); return *this; } | |||||
/** @brief Assign from signed int. */ | /** @brief Assign from signed int. */ | ||||
@@ -146,27 +146,27 @@ public: | |||||
} | } | ||||
/** Add. */ | /** Add. */ | ||||
inline Scalar operator+ (const Scalar &q) const NOEXCEPT { Scalar r((NOINIT())); decaf_448_scalar_add(r.s,s,q.s); return r; } | |||||
inline Scalar operator+ (const Scalar &q) const NOEXCEPT { Scalar r((NOINIT())); decaf_448_scalar_add(r.s,s,q.s); return r; } | |||||
/** Add to this. */ | /** Add to this. */ | ||||
inline Scalar &operator+=(const Scalar &q) NOEXCEPT { decaf_448_scalar_add(s,s,q.s); return *this; } | |||||
inline Scalar &operator+=(const Scalar &q) NOEXCEPT { decaf_448_scalar_add(s,s,q.s); return *this; } | |||||
/** Subtract. */ | /** Subtract. */ | ||||
inline Scalar operator- (const Scalar &q) const NOEXCEPT { Scalar r((NOINIT())); decaf_448_scalar_sub(r.s,s,q.s); return r; } | |||||
inline Scalar operator- (const Scalar &q) const NOEXCEPT { Scalar r((NOINIT())); decaf_448_scalar_sub(r.s,s,q.s); return r; } | |||||
/** Subtract from this. */ | /** Subtract from this. */ | ||||
inline Scalar &operator-=(const Scalar &q) NOEXCEPT { decaf_448_scalar_sub(s,s,q.s); return *this; } | |||||
inline Scalar &operator-=(const Scalar &q) NOEXCEPT { decaf_448_scalar_sub(s,s,q.s); return *this; } | |||||
/** Multiply */ | /** Multiply */ | ||||
inline Scalar operator* (const Scalar &q) const NOEXCEPT { Scalar r((NOINIT())); decaf_448_scalar_mul(r.s,s,q.s); return r; } | |||||
inline Scalar operator* (const Scalar &q) const NOEXCEPT { Scalar r((NOINIT())); decaf_448_scalar_mul(r.s,s,q.s); return r; } | |||||
/** Multiply into this. */ | /** Multiply into this. */ | ||||
inline Scalar &operator*=(const Scalar &q) NOEXCEPT { decaf_448_scalar_mul(s,s,q.s); return *this; } | |||||
inline Scalar &operator*=(const Scalar &q) NOEXCEPT { decaf_448_scalar_mul(s,s,q.s); return *this; } | |||||
/** Negate */ | /** Negate */ | ||||
inline Scalar operator- () const NOEXCEPT { Scalar r((NOINIT())); decaf_448_scalar_sub(r.s,decaf_448_scalar_zero,s); return r; } | |||||
inline Scalar operator- () const NOEXCEPT { Scalar r((NOINIT())); decaf_448_scalar_sub(r.s,decaf_448_scalar_zero,s); return r; } | |||||
/** @brief Invert with Fermat's Little Theorem (slow!). If *this == 0, return 0. */ | |||||
/** @brief Invert with Fermat's Little Theorem (slow!). If *this == 0, return 0. */ | |||||
inline Scalar inverse() const throw(CryptoException) { | inline Scalar inverse() const throw(CryptoException) { | ||||
Scalar r; | Scalar r; | ||||
if (DECAF_SUCCESS != decaf_448_scalar_invert(r.s,s)) { | if (DECAF_SUCCESS != decaf_448_scalar_invert(r.s,s)) { | ||||
@@ -175,17 +175,17 @@ public: | |||||
return r; | return r; | ||||
} | } | ||||
/** @brief Divide by inverting q. If q == 0, return 0. */ | |||||
/** @brief Divide by inverting q. If q == 0, return 0. */ | |||||
inline Scalar operator/ (const Scalar &q) const throw(CryptoException) { return *this * q.inverse(); } | inline Scalar operator/ (const Scalar &q) const throw(CryptoException) { return *this * q.inverse(); } | ||||
/** @brief Divide by inverting q. If q == 0, return 0. */ | |||||
/** @brief Divide by inverting q. If q == 0, return 0. */ | |||||
inline Scalar &operator/=(const Scalar &q) throw(CryptoException) { return *this *= q.inverse(); } | inline Scalar &operator/=(const Scalar &q) throw(CryptoException) { return *this *= q.inverse(); } | ||||
/** @brief Compare in constant time */ | /** @brief Compare in constant time */ | ||||
inline bool operator!=(const Scalar &q) const NOEXCEPT { return !(*this == q); } | |||||
inline bool operator!=(const Scalar &q) const NOEXCEPT { return !(*this == q); } | |||||
/** @brief Compare in constant time */ | /** @brief Compare in constant time */ | ||||
inline bool operator==(const Scalar &q) const NOEXCEPT { return !!decaf_448_scalar_eq(s,q.s); } | |||||
inline bool operator==(const Scalar &q) const NOEXCEPT { return !!decaf_448_scalar_eq(s,q.s); } | |||||
/** @brief Scalarmul with scalar on left. */ | /** @brief Scalarmul with scalar on left. */ | ||||
inline Point operator* (const Point &q) const NOEXCEPT { return q * (*this); } | inline Point operator* (const Point &q) const NOEXCEPT { return q * (*this); } | ||||
@@ -268,7 +268,7 @@ public: | |||||
* | * | ||||
* @retval DECAF_SUCCESS the string was successfully decoded. | * @retval DECAF_SUCCESS the string was successfully decoded. | ||||
* @return DECAF_FAILURE the string was the wrong length, or wasn't the encoding of a point, | * @return DECAF_FAILURE the string was the wrong length, or wasn't the encoding of a point, | ||||
* or was the identity and allow_identity was DECAF_FALSE. Contents of the buffer are undefined. | |||||
* or was the identity and allow_identity was DECAF_FALSE. Contents of the buffer are undefined. | |||||
*/ | */ | ||||
static inline decaf_error_t __attribute__((warn_unused_result)) decode ( | static inline decaf_error_t __attribute__((warn_unused_result)) decode ( | ||||
Point &p, const FixedBlock<SER_BYTES> &buffer, decaf_bool_t allow_identity=DECAF_TRUE | Point &p, const FixedBlock<SER_BYTES> &buffer, decaf_bool_t allow_identity=DECAF_TRUE | ||||
@@ -309,7 +309,7 @@ public: | |||||
} | } | ||||
/** | /** | ||||
* @brief Encode to string. The identity encodes to the all-zero string. | |||||
* @brief Encode to string. The identity encodes to the all-zero string. | |||||
*/ | */ | ||||
inline operator SecureBuffer() const { | inline operator SecureBuffer() const { | ||||
SecureBuffer buffer(SER_BYTES); | SecureBuffer buffer(SER_BYTES); | ||||
@@ -326,42 +326,42 @@ public: | |||||
} | } | ||||
/** @brief Point add. */ | /** @brief Point add. */ | ||||
inline Point operator+ (const Point &q) const NOEXCEPT { Point r((NOINIT())); decaf_448_point_add(r.p,p,q.p); return r; } | |||||
inline Point operator+ (const Point &q) const NOEXCEPT { Point r((NOINIT())); decaf_448_point_add(r.p,p,q.p); return r; } | |||||
/** @brief Point add. */ | /** @brief Point add. */ | ||||
inline Point &operator+=(const Point &q) NOEXCEPT { decaf_448_point_add(p,p,q.p); return *this; } | |||||
inline Point &operator+=(const Point &q) NOEXCEPT { decaf_448_point_add(p,p,q.p); return *this; } | |||||
/** @brief Point subtract. */ | /** @brief Point subtract. */ | ||||
inline Point operator- (const Point &q) const NOEXCEPT { Point r((NOINIT())); decaf_448_point_sub(r.p,p,q.p); return r; } | |||||
inline Point operator- (const Point &q) const NOEXCEPT { Point r((NOINIT())); decaf_448_point_sub(r.p,p,q.p); return r; } | |||||
/** @brief Point subtract. */ | /** @brief Point subtract. */ | ||||
inline Point &operator-=(const Point &q) NOEXCEPT { decaf_448_point_sub(p,p,q.p); return *this; } | |||||
inline Point &operator-=(const Point &q) NOEXCEPT { decaf_448_point_sub(p,p,q.p); return *this; } | |||||
/** @brief Point negate. */ | /** @brief Point negate. */ | ||||
inline Point operator- () const NOEXCEPT { Point r((NOINIT())); decaf_448_point_negate(r.p,p); return r; } | |||||
inline Point operator- () const NOEXCEPT { Point r((NOINIT())); decaf_448_point_negate(r.p,p); return r; } | |||||
/** @brief Double the point out of place. */ | /** @brief Double the point out of place. */ | ||||
inline Point times_two () const NOEXCEPT { Point r((NOINIT())); decaf_448_point_double(r.p,p); return r; } | |||||
inline Point times_two () const NOEXCEPT { Point r((NOINIT())); decaf_448_point_double(r.p,p); return r; } | |||||
/** @brief Double the point in place. */ | /** @brief Double the point in place. */ | ||||
inline Point &double_in_place() NOEXCEPT { decaf_448_point_double(p,p); return *this; } | |||||
inline Point &double_in_place() NOEXCEPT { decaf_448_point_double(p,p); return *this; } | |||||
/** @brief Constant-time compare. */ | /** @brief Constant-time compare. */ | ||||
inline bool operator!=(const Point &q) const NOEXCEPT { return ! decaf_448_point_eq(p,q.p); } | |||||
inline bool operator!=(const Point &q) const NOEXCEPT { return ! decaf_448_point_eq(p,q.p); } | |||||
/** @brief Constant-time compare. */ | /** @brief Constant-time compare. */ | ||||
inline bool operator==(const Point &q) const NOEXCEPT { return !!decaf_448_point_eq(p,q.p); } | |||||
inline bool operator==(const Point &q) const NOEXCEPT { return !!decaf_448_point_eq(p,q.p); } | |||||
/** @brief Scalar multiply. */ | /** @brief Scalar multiply. */ | ||||
inline Point operator* (const Scalar &s) const NOEXCEPT { Point r((NOINIT())); decaf_448_point_scalarmul(r.p,p,s.s); return r; } | |||||
inline Point operator* (const Scalar &s) const NOEXCEPT { Point r((NOINIT())); decaf_448_point_scalarmul(r.p,p,s.s); return r; } | |||||
/** @brief Scalar multiply in place. */ | /** @brief Scalar multiply in place. */ | ||||
inline Point &operator*=(const Scalar &s) NOEXCEPT { decaf_448_point_scalarmul(p,p,s.s); return *this; } | |||||
inline Point &operator*=(const Scalar &s) NOEXCEPT { decaf_448_point_scalarmul(p,p,s.s); return *this; } | |||||
/** @brief Multiply by s.inverse(). If s=0, maps to the identity. */ | |||||
inline Point operator/ (const Scalar &s) const throw(CryptoException) { return (*this) * s.inverse(); } | |||||
/** @brief Multiply by s.inverse(). If s=0, maps to the identity. */ | |||||
inline Point operator/ (const Scalar &s) const throw(CryptoException) { return (*this) * s.inverse(); } | |||||
/** @brief Multiply by s.inverse(). If s=0, maps to the identity. */ | |||||
/** @brief Multiply by s.inverse(). If s=0, maps to the identity. */ | |||||
inline Point &operator/=(const Scalar &s) throw(CryptoException) { return (*this) *= s.inverse(); } | inline Point &operator/=(const Scalar &s) throw(CryptoException) { return (*this) *= s.inverse(); } | ||||
/** @brief Validate / sanity check */ | /** @brief Validate / sanity check */ | ||||
@@ -522,7 +522,7 @@ public: | |||||
#endif | #endif | ||||
/** | /** | ||||
* @brief Initilaize from point. Must allocate memory, and may throw. | |||||
* @brief Initilaize from point. Must allocate memory, and may throw. | |||||
*/ | */ | ||||
inline Precomputed &operator=(const Point &it) throw(std::bad_alloc) { | inline Precomputed &operator=(const Point &it) throw(std::bad_alloc) { | ||||
alloc(); | alloc(); | ||||
@@ -545,7 +545,7 @@ public: | |||||
/** @brief Fixed base scalarmul. */ | /** @brief Fixed base scalarmul. */ | ||||
inline Point operator* (const Scalar &s) const NOEXCEPT { Point r; decaf_448_precomputed_scalarmul(r.p,get(),s.s); return r; } | inline Point operator* (const Scalar &s) const NOEXCEPT { Point r; decaf_448_precomputed_scalarmul(r.p,get(),s.s); return r; } | ||||
/** @brief Multiply by s.inverse(). If s=0, maps to the identity. */ | |||||
/** @brief Multiply by s.inverse(). If s=0, maps to the identity. */ | |||||
inline Point operator/ (const Scalar &s) const throw(CryptoException) { return (*this) * s.inverse(); } | inline Point operator/ (const Scalar &s) const throw(CryptoException) { return (*this) * s.inverse(); } | ||||
/** @brief Return the table for the base point. */ | /** @brief Return the table for the base point. */ | ||||