📄 openssl_digest.xs
字号:
#include "openssl.h"int boot_digest() { SSLeay_add_all_digests(); return(1); }MODULE = OpenSSL::MD PACKAGE = OpenSSL::MD PREFIX = p5_EVP_MD_PROTOTYPES: ENABLEVERSIONCHECK: DISABLE# OpenSSL::MD::new(name) name= md2, md5, sha, sha1, or mdc2# md->name() - returns the name# md->init() - reinitalises the digest# md->update(data) - adds more data to digest# digest=md->final() - returns digest#voidp5_EVP_MD_new(...) PREINIT: EVP_MD_CTX *ctx; const EVP_MD *md; char *name; PPCODE: if ((items == 1) && SvPOK(ST(0))) name=SvPV(ST(0),na); else if ((items == 2) && SvPOK(ST(1))) name=SvPV(ST(1),na); else croak("Usage: OpenSSL::MD::new(type)"); PUSHs(sv_newmortal()); md=EVP_get_digestbyname(name); if (md != NULL) { ctx=malloc(sizeof(EVP_MD_CTX)); EVP_DigestInit(ctx,md); sv_setref_pv(ST(0), "OpenSSL::MD", (void*)ctx); }datump5_EVP_MD_name(ctx) EVP_MD_CTX *ctx CODE: RETVAL.dptr=OBJ_nid2ln(EVP_MD_type(EVP_MD_CTX_type(ctx))); RETVAL.dsize=strlen(RETVAL.dptr); OUTPUT: RETVAL voidp5_EVP_MD_init(ctx) EVP_MD_CTX *ctx CODE: EVP_DigestInit(ctx,EVP_MD_CTX_type(ctx));voidp5_EVP_MD_update(ctx, in) EVP_MD_CTX *ctx datum in CODE: EVP_DigestUpdate(ctx,in.dptr,in.dsize);datump5_EVP_MD_final(ctx) EVP_MD_CTX *ctx PREINIT: char md[EVP_MAX_MD_SIZE]; int len; CODE: EVP_DigestFinal(ctx,md,&len); RETVAL.dptr=md; RETVAL.dsize=len; OUTPUT: RETVALvoidp5_EVP_MD_DESTROY(ctx) EVP_MD_CTX *ctx CODE: free((char *)ctx);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -