09a6608103f1ed397f9a335d887c947dee144248
[openafs.git] / src / rxgk / rxgk_crpc.c
1 /*
2  * Copyright (c) 2002 - 2004, Stockholms universitet
3  * (Stockholm University, Stockholm Sweden)
4  * All rights reserved.
5  * 
6  * Redistribution is not permitted
7  */
8
9 #include "rxgk_locl.h"
10
11 RCSID("$Id$");
12
13 #include <rx/rx.h>
14 #include "rxgk_proto.h"
15 #include "rxgk_proto.cs.h"
16
17 #include <errno.h>
18
19 int
20 rxgk5_get_auth_token(krb5_context context, uint32_t addr, int port, 
21                      uint32_t serviceId,
22                      RXGK_Token *token,
23                      RXGK_Token *auth_token, krb5_keyblock *key,
24                      krb5_keyblock *skey,
25                      int32_t *kvno)
26 {
27     struct rx_securityClass *secobj;
28     struct rx_connection *conn;
29     RXGK_Token challange, reply_token;
30     uint32_t num;
31     int ret;
32
33     memset(skey, 0, sizeof(*skey));
34
35     secobj = rxnull_NewClientSecurityObject();
36
37     conn = rx_NewConnection(addr, port, serviceId, secobj, 0);
38     if (conn == NULL)
39         return ENETDOWN;
40
41     num = arc4random();
42
43     ret = rxk5_mutual_auth_client_generate(context, key, num, &challange);
44     if (ret) {
45         rx_DestroyConnection(conn);
46         return ret;
47     }
48
49     ret = RXGK_EstablishKrb5Context(conn, token, &challange,
50                                     &reply_token, kvno, auth_token);
51     if (ret) {
52         rx_DestroyConnection(conn);
53         return ret;
54     }
55
56     ret = rxk5_mutual_auth_client_check(context, key, num, &reply_token, skey);
57
58     rx_DestroyConnection(conn);
59
60     return ret;
61 }