1 /* 2 * Copyright 2004 Sun Microsystems, Inc. All rights reserved. 3 * Use is subject to license terms. 4 */ 5 6 #pragma ident "%Z%%M% %I% %E% SMI" 7 8 /* 9 * lib/krb5/krb/copy_athctr.c 10 * 11 * Copyright 1990,1991 by the Massachusetts Institute of Technology. 12 * All Rights Reserved. 13 * 14 * Export of this software from the United States of America may 15 * require a specific license from the United States Government. 16 * It is the responsibility of any person or organization contemplating 17 * export to obtain such a license before exporting. 18 * 19 * WITHIN THAT CONSTRAINT, permission to use, copy, modify, and 20 * distribute this software and its documentation for any purpose and 21 * without fee is hereby granted, provided that the above copyright 22 * notice appear in all copies and that both that copyright notice and 23 * this permission notice appear in supporting documentation, and that 24 * the name of M.I.T. not be used in advertising or publicity pertaining 25 * to distribution of the software without specific, written prior 26 * permission. Furthermore if you modify this software you must label 27 * your software as modified software and not distribute it in such a 28 * fashion that it might be confused with the original M.I.T. software. 29 * M.I.T. makes no representations about the suitability of 30 * this software for any purpose. It is provided "as is" without express 31 * or implied warranty. 32 * 33 * 34 * krb5_copy_authenticator() 35 */ 36 37 #include <k5-int.h> 38 39 KRB5_DLLIMP krb5_error_code KRB5_CALLCONV 40 krb5_copy_authenticator(context, authfrom, authto) 41 krb5_context context; 42 const krb5_authenticator FAR *authfrom; 43 krb5_authenticator FAR *FAR *authto; 44 { 45 krb5_error_code retval; 46 krb5_authenticator *tempto; 47 48 if (!(tempto = (krb5_authenticator *)MALLOC(sizeof(*tempto)))) 49 return ENOMEM; 50 #ifdef HAVE_C_STRUCTURE_ASSIGNMENT 51 *tempto = *authfrom; 52 #else 53 (void) memcpy(tempto, authfrom, sizeof(krb5_authenticator)); 54 #endif 55 56 retval = krb5_copy_principal(context, authfrom->client, &tempto->client); 57 if (retval) { 58 krb5_xfree_wrap(tempto, sizeof(*tempto)); 59 return retval; 60 } 61 62 if (authfrom->checksum && 63 (retval = krb5_copy_checksum(context, authfrom->checksum, &tempto->checksum))) { 64 krb5_free_principal(context, tempto->client); 65 krb5_xfree_wrap(tempto, sizeof(*tempto)); 66 return retval; 67 } 68 69 if (authfrom->subkey) { 70 retval = krb5_copy_keyblock(context, authfrom->subkey, &tempto->subkey); 71 if (retval) { 72 krb5_xfree_wrap(tempto->subkey, sizeof(krb5_keyblock)); 73 krb5_free_checksum(context, tempto->checksum); 74 krb5_free_principal(context, tempto->client); 75 krb5_xfree_wrap(tempto, sizeof(*tempto)); 76 return retval; 77 } 78 } 79 80 if (authfrom->authorization_data) { 81 retval = krb5_copy_authdata(context, authfrom->authorization_data, 82 &tempto->authorization_data); 83 if (retval) { 84 krb5_xfree_wrap(tempto->subkey, sizeof(krb5_keyblock)); 85 krb5_free_checksum(context, tempto->checksum); 86 krb5_free_principal(context, tempto->client); 87 krb5_free_authdata(context, tempto->authorization_data); 88 krb5_xfree_wrap(tempto, sizeof(*tempto)); 89 return retval; 90 } 91 } 92 93 *authto = tempto; 94 return 0; 95 } 96