afsconfig-and-rcsid-all-around-20010705
[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 #ifdef KERNEL
15 #include "../afs/param.h"
16 #else
17 #include <afs/param.h>
18 #endif
19 #include <afsconfig.h>
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 (conn, schedule, ivec, len, packet)
48   IN struct rx_connection *conn;
49   IN fc_KeySchedule *schedule;
50   IN fc_InitializationVector *ivec;
51   IN int len;
52   INOUT struct rx_packet *packet;
53 {
54     afs_uint32 xor[2];
55     struct rx_securityClass *obj;
56     struct rxkad_cprivate *tp;          /* s & c have type at same offset */
57     char * data;
58     int i,tlen;
59
60     obj = rx_SecurityObjectOf(conn);
61     tp = (struct rxkad_cprivate *)obj->privateData;
62     LOCK_RXKAD_STATS
63     rxkad_stats.bytesDecrypted[rxkad_TypeIndex(tp->type)] += len;
64     UNLOCK_RXKAD_STATS
65
66     bcopy ((void *)ivec, (void *)xor, sizeof(xor));
67     for (i = 0; len ; i++) {
68       data = rx_data(packet, i, tlen);
69       if (!data || !tlen)
70         break;
71       tlen = MIN(len, tlen);
72       fc_cbc_encrypt (data, data, tlen, schedule, xor, DECRYPT);
73       len -= tlen;
74     }
75     /* Do this if packet checksums are ever enabled (below), but
76      * current version just passes zero
77     afs_int32 cksum;
78     cksum = ntohl(rx_GetInt32(packet, 1));
79     */
80     return 0;
81 }
82
83 afs_int32 rxkad_EncryptPacket (conn, schedule, ivec, len, packet)
84   IN struct rx_connection *conn;
85   IN fc_KeySchedule *schedule;
86   IN fc_InitializationVector *ivec;
87   IN int len;
88   INOUT struct rx_packet *packet;
89 {
90     afs_uint32 xor[2];
91     struct rx_securityClass *obj;
92     struct rxkad_cprivate *tp;          /* s & c have type at same offset */
93     char *data;
94     int i,tlen;
95
96     obj = rx_SecurityObjectOf(conn);
97     tp = (struct rxkad_cprivate *)obj->privateData;
98     LOCK_RXKAD_STATS
99     rxkad_stats.bytesEncrypted[rxkad_TypeIndex(tp->type)] += len;
100     UNLOCK_RXKAD_STATS
101
102     /*
103     afs_int32 cksum;
104     cksum = htonl(0);           
105     * Future option to add cksum here, but for now we just put 0
106     */
107     rx_PutInt32(packet, 1*sizeof(afs_int32), 0); 
108
109     bcopy ((void *)ivec, (void *)xor, sizeof(xor));
110     for (i = 0; len ; i++) {
111       data = rx_data(packet, i, tlen);
112       if (!data || !tlen)
113         break;
114       tlen = MIN(len, tlen);
115       fc_cbc_encrypt (data, data, tlen, schedule, xor, ENCRYPT);
116       len -= tlen;
117     }
118     return 0;
119 }
120