codec.c revision 55682
155682Smarkm/* 255682Smarkm * Copyright (c) 1998 - 1999 Kungliga Tekniska H�gskolan 355682Smarkm * (Royal Institute of Technology, Stockholm, Sweden). 455682Smarkm * All rights reserved. 555682Smarkm * 655682Smarkm * Redistribution and use in source and binary forms, with or without 755682Smarkm * modification, are permitted provided that the following conditions 855682Smarkm * are met: 955682Smarkm * 1055682Smarkm * 1. Redistributions of source code must retain the above copyright 1155682Smarkm * notice, this list of conditions and the following disclaimer. 1255682Smarkm * 1355682Smarkm * 2. Redistributions in binary form must reproduce the above copyright 1455682Smarkm * notice, this list of conditions and the following disclaimer in the 1555682Smarkm * documentation and/or other materials provided with the distribution. 1655682Smarkm * 1755682Smarkm * 3. Neither the name of the Institute nor the names of its contributors 1855682Smarkm * may be used to endorse or promote products derived from this software 1955682Smarkm * without specific prior written permission. 2055682Smarkm * 2155682Smarkm * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND 2255682Smarkm * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 2355682Smarkm * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 2455682Smarkm * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE 2555682Smarkm * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 2655682Smarkm * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2755682Smarkm * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2855682Smarkm * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 2955682Smarkm * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 3055682Smarkm * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 3155682Smarkm * SUCH DAMAGE. 3255682Smarkm */ 3355682Smarkm 3455682Smarkm#include "krb5_locl.h" 3555682Smarkm 3655682SmarkmRCSID("$Id: codec.c,v 1.6 1999/12/02 17:05:08 joda Exp $"); 3755682Smarkm 3855682Smarkm/* these functions does what the normal asn.1-functions does, but 3955682Smarkm converts the keytype to/from the on-the-wire enctypes */ 4055682Smarkm 4155682Smarkm#if 1 4255682Smarkm#define DECODE(T, K) return decode_ ## T(data, length, t, len) 4355682Smarkm#define ENCODE(T, K) return encode_ ## T(data, length, t, len) 4455682Smarkm#else 4555682Smarkm#define DECODE(T, K) \ 4655682Smarkm{ \ 4755682Smarkm krb5_error_code ret; \ 4855682Smarkm ret = decode_ ## T((void*)data, length, t, len); \ 4955682Smarkm if(ret) \ 5055682Smarkm return ret; \ 5155682Smarkm if(K) \ 5255682Smarkm ret = krb5_decode_keyblock(context, (K), 1); \ 5355682Smarkm return ret; \ 5455682Smarkm} 5555682Smarkm 5655682Smarkm#define ENCODE(T, K) \ 5755682Smarkm{ \ 5855682Smarkm krb5_error_code ret = 0; \ 5955682Smarkm if(K) \ 6055682Smarkm ret = krb5_decode_keyblock(context, (K), 0); \ 6155682Smarkm if(ret) \ 6255682Smarkm return ret; \ 6355682Smarkm return encode_ ## T(data, length, t, len); \ 6455682Smarkm} 6555682Smarkm#endif 6655682Smarkm 6755682Smarkmkrb5_error_code 6855682Smarkmkrb5_decode_EncTicketPart (krb5_context context, 6955682Smarkm const void *data, 7055682Smarkm size_t length, 7155682Smarkm EncTicketPart *t, 7255682Smarkm size_t *len) 7355682Smarkm{ 7455682Smarkm DECODE(EncTicketPart, &t->key); 7555682Smarkm} 7655682Smarkm 7755682Smarkmkrb5_error_code 7855682Smarkmkrb5_encode_EncTicketPart (krb5_context context, 7955682Smarkm void *data, 8055682Smarkm size_t length, 8155682Smarkm EncTicketPart *t, 8255682Smarkm size_t *len) 8355682Smarkm{ 8455682Smarkm ENCODE(EncTicketPart, &t->key); 8555682Smarkm} 8655682Smarkm 8755682Smarkmkrb5_error_code 8855682Smarkmkrb5_decode_EncASRepPart (krb5_context context, 8955682Smarkm const void *data, 9055682Smarkm size_t length, 9155682Smarkm EncASRepPart *t, 9255682Smarkm size_t *len) 9355682Smarkm{ 9455682Smarkm DECODE(EncASRepPart, &t->key); 9555682Smarkm} 9655682Smarkm 9755682Smarkmkrb5_error_code 9855682Smarkmkrb5_encode_EncASRepPart (krb5_context context, 9955682Smarkm void *data, 10055682Smarkm size_t length, 10155682Smarkm EncASRepPart *t, 10255682Smarkm size_t *len) 10355682Smarkm{ 10455682Smarkm ENCODE(EncASRepPart, &t->key); 10555682Smarkm} 10655682Smarkm 10755682Smarkmkrb5_error_code 10855682Smarkmkrb5_decode_EncTGSRepPart (krb5_context context, 10955682Smarkm const void *data, 11055682Smarkm size_t length, 11155682Smarkm EncTGSRepPart *t, 11255682Smarkm size_t *len) 11355682Smarkm{ 11455682Smarkm DECODE(EncTGSRepPart, &t->key); 11555682Smarkm} 11655682Smarkm 11755682Smarkmkrb5_error_code 11855682Smarkmkrb5_encode_EncTGSRepPart (krb5_context context, 11955682Smarkm void *data, 12055682Smarkm size_t length, 12155682Smarkm EncTGSRepPart *t, 12255682Smarkm size_t *len) 12355682Smarkm{ 12455682Smarkm ENCODE(EncTGSRepPart, &t->key); 12555682Smarkm} 12655682Smarkm 12755682Smarkmkrb5_error_code 12855682Smarkmkrb5_decode_EncAPRepPart (krb5_context context, 12955682Smarkm const void *data, 13055682Smarkm size_t length, 13155682Smarkm EncAPRepPart *t, 13255682Smarkm size_t *len) 13355682Smarkm{ 13455682Smarkm DECODE(EncAPRepPart, t->subkey); 13555682Smarkm} 13655682Smarkm 13755682Smarkmkrb5_error_code 13855682Smarkmkrb5_encode_EncAPRepPart (krb5_context context, 13955682Smarkm void *data, 14055682Smarkm size_t length, 14155682Smarkm EncAPRepPart *t, 14255682Smarkm size_t *len) 14355682Smarkm{ 14455682Smarkm ENCODE(EncAPRepPart, t->subkey); 14555682Smarkm} 14655682Smarkm 14755682Smarkmkrb5_error_code 14855682Smarkmkrb5_decode_Authenticator (krb5_context context, 14955682Smarkm const void *data, 15055682Smarkm size_t length, 15155682Smarkm Authenticator *t, 15255682Smarkm size_t *len) 15355682Smarkm{ 15455682Smarkm DECODE(Authenticator, t->subkey); 15555682Smarkm} 15655682Smarkm 15755682Smarkmkrb5_error_code 15855682Smarkmkrb5_encode_Authenticator (krb5_context context, 15955682Smarkm void *data, 16055682Smarkm size_t length, 16155682Smarkm Authenticator *t, 16255682Smarkm size_t *len) 16355682Smarkm{ 16455682Smarkm ENCODE(Authenticator, t->subkey); 16555682Smarkm} 16655682Smarkm 16755682Smarkmkrb5_error_code 16855682Smarkmkrb5_decode_EncKrbCredPart (krb5_context context, 16955682Smarkm const void *data, 17055682Smarkm size_t length, 17155682Smarkm EncKrbCredPart *t, 17255682Smarkm size_t *len) 17355682Smarkm{ 17455682Smarkm#if 1 17555682Smarkm return decode_EncKrbCredPart(data, length, t, len); 17655682Smarkm#else 17755682Smarkm krb5_error_code ret; 17855682Smarkm int i; 17955682Smarkm ret = decode_EncKrbCredPart((void*)data, length, t, len); 18055682Smarkm if(ret) 18155682Smarkm return ret; 18255682Smarkm for(i = 0; i < t->ticket_info.len; i++) 18355682Smarkm if((ret = krb5_decode_keyblock(context, &t->ticket_info.val[i].key, 1))) 18455682Smarkm break; 18555682Smarkm return ret; 18655682Smarkm#endif 18755682Smarkm} 18855682Smarkm 18955682Smarkmkrb5_error_code 19055682Smarkmkrb5_encode_EncKrbCredPart (krb5_context context, 19155682Smarkm void *data, 19255682Smarkm size_t length, 19355682Smarkm EncKrbCredPart *t, 19455682Smarkm size_t *len) 19555682Smarkm{ 19655682Smarkm#if 0 19755682Smarkm krb5_error_code ret = 0; 19855682Smarkm int i; 19955682Smarkm 20055682Smarkm for(i = 0; i < t->ticket_info.len; i++) 20155682Smarkm if((ret = krb5_decode_keyblock(context, &t->ticket_info.val[i].key, 0))) 20255682Smarkm break; 20355682Smarkm if(ret) return ret; 20455682Smarkm#endif 20555682Smarkm return encode_EncKrbCredPart (data, length, t, len); 20655682Smarkm} 20755682Smarkm 20855682Smarkmkrb5_error_code 20955682Smarkmkrb5_decode_ETYPE_INFO (krb5_context context, 21055682Smarkm const void *data, 21155682Smarkm size_t length, 21255682Smarkm ETYPE_INFO *t, 21355682Smarkm size_t *len) 21455682Smarkm{ 21555682Smarkm#if 1 21655682Smarkm return decode_ETYPE_INFO(data, length, t, len); 21755682Smarkm#else 21855682Smarkm krb5_error_code ret; 21955682Smarkm int i; 22055682Smarkm 22155682Smarkm ret = decode_ETYPE_INFO((void*)data, length, t, len); 22255682Smarkm if(ret) 22355682Smarkm return ret; 22455682Smarkm for(i = 0; i < t->len; i++) { 22555682Smarkm if((ret = krb5_decode_keytype(context, &t->val[i].etype, 1))) 22655682Smarkm break; 22755682Smarkm } 22855682Smarkm return ret; 22955682Smarkm#endif 23055682Smarkm} 23155682Smarkm 23255682Smarkmkrb5_error_code 23355682Smarkmkrb5_encode_ETYPE_INFO (krb5_context context, 23455682Smarkm void *data, 23555682Smarkm size_t length, 23655682Smarkm ETYPE_INFO *t, 23755682Smarkm size_t *len) 23855682Smarkm{ 23955682Smarkm#if 0 24055682Smarkm krb5_error_code ret = 0; 24155682Smarkm 24255682Smarkm int i; 24355682Smarkm /* XXX this will break, since we need one key-info for each enctype */ 24455682Smarkm /* XXX or do we? */ 24555682Smarkm for(i = 0; i < t->len; i++) 24655682Smarkm if((ret = krb5_decode_keytype(context, &t->val[i].etype, 0))) 24755682Smarkm break; 24855682Smarkm if(ret) return ret; 24955682Smarkm#endif 25055682Smarkm return encode_ETYPE_INFO (data, length, t, len); 25155682Smarkm} 252