CryptX
view release on metacpan or search on metacpan
inc/CryptX_PK_Ed448.xs.inc view on Meta::CPAN
XPUSHs(ST(0)); /* return self */
}
void
_import(Crypt::PK::Ed448 self, SV * key_data)
PPCODE:
{
int rv;
unsigned char *data=NULL;
STRLEN data_len=0;
data = (unsigned char *)SvPVbyte(key_data, data_len);
self->initialized = 0;
rv = ed448_import(data, (unsigned long)data_len, &self->key);
if (rv != CRYPT_OK) croak("FATAL: ed448_import failed: %s", error_to_string(rv));
self->initialized = 1;
XPUSHs(ST(0)); /* return self */
}
void
_import_pkcs8(Crypt::PK::Ed448 self, SV * key_data, SV * passwd)
PPCODE:
{
int rv;
unsigned char *data = NULL;
STRLEN data_len = 0;
password_ctx pw_ctx = { cryptx_internal_password_cb_getpw, cryptx_internal_password_cb_free, passwd };
data = (unsigned char *)SvPVbyte(key_data, data_len);
self->initialized = 0;
if (SvOK(passwd)) {
rv = ed448_import_pkcs8(data, (unsigned long)data_len, &pw_ctx, &self->key);
}
else {
rv = ed448_import_pkcs8(data, (unsigned long)data_len, NULL, &self->key);
}
if (rv != CRYPT_OK) croak("FATAL: ed448_import_pkcs8 failed: %s", error_to_string(rv));
self->initialized = 1;
XPUSHs(ST(0)); /* return self */
}
void
_import_pem(Crypt::PK::Ed448 self, SV * key_data, SV * passwd)
PPCODE:
{
int rv;
unsigned char *data = NULL;
STRLEN data_len = 0;
password_ctx pw_ctx = { cryptx_internal_password_cb_getpw, cryptx_internal_password_cb_free, passwd };
ltc_pka_key key_from_pem;
data = (unsigned char *)SvPVbyte(key_data, data_len);
self->initialized = 0;
if (SvOK(passwd)) {
rv = pem_decode_pkcs(data, (unsigned long)data_len, &key_from_pem, &pw_ctx);
}
else {
rv = pem_decode_pkcs(data, (unsigned long)data_len, &key_from_pem, NULL);
}
if (rv != CRYPT_OK) croak("FATAL: pem_decode_pkcs failed: %s", error_to_string(rv));
if (key_from_pem.id != LTC_PKA_ED448) croak("FATAL: pem_decode_pkcs decoded non-Ed448 key");
self->key = key_from_pem.u.ed448;
self->initialized = 1;
XPUSHs(ST(0)); /* return self */
}
void
_import_x509(Crypt::PK::Ed448 self, SV * key_data)
PPCODE:
{
int rv;
unsigned char *data=NULL;
STRLEN data_len=0;
data = (unsigned char *)SvPVbyte(key_data, data_len);
self->initialized = 0;
rv = ed448_import_x509(data, (unsigned long)data_len, &self->key);
if (rv != CRYPT_OK) croak("FATAL: ed448_import_x509 failed: %s", error_to_string(rv));
self->initialized = 1;
XPUSHs(ST(0)); /* return self */
}
void
_import_raw(Crypt::PK::Ed448 self, SV * key, int which)
PPCODE:
{
int rv;
unsigned char *key_data=NULL;
STRLEN key_len=0;
if (SvOK(key)) {
key_data = (unsigned char *)SvPVbyte(key, key_len);
}
self->initialized = 0;
if (which == 0) {
rv = ed448_import_raw(key_data, (unsigned long)key_len, PK_PUBLIC, &self->key);
}
else if (which == 1) {
rv = ed448_import_raw(key_data, (unsigned long)key_len, PK_PRIVATE, &self->key);
}
else {
croak("FATAL: import_raw invalid type '%d'", which);
}
if (rv != CRYPT_OK) croak("FATAL: ed448_import_raw failed: %s", error_to_string(rv));
self->initialized = 1;
XPUSHs(ST(0)); /* return self */
}
int
is_private(Crypt::PK::Ed448 self)
CODE:
if (self->initialized == 0) XSRETURN_UNDEF;
RETVAL = (self->key.type == PK_PRIVATE) ? 1 : 0;
OUTPUT:
RETVAL
SV*
key2hash(Crypt::PK::Ed448 self)
PREINIT:
HV *rv_hash;
char buf[57 * 2 + 1];
( run in 1.623 second using v1.01-cache-2.11-cpan-fe3c2283af0 )