10 #include "libtwofish/twofish_cbc.h"
14 #define TWOFISH_CBC_BLOCK_SIZE (128/BITS_PER_BYTE)
15 #define TWOFISH_KEY_MIN_LEN 128
16 #define TWOFISH_KEY_DEF_LEN 128
17 #define TWOFISH_KEY_MAX_LEN 256
20 do_twofish(u_int8_t
*buf
, size_t buf_size
, u_int8_t
*key
, size_t key_size
, u_int8_t
*iv
, bool enc
)
22 twofish_context twofish_ctx
;
23 char iv_bak
[TWOFISH_CBC_BLOCK_SIZE
];
24 char *new_iv
= NULL
; /* logic will avoid copy to NULL */
26 twofish_set_key(&twofish_ctx
, key
, key_size
);
28 * my TWOFISH cbc does not touch passed IV (optimization for
29 * ESP handling), so I must "emulate" des-like IV
34 (char*) buf
+ buf_size
-TWOFISH_CBC_BLOCK_SIZE
,
35 TWOFISH_CBC_BLOCK_SIZE
);
37 twofish_cbc_encrypt(&twofish_ctx
, buf
, buf
, buf_size
, iv
, enc
);
40 new_iv
= (char*) buf
+ buf_size
-TWOFISH_CBC_BLOCK_SIZE
;
42 memcpy(iv
, new_iv
, TWOFISH_CBC_BLOCK_SIZE
);
45 struct encrypt_desc encrypt_desc_twofish
=
47 algo_type
: IKE_ALG_ENCRYPT
,
48 algo_id
: OAKLEY_TWOFISH_CBC
,
50 enc_ctxsize
: sizeof(twofish_context
),
51 enc_blocksize
: TWOFISH_CBC_BLOCK_SIZE
,
52 keydeflen
: TWOFISH_KEY_MIN_LEN
,
53 keyminlen
: TWOFISH_KEY_DEF_LEN
,
54 keymaxlen
: TWOFISH_KEY_MAX_LEN
,
59 struct encrypt_desc encrypt_desc_twofish_ssh
=
61 algo_type
: IKE_ALG_ENCRYPT
,
62 algo_id
: OAKLEY_TWOFISH_CBC_SSH
,
64 enc_ctxsize
: sizeof(twofish_context
),
65 enc_blocksize
: TWOFISH_CBC_BLOCK_SIZE
,
66 keydeflen
: TWOFISH_KEY_MIN_LEN
,
67 keyminlen
: TWOFISH_KEY_DEF_LEN
,
68 keymaxlen
: TWOFISH_KEY_MAX_LEN
,
72 int ike_alg_twofish_init(void);
75 ike_alg_twofish_init(void)
77 int ret
= ike_alg_register_enc(&encrypt_desc_twofish
);
79 if (ike_alg_register_enc(&encrypt_desc_twofish_ssh
) < 0)
80 plog("ike_alg_twofish_init(): Experimental OAKLEY_TWOFISH_CBC_SSH activation failed");
85 IKE_ALG_INIT_NAME: ike_alg_twofish_init