CryptX
view release on metacpan or search on metacpan
else if (strEQ(type, "GENERALIZEDTIME")) {
STRLEN vlen = 0;
const char *data = (sv_value && SvOK(*sv_value)) ? SvPV(*sv_value, vlen) : "";
s_asn1_append_tlv(aTHX_ out, 0x18, data, (unsigned long)vlen);
}
else if (strEQ(type, "SEQUENCE") || strEQ(type, "SET")) {
unsigned char tag = strEQ(type, "SEQUENCE") ? 0x30 : 0x31;
if (sv_value && SvROK(*sv_value) && SvTYPE(SvRV(*sv_value)) == SVt_PVAV) {
SV *content = newSVpvn("", 0);
s_asn1_encode_nodes(aTHX_ content, (AV *)SvRV(*sv_value));
{ STRLEN clen; const char *cdata = SvPV(content, clen);
s_asn1_append_tlv(aTHX_ out, tag, cdata, (unsigned long)clen); }
SvREFCNT_dec(content);
} else {
s_asn1_append_tlv(aTHX_ out, tag, NULL, 0);
}
}
else if (strEQ(type, "CUSTOM")) {
SV **sv_class = hv_fetchs(node, "class", 0);
SV **sv_constr = hv_fetchs(node, "constructed", 0);
SV **sv_tag = hv_fetchs(node, "tag", 0);
unsigned int klass = (sv_class && SvOK(*sv_class)) ? (unsigned int)SvIV(*sv_class) : 2;
unsigned int pc = (sv_constr && SvOK(*sv_constr) && SvIV(*sv_constr)) ? 1 : 0;
unsigned long tag = (sv_tag && SvOK(*sv_tag)) ? (unsigned long)SvUV(*sv_tag) : 0;
if (pc && sv_value && SvROK(*sv_value) && SvTYPE(SvRV(*sv_value)) == SVt_PVAV) {
SV *content = newSVpvn("", 0);
s_asn1_encode_nodes(aTHX_ content, (AV *)SvRV(*sv_value));
{ STRLEN clen; const char *cdata = SvPV(content, clen);
s_asn1_append_custom_tlv(aTHX_ out, klass, pc, tag, cdata, (unsigned long)clen); }
SvREFCNT_dec(content);
} else {
STRLEN vlen = 0;
const char *data = (sv_value && SvOK(*sv_value)) ? SvPVbyte(*sv_value, vlen) : "";
s_asn1_append_custom_tlv(aTHX_ out, klass, pc, tag, data, (unsigned long)vlen);
}
}
else {
croak("FATAL: asn1_encode: unsupported type '%s'", type);
}
src/ltc/misc/ssh/ssh_decode_sequence_multi.c view on Meta::CPAN
@param inlen [in/out] The length of the input buffer and on output the amount of decoded data
@remark <...> is of the form <type, data*> (int, <unsigned char*,ulong32*,ulong64*>) except for string&name-list <type, data, size*> (int, void*, unsigned long*)
@return CRYPT_OK on success
*/
int ssh_decode_sequence_multi(const unsigned char *in, unsigned long *inlen, ...)
{
int err;
va_list args;
ssh_data_type type;
void *vdata;
unsigned char *cdata;
char *sdata;
ulong32 *u32data;
ulong64 *u64data;
unsigned long *bufsize;
ulong32 size;
unsigned long remaining;
LTC_ARGCHK(in != NULL);
LTC_ARGCHK(inlen != NULL);
src/ltc/misc/ssh/ssh_decode_sequence_multi.c view on Meta::CPAN
vdata = va_arg(args, void*);
if (vdata == NULL) {
err = CRYPT_INVALID_ARG;
goto error;
}
/* Read data */
switch (type) {
case LTC_SSHDATA_BYTE:
cdata = vdata;
*cdata = *in++;
break;
case LTC_SSHDATA_BOOLEAN:
cdata = vdata;
/*
The value 0 represents FALSE, and the value 1 represents TRUE. All non-zero values MUST be
interpreted as TRUE; however, applications MUST NOT store values other than 0 and 1.
*/
*cdata = (*in++)?1:0;
break;
case LTC_SSHDATA_UINT32:
u32data = vdata;
LOAD32H(*u32data, in);
in += 4;
break;
case LTC_SSHDATA_UINT64:
u64data = vdata;
LOAD64H(*u64data, in);
in += 8;
( run in 1.747 second using v1.01-cache-2.11-cpan-437f7b0c052 )