2010-11-02 07:06:38 +01:00
|
|
|
/** @file
|
|
|
|
ARC4 Wrapper Implementation over OpenSSL.
|
|
|
|
|
2012-03-19 06:52:16 +01:00
|
|
|
Copyright (c) 2010 - 2012, Intel Corporation. All rights reserved.<BR>
|
2010-11-02 07:06:38 +01:00
|
|
|
This program and the accompanying materials
|
|
|
|
are licensed and made available under the terms and conditions of the BSD License
|
|
|
|
which accompanies this distribution. The full text of the license may be found at
|
|
|
|
http://opensource.org/licenses/bsd-license.php
|
|
|
|
|
|
|
|
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
|
|
|
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
|
|
|
|
|
|
|
**/
|
|
|
|
|
|
|
|
#include "InternalCryptLib.h"
|
|
|
|
#include <openssl/rc4.h>
|
|
|
|
|
|
|
|
/**
|
|
|
|
Retrieves the size, in bytes, of the context buffer required for ARC4 operations.
|
|
|
|
|
|
|
|
@return The size, in bytes, of the context buffer required for ARC4 operations.
|
|
|
|
|
|
|
|
**/
|
|
|
|
UINTN
|
|
|
|
EFIAPI
|
|
|
|
Arc4GetContextSize (
|
|
|
|
VOID
|
|
|
|
)
|
|
|
|
{
|
|
|
|
//
|
|
|
|
// Memory for 2 copies of RC4_KEY is allocated, one for working copy, and the other
|
|
|
|
// for backup copy. When Arc4Reset() is called, we can use the backup copy to restore
|
|
|
|
// the working copy to the initial state.
|
|
|
|
//
|
2012-07-27 09:49:42 +02:00
|
|
|
return (UINTN) (2 * sizeof (RC4_KEY));
|
2010-11-02 07:06:38 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
Initializes user-supplied memory as ARC4 context for subsequent use.
|
|
|
|
|
|
|
|
This function initializes user-supplied memory pointed by Arc4Context as ARC4 context.
|
2012-07-27 09:49:42 +02:00
|
|
|
In addition, it sets up all ARC4 key materials for subsequent encryption and decryption
|
2010-11-02 07:06:38 +01:00
|
|
|
operations.
|
|
|
|
|
2012-03-19 06:52:16 +01:00
|
|
|
If Arc4Context is NULL, then return FALSE.
|
|
|
|
If Key is NULL, then return FALSE.
|
|
|
|
If KeySize does not in the range of [5, 256] bytes, then return FALSE.
|
2010-11-02 07:06:38 +01:00
|
|
|
|
|
|
|
@param[out] Arc4Context Pointer to ARC4 context being initialized.
|
|
|
|
@param[in] Key Pointer to the user-supplied ARC4 key.
|
|
|
|
@param[in] KeySize Size of ARC4 key in bytes.
|
|
|
|
|
|
|
|
@retval TRUE ARC4 context initialization succeeded.
|
|
|
|
@retval FALSE ARC4 context initialization failed.
|
|
|
|
|
|
|
|
**/
|
|
|
|
BOOLEAN
|
|
|
|
EFIAPI
|
|
|
|
Arc4Init (
|
|
|
|
OUT VOID *Arc4Context,
|
|
|
|
IN CONST UINT8 *Key,
|
|
|
|
IN UINTN KeySize
|
|
|
|
)
|
|
|
|
{
|
|
|
|
RC4_KEY *Rc4Key;
|
|
|
|
|
2012-03-19 06:52:16 +01:00
|
|
|
//
|
|
|
|
// Check input parameters.
|
|
|
|
//
|
|
|
|
if (Arc4Context == NULL || Key == NULL || (KeySize < 5 || KeySize > 256)) {
|
|
|
|
return FALSE;
|
|
|
|
}
|
2010-11-02 07:06:38 +01:00
|
|
|
|
|
|
|
Rc4Key = (RC4_KEY *) Arc4Context;
|
|
|
|
|
|
|
|
RC4_set_key (Rc4Key, (UINT32) KeySize, Key);
|
|
|
|
|
2012-07-27 09:49:42 +02:00
|
|
|
CopyMem (Rc4Key + 1, Rc4Key, sizeof (RC4_KEY));
|
2010-11-02 07:06:38 +01:00
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
Performs ARC4 encryption on a data buffer of the specified size.
|
|
|
|
|
|
|
|
This function performs ARC4 encryption on data buffer pointed by Input, of specified
|
|
|
|
size of InputSize.
|
|
|
|
Arc4Context should be already correctly initialized by Arc4Init(). Behavior with
|
|
|
|
invalid ARC4 context is undefined.
|
|
|
|
|
2012-03-19 06:52:16 +01:00
|
|
|
If Arc4Context is NULL, then return FALSE.
|
|
|
|
If Input is NULL, then return FALSE.
|
|
|
|
If Output is NULL, then return FALSE.
|
2010-11-02 07:06:38 +01:00
|
|
|
|
|
|
|
@param[in, out] Arc4Context Pointer to the ARC4 context.
|
|
|
|
@param[in] Input Pointer to the buffer containing the data to be encrypted.
|
|
|
|
@param[in] InputSize Size of the Input buffer in bytes.
|
|
|
|
@param[out] Output Pointer to a buffer that receives the ARC4 encryption output.
|
|
|
|
|
|
|
|
@retval TRUE ARC4 encryption succeeded.
|
|
|
|
@retval FALSE ARC4 encryption failed.
|
|
|
|
|
|
|
|
**/
|
|
|
|
BOOLEAN
|
|
|
|
EFIAPI
|
|
|
|
Arc4Encrypt (
|
|
|
|
IN OUT VOID *Arc4Context,
|
|
|
|
IN CONST UINT8 *Input,
|
|
|
|
IN UINTN InputSize,
|
|
|
|
OUT UINT8 *Output
|
|
|
|
)
|
|
|
|
{
|
|
|
|
RC4_KEY *Rc4Key;
|
|
|
|
|
2012-03-19 06:52:16 +01:00
|
|
|
//
|
|
|
|
// Check input parameters.
|
|
|
|
//
|
2012-08-02 04:49:24 +02:00
|
|
|
if (Arc4Context == NULL || Input == NULL || Output == NULL || InputSize > INT_MAX) {
|
2012-03-19 06:52:16 +01:00
|
|
|
return FALSE;
|
|
|
|
}
|
2010-11-02 07:06:38 +01:00
|
|
|
|
|
|
|
Rc4Key = (RC4_KEY *) Arc4Context;
|
|
|
|
|
|
|
|
RC4 (Rc4Key, (UINT32) InputSize, Input, Output);
|
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
Performs ARC4 decryption on a data buffer of the specified size.
|
|
|
|
|
|
|
|
This function performs ARC4 decryption on data buffer pointed by Input, of specified
|
|
|
|
size of InputSize.
|
|
|
|
Arc4Context should be already correctly initialized by Arc4Init(). Behavior with
|
|
|
|
invalid ARC4 context is undefined.
|
|
|
|
|
2012-03-19 06:52:16 +01:00
|
|
|
If Arc4Context is NULL, then return FALSE.
|
|
|
|
If Input is NULL, then return FALSE.
|
|
|
|
If Output is NULL, then return FALSE.
|
2010-11-02 07:06:38 +01:00
|
|
|
|
|
|
|
@param[in, out] Arc4Context Pointer to the ARC4 context.
|
|
|
|
@param[in] Input Pointer to the buffer containing the data to be decrypted.
|
|
|
|
@param[in] InputSize Size of the Input buffer in bytes.
|
|
|
|
@param[out] Output Pointer to a buffer that receives the ARC4 decryption output.
|
|
|
|
|
|
|
|
@retval TRUE ARC4 decryption succeeded.
|
|
|
|
@retval FALSE ARC4 decryption failed.
|
|
|
|
|
|
|
|
**/
|
|
|
|
BOOLEAN
|
|
|
|
EFIAPI
|
|
|
|
Arc4Decrypt (
|
|
|
|
IN OUT VOID *Arc4Context,
|
|
|
|
IN UINT8 *Input,
|
|
|
|
IN UINTN InputSize,
|
|
|
|
OUT UINT8 *Output
|
|
|
|
)
|
|
|
|
{
|
|
|
|
RC4_KEY *Rc4Key;
|
|
|
|
|
2012-03-19 06:52:16 +01:00
|
|
|
//
|
|
|
|
// Check input parameters.
|
|
|
|
//
|
2012-08-02 04:49:24 +02:00
|
|
|
if (Arc4Context == NULL || Input == NULL || Output == NULL || InputSize > INT_MAX) {
|
2012-03-19 06:52:16 +01:00
|
|
|
return FALSE;
|
|
|
|
}
|
2010-11-02 07:06:38 +01:00
|
|
|
|
|
|
|
Rc4Key = (RC4_KEY *) Arc4Context;
|
|
|
|
|
|
|
|
RC4 (Rc4Key, (UINT32) InputSize, Input, Output);
|
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
Resets the ARC4 context to the initial state.
|
|
|
|
|
|
|
|
The function resets the ARC4 context to the state it had immediately after the
|
|
|
|
ARC4Init() function call.
|
|
|
|
Contrary to ARC4Init(), Arc4Reset() requires no secret key as input, but ARC4 context
|
|
|
|
should be already correctly initialized by ARC4Init().
|
|
|
|
|
2012-03-19 06:52:16 +01:00
|
|
|
If Arc4Context is NULL, then return FALSE.
|
2010-11-02 07:06:38 +01:00
|
|
|
|
|
|
|
@param[in, out] Arc4Context Pointer to the ARC4 context.
|
|
|
|
|
|
|
|
@retval TRUE ARC4 reset succeeded.
|
|
|
|
@retval FALSE ARC4 reset failed.
|
|
|
|
|
|
|
|
**/
|
|
|
|
BOOLEAN
|
|
|
|
EFIAPI
|
|
|
|
Arc4Reset (
|
|
|
|
IN OUT VOID *Arc4Context
|
|
|
|
)
|
|
|
|
{
|
|
|
|
RC4_KEY *Rc4Key;
|
|
|
|
|
2012-03-19 06:52:16 +01:00
|
|
|
//
|
|
|
|
// Check input parameters.
|
|
|
|
//
|
|
|
|
if (Arc4Context == NULL) {
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2010-11-02 07:06:38 +01:00
|
|
|
Rc4Key = (RC4_KEY *) Arc4Context;
|
|
|
|
|
2012-07-27 09:49:42 +02:00
|
|
|
CopyMem (Rc4Key, Rc4Key + 1, sizeof (RC4_KEY));
|
2010-11-02 07:06:38 +01:00
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
}
|