class xf::security::eddsaEd25519¶
#include "eddsa.hpp"
Overview¶
Edwards-curve Digital Signature Algorithm on curve ed25519. It take RFC 8032 “Edwards-Curve Digital Signature Algorithm (EdDSA)” as reference. This class provide signing and verifying functions.
// fields const int b const int c const int n const int a const ap_uint <256> Bx const ap_uint <256> By const ap_uint <256> L const ap_uint <256> p const ap_uint <256> d const ap_uint <256> p_5_d8 const ap_uint <256> sqrt_n1 const ap_uint <256> rMod ap_uint <64> head[8]
Methods¶
compress¶
void compress ( ap_uint <256> x, ap_uint <256> y, ap_uint <256>& res )
Compress a point (x, y) on curve to its compressed form.
Parameters:
| x | X coordinate of point. |
| y | Y coordinate of point. |
| res | compressed point representation. |
modularSqrt¶
bool modularSqrt ( ap_uint <256> u, ap_uint <256> v, ap_uint <256>& sqrt_a )
Calculate square root of u/v.
Parameters:
| u | Input u of u/v to calculate square root. |
| v | Input u of u/v to calculate square root. |
| sqrt_a | Square root of u/v. |
decompress¶
bool decompress ( ap_uint <256> P, ap_uint <256>& Px, ap_uint <256>& Py )
Decompress a point (Px, Py) from its compressed representation.
Parameters:
| P | compressed point representation. |
| Px | X coordinate of the point. |
| Py | Y coordinate of the point. |
pointAdd¶
void pointAdd ( ap_uint <256> x1, ap_uint <256> y1, ap_uint <256> x2, ap_uint <256> y2, ap_uint <256>& x3, ap_uint <256>& y3 )
perform point addition in ed25519, (x3, y3) = (x1, y1) + (x2, y2)
Parameters:
| x1 | X coordinate of point 1. |
| y1 | Y coordinate of point 1. |
| x2 | X coordinate of point 2. |
| y2 | Y coordinate of point 2. |
| x3 | X coordinate of point 3. |
| y3 | Y coordinate of point 3. |
pointMul¶
void pointMul ( ap_uint <256> x, ap_uint <256> y, ap_uint <256> mag, ap_uint <256>& resX, ap_uint <256>& resY )
perform point multiply scalar in ed25519, (resX, resY) = (x, y) * mag
Parameters:
| x | X coordinate of point to be multiplied. |
| y | Y coordinate of point to be multiplied. |
| mag | scalar operand of this multiplication. |
| resX | X coordinate of result. |
| resY | Y coordinate of result. |
generatePublicKey¶
void generatePublicKey ( ap_uint <256> privateKey, ap_uint <256>& publicKey, ap_uint <512>& privateKeyHash )
Generate public key and digest value of privateKey hash value from privateKey.
Parameters:
| privateKey | Private Key. |
| publicKey | Public Key. |
| privateKeyHash | Digest value of private key. |
sign¶
void sign ( hls::stream <ap_uint <64>>& msgStrm, hls::stream <ap_uint <128>>& lenStrm, hls::stream <bool>& endLenStrm, ap_uint <256> publicKey, ap_uint <512> privateKeyHash, hls::stream <ap_uint <512>>& signatureStrm, hls::stream <bool>& endSignatureStrm )
signing function
Parameters:
| msgStrm | Stream to input messages to be signed, each message should be input throught this stream twice. |
| lenStrm | Stream to input length of input messages. |
| endLenStrm | Stream of end flag of lenStrm. |
| publicKey | Public Key. |
| privateKeyHash | Digest value of private key. |
| signatureStrm | Stream to output signature. |
| endSignatureStrm | Stream of end flag of signatureStrm. |
verify¶
void verify ( hls::stream <ap_uint <64>>& msgStrm, hls::stream <ap_uint <128>>& lenStrm, hls::stream <ap_uint <512>>& signatureStrm, hls::stream <bool>& endSignatureStrm, hls::stream <ap_uint <256>>& publicKeyStrm, hls::stream <bool>& ifValidStrm, hls::stream <bool>& endIfValidStrm )
verifying function
Parameters:
| msgStrm | Stream to input messages to be signed. |
| lenStrm | Stream to input length of input messages. |
| signatureStrm | Stream to input signatures. |
| endSignatureStrm | Stream of end flag of signatures. |
| publicKeyStrm | Stream to input public key. |
| ifValidStrm | Stream to output if message signature is valid. |
| endIfValidStrm | Stream of end flag of ifValidStrm. |