2 * UFC-crypt: ultra fast crypt(3) implementation
4 * Copyright (C) 1991, 1992, 1993, 1996 Free Software Foundation, Inc.
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; see the file COPYING.LIB. If not,
18 * write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19 * Boston, MA 02111-1307, USA.
21 * @(#)crypt.c 2.25 12/20/96
23 * Semiportable C version
27 #include "ufc-crypt.h"
29 #include "crypt-private.h"
37 #define SBA(sb, v) (*(long32*)((char*)(sb)+(v)))
40 _ufc_doit_r(itr
, __data
, res
)
42 struct crypt_data
* __restrict __data
;
46 long32
*sb01
= (long32
*)__data
->sb0
;
47 long32
*sb23
= (long32
*)__data
->sb2
;
48 long32 l1
, l2
, r1
, r2
;
50 l1
= (long32
)res
[0]; l2
= (long32
)res
[1];
51 r1
= (long32
)res
[2]; r2
= (long32
)res
[3];
54 k
= (long32
*)__data
->keysched
;
57 l1
^= SBA(sb01
, s
& 0xffff); l2
^= SBA(sb01
, (s
& 0xffff)+4);
58 l1
^= SBA(sb01
, s
>>= 16 ); l2
^= SBA(sb01
, (s
)+4);
60 l1
^= SBA(sb23
, s
& 0xffff); l2
^= SBA(sb23
, (s
& 0xffff)+4);
61 l1
^= SBA(sb23
, s
>>= 16 ); l2
^= SBA(sb23
, (s
)+4);
64 r1
^= SBA(sb01
, s
& 0xffff); r2
^= SBA(sb01
, (s
& 0xffff)+4);
65 r1
^= SBA(sb01
, s
>>= 16 ); r2
^= SBA(sb01
, (s
)+4);
67 r1
^= SBA(sb23
, s
& 0xffff); r2
^= SBA(sb23
, (s
& 0xffff)+4);
68 r1
^= SBA(sb23
, s
>>= 16 ); r2
^= SBA(sb23
, (s
)+4);
70 s
=l1
; l1
=r1
; r1
=s
; s
=l2
; l2
=r2
; r2
=s
;
72 res
[0] = l1
; res
[1] = l2
; res
[2] = r1
; res
[3] = r2
;
83 #define SBA(sb, v) (*(long64*)((char*)(sb)+(v)))
86 _ufc_doit_r(itr
, __data
, res
)
88 struct crypt_data
* __restrict __data
;
92 register long64
*sb01
= (long64
*)__data
->sb0
;
93 register long64
*sb23
= (long64
*)__data
->sb2
;
95 l
= (((long64
)res
[0]) << 32) | ((long64
)res
[1]);
96 r
= (((long64
)res
[2]) << 32) | ((long64
)res
[3]);
99 k
= (long64
*)__data
->keysched
;
102 l
^= SBA(sb23
, (s
) & 0xffff);
103 l
^= SBA(sb23
, (s
>>= 16) & 0xffff);
104 l
^= SBA(sb01
, (s
>>= 16) & 0xffff);
105 l
^= SBA(sb01
, (s
>>= 16) );
108 r
^= SBA(sb23
, (s
) & 0xffff);
109 r
^= SBA(sb23
, (s
>>= 16) & 0xffff);
110 r
^= SBA(sb01
, (s
>>= 16) & 0xffff);
111 r
^= SBA(sb01
, (s
>>= 16) );
116 res
[0] = l
>> 32; res
[1] = l
& 0xffffffff;
117 res
[2] = r
>> 32; res
[3] = r
& 0xffffffff;