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