diff options
Diffstat (limited to 'source4/heimdal/lib/asn1/der_length.c')
-rw-r--r-- | source4/heimdal/lib/asn1/der_length.c | 95 |
1 files changed, 76 insertions, 19 deletions
diff --git a/source4/heimdal/lib/asn1/der_length.c b/source4/heimdal/lib/asn1/der_length.c index db82025861e..9a9913311d6 100644 --- a/source4/heimdal/lib/asn1/der_length.c +++ b/source4/heimdal/lib/asn1/der_length.c @@ -56,6 +56,24 @@ _heim_len_unsigned (unsigned val) } size_t +_heim_len_unsigned64 (uint64_t val) +{ + size_t ret = 0; + int last_val_gt_128; + + do { + ++ret; + last_val_gt_128 = (val >= 128); + val /= 256; + } while (val); + + if(last_val_gt_128) + ret++; + + return ret; +} + +size_t _heim_len_int (int val) { unsigned char q; @@ -82,6 +100,33 @@ _heim_len_int (int val) return ret; } +size_t +_heim_len_int64 (int64_t val) +{ + unsigned char q; + size_t ret = 0; + + if (val >= 0) { + do { + q = val % 256; + ret++; + val /= 256; + } while(val); + if(q >= 128) + ret++; + } else { + val = ~val; + do { + q = ~(val % 256); + ret++; + val /= 256; + } while(val); + if(q < 128) + ret++; + } + return ret; +} + static size_t len_oid (const heim_oid *oid) { @@ -99,7 +144,7 @@ len_oid (const heim_oid *oid) return ret; } -size_t +size_t ASN1CALL der_length_len (size_t len) { if (len < 128) @@ -114,7 +159,7 @@ der_length_len (size_t len) } } -size_t +size_t ASN1CALL der_length_tag(unsigned int tag) { size_t len = 0; @@ -128,73 +173,85 @@ der_length_tag(unsigned int tag) return len + 1; } -size_t +size_t ASN1CALL der_length_integer (const int *data) { return _heim_len_int (*data); } -size_t +size_t ASN1CALL +der_length_integer64 (const int64_t *data) +{ + return _heim_len_int64 (*data); +} + +size_t ASN1CALL der_length_unsigned (const unsigned *data) { return _heim_len_unsigned(*data); } -size_t +size_t ASN1CALL +der_length_unsigned64 (const uint64_t *data) +{ + return _heim_len_unsigned64(*data); +} + +size_t ASN1CALL der_length_enumerated (const unsigned *data) { return _heim_len_int (*data); } -size_t +size_t ASN1CALL der_length_general_string (const heim_general_string *data) { return strlen(*data); } -size_t +size_t ASN1CALL der_length_utf8string (const heim_utf8_string *data) { return strlen(*data); } -size_t +size_t ASN1CALL der_length_printable_string (const heim_printable_string *data) { return data->length; } -size_t +size_t ASN1CALL der_length_ia5_string (const heim_ia5_string *data) { return data->length; } -size_t +size_t ASN1CALL der_length_bmp_string (const heim_bmp_string *data) { return data->length * 2; } -size_t +size_t ASN1CALL der_length_universal_string (const heim_universal_string *data) { return data->length * 4; } -size_t +size_t ASN1CALL der_length_visible_string (const heim_visible_string *data) { return strlen(*data); } -size_t +size_t ASN1CALL der_length_octet_string (const heim_octet_string *k) { return k->length; } -size_t +size_t ASN1CALL der_length_heim_integer (const heim_integer *k) { if (k->length == 0) @@ -205,13 +262,13 @@ der_length_heim_integer (const heim_integer *k) return k->length + ((((unsigned char *)k->data)[0] & 0x80) ? 1 : 0); } -size_t +size_t ASN1CALL der_length_oid (const heim_oid *k) { return len_oid (k); } -size_t +size_t ASN1CALL der_length_generalized_time (const time_t *t) { heim_octet_string k; @@ -223,7 +280,7 @@ der_length_generalized_time (const time_t *t) return ret; } -size_t +size_t ASN1CALL der_length_utctime (const time_t *t) { heim_octet_string k; @@ -235,13 +292,13 @@ der_length_utctime (const time_t *t) return ret; } -size_t +size_t ASN1CALL der_length_boolean (const int *k) { return 1; } -size_t +size_t ASN1CALL der_length_bit_string (const heim_bit_string *k) { return (k->length + 7) / 8 + 1; |