Blame crypt-bcrypt.c

Packit 13e0ca
/*
Packit 13e0ca
 * The crypt_blowfish homepage is:
Packit 13e0ca
 *
Packit 13e0ca
 *      http://www.openwall.com/crypt/
Packit 13e0ca
 *
Packit 13e0ca
 * This code comes from John the Ripper password cracker, with reentrant
Packit 13e0ca
 * and crypt(3) interfaces added, but optimizations specific to password
Packit 13e0ca
 * cracking removed.
Packit 13e0ca
 *
Packit 13e0ca
 * Written by Solar Designer <solar at openwall.com> in 1998-2014.
Packit 13e0ca
 * No copyright is claimed, and the software is hereby placed in the public
Packit 13e0ca
 * domain.  In case this attempt to disclaim copyright and place the software
Packit 13e0ca
 * in the public domain is deemed null and void, then the software is
Packit 13e0ca
 * Copyright (c) 1998-2014 Solar Designer and it is hereby released to the
Packit 13e0ca
 * general public under the following terms:
Packit 13e0ca
 *
Packit 13e0ca
 * Redistribution and use in source and binary forms, with or without
Packit 13e0ca
 * modification, are permitted.
Packit 13e0ca
 *
Packit 13e0ca
 * There's ABSOLUTELY NO WARRANTY, express or implied.
Packit 13e0ca
 *
Packit 13e0ca
 * It is my intent that you should be able to use this on your system,
Packit 13e0ca
 * as part of a software package, or anywhere else to improve security,
Packit 13e0ca
 * ensure compatibility, or for any other purpose.  I would appreciate
Packit 13e0ca
 * it if you give credit where it is due and keep your modifications in
Packit 13e0ca
 * the public domain as well, but I don't require that in order to let
Packit 13e0ca
 * you place this code and any modifications you make under a license
Packit 13e0ca
 * of your choice.
Packit 13e0ca
 *
Packit 13e0ca
 * This implementation is fully compatible with OpenBSD's bcrypt.c for prefix
Packit 13e0ca
 * "$2b$", originally by Niels Provos <provos at citi.umich.edu>, and it uses
Packit 13e0ca
 * some of his ideas.  The password hashing algorithm was designed by David
Packit 13e0ca
 * Mazieres <dm at lcs.mit.edu>.  For information on the level of
Packit 13e0ca
 * compatibility for bcrypt hash prefixes other than "$2b$", please refer to
Packit 13e0ca
 * the comments in BF_set_key() below and to the included crypt(3) man page.
Packit 13e0ca
 *
Packit 13e0ca
 * There's a paper on the algorithm that explains its design decisions:
Packit 13e0ca
 *
Packit 13e0ca
 *      http://www.usenix.org/events/usenix99/provos.html
Packit 13e0ca
 *
Packit 13e0ca
 * Some of the tricks in BF_ROUND might be inspired by Eric Young's
Packit 13e0ca
 * Blowfish library (I can't be sure if I would think of something if I
Packit 13e0ca
 * hadn't seen his code).
Packit 13e0ca
 */
Packit 13e0ca
Packit 13e0ca
#include "crypt-port.h"
Packit 13e0ca
#include "crypt-private.h"
Packit 13e0ca
#include "byteorder.h"
Packit 13e0ca
Packit 13e0ca
#include <errno.h>
Packit 13e0ca
#include <stdio.h>
Packit 13e0ca
Packit 13e0ca
#if INCLUDE_bcrypt
Packit 13e0ca
Packit 13e0ca
#if defined(__i386__) || defined(__x86_64__) || \
Packit 13e0ca
    defined(__alpha__) || defined(__hppa__)
Packit 13e0ca
#define BF_SCALE                        1
Packit 13e0ca
#else
Packit 13e0ca
#define BF_SCALE                        0
Packit 13e0ca
#endif
Packit 13e0ca
Packit 13e0ca
typedef uint32_t BF_word;
Packit 13e0ca
typedef int32_t BF_word_signed;
Packit 13e0ca
Packit 13e0ca
/* Set the int_to_cpu function according to the system's endianness */
Packit 13e0ca
#if IS_BIGENDIAN
Packit 13e0ca
#define BF_WORD_TO_CPU(x)               be32_to_cpu (x)
Packit 13e0ca
#else
Packit 13e0ca
#define BF_WORD_TO_CPU(x)               le32_to_cpu (x)
Packit 13e0ca
#endif
Packit 13e0ca
Packit 13e0ca
/* Number of Blowfish rounds, this is also hardcoded into a few places */
Packit 13e0ca
#define BF_N                            16
Packit 13e0ca
Packit 13e0ca
typedef BF_word BF_key[BF_N + 2];
Packit 13e0ca
Packit 13e0ca
typedef struct
Packit 13e0ca
{
Packit 13e0ca
  BF_word S[4][0x100];
Packit 13e0ca
  BF_key P;
Packit 13e0ca
} BF_ctx;
Packit 13e0ca
Packit 13e0ca
/*
Packit 13e0ca
 * Magic IV for 64 Blowfish encryptions that we do at the end.
Packit 13e0ca
 * The string is "OrpheanBeholderScryDoubt" on big-endian.
Packit 13e0ca
 */
Packit 13e0ca
static const BF_word BF_magic_w[6] =
Packit 13e0ca
{
Packit 13e0ca
  0x4F727068, 0x65616E42, 0x65686F6C,
Packit 13e0ca
  0x64657253, 0x63727944, 0x6F756274
Packit 13e0ca
};
Packit 13e0ca
Packit 13e0ca
/*
Packit 13e0ca
 * P-box and S-box tables initialized with digits of Pi.
Packit 13e0ca
 */
Packit 13e0ca
static const BF_ctx BF_init_state =
Packit 13e0ca
{
Packit 13e0ca
  {
Packit 13e0ca
    {
Packit 13e0ca
      0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7,
Packit 13e0ca
      0xb8e1afed, 0x6a267e96, 0xba7c9045, 0xf12c7f99,
Packit 13e0ca
      0x24a19947, 0xb3916cf7, 0x0801f2e2, 0x858efc16,
Packit 13e0ca
      0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e,
Packit 13e0ca
      0x0d95748f, 0x728eb658, 0x718bcd58, 0x82154aee,
Packit 13e0ca
      0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013,
Packit 13e0ca
      0xc5d1b023, 0x286085f0, 0xca417918, 0xb8db38ef,
Packit 13e0ca
      0x8e79dcb0, 0x603a180e, 0x6c9e0e8b, 0xb01e8a3e,
Packit 13e0ca
      0xd71577c1, 0xbd314b27, 0x78af2fda, 0x55605c60,
Packit 13e0ca
      0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440,
Packit 13e0ca
      0x55ca396a, 0x2aab10b6, 0xb4cc5c34, 0x1141e8ce,
Packit 13e0ca
      0xa15486af, 0x7c72e993, 0xb3ee1411, 0x636fbc2a,
Packit 13e0ca
      0x2ba9c55d, 0x741831f6, 0xce5c3e16, 0x9b87931e,
Packit 13e0ca
      0xafd6ba33, 0x6c24cf5c, 0x7a325381, 0x28958677,
Packit 13e0ca
      0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193,
Packit 13e0ca
      0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032,
Packit 13e0ca
      0xef845d5d, 0xe98575b1, 0xdc262302, 0xeb651b88,
Packit 13e0ca
      0x23893e81, 0xd396acc5, 0x0f6d6ff3, 0x83f44239,
Packit 13e0ca
      0x2e0b4482, 0xa4842004, 0x69c8f04a, 0x9e1f9b5e,
Packit 13e0ca
      0x21c66842, 0xf6e96c9a, 0x670c9c61, 0xabd388f0,
Packit 13e0ca
      0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3,
Packit 13e0ca
      0x6eef0b6c, 0x137a3be4, 0xba3bf050, 0x7efb2a98,
Packit 13e0ca
      0xa1f1651d, 0x39af0176, 0x66ca593e, 0x82430e88,
Packit 13e0ca
      0x8cee8619, 0x456f9fb4, 0x7d84a5c3, 0x3b8b5ebe,
Packit 13e0ca
      0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6,
Packit 13e0ca
      0x4ed3aa62, 0x363f7706, 0x1bfedf72, 0x429b023d,
Packit 13e0ca
      0x37d0d724, 0xd00a1248, 0xdb0fead3, 0x49f1c09b,
Packit 13e0ca
      0x075372c9, 0x80991b7b, 0x25d479d8, 0xf6e8def7,
Packit 13e0ca
      0xe3fe501a, 0xb6794c3b, 0x976ce0bd, 0x04c006ba,
Packit 13e0ca
      0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463,
Packit 13e0ca
      0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f,
Packit 13e0ca
      0x6dfc511f, 0x9b30952c, 0xcc814544, 0xaf5ebd09,
Packit 13e0ca
      0xbee3d004, 0xde334afd, 0x660f2807, 0x192e4bb3,
Packit 13e0ca
      0xc0cba857, 0x45c8740f, 0xd20b5f39, 0xb9d3fbdb,
Packit 13e0ca
      0x5579c0bd, 0x1a60320a, 0xd6a100c6, 0x402c7279,
Packit 13e0ca
      0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8,
Packit 13e0ca
      0x3c7516df, 0xfd616b15, 0x2f501ec8, 0xad0552ab,
Packit 13e0ca
      0x323db5fa, 0xfd238760, 0x53317b48, 0x3e00df82,
Packit 13e0ca
      0x9e5c57bb, 0xca6f8ca0, 0x1a87562e, 0xdf1769db,
Packit 13e0ca
      0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573,
Packit 13e0ca
      0x695b27b0, 0xbbca58c8, 0xe1ffa35d, 0xb8f011a0,
Packit 13e0ca
      0x10fa3d98, 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b,
Packit 13e0ca
      0x9a53e479, 0xb6f84565, 0xd28e49bc, 0x4bfb9790,
Packit 13e0ca
      0xe1ddf2da, 0xa4cb7e33, 0x62fb1341, 0xcee4c6e8,
Packit 13e0ca
      0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4,
Packit 13e0ca
      0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0,
Packit 13e0ca
      0xd08ed1d0, 0xafc725e0, 0x8e3c5b2f, 0x8e7594b7,
Packit 13e0ca
      0x8ff6e2fb, 0xf2122b64, 0x8888b812, 0x900df01c,
Packit 13e0ca
      0x4fad5ea0, 0x688fc31c, 0xd1cff191, 0xb3a8c1ad,
Packit 13e0ca
      0x2f2f2218, 0xbe0e1777, 0xea752dfe, 0x8b021fa1,
Packit 13e0ca
      0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299,
Packit 13e0ca
      0xb4a84fe0, 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9,
Packit 13e0ca
      0x165fa266, 0x80957705, 0x93cc7314, 0x211a1477,
Packit 13e0ca
      0xe6ad2065, 0x77b5fa86, 0xc75442f5, 0xfb9d35cf,
Packit 13e0ca
      0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49,
Packit 13e0ca
      0x00250e2d, 0x2071b35e, 0x226800bb, 0x57b8e0af,
Packit 13e0ca
      0x2464369b, 0xf009b91e, 0x5563911d, 0x59dfa6aa,
Packit 13e0ca
      0x78c14389, 0xd95a537f, 0x207d5ba2, 0x02e5b9c5,
Packit 13e0ca
      0x83260376, 0x6295cfa9, 0x11c81968, 0x4e734a41,
Packit 13e0ca
      0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915,
Packit 13e0ca
      0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400,
Packit 13e0ca
      0x08ba6fb5, 0x571be91f, 0xf296ec6b, 0x2a0dd915,
Packit 13e0ca
      0xb6636521, 0xe7b9f9b6, 0xff34052e, 0xc5855664,
Packit 13e0ca
      0x53b02d5d, 0xa99f8fa1, 0x08ba4799, 0x6e85076a
Packit 13e0ca
    },
Packit 13e0ca
    {
Packit 13e0ca
      0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623,
Packit 13e0ca
      0xad6ea6b0, 0x49a7df7d, 0x9cee60b8, 0x8fedb266,
Packit 13e0ca
      0xecaa8c71, 0x699a17ff, 0x5664526c, 0xc2b19ee1,
Packit 13e0ca
      0x193602a5, 0x75094c29, 0xa0591340, 0xe4183a3e,
Packit 13e0ca
      0x3f54989a, 0x5b429d65, 0x6b8fe4d6, 0x99f73fd6,
Packit 13e0ca
      0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1,
Packit 13e0ca
      0x4cdd2086, 0x8470eb26, 0x6382e9c6, 0x021ecc5e,
Packit 13e0ca
      0x09686b3f, 0x3ebaefc9, 0x3c971814, 0x6b6a70a1,
Packit 13e0ca
      0x687f3584, 0x52a0e286, 0xb79c5305, 0xaa500737,
Packit 13e0ca
      0x3e07841c, 0x7fdeae5c, 0x8e7d44ec, 0x5716f2b8,
Packit 13e0ca
      0xb03ada37, 0xf0500c0d, 0xf01c1f04, 0x0200b3ff,
Packit 13e0ca
      0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd,
Packit 13e0ca
      0xd19113f9, 0x7ca92ff6, 0x94324773, 0x22f54701,
Packit 13e0ca
      0x3ae5e581, 0x37c2dadc, 0xc8b57634, 0x9af3dda7,
Packit 13e0ca
      0xa9446146, 0x0fd0030e, 0xecc8c73e, 0xa4751e41,
Packit 13e0ca
      0xe238cd99, 0x3bea0e2f, 0x3280bba1, 0x183eb331,
Packit 13e0ca
      0x4e548b38, 0x4f6db908, 0x6f420d03, 0xf60a04bf,
Packit 13e0ca
      0x2cb81290, 0x24977c79, 0x5679b072, 0xbcaf89af,
Packit 13e0ca
      0xde9a771f, 0xd9930810, 0xb38bae12, 0xdccf3f2e,
Packit 13e0ca
      0x5512721f, 0x2e6b7124, 0x501adde6, 0x9f84cd87,
Packit 13e0ca
      0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c,
Packit 13e0ca
      0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2,
Packit 13e0ca
      0xef1c1847, 0x3215d908, 0xdd433b37, 0x24c2ba16,
Packit 13e0ca
      0x12a14d43, 0x2a65c451, 0x50940002, 0x133ae4dd,
Packit 13e0ca
      0x71dff89e, 0x10314e55, 0x81ac77d6, 0x5f11199b,
Packit 13e0ca
      0x043556f1, 0xd7a3c76b, 0x3c11183b, 0x5924a509,
Packit 13e0ca
      0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e,
Packit 13e0ca
      0x86e34570, 0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3,
Packit 13e0ca
      0x771fe71c, 0x4e3d06fa, 0x2965dcb9, 0x99e71d0f,
Packit 13e0ca
      0x803e89d6, 0x5266c825, 0x2e4cc978, 0x9c10b36a,
Packit 13e0ca
      0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4,
Packit 13e0ca
      0xf2f74ea7, 0x361d2b3d, 0x1939260f, 0x19c27960,
Packit 13e0ca
      0x5223a708, 0xf71312b6, 0xebadfe6e, 0xeac31f66,
Packit 13e0ca
      0xe3bc4595, 0xa67bc883, 0xb17f37d1, 0x018cff28,
Packit 13e0ca
      0xc332ddef, 0xbe6c5aa5, 0x65582185, 0x68ab9802,
Packit 13e0ca
      0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84,
Packit 13e0ca
      0x1521b628, 0x29076170, 0xecdd4775, 0x619f1510,
Packit 13e0ca
      0x13cca830, 0xeb61bd96, 0x0334fe1e, 0xaa0363cf,
Packit 13e0ca
      0xb5735c90, 0x4c70a239, 0xd59e9e0b, 0xcbaade14,
Packit 13e0ca
      0xeecc86bc, 0x60622ca7, 0x9cab5cab, 0xb2f3846e,
Packit 13e0ca
      0x648b1eaf, 0x19bdf0ca, 0xa02369b9, 0x655abb50,
Packit 13e0ca
      0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7,
Packit 13e0ca
      0x9b540b19, 0x875fa099, 0x95f7997e, 0x623d7da8,
Packit 13e0ca
      0xf837889a, 0x97e32d77, 0x11ed935f, 0x16681281,
Packit 13e0ca
      0x0e358829, 0xc7e61fd6, 0x96dedfa1, 0x7858ba99,
Packit 13e0ca
      0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1ac24696,
Packit 13e0ca
      0xcdb30aeb, 0x532e3054, 0x8fd948e4, 0x6dbc3128,
Packit 13e0ca
      0x58ebf2ef, 0x34c6ffea, 0xfe28ed61, 0xee7c3c73,
Packit 13e0ca
      0x5d4a14d9, 0xe864b7e3, 0x42105d14, 0x203e13e0,
Packit 13e0ca
      0x45eee2b6, 0xa3aaabea, 0xdb6c4f15, 0xfacb4fd0,
Packit 13e0ca
      0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105,
Packit 13e0ca
      0xd81e799e, 0x86854dc7, 0xe44b476a, 0x3d816250,
Packit 13e0ca
      0xcf62a1f2, 0x5b8d2646, 0xfc8883a0, 0xc1c7b6a3,
Packit 13e0ca
      0x7f1524c3, 0x69cb7492, 0x47848a0b, 0x5692b285,
Packit 13e0ca
      0x095bbf00, 0xad19489d, 0x1462b174, 0x23820e00,
Packit 13e0ca
      0x58428d2a, 0x0c55f5ea, 0x1dadf43e, 0x233f7061,
Packit 13e0ca
      0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb,
Packit 13e0ca
      0x7cde3759, 0xcbee7460, 0x4085f2a7, 0xce77326e,
Packit 13e0ca
      0xa6078084, 0x19f8509e, 0xe8efd855, 0x61d99735,
Packit 13e0ca
      0xa969a7aa, 0xc50c06c2, 0x5a04abfc, 0x800bcadc,
Packit 13e0ca
      0x9e447a2e, 0xc3453484, 0xfdd56705, 0x0e1e9ec9,
Packit 13e0ca
      0xdb73dbd3, 0x105588cd, 0x675fda79, 0xe3674340,
Packit 13e0ca
      0xc5c43465, 0x713e38d8, 0x3d28f89e, 0xf16dff20,
Packit 13e0ca
      0x153e21e7, 0x8fb03d4a, 0xe6e39f2b, 0xdb83adf7
Packit 13e0ca
    },
Packit 13e0ca
    {
Packit 13e0ca
      0xe93d5a68, 0x948140f7, 0xf64c261c, 0x94692934,
Packit 13e0ca
      0x411520f7, 0x7602d4f7, 0xbcf46b2e, 0xd4a20068,
Packit 13e0ca
      0xd4082471, 0x3320f46a, 0x43b7d4b7, 0x500061af,
Packit 13e0ca
      0x1e39f62e, 0x97244546, 0x14214f74, 0xbf8b8840,
Packit 13e0ca
      0x4d95fc1d, 0x96b591af, 0x70f4ddd3, 0x66a02f45,
Packit 13e0ca
      0xbfbc09ec, 0x03bd9785, 0x7fac6dd0, 0x31cb8504,
Packit 13e0ca
      0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a,
Packit 13e0ca
      0x28507825, 0x530429f4, 0x0a2c86da, 0xe9b66dfb,
Packit 13e0ca
      0x68dc1462, 0xd7486900, 0x680ec0a4, 0x27a18dee,
Packit 13e0ca
      0x4f3ffea2, 0xe887ad8c, 0xb58ce006, 0x7af4d6b6,
Packit 13e0ca
      0xaace1e7c, 0xd3375fec, 0xce78a399, 0x406b2a42,
Packit 13e0ca
      0x20fe9e35, 0xd9f385b9, 0xee39d7ab, 0x3b124e8b,
Packit 13e0ca
      0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2,
Packit 13e0ca
      0x3a6efa74, 0xdd5b4332, 0x6841e7f7, 0xca7820fb,
Packit 13e0ca
      0xfb0af54e, 0xd8feb397, 0x454056ac, 0xba489527,
Packit 13e0ca
      0x55533a3a, 0x20838d87, 0xfe6ba9b7, 0xd096954b,
Packit 13e0ca
      0x55a867bc, 0xa1159a58, 0xcca92963, 0x99e1db33,
Packit 13e0ca
      0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c,
Packit 13e0ca
      0xfdf8e802, 0x04272f70, 0x80bb155c, 0x05282ce3,
Packit 13e0ca
      0x95c11548, 0xe4c66d22, 0x48c1133f, 0xc70f86dc,
Packit 13e0ca
      0x07f9c9ee, 0x41041f0f, 0x404779a4, 0x5d886e17,
Packit 13e0ca
      0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564,
Packit 13e0ca
      0x257b7834, 0x602a9c60, 0xdff8e8a3, 0x1f636c1b,
Packit 13e0ca
      0x0e12b4c2, 0x02e1329e, 0xaf664fd1, 0xcad18115,
Packit 13e0ca
      0x6b2395e0, 0x333e92e1, 0x3b240b62, 0xeebeb922,
Packit 13e0ca
      0x85b2a20e, 0xe6ba0d99, 0xde720c8c, 0x2da2f728,
Packit 13e0ca
      0xd0127845, 0x95b794fd, 0x647d0862, 0xe7ccf5f0,
Packit 13e0ca
      0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e,
Packit 13e0ca
      0x0a476341, 0x992eff74, 0x3a6f6eab, 0xf4f8fd37,
Packit 13e0ca
      0xa812dc60, 0xa1ebddf8, 0x991be14c, 0xdb6e6b0d,
Packit 13e0ca
      0xc67b5510, 0x6d672c37, 0x2765d43b, 0xdcd0e804,
Packit 13e0ca
      0xf1290dc7, 0xcc00ffa3, 0xb5390f92, 0x690fed0b,
Packit 13e0ca
      0x667b9ffb, 0xcedb7d9c, 0xa091cf0b, 0xd9155ea3,
Packit 13e0ca
      0xbb132f88, 0x515bad24, 0x7b9479bf, 0x763bd6eb,
Packit 13e0ca
      0x37392eb3, 0xcc115979, 0x8026e297, 0xf42e312d,
Packit 13e0ca
      0x6842ada7, 0xc66a2b3b, 0x12754ccc, 0x782ef11c,
Packit 13e0ca
      0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350,
Packit 13e0ca
      0x1a6b1018, 0x11caedfa, 0x3d25bdd8, 0xe2e1c3c9,
Packit 13e0ca
      0x44421659, 0x0a121386, 0xd90cec6e, 0xd5abea2a,
Packit 13e0ca
      0x64af674e, 0xda86a85f, 0xbebfe988, 0x64e4c3fe,
Packit 13e0ca
      0x9dbc8057, 0xf0f7c086, 0x60787bf8, 0x6003604d,
Packit 13e0ca
      0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc,
Packit 13e0ca
      0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f,
Packit 13e0ca
      0x77a057be, 0xbde8ae24, 0x55464299, 0xbf582e61,
Packit 13e0ca
      0x4e58f48f, 0xf2ddfda2, 0xf474ef38, 0x8789bdc2,
Packit 13e0ca
      0x5366f9c3, 0xc8b38e74, 0xb475f255, 0x46fcd9b9,
Packit 13e0ca
      0x7aeb2661, 0x8b1ddf84, 0x846a0e79, 0x915f95e2,
Packit 13e0ca
      0x466e598e, 0x20b45770, 0x8cd55591, 0xc902de4c,
Packit 13e0ca
      0xb90bace1, 0xbb8205d0, 0x11a86248, 0x7574a99e,
Packit 13e0ca
      0xb77f19b6, 0xe0a9dc09, 0x662d09a1, 0xc4324633,
Packit 13e0ca
      0xe85a1f02, 0x09f0be8c, 0x4a99a025, 0x1d6efe10,
Packit 13e0ca
      0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169,
Packit 13e0ca
      0xdcb7da83, 0x573906fe, 0xa1e2ce9b, 0x4fcd7f52,
Packit 13e0ca
      0x50115e01, 0xa70683fa, 0xa002b5c4, 0x0de6d027,
Packit 13e0ca
      0x9af88c27, 0x773f8641, 0xc3604c06, 0x61a806b5,
Packit 13e0ca
      0xf0177a28, 0xc0f586e0, 0x006058aa, 0x30dc7d62,
Packit 13e0ca
      0x11e69ed7, 0x2338ea63, 0x53c2dd94, 0xc2c21634,
Packit 13e0ca
      0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76,
Packit 13e0ca
      0x6f05e409, 0x4b7c0188, 0x39720a3d, 0x7c927c24,
Packit 13e0ca
      0x86e3725f, 0x724d9db9, 0x1ac15bb4, 0xd39eb8fc,
Packit 13e0ca
      0xed545578, 0x08fca5b5, 0xd83d7cd3, 0x4dad0fc4,
Packit 13e0ca
      0x1e50ef5e, 0xb161e6f8, 0xa28514d9, 0x6c51133c,
Packit 13e0ca
      0x6fd5c7e7, 0x56e14ec4, 0x362abfce, 0xddc6c837,
Packit 13e0ca
      0xd79a3234, 0x92638212, 0x670efa8e, 0x406000e0
Packit 13e0ca
    },
Packit 13e0ca
    {
Packit 13e0ca
      0x3a39ce37, 0xd3faf5cf, 0xabc27737, 0x5ac52d1b,
Packit 13e0ca
      0x5cb0679e, 0x4fa33742, 0xd3822740, 0x99bc9bbe,
Packit 13e0ca
      0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b,
Packit 13e0ca
      0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4,
Packit 13e0ca
      0x5748ab2f, 0xbc946e79, 0xc6a376d2, 0x6549c2c8,
Packit 13e0ca
      0x530ff8ee, 0x468dde7d, 0xd5730a1d, 0x4cd04dc6,
Packit 13e0ca
      0x2939bbdb, 0xa9ba4650, 0xac9526e8, 0xbe5ee304,
Packit 13e0ca
      0xa1fad5f0, 0x6a2d519a, 0x63ef8ce2, 0x9a86ee22,
Packit 13e0ca
      0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4,
Packit 13e0ca
      0x83c061ba, 0x9be96a4d, 0x8fe51550, 0xba645bd6,
Packit 13e0ca
      0x2826a2f9, 0xa73a3ae1, 0x4ba99586, 0xef5562e9,
Packit 13e0ca
      0xc72fefd3, 0xf752f7da, 0x3f046f69, 0x77fa0a59,
Packit 13e0ca
      0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593,
Packit 13e0ca
      0xe990fd5a, 0x9e34d797, 0x2cf0b7d9, 0x022b8b51,
Packit 13e0ca
      0x96d5ac3a, 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28,
Packit 13e0ca
      0x1f9f25cf, 0xadf2b89b, 0x5ad6b472, 0x5a88f54c,
Packit 13e0ca
      0xe029ac71, 0xe019a5e6, 0x47b0acfd, 0xed93fa9b,
Packit 13e0ca
      0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28,
Packit 13e0ca
      0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c,
Packit 13e0ca
      0x15056dd4, 0x88f46dba, 0x03a16125, 0x0564f0bd,
Packit 13e0ca
      0xc3eb9e15, 0x3c9057a2, 0x97271aec, 0xa93a072a,
Packit 13e0ca
      0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319,
Packit 13e0ca
      0x7533d928, 0xb155fdf5, 0x03563482, 0x8aba3cbb,
Packit 13e0ca
      0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f,
Packit 13e0ca
      0x4de81751, 0x3830dc8e, 0x379d5862, 0x9320f991,
Packit 13e0ca
      0xea7a90c2, 0xfb3e7bce, 0x5121ce64, 0x774fbe32,
Packit 13e0ca
      0xa8b6e37e, 0xc3293d46, 0x48de5369, 0x6413e680,
Packit 13e0ca
      0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166,
Packit 13e0ca
      0xb39a460a, 0x6445c0dd, 0x586cdecf, 0x1c20c8ae,
Packit 13e0ca
      0x5bbef7dd, 0x1b588d40, 0xccd2017f, 0x6bb4e3bb,
Packit 13e0ca
      0xdda26a7e, 0x3a59ff45, 0x3e350a44, 0xbcb4cdd5,
Packit 13e0ca
      0x72eacea8, 0xfa6484bb, 0x8d6612ae, 0xbf3c6f47,
Packit 13e0ca
      0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370,
Packit 13e0ca
      0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d,
Packit 13e0ca
      0x4040cb08, 0x4eb4e2cc, 0x34d2466a, 0x0115af84,
Packit 13e0ca
      0xe1b00428, 0x95983a1d, 0x06b89fb4, 0xce6ea048,
Packit 13e0ca
      0x6f3f3b82, 0x3520ab82, 0x011a1d4b, 0x277227f8,
Packit 13e0ca
      0x611560b1, 0xe7933fdc, 0xbb3a792b, 0x344525bd,
Packit 13e0ca
      0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9,
Packit 13e0ca
      0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7,
Packit 13e0ca
      0x1a908749, 0xd44fbd9a, 0xd0dadecb, 0xd50ada38,
Packit 13e0ca
      0x0339c32a, 0xc6913667, 0x8df9317c, 0xe0b12b4f,
Packit 13e0ca
      0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c,
Packit 13e0ca
      0xbf97222c, 0x15e6fc2a, 0x0f91fc71, 0x9b941525,
Packit 13e0ca
      0xfae59361, 0xceb69ceb, 0xc2a86459, 0x12baa8d1,
Packit 13e0ca
      0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a442,
Packit 13e0ca
      0xe0ec6e0e, 0x1698db3b, 0x4c98a0be, 0x3278e964,
Packit 13e0ca
      0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e,
Packit 13e0ca
      0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8,
Packit 13e0ca
      0xdf359f8d, 0x9b992f2e, 0xe60b6f47, 0x0fe3f11d,
Packit 13e0ca
      0xe54cda54, 0x1edad891, 0xce6279cf, 0xcd3e7e6f,
Packit 13e0ca
      0x1618b166, 0xfd2c1d05, 0x848fd2c5, 0xf6fb2299,
Packit 13e0ca
      0xf523f357, 0xa6327623, 0x93a83531, 0x56cccd02,
Packit 13e0ca
      0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc,
Packit 13e0ca
      0xde966292, 0x81b949d0, 0x4c50901b, 0x71c65614,
Packit 13e0ca
      0xe6c6c7bd, 0x327a140a, 0x45e1d006, 0xc3f27b9a,
Packit 13e0ca
      0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, 0x35bdd2f6,
Packit 13e0ca
      0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b,
Packit 13e0ca
      0x53113ec0, 0x1640e3d3, 0x38abbd60, 0x2547adf0,
Packit 13e0ca
      0xba38209c, 0xf746ce76, 0x77afa1c5, 0x20756060,
Packit 13e0ca
      0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, 0x4cf9aa7e,
Packit 13e0ca
      0x1948c25c, 0x02fb8a8c, 0x01c36ae4, 0xd6ebe1f9,
Packit 13e0ca
      0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f,
Packit 13e0ca
      0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6
Packit 13e0ca
    }
Packit 13e0ca
  },
Packit 13e0ca
  {
Packit 13e0ca
    0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344,
Packit 13e0ca
    0xa4093822, 0x299f31d0, 0x082efa98, 0xec4e6c89,
Packit 13e0ca
    0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c,
Packit 13e0ca
    0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917,
Packit 13e0ca
    0x9216d5d9, 0x8979fb1b
Packit 13e0ca
  }
Packit 13e0ca
};
Packit 13e0ca
Packit 13e0ca
static const unsigned char BF_itoa64[64 + 1] =
Packit 13e0ca
  "./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
Packit 13e0ca
Packit 13e0ca
static const unsigned char BF_atoi64[0x60] =
Packit 13e0ca
{
Packit 13e0ca
  64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 0, 1,
Packit 13e0ca
  54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 64, 64, 64, 64, 64,
Packit 13e0ca
  64, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
Packit 13e0ca
  17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 64, 64, 64, 64, 64,
Packit 13e0ca
  64, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42,
Packit 13e0ca
  43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 64, 64, 64, 64, 64
Packit 13e0ca
};
Packit 13e0ca
Packit 13e0ca
#define BF_safe_atoi64(dst, src) \
Packit 13e0ca
{ \
Packit 13e0ca
        tmp = (unsigned char)(src); \
Packit 13e0ca
        if ((unsigned int)(tmp -= 0x20) >= 0x60) return -1; \
Packit 13e0ca
        tmp = BF_atoi64[tmp]; \
Packit 13e0ca
        if (tmp > 63) return -1; \
Packit 13e0ca
        (dst) = tmp; \
Packit 13e0ca
}
Packit 13e0ca
Packit 13e0ca
static int
Packit 13e0ca
BF_decode (BF_word * dst, const char *src, int size)
Packit 13e0ca
{
Packit 13e0ca
  unsigned char *dptr = (unsigned char *) dst;
Packit 13e0ca
  unsigned char *end = dptr + size;
Packit 13e0ca
  const unsigned char *sptr = (const unsigned char *) src;
Packit 13e0ca
  unsigned int tmp, c1, c2, c3, c4;
Packit 13e0ca
Packit 13e0ca
  do
Packit 13e0ca
    {
Packit 13e0ca
      BF_safe_atoi64 (c1, *sptr++);
Packit 13e0ca
      BF_safe_atoi64 (c2, *sptr++);
Packit 13e0ca
      *dptr++ = (unsigned char)((c1 << 2) | ((c2 & 0x30) >> 4));
Packit 13e0ca
      if (dptr >= end)
Packit 13e0ca
        break;
Packit 13e0ca
Packit 13e0ca
      BF_safe_atoi64 (c3, *sptr++);
Packit 13e0ca
      *dptr++ = (unsigned char)(((c2 & 0x0F) << 4) | ((c3 & 0x3C) >> 2));
Packit 13e0ca
      if (dptr >= end)
Packit 13e0ca
        break;
Packit 13e0ca
Packit 13e0ca
      BF_safe_atoi64 (c4, *sptr++);
Packit 13e0ca
      *dptr++ = (unsigned char)(((c3 & 0x03) << 6) | c4);
Packit 13e0ca
    }
Packit 13e0ca
  while (dptr < end);
Packit 13e0ca
Packit 13e0ca
  return 0;
Packit 13e0ca
}
Packit 13e0ca
Packit 13e0ca
static void
Packit 13e0ca
BF_encode (unsigned char *dst, const BF_word * src, int size)
Packit 13e0ca
{
Packit 13e0ca
  const unsigned char *sptr = (const unsigned char *) src;
Packit 13e0ca
  const unsigned char *end = sptr + size;
Packit 13e0ca
  unsigned char *dptr = dst;
Packit 13e0ca
  unsigned int c1, c2;
Packit 13e0ca
Packit 13e0ca
  do
Packit 13e0ca
    {
Packit 13e0ca
      c1 = *sptr++;
Packit 13e0ca
      *dptr++ = BF_itoa64[c1 >> 2];
Packit 13e0ca
      c1 = (c1 & 0x03) << 4;
Packit 13e0ca
      if (sptr >= end)
Packit 13e0ca
        {
Packit 13e0ca
          *dptr++ = BF_itoa64[c1];
Packit 13e0ca
          break;
Packit 13e0ca
        }
Packit 13e0ca
Packit 13e0ca
      c2 = *sptr++;
Packit 13e0ca
      c1 |= c2 >> 4;
Packit 13e0ca
      *dptr++ = BF_itoa64[c1];
Packit 13e0ca
      c1 = (c2 & 0x0f) << 2;
Packit 13e0ca
      if (sptr >= end)
Packit 13e0ca
        {
Packit 13e0ca
          *dptr++ = BF_itoa64[c1];
Packit 13e0ca
          break;
Packit 13e0ca
        }
Packit 13e0ca
Packit 13e0ca
      c2 = *sptr++;
Packit 13e0ca
      c1 |= c2 >> 6;
Packit 13e0ca
      *dptr++ = BF_itoa64[c1];
Packit 13e0ca
      *dptr++ = BF_itoa64[c2 & 0x3f];
Packit 13e0ca
    }
Packit 13e0ca
  while (sptr < end);
Packit 13e0ca
}
Packit 13e0ca
Packit 13e0ca
#if IS_BIGENDIAN
Packit 13e0ca
static void
Packit 13e0ca
BF_swap (ARG_UNUSED(BF_word * x), ARG_UNUSED(int count))
Packit 13e0ca
{
Packit 13e0ca
}
Packit 13e0ca
#else
Packit 13e0ca
static void
Packit 13e0ca
BF_swap (BF_word * x, int count)
Packit 13e0ca
{
Packit 13e0ca
  BF_word tmp;
Packit 13e0ca
Packit 13e0ca
  do
Packit 13e0ca
    {
Packit 13e0ca
      tmp = *x;
Packit 13e0ca
      tmp = (tmp << 16) | (tmp >> 16);
Packit 13e0ca
      *x++ = ((tmp & 0x00FF00FF) << 8) | ((tmp >> 8) & 0x00FF00FF);
Packit 13e0ca
    }
Packit 13e0ca
  while (--count);
Packit 13e0ca
}
Packit 13e0ca
#endif
Packit 13e0ca
Packit 13e0ca
#if BF_SCALE
Packit 13e0ca
/* Architectures which can shift addresses left by 2 bits with no extra cost */
Packit 13e0ca
#define BF_ROUND(L, R, N) \
Packit 13e0ca
        tmp1 = L & 0xFF; \
Packit 13e0ca
        tmp2 = L >> 8; \
Packit 13e0ca
        tmp2 &= 0xFF; \
Packit 13e0ca
        tmp3 = L >> 16; \
Packit 13e0ca
        tmp3 &= 0xFF; \
Packit 13e0ca
        tmp4 = L >> 24; \
Packit 13e0ca
        tmp1 = data->ctx.S[3][tmp1]; \
Packit 13e0ca
        tmp2 = data->ctx.S[2][tmp2]; \
Packit 13e0ca
        tmp3 = data->ctx.S[1][tmp3]; \
Packit 13e0ca
        tmp3 += data->ctx.S[0][tmp4]; \
Packit 13e0ca
        tmp3 ^= tmp2; \
Packit 13e0ca
        R ^= data->ctx.P[N + 1]; \
Packit 13e0ca
        tmp3 += tmp1; \
Packit 13e0ca
        R ^= tmp3;
Packit 13e0ca
#else
Packit 13e0ca
/* Architectures with no complicated addressing modes supported */
Packit 13e0ca
#define BF_INDEX(S, i) \
Packit 13e0ca
        BF_WORD_TO_CPU((((unsigned char *)S) + i))
Packit 13e0ca
#define BF_ROUND(L, R, N) \
Packit 13e0ca
        tmp1 = L & 0xFF; \
Packit 13e0ca
        tmp1 <<= 2; \
Packit 13e0ca
        tmp2 = L >> 6; \
Packit 13e0ca
        tmp2 &= 0x3FC; \
Packit 13e0ca
        tmp3 = L >> 14; \
Packit 13e0ca
        tmp3 &= 0x3FC; \
Packit 13e0ca
        tmp4 = L >> 22; \
Packit 13e0ca
        tmp4 &= 0x3FC; \
Packit 13e0ca
        tmp1 = BF_INDEX(data->ctx.S[3], tmp1); \
Packit 13e0ca
        tmp2 = BF_INDEX(data->ctx.S[2], tmp2); \
Packit 13e0ca
        tmp3 = BF_INDEX(data->ctx.S[1], tmp3); \
Packit 13e0ca
        tmp3 += BF_INDEX(data->ctx.S[0], tmp4); \
Packit 13e0ca
        tmp3 ^= tmp2; \
Packit 13e0ca
        R ^= data->ctx.P[N + 1]; \
Packit 13e0ca
        tmp3 += tmp1; \
Packit 13e0ca
        R ^= tmp3;
Packit 13e0ca
#endif
Packit 13e0ca
Packit 13e0ca
/*
Packit 13e0ca
 * Encrypt one block, BF_N is hardcoded here.
Packit 13e0ca
 */
Packit 13e0ca
#define BF_ENCRYPT \
Packit 13e0ca
        L ^= data->ctx.P[0]; \
Packit 13e0ca
        BF_ROUND(L, R, 0); \
Packit 13e0ca
        BF_ROUND(R, L, 1); \
Packit 13e0ca
        BF_ROUND(L, R, 2); \
Packit 13e0ca
        BF_ROUND(R, L, 3); \
Packit 13e0ca
        BF_ROUND(L, R, 4); \
Packit 13e0ca
        BF_ROUND(R, L, 5); \
Packit 13e0ca
        BF_ROUND(L, R, 6); \
Packit 13e0ca
        BF_ROUND(R, L, 7); \
Packit 13e0ca
        BF_ROUND(L, R, 8); \
Packit 13e0ca
        BF_ROUND(R, L, 9); \
Packit 13e0ca
        BF_ROUND(L, R, 10); \
Packit 13e0ca
        BF_ROUND(R, L, 11); \
Packit 13e0ca
        BF_ROUND(L, R, 12); \
Packit 13e0ca
        BF_ROUND(R, L, 13); \
Packit 13e0ca
        BF_ROUND(L, R, 14); \
Packit 13e0ca
        BF_ROUND(R, L, 15); \
Packit 13e0ca
        tmp4 = R; \
Packit 13e0ca
        R = L; \
Packit 13e0ca
        L = tmp4 ^ data->ctx.P[BF_N + 1];
Packit 13e0ca
Packit 13e0ca
#define BF_body() \
Packit 13e0ca
        L = R = 0; \
Packit 13e0ca
        ptr = data->ctx.P; \
Packit 13e0ca
        do { \
Packit 13e0ca
                ptr += 2; \
Packit 13e0ca
                BF_ENCRYPT; \
Packit 13e0ca
                *(ptr - 2) = L; \
Packit 13e0ca
                *(ptr - 1) = R; \
Packit 13e0ca
        } while (ptr < &data->ctx.P[BF_N + 2]); \
Packit 13e0ca
\
Packit 13e0ca
        ptr = data->ctx.S[0]; \
Packit 13e0ca
        do { \
Packit 13e0ca
                ptr += 2; \
Packit 13e0ca
                BF_ENCRYPT; \
Packit 13e0ca
                *(ptr - 2) = L; \
Packit 13e0ca
                *(ptr - 1) = R; \
Packit 13e0ca
        } while (ptr < &data->ctx.S[3][0xFF]);
Packit 13e0ca
Packit 13e0ca
static void
Packit 13e0ca
BF_set_key (const char *key, BF_key expanded, BF_key initial,
Packit 13e0ca
            unsigned char flags)
Packit 13e0ca
{
Packit 13e0ca
  const char *ptr = key;
Packit 13e0ca
  unsigned int bug, i, j;
Packit 13e0ca
  BF_word safety, sign, diff, tmp[2];
Packit 13e0ca
  BF_word_signed stmp;
Packit 13e0ca
Packit 13e0ca
  /*
Packit 13e0ca
   * There was a sign extension bug in older revisions of this function.  While
Packit 13e0ca
   * we would have liked to simply fix the bug and move on, we have to provide
Packit 13e0ca
   * a backwards compatibility feature (essentially the bug) for some systems and
Packit 13e0ca
   * a safety measure for some others.  The latter is needed because for certain
Packit 13e0ca
   * multiple inputs to the buggy algorithm there exist easily found inputs to
Packit 13e0ca
   * the correct algorithm that produce the same hash.  Thus, we optionally
Packit 13e0ca
   * deviate from the correct algorithm just enough to avoid such collisions.
Packit 13e0ca
   * While the bug itself affected the majority of passwords containing
Packit 13e0ca
   * characters with the 8th bit set (although only a percentage of those in a
Packit 13e0ca
   * collision-producing way), the anti-collision safety measure affects
Packit 13e0ca
   * only a subset of passwords containing the '\xff' character (not even all of
Packit 13e0ca
   * those passwords, just some of them).  This character is not found in valid
Packit 13e0ca
   * UTF-8 sequences and is rarely used in popular 8-bit character encodings.
Packit 13e0ca
   * Thus, the safety measure is unlikely to cause much annoyance, and is a
Packit 13e0ca
   * reasonable tradeoff to use when authenticating against existing hashes that
Packit 13e0ca
   * are not reliably known to have been computed with the correct algorithm.
Packit 13e0ca
   *
Packit 13e0ca
   * We use an approach that tries to minimize side-channel leaks of password
Packit 13e0ca
   * information - that is, we mostly use fixed-cost bitwise operations instead
Packit 13e0ca
   * of branches or table lookups.  (One conditional branch based on password
Packit 13e0ca
   * length remains.  It is not part of the bug aftermath, though, and is
Packit 13e0ca
   * difficult and possibly unreasonable to avoid given the use of C strings by
Packit 13e0ca
   * the caller, which results in similar timing leaks anyway.)
Packit 13e0ca
   *
Packit 13e0ca
   * For actual implementation, we set an array index in the variable "bug"
Packit 13e0ca
   * (0 means no bug, 1 means sign extension bug emulation) and a flag in the
Packit 13e0ca
   * variable "safety" (bit 16 is set when the safety measure is requested).
Packit 13e0ca
   * Valid combinations of settings are:
Packit 13e0ca
   *
Packit 13e0ca
   * Prefix "$2a$": bug = 0, safety = 0x10000
Packit 13e0ca
   * Prefix "$2b$": bug = 0, safety = 0
Packit 13e0ca
   * Prefix "$2x$": bug = 1, safety = 0
Packit 13e0ca
   * Prefix "$2y$": bug = 0, safety = 0
Packit 13e0ca
   */
Packit 13e0ca
  bug = (unsigned int) flags & 1;
Packit 13e0ca
  safety = ((BF_word) flags & 2) << 15;
Packit 13e0ca
Packit 13e0ca
  sign = diff = 0;
Packit 13e0ca
Packit 13e0ca
  for (i = 0; i < BF_N + 2; i++)
Packit 13e0ca
    {
Packit 13e0ca
      tmp[0] = tmp[1] = 0;
Packit 13e0ca
      for (j = 0; j < 4; j++)
Packit 13e0ca
        {
Packit 13e0ca
          tmp[0] <<= 8;
Packit 13e0ca
          tmp[0] |= (unsigned char) *ptr;       /* correct */
Packit 13e0ca
          tmp[1] <<= 8;
Packit 13e0ca
          stmp = (BF_word_signed) (signed char) *ptr; /* bug */
Packit 13e0ca
          tmp[1] |= (BF_word) stmp; /* two steps avoid GCC 6 spurious warning */
Packit 13e0ca
          /*
Packit 13e0ca
           * Sign extension in the first char has no effect - nothing to overwrite yet,
Packit 13e0ca
           * and those extra 24 bits will be fully shifted out of the 32-bit word.  For
Packit 13e0ca
           * chars 2, 3, 4 in each four-char block, we set bit 7 of "sign" if sign
Packit 13e0ca
           * extension in tmp[1] occurs.  Once this flag is set, it remains set.
Packit 13e0ca
           */
Packit 13e0ca
          if (j)
Packit 13e0ca
            sign |= tmp[1] & 0x80;
Packit 13e0ca
          if (!*ptr)
Packit 13e0ca
            ptr = key;
Packit 13e0ca
          else
Packit 13e0ca
            ptr++;
Packit 13e0ca
        }
Packit 13e0ca
      diff |= tmp[0] ^ tmp[1];  /* Non-zero on any differences */
Packit 13e0ca
Packit 13e0ca
      expanded[i] = tmp[bug];
Packit 13e0ca
      initial[i] = BF_init_state.P[i] ^ tmp[bug];
Packit 13e0ca
    }
Packit 13e0ca
Packit 13e0ca
  /*
Packit 13e0ca
   * At this point, "diff" is zero iff the correct and buggy algorithms produced
Packit 13e0ca
   * exactly the same result.  If so and if "sign" is non-zero, which indicates
Packit 13e0ca
   * that there was a non-benign sign extension, this means that we have a
Packit 13e0ca
   * collision between the correctly computed hash for this password and a set of
Packit 13e0ca
   * passwords that could be supplied to the buggy algorithm.  Our safety measure
Packit 13e0ca
   * is meant to protect from such many-buggy to one-correct collisions, by
Packit 13e0ca
   * deviating from the correct algorithm in such cases.  Let's check for this.
Packit 13e0ca
   */
Packit 13e0ca
  diff |= diff >> 16;     /* still zero iff exact match */
Packit 13e0ca
  diff &= 0xffff;         /* ditto */
Packit 13e0ca
  diff += 0xffff;         /* bit 16 set iff "diff" was non-zero (on non-match) */
Packit 13e0ca
  sign <<= 9;             /* move the non-benign sign extension flag to bit 16 */
Packit 13e0ca
  sign &= ~diff & safety; /* action needed? */
Packit 13e0ca
Packit 13e0ca
  /*
Packit 13e0ca
   * If we have determined that we need to deviate from the correct algorithm,
Packit 13e0ca
   * flip bit 16 in initial expanded key.  (The choice of 16 is arbitrary, but
Packit 13e0ca
   * let's stick to it now.  It came out of the approach we used above, and it's
Packit 13e0ca
   * not any worse than any other choice we could make.)
Packit 13e0ca
   *
Packit 13e0ca
   * It is crucial that we don't do the same to the expanded key used in the main
Packit 13e0ca
   * Eksblowfish loop.  By doing it to only one of these two, we deviate from a
Packit 13e0ca
   * state that could be directly specified by a password to the buggy algorithm
Packit 13e0ca
   * (and to the fully correct one as well, but that's a side-effect).
Packit 13e0ca
   */
Packit 13e0ca
  initial[0] ^= sign;
Packit 13e0ca
}
Packit 13e0ca
Packit 13e0ca
static const unsigned char flags_by_subtype[26] =
Packit 13e0ca
{
Packit 13e0ca
  2, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
Packit 13e0ca
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 4, 0
Packit 13e0ca
};
Packit 13e0ca
Packit 13e0ca
/* prefix: $2z$00$ = 7 chars
Packit 13e0ca
     (where z = a, b, x, or y, and 00 = a decimal number
Packit 13e0ca
      from 00 to 31 inclusive)
Packit 13e0ca
   salt: 22 chars */
Packit 13e0ca
#define BF_SETTING_LENGTH (7 + 22)
Packit 13e0ca
Packit 13e0ca
/* prefix: BF_SETTING_LENGTH
Packit 13e0ca
   hash: 31 chars
Packit 13e0ca
   terminator: 1 char */
Packit 13e0ca
#define BF_HASH_LENGTH (BF_SETTING_LENGTH + 31 + 1)
Packit 13e0ca
Packit 13e0ca
static_assert (BF_HASH_LENGTH <= CRYPT_OUTPUT_SIZE,
Packit 13e0ca
               "CRYPT_OUTPUT_SIZE is too small for bcrypt");
Packit 13e0ca
Packit 13e0ca
/* BF_data holds all of the sensitive intermediate data used by
Packit 13e0ca
   BF_crypt.  */
Packit 13e0ca
struct BF_data
Packit 13e0ca
{
Packit 13e0ca
  BF_ctx ctx;
Packit 13e0ca
  BF_key expanded_key;
Packit 13e0ca
  union
Packit 13e0ca
  {
Packit 13e0ca
    BF_word salt[4];
Packit 13e0ca
    BF_word output[6];
Packit 13e0ca
  } binary;
Packit 13e0ca
};
Packit 13e0ca
Packit 13e0ca
/* A BF_buffer holds a BF_data plus two extra output buffers used by
Packit 13e0ca
   the self-test logic.  One of them is slightly overlength so the
Packit 13e0ca
   self-test can verify that BF_crypt emits exactly BF_HASH_LENGTH
Packit 13e0ca
   bytes and no more.  */
Packit 13e0ca
struct BF_buffer
Packit 13e0ca
{
Packit 13e0ca
  struct BF_data data;
Packit 13e0ca
  unsigned char re_output[BF_HASH_LENGTH];
Packit 13e0ca
  unsigned char st_output[BF_HASH_LENGTH + 2];
Packit 13e0ca
};
Packit 13e0ca
Packit 13e0ca
static_assert (sizeof (struct BF_buffer) <= ALG_SPECIFIC_SIZE,
Packit 13e0ca
               "ALG_SPECIFIC_SIZE is too small for bcrypt");
Packit 13e0ca
Packit 13e0ca
Packit 13e0ca
static bool
Packit 13e0ca
BF_crypt (const char *key, const char *setting, unsigned char *output,
Packit 13e0ca
          struct BF_data *data, BF_word min)
Packit 13e0ca
{
Packit 13e0ca
  BF_word L, R;
Packit 13e0ca
  BF_word tmp1, tmp2, tmp3, tmp4;
Packit 13e0ca
  BF_word *ptr;
Packit 13e0ca
  BF_word count;
Packit 13e0ca
  int i;
Packit 13e0ca
Packit 13e0ca
  if (setting[0] != '$' ||
Packit 13e0ca
      setting[1] != '2' ||
Packit 13e0ca
      setting[2] < 'a' || setting[2] > 'z' ||
Packit 13e0ca
      !flags_by_subtype[(unsigned int) (unsigned char) setting[2] - 'a'] ||
Packit 13e0ca
      setting[3] != '$' ||
Packit 13e0ca
      setting[4] < '0' || setting[4] > '3' ||
Packit 13e0ca
      setting[5] < '0' || setting[5] > '9' ||
Packit 13e0ca
      (setting[4] == '3' && setting[5] > '1') || setting[6] != '$')
Packit 13e0ca
    {
Packit 13e0ca
      errno = EINVAL;
Packit 13e0ca
      return false;
Packit 13e0ca
    }
Packit 13e0ca
Packit 13e0ca
  count = (BF_word) 1 << ((setting[4] - '0') * 10 + (setting[5] - '0'));
Packit 13e0ca
  if (count < min || BF_decode (data->binary.salt, &setting[7], 16))
Packit 13e0ca
    {
Packit 13e0ca
      errno = EINVAL;
Packit 13e0ca
      return false;
Packit 13e0ca
    }
Packit 13e0ca
  BF_swap (data->binary.salt, 4);
Packit 13e0ca
Packit 13e0ca
  BF_set_key (key, data->expanded_key, data->ctx.P,
Packit 13e0ca
              flags_by_subtype[(unsigned int) (unsigned char) setting[2] -
Packit 13e0ca
                                              'a']);
Packit 13e0ca
Packit 13e0ca
  memcpy (data->ctx.S, BF_init_state.S, sizeof (data->ctx.S));
Packit 13e0ca
Packit 13e0ca
  L = R = 0;
Packit 13e0ca
  for (i = 0; i < BF_N + 2; i += 2)
Packit 13e0ca
    {
Packit 13e0ca
      L ^= data->binary.salt[i & 2];
Packit 13e0ca
      R ^= data->binary.salt[(i & 2) + 1];
Packit 13e0ca
      BF_ENCRYPT;
Packit 13e0ca
      data->ctx.P[i] = L;
Packit 13e0ca
      data->ctx.P[i + 1] = R;
Packit 13e0ca
    }
Packit 13e0ca
Packit 13e0ca
  ptr = data->ctx.S[0];
Packit 13e0ca
  do
Packit 13e0ca
    {
Packit 13e0ca
      ptr += 4;
Packit 13e0ca
      L ^= data->binary.salt[(BF_N + 2) & 3];
Packit 13e0ca
      R ^= data->binary.salt[(BF_N + 3) & 3];
Packit 13e0ca
      BF_ENCRYPT;
Packit 13e0ca
      *(ptr - 4) = L;
Packit 13e0ca
      *(ptr - 3) = R;
Packit 13e0ca
Packit 13e0ca
      L ^= data->binary.salt[(BF_N + 4) & 3];
Packit 13e0ca
      R ^= data->binary.salt[(BF_N + 5) & 3];
Packit 13e0ca
      BF_ENCRYPT;
Packit 13e0ca
      *(ptr - 2) = L;
Packit 13e0ca
      *(ptr - 1) = R;
Packit 13e0ca
    }
Packit 13e0ca
  while (ptr < &data->ctx.S[3][0xFF]);
Packit 13e0ca
Packit 13e0ca
  do
Packit 13e0ca
    {
Packit 13e0ca
      int done;
Packit 13e0ca
Packit 13e0ca
      for (i = 0; i < BF_N + 2; i += 2)
Packit 13e0ca
        {
Packit 13e0ca
          data->ctx.P[i] ^= data->expanded_key[i];
Packit 13e0ca
          data->ctx.P[i + 1] ^= data->expanded_key[i + 1];
Packit 13e0ca
        }
Packit 13e0ca
Packit 13e0ca
      done = 0;
Packit 13e0ca
      do
Packit 13e0ca
        {
Packit 13e0ca
          BF_body ();
Packit 13e0ca
          if (done)
Packit 13e0ca
            break;
Packit 13e0ca
          done = 1;
Packit 13e0ca
Packit 13e0ca
          tmp1 = data->binary.salt[0];
Packit 13e0ca
          tmp2 = data->binary.salt[1];
Packit 13e0ca
          tmp3 = data->binary.salt[2];
Packit 13e0ca
          tmp4 = data->binary.salt[3];
Packit 13e0ca
          for (i = 0; i < BF_N; i += 4)
Packit 13e0ca
            {
Packit 13e0ca
              data->ctx.P[i] ^= tmp1;
Packit 13e0ca
              data->ctx.P[i + 1] ^= tmp2;
Packit 13e0ca
              data->ctx.P[i + 2] ^= tmp3;
Packit 13e0ca
              data->ctx.P[i + 3] ^= tmp4;
Packit 13e0ca
            }
Packit 13e0ca
          data->ctx.P[16] ^= tmp1;
Packit 13e0ca
          data->ctx.P[17] ^= tmp2;
Packit 13e0ca
        }
Packit 13e0ca
      while (1);
Packit 13e0ca
    }
Packit 13e0ca
  while (--count);
Packit 13e0ca
Packit 13e0ca
  for (i = 0; i < 6; i += 2)
Packit 13e0ca
    {
Packit 13e0ca
      L = BF_magic_w[i];
Packit 13e0ca
      R = BF_magic_w[i + 1];
Packit 13e0ca
Packit 13e0ca
      count = 64;
Packit 13e0ca
      do
Packit 13e0ca
        {
Packit 13e0ca
          BF_ENCRYPT;
Packit 13e0ca
        }
Packit 13e0ca
      while (--count);
Packit 13e0ca
Packit 13e0ca
      data->binary.output[i] = L;
Packit 13e0ca
      data->binary.output[i + 1] = R;
Packit 13e0ca
    }
Packit 13e0ca
Packit 13e0ca
  memcpy (output, setting, BF_SETTING_LENGTH - 1);
Packit 13e0ca
  output[BF_SETTING_LENGTH - 1] =
Packit 13e0ca
    BF_itoa64[(int)
Packit 13e0ca
              BF_atoi64[(int) setting[BF_SETTING_LENGTH - 1] -
Packit 13e0ca
                        0x20] & 0x30];
Packit 13e0ca
Packit 13e0ca
  /* This has to be bug-compatible with the original implementation, so
Packit 13e0ca
   * only encode 23 of the 24 bytes. :-) */
Packit 13e0ca
  BF_swap (data->binary.output, 6);
Packit 13e0ca
  BF_encode (&output[BF_SETTING_LENGTH], data->binary.output, 23);
Packit 13e0ca
  output[BF_HASH_LENGTH - 1] = '\0';
Packit 13e0ca
Packit 13e0ca
  return true;
Packit 13e0ca
}
Packit 13e0ca
Packit 13e0ca
/*
Packit 13e0ca
 * Please preserve the runtime self-test.  It serves two purposes at once:
Packit 13e0ca
 *
Packit 13e0ca
 * 1. We really can't afford the risk of producing incompatible hashes e.g.
Packit 13e0ca
 * when there's something like gcc bug 26587 again, whereas an application or
Packit 13e0ca
 * library integrating this code might not also integrate our external tests or
Packit 13e0ca
 * it might not run them after every build.  Even if it does, the miscompile
Packit 13e0ca
 * might only occur on the production build, but not on a testing build (such
Packit 13e0ca
 * as because of different optimization settings).  It is painful to recover
Packit 13e0ca
 * from incorrectly-computed hashes - merely fixing whatever broke is not
Packit 13e0ca
 * enough.  Thus, a proactive measure like this self-test is needed.
Packit 13e0ca
 *
Packit 13e0ca
 * 2. We don't want to leave sensitive data from our actual password hash
Packit 13e0ca
 * computation on the stack or in registers.  Previous revisions of the code
Packit 13e0ca
 * would do explicit cleanups, but simply running the self-test after hash
Packit 13e0ca
 * computation is more reliable.
Packit 13e0ca
 *
Packit 13e0ca
 * The performance cost of this quick self-test is around 0.6% at the "$2a$08"
Packit 13e0ca
 * setting.
Packit 13e0ca
 */
Packit 13e0ca
void
Packit 13e0ca
crypt_bcrypt_rn (const char *phrase, size_t ARG_UNUSED (phr_size),
Packit 13e0ca
                 const char *setting, size_t ARG_UNUSED (set_size),
Packit 13e0ca
                 uint8_t *output, size_t out_size,
Packit 13e0ca
                 void *scratch, size_t scr_size)
Packit 13e0ca
{
Packit 13e0ca
  /* This shouldn't ever happen, but...  */
Packit 13e0ca
  if (out_size < BF_HASH_LENGTH || scr_size < sizeof (struct BF_buffer))
Packit 13e0ca
    {
Packit 13e0ca
      errno = ERANGE;
Packit 13e0ca
      return;
Packit 13e0ca
    }
Packit 13e0ca
  struct BF_buffer *buffer = scratch;
Packit 13e0ca
Packit 13e0ca
  /* Hash the supplied password */
Packit 13e0ca
  if (!BF_crypt (phrase, setting, buffer->re_output, &buffer->data, 16))
Packit 13e0ca
    return; /* errno has already been set */
Packit 13e0ca
Packit 13e0ca
  /* Save and restore the current value of errno around the self-test.  */
Packit 13e0ca
  int save_errno = errno;
Packit 13e0ca
Packit 13e0ca
  /* Do a quick self-test.  It is important that we make both calls to
Packit 13e0ca
     BF_crypt() from the same scope such that they likely use the same
Packit 13e0ca
     stack locations, which makes the second call overwrite the first
Packit 13e0ca
     call's sensitive data on the stack and makes it more likely that
Packit 13e0ca
     any alignment related issues would be detected by the self-test.  */
Packit 13e0ca
Packit 13e0ca
  static const char test_key[] = "8b \xd0\xc1\xd2\xcf\xcc\xd8";
Packit 13e0ca
  static const char test_setting_init[] = "$2a$00$abcdefghijklmnopqrstuu";
Packit 13e0ca
  static const char *const test_hashes[2] =
Packit 13e0ca
  {
Packit 13e0ca
    "i1D709vfamulimlGcq0qq3UvuUasvEa\0\x55",  /* 'a', 'b', 'y' */
Packit 13e0ca
    "VUrPmXD6q/nVSSp7pNDhCR9071IfIRe\0\x55"   /* 'x' */
Packit 13e0ca
  };
Packit 13e0ca
  const char *test_hash = test_hashes[0];
Packit 13e0ca
  char test_setting[BF_SETTING_LENGTH];
Packit 13e0ca
  unsigned int flags = flags_by_subtype[(unsigned int) (unsigned char)
Packit 13e0ca
                                                       setting[2] - 'a'];
Packit 13e0ca
  bool ok;
Packit 13e0ca
Packit 13e0ca
  memcpy (test_setting, test_setting_init, BF_SETTING_LENGTH);
Packit 13e0ca
  test_hash = test_hashes[flags & 1];
Packit 13e0ca
  test_setting[2] = setting[2];
Packit 13e0ca
Packit 13e0ca
  memset (buffer->st_output, 0x55, sizeof buffer->st_output);
Packit 13e0ca
Packit 13e0ca
  ok = (BF_crypt (test_key, test_setting, buffer->st_output, &buffer->data, 1)
Packit 13e0ca
        && !memcmp (buffer->st_output, test_setting, BF_SETTING_LENGTH)
Packit 13e0ca
        && !memcmp (buffer->st_output + BF_SETTING_LENGTH, test_hash,
Packit 13e0ca
                    sizeof buffer->st_output - (BF_SETTING_LENGTH + 1)));
Packit 13e0ca
Packit 13e0ca
  /* Do a second self-test of the key-expansion "safety" logic.  */
Packit 13e0ca
  {
Packit 13e0ca
    const char *k = "\xff\xa3" "34" "\xff\xff\xff\xa3" "345";
Packit 13e0ca
    BF_key ae, ai, ye, yi;
Packit 13e0ca
    BF_set_key (k, ae, ai, 2);  /* $2a$ */
Packit 13e0ca
    BF_set_key (k, ye, yi, 4);  /* $2y$ */
Packit 13e0ca
    ai[0] ^= 0x10000;           /* undo the safety (for comparison) */
Packit 13e0ca
    ok = ok && ai[0] == 0xdb9c59bc && ye[17] == 0x33343500 &&
Packit 13e0ca
         !memcmp (ae, ye, sizeof (ae)) && !memcmp (ai, yi, sizeof (ai));
Packit 13e0ca
  }
Packit 13e0ca
Packit 13e0ca
  if (!ok)
Packit 13e0ca
    {
Packit 13e0ca
      /* Self-test failed; pretend we don't support this hash type.  */
Packit 13e0ca
      errno = EINVAL;
Packit 13e0ca
      return;
Packit 13e0ca
    }
Packit 13e0ca
Packit 13e0ca
  /* Self-test succeeded; copy the true output into the true output
Packit 13e0ca
     buffer and return.  We already know there is enough space.  */
Packit 13e0ca
  memcpy (output, buffer->re_output, BF_HASH_LENGTH);
Packit 13e0ca
  errno = save_errno;
Packit 13e0ca
}
Packit 13e0ca
Packit 13e0ca
static void
Packit 13e0ca
BF_gensalt (char subtype, unsigned long count,
Packit 13e0ca
            const uint8_t *rbytes, size_t nrbytes,
Packit 13e0ca
            uint8_t *output, size_t o_size)
Packit 13e0ca
{
Packit 13e0ca
  if (!count)
Packit 13e0ca
    count = 5;
Packit 13e0ca
  if (nrbytes < 16 ||
Packit 13e0ca
      count < 4 || count > 31 ||
Packit 13e0ca
      (subtype != 'a' && subtype != 'b' && subtype != 'x' && subtype != 'y'))
Packit 13e0ca
    {
Packit 13e0ca
      errno = EINVAL;
Packit 13e0ca
      return;
Packit 13e0ca
    }
Packit 13e0ca
  if (o_size < 7 + 22 + 1)
Packit 13e0ca
    {
Packit 13e0ca
      errno = ERANGE;
Packit 13e0ca
      return;
Packit 13e0ca
    }
Packit 13e0ca
Packit 13e0ca
  BF_word aligned_rbytes[16 / sizeof(BF_word)];
Packit 13e0ca
  memcpy(aligned_rbytes, rbytes, 16);
Packit 13e0ca
Packit 13e0ca
  output[0] = '$';
Packit 13e0ca
  output[1] = '2';
Packit 13e0ca
  output[2] = (uint8_t)subtype;
Packit 13e0ca
  output[3] = '$';
Packit 13e0ca
  output[4] = (uint8_t)('0' + count / 10);
Packit 13e0ca
  output[5] = (uint8_t)('0' + count % 10);
Packit 13e0ca
  output[6] = '$';
Packit 13e0ca
Packit 13e0ca
  BF_encode (&output[7], aligned_rbytes, 16);
Packit 13e0ca
  output[7 + 22] = '\0';
Packit 13e0ca
}
Packit 13e0ca
Packit 13e0ca
void
Packit 13e0ca
gensalt_bcrypt_a_rn (unsigned long count,
Packit 13e0ca
                     const uint8_t *rbytes, size_t nrbytes,
Packit 13e0ca
                     uint8_t *output, size_t o_size)
Packit 13e0ca
{
Packit 13e0ca
  BF_gensalt ('a', count, rbytes, nrbytes, output, o_size);
Packit 13e0ca
}
Packit 13e0ca
Packit 13e0ca
void
Packit 13e0ca
gensalt_bcrypt_b_rn (unsigned long count,
Packit 13e0ca
                     const uint8_t *rbytes, size_t nrbytes,
Packit 13e0ca
                     uint8_t *output, size_t o_size)
Packit 13e0ca
{
Packit 13e0ca
  BF_gensalt ('b', count, rbytes, nrbytes, output, o_size);
Packit 13e0ca
}
Packit 13e0ca
Packit 13e0ca
void
Packit 13e0ca
gensalt_bcrypt_x_rn (unsigned long count,
Packit 13e0ca
                     const uint8_t *rbytes, size_t nrbytes,
Packit 13e0ca
                     uint8_t *output, size_t o_size)
Packit 13e0ca
{
Packit 13e0ca
  BF_gensalt ('x', count, rbytes, nrbytes, output, o_size);
Packit 13e0ca
}
Packit 13e0ca
Packit 13e0ca
void
Packit 13e0ca
gensalt_bcrypt_y_rn (unsigned long count,
Packit 13e0ca
                     const uint8_t *rbytes, size_t nrbytes,
Packit 13e0ca
                     uint8_t *output, size_t o_size)
Packit 13e0ca
{
Packit 13e0ca
  BF_gensalt ('y', count, rbytes, nrbytes, output, o_size);
Packit 13e0ca
}
Packit 13e0ca
Packit 13e0ca
#endif