/* ====================================================================
 * Copyright (c) 2002-2006,2008 The OpenSSL Project.  All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 *
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 *
 * 3. All advertising materials mentioning features or use of this
 *    software must display the following acknowledgment:
 *    "This product includes software developed by the OpenSSL Project
 *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
 *
 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
 *    endorse or promote products derived from this software without
 *    prior written permission. For written permission, please contact
 *    openssl-core@openssl.org.
 *
 * 5. Products derived from this software may not be called "OpenSSL"
 *    nor may "OpenSSL" appear in their names without prior written
 *    permission of the OpenSSL Project.
 *
 * 6. Redistributions of any form whatsoever must retain the following
 *    acknowledgment:
 *    "This product includes software developed by the OpenSSL Project
 *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
 *
 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
 * OF THE POSSIBILITY OF SUCH DAMAGE.
 * ==================================================================== */

// Modifications Copyright 2017 The Cobalt Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#ifndef STARBOARD_SHARED_STARBOARD_CRYPTOGRAPHY_SOFTWARE_AES_H_
#define STARBOARD_SHARED_STARBOARD_CRYPTOGRAPHY_SOFTWARE_AES_H_

#include "starboard/configuration.h"
#include "starboard/log.h"
#include "starboard/types.h"

namespace starboard {
namespace shared {
namespace starboard {
namespace cryptography {

/* Raw AES functions. */
#define SB_AES_ENCRYPT 1
#define SB_AES_DECRYPT 0

/* AES_MAXNR is the maximum number of AES rounds. */
#define SB_AES_MAXNR 14
#define SB_AES_BLOCK_SIZE 16

/* aes_key_st should be an opaque type, but EVP requires that the size be
 * known. */
struct aes_key_st {
  uint32_t rd_key[4 * (SB_AES_MAXNR + 1)];
  unsigned rounds;
};

typedef struct aes_key_st AES_KEY;

typedef void (*block128_f)(const void* in, void* out, const AES_KEY* key);

/* AES_set_encrypt_key configures |aeskey| to encrypt with the |bits|-bit key,
 * |key|.
 *
 * WARNING: unlike other OpenSSL functions, this returns zero on success and a
 * negative number on error. */
int AES_set_encrypt_key(const void* key, unsigned bits, AES_KEY* aeskey);

/* AES_set_decrypt_key configures |aeskey| to decrypt with the |bits|-bit key,
 * |key|.
 *
 * WARNING: unlike other OpenSSL functions, this returns zero on success and a
 * negative number on error. */
int AES_set_decrypt_key(const void* key, unsigned bits, AES_KEY* aeskey);

/* AES_encrypt encrypts a single block from |in| to |out| with |key|. The |in|
 * and |out| pointers may overlap. */
void AES_encrypt(const void* in, void* out, const AES_KEY* key);

/* AES_decrypt decrypts a single block from |in| to |out| with |key|. The |in|
 * and |out| pointers may overlap. */
void AES_decrypt(const void* in, void* out, const AES_KEY* key);

/* Block cipher modes. */
/* AES_ctr128_encrypt encrypts (or decrypts, it's the same in CTR mode) |len|
 * bytes from |in| to |out|. The |num| parameter must be set to zero on the
 * first call and |ivec| will be incremented. */
void AES_ctr128_encrypt(const void* in,
                        void* out,
                        size_t len,
                        const AES_KEY* key,
                        uint8_t ivec[SB_AES_BLOCK_SIZE],
                        uint8_t ecount_buf[SB_AES_BLOCK_SIZE],
                        uint32_t* num);

/* AES_cbc_encrypt encrypts (or decrypts, if |enc| == |AES_DECRYPT|) |len|
 * bytes from |in| to |out|. The length must be a multiple of the block size. */
void AES_cbc_encrypt(const void* in,
                     void* out,
                     size_t len,
                     const AES_KEY* key,
                     uint8_t* ivec,
                     const int enc);

/* GCM */

typedef struct {
  uint64_t hi;
  uint64_t lo;
} u128;

/* gmult_func multiplies |Xi| by the GCM key and writes the result back to
 * |Xi|. */
typedef void (*gmult_func)(uint64_t Xi[2], const u128 Htable[16]);

/* ghash_func repeatedly multiplies |Xi| by the GCM key and adds in blocks from
 * |inp|. The result is written back to |Xi| and the |len| argument must be a
 * multiple of 16. */
typedef void (*ghash_func)(uint64_t Xi[2], const u128 Htable[16],
                           const uint8_t *inp, size_t len);

/* This differs from upstream's |gcm128_context| in that it does not have the
 * |key| pointer, in order to make it |memcpy|-friendly. Rather the key is
 * passed into each call that needs it. */
struct gcm128_context {
  /* Following 6 names follow names in GCM specification */
  union {
    uint64_t u[2];
    uint32_t d[4];
    uint8_t c[16];
    size_t t[16 / sizeof(size_t)];
  } Yi, EKi, EK0, len, Xi;
  /* Note that the order of |Xi|, |H| and |Htable| is fixed by the MOVBE-based,
   * x86-64, GHASH assembly. */
  u128 H;
  u128 Htable[16];
  gmult_func gmult;
  ghash_func ghash;
  unsigned int mres, ares;
  block128_f block;
};

/* This API differs from the upstream API slightly. The |GCM128_CONTEXT| does
 * not have a |key| pointer that points to the key as upstream's version does.
 * Instead, every function takes a |key| parameter. This way |GCM128_CONTEXT|
 * can be safely copied. */
typedef struct gcm128_context GCM128_CONTEXT;

/* AES_gcm128_init initialises |ctx| to use the given key. */
void AES_gcm128_init(GCM128_CONTEXT *ctx, const AES_KEY *key, int enc);

/* AES_gcm128_setiv sets the IV (nonce) for |ctx|. The |key| must be the same
 * key that was passed to |AES_gcm128_init|. */
void AES_gcm128_setiv(GCM128_CONTEXT *ctx, const AES_KEY *key,
                      const void *iv, size_t iv_len);

/* AES_gcm128_aad sets the authenticated data for an instance of GCM.  This must
 * be called before and data is encrypted. It returns one on success and zero
 * otherwise. */
int AES_gcm128_aad(GCM128_CONTEXT *ctx, const void *aad, size_t len);

/* AES_gcm128_encrypt encrypts |len| bytes from |in| to |out|. The |key| must be
 * the same key that was passed to |AES_gcm128_init|. It returns one on success
 * and zero otherwise. */
int AES_gcm128_encrypt(GCM128_CONTEXT *ctx, const AES_KEY *key,
                       const void *in, void *out, size_t len);

/* AES_gcm128_decrypt decrypts |len| bytes from |in| to |out|. The |key| must be
 * the same key that was passed to |AES_gcm128_init|. It returns one on success
 * and zero otherwise. */
int AES_gcm128_decrypt(GCM128_CONTEXT *ctx, const AES_KEY *key,
                       const void *in, void *out, size_t len);

/* AES_gcm128_tag calculates the authenticator and copies it into |tag|.  The
 * minimum of |len| and 16 bytes are copied into |tag|. */
void AES_gcm128_tag(GCM128_CONTEXT *ctx, void *tag, size_t len);

}  // namespace cryptography
}  // namespace starboard
}  // namespace shared
}  // namespace starboard

#endif  // STARBOARD_SHARED_STARBOARD_CRYPTOGRAPHY_SOFTWARE_AES_H_
