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

243 for (i = 0; i < 8; i++)

244 for (j = 0; j < 64; j++)

245 {

246 b = (j & 0x20) | ((j & 1) << 4) | ((j >> 1) & 0xf);

248 }

249

250

251

252

253

254 for (b = 0; b < 4; b++)

255 for (i = 0; i < 64; i++)

256 for (j = 0; j < 64; j++)

260

261

262

263

264

265 for (i = 0; i < 64; i++)

266 {

269 }

270

271

272

273

274

275 for (i = 0; i < 56; i++)

276 {

280 }

281

282

283

284

285 for (i = 0; i < 48; i++)

287

288

289

290

291

292 for (k = 0; k < 8; k++)

293 {

294 for (i = 0; i < 256; i++)

295 {

300 for (j = 0; j < 8; j++)

301 {

302 inbit = 8 * k + j;

304 {

305 if ((obit = init_perm[inbit]) < 32)

307 else

311 else

313 }

314 }

315 }

316 for (i = 0; i < 128; i++)

317 {

320 for (j = 0; j < 7; j++)

321 {

322 inbit = 8 * k + j;

324 {

326 continue;

327 if (obit < 28)

329 else

330 *ir |= bits28[obit - 28];

331 }

332 }

335 for (j = 0; j < 7; j++)

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

355 for (i = 0; i < 32; i++)

357

358 for (b = 0; b < 4; b++)

359 for (i = 0; i < 256; i++)

360 {

361 *(p = &psbox[b][i]) = 0L;

362 for (j = 0; j < 8; j++)

363 {

366 }

367 }

368

370}

371

372static void

374{

376 saltbit;

377 int i;

378

380 return;

382

384 saltbit = 1;

385 obit = 0x800000;

386 for (i = 0; i < 24; i++)

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)