155682Smarkm/*
2233294Sstas * Copyright (c) 1997-2005 Kungliga Tekniska H��gskolan
3233294Sstas * (Royal Institute of Technology, Stockholm, Sweden).
4233294Sstas * All rights reserved.
555682Smarkm *
6233294Sstas * Portions Copyright (c) 2009 Apple Inc. All rights reserved.
755682Smarkm *
8233294Sstas * Redistribution and use in source and binary forms, with or without
9233294Sstas * modification, are permitted provided that the following conditions
10233294Sstas * are met:
1155682Smarkm *
12233294Sstas * 1. Redistributions of source code must retain the above copyright
13233294Sstas *    notice, this list of conditions and the following disclaimer.
1455682Smarkm *
15233294Sstas * 2. Redistributions in binary form must reproduce the above copyright
16233294Sstas *    notice, this list of conditions and the following disclaimer in the
17233294Sstas *    documentation and/or other materials provided with the distribution.
1855682Smarkm *
19233294Sstas * 3. Neither the name of the Institute nor the names of its contributors
20233294Sstas *    may be used to endorse or promote products derived from this software
21233294Sstas *    without specific prior written permission.
22233294Sstas *
23233294Sstas * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
24233294Sstas * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25233294Sstas * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26233294Sstas * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
27233294Sstas * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28233294Sstas * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
29233294Sstas * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30233294Sstas * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31233294Sstas * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32233294Sstas * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
33233294Sstas * SUCH DAMAGE.
3455682Smarkm */
3555682Smarkm
3655682Smarkm#include "der_locl.h"
3755682Smarkm
38233294SstasRCSID("$Id$");
3955682Smarkm
40127808Snectarsize_t
41127808Snectar_heim_len_unsigned (unsigned val)
4255682Smarkm{
43178825Sdfr    size_t ret = 0;
44178825Sdfr    int last_val_gt_128;
45233294Sstas
46178825Sdfr    do {
47178825Sdfr	++ret;
48178825Sdfr	last_val_gt_128 = (val >= 128);
49178825Sdfr	val /= 256;
50178825Sdfr    } while (val);
5155682Smarkm
52178825Sdfr    if(last_val_gt_128)
53178825Sdfr	ret++;
54178825Sdfr
55178825Sdfr    return ret;
5655682Smarkm}
5755682Smarkm
58127808Snectarsize_t
59127808Snectar_heim_len_int (int val)
6055682Smarkm{
61127808Snectar    unsigned char q;
62127808Snectar    size_t ret = 0;
6355682Smarkm
64127808Snectar    if (val >= 0) {
65127808Snectar	do {
66127808Snectar	    q = val % 256;
67127808Snectar	    ret++;
68127808Snectar	    val /= 256;
69127808Snectar	} while(val);
70127808Snectar	if(q >= 128)
71127808Snectar	    ret++;
72127808Snectar    } else {
73127808Snectar	val = ~val;
74127808Snectar	do {
75127808Snectar	    q = ~(val % 256);
76127808Snectar	    ret++;
77127808Snectar	    val /= 256;
78127808Snectar	} while(val);
79127808Snectar	if(q < 128)
80127808Snectar	    ret++;
81127808Snectar    }
82127808Snectar    return ret;
8355682Smarkm}
8455682Smarkm
8590926Snectarstatic size_t
86178825Sdfrlen_oid (const heim_oid *oid)
8790926Snectar{
8890926Snectar    size_t ret = 1;
89233294Sstas    size_t n;
9090926Snectar
9190926Snectar    for (n = 2; n < oid->length; ++n) {
9290926Snectar	unsigned u = oid->components[n];
9390926Snectar
94178825Sdfr	do {
9590926Snectar	    ++ret;
9690926Snectar	    u /= 128;
97178825Sdfr	} while(u > 0);
9890926Snectar    }
9990926Snectar    return ret;
10090926Snectar}
10190926Snectar
10255682Smarkmsize_t
103178825Sdfrder_length_len (size_t len)
10455682Smarkm{
105127808Snectar    if (len < 128)
106127808Snectar	return 1;
107178825Sdfr    else {
108178825Sdfr	int ret = 0;
109178825Sdfr	do {
110178825Sdfr	    ++ret;
111178825Sdfr	    len /= 256;
112178825Sdfr	} while (len);
113178825Sdfr	return ret + 1;
114178825Sdfr    }
11555682Smarkm}
11655682Smarkm
11755682Smarkmsize_t
118233294Sstasder_length_tag(unsigned int tag)
119233294Sstas{
120233294Sstas    size_t len = 0;
121233294Sstas
122233294Sstas    if(tag <= 30)
123233294Sstas	return 1;
124233294Sstas    while(tag) {
125233294Sstas	tag /= 128;
126233294Sstas	len++;
127233294Sstas    }
128233294Sstas    return len + 1;
129233294Sstas}
130233294Sstas
131233294Sstassize_t
132178825Sdfrder_length_integer (const int *data)
13355682Smarkm{
134178825Sdfr    return _heim_len_int (*data);
135178825Sdfr}
13655682Smarkm
137178825Sdfrsize_t
138178825Sdfrder_length_unsigned (const unsigned *data)
139178825Sdfr{
140178825Sdfr    return _heim_len_unsigned(*data);
14155682Smarkm}
14255682Smarkm
14355682Smarkmsize_t
144178825Sdfrder_length_enumerated (const unsigned *data)
14572445Sassar{
146178825Sdfr  return _heim_len_int (*data);
147178825Sdfr}
14872445Sassar
149178825Sdfrsize_t
150178825Sdfrder_length_general_string (const heim_general_string *data)
151178825Sdfr{
152178825Sdfr    return strlen(*data);
15372445Sassar}
15472445Sassar
15572445Sassarsize_t
156178825Sdfrder_length_utf8string (const heim_utf8_string *data)
15790926Snectar{
158178825Sdfr    return strlen(*data);
159178825Sdfr}
16090926Snectar
161178825Sdfrsize_t
162178825Sdfrder_length_printable_string (const heim_printable_string *data)
163178825Sdfr{
164233294Sstas    return data->length;
16590926Snectar}
16690926Snectar
16790926Snectarsize_t
168178825Sdfrder_length_ia5_string (const heim_ia5_string *data)
16955682Smarkm{
170233294Sstas    return data->length;
17155682Smarkm}
17255682Smarkm
17355682Smarkmsize_t
174178825Sdfrder_length_bmp_string (const heim_bmp_string *data)
17555682Smarkm{
176178825Sdfr    return data->length * 2;
17755682Smarkm}
17855682Smarkm
17955682Smarkmsize_t
180178825Sdfrder_length_universal_string (const heim_universal_string *data)
18190926Snectar{
182178825Sdfr    return data->length * 4;
183178825Sdfr}
18490926Snectar
185178825Sdfrsize_t
186178825Sdfrder_length_visible_string (const heim_visible_string *data)
187178825Sdfr{
188178825Sdfr    return strlen(*data);
18990926Snectar}
19090926Snectar
19190926Snectarsize_t
192178825Sdfrder_length_octet_string (const heim_octet_string *k)
19355682Smarkm{
194178825Sdfr    return k->length;
195178825Sdfr}
19655682Smarkm
197178825Sdfrsize_t
198178825Sdfrder_length_heim_integer (const heim_integer *k)
199178825Sdfr{
200178825Sdfr    if (k->length == 0)
201178825Sdfr	return 1;
202178825Sdfr    if (k->negative)
203178825Sdfr	return k->length + (((~(((unsigned char *)k->data)[0])) & 0x80) ? 0 : 1);
204178825Sdfr    else
205178825Sdfr	return k->length + ((((unsigned char *)k->data)[0] & 0x80) ? 1 : 0);
20655682Smarkm}
207178825Sdfr
208178825Sdfrsize_t
209178825Sdfrder_length_oid (const heim_oid *k)
210178825Sdfr{
211178825Sdfr    return len_oid (k);
212178825Sdfr}
213178825Sdfr
214178825Sdfrsize_t
215178825Sdfrder_length_generalized_time (const time_t *t)
216178825Sdfr{
217178825Sdfr    heim_octet_string k;
218178825Sdfr    size_t ret;
219178825Sdfr
220178825Sdfr    _heim_time2generalizedtime (*t, &k, 1);
221178825Sdfr    ret = k.length;
222178825Sdfr    free(k.data);
223178825Sdfr    return ret;
224178825Sdfr}
225178825Sdfr
226178825Sdfrsize_t
227178825Sdfrder_length_utctime (const time_t *t)
228178825Sdfr{
229178825Sdfr    heim_octet_string k;
230178825Sdfr    size_t ret;
231178825Sdfr
232178825Sdfr    _heim_time2generalizedtime (*t, &k, 0);
233178825Sdfr    ret = k.length;
234178825Sdfr    free(k.data);
235178825Sdfr    return ret;
236178825Sdfr}
237178825Sdfr
238178825Sdfrsize_t
239178825Sdfrder_length_boolean (const int *k)
240178825Sdfr{
241178825Sdfr    return 1;
242178825Sdfr}
243178825Sdfr
244178825Sdfrsize_t
245178825Sdfrder_length_bit_string (const heim_bit_string *k)
246178825Sdfr{
247178825Sdfr    return (k->length + 7) / 8 + 1;
248178825Sdfr}
249