xref: /freebsd/crypto/krb5/src/lib/krb5/krb/copy_athctr.c (revision 7f2fe78b9dd5f51c821d771b63d2e096f6fd49e9)
1 /* -*- mode: c; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2 /* lib/krb5/krb/copy_athctr.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 #include "k5-int.h"
28 #include "auth_con.h"
29 
30 #ifndef LEAN_CLIENT
31 krb5_error_code KRB5_CALLCONV
krb5_copy_authenticator(krb5_context context,const krb5_authenticator * authfrom,krb5_authenticator ** authto)32 krb5_copy_authenticator(krb5_context context, const krb5_authenticator *authfrom,
33                         krb5_authenticator **authto)
34 {
35     krb5_error_code retval;
36     krb5_authenticator *tempto;
37 
38     if (!(tempto = (krb5_authenticator *)malloc(sizeof(*tempto))))
39         return ENOMEM;
40     *tempto = *authfrom;
41 
42     retval = krb5_copy_principal(context, authfrom->client, &tempto->client);
43     if (retval) {
44         free(tempto);
45         return retval;
46     }
47 
48     if (authfrom->checksum &&
49         (retval = krb5_copy_checksum(context, authfrom->checksum, &tempto->checksum))) {
50         krb5_free_principal(context, tempto->client);
51         free(tempto);
52         return retval;
53     }
54 
55     if (authfrom->subkey) {
56         retval = krb5_copy_keyblock(context, authfrom->subkey, &tempto->subkey);
57         if (retval) {
58             krb5_free_checksum(context, tempto->checksum);
59             krb5_free_principal(context, tempto->client);
60             free(tempto);
61             return retval;
62         }
63     }
64 
65     if (authfrom->authorization_data) {
66         retval = krb5_copy_authdata(context, authfrom->authorization_data,
67                                     &tempto->authorization_data);
68         if (retval) {
69             krb5_free_keyblock(context, tempto->subkey);
70             krb5_free_checksum(context, tempto->checksum);
71             krb5_free_principal(context, tempto->client);
72             free(tempto);
73             return retval;
74         }
75     }
76 
77     *authto = tempto;
78     return 0;
79 }
80 
81 krb5_error_code KRB5_CALLCONV
krb5_auth_con_getauthenticator(krb5_context context,krb5_auth_context auth_context,krb5_authenticator ** authenticator)82 krb5_auth_con_getauthenticator(krb5_context context, krb5_auth_context auth_context,
83                                krb5_authenticator **authenticator)
84 {
85     return (krb5_copy_authenticator(context, auth_context->authentp,
86                                     authenticator));
87 }
88 #endif
89