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