11305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood/*
21305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * Copyright (c) 2004 The OpenBSD project
31305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood *
41305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * Permission to use, copy, modify, and distribute this software for any
51305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * purpose with or without fee is hereby granted, provided that the above
61305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * copyright notice and this permission notice appear in all copies.
71305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood *
81305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
91305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
101305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
111305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
121305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
131305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
141305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
151305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood */
161305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
171305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#include "includes.h"
181305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
191305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#include <openssl/evp.h>
201305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
211305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#include <string.h>
221305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
231305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#if !defined(EVP_CTRL_SET_ACSS_MODE) && (OPENSSL_VERSION_NUMBER >= 0x00907000L)
241305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
251305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#include "acss.h"
261305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#include "openbsd-compat/openssl-compat.h"
271305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
281305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#define data(ctx) ((EVP_ACSS_KEY *)(ctx)->cipher_data)
291305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
301305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodtypedef struct {
311305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	ACSS_KEY ks;
321305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood} EVP_ACSS_KEY;
331305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
341305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#define EVP_CTRL_SET_ACSS_MODE          0xff06
351305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#define EVP_CTRL_SET_ACSS_SUBKEY        0xff07
361305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
371305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodstatic int
381305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodacss_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
391305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood    const unsigned char *iv, int enc)
401305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood{
411305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	acss_setkey(&data(ctx)->ks,key,enc,ACSS_DATA);
421305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	return 1;
431305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood}
441305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
451305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodstatic int
461305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodacss_ciph(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in,
471305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood    LIBCRYPTO_EVP_INL_TYPE inl)
481305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood{
491305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	acss(&data(ctx)->ks,inl,in,out);
501305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	return 1;
511305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood}
521305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
531305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodstatic int
541305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodacss_ctrl(EVP_CIPHER_CTX *ctx, int type, int arg, void *ptr)
551305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood{
561305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	switch(type) {
571305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	case EVP_CTRL_SET_ACSS_MODE:
581305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood		data(ctx)->ks.mode = arg;
591305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood		return 1;
601305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	case EVP_CTRL_SET_ACSS_SUBKEY:
611305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood		acss_setsubkey(&data(ctx)->ks,(unsigned char *)ptr);
621305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood		return 1;
631305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	default:
641305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood		return -1;
651305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	}
661305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood}
671305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
681305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodconst EVP_CIPHER *
691305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodevp_acss(void)
701305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood{
711305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	static EVP_CIPHER acss_cipher;
721305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
731305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	memset(&acss_cipher, 0, sizeof(EVP_CIPHER));
741305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
751305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	acss_cipher.nid = NID_undef;
761305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	acss_cipher.block_size = 1;
771305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	acss_cipher.key_len = 5;
781305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	acss_cipher.init = acss_init_key;
791305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	acss_cipher.do_cipher = acss_ciph;
801305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	acss_cipher.ctx_size = sizeof(EVP_ACSS_KEY);
811305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	acss_cipher.ctrl = acss_ctrl;
821305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
831305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	return (&acss_cipher);
841305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood}
851305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#endif
861305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
87