static ERL_NIF_TERM bf_init(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) { ErlNifBinary state; char key[1024]; char salt[1024]; uint8_t key_len; unsigned long key_len_arg; uint8_t salt_len; if (argc != 3 || !enif_get_string(env, argv[0], key, sizeof(key), ERL_NIF_LATIN1) || !enif_get_ulong(env, argv[1], &key_len_arg) || !enif_get_string(env, argv[2], salt, sizeof(salt), ERL_NIF_LATIN1)) return enif_make_badarg(env); key_len = key_len_arg; salt_len = BCRYPT_MAXSALT; if (!enif_alloc_binary(sizeof(blf_ctx), &state)) return enif_make_badarg(env); Blowfish_initstate((blf_ctx *) state.data); Blowfish_expandstate((blf_ctx *) state.data, (uint8_t *) salt, salt_len, (uint8_t *) key, key_len); return enif_make_binary(env, &state); }
void ssh_blf_key(ssh_blf_ctx *c, const uint8_t *k, uint16_t len) { /* Initialize S-boxes and subkeys with Pi */ Blowfish_initstate(c); /* Transform S-boxes and subkeys with key */ Blowfish_expand0state(c, k, len); }