#include "xs/openssl.h"
MODULE = Crypt::Keyczar PACKAGE = Crypt::Keyczar::Util
SV *
random(int size)
CODE:
{
unsigned char *buff;
if (size < 1) {
croak("random size is short");
}
Newz(0, buff, size, unsigned char);
if (RAND_bytes(buff, size) != 1) {
Safefree(buff);
crypt__keyczar__util__croak_openssl();
/* NOTREACHED */
}
RETVAL = newSVpv((char *)buff, size);
Safefree(buff);
}
OUTPUT:
RETVAL
SV *
hash(...)
CODE:
{
int i;
SV *data;
EVP_MD_CTX *ctx;
unsigned char md[EVP_MAX_MD_SIZE];
unsigned int l;
STRLEN in_l;
unsigned char *in;
ctx = EVP_MD_CTX_new();
if (EVP_DigestInit_ex(ctx, EVP_sha1(), NULL) == 0) {
crypt__keyczar__util__croak_openssl();
/* NOTREACHED */
}
for (i = 0; i < items; i++) {
data = ST(i);
in = (unsigned char *)SvPV(data, in_l);
EVP_DigestUpdate(ctx, (const void *)in, in_l);
}
if (EVP_DigestFinal_ex(ctx, md, &l) == 0) {
crypt__keyczar__util__croak_openssl();
/* NOTREACHED */
}
RETVAL = newSVpv((char *)md, l);
EVP_MD_CTX_free(ctx);
}
OUTPUT:
RETVAL