codec.c revision 55682
1/* 2 * Copyright (c) 1998 - 1999 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 "krb5_locl.h" 35 36RCSID("$Id: codec.c,v 1.6 1999/12/02 17:05:08 joda Exp $"); 37 38/* these functions does what the normal asn.1-functions does, but 39 converts the keytype to/from the on-the-wire enctypes */ 40 41#if 1 42#define DECODE(T, K) return decode_ ## T(data, length, t, len) 43#define ENCODE(T, K) return encode_ ## T(data, length, t, len) 44#else 45#define DECODE(T, K) \ 46{ \ 47 krb5_error_code ret; \ 48 ret = decode_ ## T((void*)data, length, t, len); \ 49 if(ret) \ 50 return ret; \ 51 if(K) \ 52 ret = krb5_decode_keyblock(context, (K), 1); \ 53 return ret; \ 54} 55 56#define ENCODE(T, K) \ 57{ \ 58 krb5_error_code ret = 0; \ 59 if(K) \ 60 ret = krb5_decode_keyblock(context, (K), 0); \ 61 if(ret) \ 62 return ret; \ 63 return encode_ ## T(data, length, t, len); \ 64} 65#endif 66 67krb5_error_code 68krb5_decode_EncTicketPart (krb5_context context, 69 const void *data, 70 size_t length, 71 EncTicketPart *t, 72 size_t *len) 73{ 74 DECODE(EncTicketPart, &t->key); 75} 76 77krb5_error_code 78krb5_encode_EncTicketPart (krb5_context context, 79 void *data, 80 size_t length, 81 EncTicketPart *t, 82 size_t *len) 83{ 84 ENCODE(EncTicketPart, &t->key); 85} 86 87krb5_error_code 88krb5_decode_EncASRepPart (krb5_context context, 89 const void *data, 90 size_t length, 91 EncASRepPart *t, 92 size_t *len) 93{ 94 DECODE(EncASRepPart, &t->key); 95} 96 97krb5_error_code 98krb5_encode_EncASRepPart (krb5_context context, 99 void *data, 100 size_t length, 101 EncASRepPart *t, 102 size_t *len) 103{ 104 ENCODE(EncASRepPart, &t->key); 105} 106 107krb5_error_code 108krb5_decode_EncTGSRepPart (krb5_context context, 109 const void *data, 110 size_t length, 111 EncTGSRepPart *t, 112 size_t *len) 113{ 114 DECODE(EncTGSRepPart, &t->key); 115} 116 117krb5_error_code 118krb5_encode_EncTGSRepPart (krb5_context context, 119 void *data, 120 size_t length, 121 EncTGSRepPart *t, 122 size_t *len) 123{ 124 ENCODE(EncTGSRepPart, &t->key); 125} 126 127krb5_error_code 128krb5_decode_EncAPRepPart (krb5_context context, 129 const void *data, 130 size_t length, 131 EncAPRepPart *t, 132 size_t *len) 133{ 134 DECODE(EncAPRepPart, t->subkey); 135} 136 137krb5_error_code 138krb5_encode_EncAPRepPart (krb5_context context, 139 void *data, 140 size_t length, 141 EncAPRepPart *t, 142 size_t *len) 143{ 144 ENCODE(EncAPRepPart, t->subkey); 145} 146 147krb5_error_code 148krb5_decode_Authenticator (krb5_context context, 149 const void *data, 150 size_t length, 151 Authenticator *t, 152 size_t *len) 153{ 154 DECODE(Authenticator, t->subkey); 155} 156 157krb5_error_code 158krb5_encode_Authenticator (krb5_context context, 159 void *data, 160 size_t length, 161 Authenticator *t, 162 size_t *len) 163{ 164 ENCODE(Authenticator, t->subkey); 165} 166 167krb5_error_code 168krb5_decode_EncKrbCredPart (krb5_context context, 169 const void *data, 170 size_t length, 171 EncKrbCredPart *t, 172 size_t *len) 173{ 174#if 1 175 return decode_EncKrbCredPart(data, length, t, len); 176#else 177 krb5_error_code ret; 178 int i; 179 ret = decode_EncKrbCredPart((void*)data, length, t, len); 180 if(ret) 181 return ret; 182 for(i = 0; i < t->ticket_info.len; i++) 183 if((ret = krb5_decode_keyblock(context, &t->ticket_info.val[i].key, 1))) 184 break; 185 return ret; 186#endif 187} 188 189krb5_error_code 190krb5_encode_EncKrbCredPart (krb5_context context, 191 void *data, 192 size_t length, 193 EncKrbCredPart *t, 194 size_t *len) 195{ 196#if 0 197 krb5_error_code ret = 0; 198 int i; 199 200 for(i = 0; i < t->ticket_info.len; i++) 201 if((ret = krb5_decode_keyblock(context, &t->ticket_info.val[i].key, 0))) 202 break; 203 if(ret) return ret; 204#endif 205 return encode_EncKrbCredPart (data, length, t, len); 206} 207 208krb5_error_code 209krb5_decode_ETYPE_INFO (krb5_context context, 210 const void *data, 211 size_t length, 212 ETYPE_INFO *t, 213 size_t *len) 214{ 215#if 1 216 return decode_ETYPE_INFO(data, length, t, len); 217#else 218 krb5_error_code ret; 219 int i; 220 221 ret = decode_ETYPE_INFO((void*)data, length, t, len); 222 if(ret) 223 return ret; 224 for(i = 0; i < t->len; i++) { 225 if((ret = krb5_decode_keytype(context, &t->val[i].etype, 1))) 226 break; 227 } 228 return ret; 229#endif 230} 231 232krb5_error_code 233krb5_encode_ETYPE_INFO (krb5_context context, 234 void *data, 235 size_t length, 236 ETYPE_INFO *t, 237 size_t *len) 238{ 239#if 0 240 krb5_error_code ret = 0; 241 242 int i; 243 /* XXX this will break, since we need one key-info for each enctype */ 244 /* XXX or do we? */ 245 for(i = 0; i < t->len; i++) 246 if((ret = krb5_decode_keytype(context, &t->val[i].etype, 0))) 247 break; 248 if(ret) return ret; 249#endif 250 return encode_ETYPE_INFO (data, length, t, len); 251} 252