d0e4da9e04e942ba70a4975f16a83982d2a78e83
[openafs.git] / src / rxgk / test_client.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 <sys/socket.h>
10 #include <netinet/in.h>
11 #include <arpa/inet.h>
12
13 #include <err.h>
14 #include <errno.h>
15 #include <netdb.h>
16
17 #include "rxgk_locl.h"
18 #include "rxgk_proto.cs.h"
19 #include "test.cs.h"
20
21 RCSID("$Id$");
22
23 /*
24  *
25  */
26
27 static u_long
28 str2addr (const char *s)
29 {
30     struct in_addr server;
31     struct hostent *h;
32
33 #ifndef INADDR_NONE
34 #define INADDR_NONE 0xffffffff
35 #endif
36     if (inet_addr(s) != INADDR_NONE)
37         return inet_addr(s);
38     h = gethostbyname (s);
39     if (h != NULL) {
40         memcpy (&server, h->h_addr_list[0], sizeof(server));
41         return server.s_addr;
42     }
43     return 0;
44 }
45
46
47 static int
48 get_krb5_token(krb5_context ctx, krb5_keyblock **key, RXGK_Token *token)
49 {
50     krb5_error_code ret;
51     krb5_creds in_creds, *out_creds;
52     krb5_ccache id;
53     char *realm = "L.NXS.SE";
54     int realm_len = strlen(realm);
55
56     memset(token, 0, sizeof(*token));
57
58     ret = krb5_cc_default (ctx, &id);
59     if (ret)
60         return ret;
61
62     memset(&in_creds, 0, sizeof(in_creds));
63     ret = krb5_build_principal(ctx, &in_creds.server,
64                                realm_len, realm, "afs", NULL);
65     if(ret)
66         return ret;
67     ret = krb5_build_principal(ctx, &in_creds.client,
68                                realm_len, realm, "lha", NULL);
69     if(ret){
70         krb5_free_principal(ctx, in_creds.server);
71         return ret;
72     }
73     in_creds.session.keytype = KEYTYPE_DES; /* XXX */
74     ret = krb5_get_credentials(ctx, 0, id, &in_creds, &out_creds);
75     krb5_free_principal(ctx, in_creds.server);
76     krb5_free_principal(ctx, in_creds.client);
77     if(ret) 
78         return ret;
79
80     token->val = malloc(out_creds->ticket.length);
81     if (token->val == NULL) {
82         krb5_free_creds(ctx, out_creds);
83         return ENOMEM;
84     }
85     token->len = out_creds->ticket.length;
86     memcpy(token->val, out_creds->ticket.data, out_creds->ticket.length);
87
88     ret = krb5_copy_keyblock(ctx, &out_creds->session, key);
89
90     krb5_free_creds(ctx, out_creds);
91
92     return ret;
93 }
94
95 /*
96  *
97  */
98
99 static void
100 test_est_context(krb5_context context, uint32_t addr, int port, 
101                  RXGK_Token *ticket, krb5_keyblock *key)
102 {
103     RXGK_Token auth_token;
104     krb5_keyblock skey;
105     int32_t kvno;
106     int ret;
107
108     /* kernel */
109
110     ret = rxgk5_get_auth_token(context, addr, port, 
111                                TEST_RXGK_SERVICE,
112                                ticket, &auth_token, key, &skey, &kvno);
113     if (ret)
114         errx(1, "rxgk5_get_auth_token: %d", ret);
115         
116     printf("EstablishKrb5Context succeeded "
117            "len: %d, version: %d, enctype: %d\n",
118            auth_token.len, kvno, skey.keytype);
119 }
120
121 static void
122 test_rxgk_conn(krb5_context context, uint32_t addr, int port, 
123                RXGK_Token *ticket, krb5_keyblock *key)
124 {
125     struct rx_securityClass *secobj;
126     struct rx_connection *conn;
127     int ret;
128     char bar[100];
129     int32_t a111;
130
131     secobj = rxgk_k5_NewClientSecurityObject(rxgk_crypt,
132                                              key,
133                                              0,
134                                              ticket->len,
135                                              ticket->val,
136                                              TEST_RXGK_SERVICE,
137                                              context);
138
139     conn = rx_NewConnection(addr, port, TEST_SERVICE_ID, secobj, 4);
140     if (conn == NULL)
141         errx(1, "NewConnection");
142
143     ret = TEST_get_hundraelva(conn, &a111, bar);
144
145     rx_DestroyConnection(conn);
146
147     if (ret)
148         errx(1, "TEST_get_hundraelva: %d", ret);
149
150     printf("get_hundraelva return %d (should be 111) (bar = \"%s\")\n",
151            (int)a111, bar);
152 }
153
154
155 /*
156  *
157  */
158
159 int
160 main(int argc, char **argv)
161 {
162     RXGK_Token ticket;
163     krb5_context context;
164     krb5_keyblock *key;
165     int port, ret;
166     uint32_t addr;
167     char *saddr;
168     PROCESS pid;
169
170     setprogname(argv[0]);
171
172     port = htons(TEST_DEFAULT_PORT);
173     saddr = "127.0.0.1";
174
175     krb5_init_context(&context);
176
177     LWP_InitializeProcessSupport (LWP_NORMAL_PRIORITY, &pid);
178     
179     ret = rx_Init (0);
180     if (ret)
181         errx (1, "rx_Init failed");
182
183     addr = str2addr(saddr);
184
185     ret = get_krb5_token(context, &key, &ticket);
186     if (ret)
187         errx(1, "get_krb5_token: %d", ret);
188
189     if (0) {
190         test_est_context(context, addr, port, &ticket, key);
191     } else {
192         test_rxgk_conn(context, addr, port, &ticket, key);
193     }
194
195     rx_Finalize();
196
197     krb5_free_keyblock(context, key);
198     krb5_free_context(context);
199
200     return 0;
201 }
202