105 行
5.0 KiB
C
105 行
5.0 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);
|
|
|
|
/* ============================================================
|
|
* P-384 (secp384r1) 签名/验签
|
|
* 输入为原始字节而非结构体,便于 P-384 证书/TLS 直接使用:
|
|
* d_bytes = 私钥标量,48 字节大端 (< n)
|
|
* pub_affine = 未压缩公钥点,97 字节 (0x04 || X || Y)
|
|
* 哈希:配 ecdsa_secp384r1_SHA384 用 PAZE_RSA_HASH_SHA384。确定性 k (RFC 6979)。
|
|
* 签名输出 DER (SEQUENCE { r INTEGER, s INTEGER }),长度不超过 siglen。
|
|
* ============================================================ */
|
|
paze_status_t paze_ecdsa_p384_sign(const uint8_t d_bytes[48],
|
|
paze_rsa_hash_t hash_alg,
|
|
const uint8_t *mhash, size_t hlen,
|
|
uint8_t *sig, size_t *siglen);
|
|
paze_status_t paze_ecdsa_p384_verify(const uint8_t pub_affine[97],
|
|
paze_rsa_hash_t hash_alg,
|
|
const uint8_t *mhash, size_t hlen,
|
|
const uint8_t *sig, size_t siglen);
|
|
|
|
/* P-384 (RFC 5915) EC PRIVATE KEY 解析:校验 named curve 为 secp384r1,
|
|
* 写 48 字节私钥标量到 d384。 */
|
|
paze_status_t paze_ecdsa_p384_priv_from_der(uint8_t d384[48],
|
|
const uint8_t *der, size_t len);
|
|
paze_status_t paze_ecdsa_p384_priv_from_pem(uint8_t d384[48], const char *pem_text);
|
|
|
|
/* P-521 (secp521r1) 签名/验签(确定 k, RFC 6979;配 ecdsa_secp521r1_SHA512 用
|
|
* PAZE_RSA_HASH_SHA512)。d_bytes 66 字节大端, pub_affine 133 字节 0x04||X||Y。 */
|
|
paze_status_t paze_ecdsa_p521_sign(const uint8_t d_bytes[66],
|
|
paze_rsa_hash_t hash_alg,
|
|
const uint8_t *mhash, size_t hlen,
|
|
uint8_t *sig, size_t *siglen);
|
|
paze_status_t paze_ecdsa_p521_verify(const uint8_t pub_affine[133],
|
|
paze_rsa_hash_t hash_alg,
|
|
const uint8_t *mhash, size_t hlen,
|
|
const uint8_t *sig, size_t siglen);
|
|
/* P-521 (RFC 5915) EC PRIVATE KEY 解析:校验 secp521r1,写 66 字节标量。 */
|
|
paze_status_t paze_ecdsa_p521_priv_from_der(uint8_t d521[66],
|
|
const uint8_t *der, size_t len);
|
|
paze_status_t paze_ecdsa_p521_priv_from_pem(uint8_t d521[66], const char *pem_text);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
#endif /* PAZE_ECDSA_H */
|