1 /* 2 * Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved. 3 * 4 * Licensed under the OpenSSL license (the "License"). You may not use 5 * this file except in compliance with the License. You can obtain a copy 6 * in the file LICENSE in the source distribution or at 7 * https://www.openssl.org/source/license.html 8 */ 9 10 #include <stdio.h> 11 #include <string.h> 12 #include <openssl/blowfish.h> 13 #include "bf_local.h" 14 #include "bf_pi.h" 15 16 void BF_set_key(BF_KEY *key, int len, const unsigned char *data) 17 { 18 int i; 19 BF_LONG *p, ri, in[2]; 20 const unsigned char *d, *end; 21 22 memcpy(key, &bf_init, sizeof(BF_KEY)); 23 p = key->P; 24 25 if (len > ((BF_ROUNDS + 2) * 4)) 26 len = (BF_ROUNDS + 2) * 4; 27 28 d = data; 29 end = &(data[len]); 30 for (i = 0; i < (BF_ROUNDS + 2); i++) { 31 ri = *(d++); 32 if (d >= end) 33 d = data; 34 35 ri <<= 8; 36 ri |= *(d++); 37 if (d >= end) 38 d = data; 39 40 ri <<= 8; 41 ri |= *(d++); 42 if (d >= end) 43 d = data; 44 45 ri <<= 8; 46 ri |= *(d++); 47 if (d >= end) 48 d = data; 49 50 p[i] ^= ri; 51 } 52 53 in[0] = 0L; 54 in[1] = 0L; 55 for (i = 0; i < (BF_ROUNDS + 2); i += 2) { 56 BF_encrypt(in, key); 57 p[i] = in[0]; 58 p[i + 1] = in[1]; 59 } 60 61 p = key->S; 62 for (i = 0; i < 4 * 256; i += 2) { 63 BF_encrypt(in, key); 64 p[i] = in[0]; 65 p[i + 1] = in[1]; 66 } 67 } 68