文件
PazeSSH/include/paze/ecdsa.h
T

67 行
2.6 KiB
C

/* ecdsa.h —— ECDSA 签名 (P-256, RFC 6979 确定性 k)
*
* 用于 TLS ECDSA 证书签名验证与自签名证书生成。
* 签名输出为 DER (SEQUENCE { r INTEGER, s INTEGER })。
* 确定性 k (RFC 6979) 避免随机数重用漏洞,无需优质 RNG。
*/
#ifndef PAZE_ECDSA_H
#define PAZE_ECDSA_H
#include "paze/paze_types.h"
#include "paze/p256.h"
#include "paze/rsa.h" /* paze_rsa_hash_t */
#ifdef __cplusplus
extern "C" {
#endif
/* 私钥:32 字节大端标量 d (1 <= d < n)。
* 公钥:65 字节未压缩点 (0x04 || X || Y)。 */
typedef struct {
uint8_t d[32]; /* 私钥标量 */
paze_p256_point_t Q; /* 公钥点 Q = d*G */
} paze_ecdsa_priv_t;
typedef struct {
paze_p256_point_t Q; /* 公钥点 */
} paze_ecdsa_pub_t;
/* 从私钥标量推导公钥 Q = d*G */
paze_status_t paze_ecdsa_pub_from_priv(paze_ecdsa_pub_t *pub, const uint8_t d_be[32]);
void paze_ecdsa_priv_set_d(paze_ecdsa_priv_t *k, const uint8_t d_be[32]);
/* 生成私钥(随机 d) */
paze_status_t paze_ecdsa_gen(paze_ecdsa_priv_t *k);
/* ECDSA 签名(RFC 6979 确定性 k)。
* mhash 为消息摘要(长度须匹配 hash_alg)。
* sig 输出 DER,*siglen 给出容量/写回实际长度。 */
paze_status_t paze_ecdsa_sign(const paze_ecdsa_priv_t *k,
paze_rsa_hash_t hash_alg,
const uint8_t *mhash, size_t hlen,
uint8_t *sig, size_t *siglen);
/* ECDSA 验签。返回 PAZE_OK=通过, PAZE_ERR_VERIFY=失败。 */
paze_status_t paze_ecdsa_verify(const paze_ecdsa_pub_t *pub,
paze_rsa_hash_t hash_alg,
const uint8_t *mhash, size_t hlen,
const uint8_t *sig, size_t siglen);
/* DER 签名编码/解码(SEQUENCE { r INTEGER, s INTEGER }) */
paze_status_t paze_ecdsa_sig_to_der(const paze_bn_t *r, const paze_bn_t *s,
uint8_t *out, size_t *outlen);
paze_status_t paze_ecdsa_sig_from_der(paze_bn_t *r, paze_bn_t *s,
const uint8_t *der, size_t len);
/* PEM 包装:从 PEM 文本("EC PRIVATE KEY" label)中加载私钥。
* RFC 5915: SEQUENCE { version INTEGER(1), privateKey OCTET STRING,
* parameters [0] OID?, publicKey [1] BIT STRING? } */
paze_status_t paze_ecdsa_priv_from_pem(paze_ecdsa_priv_t *k, const char *pem_text);
/* PEM 包装:从 PEM 文本中加载公钥("PUBLIC KEY" / X.509 SPKI label) */
paze_status_t paze_ecdsa_pub_from_pem(paze_ecdsa_pub_t *pub, const char *pem_text);
#ifdef __cplusplus
}
#endif
#endif /* PAZE_ECDSA_H */