forked from openkylin/libcrypt-cast5-perl
113 lines
2.0 KiB
Plaintext
113 lines
2.0 KiB
Plaintext
|
/*
|
||
|
* CAST5.xs
|
||
|
* Perl bindings for CAST5 cipher
|
||
|
*
|
||
|
* Copyright 2002-2004 by Bob Mathews
|
||
|
*
|
||
|
* This library is free software; you can redistribute it and/or modify
|
||
|
* it under the same terms as Perl itself.
|
||
|
*/
|
||
|
|
||
|
#include "EXTERN.h"
|
||
|
#include "perl.h"
|
||
|
#include "XSUB.h"
|
||
|
|
||
|
#include "ppport.h"
|
||
|
|
||
|
#include "cast5.h"
|
||
|
|
||
|
#ifndef SvPVbyte
|
||
|
#define SvPVbyte SvPV
|
||
|
#endif
|
||
|
|
||
|
static void cast5_init_sv(Crypt__CAST5 cast5, SV *key)
|
||
|
{
|
||
|
STRLEN keylen;
|
||
|
char *keystr;
|
||
|
|
||
|
keystr = SvPVbyte(key, keylen);
|
||
|
if (keylen < 5 || keylen > 16) croak("Key must be 40 to 128 bits");
|
||
|
|
||
|
cast5_init(cast5, keystr, keylen);
|
||
|
} /* cast5_init_sv */
|
||
|
|
||
|
MODULE = Crypt::CAST5 PACKAGE = Crypt::CAST5
|
||
|
|
||
|
PROTOTYPES: DISABLE
|
||
|
|
||
|
Crypt::CAST5
|
||
|
new(class, key=NULL)
|
||
|
SV * class
|
||
|
SV * key
|
||
|
CODE:
|
||
|
New(0, RETVAL, 1, struct cast5_state);
|
||
|
if (key) cast5_init_sv(RETVAL, key);
|
||
|
else RETVAL->rounds = 0;
|
||
|
OUTPUT:
|
||
|
RETVAL
|
||
|
|
||
|
int
|
||
|
blocksize(...)
|
||
|
CODE:
|
||
|
RETVAL = 8;
|
||
|
OUTPUT:
|
||
|
RETVAL
|
||
|
|
||
|
int
|
||
|
keysize(...)
|
||
|
CODE:
|
||
|
RETVAL = 16;
|
||
|
OUTPUT:
|
||
|
RETVAL
|
||
|
|
||
|
void
|
||
|
init(cast5, key)
|
||
|
Crypt::CAST5 cast5
|
||
|
SV * key
|
||
|
CODE:
|
||
|
cast5_init_sv(cast5, key);
|
||
|
|
||
|
SV *
|
||
|
encrypt(cast5, plaintext)
|
||
|
Crypt::CAST5 cast5
|
||
|
SV * plaintext
|
||
|
PREINIT:
|
||
|
char *str;
|
||
|
STRLEN len;
|
||
|
CODE:
|
||
|
if (cast5->rounds == 0) croak("Call init() first");
|
||
|
str = SvPVbyte(plaintext, len);
|
||
|
if (len != 8) croak("Block size must be 8");
|
||
|
RETVAL = NEWSV(0, 8);
|
||
|
SvPOK_only(RETVAL);
|
||
|
SvCUR_set(RETVAL, 8);
|
||
|
cast5_encrypt(cast5, str, SvPV(RETVAL, len));
|
||
|
OUTPUT:
|
||
|
RETVAL
|
||
|
|
||
|
SV *
|
||
|
decrypt(cast5, ciphertext)
|
||
|
Crypt::CAST5 cast5
|
||
|
SV * ciphertext
|
||
|
PREINIT:
|
||
|
char *str;
|
||
|
STRLEN len;
|
||
|
CODE:
|
||
|
if (cast5->rounds == 0) croak("Call init() first");
|
||
|
str = SvPVbyte(ciphertext, len);
|
||
|
if (len != 8) croak("Block size must be 8");
|
||
|
RETVAL = NEWSV(0, 8);
|
||
|
SvPOK_only(RETVAL);
|
||
|
SvCUR_set(RETVAL, 8);
|
||
|
cast5_decrypt(cast5, str, SvPV(RETVAL, len));
|
||
|
OUTPUT:
|
||
|
RETVAL
|
||
|
|
||
|
void
|
||
|
DESTROY(cast5)
|
||
|
Crypt::CAST5 cast5
|
||
|
CODE:
|
||
|
Zero(cast5, 1, struct cast5_state);
|
||
|
Safefree(cast5);
|
||
|
|