58 行
2.0 KiB
C
58 行
2.0 KiB
C
/* fe25519.h —— Curve25519 / Ed25519 共享域算术 (F_p, p = 2^255 - 19)
|
|
*
|
|
* 内部头文件:供 curve25519.c / ed25519.c 复用,不作为公开 API。
|
|
*
|
|
* 表示:16 个 int64_t limb,小端,每位 16 位(radix 2^16),共 256 位。
|
|
* 数值允许冗余(单 limb 可超出 [0,2^16)),fe_car 后归一到每 limb ∈ [0,2^16)。
|
|
* 约简关系:2^256 ≡ 38 (mod p)。
|
|
*
|
|
* 安全性:cswap / 条件减为常量时间;fe_inv 用 Fermat 小定理(固定 255 次乘法)。
|
|
*/
|
|
#ifndef PAZE_FE25519_H
|
|
#define PAZE_FE25519_H
|
|
#include "paze/paze_types.h"
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
typedef int64_t paze_fe[16];
|
|
|
|
/* 字节序 <-> fe:paze_fe_frombytes 接受任意 32 字节(不掩码高位,由调用方负责)。 */
|
|
void paze_fe_frombytes(paze_fe h, const uint8_t s[32]);
|
|
void paze_fe_tobytes(uint8_t s[32], const paze_fe h);
|
|
|
|
/* 进位归一:每 limb 折叠到 [0, 2^16),2^256 ≡ 38 折回。 */
|
|
void paze_fe_car(paze_fe o);
|
|
|
|
/* 域运算:o = a+b, a-b, a*b, a^2。fe_mul 后自动 fe_car 两次。 */
|
|
void paze_fe_add(paze_fe o, const paze_fe a, const paze_fe b);
|
|
void paze_fe_sub(paze_fe o, const paze_fe a, const paze_fe b);
|
|
void paze_fe_mul(paze_fe o, const paze_fe a, const paze_fe b);
|
|
void paze_fe_sq (paze_fe o, const paze_fe a);
|
|
|
|
/* 常量时间条件交换:b=1 交换,b=0 不变。 */
|
|
void paze_fe_cswap(paze_fe p, paze_fe q, uint32_t b);
|
|
|
|
/* 模逆:Fermat 小定理 z^(2^255-21)。无秘密分支。 */
|
|
void paze_fe_inv(paze_fe o, const paze_fe z);
|
|
|
|
/* 常量时间条件选:cond=1 → o=a,cond=0 → o=b。 */
|
|
void paze_fe_cmov(paze_fe o, const paze_fe a, uint32_t cond);
|
|
|
|
/* 便利:o = -a (mod p) */
|
|
void paze_fe_neg(paze_fe o, const paze_fe a);
|
|
|
|
/* 标量乘以小常数(单 limb):o = a * b,b 为小整数。 */
|
|
void paze_fe_mul_small(paze_fe o, const paze_fe a, int64_t b);
|
|
|
|
/* 判断是否为 0(归一后):返回 1 表示为零。 */
|
|
int paze_fe_iszero(const paze_fe a);
|
|
|
|
/* 判断是否非 0(归一后):返回 1 表示非零(常量时间-ish,基于低位)。 */
|
|
int paze_fe_isnonzero(const paze_fe a);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
#endif /* PAZE_FE25519_H */
|