]>
Commit | Line | Data |
---|---|---|
b1322259 RS |
1 | /* |
2 | * Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved. | |
d02b48c6 | 3 | * |
8b00b7b8 | 4 | * Licensed under the Apache License 2.0 (the "License"). You may not use |
b1322259 RS |
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 | |
d02b48c6 RE |
8 | */ |
9 | ||
10 | #include <stdio.h> | |
11 | #include <string.h> | |
ec577822 | 12 | #include <openssl/blowfish.h> |
706457b7 | 13 | #include "bf_local.h" |
d02b48c6 RE |
14 | #include "bf_pi.h" |
15 | ||
6343829a | 16 | void BF_set_key(BF_KEY *key, int len, const unsigned char *data) |
0f113f3e MC |
17 | { |
18 | int i; | |
19 | BF_LONG *p, ri, in[2]; | |
20 | const unsigned char *d, *end; | |
d02b48c6 | 21 | |
0f113f3e MC |
22 | memcpy(key, &bf_init, sizeof(BF_KEY)); |
23 | p = key->P; | |
d02b48c6 | 24 | |
0f113f3e MC |
25 | if (len > ((BF_ROUNDS + 2) * 4)) |
26 | len = (BF_ROUNDS + 2) * 4; | |
d02b48c6 | 27 | |
0f113f3e MC |
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; | |
d02b48c6 | 34 | |
0f113f3e MC |
35 | ri <<= 8; |
36 | ri |= *(d++); | |
37 | if (d >= end) | |
38 | d = data; | |
d02b48c6 | 39 | |
0f113f3e MC |
40 | ri <<= 8; |
41 | ri |= *(d++); | |
42 | if (d >= end) | |
43 | d = data; | |
d02b48c6 | 44 | |
0f113f3e MC |
45 | ri <<= 8; |
46 | ri |= *(d++); | |
47 | if (d >= end) | |
48 | d = data; | |
d02b48c6 | 49 | |
0f113f3e MC |
50 | p[i] ^= ri; |
51 | } | |
d02b48c6 | 52 | |
0f113f3e MC |
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 | } | |
d02b48c6 | 60 | |
0f113f3e MC |
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 | } |