blob: e686815abd4bbc1d05f571a80bb58cec07093b72 [file] [log] [blame]
/*
* Copyright (c) 2010-2013, NVIDIA Corporation. All Rights Reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#ifndef __TEGRA_CRYPTODEV_H
#define __TEGRA_CRYPTODEV_H
#include <crypto/aes.h>
#include <asm-generic/ioctl.h>
/* ioctl arg = 1 if you want to use ssk. arg = 0 to use normal key */
#define TEGRA_CRYPTO_IOCTL_NEED_SSK _IOWR(0x98, 100, int)
#define TEGRA_CRYPTO_IOCTL_PROCESS_REQ _IOWR(0x98, 101, int*)
#define TEGRA_CRYPTO_IOCTL_SET_SEED _IOWR(0x98, 102, int*)
#define TEGRA_CRYPTO_IOCTL_GET_RANDOM _IOWR(0x98, 103, int*)
#define TEGRA_CRYPTO_IOCTL_GET_SHA _IOWR(0x98, 104, int*)
#define TEGRA_CRYPTO_IOCTL_RSA_REQ _IOWR(0x98, 105, int*)
#define TEGRA_CRYPTO_MAX_KEY_SIZE AES_MAX_KEY_SIZE
#define RSA_KEY_SIZE 512
#define TEGRA_CRYPTO_IV_SIZE AES_BLOCK_SIZE
#define DEFAULT_RNG_BLK_SZ 16
/* the seed consists of 16 bytes of key + 16 bytes of init vector */
#define TEGRA_CRYPTO_RNG_SEED_SIZE AES_KEYSIZE_128 + DEFAULT_RNG_BLK_SZ
#define TEGRA_CRYPTO_RNG_SIZE SZ_16
/* encrypt/decrypt operations */
#define TEGRA_CRYPTO_ECB BIT(0)
#define TEGRA_CRYPTO_CBC BIT(1)
#define TEGRA_CRYPTO_OFB BIT(2)
#define TEGRA_CRYPTO_CTR BIT(3)
#define TEGRA_CRYPTO_CMAC BIT(4)
#define TEGRA_CRYPTO_RNG BIT(5)
/* a pointer to this struct needs to be passed to:
* TEGRA_CRYPTO_IOCTL_PROCESS_REQ
*/
struct tegra_crypt_req {
int op; /* e.g. TEGRA_CRYPTO_ECB */
bool encrypt;
char key[TEGRA_CRYPTO_MAX_KEY_SIZE];
int keylen;
char iv[TEGRA_CRYPTO_IV_SIZE];
int ivlen;
u8 *plaintext;
int plaintext_sz;
u8 *result;
int skip_key;
int skip_iv;
};
/* pointer to this struct should be passed to:
* TEGRA_CRYPTO_IOCTL_SET_SEED
* TEGRA_CRYPTO_IOCTL_GET_RANDOM
*/
struct tegra_rng_req {
u8 seed[TEGRA_CRYPTO_RNG_SEED_SIZE];
u8 *rdata; /* random generated data */
int nbytes; /* random data length */
int type;
};
struct tegra_rsa_req {
char *key;
int keylen;
char *algo;
char *message;
int msg_len;
int modlen;
int pub_explen;
int prv_explen;
char *result;
};
struct tegra_sha_req {
char key[TEGRA_CRYPTO_MAX_KEY_SIZE];
int keylen;
unsigned char *algo;
unsigned char *plaintext;
int plaintext_sz;
unsigned char *result;
};
#endif