der_length.c revision 127808
1/*
2 * Copyright (c) 1997 - 2001 Kungliga Tekniska H�gskolan
3 * (Royal Institute of Technology, Stockholm, Sweden).
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 *
10 * 1. Redistributions of source code must retain the above copyright
11 *    notice, this list of conditions and the following disclaimer.
12 *
13 * 2. Redistributions in binary form must reproduce the above copyright
14 *    notice, this list of conditions and the following disclaimer in the
15 *    documentation and/or other materials provided with the distribution.
16 *
17 * 3. Neither the name of the Institute nor the names of its contributors
18 *    may be used to endorse or promote products derived from this software
19 *    without specific prior written permission.
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31 * SUCH DAMAGE.
32 */
33
34#include "der_locl.h"
35
36RCSID("$Id: der_length.c,v 1.12.6.2 2004/02/12 18:45:51 joda Exp $");
37
38size_t
39_heim_len_unsigned (unsigned val)
40{
41  size_t ret = 0;
42
43  do {
44    ++ret;
45    val /= 256;
46  } while (val);
47  return ret;
48}
49
50size_t
51_heim_len_int (int val)
52{
53    unsigned char q;
54    size_t ret = 0;
55
56    if (val >= 0) {
57	do {
58	    q = val % 256;
59	    ret++;
60	    val /= 256;
61	} while(val);
62	if(q >= 128)
63	    ret++;
64    } else {
65	val = ~val;
66	do {
67	    q = ~(val % 256);
68	    ret++;
69	    val /= 256;
70	} while(val);
71	if(q < 128)
72	    ret++;
73    }
74    return ret;
75}
76
77static size_t
78len_oid (const oid *oid)
79{
80    size_t ret = 1;
81    int n;
82
83    for (n = 2; n < oid->length; ++n) {
84	unsigned u = oid->components[n];
85
86	++ret;
87	u /= 128;
88	while (u > 0) {
89	    ++ret;
90	    u /= 128;
91	}
92    }
93    return ret;
94}
95
96size_t
97length_len (size_t len)
98{
99    if (len < 128)
100	return 1;
101    else
102	return _heim_len_unsigned (len) + 1;
103}
104
105size_t
106length_integer (const int *data)
107{
108    size_t len = _heim_len_int (*data);
109
110  return 1 + length_len(len) + len;
111}
112
113size_t
114length_unsigned (const unsigned *data)
115{
116  size_t len = _heim_len_unsigned (*data);
117
118  return 1 + length_len(len) + len;
119}
120
121size_t
122length_enumerated (const unsigned *data)
123{
124    size_t len = _heim_len_int (*data);
125
126  return 1 + length_len(len) + len;
127}
128
129size_t
130length_general_string (const general_string *data)
131{
132  char *str = *data;
133  size_t len = strlen(str);
134  return 1 + length_len(len) + len;
135}
136
137size_t
138length_octet_string (const octet_string *k)
139{
140  return 1 + length_len(k->length) + k->length;
141}
142
143size_t
144length_oid (const oid *k)
145{
146  size_t len = len_oid (k);
147
148  return 1 + length_len(len) + len;
149}
150
151size_t
152length_generalized_time (const time_t *t)
153{
154  octet_string k;
155  size_t ret;
156
157  time2generalizedtime (*t, &k);
158  ret = 1 + length_len(k.length) + k.length;
159  free (k.data);
160  return ret;
161}
162