CryptX

 view release on metacpan or  search on metacpan

CryptX.xs  view on Meta::CPAN

    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 )