Quellcodebibliothek Statistik Leitseite products/Sources/formale Sprachen/C/Postgres/contrib/pgcrypto/   (Postgres Database Version 18.4©)  Datei vom 11.4.2026 mit Größe 24 kB image not shown  

Quelle  crypt-blowfish.c

  Sprache: C
 

/*
 * contrib/pgcrypto/crypt-blowfish.c
 *
 * This code comes from John the Ripper password cracker, with reentrant
 * and crypt(3) interfaces added, but optimizations specific to password
 * cracking removed.
 *
 * Written by Solar Designer <solar at openwall.com> in 1998-2002 and
 * placed in the public domain.
 *
 * There's absolutely no warranty.
 *
 * It is my intent that you should be able to use this on your system,
 * as a part of a software package, or anywhere else to improve security,
 * ensure compatibility, or for any other purpose. I would appreciate
 * it if you give credit where it is due and keep your modifications in
 * the public domain as well, but I don't require that in order to let
 * you place this code and any modifications you make under a license
 * of your choice.
 *
 * This implementation is compatible with OpenBSD bcrypt.c (version 2a)
 * by Niels Provos <provos at citi.umich.edu>, and uses some of his
 * ideas.  The password hashing algorithm was designed by David Mazieres
 * <dm at lcs.mit.edu>.
 *
 * There's a paper on the algorithm that explains its design decisions:
 *
 * http://www.usenix.org/events/usenix99/provos.html
 *
 * Some of the tricks in BF_ROUND might be inspired by Eric Young's
 * Blowfish library (I can't be sure if I would think of something if I
 * hadn't seen his code).
 */


#include "postgres.h"
#include "miscadmin.h"

#include "px-crypt.h"
#include "px.h"

#ifdef __i386__
#define BF_ASM    0 /* 1 */
#define BF_SCALE   1
#elif defined(__x86_64__)
#define BF_ASM    0
#define BF_SCALE   1
#else
#define BF_ASM    0
#define BF_SCALE   0
#endif

typedef unsigned int BF_word;
typedef signed int BF_word_signed;

/* Number of Blowfish rounds, this is also hardcoded into a few places */
#define BF_N    16

typedef BF_word BF_key[BF_N + 2];

typedef struct
{
 BF_word  S[4][0x100];
 BF_key  P;
} BF_ctx;

/*
 * Magic IV for 64 Blowfish encryptions that we do at the end.
 * The string is "OrpheanBeholderScryDoubt" on big-endian.
 */

static BF_word BF_magic_w[6] = {
 0x4F727068, 0x65616E42, 0x65686F6C,
 0x64657253, 0x63727944, 0x6F756274
};

/*
 * P-box and S-box tables initialized with digits of Pi.
 */

static BF_ctx BF_init_state = {
 {
  {
   0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7,
   0xb8e1afed, 0x6a267e96, 0xba7c9045, 0xf12c7f99,
   0x24a19947, 0xb3916cf7, 0x0801f2e2, 0x858efc16,
   0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e,
   0x0d95748f, 0x728eb658, 0x718bcd58, 0x82154aee,
   0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013,
   0xc5d1b023, 0x286085f0, 0xca417918, 0xb8db38ef,
   0x8e79dcb0, 0x603a180e, 0x6c9e0e8b, 0xb01e8a3e,
   0xd71577c1, 0xbd314b27, 0x78af2fda, 0x55605c60,
   0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440,
   0x55ca396a, 0x2aab10b6, 0xb4cc5c34, 0x1141e8ce,
   0xa15486af, 0x7c72e993, 0xb3ee1411, 0x636fbc2a,
   0x2ba9c55d, 0x741831f6, 0xce5c3e16, 0x9b87931e,
   0xafd6ba33, 0x6c24cf5c, 0x7a325381, 0x28958677,
   0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193,
   0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032,
   0xef845d5d, 0xe98575b1, 0xdc262302, 0xeb651b88,
   0x23893e81, 0xd396acc5, 0x0f6d6ff3, 0x83f44239,
   0x2e0b4482, 0xa4842004, 0x69c8f04a, 0x9e1f9b5e,
   0x21c66842, 0xf6e96c9a, 0x670c9c61, 0xabd388f0,
   0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3,
   0x6eef0b6c, 0x137a3be4, 0xba3bf050, 0x7efb2a98,
   0xa1f1651d, 0x39af0176, 0x66ca593e, 0x82430e88,
   0x8cee8619, 0x456f9fb4, 0x7d84a5c3, 0x3b8b5ebe,
   0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6,
   0x4ed3aa62, 0x363f7706, 0x1bfedf72, 0x429b023d,
   0x37d0d724, 0xd00a1248, 0xdb0fead3, 0x49f1c09b,
   0x075372c9, 0x80991b7b, 0x25d479d8, 0xf6e8def7,
   0xe3fe501a, 0xb6794c3b, 0x976ce0bd, 0x04c006ba,
   0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463,
   0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f,
   0x6dfc511f, 0x9b30952c, 0xcc814544, 0xaf5ebd09,
   0xbee3d004, 0xde334afd, 0x660f2807, 0x192e4bb3,
   0xc0cba857, 0x45c8740f, 0xd20b5f39, 0xb9d3fbdb,
   0x5579c0bd, 0x1a60320a, 0xd6a100c6, 0x402c7279,
   0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8,
   0x3c7516df, 0xfd616b15, 0x2f501ec8, 0xad0552ab,
   0x323db5fa, 0xfd238760, 0x53317b48, 0x3e00df82,
   0x9e5c57bb, 0xca6f8ca0, 0x1a87562e, 0xdf1769db,
   0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573,
   0x695b27b0, 0xbbca58c8, 0xe1ffa35d, 0xb8f011a0,
   0x10fa3d98, 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b,
   0x9a53e479, 0xb6f84565, 0xd28e49bc, 0x4bfb9790,
   0xe1ddf2da, 0xa4cb7e33, 0x62fb1341, 0xcee4c6e8,
   0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4,
   0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0,
   0xd08ed1d0, 0xafc725e0, 0x8e3c5b2f, 0x8e7594b7,
   0x8ff6e2fb, 0xf2122b64, 0x8888b812, 0x900df01c,
   0x4fad5ea0, 0x688fc31c, 0xd1cff191, 0xb3a8c1ad,
   0x2f2f2218, 0xbe0e1777, 0xea752dfe, 0x8b021fa1,
   0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299,
   0xb4a84fe0, 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9,
   0x165fa266, 0x80957705, 0x93cc7314, 0x211a1477,
   0xe6ad2065, 0x77b5fa86, 0xc75442f5, 0xfb9d35cf,
   0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49,
   0x00250e2d, 0x2071b35e, 0x226800bb, 0x57b8e0af,
   0x2464369b, 0xf009b91e, 0x5563911d, 0x59dfa6aa,
   0x78c14389, 0xd95a537f, 0x207d5ba2, 0x02e5b9c5,
   0x83260376, 0x6295cfa9, 0x11c81968, 0x4e734a41,
   0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915,
   0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400,
   0x08ba6fb5, 0x571be91f, 0xf296ec6b, 0x2a0dd915,
   0xb6636521, 0xe7b9f9b6, 0xff34052e, 0xc5855664,
   0x53b02d5d, 0xa99f8fa1, 0x08ba4799, 0x6e85076a
  }, {
   0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623,
   0xad6ea6b0, 0x49a7df7d, 0x9cee60b8, 0x8fedb266,
   0xecaa8c71, 0x699a17ff, 0x5664526c, 0xc2b19ee1,
   0x193602a5, 0x75094c29, 0xa0591340, 0xe4183a3e,
   0x3f54989a, 0x5b429d65, 0x6b8fe4d6, 0x99f73fd6,
   0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1,
   0x4cdd2086, 0x8470eb26, 0x6382e9c6, 0x021ecc5e,
   0x09686b3f, 0x3ebaefc9, 0x3c971814, 0x6b6a70a1,
   0x687f3584, 0x52a0e286, 0xb79c5305, 0xaa500737,
   0x3e07841c, 0x7fdeae5c, 0x8e7d44ec, 0x5716f2b8,
   0xb03ada37, 0xf0500c0d, 0xf01c1f04, 0x0200b3ff,
   0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd,
   0xd19113f9, 0x7ca92ff6, 0x94324773, 0x22f54701,
   0x3ae5e581, 0x37c2dadc, 0xc8b57634, 0x9af3dda7,
   0xa9446146, 0x0fd0030e, 0xecc8c73e, 0xa4751e41,
   0xe238cd99, 0x3bea0e2f, 0x3280bba1, 0x183eb331,
   0x4e548b38, 0x4f6db908, 0x6f420d03, 0xf60a04bf,
   0x2cb81290, 0x24977c79, 0x5679b072, 0xbcaf89af,
   0xde9a771f, 0xd9930810, 0xb38bae12, 0xdccf3f2e,
   0x5512721f, 0x2e6b7124, 0x501adde6, 0x9f84cd87,
   0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c,
   0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2,
   0xef1c1847, 0x3215d908, 0xdd433b37, 0x24c2ba16,
   0x12a14d43, 0x2a65c451, 0x50940002, 0x133ae4dd,
   0x71dff89e, 0x10314e55, 0x81ac77d6, 0x5f11199b,
   0x043556f1, 0xd7a3c76b, 0x3c11183b, 0x5924a509,
   0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e,
   0x86e34570, 0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3,
   0x771fe71c, 0x4e3d06fa, 0x2965dcb9, 0x99e71d0f,
   0x803e89d6, 0x5266c825, 0x2e4cc978, 0x9c10b36a,
   0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4,
   0xf2f74ea7, 0x361d2b3d, 0x1939260f, 0x19c27960,
   0x5223a708, 0xf71312b6, 0xebadfe6e, 0xeac31f66,
   0xe3bc4595, 0xa67bc883, 0xb17f37d1, 0x018cff28,
   0xc332ddef, 0xbe6c5aa5, 0x65582185, 0x68ab9802,
   0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84,
   0x1521b628, 0x29076170, 0xecdd4775, 0x619f1510,
   0x13cca830, 0xeb61bd96, 0x0334fe1e, 0xaa0363cf,
   0xb5735c90, 0x4c70a239, 0xd59e9e0b, 0xcbaade14,
   0xeecc86bc, 0x60622ca7, 0x9cab5cab, 0xb2f3846e,
   0x648b1eaf, 0x19bdf0ca, 0xa02369b9, 0x655abb50,
   0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7,
   0x9b540b19, 0x875fa099, 0x95f7997e, 0x623d7da8,
   0xf837889a, 0x97e32d77, 0x11ed935f, 0x16681281,
   0x0e358829, 0xc7e61fd6, 0x96dedfa1, 0x7858ba99,
   0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1ac24696,
   0xcdb30aeb, 0x532e3054, 0x8fd948e4, 0x6dbc3128,
   0x58ebf2ef, 0x34c6ffea, 0xfe28ed61, 0xee7c3c73,
   0x5d4a14d9, 0xe864b7e3, 0x42105d14, 0x203e13e0,
   0x45eee2b6, 0xa3aaabea, 0xdb6c4f15, 0xfacb4fd0,
   0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105,
   0xd81e799e, 0x86854dc7, 0xe44b476a, 0x3d816250,
   0xcf62a1f2, 0x5b8d2646, 0xfc8883a0, 0xc1c7b6a3,
   0x7f1524c3, 0x69cb7492, 0x47848a0b, 0x5692b285,
   0x095bbf00, 0xad19489d, 0x1462b174, 0x23820e00,
   0x58428d2a, 0x0c55f5ea, 0x1dadf43e, 0x233f7061,
   0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb,
   0x7cde3759, 0xcbee7460, 0x4085f2a7, 0xce77326e,
   0xa6078084, 0x19f8509e, 0xe8efd855, 0x61d99735,
   0xa969a7aa, 0xc50c06c2, 0x5a04abfc, 0x800bcadc,
   0x9e447a2e, 0xc3453484, 0xfdd56705, 0x0e1e9ec9,
   0xdb73dbd3, 0x105588cd, 0x675fda79, 0xe3674340,
   0xc5c43465, 0x713e38d8, 0x3d28f89e, 0xf16dff20,
   0x153e21e7, 0x8fb03d4a, 0xe6e39f2b, 0xdb83adf7
  }, {
   0xe93d5a68, 0x948140f7, 0xf64c261c, 0x94692934,
   0x411520f7, 0x7602d4f7, 0xbcf46b2e, 0xd4a20068,
   0xd4082471, 0x3320f46a, 0x43b7d4b7, 0x500061af,
   0x1e39f62e, 0x97244546, 0x14214f74, 0xbf8b8840,
   0x4d95fc1d, 0x96b591af, 0x70f4ddd3, 0x66a02f45,
   0xbfbc09ec, 0x03bd9785, 0x7fac6dd0, 0x31cb8504,
   0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a,
   0x28507825, 0x530429f4, 0x0a2c86da, 0xe9b66dfb,
   0x68dc1462, 0xd7486900, 0x680ec0a4, 0x27a18dee,
   0x4f3ffea2, 0xe887ad8c, 0xb58ce006, 0x7af4d6b6,
   0xaace1e7c, 0xd3375fec, 0xce78a399, 0x406b2a42,
   0x20fe9e35, 0xd9f385b9, 0xee39d7ab, 0x3b124e8b,
   0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2,
   0x3a6efa74, 0xdd5b4332, 0x6841e7f7, 0xca7820fb,
   0xfb0af54e, 0xd8feb397, 0x454056ac, 0xba489527,
   0x55533a3a, 0x20838d87, 0xfe6ba9b7, 0xd096954b,
   0x55a867bc, 0xa1159a58, 0xcca92963, 0x99e1db33,
   0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c,
   0xfdf8e802, 0x04272f70, 0x80bb155c, 0x05282ce3,
   0x95c11548, 0xe4c66d22, 0x48c1133f, 0xc70f86dc,
   0x07f9c9ee, 0x41041f0f, 0x404779a4, 0x5d886e17,
   0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564,
   0x257b7834, 0x602a9c60, 0xdff8e8a3, 0x1f636c1b,
   0x0e12b4c2, 0x02e1329e, 0xaf664fd1, 0xcad18115,
   0x6b2395e0, 0x333e92e1, 0x3b240b62, 0xeebeb922,
   0x85b2a20e, 0xe6ba0d99, 0xde720c8c, 0x2da2f728,
   0xd0127845, 0x95b794fd, 0x647d0862, 0xe7ccf5f0,
   0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e,
   0x0a476341, 0x992eff74, 0x3a6f6eab, 0xf4f8fd37,
   0xa812dc60, 0xa1ebddf8, 0x991be14c, 0xdb6e6b0d,
   0xc67b5510, 0x6d672c37, 0x2765d43b, 0xdcd0e804,
   0xf1290dc7, 0xcc00ffa3, 0xb5390f92, 0x690fed0b,
   0x667b9ffb, 0xcedb7d9c, 0xa091cf0b, 0xd9155ea3,
   0xbb132f88, 0x515bad24, 0x7b9479bf, 0x763bd6eb,
   0x37392eb3, 0xcc115979, 0x8026e297, 0xf42e312d,
   0x6842ada7, 0xc66a2b3b, 0x12754ccc, 0x782ef11c,
   0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350,
   0x1a6b1018, 0x11caedfa, 0x3d25bdd8, 0xe2e1c3c9,
   0x44421659, 0x0a121386, 0xd90cec6e, 0xd5abea2a,
   0x64af674e, 0xda86a85f, 0xbebfe988, 0x64e4c3fe,
   0x9dbc8057, 0xf0f7c086, 0x60787bf8, 0x6003604d,
   0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc,
   0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f,
   0x77a057be, 0xbde8ae24, 0x55464299, 0xbf582e61,
   0x4e58f48f, 0xf2ddfda2, 0xf474ef38, 0x8789bdc2,
   0x5366f9c3, 0xc8b38e74, 0xb475f255, 0x46fcd9b9,
   0x7aeb2661, 0x8b1ddf84, 0x846a0e79, 0x915f95e2,
   0x466e598e, 0x20b45770, 0x8cd55591, 0xc902de4c,
   0xb90bace1, 0xbb8205d0, 0x11a86248, 0x7574a99e,
   0xb77f19b6, 0xe0a9dc09, 0x662d09a1, 0xc4324633,
   0xe85a1f02, 0x09f0be8c, 0x4a99a025, 0x1d6efe10,
   0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169,
   0xdcb7da83, 0x573906fe, 0xa1e2ce9b, 0x4fcd7f52,
   0x50115e01, 0xa70683fa, 0xa002b5c4, 0x0de6d027,
   0x9af88c27, 0x773f8641, 0xc3604c06, 0x61a806b5,
   0xf0177a28, 0xc0f586e0, 0x006058aa, 0x30dc7d62,
   0x11e69ed7, 0x2338ea63, 0x53c2dd94, 0xc2c21634,
   0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76,
   0x6f05e409, 0x4b7c0188, 0x39720a3d, 0x7c927c24,
   0x86e3725f, 0x724d9db9, 0x1ac15bb4, 0xd39eb8fc,
   0xed545578, 0x08fca5b5, 0xd83d7cd3, 0x4dad0fc4,
   0x1e50ef5e, 0xb161e6f8, 0xa28514d9, 0x6c51133c,
   0x6fd5c7e7, 0x56e14ec4, 0x362abfce, 0xddc6c837,
   0xd79a3234, 0x92638212, 0x670efa8e, 0x406000e0
  }, {
   0x3a39ce37, 0xd3faf5cf, 0xabc27737, 0x5ac52d1b,
   0x5cb0679e, 0x4fa33742, 0xd3822740, 0x99bc9bbe,
   0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b,
   0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4,
   0x5748ab2f, 0xbc946e79, 0xc6a376d2, 0x6549c2c8,
   0x530ff8ee, 0x468dde7d, 0xd5730a1d, 0x4cd04dc6,
   0x2939bbdb, 0xa9ba4650, 0xac9526e8, 0xbe5ee304,
   0xa1fad5f0, 0x6a2d519a, 0x63ef8ce2, 0x9a86ee22,
   0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4,
   0x83c061ba, 0x9be96a4d, 0x8fe51550, 0xba645bd6,
   0x2826a2f9, 0xa73a3ae1, 0x4ba99586, 0xef5562e9,
   0xc72fefd3, 0xf752f7da, 0x3f046f69, 0x77fa0a59,
   0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593,
   0xe990fd5a, 0x9e34d797, 0x2cf0b7d9, 0x022b8b51,
   0x96d5ac3a, 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28,
   0x1f9f25cf, 0xadf2b89b, 0x5ad6b472, 0x5a88f54c,
   0xe029ac71, 0xe019a5e6, 0x47b0acfd, 0xed93fa9b,
   0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28,
   0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c,
   0x15056dd4, 0x88f46dba, 0x03a16125, 0x0564f0bd,
   0xc3eb9e15, 0x3c9057a2, 0x97271aec, 0xa93a072a,
   0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319,
   0x7533d928, 0xb155fdf5, 0x03563482, 0x8aba3cbb,
   0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f,
   0x4de81751, 0x3830dc8e, 0x379d5862, 0x9320f991,
   0xea7a90c2, 0xfb3e7bce, 0x5121ce64, 0x774fbe32,
   0xa8b6e37e, 0xc3293d46, 0x48de5369, 0x6413e680,
   0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166,
   0xb39a460a, 0x6445c0dd, 0x586cdecf, 0x1c20c8ae,
   0x5bbef7dd, 0x1b588d40, 0xccd2017f, 0x6bb4e3bb,
   0xdda26a7e, 0x3a59ff45, 0x3e350a44, 0xbcb4cdd5,
   0x72eacea8, 0xfa6484bb, 0x8d6612ae, 0xbf3c6f47,
   0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370,
   0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d,
   0x4040cb08, 0x4eb4e2cc, 0x34d2466a, 0x0115af84,
   0xe1b00428, 0x95983a1d, 0x06b89fb4, 0xce6ea048,
   0x6f3f3b82, 0x3520ab82, 0x011a1d4b, 0x277227f8,
   0x611560b1, 0xe7933fdc, 0xbb3a792b, 0x344525bd,
   0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9,
   0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7,
   0x1a908749, 0xd44fbd9a, 0xd0dadecb, 0xd50ada38,
   0x0339c32a, 0xc6913667, 0x8df9317c, 0xe0b12b4f,
   0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c,
   0xbf97222c, 0x15e6fc2a, 0x0f91fc71, 0x9b941525,
   0xfae59361, 0xceb69ceb, 0xc2a86459, 0x12baa8d1,
   0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a442,
   0xe0ec6e0e, 0x1698db3b, 0x4c98a0be, 0x3278e964,
   0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e,
   0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8,
   0xdf359f8d, 0x9b992f2e, 0xe60b6f47, 0x0fe3f11d,
   0xe54cda54, 0x1edad891, 0xce6279cf, 0xcd3e7e6f,
   0x1618b166, 0xfd2c1d05, 0x848fd2c5, 0xf6fb2299,
   0xf523f357, 0xa6327623, 0x93a83531, 0x56cccd02,
   0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc,
   0xde966292, 0x81b949d0, 0x4c50901b, 0x71c65614,
   0xe6c6c7bd, 0x327a140a, 0x45e1d006, 0xc3f27b9a,
   0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, 0x35bdd2f6,
   0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b,
   0x53113ec0, 0x1640e3d3, 0x38abbd60, 0x2547adf0,
   0xba38209c, 0xf746ce76, 0x77afa1c5, 0x20756060,
   0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, 0x4cf9aa7e,
   0x1948c25c, 0x02fb8a8c, 0x01c36ae4, 0xd6ebe1f9,
   0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f,
   0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6
  }
 }, {
  0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344,
  0xa4093822, 0x299f31d0, 0x082efa98, 0xec4e6c89,
  0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c,
  0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917,
  0x9216d5d9, 0x8979fb1b
 }
};

static unsigned char BF_itoa64[64 + 1] =
"./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";

static unsigned char BF_atoi64[0x60] = {
 646464646464646464646464646401,
 54555657585960616263646464646464,
 642345678910111213141516,
 17181920212223242526276464646464,
 64282930313233343536373839404142,
 43444546474849505152536464646464
};

#define BF_safe_atoi64(dst, src) \
do { \
 tmp = (unsigned char)(src); \
 if ((unsigned int)(tmp -= 0x20) >= 0x60) return -1; \
 tmp = BF_atoi64[tmp]; \
 if (tmp > 63return -1; \
 (dst) = tmp; \
while (0)

static int
BF_decode(BF_word *dst, const char *src, int size)
{
 unsigned char *dptr = (unsigned char *) dst;
 unsigned char *end = dptr + size;
 const unsigned char *sptr = (const unsigned char *) src;
 unsigned int tmp,
    c1,
    c2,
    c3,
    c4;

 do
 {
  BF_safe_atoi64(c1, *sptr++);
  BF_safe_atoi64(c2, *sptr++);
  *dptr++ = (c1 << 2) | ((c2 & 0x30) >> 4);
  if (dptr >= end)
   break;

  BF_safe_atoi64(c3, *sptr++);
  *dptr++ = ((c2 & 0x0F) << 4) | ((c3 & 0x3C) >> 2);
  if (dptr >= end)
   break;

  BF_safe_atoi64(c4, *sptr++);
  *dptr++ = ((c3 & 0x03) << 6) | c4;
 } while (dptr < end);

 return 0;
}

static void
BF_encode(char *dst, const BF_word *src, int size)
{
 const unsigned char *sptr = (const unsigned char *) src;
 const unsigned char *end = sptr + size;
 unsigned char *dptr = (unsigned char *) dst;
 unsigned int c1,
    c2;

 do
 {
  c1 = *sptr++;
  *dptr++ = BF_itoa64[c1 >> 2];
  c1 = (c1 & 0x03) << 4;
  if (sptr >= end)
  {
   *dptr++ = BF_itoa64[c1];
   break;
  }

  c2 = *sptr++;
  c1 |= c2 >> 4;
  *dptr++ = BF_itoa64[c1];
  c1 = (c2 & 0x0f) << 2;
  if (sptr >= end)
  {
   *dptr++ = BF_itoa64[c1];
   break;
  }

  c2 = *sptr++;
  c1 |= c2 >> 6;
  *dptr++ = BF_itoa64[c1];
  *dptr++ = BF_itoa64[c2 & 0x3f];
 } while (sptr < end);
}

static void
BF_swap(BF_word *x, int count)
{
 /* Swap on little-endian hardware, else do nothing */
#ifndef WORDS_BIGENDIAN
 BF_word  tmp;

 do
 {
  tmp = *x;
  tmp = (tmp << 16) | (tmp >> 16);
  *x++ = ((tmp & 0x00FF00FF) << 8) | ((tmp >> 8) & 0x00FF00FF);
 } while (--count);
#endif
}

#if BF_SCALE
/* Architectures which can shift addresses left by 2 bits with no extra cost */
#define BF_ROUND(L, R, N) \
 tmp1 = (L) & 0xFF; \
 tmp2 = (L) >> 8; \
 tmp2 &= 0xFF; \
 tmp3 = (L) >> 16; \
 tmp3 &= 0xFF; \
 tmp4 = (L) >> 24; \
 tmp1 = data.ctx.S[3][tmp1]; \
 tmp2 = data.ctx.S[2][tmp2]; \
 tmp3 = data.ctx.S[1][tmp3]; \
 tmp3 += data.ctx.S[0][tmp4]; \
 tmp3 ^= tmp2; \
 (R) ^= data.ctx.P[(N) + 1]; \
 tmp3 += tmp1; \
 (R) ^= tmp3
#else
/* Architectures with no complicated addressing modes supported */
#define BF_INDEX(S, i) \
 (*((BF_word *)(((unsigned char *)(S)) + (i))))
#define BF_ROUND(L, R, N) \
 tmp1 = (L) & 0xFF; \
 tmp1 <<= 2; \
 tmp2 = (L) >> 6; \
 tmp2 &= 0x3FC; \
 tmp3 = (L) >> 14; \
 tmp3 &= 0x3FC; \
 tmp4 = (L) >> 22; \
 tmp4 &= 0x3FC; \
 tmp1 = BF_INDEX(data.ctx.S[3], tmp1); \
 tmp2 = BF_INDEX(data.ctx.S[2], tmp2); \
 tmp3 = BF_INDEX(data.ctx.S[1], tmp3); \
 tmp3 += BF_INDEX(data.ctx.S[0], tmp4); \
 tmp3 ^= tmp2; \
 (R) ^= data.ctx.P[(N) + 1]; \
 tmp3 += tmp1; \
 (R) ^= tmp3
#endif

/*
 * Encrypt one block, BF_N is hardcoded here.
 */

#define BF_ENCRYPT \
 L ^= data.ctx.P[0]; \
 BF_ROUND(L, R, 0); \
 BF_ROUND(R, L, 1); \
 BF_ROUND(L, R, 2); \
 BF_ROUND(R, L, 3); \
 BF_ROUND(L, R, 4); \
 BF_ROUND(R, L, 5); \
 BF_ROUND(L, R, 6); \
 BF_ROUND(R, L, 7); \
 BF_ROUND(L, R, 8); \
 BF_ROUND(R, L, 9); \
 BF_ROUND(L, R, 10); \
 BF_ROUND(R, L, 11); \
 BF_ROUND(L, R, 12); \
 BF_ROUND(R, L, 13); \
 BF_ROUND(L, R, 14); \
 BF_ROUND(R, L, 15); \
 tmp4 = R; \
 R = L; \
 L = tmp4 ^ data.ctx.P[BF_N + 1]

#if BF_ASM

extern void _BF_body_r(BF_ctx *ctx);

#define BF_body() \
 _BF_body_r(&data.ctx)
#else

#define BF_body() \
do { \
 L = R = 0; \
 ptr = data.ctx.P; \
 do { \
  ptr += 2; \
  BF_ENCRYPT; \
  *(ptr - 2) = L; \
  *(ptr - 1) = R; \
 } while (ptr < &data.ctx.P[BF_N + 2]); \
\
 ptr = data.ctx.S[0]; \
 do { \
  ptr += 2; \
  BF_ENCRYPT; \
  *(ptr - 2) = L; \
  *(ptr - 1) = R; \
 } while (ptr < &data.ctx.S[3][0xFF]); \
while (0)
#endif

static void
BF_set_key(const char *key, BF_key expanded, BF_key initial,
     int sign_extension_bug)
{
 const char *ptr = key;
 int   i,
    j;
 BF_word  tmp;

 for (i = 0; i < BF_N + 2; i++)
 {
  tmp = 0;
  for (j = 0; j < 4; j++)
  {
   tmp <<= 8;
   if (sign_extension_bug)
    tmp |= (BF_word_signed) (signed char) *ptr;
   else
    tmp |= (unsigned char) *ptr;

   if (!*ptr)
    ptr = key;
   else
    ptr++;
  }

  expanded[i] = tmp;
  initial[i] = BF_init_state.P[i] ^ tmp;
 }
}

char *
_crypt_blowfish_rn(const char *key, const char *setting,
       char *output, int size)
{
 struct
 {
  BF_ctx  ctx;
  BF_key  expanded_key;
  union
  {
   BF_word  salt[4];
   BF_word  output[6];
  }   binary;
 }   data;
 BF_word  L,
    R;
 BF_word  tmp1,
    tmp2,
    tmp3,
    tmp4;
 BF_word    *ptr;
 BF_word  count;
 int   i;

 if (size < 7 + 22 + 31 + 1)
  return NULL;

 /*
  * Blowfish salt value must be formatted as follows: "$2a$" or "$2x$", a
  * two digit cost parameter, "$", and 22 digits from the alphabet
  * "./0-9A-Za-z". -- from the PHP crypt docs. Apparently we enforce a few
  * more restrictions on the count in the salt as well.
 */

 if (strlen(setting) < 29)
  ereport(ERROR,
    (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
     errmsg("invalid salt")));

 if (setting[0] != '$' ||
  setting[1] != '2' ||
  (setting[2] != 'a' && setting[2] != 'x') ||
  setting[3] != '$' ||
  setting[4] < '0' || setting[4] > '3' ||
  setting[5] < '0' || setting[5] > '9' ||
  (setting[4] == '3' && setting[5] > '1') ||
  setting[6] != '$')
 {
  ereport(ERROR,
    (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
     errmsg("invalid salt")));
 }

 count = (BF_word) 1 << ((setting[4] - '0') * 10 + (setting[5] - '0'));
 if (count < 16 || BF_decode(data.binary.salt, &setting[7], 16))
 {
  px_memset(data.binary.salt, 0sizeof(data.binary.salt));
  ereport(ERROR,
    (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
     errmsg("invalid salt")));
 }
 BF_swap(data.binary.salt, 4);

 BF_set_key(key, data.expanded_key, data.ctx.P, setting[2] == 'x');

 memcpy(data.ctx.S, BF_init_state.S, sizeof(data.ctx.S));

 L = R = 0;
 for (i = 0; i < BF_N + 2; i += 2)
 {
  L ^= data.binary.salt[i & 2];
  R ^= data.binary.salt[(i & 2) + 1];
  BF_ENCRYPT;
  data.ctx.P[i] = L;
  data.ctx.P[i + 1] = R;
 }

 ptr = data.ctx.S[0];
 do
 {
  ptr += 4;
  L ^= data.binary.salt[(BF_N + 2) & 3];
  R ^= data.binary.salt[(BF_N + 3) & 3];
  BF_ENCRYPT;
  *(ptr - 4) = L;
  *(ptr - 3) = R;

  L ^= data.binary.salt[(BF_N + 4) & 3];
  R ^= data.binary.salt[(BF_N + 5) & 3];
  BF_ENCRYPT;
  *(ptr - 2) = L;
  *(ptr - 1) = R;
 } while (ptr < &data.ctx.S[3][0xFF]);

 do
 {
  CHECK_FOR_INTERRUPTS();

  data.ctx.P[0] ^= data.expanded_key[0];
  data.ctx.P[1] ^= data.expanded_key[1];
  data.ctx.P[2] ^= data.expanded_key[2];
  data.ctx.P[3] ^= data.expanded_key[3];
  data.ctx.P[4] ^= data.expanded_key[4];
  data.ctx.P[5] ^= data.expanded_key[5];
  data.ctx.P[6] ^= data.expanded_key[6];
  data.ctx.P[7] ^= data.expanded_key[7];
  data.ctx.P[8] ^= data.expanded_key[8];
  data.ctx.P[9] ^= data.expanded_key[9];
  data.ctx.P[10] ^= data.expanded_key[10];
  data.ctx.P[11] ^= data.expanded_key[11];
  data.ctx.P[12] ^= data.expanded_key[12];
  data.ctx.P[13] ^= data.expanded_key[13];
  data.ctx.P[14] ^= data.expanded_key[14];
  data.ctx.P[15] ^= data.expanded_key[15];
  data.ctx.P[16] ^= data.expanded_key[16];
  data.ctx.P[17] ^= data.expanded_key[17];

  BF_body();

  tmp1 = data.binary.salt[0];
  tmp2 = data.binary.salt[1];
  tmp3 = data.binary.salt[2];
  tmp4 = data.binary.salt[3];
  data.ctx.P[0] ^= tmp1;
  data.ctx.P[1] ^= tmp2;
  data.ctx.P[2] ^= tmp3;
  data.ctx.P[3] ^= tmp4;
  data.ctx.P[4] ^= tmp1;
  data.ctx.P[5] ^= tmp2;
  data.ctx.P[6] ^= tmp3;
  data.ctx.P[7] ^= tmp4;
  data.ctx.P[8] ^= tmp1;
  data.ctx.P[9] ^= tmp2;
  data.ctx.P[10] ^= tmp3;
  data.ctx.P[11] ^= tmp4;
  data.ctx.P[12] ^= tmp1;
  data.ctx.P[13] ^= tmp2;
  data.ctx.P[14] ^= tmp3;
  data.ctx.P[15] ^= tmp4;
  data.ctx.P[16] ^= tmp1;
  data.ctx.P[17] ^= tmp2;

  BF_body();
 } while (--count);

 for (i = 0; i < 6; i += 2)
 {
  L = BF_magic_w[i];
  R = BF_magic_w[i + 1];

  count = 64;
  do
  {
   BF_ENCRYPT;
  } while (--count);

  data.binary.output[i] = L;
  data.binary.output[i + 1] = R;
 }

 memcpy(output, setting, 7 + 22 - 1);
 output[7 + 22 - 1] = BF_itoa64[(int)
           BF_atoi64[(int) setting[7 + 22 - 1] - 0x20] & 0x30];

/* This has to be bug-compatible with the original implementation, so
 * only encode 23 of the 24 bytes. :-) */

 BF_swap(data.binary.output, 6);
 BF_encode(&output[7 + 22], data.binary.output, 23);
 output[7 + 22 + 31] = '\0';

/* Overwrite the most obvious sensitive data we have on the stack. Note
 * that this does not guarantee there's no sensitive data left on the
 * stack and/or in registers; I'm not aware of portable code that does. */

 px_memset(&data, 0sizeof(data));

 return output;
}

Messung V0.5 in Prozent
C=97 H=85 G=91

¤ Diese beiden folgenden Angebotsgruppen bietet das Unternehmen0.23Angebot  (Wie Sie bei der Firma Beratungs- und Dienstleistungen beauftragen können 2026-08-08) ¤

*Eine klare Vorstellung vom Zielzustand






Wurzel

Suchen

PVS Prover

Isabelle Prover

NIST Cobol Testsuite

Cephes Mathematical Library

Vienna Development Method

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.