16#ifndef MCELIECE_LOCAL_H
17#define MCELIECE_LOCAL_H
25#include "crypt_errno.h"
26#include "crypt_algid.h"
27#include "crypt_drbg.h"
33#define MCELIECE_GF_POLY 0x201B
34#define MCELIECE_SEED_BYTES 48
37#define MCELIECE_SIGMA1 16
38#define MCELIECE_SIGMA2 32
42#define MCELIECE_Q 8192
43#define MCELIECE_Q_1 8191
45#define MCELIECE_PARA_6688_N 6688
46#define MCELIECE_PARA_6960_N 6960
47#define MCELIECE_PARA_8192_N 8192
49#define MCELIECE_L_BYTES ((MCELIECE_L) / (8))
51#define SAME_MASK(k, val) ((uint64_t)(-(int64_t)(((((uint32_t)((k) ^ (val)))) - (1U)) >> (31))))
53typedef uint16_t GFElement;
74 uint8_t delta[MCELIECE_L_BYTES];
80 size_t controlbitsLen;
103 int32_t privateKeyBytes;
104 int32_t publicKeyBytes;
105 int32_t sharedKeyBytes;
120static inline uint64_t CMMakeMask(uint64_t x)
122 int64_t sx = (int64_t)x;
123 uint64_t nz = (uint64_t)((sx >> 63) | ((-sx) >> 63));
127static inline uint64_t CMLoad8(
const uint8_t *x)
130 memcpy_s(&r, 8, x, 8);
134static inline void CMStore8(uint8_t *x, uint64_t v)
136 memcpy_s(x, 8, &v, 8);
140static inline int32_t CMCtz64(uint64_t x)
143 while ((x & 1) == 0) {
155int32_t CbitsFromPermNs(uint8_t *out,
const int16_t *pi,
const int64_t w,
const int64_t n);
158int32_t SupportFromCbits(GFElement *L,
const uint8_t *cbits,
const int64_t w,
const int32_t lenN);
164int32_t DecodeGoppa(
const uint8_t *received,
const GFPolynomial *g,
const GFElement *alpha, uint8_t *errorVector,
165 int32_t errorVecLen, int32_t *decodeSuccess,
const McelieceParams *params);
169int32_t FixedWeightVector(CRYPT_MCELIECE_Ctx *ctx, uint8_t *output);
173int32_t EncodeVector(
const uint8_t *errorVector,
const GFMatrix *matT, uint8_t *ciphertext,
183int32_t GenPolyOverGF(GFElement *out,
const GFElement *f,
const int32_t t,
const int32_t m);
185GFElement GFAddtion(GFElement a, GFElement b);
187GFElement GFMultiplication(GFElement a, GFElement b);
189GFElement GFInverse(GFElement a);
191GFElement GFDivision(GFElement a, GFElement b);
193GFElement GFPower(GFElement base, int32_t exp);
199void PolynomialRoots(GFElement *out,
const GFElement *f,
const GFElement *L,
const int32_t n,
const int32_t t);
201GFElement PolynomialEval(
const GFPolynomial *poly, GFElement x);
203int32_t PolynomialSetCoeff(
GFPolynomial *poly,
const int32_t degree,
const GFElement coeff);
212int32_t McElieceEncapsInternal(CRYPT_MCELIECE_Ctx *ctx, uint8_t *ciphertext, uint8_t *sessionKey,
bool isPc);
213int32_t McElieceDecapsInternal(
const uint8_t *ciphertext,
const CMPrivateKey *sk, uint8_t *sessionKey,
218GFMatrix *MatrixCreate(
const int32_t rows,
const int32_t cols);
222void MatrixSetBit(
GFMatrix *mat,
const int32_t row,
const int32_t col,
const int32_t value);
223int32_t MatrixGetBit(
const GFMatrix *mat,
const int32_t row,
const int32_t col);
226int32_t BuildParityCheckMatrixReferenceStyle(
GFMatrix *matH,
const GFPolynomial *g,
const GFElement *support,
228int32_t ReduceToSystematicFormReferenceStyle(
GFMatrix *matH);
230int32_t ColsRermutation(uint8_t *mat,
const int32_t colsBytes, int16_t *pi, uint64_t *pivots,
const int32_t mt);
231int32_t GaussPartialSemiSystematic(uint8_t *mat,
const int32_t colsBytes, int16_t *pi, uint64_t *pivots,
232 const int32_t mt,
const int32_t paramN);
235int32_t McElieceShake256(uint8_t *output,
const size_t outlen,
const uint8_t *input,
size_t inlen);
238void VectorSetBit(uint8_t *vec,
const uint32_t bitIdx,
const uint32_t value);
239uint32_t VectorGetBit(
const uint8_t *vec,
const uint32_t bitIdx);
242int32_t VectorWeight(
const uint8_t *vec,
const int32_t lenBytes);