-rw-r--r-- 1004 lib25519-20240928/crypto_mGnP/ed25519/amd64-avx2-9l-maa4/mGnP.c raw
#include "crypto_mGnP.h"
#include "sc25519.h"
#include "ge25519.h"
#include "shared-data.h"
#include "crypto_verify_32.h"
void crypto_mGnP(
unsigned char *Q,
const unsigned char *m,
const unsigned char *n,
const unsigned char *P
)
{
sc25519 m_internal;
signed char m_slide[256];
unsigned char mcheck[32];
sc25519 n_internal;
signed char n_slide[256];
ge25519 P_internal;
ge25519_pniels CRYPTO_ALIGN(32) P_multiples[P_MULTIPLES];
ge25519_p3 result;
int ok;
sc25519_from32bytes(&m_internal,m);
sc25519_from64bytes(&n_internal,n);
ok = ge25519_unpackneg_vartime(&P_internal,P);
sc25519_to32bytes(mcheck,&m_internal);
if (crypto_verify_32(mcheck,m)) ok = 0;
sc25519_slide(m_slide,&m_internal,G_WINDOWSIZE);
sc25519_slide(n_slide,&n_internal,P_WINDOWSIZE);
ge25519_double_scalarmult_precompute(P_multiples,&P_internal,P_MULTIPLES);
ge25519_double_scalarmult_process(&result,n_slide,m_slide,P_multiples,G_multiples);
ge25519_pack(Q,&result);
Q[32] = ok;
}