178 lines
9.6 KiB
Plaintext
178 lines
9.6 KiB
Plaintext
import t, c
|
||
from openssl.types import *
|
||
|
||
# ============================================================
|
||
# openssl/x509.vp — X509 证书解析 / 校验 + 必要 ASN.1 助手
|
||
# 对应头文件: x509.h / x509_vfy.h / asn1.h
|
||
#
|
||
# 证书网络解析场景:读取 subject/issuer/SAN/有效期/公钥、链式校验。
|
||
# ============================================================
|
||
|
||
X509VOk: t.CDefine = 0
|
||
X509Version1: t.CDefine = 0
|
||
X509Version2: t.CDefine = 1
|
||
X509Version3: t.CDefine = 2
|
||
|
||
# ============================================================
|
||
# 1) 证书对象生命周期
|
||
# ============================================================
|
||
# X509 *X509_new(void) / void X509_free(X509 *a)
|
||
extern def X509_new() -> X509Ptr
|
||
extern def X509_free(a: X509Ptr)
|
||
# int i2d_X509(X509 *a, unsigned char **pp) / X509 *d2i_X509(X509 **a, const unsigned char **pp, long length)
|
||
# (pp 语义复杂,Viper 端建议用 d2i_X509_bio/i2d_X509_bio,故不暴露裸 d2i/i2d)
|
||
extern def d2i_X509_bio(bp: BioPtr, x509: bytes) -> X509Ptr
|
||
extern def i2d_X509_bio(bp: BioPtr, x509: X509Ptr) -> int
|
||
|
||
# ============================================================
|
||
# 2) 证书字段读取
|
||
# ============================================================
|
||
# long X509_get_version(const X509 *x)
|
||
extern def X509_get_version(x: X509Ptr) -> t.CInt32T
|
||
# ASN1_INTEGER *X509_get_serialNumber(X509 *x)
|
||
extern def X509_get_serialNumber(x: X509Ptr) -> Asn1IntegerPtr
|
||
# X509_NAME *X509_get_subject_name(const X509 *a)
|
||
extern def X509_get_subject_name(a: X509Ptr) -> X509NamePtr
|
||
# X509_NAME *X509_get_issuer_name(const X509 *a)
|
||
extern def X509_get_issuer_name(a: X509Ptr) -> X509NamePtr
|
||
# const ASN1_TIME *X509_get0_notBefore(const X509 *x)
|
||
extern def X509_get0_notBefore(x: X509Ptr) -> Asn1TimePtr
|
||
# const ASN1_TIME *X509_get0_notAfter(const X509 *x)
|
||
extern def X509_get0_notAfter(x: X509Ptr) -> Asn1TimePtr
|
||
# EVP_PKEY *X509_get_pubkey(X509 *x)
|
||
extern def X509_get_pubkey(x: X509Ptr) -> EvpPkeyPtr
|
||
# ASN1_BIT_STRING *X509_get0_pubkey_bitstr(const X509 *x)
|
||
extern def X509_get0_pubkey_bitstr(x: X509Ptr) -> Asn1BitStringPtr
|
||
# int X509_get_signature_nid(const X509 *x)
|
||
extern def X509_get_signature_nid(x: X509Ptr) -> int
|
||
# int X509_digest(const X509 *data, const EVP_MD *type, unsigned char *md, unsigned int *len)
|
||
extern def X509_digest(data: X509Ptr, type: EvpMdPtr, md: bytes, len: bytes) -> int
|
||
# int X509_verify(X509 *a, EVP_PKEY *r)
|
||
extern def X509_verify(a: X509Ptr, r: EvpPkeyPtr) -> int
|
||
|
||
# ============================================================
|
||
# 3) X509_NAME 读取(subject/issuer 各 RDN 段)
|
||
# ============================================================
|
||
# int X509_NAME_entry_count(const X509_NAME *name)
|
||
extern def X509_NAME_entry_count(name: X509NamePtr) -> int
|
||
# int X509_NAME_get_index_by_NID(const X509_NAME *name, int nid, int lastpos)
|
||
extern def X509_NAME_get_index_by_NID(name: X509NamePtr, nid: int, lastpos: int) -> int
|
||
# X509_NAME_ENTRY *X509_NAME_get_entry(const X509_NAME *name, int loc)
|
||
extern def X509_NAME_get_entry(name: X509NamePtr, loc: int) -> X509NameEntryPtr
|
||
# ASN1_OBJECT *X509_NAME_ENTRY_get_object(const X509_NAME_ENTRY *ne)
|
||
extern def X509_NAME_ENTRY_get_object(ne: X509NameEntryPtr) -> Asn1ObjectPtr
|
||
# ASN1_STRING *X509_NAME_ENTRY_get_data(const X509_NAME_ENTRY *ne)
|
||
extern def X509_NAME_ENTRY_get_data(ne: X509NameEntryPtr) -> Asn1StringPtr
|
||
# int X509_NAME_get_text_by_NID(const X509_NAME *name, int nid, char *buf, int len)
|
||
extern def X509_NAME_get_text_by_NID(name: X509NamePtr, nid: int, buf: bytes, len: int) -> int
|
||
# char *X509_NAME_oneline(const X509_NAME *a, char *buf, int size) → 返回指向 buf 的指针
|
||
extern def X509_NAME_oneline(a: X509NamePtr, buf: bytes, size: int) -> str
|
||
|
||
# ============================================================
|
||
# 4) 扩展(SAN 等)
|
||
# ============================================================
|
||
# int X509_get_ext_count(const X509 *x)
|
||
extern def X509_get_ext_count(x: X509Ptr) -> int
|
||
# X509_EXTENSION *X509_get_ext(const X509 *x, int loc)
|
||
extern def X509_get_ext(x: X509Ptr, loc: int) -> X509ExtensionPtr
|
||
# int X509_get_ext_by_NID(const X509 *x, int nid, int lastpos)
|
||
extern def X509_get_ext_by_NID(x: X509Ptr, nid: int, lastpos: int) -> int
|
||
# void *X509_get_ext_d2i(const X509 *x, int nid, int *crit, int *idx)
|
||
extern def X509_get_ext_d2i(x: X509Ptr, nid: int, crit: bytes, idx: bytes) -> GeneralNamesPtr
|
||
# ASN1_OBJECT *X509_EXTENSION_get_object(X509_EXTENSION *ex)
|
||
extern def X509_EXTENSION_get_object(ex: X509ExtensionPtr) -> Asn1ObjectPtr
|
||
# ASN1_OCTET_STRING *X509_EXTENSION_get_data(X509_EXTENSION *ne)
|
||
extern def X509_EXTENSION_get_data(ne: X509ExtensionPtr) -> Asn1OctetStringPtr
|
||
# int X509V3_EXT_print(BIO *out, X509_EXTENSION *ext, unsigned long flag, int indent)
|
||
extern def X509V3_EXT_print(out: BioPtr, ext: X509ExtensionPtr,
|
||
flag: t.CUInt32T, indent: int) -> int
|
||
|
||
# GENERAL_NAME 遍历(SAN:DNS/URI/IP/email)
|
||
extern def GENERAL_NAME_free(a: GeneralNamePtr)
|
||
extern def GENERAL_NAMES_free(a: GeneralNamesPtr)
|
||
# int GENERAL_NAME_print(BIO *out, GENERAL_NAME *gen)
|
||
extern def GENERAL_NAME_print(out: BioPtr, gen: GeneralNamePtr) -> int
|
||
# 通用 OPENSSL 栈访问(STACK_OF 的内核,宏 sk_xxx_num/value 最终落到这)
|
||
# int OPENSSL_sk_num(const OPENSSL_STACK *st)
|
||
extern def OPENSSL_sk_num(st: bytes) -> int
|
||
# void *OPENSSL_sk_value(const OPENSSL_STACK *st, int i)
|
||
extern def OPENSSL_sk_value(st: bytes, i: int) -> GeneralNamePtr
|
||
# void OPENSSL_sk_free(OPENSSL_STACK *st)
|
||
extern def OPENSSL_sk_free(st: bytes)
|
||
# const char *OBJ_nid2sn ... 已放 objects.vp;此处放 GNR 常量
|
||
GenEmail: t.CDefine = 1
|
||
GenDns: t.CDefine = 2
|
||
GenUri: t.CDefine = 6
|
||
GenIpadd: t.CDefine = 7
|
||
|
||
# ---- SAN 便捷读取(把某类 GENERAL_NAME 数量统计)----
|
||
def x509_san_count(gns: GeneralNamesPtr) -> int:
|
||
return OPENSSL_sk_num(gns)
|
||
|
||
# ============================================================
|
||
# 5) 证书链校验(X509_STORE_CTX)
|
||
# ============================================================
|
||
# X509_STORE *X509_STORE_new(void) / void X509_STORE_free(X509_STORE *v)
|
||
extern def X509_STORE_new() -> X509StorePtr
|
||
extern def X509_STORE_free(v: X509StorePtr)
|
||
# int X509_STORE_add_cert(X509_STORE *ctx, X509 *x)
|
||
extern def X509_STORE_add_cert(ctx: X509StorePtr, x: X509Ptr) -> int
|
||
# int X509_STORE_load_file(X509_STORE *xs, const char *file)
|
||
extern def X509_STORE_load_file(xs: X509StorePtr, file: str) -> int
|
||
# int X509_STORE_load_path(X509_STORE *xs, const char *path)
|
||
extern def X509_STORE_load_path(xs: X509StorePtr, path: str) -> int
|
||
# int X509_STORE_load_locations(X509_STORE *s, const char *file, const char *dir)
|
||
extern def X509_STORE_load_locations(s: X509StorePtr, file: str, dir: str) -> int
|
||
# int X509_STORE_set_default_paths(X509_STORE *xs)
|
||
extern def X509_STORE_set_default_paths(xs: X509StorePtr) -> int
|
||
|
||
# X509_STORE_CTX
|
||
extern def X509_STORE_CTX_new() -> X509StoreCtxPtr
|
||
extern def X509_STORE_CTX_free(ctx: X509StoreCtxPtr)
|
||
# int X509_STORE_CTX_init(X509_STORE_CTX *ctx, X509_STORE *trust_store,
|
||
# X509 *target, STACK_OF(X509) *untrusted)
|
||
extern def X509_STORE_CTX_init(ctx: X509StoreCtxPtr, trust_store: X509StorePtr,
|
||
target: X509Ptr, untrusted: bytes) -> int
|
||
# void X509_STORE_CTX_set_cert(X509_STORE_CTX *ctx, X509 *target)
|
||
extern def X509_STORE_CTX_set_cert(ctx: X509StoreCtxPtr, target: X509Ptr)
|
||
# void X509_STORE_CTX_set_chain(X509_STORE_CTX *ctx, STACK_OF(X509) *sk)
|
||
extern def X509_STORE_CTX_set_chain(ctx: X509StoreCtxPtr, sk: bytes)
|
||
# int X509_verify_cert(X509_STORE_CTX *ctx)
|
||
extern def X509_verify_cert(ctx: X509StoreCtxPtr) -> int
|
||
# int X509_STORE_CTX_get_error(const X509_STORE_CTX *ctx)
|
||
extern def X509_STORE_CTX_get_error(ctx: X509StoreCtxPtr) -> int
|
||
# int X509_STORE_CTX_get_error_depth(const X509_STORE_CTX *ctx)
|
||
extern def X509_STORE_CTX_get_error_depth(ctx: X509StoreCtxPtr) -> int
|
||
# X509 *X509_STORE_CTX_get_current_cert(const X509_STORE_CTX *ctx)
|
||
extern def X509_STORE_CTX_get_current_cert(ctx: X509StoreCtxPtr) -> X509Ptr
|
||
# const char *X509_verify_cert_error_string(long n)
|
||
extern def X509_verify_cert_error_string(n: t.CInt32T) -> str
|
||
|
||
# ============================================================
|
||
# 6) ASN.1 字符串 / 时间助手(asn1.h)
|
||
# ============================================================
|
||
# int ASN1_STRING_length(const ASN1_STRING *x)
|
||
extern def ASN1_STRING_length(x: Asn1StringPtr) -> int
|
||
# const unsigned char *ASN1_STRING_get0_data(const ASN1_STRING *x)
|
||
extern def ASN1_STRING_get0_data(x: Asn1StringPtr) -> bytes
|
||
# int ASN1_STRING_type(const ASN1_STRING *x)
|
||
extern def ASN1_STRING_type(x: Asn1StringPtr) -> int
|
||
# int ASN1_STRING_to_UTF8(unsigned char **out, const ASN1_STRING *in) → 返回长度,需 CRYPTO_free(*out)
|
||
extern def ASN1_STRING_to_UTF8(out: bytes, inn: Asn1StringPtr) -> int
|
||
# int ASN1_STRING_print(BIO *bp, const ASN1_STRING *v)
|
||
extern def ASN1_STRING_print(bp: BioPtr, v: Asn1StringPtr) -> int
|
||
# int ASN1_STRING_print_ex(BIO *out, const ASN1_STRING *str, unsigned long flags)
|
||
extern def ASN1_STRING_print_ex(out: BioPtr, str: Asn1StringPtr, flags: t.CUInt32T) -> int
|
||
# int ASN1_TIME_print(BIO *bp, const ASN1_TIME *tm)
|
||
extern def ASN1_TIME_print(bp: BioPtr, tm: Asn1TimePtr) -> int
|
||
# int ASN1_TIME_compare(const ASN1_TIME *a, const ASN1_TIME *b)
|
||
extern def ASN1_TIME_compare(a: Asn1TimePtr, b: Asn1TimePtr) -> int
|
||
# int ASN1_INTEGER_get(const ASN1_INTEGER *a)
|
||
extern def ASN1_INTEGER_get(a: Asn1IntegerPtr) -> t.CInt32T
|
||
# int ASN1_INTEGER_set(ASN1_INTEGER *a, long v)
|
||
extern def ASN1_INTEGER_set(a: Asn1IntegerPtr, v: t.CInt32T) -> int
|
||
# int i2a_ASN1_INTEGER(BIO *bp, const ASN1_INTEGER *a) → 十进制打印到 BIO
|
||
extern def i2a_ASN1_INTEGER(bp: BioPtr, a: Asn1IntegerPtr) -> int
|
||
# const char *ASN1_tag2str(int tag)
|
||
extern def ASN1_tag2str(tag: int) -> str
|