PostgreSQL Source Code: contrib/pgcrypto/crypt-des.c File Reference (original) (raw)
#include "[postgres.h](postgres%5F8h%5Fsource.html)"
#include "[miscadmin.h](miscadmin%5F8h%5Fsource.html)"
#include "[port/pg_bswap.h](pg%5F%5Fbswap%5F8h%5Fsource.html)"
#include "[px-crypt.h](px-crypt%5F8h%5Fsource.html)"
Go to the source code of this file.
Functions | |
---|---|
static int | ascii_to_bin (char ch) |
static void | des_init (void) |
static void | setup_salt (long salt) |
static int | des_setkey (const char *key) |
static int | do_des (uint32 l_in, uint32 r_in, uint32 *l_out, uint32 *r_out, int count) |
static int | des_cipher (const char *in, char *out, long salt, int count) |
char * | px_crypt_des (const char *key, const char *setting) |
Variables | |
---|---|
static const char | _crypt_a64 [] |
static uint8 | IP [64] |
static uint8 | inv_key_perm [64] |
static uint8 | u_key_perm [56] |
static uint8 | key_perm [56] |
static uint8 | key_shifts [16] |
static uint8 | inv_comp_perm [56] |
static uint8 | comp_perm [48] |
static uint8 | u_sbox [8][64] |
static uint8 | sbox [8][64] |
static uint8 | un_pbox [32] |
static uint8 | pbox [32] |
static uint32 | _crypt_bits32 [32] |
static uint8 | _crypt_bits8 [8] = {0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01} |
static uint32 | saltbits |
static long | old_salt |
static uint32 * | bits28 |
static uint32 * | bits24 |
static uint8 | init_perm [64] |
static uint8 | final_perm [64] |
static uint32 | en_keysl [16] |
static uint32 | en_keysr [16] |
static uint32 | de_keysl [16] |
static uint32 | de_keysr [16] |
static int | des_initialised = 0 |
static uint8 | m_sbox [4][4096] |
static uint32 | psbox [4][256] |
static uint32 | ip_maskl [8][256] |
static uint32 | ip_maskr [8][256] |
static uint32 | fp_maskl [8][256] |
static uint32 | fp_maskr [8][256] |
static uint32 | key_perm_maskl [8][128] |
static uint32 | key_perm_maskr [8][128] |
static uint32 | comp_maskl [8][128] |
static uint32 | comp_maskr [8][128] |
static uint32 | old_rawkey0 |
static uint32 | old_rawkey1 |
◆ _PASSWORD_EFMT1
#define _PASSWORD_EFMT1 '_'
◆ ascii_to_bin()
static int ascii_to_bin ( char ch) | inlinestatic |
---|
Definition at line 203 of file crypt-des.c.
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}
Referenced by px_crypt_des().
◆ des_cipher()
static int des_cipher ( const char * in, char * out, long salt, int count ) | static |
---|
Definition at line 617 of file crypt-des.c.
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}
static void des_init(void)
static void setup_salt(long salt)
static int des_initialised
static int do_des(uint32 l_in, uint32 r_in, uint32 *l_out, uint32 *r_out, int count)
References des_init(), des_initialised, do_des(), pg_hton32, pg_ntoh32, and setup_salt().
Referenced by px_crypt_des().
◆ des_init()
static void des_init ( void ) | static |
---|
Definition at line 221 of file crypt-des.c.
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}
static uint8 inv_key_perm[64]
static uint32 key_perm_maskl[8][128]
static uint32 ip_maskl[8][256]
static uint32 comp_maskl[8][128]
static uint8 key_perm[56]
static uint32 psbox[4][256]
static uint32 fp_maskr[8][256]
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 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 uint32 old_rawkey1
static uint8 _crypt_bits8[8]
static uint8 inv_comp_perm[56]
static uint32 ip_maskr[8][256]
References _crypt_bits32, _crypt_bits8, b, bits24, bits28, comp_maskl, comp_maskr, comp_perm, des_initialised, final_perm, fp_maskl, fp_maskr, i, init_perm, inv_comp_perm, inv_key_perm, IP, ip_maskl, ip_maskr, j, key_perm, key_perm_maskl, key_perm_maskr, m_sbox, old_rawkey0, old_rawkey1, old_salt, pbox, psbox, saltbits, sbox, u_key_perm, u_sbox, and un_pbox.
Referenced by des_cipher(), des_setkey(), and px_crypt_des().
◆ des_setkey()
static int des_setkey ( const char * key) | static |
---|
Definition at line 396 of file crypt-des.c.
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}
static uint32 en_keysr[16]
static uint32 de_keysr[16]
static uint8 key_shifts[16]
static uint32 en_keysl[16]
static uint32 de_keysl[16]
References comp_maskl, comp_maskr, de_keysl, de_keysr, des_init(), des_initialised, en_keysl, en_keysr, sort-test::key, key_perm_maskl, key_perm_maskr, key_shifts, old_rawkey0, old_rawkey1, and pg_ntoh32.
Referenced by px_crypt_des().
◆ do_des()
Definition at line 483 of file crypt-des.c.
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}
#define CHECK_FOR_INTERRUPTS()
References CHECK_FOR_INTERRUPTS, de_keysl, de_keysr, en_keysl, en_keysr, fp_maskl, fp_maskr, ip_maskl, ip_maskr, m_sbox, psbox, and saltbits.
Referenced by des_cipher(), and px_crypt_des().
◆ px_crypt_des()
char * px_crypt_des | ( | const char * | key, |
---|---|---|---|
const char * | setting | ||
) |
Definition at line 651 of file crypt-des.c.
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 int ascii_to_bin(char ch)
static int des_setkey(const char *key)
static const char _crypt_a64[]
int errcode(int sqlerrcode)
int errmsg(const char *fmt,...)
#define ereport(elevel,...)
size_t strlcpy(char *dst, const char *src, size_t siz)
References _crypt_a64, _PASSWORD_EFMT1, ascii_to_bin(), des_cipher(), des_init(), des_initialised, des_setkey(), do_des(), ereport, errcode(), errmsg(), ERROR, i, sort-test::key, output, setup_salt(), and strlcpy().
Referenced by run_crypt_des().
◆ setup_salt()
static void setup_salt ( long salt) | static |
---|
Definition at line 373 of file crypt-des.c.
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}
References i, old_salt, and saltbits.
Referenced by des_cipher(), and px_crypt_des().
◆ _crypt_a64
Initial value:
=
"./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
Definition at line 71 of file crypt-des.c.
Referenced by px_crypt_des().
◆ _crypt_bits32
Initial value:
=
{
0x80000000, 0x40000000, 0x20000000, 0x10000000,
0x08000000, 0x04000000, 0x02000000, 0x01000000,
0x00800000, 0x00400000, 0x00200000, 0x00100000,
0x00080000, 0x00040000, 0x00020000, 0x00010000,
0x00008000, 0x00004000, 0x00002000, 0x00001000,
0x00000800, 0x00000400, 0x00000200, 0x00000100,
0x00000080, 0x00000040, 0x00000020, 0x00000010,
0x00000008, 0x00000004, 0x00000002, 0x00000001
}
Definition at line 164 of file crypt-des.c.
Referenced by des_init().
◆ _crypt_bits8
uint8 _crypt_bits8[8] = {0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01} | static |
---|
◆ bits24
◆ bits28
◆ comp_maskl
◆ comp_maskr
◆ comp_perm
Initial value:
= {
14, 17, 11, 24, 1, 5, 3, 28, 15, 6, 21, 10,
23, 19, 12, 4, 26, 8, 16, 7, 27, 20, 13, 2,
41, 52, 31, 37, 47, 55, 30, 40, 51, 45, 33, 48,
44, 49, 39, 56, 34, 53, 46, 42, 50, 36, 29, 32
}
Definition at line 95 of file crypt-des.c.
Referenced by des_init().
◆ de_keysl
◆ de_keysr
◆ des_initialised
◆ en_keysl
◆ en_keysr
◆ final_perm
◆ fp_maskl
◆ fp_maskr
◆ init_perm
◆ inv_comp_perm
◆ inv_key_perm
◆ IP
Initial value:
= {
58, 50, 42, 34, 26, 18, 10, 2, 60, 52, 44, 36, 28, 20, 12, 4,
62, 54, 46, 38, 30, 22, 14, 6, 64, 56, 48, 40, 32, 24, 16, 8,
57, 49, 41, 33, 25, 17, 9, 1, 59, 51, 43, 35, 27, 19, 11, 3,
61, 53, 45, 37, 29, 21, 13, 5, 63, 55, 47, 39, 31, 23, 15, 7
}
Definition at line 74 of file crypt-des.c.
Referenced by base_yylex_location(), and des_init().
◆ ip_maskl
◆ ip_maskr
◆ key_perm
Initial value:
= {
57, 49, 41, 33, 25, 17, 9, 1, 58, 50, 42, 34, 26, 18,
10, 2, 59, 51, 43, 35, 27, 19, 11, 3, 60, 52, 44, 36,
63, 55, 47, 39, 31, 23, 15, 7, 62, 54, 46, 38, 30, 22,
14, 6, 61, 53, 45, 37, 29, 21, 13, 5, 28, 20, 12, 4
}
Definition at line 83 of file crypt-des.c.
Referenced by des_init().
◆ key_perm_maskl
◆ key_perm_maskr
◆ key_shifts
Initial value:
= {
1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1
}
Definition at line 90 of file crypt-des.c.
Referenced by des_setkey().
◆ m_sbox
◆ old_rawkey0
◆ old_rawkey1
◆ old_salt
◆ pbox
Initial value:
= {
16, 7, 20, 21, 29, 12, 28, 17, 1, 15, 23, 26, 5, 18, 31, 10,
2, 8, 24, 14, 32, 27, 3, 9, 19, 13, 30, 6, 22, 11, 4, 25
}
Definition at line 159 of file crypt-des.c.
Referenced by des_init().