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