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; }
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; }
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; }
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; }
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; }
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; }
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; }
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); }