Blame lib/cipher_int.h

Packit 549fdc
/*
Packit 549fdc
 * Copyright (C) 2000-2012 Free Software Foundation, Inc.
Packit 549fdc
 *
Packit 549fdc
 * Author: Nikos Mavrogiannopoulos
Packit 549fdc
 *
Packit 549fdc
 * This file is part of GnuTLS.
Packit 549fdc
 *
Packit 549fdc
 * The GnuTLS is free software; you can redistribute it and/or
Packit 549fdc
 * modify it under the terms of the GNU Lesser General Public License
Packit 549fdc
 * as published by the Free Software Foundation; either version 2.1 of
Packit 549fdc
 * the License, or (at your option) any later version.
Packit 549fdc
 *
Packit 549fdc
 * This library is distributed in the hope that it will be useful, but
Packit 549fdc
 * WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 549fdc
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit 549fdc
 * Lesser General Public License for more details.
Packit 549fdc
 *
Packit 549fdc
 * You should have received a copy of the GNU Lesser General Public License
Packit 549fdc
 * along with this program.  If not, see <http://www.gnu.org/licenses/>
Packit 549fdc
 *
Packit 549fdc
 */
Packit 549fdc
Packit 549fdc
#ifndef GNUTLS_CIPHER_INT
Packit 549fdc
#define GNUTLS_CIPHER_INT
Packit 549fdc
Packit 549fdc
#include <gnutls/crypto.h>
Packit 549fdc
#include "errors.h"
Packit 549fdc
#include <crypto-backend.h>
Packit 549fdc
Packit 549fdc
extern int crypto_cipher_prio;
Packit 549fdc
extern gnutls_crypto_cipher_st _gnutls_cipher_ops;
Packit 549fdc
Packit 549fdc
typedef int (*cipher_encrypt_func) (void *hd, const void *plaintext,
Packit 549fdc
				    size_t, void *ciphertext, size_t);
Packit 549fdc
typedef int (*cipher_decrypt_func) (void *hd, const void *ciphertext,
Packit 549fdc
				    size_t, void *plaintext, size_t);
Packit 549fdc
typedef int (*aead_cipher_encrypt_func) (void *hd,
Packit 549fdc
					 const void *nonce, size_t,
Packit 549fdc
					 const void *auth, size_t,
Packit 549fdc
					 size_t tag,
Packit 549fdc
					 const void *plaintext, size_t,
Packit 549fdc
					 void *ciphertext, size_t);
Packit 549fdc
typedef int (*aead_cipher_decrypt_func) (void *hd,
Packit 549fdc
					 const void *nonce, size_t,
Packit 549fdc
					 const void *auth, size_t,
Packit 549fdc
					 size_t tag,
Packit 549fdc
					 const void *ciphertext, size_t, 
Packit 549fdc
					 void *plaintext, size_t);
Packit 549fdc
typedef void (*cipher_deinit_func) (void *hd);
Packit 549fdc
Packit 549fdc
typedef int (*cipher_auth_func) (void *hd, const void *data, size_t);
Packit 549fdc
typedef int (*cipher_setiv_func) (void *hd, const void *iv, size_t);
Packit 549fdc
Packit 549fdc
typedef void (*cipher_tag_func) (void *hd, void *tag, size_t);
Packit 549fdc
Packit 549fdc
typedef struct {
Packit 549fdc
	void *handle;
Packit 549fdc
	const cipher_entry_st *e;
Packit 549fdc
	cipher_encrypt_func encrypt;
Packit 549fdc
	cipher_decrypt_func decrypt;
Packit 549fdc
	aead_cipher_encrypt_func aead_encrypt;
Packit 549fdc
	aead_cipher_decrypt_func aead_decrypt;
Packit 549fdc
	cipher_auth_func auth;
Packit 549fdc
	cipher_tag_func tag;
Packit 549fdc
	cipher_setiv_func setiv;
Packit 549fdc
	cipher_deinit_func deinit;
Packit 549fdc
} cipher_hd_st;
Packit 549fdc
Packit 549fdc
int _gnutls_cipher_init(cipher_hd_st *, const cipher_entry_st * e,
Packit 549fdc
			const gnutls_datum_t * key,
Packit 549fdc
			const gnutls_datum_t * iv, int enc);
Packit 549fdc
Packit 549fdc
inline static int _gnutls_cipher_setiv(const cipher_hd_st * handle,
Packit 549fdc
					const void *iv, size_t ivlen)
Packit 549fdc
{
Packit 549fdc
	return handle->setiv(handle->handle, iv, ivlen);
Packit 549fdc
}
Packit 549fdc
Packit 549fdc
inline static int
Packit 549fdc
_gnutls_cipher_encrypt2(const cipher_hd_st * handle, const void *text,
Packit 549fdc
			size_t textlen, void *ciphertext,
Packit 549fdc
			size_t ciphertextlen)
Packit 549fdc
{
Packit 549fdc
	if (likely(handle != NULL && handle->handle != NULL)) {
Packit 549fdc
		if (handle->encrypt == NULL) {
Packit 549fdc
			return (GNUTLS_E_INVALID_REQUEST);
Packit 549fdc
		}
Packit 549fdc
		return handle->encrypt(handle->handle, text, textlen,
Packit 549fdc
				       ciphertext, ciphertextlen);
Packit 549fdc
	}
Packit 549fdc
Packit 549fdc
	return 0;
Packit 549fdc
}
Packit 549fdc
Packit 549fdc
inline static int
Packit 549fdc
_gnutls_cipher_decrypt2(const cipher_hd_st * handle,
Packit 549fdc
			const void *ciphertext, size_t ciphertextlen,
Packit 549fdc
			void *text, size_t textlen)
Packit 549fdc
{
Packit 549fdc
	if (likely(handle != NULL && handle->handle != NULL)) {
Packit 549fdc
		if (handle->decrypt == NULL) {
Packit 549fdc
			return (GNUTLS_E_INVALID_REQUEST);
Packit 549fdc
		}
Packit 549fdc
		return handle->decrypt(handle->handle, ciphertext,
Packit 549fdc
				       ciphertextlen, text, textlen);
Packit 549fdc
	}
Packit 549fdc
Packit 549fdc
	return 0;
Packit 549fdc
}
Packit 549fdc
Packit 549fdc
inline static int
Packit 549fdc
_gnutls_aead_cipher_encrypt(const cipher_hd_st * handle,
Packit 549fdc
			    const void *nonce, size_t nonce_len,
Packit 549fdc
			    const void *auth, size_t auth_len,
Packit 549fdc
			    size_t tag,
Packit 549fdc
			    const void *text, size_t textlen,
Packit 549fdc
			    void *ciphertext, size_t ciphertextlen)
Packit 549fdc
{
Packit 549fdc
	if (likely(handle != NULL && handle->handle != NULL && handle->aead_encrypt != NULL)) {
Packit 549fdc
		return handle->aead_encrypt(handle->handle,
Packit 549fdc
					    nonce, nonce_len,
Packit 549fdc
					    auth, auth_len,
Packit 549fdc
					    tag,
Packit 549fdc
					    text, textlen,
Packit 549fdc
					    ciphertext, ciphertextlen);
Packit 549fdc
	}
Packit 549fdc
Packit 549fdc
	return GNUTLS_E_INVALID_REQUEST;
Packit 549fdc
}
Packit 549fdc
Packit 549fdc
inline static int
Packit 549fdc
_gnutls_aead_cipher_decrypt(const cipher_hd_st * handle,
Packit 549fdc
			    const void *nonce, size_t nonce_len,
Packit 549fdc
			    const void *auth, size_t auth_len,
Packit 549fdc
			    size_t tag,
Packit 549fdc
			    const void *ciphertext, size_t ciphertextlen,
Packit 549fdc
			    void *text, size_t textlen)
Packit 549fdc
{
Packit 549fdc
	if (likely(handle != NULL && handle->handle != NULL && handle->aead_decrypt != NULL)) {
Packit 549fdc
		return handle->aead_decrypt(handle->handle,
Packit 549fdc
					    nonce, nonce_len,
Packit 549fdc
					    auth, auth_len,
Packit 549fdc
					    tag,
Packit 549fdc
					    ciphertext, ciphertextlen,
Packit 549fdc
					    text, textlen);
Packit 549fdc
	}
Packit 549fdc
Packit 549fdc
	return GNUTLS_E_INVALID_REQUEST;
Packit 549fdc
}
Packit 549fdc
Packit 549fdc
inline static void _gnutls_cipher_deinit(cipher_hd_st * handle)
Packit 549fdc
{
Packit 549fdc
	if (likely(handle != NULL && handle->handle != NULL)) {
Packit 549fdc
		handle->deinit(handle->handle);
Packit 549fdc
		handle->handle = NULL;
Packit 549fdc
	}
Packit 549fdc
}
Packit 549fdc
Packit 549fdc
int _gnutls_cipher_exists(gnutls_cipher_algorithm_t cipher);
Packit 549fdc
Packit 549fdc
#define _gnutls_cipher_is_aead(h) _gnutls_cipher_algo_is_aead((h)->e)
Packit 549fdc
Packit 549fdc
/* returns the tag in AUTHENC ciphers */
Packit 549fdc
inline static void _gnutls_cipher_tag(const cipher_hd_st * handle,
Packit 549fdc
				      void *tag, size_t tag_size)
Packit 549fdc
{
Packit 549fdc
	if (likely(handle != NULL && handle->handle != NULL)) {
Packit 549fdc
		handle->tag(handle->handle, tag, tag_size);
Packit 549fdc
	}
Packit 549fdc
}
Packit 549fdc
Packit 549fdc
/* Add auth data for AUTHENC ciphers
Packit 549fdc
 */
Packit 549fdc
inline static int _gnutls_cipher_auth(const cipher_hd_st * handle,
Packit 549fdc
				      const void *text, size_t textlen)
Packit 549fdc
{
Packit 549fdc
	if (likely(handle != NULL && handle->handle != NULL)) {
Packit 549fdc
		return handle->auth(handle->handle, text, textlen);
Packit 549fdc
	}
Packit 549fdc
	return GNUTLS_E_INTERNAL_ERROR;
Packit 549fdc
}
Packit 549fdc
Packit 549fdc
#define _gnutls_cipher_encrypt(x,y,z) _gnutls_cipher_encrypt2(x,y,z,y,z)
Packit 549fdc
#define _gnutls_cipher_decrypt(x,y,z) _gnutls_cipher_decrypt2(x,y,z,y,z)
Packit 549fdc
Packit 549fdc
/* auth_cipher API. Allows combining a cipher with a MAC.
Packit 549fdc
 */
Packit 549fdc
Packit 549fdc
typedef struct {
Packit 549fdc
	cipher_hd_st cipher;
Packit 549fdc
	union {
Packit 549fdc
		digest_hd_st dig;
Packit 549fdc
		mac_hd_st mac;
Packit 549fdc
	} mac;
Packit 549fdc
	unsigned int is_mac:1;
Packit 549fdc
#ifdef ENABLE_SSL3
Packit 549fdc
	unsigned int ssl_hmac:1;
Packit 549fdc
#endif
Packit 549fdc
	unsigned int non_null:1;
Packit 549fdc
	unsigned int etm:1;
Packit 549fdc
	size_t tag_size;
Packit 549fdc
} auth_cipher_hd_st;
Packit 549fdc
Packit 549fdc
int _gnutls_auth_cipher_init(auth_cipher_hd_st * handle,
Packit 549fdc
			     const cipher_entry_st * e,
Packit 549fdc
			     const gnutls_datum_t * cipher_key,
Packit 549fdc
			     const gnutls_datum_t * iv,
Packit 549fdc
			     const mac_entry_st * me,
Packit 549fdc
			     const gnutls_datum_t * mac_key,
Packit 549fdc
			     unsigned etm,
Packit 549fdc
#ifdef ENABLE_SSL3
Packit 549fdc
			     unsigned ssl_hmac,
Packit 549fdc
#endif
Packit 549fdc
			     int enc);
Packit 549fdc
Packit 549fdc
int _gnutls_auth_cipher_add_auth(auth_cipher_hd_st * handle,
Packit 549fdc
				 const void *text, int textlen);
Packit 549fdc
Packit 549fdc
int _gnutls_auth_cipher_encrypt2_tag(auth_cipher_hd_st * handle,
Packit 549fdc
				     const uint8_t * text, int textlen,
Packit 549fdc
				     void *ciphertext, int ciphertextlen,
Packit 549fdc
				     int pad_size);
Packit 549fdc
int _gnutls_auth_cipher_decrypt2(auth_cipher_hd_st * handle,
Packit 549fdc
				 const void *ciphertext, int ciphertextlen,
Packit 549fdc
				 void *text, int textlen);
Packit 549fdc
int _gnutls_auth_cipher_tag(auth_cipher_hd_st * handle, void *tag,
Packit 549fdc
			    int tag_size);
Packit 549fdc
Packit 549fdc
inline static void _gnutls_auth_cipher_setiv(const auth_cipher_hd_st *
Packit 549fdc
					     handle, const void *iv,
Packit 549fdc
					     size_t ivlen)
Packit 549fdc
{
Packit 549fdc
	_gnutls_cipher_setiv(&handle->cipher, iv, ivlen);
Packit 549fdc
}
Packit 549fdc
Packit 549fdc
inline static size_t _gnutls_auth_cipher_tag_len(auth_cipher_hd_st *
Packit 549fdc
						 handle)
Packit 549fdc
{
Packit 549fdc
	return handle->tag_size;
Packit 549fdc
}
Packit 549fdc
Packit 549fdc
#define _gnutls_auth_cipher_is_aead(h) _gnutls_cipher_is_aead(&(h)->cipher)
Packit 549fdc
Packit 549fdc
void _gnutls_auth_cipher_deinit(auth_cipher_hd_st * handle);
Packit 549fdc
Packit 549fdc
Packit 549fdc
#endif				/* GNUTLS_CIPHER_INT */