no-copy-libafs-builds-20021015
[openafs.git] / src / rxkad / domestic / crypt_conn.c
1 /*
2  * Copyright 2000, International Business Machines Corporation and others.
3  * All Rights Reserved.
4  * 
5  * This software has been released under the terms of the IBM Public
6  * License.  For details, see the LICENSE file in the top-level source
7  * directory or online at http://www.openafs.org/dl/license10.html
8  */
9
10 /* The rxkad security object.  This contains packet processing routines that
11  * are prohibited from being exported. */
12
13
14 #include <afsconfig.h>
15 #ifdef KERNEL
16 #include "afs/param.h"
17 #else
18 #include <afs/param.h>
19 #endif
20
21 RCSID("$Header$");
22
23 #ifdef KERNEL
24 #include "afs/stds.h"
25 #ifndef UKERNEL
26 #include "h/types.h"
27 #include "rx/rx.h"
28 #include "netinet/in.h"
29 #else /* !UKERNEL */
30 #include "afs/sysincludes.h"
31 #include "rx/rx.h"
32 #endif /* !UKERNEL */
33 #else /* !KERNEL */
34 #include <afs/stds.h>
35 #include <sys/types.h>
36 #include <rx/rx.h>
37 #ifdef AFS_NT40_ENV
38 #include <winsock2.h>
39 #else
40 #include <netinet/in.h>
41 #endif
42 #endif /* KERNEL */
43
44 #include "private_data.h"
45 #define XPRT_RXKAD_CRYPT
46
47 afs_int32 rxkad_DecryptPacket (const struct rx_connection *conn, 
48         const fc_KeySchedule *schedule, const fc_InitializationVector *ivec, 
49         const int inlen, struct rx_packet *packet)
50 {
51     afs_uint32 xor[2];
52     struct rx_securityClass *obj;
53     struct rxkad_cprivate *tp;          /* s & c have type at same offset */
54     char * data;
55     int i,tlen,len;
56
57     len = inlen;
58
59     obj = rx_SecurityObjectOf(conn);
60     tp = (struct rxkad_cprivate *)obj->privateData;
61     LOCK_RXKAD_STATS
62     rxkad_stats.bytesDecrypted[rxkad_TypeIndex(tp->type)] += len;
63     UNLOCK_RXKAD_STATS
64
65     memcpy((void *)xor, (void *)ivec, sizeof(xor));
66     for (i = 0; len ; i++) {
67       data = rx_data(packet, i, tlen);
68       if (!data || !tlen)
69         break;
70       tlen = MIN(len, tlen);
71       fc_cbc_encrypt (data, data, tlen, schedule, xor, DECRYPT);
72       len -= tlen;
73     }
74     /* Do this if packet checksums are ever enabled (below), but
75      * current version just passes zero
76     afs_int32 cksum;
77     cksum = ntohl(rx_GetInt32(packet, 1));
78     */
79     return 0;
80 }
81
82 afs_int32 rxkad_EncryptPacket (const struct rx_connection *conn, 
83         const fc_KeySchedule *schedule, const fc_InitializationVector *ivec, 
84         const int inlen, struct rx_packet *packet)
85 {
86     afs_uint32 xor[2];
87     struct rx_securityClass *obj;
88     struct rxkad_cprivate *tp;          /* s & c have type at same offset */
89     char *data;
90     int i,tlen,len;
91
92     len = inlen;
93
94     obj = rx_SecurityObjectOf(conn);
95     tp = (struct rxkad_cprivate *)obj->privateData;
96     LOCK_RXKAD_STATS
97     rxkad_stats.bytesEncrypted[rxkad_TypeIndex(tp->type)] += len;
98     UNLOCK_RXKAD_STATS
99
100     /*
101     afs_int32 cksum;
102     cksum = htonl(0);           
103     * Future option to add cksum here, but for now we just put 0
104     */
105     rx_PutInt32(packet, 1*sizeof(afs_int32), 0); 
106
107     memcpy((void *)xor, (void *)ivec, sizeof(xor));
108     for (i = 0; len ; i++) {
109       data = rx_data(packet, i, tlen);
110       if (!data || !tlen)
111         break;
112       tlen = MIN(len, tlen);
113       fc_cbc_encrypt (data, data, tlen, schedule, xor, ENCRYPT);
114       len -= tlen;
115     }
116     return 0;
117 }
118