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 * see <http://www.gnu.org/licenses/>.
20 * @(#)crypt.c 2.25 12/20/96
22 * Semiportable C version
26 #include "ufc-crypt.h"
28 #include "crypt-private.h"
36 #define SBA(sb, v) (*(long32*)((char*)(sb)+(v)))
39 _ufc_doit_r(itr
, __data
, res
)
41 struct crypt_data
* __restrict __data
;
45 long32
*sb01
= (long32
*)__data
->sb0
;
46 long32
*sb23
= (long32
*)__data
->sb2
;
47 long32 l1
, l2
, r1
, r2
;
49 l1
= (long32
)res
[0]; l2
= (long32
)res
[1];
50 r1
= (long32
)res
[2]; r2
= (long32
)res
[3];
53 k
= (long32
*)__data
->keysched
;
56 l1
^= SBA(sb01
, s
& 0xffff); l2
^= SBA(sb01
, (s
& 0xffff)+4);
57 l1
^= SBA(sb01
, s
>>= 16 ); l2
^= SBA(sb01
, (s
)+4);
59 l1
^= SBA(sb23
, s
& 0xffff); l2
^= SBA(sb23
, (s
& 0xffff)+4);
60 l1
^= SBA(sb23
, s
>>= 16 ); l2
^= SBA(sb23
, (s
)+4);
63 r1
^= SBA(sb01
, s
& 0xffff); r2
^= SBA(sb01
, (s
& 0xffff)+4);
64 r1
^= SBA(sb01
, s
>>= 16 ); r2
^= SBA(sb01
, (s
)+4);
66 r1
^= SBA(sb23
, s
& 0xffff); r2
^= SBA(sb23
, (s
& 0xffff)+4);
67 r1
^= SBA(sb23
, s
>>= 16 ); r2
^= SBA(sb23
, (s
)+4);
69 s
=l1
; l1
=r1
; r1
=s
; s
=l2
; l2
=r2
; r2
=s
;
71 res
[0] = l1
; res
[1] = l2
; res
[2] = r1
; res
[3] = r2
;
82 #define SBA(sb, v) (*(long64*)((char*)(sb)+(v)))
85 _ufc_doit_r(itr
, __data
, res
)
87 struct crypt_data
* __restrict __data
;
91 register long64
*sb01
= (long64
*)__data
->sb0
;
92 register long64
*sb23
= (long64
*)__data
->sb2
;
94 l
= (((long64
)res
[0]) << 32) | ((long64
)res
[1]);
95 r
= (((long64
)res
[2]) << 32) | ((long64
)res
[3]);
98 k
= (long64
*)__data
->keysched
;
101 l
^= SBA(sb23
, (s
) & 0xffff);
102 l
^= SBA(sb23
, (s
>>= 16) & 0xffff);
103 l
^= SBA(sb01
, (s
>>= 16) & 0xffff);
104 l
^= SBA(sb01
, (s
>>= 16) );
107 r
^= SBA(sb23
, (s
) & 0xffff);
108 r
^= SBA(sb23
, (s
>>= 16) & 0xffff);
109 r
^= SBA(sb01
, (s
>>= 16) & 0xffff);
110 r
^= SBA(sb01
, (s
>>= 16) );
115 res
[0] = l
>> 32; res
[1] = l
& 0xffffffff;
116 res
[2] = r
>> 32; res
[3] = r
& 0xffffffff;