systm-h-header-inclusion-20060227
[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
22     ("$Header$");
23
24 #ifdef KERNEL
25 #include "afs/stds.h"
26 #ifndef UKERNEL
27 #include "h/types.h"
28 #if defined(AFS_AIX_ENV) || defined(AFS_AUX_ENV) || defined(AFS_SUN5_ENV)
29 #include "h/systm.h"
30 #endif
31 #include "rx/rx.h"
32 #include "netinet/in.h"
33 #else /* !UKERNEL */
34 #include "afs/sysincludes.h"
35 #include "rx/rx.h"
36 #endif /* !UKERNEL */
37 #else /* !KERNEL */
38 #include <afs/stds.h>
39 #include <sys/types.h>
40 #include <rx/rx.h>
41 #ifdef AFS_NT40_ENV
42 #include <winsock2.h>
43 #else
44 #include <netinet/in.h>
45 #endif
46 #endif /* KERNEL */
47
48 #include <des/stats.h>
49 #include "private_data.h"
50 #define XPRT_RXKAD_CRYPT
51
52 afs_int32
53 rxkad_DecryptPacket(const struct rx_connection *conn,
54                     const fc_KeySchedule * schedule,
55                     const fc_InitializationVector * ivec, const int inlen,
56                     struct rx_packet *packet)
57 {
58     afs_uint32 xor[2];
59     struct rx_securityClass *obj;
60     struct rxkad_cprivate *tp;  /* s & c have type at same offset */
61     char *data;
62     int i, tlen, len;
63
64     len = inlen;
65
66     obj = rx_SecurityObjectOf(conn);
67     tp = (struct rxkad_cprivate *)obj->privateData;
68     ADD_RXKAD_STATS(bytesDecrypted[rxkad_TypeIndex(tp->type)],len);
69     memcpy((void *)xor, (void *)ivec, sizeof(xor));
70     for (i = 0; len; i++) {
71         data = rx_data(packet, i, tlen);
72         if (!data || !tlen)
73             break;
74         tlen = MIN(len, tlen);
75         fc_cbc_encrypt(data, data, tlen, schedule, xor, DECRYPT);
76         len -= tlen;
77     }
78     /* Do this if packet checksums are ever enabled (below), but
79      * current version just passes zero
80      afs_int32 cksum;
81      cksum = ntohl(rx_GetInt32(packet, 1));
82      */
83     return 0;
84 }
85
86 afs_int32
87 rxkad_EncryptPacket(const struct rx_connection * conn,
88                     const fc_KeySchedule * schedule,
89                     const fc_InitializationVector * ivec, const int inlen,
90                     struct rx_packet * packet)
91 {
92     afs_uint32 xor[2];
93     struct rx_securityClass *obj;
94     struct rxkad_cprivate *tp;  /* s & c have type at same offset */
95     char *data;
96     int i, tlen, len;
97
98     len = inlen;
99
100     obj = rx_SecurityObjectOf(conn);
101     tp = (struct rxkad_cprivate *)obj->privateData;
102     ADD_RXKAD_STATS(bytesEncrypted[rxkad_TypeIndex(tp->type)],len);
103     /*
104      * afs_int32 cksum;
105      * cksum = htonl(0);                
106      * * Future option to add cksum here, but for now we just put 0
107      */
108     rx_PutInt32(packet, 1 * sizeof(afs_int32), 0);
109
110     memcpy((void *)xor, (void *)ivec, sizeof(xor));
111     for (i = 0; len; i++) {
112         data = rx_data(packet, i, tlen);
113         if (!data || !tlen)
114             break;
115         tlen = MIN(len, tlen);
116         fc_cbc_encrypt(data, data, tlen, schedule, xor, ENCRYPT);
117         len -= tlen;
118     }
119     return 0;
120 }