| /* |
| * Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved. |
| * |
| * Licensed under the OpenSSL license (the "License"). You may not use |
| * this file except in compliance with the License. You can obtain a copy |
| * in the file LICENSE in the source distribution or at |
| * https://www.openssl.org/source/license.html |
| */ |
| |
| #include <stdio.h> |
| #include <string.h> |
| #include <openssl/blowfish.h> |
| #include "bf_locl.h" |
| #include "bf_pi.h" |
| |
| void BF_set_key(BF_KEY *key, int len, const unsigned char *data) |
| { |
| int i; |
| BF_LONG *p, ri, in[2]; |
| const unsigned char *d, *end; |
| |
| memcpy(key, &bf_init, sizeof(BF_KEY)); |
| p = key->P; |
| |
| if (len > ((BF_ROUNDS + 2) * 4)) |
| len = (BF_ROUNDS + 2) * 4; |
| |
| d = data; |
| end = &(data[len]); |
| for (i = 0; i < (BF_ROUNDS + 2); i++) { |
| ri = *(d++); |
| if (d >= end) |
| d = data; |
| |
| ri <<= 8; |
| ri |= *(d++); |
| if (d >= end) |
| d = data; |
| |
| ri <<= 8; |
| ri |= *(d++); |
| if (d >= end) |
| d = data; |
| |
| ri <<= 8; |
| ri |= *(d++); |
| if (d >= end) |
| d = data; |
| |
| p[i] ^= ri; |
| } |
| |
| in[0] = 0L; |
| in[1] = 0L; |
| for (i = 0; i < (BF_ROUNDS + 2); i += 2) { |
| BF_encrypt(in, key); |
| p[i] = in[0]; |
| p[i + 1] = in[1]; |
| } |
| |
| p = key->S; |
| for (i = 0; i < 4 * 256; i += 2) { |
| BF_encrypt(in, key); |
| p[i] = in[0]; |
| p[i + 1] = in[1]; |
| } |
| } |