diff options
Diffstat (limited to 'roms/edk2/CryptoPkg/Library/OpensslLib/openssl/crypto/rc5/rc5_skey.c')
-rw-r--r-- | roms/edk2/CryptoPkg/Library/OpensslLib/openssl/crypto/rc5/rc5_skey.c | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/roms/edk2/CryptoPkg/Library/OpensslLib/openssl/crypto/rc5/rc5_skey.c b/roms/edk2/CryptoPkg/Library/OpensslLib/openssl/crypto/rc5/rc5_skey.c new file mode 100644 index 000000000..b2e6bbb1a --- /dev/null +++ b/roms/edk2/CryptoPkg/Library/OpensslLib/openssl/crypto/rc5/rc5_skey.c @@ -0,0 +1,61 @@ +/* + * 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 <openssl/rc5.h> +#include "rc5_local.h" + +void RC5_32_set_key(RC5_32_KEY *key, int len, const unsigned char *data, + int rounds) +{ + RC5_32_INT L[64], l, ll, A, B, *S, k; + int i, j, m, c, t, ii, jj; + + if ((rounds != RC5_16_ROUNDS) && + (rounds != RC5_12_ROUNDS) && (rounds != RC5_8_ROUNDS)) + rounds = RC5_16_ROUNDS; + + key->rounds = rounds; + S = &(key->data[0]); + j = 0; + for (i = 0; i <= (len - 8); i += 8) { + c2l(data, l); + L[j++] = l; + c2l(data, l); + L[j++] = l; + } + ii = len - i; + if (ii) { + k = len & 0x07; + c2ln(data, l, ll, k); + L[j + 0] = l; + L[j + 1] = ll; + } + + c = (len + 3) / 4; + t = (rounds + 1) * 2; + S[0] = RC5_32_P; + for (i = 1; i < t; i++) + S[i] = (S[i - 1] + RC5_32_Q) & RC5_32_MASK; + + j = (t > c) ? t : c; + j *= 3; + ii = jj = 0; + A = B = 0; + for (i = 0; i < j; i++) { + k = (S[ii] + A + B) & RC5_32_MASK; + A = S[ii] = ROTATE_l32(k, 3); + m = (int)(A + B); + k = (L[jj] + A + B) & RC5_32_MASK; + B = L[jj] = ROTATE_l32(k, m); + if (++ii >= t) + ii = 0; + if (++jj >= c) + jj = 0; + } +} |