Reinitialize _create_xid state after fork.
[platform/upstream/glibc.git] / sunrpc / des_crypt.c
1 /*
2  * des_crypt.c, DES encryption library routines
3  * Copyright (C) 1986, Sun Microsystems, Inc.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions are
7  * met:
8  *
9  *     * Redistributions of source code must retain the above copyright
10  *       notice, this list of conditions and the following disclaimer.
11  *     * Redistributions in binary form must reproduce the above
12  *       copyright notice, this list of conditions and the following
13  *       disclaimer in the documentation and/or other materials
14  *       provided with the distribution.
15  *     * Neither the name of Sun Microsystems, Inc. nor the names of its
16  *       contributors may be used to endorse or promote products derived
17  *       from this software without specific prior written permission.
18  *
19  *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20  *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21  *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
22  *   FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
23  *   COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
24  *   INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25  *   DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
26  *   GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27  *   INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
28  *   WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
29  *   NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30  *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31  */
32
33 #include <sys/types.h>
34 #include <rpc/des_crypt.h>
35 #include "des.h"
36
37 extern int _des_crypt (char *, unsigned, struct desparams *);
38
39 /*
40  * Copy 8 bytes
41  */
42 #define COPY8(src, dst) { \
43         register char *a = (char *) dst; \
44         register char *b = (char *) src; \
45         *a++ = *b++; *a++ = *b++; *a++ = *b++; *a++ = *b++; \
46         *a++ = *b++; *a++ = *b++; *a++ = *b++; *a++ = *b++; \
47 }
48
49 /*
50  * Copy multiple of 8 bytes
51  */
52 #define DESCOPY(src, dst, len) { \
53         register char *a = (char *) dst; \
54         register char *b = (char *) src; \
55         register int i; \
56         for (i = (int) len; i > 0; i -= 8) { \
57                 *a++ = *b++; *a++ = *b++; *a++ = *b++; *a++ = *b++; \
58                 *a++ = *b++; *a++ = *b++; *a++ = *b++; *a++ = *b++; \
59         } \
60 }
61
62 /*
63  * Common code to cbc_crypt() & ecb_crypt()
64  */
65 static int
66 common_crypt (char *key, char *buf, register unsigned len,
67               unsigned mode, register struct desparams *desp)
68 {
69   register int desdev;
70
71   if ((len % 8) != 0 || len > DES_MAXDATA)
72     return DESERR_BADPARAM;
73
74   desp->des_dir =
75     ((mode & DES_DIRMASK) == DES_ENCRYPT) ? ENCRYPT : DECRYPT;
76
77   desdev = mode & DES_DEVMASK;
78   COPY8 (key, desp->des_key);
79   /*
80    * software
81    */
82   if (!_des_crypt (buf, len, desp))
83     return DESERR_HWERROR;
84
85   return desdev == DES_SW ? DESERR_NONE : DESERR_NOHWDEVICE;
86 }
87
88 /*
89  * CBC mode encryption
90  */
91 int
92 cbc_crypt (char *key, char *buf, unsigned int len, unsigned int mode,
93            char *ivec)
94 {
95   int err;
96   struct desparams dp;
97
98   dp.des_mode = CBC;
99   COPY8 (ivec, dp.des_ivec);
100   err = common_crypt (key, buf, len, mode, &dp);
101   COPY8 (dp.des_ivec, ivec);
102   return err;
103 }
104 libc_hidden_def (cbc_crypt)
105
106 /*
107  * ECB mode encryption
108  */
109 int
110 ecb_crypt (char *key, char *buf, unsigned int len, unsigned int mode)
111 {
112   struct desparams dp;
113
114   dp.des_mode = ECB;
115   return common_crypt (key, buf, len, mode, &dp);
116 }
117 libc_hidden_def (ecb_crypt)