1 /* 2 * lib/krb5/krb/copy_tick.c 3 * 4 * Copyright 1990,1991 by the Massachusetts Institute of Technology. 5 * All Rights Reserved. 6 * 7 * Export of this software from the United States of America may 8 * require a specific license from the United States Government. 9 * It is the responsibility of any person or organization contemplating 10 * export to obtain such a license before exporting. 11 * 12 * WITHIN THAT CONSTRAINT, permission to use, copy, modify, and 13 * distribute this software and its documentation for any purpose and 14 * without fee is hereby granted, provided that the above copyright 15 * notice appear in all copies and that both that copyright notice and 16 * this permission notice appear in supporting documentation, and that 17 * the name of M.I.T. not be used in advertising or publicity pertaining 18 * to distribution of the software without specific, written prior 19 * permission. Furthermore if you modify this software you must label 20 * your software as modified software and not distribute it in such a 21 * fashion that it might be confused with the original M.I.T. software. 22 * M.I.T. makes no representations about the suitability of 23 * this software for any purpose. It is provided "as is" without express 24 * or implied warranty. 25 * 26 * 27 * krb5_copy_ticket() 28 */ 29 30 #include "k5-int.h" 31 32 static krb5_error_code 33 krb5_copy_enc_tkt_part(krb5_context context, const krb5_enc_tkt_part *partfrom, krb5_enc_tkt_part **partto) 34 { 35 krb5_error_code retval; 36 krb5_enc_tkt_part *tempto; 37 38 if (!(tempto = (krb5_enc_tkt_part *)malloc(sizeof(*tempto)))) 39 return ENOMEM; 40 *tempto = *partfrom; 41 retval = krb5_copy_keyblock(context, partfrom->session, 42 &tempto->session); 43 if (retval) { 44 krb5_xfree(tempto); 45 return retval; 46 } 47 retval = krb5_copy_principal(context, partfrom->client, &tempto->client); 48 if (retval) { 49 krb5_free_keyblock(context, tempto->session); 50 krb5_xfree(tempto); 51 return retval; 52 } 53 tempto->transited = partfrom->transited; 54 if (tempto->transited.tr_contents.length == 0) { 55 tempto->transited.tr_contents.data = 0; 56 } else { 57 tempto->transited.tr_contents.data = 58 malloc(partfrom->transited.tr_contents.length); 59 if (!tempto->transited.tr_contents.data) { 60 krb5_free_principal(context, tempto->client); 61 krb5_free_keyblock(context, tempto->session); 62 krb5_xfree(tempto); 63 return ENOMEM; 64 } 65 memcpy((char *)tempto->transited.tr_contents.data, 66 (char *)partfrom->transited.tr_contents.data, 67 partfrom->transited.tr_contents.length); 68 } 69 70 retval = krb5_copy_addresses(context, partfrom->caddrs, &tempto->caddrs); 71 if (retval) { 72 krb5_xfree(tempto->transited.tr_contents.data); 73 krb5_free_principal(context, tempto->client); 74 krb5_free_keyblock(context, tempto->session); 75 krb5_xfree(tempto); 76 return retval; 77 } 78 if (partfrom->authorization_data) { 79 retval = krb5_copy_authdata(context, partfrom->authorization_data, 80 &tempto->authorization_data); 81 if (retval) { 82 krb5_free_addresses(context, tempto->caddrs); 83 krb5_xfree(tempto->transited.tr_contents.data); 84 krb5_free_principal(context, tempto->client); 85 krb5_free_keyblock(context, tempto->session); 86 krb5_xfree(tempto); 87 return retval; 88 } 89 } 90 *partto = tempto; 91 return 0; 92 } 93 94 krb5_error_code KRB5_CALLCONV 95 krb5_copy_ticket(krb5_context context, const krb5_ticket *from, krb5_ticket **pto) 96 { 97 krb5_error_code retval; 98 krb5_ticket *tempto; 99 krb5_data *scratch; 100 101 if (!(tempto = (krb5_ticket *)malloc(sizeof(*tempto)))) 102 return ENOMEM; 103 *tempto = *from; 104 retval = krb5_copy_principal(context, from->server, &tempto->server); 105 if (retval) { 106 krb5_xfree(tempto); 107 return retval; 108 } 109 retval = krb5_copy_data(context, &from->enc_part.ciphertext, &scratch); 110 if (retval) { 111 krb5_free_principal(context, tempto->server); 112 krb5_xfree(tempto); 113 return retval; 114 } 115 tempto->enc_part.ciphertext = *scratch; 116 krb5_xfree(scratch); 117 retval = krb5_copy_enc_tkt_part(context, from->enc_part2, &tempto->enc_part2); 118 if (retval) { 119 krb5_xfree(tempto->enc_part.ciphertext.data); 120 krb5_free_principal(context, tempto->server); 121 krb5_xfree(tempto); 122 return retval; 123 } 124 *pto = tempto; 125 return 0; 126 } 127