PostgreSQL Source Code: contrib/pgcrypto/crypt-des.c Source File (original) (raw)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
66
68
69#define _PASSWORD_EFMT1 '_'
70
72"./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
73
75 58, 50, 42, 34, 26, 18, 10, 2, 60, 52, 44, 36, 28, 20, 12, 4,
76 62, 54, 46, 38, 30, 22, 14, 6, 64, 56, 48, 40, 32, 24, 16, 8,
77 57, 49, 41, 33, 25, 17, 9, 1, 59, 51, 43, 35, 27, 19, 11, 3,
78 61, 53, 45, 37, 29, 21, 13, 5, 63, 55, 47, 39, 31, 23, 15, 7
79};
80
84 57, 49, 41, 33, 25, 17, 9, 1, 58, 50, 42, 34, 26, 18,
85 10, 2, 59, 51, 43, 35, 27, 19, 11, 3, 60, 52, 44, 36,
86 63, 55, 47, 39, 31, 23, 15, 7, 62, 54, 46, 38, 30, 22,
87 14, 6, 61, 53, 45, 37, 29, 21, 13, 5, 28, 20, 12, 4
88};
89
91 1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1
92};
93
96 14, 17, 11, 24, 1, 5, 3, 28, 15, 6, 21, 10,
97 23, 19, 12, 4, 26, 8, 16, 7, 27, 20, 13, 2,
98 41, 52, 31, 37, 47, 55, 30, 40, 51, 45, 33, 48,
99 44, 49, 39, 56, 34, 53, 46, 42, 50, 36, 29, 32
100};
101
102
103
104
105
108 {
109 14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7,
110 0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8,
111 4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0,
112 15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13
113 },
114 {
115 15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10,
116 3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5,
117 0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15,
118 13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9
119 },
120 {
121 10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8,
122 13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1,
123 13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7,
124 1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12
125 },
126 {
127 7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15,
128 13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9,
129 10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4,
130 3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14
131 },
132 {
133 2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9,
134 14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6,
135 4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14,
136 11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3
137 },
138 {
139 12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11,
140 10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8,
141 9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6,
142 4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13
143 },
144 {
145 4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1,
146 13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6,
147 1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2,
148 6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12
149 },
150 {
151 13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7,
152 1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2,
153 7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8,
154 2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11
155 }
156};
157
160 16, 7, 20, 21, 29, 12, 28, 17, 1, 15, 23, 26, 5, 18, 31, 10,
161 2, 8, 24, 14, 32, 27, 3, 9, 19, 13, 30, 6, 22, 11, 4, 25
162};
163
165{
166 0x80000000, 0x40000000, 0x20000000, 0x10000000,
167 0x08000000, 0x04000000, 0x02000000, 0x01000000,
168 0x00800000, 0x00400000, 0x00200000, 0x00100000,
169 0x00080000, 0x00040000, 0x00020000, 0x00010000,
170 0x00008000, 0x00004000, 0x00002000, 0x00001000,
171 0x00000800, 0x00000400, 0x00000200, 0x00000100,
172 0x00000080, 0x00000040, 0x00000020, 0x00000010,
173 0x00000008, 0x00000004, 0x00000002, 0x00000001
174};
175
176static uint8 _crypt_bits8[8] = {0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01};
177
201
202static inline int
204{
205 if (ch > 'z')
206 return 0;
207 if (ch >= 'a')
208 return (ch - 'a' + 38);
209 if (ch > 'Z')
210 return 0;
211 if (ch >= 'A')
212 return (ch - 'A' + 12);
213 if (ch > '9')
214 return 0;
215 if (ch >= '.')
216 return (ch - '.');
217 return 0;
218}
219
220static void
222{
223 int i,
224 j,
225 b,
226 k,
227 inbit,
228 obit;
230 *il,
231 *ir,
232 *fl,
233 *fr;
234
239
240
241
242
245 {
246 b = (j & 0x20) | ((j & 1) << 4) | ((j >> 1) & 0xf);
248 }
249
250
251
252
253
260
261
262
263
264
266 {
269 }
270
271
272
273
274
276 {
280 }
281
282
283
284
287
288
289
290
291
292 for (k = 0; k < 8; k++)
293 {
295 {
301 {
302 inbit = 8 * k + j;
304 {
305 if ((obit = init_perm[inbit]) < 32)
307 else
311 else
313 }
314 }
315 }
317 {
321 {
322 inbit = 8 * k + j;
324 {
326 continue;
327 if (obit < 28)
329 else
330 *ir |= bits28[obit - 28];
331 }
332 }
336 {
337 inbit = 7 * k + j;
339 {
341 continue;
342 if (obit < 24)
344 else
345 *ir |= bits24[obit - 24];
346 }
347 }
348 }
349 }
350
351
352
353
354
357
360 {
363 {
366 }
367 }
368
370}
371
372static void
374{
376 saltbit;
377 int i;
378
380 return;
382
384 saltbit = 1;
385 obit = 0x800000;
387 {
388 if (salt & saltbit)
390 saltbit <<= 1;
391 obit >>= 1;
392 }
393}
394
395static int
397{
399 k1,
400 rawkey0,
401 rawkey1;
402 int shifts,
403 round;
404
407
410
411 if ((rawkey0 | rawkey1)
414 {
415
416
417
418
419
420 return 0;
421 }
424
425
426
427
444
445
446
447
448 shifts = 0;
449 for (round = 0; round < 16; round++)
450 {
452 t1;
453
455
456 t0 = (k0 << shifts) | (k0 >> (28 - shifts));
457 t1 = (k1 << shifts) | (k1 >> (28 - shifts));
458
468
478 }
479 return 0;
480}
481
482static int
484{
485
486
487
489 r,
490 *kl,
491 *kr,
492 *kl1,
493 *kr1;
495 r48l,
496 r48r;
497 int round;
498
499 if (count == 0)
500 return 1;
501 else if (count > 0)
502 {
503
504
505
508 }
509 else
510 {
511
512
513
514 count = -count;
517 }
518
519
520
521
523 | ip_maskl[1][(l_in >> 16) & 0xff]
524 | ip_maskl[2][(l_in >> 8) & 0xff]
527 | ip_maskl[5][(r_in >> 16) & 0xff]
528 | ip_maskl[6][(r_in >> 8) & 0xff]
531 | ip_maskr[1][(l_in >> 16) & 0xff]
532 | ip_maskr[2][(l_in >> 8) & 0xff]
535 | ip_maskr[5][(r_in >> 16) & 0xff]
536 | ip_maskr[6][(r_in >> 8) & 0xff]
538
539 while (count--)
540 {
542
543
544
545
546 kl = kl1;
547 kr = kr1;
548 round = 16;
549 while (round--)
550 {
551
552
553
554 r48l = ((r & 0x00000001) << 23)
555 | ((r & 0xf8000000) >> 9)
556 | ((r & 0x1f800000) >> 11)
557 | ((r & 0x01f80000) >> 13)
558 | ((r & 0x001f8000) >> 15);
559
560 r48r = ((r & 0x0001f800) << 7)
561 | ((r & 0x00001f80) << 5)
562 | ((r & 0x000001f8) << 3)
563 | ((r & 0x0000001f) << 1)
564 | ((r & 0x80000000) >> 31);
565
566
567
568
569
570 f = (r48l ^ r48r) & saltbits;
571 r48l ^= f ^ *kl++;
572 r48r ^= f ^ *kr++;
573
574
575
576
577
582
583
584
585
586 f ^= l;
587 l = r;
588 r = f;
589 }
590 r = l;
591 l = f;
592 }
593
594
595
596
597 *l_out = fp_maskl[0][l >> 24]
598 | fp_maskl[1][(l >> 16) & 0xff]
599 | fp_maskl[2][(l >> 8) & 0xff]
602 | fp_maskl[5][(r >> 16) & 0xff]
603 | fp_maskl[6][(r >> 8) & 0xff]
605 *r_out = fp_maskr[0][l >> 24]
606 | fp_maskr[1][(l >> 16) & 0xff]
607 | fp_maskr[2][(l >> 8) & 0xff]
610 | fp_maskr[5][(r >> 16) & 0xff]
611 | fp_maskr[6][(r >> 8) & 0xff]
613 return 0;
614}
615
616static int
617des_cipher(const char *in, char *out, long salt, int count)
618{
621 r_out,
622 rawl,
623 rawr;
624 int retval;
625
628
630
631
632 memcpy(buffer, in, sizeof(buffer));
633
636
637 retval = do_des(rawl, rawr, &l_out, &r_out, count);
638 if (retval)
639 return retval;
640
643
644
645 memcpy(out, buffer, sizeof(buffer));
646
647 return retval;
648}
649
650char *
652{
653 int i;
655 salt,
656 l,
657 r0,
658 r1,
659 keybuf[2];
660 char *p;
662 static char output[21];
663
666
667
668
669
670
671
672 q = (uint8 *) keybuf;
673 while (q - (uint8 *) keybuf - 8)
674 {
675 *q++ = *key << 1;
676 if (*key != '\0')
678 }
680 return NULL;
681
682#ifndef DISABLE_XDES
684 {
685
686
687
688
689
690
691
692
693
694 if (strlen(setting) < 9)
696 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
697 errmsg("invalid salt")));
698
699 for (i = 1, count = 0L; i < 5; i++)
701
702 for (i = 5, salt = 0L; i < 9; i++)
704
705 while (*key)
706 {
707
708
709
710 if (des_cipher((char *) keybuf, (char *) keybuf, 0L, 1))
711 return NULL;
712
713
714
715
716 q = (uint8 *) keybuf;
717 while (q - (uint8 *) keybuf - 8 && *key)
718 *q++ ^= *key++ << 1;
719
721 return NULL;
722 }
724
725
726
727
728
729
730
732 }
733 else
734#endif
735 {
736
737
738
739
740 count = 25;
741
742 if (strlen(setting) < 2)
744 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
745 errmsg("invalid salt")));
746
749
750 output[0] = setting[0];
751
752
753
754
755
756
757 output[1] = setting[1] ? setting[1] : output[0];
758
760 }
762
763
764
765
766 if (do_des(0L, 0L, &r0, &r1, count))
767 return NULL;
768
769
770
771
772 l = (r0 >> 8);
777
778 l = (r0 << 16) | ((r1 >> 16) & 0xffff);
783
784 l = r1 << 2;
788 *p = 0;
789
791}
static int des_cipher(const char *in, char *out, long salt, int count)
static uint8 inv_key_perm[64]
static uint32 key_perm_maskl[8][128]
static uint32 ip_maskl[8][256]
static int ascii_to_bin(char ch)
static uint32 comp_maskl[8][128]
static void des_init(void)
static uint8 key_perm[56]
static uint32 psbox[4][256]
static uint32 en_keysr[16]
static void setup_salt(long salt)
static uint32 fp_maskr[8][256]
static int des_initialised
static uint32 de_keysr[16]
static uint8 u_key_perm[56]
static uint32 _crypt_bits32[32]
static uint8 init_perm[64]
static uint32 old_rawkey0
static uint8 final_perm[64]
static uint32 comp_maskr[8][128]
static uint8 key_shifts[16]
static uint32 key_perm_maskr[8][128]
static uint8 comp_perm[48]
static uint8 m_sbox[4][4096]
static uint8 u_sbox[8][64]
static uint32 fp_maskl[8][256]
static int do_des(uint32 l_in, uint32 r_in, uint32 *l_out, uint32 *r_out, int count)
static uint32 en_keysl[16]
static uint32 de_keysl[16]
static uint32 old_rawkey1
static int des_setkey(const char *key)
static uint8 _crypt_bits8[8]
static const char _crypt_a64[]
static uint8 inv_comp_perm[56]
static uint32 ip_maskr[8][256]
char * px_crypt_des(const char *key, const char *setting)
int errcode(int sqlerrcode)
int errmsg(const char *fmt,...)
#define ereport(elevel,...)
#define CHECK_FOR_INTERRUPTS()
size_t strlcpy(char *dst, const char *src, size_t siz)