/*
 * Copyright (C) 2007 Michael Brown <mbrown@fensystems.co.uk>.
 *
 * 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 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.
 *
 * You can also choose to distribute this program under the terms of
 * the Unmodified Binary Distribution Licence (as given in the file
 * COPYING.UBDL), provided that you have satisfied its requirements.
 */

FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
FILE_SECBOOT ( PERMITTED );

/**
 * @file
 *
 * Null crypto algorithm
 */

#include <string.h>
#include <errno.h>
#include <ipxe/crypto.h>

void digest_null_init ( struct digest_algorithm *digest __unused,
			void *ctx __unused ) {
	/* Do nothing */
}

void digest_null_update ( struct digest_algorithm *digest __unused,
			  void *ctx __unused, const void *src __unused,
			  size_t len __unused ) {
	/* Do nothing */
}

void digest_null_final ( struct digest_algorithm *digest __unused,
			 void *ctx __unused, void *out __unused ) {
	/* Do nothing */
}

struct digest_algorithm digest_null = {
	.name = "null",
	.ctxsize = 0,
	.blocksize = 1,
	.digestsize = 0,
	.init = digest_null_init,
	.update = digest_null_update,
	.final = digest_null_final,
};

int cipher_null_setkey ( struct cipher_algorithm *cipher __unused,
			 void *ctx __unused, const void *key __unused,
			 size_t keylen __unused ) {
	/* Do nothing */
	return 0;
}

int cipher_null_setiv ( struct cipher_algorithm *cipher __unused,
			void *ctx __unused, const void *iv __unused,
			size_t ivlen __unused ) {
	/* Do nothing */
	return 0;
}

void cipher_null_encrypt ( struct cipher_algorithm *cipher __unused,
			   void *ctx __unused, const void *src, void *dst,
			   size_t len ) {
	memcpy ( dst, src, len );
}

void cipher_null_decrypt ( struct cipher_algorithm *cipher __unused,
			   void *ctx __unused, const void *src, void *dst,
			   size_t len ) {
	memcpy ( dst, src, len );
}

void cipher_null_auth ( struct cipher_algorithm *cipher __unused,
			void *ctx __unused, void *auth __unused ) {
	/* Do nothing */
}

struct cipher_algorithm cipher_null = {
	.name = "null",
	.ctxsize = 0,
	.blocksize = 1,
	.alignsize = 1,
	.authsize = 0,
	.confidential = 0,
	.setkey = cipher_null_setkey,
	.setiv = cipher_null_setiv,
	.encrypt = cipher_null_encrypt,
	.decrypt = cipher_null_decrypt,
	.auth = cipher_null_auth,
};

int pubkey_null_encrypt ( struct pubkey_algorithm *pubkey __unused,
			  const struct asn1_cursor *key __unused,
			  const struct asn1_cursor *plaintext __unused,
			  struct asn1_builder *ciphertext __unused ) {
	return -ENOTTY;
}

int pubkey_null_decrypt ( struct pubkey_algorithm *pubkey __unused,
			  const struct asn1_cursor *key __unused,
			  const struct asn1_cursor *ciphertext __unused,
			  struct asn1_builder *plaintext __unused ) {
	return -ENOTTY;
}

int pubkey_null_sign ( struct pubkey_algorithm *pubkey __unused,
		       const struct asn1_cursor *key __unused,
		       struct digest_algorithm *digest __unused,
		       const void *value __unused,
		       struct asn1_builder *signature __unused ) {
	return -ENOTTY;
}

int pubkey_null_verify ( struct pubkey_algorithm *pubkey __unused,
			 const struct asn1_cursor *key __unused,
			 struct digest_algorithm *digest __unused,
			 const void *value __unused,
			 const struct asn1_cursor *signature __unused ) {
	return -ENOTTY;
}

int pubkey_null_match ( struct pubkey_algorithm *pubkey __unused,
			const struct asn1_cursor *private_key __unused,
			const struct asn1_cursor *public_key __unused ) {
	return -ENOTTY;
}

struct pubkey_algorithm pubkey_null = {
	.name = "null",
	.encrypt = pubkey_null_encrypt,
	.decrypt = pubkey_null_decrypt,
	.sign = pubkey_null_sign,
	.verify = pubkey_null_verify,
	.match = pubkey_null_match,
};
