155682Smarkm/*
2103423Snectar * Copyright (c) 1997 - 2002 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
36178825SdfrRCSID("$Id: auth_context.c 21745 2007-07-31 16:11:25Z lha $");
3755682Smarkm
38178825Sdfrkrb5_error_code KRB5_LIB_FUNCTION
3955682Smarkmkrb5_auth_con_init(krb5_context context,
4055682Smarkm		   krb5_auth_context *auth_context)
4155682Smarkm{
4255682Smarkm    krb5_auth_context p;
4355682Smarkm
4455682Smarkm    ALLOC(p, 1);
4578527Sassar    if(!p) {
4678527Sassar	krb5_set_error_string(context, "malloc: out of memory");
4755682Smarkm	return ENOMEM;
4878527Sassar    }
4955682Smarkm    memset(p, 0, sizeof(*p));
5055682Smarkm    ALLOC(p->authenticator, 1);
5155682Smarkm    if (!p->authenticator) {
5278527Sassar	krb5_set_error_string(context, "malloc: out of memory");
5355682Smarkm	free(p);
5455682Smarkm	return ENOMEM;
5555682Smarkm    }
5655682Smarkm    memset (p->authenticator, 0, sizeof(*p->authenticator));
5755682Smarkm    p->flags = KRB5_AUTH_CONTEXT_DO_TIME;
5855682Smarkm
5955682Smarkm    p->local_address  = NULL;
6055682Smarkm    p->remote_address = NULL;
6155682Smarkm    p->local_port     = 0;
6255682Smarkm    p->remote_port    = 0;
6355682Smarkm    p->keytype        = KEYTYPE_NULL;
6455682Smarkm    p->cksumtype      = CKSUMTYPE_NONE;
6555682Smarkm    *auth_context     = p;
6655682Smarkm    return 0;
6755682Smarkm}
6855682Smarkm
69178825Sdfrkrb5_error_code KRB5_LIB_FUNCTION
7055682Smarkmkrb5_auth_con_free(krb5_context context,
7155682Smarkm		   krb5_auth_context auth_context)
7255682Smarkm{
7372445Sassar    if (auth_context != NULL) {
7472445Sassar	krb5_free_authenticator(context, &auth_context->authenticator);
7572445Sassar	if(auth_context->local_address){
7672445Sassar	    free_HostAddress(auth_context->local_address);
7772445Sassar	    free(auth_context->local_address);
7872445Sassar	}
7972445Sassar	if(auth_context->remote_address){
8072445Sassar	    free_HostAddress(auth_context->remote_address);
8172445Sassar	    free(auth_context->remote_address);
8272445Sassar	}
8372445Sassar	krb5_free_keyblock(context, auth_context->keyblock);
8472445Sassar	krb5_free_keyblock(context, auth_context->remote_subkey);
8572445Sassar	krb5_free_keyblock(context, auth_context->local_subkey);
8672445Sassar	free (auth_context);
8755682Smarkm    }
8855682Smarkm    return 0;
8955682Smarkm}
9055682Smarkm
91178825Sdfrkrb5_error_code KRB5_LIB_FUNCTION
9255682Smarkmkrb5_auth_con_setflags(krb5_context context,
9355682Smarkm		       krb5_auth_context auth_context,
9455682Smarkm		       int32_t flags)
9555682Smarkm{
9655682Smarkm    auth_context->flags = flags;
9755682Smarkm    return 0;
9855682Smarkm}
9955682Smarkm
10055682Smarkm
101178825Sdfrkrb5_error_code KRB5_LIB_FUNCTION
10255682Smarkmkrb5_auth_con_getflags(krb5_context context,
10355682Smarkm		       krb5_auth_context auth_context,
10455682Smarkm		       int32_t *flags)
10555682Smarkm{
10655682Smarkm    *flags = auth_context->flags;
10755682Smarkm    return 0;
10855682Smarkm}
10955682Smarkm
110178825Sdfrkrb5_error_code KRB5_LIB_FUNCTION
111178825Sdfrkrb5_auth_con_addflags(krb5_context context,
112178825Sdfr		       krb5_auth_context auth_context,
113178825Sdfr		       int32_t addflags,
114178825Sdfr		       int32_t *flags)
115178825Sdfr{
116178825Sdfr    if (flags)
117178825Sdfr	*flags = auth_context->flags;
118178825Sdfr    auth_context->flags |= addflags;
119178825Sdfr    return 0;
120178825Sdfr}
12155682Smarkm
122178825Sdfrkrb5_error_code KRB5_LIB_FUNCTION
123178825Sdfrkrb5_auth_con_removeflags(krb5_context context,
124178825Sdfr			  krb5_auth_context auth_context,
125178825Sdfr			  int32_t removeflags,
126178825Sdfr			  int32_t *flags)
127178825Sdfr{
128178825Sdfr    if (flags)
129178825Sdfr	*flags = auth_context->flags;
130178825Sdfr    auth_context->flags &= ~removeflags;
131178825Sdfr    return 0;
132178825Sdfr}
133178825Sdfr
134178825Sdfrkrb5_error_code KRB5_LIB_FUNCTION
13555682Smarkmkrb5_auth_con_setaddrs(krb5_context context,
13655682Smarkm		       krb5_auth_context auth_context,
13755682Smarkm		       krb5_address *local_addr,
13855682Smarkm		       krb5_address *remote_addr)
13955682Smarkm{
14055682Smarkm    if (local_addr) {
14155682Smarkm	if (auth_context->local_address)
14255682Smarkm	    krb5_free_address (context, auth_context->local_address);
14355682Smarkm	else
144178825Sdfr	    if ((auth_context->local_address = malloc(sizeof(krb5_address))) == NULL)
145178825Sdfr		return ENOMEM;
14655682Smarkm	krb5_copy_address(context, local_addr, auth_context->local_address);
14755682Smarkm    }
14855682Smarkm    if (remote_addr) {
14955682Smarkm	if (auth_context->remote_address)
15055682Smarkm	    krb5_free_address (context, auth_context->remote_address);
15155682Smarkm	else
152178825Sdfr	    if ((auth_context->remote_address = malloc(sizeof(krb5_address))) == NULL)
153178825Sdfr		return ENOMEM;
15455682Smarkm	krb5_copy_address(context, remote_addr, auth_context->remote_address);
15555682Smarkm    }
15655682Smarkm    return 0;
15755682Smarkm}
15855682Smarkm
159178825Sdfrkrb5_error_code KRB5_LIB_FUNCTION
16072445Sassarkrb5_auth_con_genaddrs(krb5_context context,
16172445Sassar		       krb5_auth_context auth_context,
16272445Sassar		       int fd, int flags)
16355682Smarkm{
16455682Smarkm    krb5_error_code ret;
16555682Smarkm    krb5_address local_k_address, remote_k_address;
16655682Smarkm    krb5_address *lptr = NULL, *rptr = NULL;
16755682Smarkm    struct sockaddr_storage ss_local, ss_remote;
16855682Smarkm    struct sockaddr *local  = (struct sockaddr *)&ss_local;
16955682Smarkm    struct sockaddr *remote = (struct sockaddr *)&ss_remote;
17072445Sassar    socklen_t len;
17155682Smarkm
17272445Sassar    if(flags & KRB5_AUTH_CONTEXT_GENERATE_LOCAL_ADDR) {
17372445Sassar	if (auth_context->local_address == NULL) {
17472445Sassar	    len = sizeof(ss_local);
17572445Sassar	    if(getsockname(fd, local, &len) < 0) {
17672445Sassar		ret = errno;
17778527Sassar		krb5_set_error_string (context, "getsockname: %s",
17878527Sassar				       strerror(ret));
17972445Sassar		goto out;
18072445Sassar	    }
181102644Snectar	    ret = krb5_sockaddr2address (context, local, &local_k_address);
182102644Snectar	    if(ret) goto out;
18372445Sassar	    if(flags & KRB5_AUTH_CONTEXT_GENERATE_LOCAL_FULL_ADDR) {
18478527Sassar		krb5_sockaddr2port (context, local, &auth_context->local_port);
18572445Sassar	    } else
18672445Sassar		auth_context->local_port = 0;
18772445Sassar	    lptr = &local_k_address;
18855682Smarkm	}
18955682Smarkm    }
19072445Sassar    if(flags & KRB5_AUTH_CONTEXT_GENERATE_REMOTE_ADDR) {
19155682Smarkm	len = sizeof(ss_remote);
19255682Smarkm	if(getpeername(fd, remote, &len) < 0) {
19355682Smarkm	    ret = errno;
19478527Sassar	    krb5_set_error_string (context, "getpeername: %s", strerror(ret));
19555682Smarkm	    goto out;
19655682Smarkm	}
197102644Snectar	ret = krb5_sockaddr2address (context, remote, &remote_k_address);
198102644Snectar	if(ret) goto out;
19972445Sassar	if(flags & KRB5_AUTH_CONTEXT_GENERATE_REMOTE_FULL_ADDR) {
20078527Sassar	    krb5_sockaddr2port (context, remote, &auth_context->remote_port);
20172445Sassar	} else
20272445Sassar	    auth_context->remote_port = 0;
20355682Smarkm	rptr = &remote_k_address;
20455682Smarkm    }
20555682Smarkm    ret = krb5_auth_con_setaddrs (context,
20655682Smarkm				  auth_context,
20755682Smarkm				  lptr,
20855682Smarkm				  rptr);
20972445Sassar  out:
21055682Smarkm    if (lptr)
21155682Smarkm	krb5_free_address (context, lptr);
21255682Smarkm    if (rptr)
21355682Smarkm	krb5_free_address (context, rptr);
21455682Smarkm    return ret;
21572445Sassar
21655682Smarkm}
21755682Smarkm
218178825Sdfrkrb5_error_code KRB5_LIB_FUNCTION
21972445Sassarkrb5_auth_con_setaddrs_from_fd (krb5_context context,
22072445Sassar				krb5_auth_context auth_context,
22172445Sassar				void *p_fd)
22272445Sassar{
22372445Sassar    int fd = *(int*)p_fd;
22472445Sassar    int flags = 0;
22572445Sassar    if(auth_context->local_address == NULL)
22672445Sassar	flags |= KRB5_AUTH_CONTEXT_GENERATE_LOCAL_FULL_ADDR;
22772445Sassar    if(auth_context->remote_address == NULL)
22872445Sassar	flags |= KRB5_AUTH_CONTEXT_GENERATE_REMOTE_FULL_ADDR;
22972445Sassar    return krb5_auth_con_genaddrs(context, auth_context, fd, flags);
23072445Sassar}
23172445Sassar
232178825Sdfrkrb5_error_code KRB5_LIB_FUNCTION
23355682Smarkmkrb5_auth_con_getaddrs(krb5_context context,
23455682Smarkm		       krb5_auth_context auth_context,
23555682Smarkm		       krb5_address **local_addr,
23655682Smarkm		       krb5_address **remote_addr)
23755682Smarkm{
23855682Smarkm    if(*local_addr)
23955682Smarkm	krb5_free_address (context, *local_addr);
24055682Smarkm    *local_addr = malloc (sizeof(**local_addr));
24178527Sassar    if (*local_addr == NULL) {
24278527Sassar	krb5_set_error_string(context, "malloc: out of memory");
24355682Smarkm	return ENOMEM;
24478527Sassar    }
24555682Smarkm    krb5_copy_address(context,
24655682Smarkm		      auth_context->local_address,
24755682Smarkm		      *local_addr);
24855682Smarkm
24955682Smarkm    if(*remote_addr)
25055682Smarkm	krb5_free_address (context, *remote_addr);
25155682Smarkm    *remote_addr = malloc (sizeof(**remote_addr));
25278527Sassar    if (*remote_addr == NULL) {
25378527Sassar	krb5_set_error_string(context, "malloc: out of memory");
25478527Sassar	krb5_free_address (context, *local_addr);
25578527Sassar	*local_addr = NULL;
25655682Smarkm	return ENOMEM;
25778527Sassar    }
25855682Smarkm    krb5_copy_address(context,
25955682Smarkm		      auth_context->remote_address,
26055682Smarkm		      *remote_addr);
26155682Smarkm    return 0;
26255682Smarkm}
26355682Smarkm
26455682Smarkmstatic krb5_error_code
26555682Smarkmcopy_key(krb5_context context,
26655682Smarkm	 krb5_keyblock *in,
26755682Smarkm	 krb5_keyblock **out)
26855682Smarkm{
26955682Smarkm    if(in)
27055682Smarkm	return krb5_copy_keyblock(context, in, out);
27155682Smarkm    *out = NULL; /* is this right? */
27255682Smarkm    return 0;
27355682Smarkm}
27455682Smarkm
275178825Sdfrkrb5_error_code KRB5_LIB_FUNCTION
27655682Smarkmkrb5_auth_con_getkey(krb5_context context,
27755682Smarkm		     krb5_auth_context auth_context,
27855682Smarkm		     krb5_keyblock **keyblock)
27955682Smarkm{
28055682Smarkm    return copy_key(context, auth_context->keyblock, keyblock);
28155682Smarkm}
28255682Smarkm
283178825Sdfrkrb5_error_code KRB5_LIB_FUNCTION
28455682Smarkmkrb5_auth_con_getlocalsubkey(krb5_context context,
28555682Smarkm			     krb5_auth_context auth_context,
28655682Smarkm			     krb5_keyblock **keyblock)
28755682Smarkm{
28855682Smarkm    return copy_key(context, auth_context->local_subkey, keyblock);
28955682Smarkm}
29055682Smarkm
291178825Sdfrkrb5_error_code KRB5_LIB_FUNCTION
29255682Smarkmkrb5_auth_con_getremotesubkey(krb5_context context,
29355682Smarkm			      krb5_auth_context auth_context,
29455682Smarkm			      krb5_keyblock **keyblock)
29555682Smarkm{
29655682Smarkm    return copy_key(context, auth_context->remote_subkey, keyblock);
29755682Smarkm}
29855682Smarkm
299178825Sdfrkrb5_error_code KRB5_LIB_FUNCTION
30055682Smarkmkrb5_auth_con_setkey(krb5_context context,
30155682Smarkm		     krb5_auth_context auth_context,
30255682Smarkm		     krb5_keyblock *keyblock)
30355682Smarkm{
30455682Smarkm    if(auth_context->keyblock)
30555682Smarkm	krb5_free_keyblock(context, auth_context->keyblock);
30655682Smarkm    return copy_key(context, keyblock, &auth_context->keyblock);
30755682Smarkm}
30855682Smarkm
309178825Sdfrkrb5_error_code KRB5_LIB_FUNCTION
31055682Smarkmkrb5_auth_con_setlocalsubkey(krb5_context context,
31155682Smarkm			     krb5_auth_context auth_context,
31255682Smarkm			     krb5_keyblock *keyblock)
31355682Smarkm{
31455682Smarkm    if(auth_context->local_subkey)
31555682Smarkm	krb5_free_keyblock(context, auth_context->local_subkey);
31655682Smarkm    return copy_key(context, keyblock, &auth_context->local_subkey);
31755682Smarkm}
31855682Smarkm
319178825Sdfrkrb5_error_code KRB5_LIB_FUNCTION
320103423Snectarkrb5_auth_con_generatelocalsubkey(krb5_context context,
321103423Snectar				  krb5_auth_context auth_context,
322103423Snectar				  krb5_keyblock *key)
323103423Snectar{
324103423Snectar    krb5_error_code ret;
325103423Snectar    krb5_keyblock *subkey;
326103423Snectar
327178825Sdfr    ret = krb5_generate_subkey_extended (context, key,
328178825Sdfr					 auth_context->keytype,
329178825Sdfr					 &subkey);
330103423Snectar    if(ret)
331103423Snectar	return ret;
332103423Snectar    if(auth_context->local_subkey)
333103423Snectar	krb5_free_keyblock(context, auth_context->local_subkey);
334103423Snectar    auth_context->local_subkey = subkey;
335103423Snectar    return 0;
336103423Snectar}
337103423Snectar
338103423Snectar
339178825Sdfrkrb5_error_code KRB5_LIB_FUNCTION
34055682Smarkmkrb5_auth_con_setremotesubkey(krb5_context context,
34155682Smarkm			      krb5_auth_context auth_context,
34255682Smarkm			      krb5_keyblock *keyblock)
34355682Smarkm{
34455682Smarkm    if(auth_context->remote_subkey)
34555682Smarkm	krb5_free_keyblock(context, auth_context->remote_subkey);
34655682Smarkm    return copy_key(context, keyblock, &auth_context->remote_subkey);
34755682Smarkm}
34855682Smarkm
349178825Sdfrkrb5_error_code KRB5_LIB_FUNCTION
35090926Snectarkrb5_auth_con_setcksumtype(krb5_context context,
35190926Snectar			   krb5_auth_context auth_context,
35290926Snectar			   krb5_cksumtype cksumtype)
35355682Smarkm{
35455682Smarkm    auth_context->cksumtype = cksumtype;
35555682Smarkm    return 0;
35655682Smarkm}
35755682Smarkm
358178825Sdfrkrb5_error_code KRB5_LIB_FUNCTION
35990926Snectarkrb5_auth_con_getcksumtype(krb5_context context,
36090926Snectar			   krb5_auth_context auth_context,
36190926Snectar			   krb5_cksumtype *cksumtype)
36255682Smarkm{
36355682Smarkm    *cksumtype = auth_context->cksumtype;
36455682Smarkm    return 0;
36555682Smarkm}
36655682Smarkm
367178825Sdfrkrb5_error_code KRB5_LIB_FUNCTION
36890926Snectarkrb5_auth_con_setkeytype (krb5_context context,
36990926Snectar			  krb5_auth_context auth_context,
37090926Snectar			  krb5_keytype keytype)
37155682Smarkm{
37255682Smarkm    auth_context->keytype = keytype;
37355682Smarkm    return 0;
37455682Smarkm}
37555682Smarkm
376178825Sdfrkrb5_error_code KRB5_LIB_FUNCTION
37790926Snectarkrb5_auth_con_getkeytype (krb5_context context,
37890926Snectar			  krb5_auth_context auth_context,
37990926Snectar			  krb5_keytype *keytype)
38055682Smarkm{
38155682Smarkm    *keytype = auth_context->keytype;
38255682Smarkm    return 0;
38355682Smarkm}
38455682Smarkm
38555682Smarkm#if 0
386178825Sdfrkrb5_error_code KRB5_LIB_FUNCTION
38790926Snectarkrb5_auth_con_setenctype(krb5_context context,
38890926Snectar			 krb5_auth_context auth_context,
38990926Snectar			 krb5_enctype etype)
39055682Smarkm{
39155682Smarkm    if(auth_context->keyblock)
39255682Smarkm	krb5_free_keyblock(context, auth_context->keyblock);
39355682Smarkm    ALLOC(auth_context->keyblock, 1);
39455682Smarkm    if(auth_context->keyblock == NULL)
39555682Smarkm	return ENOMEM;
39655682Smarkm    auth_context->keyblock->keytype = etype;
39755682Smarkm    return 0;
39855682Smarkm}
39955682Smarkm
400178825Sdfrkrb5_error_code KRB5_LIB_FUNCTION
40190926Snectarkrb5_auth_con_getenctype(krb5_context context,
40290926Snectar			 krb5_auth_context auth_context,
40390926Snectar			 krb5_enctype *etype)
40455682Smarkm{
40555682Smarkm    krb5_abortx(context, "unimplemented krb5_auth_getenctype called");
40655682Smarkm}
40755682Smarkm#endif
40855682Smarkm
409178825Sdfrkrb5_error_code KRB5_LIB_FUNCTION
41090926Snectarkrb5_auth_con_getlocalseqnumber(krb5_context context,
41155682Smarkm			    krb5_auth_context auth_context,
41255682Smarkm			    int32_t *seqnumber)
41355682Smarkm{
41455682Smarkm  *seqnumber = auth_context->local_seqnumber;
41555682Smarkm  return 0;
41655682Smarkm}
41755682Smarkm
418178825Sdfrkrb5_error_code KRB5_LIB_FUNCTION
41990926Snectarkrb5_auth_con_setlocalseqnumber (krb5_context context,
42055682Smarkm			     krb5_auth_context auth_context,
42155682Smarkm			     int32_t seqnumber)
42255682Smarkm{
42355682Smarkm  auth_context->local_seqnumber = seqnumber;
42455682Smarkm  return 0;
42555682Smarkm}
42655682Smarkm
427178825Sdfrkrb5_error_code KRB5_LIB_FUNCTION
42855682Smarkmkrb5_auth_getremoteseqnumber(krb5_context context,
42955682Smarkm			     krb5_auth_context auth_context,
43055682Smarkm			     int32_t *seqnumber)
43155682Smarkm{
43255682Smarkm  *seqnumber = auth_context->remote_seqnumber;
43355682Smarkm  return 0;
43455682Smarkm}
43555682Smarkm
436178825Sdfrkrb5_error_code KRB5_LIB_FUNCTION
43790926Snectarkrb5_auth_con_setremoteseqnumber (krb5_context context,
43855682Smarkm			      krb5_auth_context auth_context,
43955682Smarkm			      int32_t seqnumber)
44055682Smarkm{
44155682Smarkm  auth_context->remote_seqnumber = seqnumber;
44255682Smarkm  return 0;
44355682Smarkm}
44455682Smarkm
44555682Smarkm
446178825Sdfrkrb5_error_code KRB5_LIB_FUNCTION
44790926Snectarkrb5_auth_con_getauthenticator(krb5_context context,
44855682Smarkm			   krb5_auth_context auth_context,
44955682Smarkm			   krb5_authenticator *authenticator)
45055682Smarkm{
45155682Smarkm    *authenticator = malloc(sizeof(**authenticator));
45278527Sassar    if (*authenticator == NULL) {
45378527Sassar	krb5_set_error_string(context, "malloc: out of memory");
45455682Smarkm	return ENOMEM;
45578527Sassar    }
45655682Smarkm
45755682Smarkm    copy_Authenticator(auth_context->authenticator,
45855682Smarkm		       *authenticator);
45955682Smarkm    return 0;
46055682Smarkm}
46155682Smarkm
46255682Smarkm
463178825Sdfrvoid KRB5_LIB_FUNCTION
46455682Smarkmkrb5_free_authenticator(krb5_context context,
46555682Smarkm			krb5_authenticator *authenticator)
46655682Smarkm{
46755682Smarkm    free_Authenticator (*authenticator);
46855682Smarkm    free (*authenticator);
46955682Smarkm    *authenticator = NULL;
47055682Smarkm}
47155682Smarkm
47255682Smarkm
473178825Sdfrkrb5_error_code KRB5_LIB_FUNCTION
47455682Smarkmkrb5_auth_con_setuserkey(krb5_context context,
47555682Smarkm			 krb5_auth_context auth_context,
47655682Smarkm			 krb5_keyblock *keyblock)
47755682Smarkm{
47855682Smarkm    if(auth_context->keyblock)
47955682Smarkm	krb5_free_keyblock(context, auth_context->keyblock);
48055682Smarkm    return krb5_copy_keyblock(context, keyblock, &auth_context->keyblock);
48155682Smarkm}
48255682Smarkm
483178825Sdfrkrb5_error_code KRB5_LIB_FUNCTION
48472445Sassarkrb5_auth_con_getrcache(krb5_context context,
48572445Sassar			krb5_auth_context auth_context,
48672445Sassar			krb5_rcache *rcache)
48772445Sassar{
48872445Sassar    *rcache = auth_context->rcache;
48972445Sassar    return 0;
49072445Sassar}
49172445Sassar
492178825Sdfrkrb5_error_code KRB5_LIB_FUNCTION
49372445Sassarkrb5_auth_con_setrcache(krb5_context context,
49472445Sassar			krb5_auth_context auth_context,
49572445Sassar			krb5_rcache rcache)
49672445Sassar{
49772445Sassar    auth_context->rcache = rcache;
49872445Sassar    return 0;
49972445Sassar}
50072445Sassar
50155682Smarkm#if 0 /* not implemented */
50255682Smarkm
503178825Sdfrkrb5_error_code KRB5_LIB_FUNCTION
50455682Smarkmkrb5_auth_con_initivector(krb5_context context,
50555682Smarkm			  krb5_auth_context auth_context)
50655682Smarkm{
50755682Smarkm    krb5_abortx(context, "unimplemented krb5_auth_con_initivector called");
50855682Smarkm}
50955682Smarkm
51055682Smarkm
511178825Sdfrkrb5_error_code KRB5_LIB_FUNCTION
51255682Smarkmkrb5_auth_con_setivector(krb5_context context,
51355682Smarkm			 krb5_auth_context auth_context,
51455682Smarkm			 krb5_pointer ivector)
51555682Smarkm{
51655682Smarkm    krb5_abortx(context, "unimplemented krb5_auth_con_setivector called");
51755682Smarkm}
51855682Smarkm
51955682Smarkm#endif /* not implemented */
520