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