Beispiel #1
0
asn1_error_code
asn1_encode_unsigned_integer(asn1buf *buf, asn1_uintmax val,
                             unsigned int *retlen)
{
    asn1_error_code retval;
    unsigned int length = 0;
    unsigned int partlen;
    unsigned long valcopy;
    int digit;

    valcopy = val;
    do {
        digit = (int) (valcopy&0xFF);
        retval = asn1buf_insert_octet(buf,(asn1_octet) digit);
        if (retval) return retval;
        length++;
        valcopy = valcopy >> 8;
    } while (valcopy != 0);

    if (digit&0x80) {                     /* make sure the high bit is */
        retval = asn1buf_insert_octet(buf,0); /* of the proper signed-ness */
        if (retval) return retval;
        length++;
    }

    retval = asn1_make_tag(buf,UNIVERSAL,PRIMITIVE,ASN1_INTEGER,length, &partlen);
    if (retval) return retval;
    length += partlen;

    *retlen = length;
    return 0;
}
Beispiel #2
0
asn1_error_code
asn1_encode_integer(asn1buf * buf, asn1_intmax val, unsigned int *retlen)
{
    asn1_error_code retval;
    unsigned int length = 0;
    unsigned  int partlen;
    retval = asn1_encode_integer_internal(buf, val, &partlen);
    if (retval) return retval;

    length = partlen;
    retval = asn1_make_tag(buf,UNIVERSAL,PRIMITIVE,ASN1_INTEGER,length, &partlen);
    if (retval) return retval;
    length += partlen;

    *retlen = length;
    return 0;
}
Beispiel #3
0
asn1_error_code
asn1_encode_bitstring(asn1buf *buf, unsigned int len, const void *val,
                      unsigned int *retlen)
{
    asn1_error_code retval;
    unsigned int length;

    retval = asn1buf_insert_octetstring(buf, len, val);
    if (retval) return retval;
    retval = asn1buf_insert_octet(buf, 0);
    if (retval) return retval;
    retval = asn1_make_tag(buf, UNIVERSAL, PRIMITIVE, ASN1_BITSTRING,
                           len+1, &length);
    if (retval) return retval;
    *retlen = len + 1 + length;
    return 0;
}
Beispiel #4
0
static asn1_error_code
encode_bytestring_with_tag(asn1buf *buf, unsigned int len,
                           const void *val, int tag,
                           unsigned int *retlen)
{
    asn1_error_code retval;
    unsigned int length;

    if (len > 0 && val == 0) return ASN1_MISSING_FIELD;
    retval = asn1buf_insert_octetstring(buf, len, val);
    if (retval) return retval;
    retval = asn1_make_tag(buf, UNIVERSAL, PRIMITIVE, tag,
                           len, &length);
    if (retval) return retval;

    *retlen = len + length;
    return 0;
}
Beispiel #5
0
asn1_error_code
asn1_encode_enumerated(asn1buf * buf, long val,
                       unsigned int *retlen)
{
    asn1_error_code retval;
    unsigned int length = 0;
    unsigned  int partlen;
    retval = asn1_encode_integer_internal(buf, val, &partlen);
    if (retval) return retval;

    length = partlen;
    retval = asn1_make_tag(buf,UNIVERSAL,PRIMITIVE,ASN1_ENUMERATED,length, &partlen);
    if (retval) return retval;
    length += partlen;

    *retlen = length;
    return 0;
}
Beispiel #6
0
asn1_error_code
asn1_encode_boolean(asn1buf *buf, asn1_intmax val, unsigned int *retlen)
{
    asn1_error_code retval;
    unsigned int length = 0;
    unsigned int partlen = 1;
    asn1_octet bval;

    bval = val ? 0xFF : 0x00;

    retval = asn1buf_insert_octet(buf, bval);
    if (retval) return retval;

    length = partlen;
    retval = asn1_make_tag(buf, UNIVERSAL, PRIMITIVE, ASN1_BOOLEAN, length, &partlen);
    if (retval) return retval;
    length += partlen;

    *retlen = length;
    return 0;
}
Beispiel #7
0
asn1_error_code asn1_encode_krb5_flags(asn1buf *buf, const krb5_flags val, unsigned int *retlen)
{
  asn1_setup();
  krb5_flags valcopy = val;
  int i;

  for(i=0; i<4; i++){
    retval = asn1buf_insert_octet(buf,(asn1_octet) (valcopy&0xFF));
    if(retval) return retval;
    valcopy >>= 8;
  }
  retval = asn1buf_insert_octet(buf,0);	/* 0 padding bits */
  if(retval) return retval;
  sum = 5;

  retval = asn1_make_tag(buf,UNIVERSAL,PRIMITIVE,ASN1_BITSTRING,sum,
			 &length);
  if(retval) return retval;
  sum += length;

  *retlen = sum;
  return 0;
}
Beispiel #8
0
asn1_error_code
asn1_make_etag(asn1buf *buf, asn1_class asn1class, asn1_tagnum tagnum,
               unsigned int in_len, unsigned int *retlen)
{
    return asn1_make_tag(buf,asn1class,CONSTRUCTED,tagnum,in_len,retlen);
}