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