2 * UFC-crypt: ultra fast crypt(3) implementation
4 * Copyright (C) 1991-2015 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 "crypt-private.h"
34 #define SBA(sb, v) (*(long32*)((char*)(sb)+(v)))
37 _ufc_doit_r(itr
, __data
, res
)
39 struct crypt_data
* __restrict __data
;
43 long32
*sb01
= (long32
*)__data
->sb0
;
44 long32
*sb23
= (long32
*)__data
->sb2
;
45 long32 l1
, l2
, r1
, r2
;
47 l1
= (long32
)res
[0]; l2
= (long32
)res
[1];
48 r1
= (long32
)res
[2]; r2
= (long32
)res
[3];
51 k
= (long32
*)__data
->keysched
;
54 l1
^= SBA(sb01
, s
& 0xffff); l2
^= SBA(sb01
, (s
& 0xffff)+4);
55 l1
^= SBA(sb01
, s
>>= 16 ); l2
^= SBA(sb01
, (s
)+4);
57 l1
^= SBA(sb23
, s
& 0xffff); l2
^= SBA(sb23
, (s
& 0xffff)+4);
58 l1
^= SBA(sb23
, s
>>= 16 ); l2
^= SBA(sb23
, (s
)+4);
61 r1
^= SBA(sb01
, s
& 0xffff); r2
^= SBA(sb01
, (s
& 0xffff)+4);
62 r1
^= SBA(sb01
, s
>>= 16 ); r2
^= SBA(sb01
, (s
)+4);
64 r1
^= SBA(sb23
, s
& 0xffff); r2
^= SBA(sb23
, (s
& 0xffff)+4);
65 r1
^= SBA(sb23
, s
>>= 16 ); r2
^= SBA(sb23
, (s
)+4);
67 s
=l1
; l1
=r1
; r1
=s
; s
=l2
; l2
=r2
; r2
=s
;
69 res
[0] = l1
; res
[1] = l2
; res
[2] = r1
; res
[3] = r2
;
80 #define SBA(sb, v) (*(long64*)((char*)(sb)+(v)))
83 _ufc_doit_r(itr
, __data
, res
)
85 struct crypt_data
* __restrict __data
;
89 long64
*sb01
= (long64
*)__data
->sb0
;
90 long64
*sb23
= (long64
*)__data
->sb2
;
92 l
= (((long64
)res
[0]) << 32) | ((long64
)res
[1]);
93 r
= (((long64
)res
[2]) << 32) | ((long64
)res
[3]);
96 k
= (long64
*)__data
->keysched
;
99 l
^= SBA(sb23
, (s
) & 0xffff);
100 l
^= SBA(sb23
, (s
>>= 16) & 0xffff);
101 l
^= SBA(sb01
, (s
>>= 16) & 0xffff);
102 l
^= SBA(sb01
, (s
>>= 16) );
105 r
^= SBA(sb23
, (s
) & 0xffff);
106 r
^= SBA(sb23
, (s
>>= 16) & 0xffff);
107 r
^= SBA(sb01
, (s
>>= 16) & 0xffff);
108 r
^= SBA(sb01
, (s
>>= 16) );
113 res
[0] = l
>> 32; res
[1] = l
& 0xffffffff;
114 res
[2] = r
>> 32; res
[3] = r
& 0xffffffff;