Damien Miller | 4f0fe68 | 2004-01-27 21:19:21 +1100 | [diff] [blame] | 1 | /* |
| 2 | * Copyright (c) 2004 The OpenBSD project |
| 3 | * |
| 4 | * Permission to use, copy, modify, and distribute this software for any |
| 5 | * purpose with or without fee is hereby granted, provided that the above |
| 6 | * copyright notice and this permission notice appear in all copies. |
| 7 | * |
| 8 | * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |
| 9 | * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |
| 10 | * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR |
| 11 | * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
| 12 | * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |
| 13 | * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
| 14 | * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
| 15 | */ |
| 16 | |
| 17 | #include "includes.h" |
| 18 | #include <openssl/evp.h> |
| 19 | |
Darren Tucker | 6977fe7 | 2004-02-06 15:26:10 +1100 | [diff] [blame] | 20 | RCSID("$Id: cipher-acss.c,v 1.2 2004/02/06 04:26:11 dtucker Exp $"); |
Damien Miller | 4f0fe68 | 2004-01-27 21:19:21 +1100 | [diff] [blame] | 21 | |
Darren Tucker | 6977fe7 | 2004-02-06 15:26:10 +1100 | [diff] [blame] | 22 | #if !defined(EVP_CTRL_SET_ACSS_MODE) && (OPENSSL_VERSION_NUMBER >= 0x00907000L) |
Damien Miller | 4f0fe68 | 2004-01-27 21:19:21 +1100 | [diff] [blame] | 23 | |
| 24 | #include "acss.h" |
| 25 | |
| 26 | #define data(ctx) ((EVP_ACSS_KEY *)(ctx)->cipher_data) |
| 27 | |
| 28 | typedef struct { |
| 29 | ACSS_KEY ks; |
| 30 | } EVP_ACSS_KEY; |
| 31 | |
| 32 | #define EVP_CTRL_SET_ACSS_MODE 0xff06 |
| 33 | #define EVP_CTRL_SET_ACSS_SUBKEY 0xff07 |
| 34 | |
| 35 | static int |
| 36 | acss_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key, |
| 37 | const unsigned char *iv, int enc) |
| 38 | { |
| 39 | acss_setkey(&data(ctx)->ks,key,enc,ACSS_DATA); |
| 40 | return 1; |
| 41 | } |
| 42 | |
| 43 | static int |
| 44 | acss_ciph(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in, |
| 45 | unsigned int inl) |
| 46 | { |
| 47 | acss(&data(ctx)->ks,inl,in,out); |
| 48 | return 1; |
| 49 | } |
| 50 | |
| 51 | static int |
| 52 | acss_ctrl(EVP_CIPHER_CTX *ctx, int type, int arg, void *ptr) |
| 53 | { |
| 54 | switch(type) { |
| 55 | case EVP_CTRL_SET_ACSS_MODE: |
| 56 | data(ctx)->ks.mode = arg; |
| 57 | return 1; |
| 58 | case EVP_CTRL_SET_ACSS_SUBKEY: |
| 59 | acss_setsubkey(&data(ctx)->ks,(unsigned char *)ptr); |
| 60 | return 1; |
| 61 | default: |
| 62 | return -1; |
| 63 | } |
| 64 | } |
| 65 | |
| 66 | const EVP_CIPHER * |
| 67 | evp_acss(void) |
| 68 | { |
| 69 | static EVP_CIPHER acss_cipher; |
| 70 | |
| 71 | memset(&acss_cipher, 0, sizeof(EVP_CIPHER)); |
| 72 | |
| 73 | acss_cipher.nid = NID_undef; |
| 74 | acss_cipher.block_size = 1; |
| 75 | acss_cipher.key_len = 5; |
| 76 | acss_cipher.init = acss_init_key; |
| 77 | acss_cipher.do_cipher = acss_ciph; |
| 78 | acss_cipher.ctx_size = sizeof(EVP_ACSS_KEY); |
| 79 | acss_cipher.ctrl = acss_ctrl; |
| 80 | |
| 81 | return (&acss_cipher); |
| 82 | } |
| 83 | #endif |
| 84 | |