summaryrefslogtreecommitdiff
path: root/perl/openssl_digest.xs
blob: 4f2f8938cfc63d7e7804d47760d15d37c2609f94 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85

#include "openssl.h"

int boot_digest()
	{
	SSLeay_add_all_digests();
	return(1);
	}

MODULE =  OpenSSL::MD	PACKAGE = OpenSSL::MD	PREFIX = p5_EVP_MD_

PROTOTYPES: ENABLE
VERSIONCHECK: 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
#

void
p5_EVP_MD_new(...)
	PREINIT:
		EVP_MD_CTX *ctx;
		const EVP_MD *md;
		char *name;
	PPCODE:
		if ((items == 1) && SvPOK(ST(0)))
			name=SvPV_nolen(ST(0));
		else if ((items == 2) && SvPOK(ST(1)))
			name=SvPV_nolen(ST(1));
		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);
			}

datum
p5_EVP_MD_name(ctx)
	EVP_MD_CTX *ctx
	CODE:
		RETVAL.dptr=OBJ_nid2ln(EVP_MD_CTX_type(ctx));
		RETVAL.dsize=strlen(RETVAL.dptr);

	OUTPUT:
		RETVAL
	
void
p5_EVP_MD_init(ctx)
	EVP_MD_CTX *ctx
	CODE:
		EVP_DigestInit(ctx,EVP_MD_CTX_type(ctx));

void
p5_EVP_MD_update(ctx, in)
	EVP_MD_CTX *ctx
	datum in
	CODE:
		EVP_DigestUpdate(ctx,in.dptr,in.dsize);

datum
p5_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:
		RETVAL

void
p5_EVP_MD_DESTROY(ctx)
	EVP_MD_CTX *ctx
	CODE:
	free((char *)ctx);