1c1e26e1eSJan Glauber /* 2c1e26e1eSJan Glauber * Cryptographic API. 3c1e26e1eSJan Glauber * 4c1e26e1eSJan Glauber * s390 implementation of the DES Cipher Algorithm. 5c1e26e1eSJan Glauber * 6c1e26e1eSJan Glauber * Copyright (c) 2003 IBM Deutschland Entwicklung GmbH, IBM Corporation 7c1e26e1eSJan Glauber * Author(s): Thomas Spatzier (tspat@de.ibm.com) 8c1e26e1eSJan Glauber * 9c1e26e1eSJan Glauber * 10c1e26e1eSJan Glauber * This program is free software; you can redistribute it and/or modify 11c1e26e1eSJan Glauber * it under the terms of the GNU General Public License as published by 12c1e26e1eSJan Glauber * the Free Software Foundation; either version 2 of the License, or 13c1e26e1eSJan Glauber * (at your option) any later version. 14c1e26e1eSJan Glauber * 15c1e26e1eSJan Glauber */ 16c1e26e1eSJan Glauber #include <linux/init.h> 17c1e26e1eSJan Glauber #include <linux/module.h> 18c1e26e1eSJan Glauber #include <linux/crypto.h> 19c1357833SJan Glauber 20c1e26e1eSJan Glauber #include "crypt_s390.h" 21c1e26e1eSJan Glauber #include "crypto_des.h" 22c1e26e1eSJan Glauber 23c1e26e1eSJan Glauber #define DES_BLOCK_SIZE 8 24c1e26e1eSJan Glauber #define DES_KEY_SIZE 8 25c1e26e1eSJan Glauber 26c1e26e1eSJan Glauber #define DES3_128_KEY_SIZE (2 * DES_KEY_SIZE) 27c1e26e1eSJan Glauber #define DES3_128_BLOCK_SIZE DES_BLOCK_SIZE 28c1e26e1eSJan Glauber 29c1e26e1eSJan Glauber #define DES3_192_KEY_SIZE (3 * DES_KEY_SIZE) 30c1e26e1eSJan Glauber #define DES3_192_BLOCK_SIZE DES_BLOCK_SIZE 31c1e26e1eSJan Glauber 32c1e26e1eSJan Glauber struct crypt_s390_des_ctx { 33c1e26e1eSJan Glauber u8 iv[DES_BLOCK_SIZE]; 34c1e26e1eSJan Glauber u8 key[DES_KEY_SIZE]; 35c1e26e1eSJan Glauber }; 36c1e26e1eSJan Glauber 37c1e26e1eSJan Glauber struct crypt_s390_des3_128_ctx { 38c1e26e1eSJan Glauber u8 iv[DES_BLOCK_SIZE]; 39c1e26e1eSJan Glauber u8 key[DES3_128_KEY_SIZE]; 40c1e26e1eSJan Glauber }; 41c1e26e1eSJan Glauber 42c1e26e1eSJan Glauber struct crypt_s390_des3_192_ctx { 43c1e26e1eSJan Glauber u8 iv[DES_BLOCK_SIZE]; 44c1e26e1eSJan Glauber u8 key[DES3_192_KEY_SIZE]; 45c1e26e1eSJan Glauber }; 46c1e26e1eSJan Glauber 476c2bb98bSHerbert Xu static int des_setkey(struct crypto_tfm *tfm, const u8 *key, 486c2bb98bSHerbert Xu unsigned int keylen, u32 *flags) 49c1e26e1eSJan Glauber { 506c2bb98bSHerbert Xu struct crypt_s390_des_ctx *dctx = crypto_tfm_ctx(tfm); 51c1e26e1eSJan Glauber int ret; 52c1e26e1eSJan Glauber 53c1357833SJan Glauber /* test if key is valid (not a weak key) */ 54c1e26e1eSJan Glauber ret = crypto_des_check_key(key, keylen, flags); 55c1357833SJan Glauber if (ret == 0) 56c1e26e1eSJan Glauber memcpy(dctx->key, key, keylen); 57c1e26e1eSJan Glauber return ret; 58c1e26e1eSJan Glauber } 59c1e26e1eSJan Glauber 606c2bb98bSHerbert Xu static void des_encrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in) 61c1e26e1eSJan Glauber { 626c2bb98bSHerbert Xu struct crypt_s390_des_ctx *dctx = crypto_tfm_ctx(tfm); 63c1e26e1eSJan Glauber 64b8dc6038SJan Glauber crypt_s390_km(KM_DEA_ENCRYPT, dctx->key, out, in, DES_BLOCK_SIZE); 65c1e26e1eSJan Glauber } 66c1e26e1eSJan Glauber 676c2bb98bSHerbert Xu static void des_decrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in) 68c1e26e1eSJan Glauber { 696c2bb98bSHerbert Xu struct crypt_s390_des_ctx *dctx = crypto_tfm_ctx(tfm); 70c1e26e1eSJan Glauber 71b8dc6038SJan Glauber crypt_s390_km(KM_DEA_DECRYPT, dctx->key, out, in, DES_BLOCK_SIZE); 72b8dc6038SJan Glauber } 73b8dc6038SJan Glauber 74b8dc6038SJan Glauber static unsigned int des_encrypt_ecb(const struct cipher_desc *desc, u8 *out, 75b8dc6038SJan Glauber const u8 *in, unsigned int nbytes) 76b8dc6038SJan Glauber { 77b8dc6038SJan Glauber struct crypt_s390_des_ctx *sctx = crypto_tfm_ctx(desc->tfm); 78b8dc6038SJan Glauber int ret; 79b8dc6038SJan Glauber 80b8dc6038SJan Glauber /* only use complete blocks */ 81b8dc6038SJan Glauber nbytes &= ~(DES_BLOCK_SIZE - 1); 82b8dc6038SJan Glauber ret = crypt_s390_km(KM_DEA_ENCRYPT, sctx->key, out, in, nbytes); 83b8dc6038SJan Glauber BUG_ON((ret < 0) || (ret != nbytes)); 84b8dc6038SJan Glauber 85b8dc6038SJan Glauber return nbytes; 86b8dc6038SJan Glauber } 87b8dc6038SJan Glauber 88b8dc6038SJan Glauber static unsigned int des_decrypt_ecb(const struct cipher_desc *desc, u8 *out, 89b8dc6038SJan Glauber const u8 *in, unsigned int nbytes) 90b8dc6038SJan Glauber { 91b8dc6038SJan Glauber struct crypt_s390_des_ctx *sctx = crypto_tfm_ctx(desc->tfm); 92b8dc6038SJan Glauber int ret; 93b8dc6038SJan Glauber 94b8dc6038SJan Glauber /* only use complete blocks */ 95b8dc6038SJan Glauber nbytes &= ~(DES_BLOCK_SIZE - 1); 96b8dc6038SJan Glauber ret = crypt_s390_km(KM_DEA_DECRYPT, sctx->key, out, in, nbytes); 97b8dc6038SJan Glauber BUG_ON((ret < 0) || (ret != nbytes)); 98b8dc6038SJan Glauber 99b8dc6038SJan Glauber return nbytes; 100b8dc6038SJan Glauber } 101b8dc6038SJan Glauber 102b8dc6038SJan Glauber static unsigned int des_encrypt_cbc(const struct cipher_desc *desc, u8 *out, 103b8dc6038SJan Glauber const u8 *in, unsigned int nbytes) 104b8dc6038SJan Glauber { 105b8dc6038SJan Glauber struct crypt_s390_des_ctx *sctx = crypto_tfm_ctx(desc->tfm); 106b8dc6038SJan Glauber int ret; 107b8dc6038SJan Glauber 108b8dc6038SJan Glauber /* only use complete blocks */ 109b8dc6038SJan Glauber nbytes &= ~(DES_BLOCK_SIZE - 1); 110b8dc6038SJan Glauber 111b8dc6038SJan Glauber memcpy(sctx->iv, desc->info, DES_BLOCK_SIZE); 112b8dc6038SJan Glauber ret = crypt_s390_kmc(KMC_DEA_ENCRYPT, &sctx->iv, out, in, nbytes); 113b8dc6038SJan Glauber BUG_ON((ret < 0) || (ret != nbytes)); 114b8dc6038SJan Glauber 115b8dc6038SJan Glauber memcpy(desc->info, sctx->iv, DES_BLOCK_SIZE); 116b8dc6038SJan Glauber return nbytes; 117b8dc6038SJan Glauber } 118b8dc6038SJan Glauber 119b8dc6038SJan Glauber static unsigned int des_decrypt_cbc(const struct cipher_desc *desc, u8 *out, 120b8dc6038SJan Glauber const u8 *in, unsigned int nbytes) 121b8dc6038SJan Glauber { 122b8dc6038SJan Glauber struct crypt_s390_des_ctx *sctx = crypto_tfm_ctx(desc->tfm); 123b8dc6038SJan Glauber int ret; 124b8dc6038SJan Glauber 125b8dc6038SJan Glauber /* only use complete blocks */ 126b8dc6038SJan Glauber nbytes &= ~(DES_BLOCK_SIZE - 1); 127b8dc6038SJan Glauber 128b8dc6038SJan Glauber memcpy(&sctx->iv, desc->info, DES_BLOCK_SIZE); 129b8dc6038SJan Glauber ret = crypt_s390_kmc(KMC_DEA_DECRYPT, &sctx->iv, out, in, nbytes); 130b8dc6038SJan Glauber BUG_ON((ret < 0) || (ret != nbytes)); 131b8dc6038SJan Glauber 132b8dc6038SJan Glauber return nbytes; 133c1e26e1eSJan Glauber } 134c1e26e1eSJan Glauber 135c1e26e1eSJan Glauber static struct crypto_alg des_alg = { 136c1e26e1eSJan Glauber .cra_name = "des", 137c1e26e1eSJan Glauber .cra_flags = CRYPTO_ALG_TYPE_CIPHER, 138c1e26e1eSJan Glauber .cra_blocksize = DES_BLOCK_SIZE, 139c1e26e1eSJan Glauber .cra_ctxsize = sizeof(struct crypt_s390_des_ctx), 140c1e26e1eSJan Glauber .cra_module = THIS_MODULE, 141c1e26e1eSJan Glauber .cra_list = LIST_HEAD_INIT(des_alg.cra_list), 142c1357833SJan Glauber .cra_u = { 143c1357833SJan Glauber .cipher = { 144c1e26e1eSJan Glauber .cia_min_keysize = DES_KEY_SIZE, 145c1e26e1eSJan Glauber .cia_max_keysize = DES_KEY_SIZE, 146c1e26e1eSJan Glauber .cia_setkey = des_setkey, 147c1e26e1eSJan Glauber .cia_encrypt = des_encrypt, 148b8dc6038SJan Glauber .cia_decrypt = des_decrypt, 149b8dc6038SJan Glauber .cia_encrypt_ecb = des_encrypt_ecb, 150b8dc6038SJan Glauber .cia_decrypt_ecb = des_decrypt_ecb, 151b8dc6038SJan Glauber .cia_encrypt_cbc = des_encrypt_cbc, 152b8dc6038SJan Glauber .cia_decrypt_cbc = des_decrypt_cbc, 153c1357833SJan Glauber } 154c1357833SJan Glauber } 155c1e26e1eSJan Glauber }; 156c1e26e1eSJan Glauber 157c1e26e1eSJan Glauber /* 158c1e26e1eSJan Glauber * RFC2451: 159c1e26e1eSJan Glauber * 160c1e26e1eSJan Glauber * For DES-EDE3, there is no known need to reject weak or 161c1e26e1eSJan Glauber * complementation keys. Any weakness is obviated by the use of 162c1e26e1eSJan Glauber * multiple keys. 163c1e26e1eSJan Glauber * 164c1e26e1eSJan Glauber * However, if the two independent 64-bit keys are equal, 165c1e26e1eSJan Glauber * then the DES3 operation is simply the same as DES. 166c1e26e1eSJan Glauber * Implementers MUST reject keys that exhibit this property. 167c1e26e1eSJan Glauber * 168c1e26e1eSJan Glauber */ 1696c2bb98bSHerbert Xu static int des3_128_setkey(struct crypto_tfm *tfm, const u8 *key, 1706c2bb98bSHerbert Xu unsigned int keylen, u32 *flags) 171c1e26e1eSJan Glauber { 172c1e26e1eSJan Glauber int i, ret; 1736c2bb98bSHerbert Xu struct crypt_s390_des3_128_ctx *dctx = crypto_tfm_ctx(tfm); 174c1e26e1eSJan Glauber const u8* temp_key = key; 175c1e26e1eSJan Glauber 176c1e26e1eSJan Glauber if (!(memcmp(key, &key[DES_KEY_SIZE], DES_KEY_SIZE))) { 177c1e26e1eSJan Glauber *flags |= CRYPTO_TFM_RES_BAD_KEY_SCHED; 178c1e26e1eSJan Glauber return -EINVAL; 179c1e26e1eSJan Glauber } 180c1e26e1eSJan Glauber for (i = 0; i < 2; i++, temp_key += DES_KEY_SIZE) { 181c1e26e1eSJan Glauber ret = crypto_des_check_key(temp_key, DES_KEY_SIZE, flags); 182c1e26e1eSJan Glauber if (ret < 0) 183c1e26e1eSJan Glauber return ret; 184c1e26e1eSJan Glauber } 185c1e26e1eSJan Glauber memcpy(dctx->key, key, keylen); 186c1e26e1eSJan Glauber return 0; 187c1e26e1eSJan Glauber } 188c1e26e1eSJan Glauber 1896c2bb98bSHerbert Xu static void des3_128_encrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src) 190c1e26e1eSJan Glauber { 1916c2bb98bSHerbert Xu struct crypt_s390_des3_128_ctx *dctx = crypto_tfm_ctx(tfm); 192c1e26e1eSJan Glauber 193c1e26e1eSJan Glauber crypt_s390_km(KM_TDEA_128_ENCRYPT, dctx->key, dst, (void*)src, 194c1e26e1eSJan Glauber DES3_128_BLOCK_SIZE); 195c1e26e1eSJan Glauber } 196c1e26e1eSJan Glauber 1976c2bb98bSHerbert Xu static void des3_128_decrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src) 198c1e26e1eSJan Glauber { 1996c2bb98bSHerbert Xu struct crypt_s390_des3_128_ctx *dctx = crypto_tfm_ctx(tfm); 200c1e26e1eSJan Glauber 201c1e26e1eSJan Glauber crypt_s390_km(KM_TDEA_128_DECRYPT, dctx->key, dst, (void*)src, 202c1e26e1eSJan Glauber DES3_128_BLOCK_SIZE); 203c1e26e1eSJan Glauber } 204c1e26e1eSJan Glauber 205b8dc6038SJan Glauber static unsigned int des3_128_encrypt_ecb(const struct cipher_desc *desc, 206b8dc6038SJan Glauber u8 *out, const u8 *in, 207b8dc6038SJan Glauber unsigned int nbytes) 208b8dc6038SJan Glauber { 209b8dc6038SJan Glauber struct crypt_s390_des3_128_ctx *sctx = crypto_tfm_ctx(desc->tfm); 210b8dc6038SJan Glauber int ret; 211b8dc6038SJan Glauber 212b8dc6038SJan Glauber /* only use complete blocks */ 213b8dc6038SJan Glauber nbytes &= ~(DES3_128_BLOCK_SIZE - 1); 214b8dc6038SJan Glauber ret = crypt_s390_km(KM_TDEA_128_ENCRYPT, sctx->key, out, in, nbytes); 215b8dc6038SJan Glauber BUG_ON((ret < 0) || (ret != nbytes)); 216b8dc6038SJan Glauber 217b8dc6038SJan Glauber return nbytes; 218b8dc6038SJan Glauber } 219b8dc6038SJan Glauber 220b8dc6038SJan Glauber static unsigned int des3_128_decrypt_ecb(const struct cipher_desc *desc, 221b8dc6038SJan Glauber u8 *out, const u8 *in, 222b8dc6038SJan Glauber unsigned int nbytes) 223b8dc6038SJan Glauber { 224b8dc6038SJan Glauber struct crypt_s390_des3_128_ctx *sctx = crypto_tfm_ctx(desc->tfm); 225b8dc6038SJan Glauber int ret; 226b8dc6038SJan Glauber 227b8dc6038SJan Glauber /* only use complete blocks */ 228b8dc6038SJan Glauber nbytes &= ~(DES3_128_BLOCK_SIZE - 1); 229b8dc6038SJan Glauber ret = crypt_s390_km(KM_TDEA_128_DECRYPT, sctx->key, out, in, nbytes); 230b8dc6038SJan Glauber BUG_ON((ret < 0) || (ret != nbytes)); 231b8dc6038SJan Glauber 232b8dc6038SJan Glauber return nbytes; 233b8dc6038SJan Glauber } 234b8dc6038SJan Glauber 235b8dc6038SJan Glauber static unsigned int des3_128_encrypt_cbc(const struct cipher_desc *desc, 236b8dc6038SJan Glauber u8 *out, const u8 *in, 237b8dc6038SJan Glauber unsigned int nbytes) 238b8dc6038SJan Glauber { 239b8dc6038SJan Glauber struct crypt_s390_des3_128_ctx *sctx = crypto_tfm_ctx(desc->tfm); 240b8dc6038SJan Glauber int ret; 241b8dc6038SJan Glauber 242b8dc6038SJan Glauber /* only use complete blocks */ 243b8dc6038SJan Glauber nbytes &= ~(DES3_128_BLOCK_SIZE - 1); 244b8dc6038SJan Glauber 245b8dc6038SJan Glauber memcpy(sctx->iv, desc->info, DES3_128_BLOCK_SIZE); 246b8dc6038SJan Glauber ret = crypt_s390_kmc(KMC_TDEA_128_ENCRYPT, &sctx->iv, out, in, nbytes); 247b8dc6038SJan Glauber BUG_ON((ret < 0) || (ret != nbytes)); 248b8dc6038SJan Glauber 249b8dc6038SJan Glauber memcpy(desc->info, sctx->iv, DES3_128_BLOCK_SIZE); 250b8dc6038SJan Glauber return nbytes; 251b8dc6038SJan Glauber } 252b8dc6038SJan Glauber 253b8dc6038SJan Glauber static unsigned int des3_128_decrypt_cbc(const struct cipher_desc *desc, 254b8dc6038SJan Glauber u8 *out, const u8 *in, 255b8dc6038SJan Glauber unsigned int nbytes) 256b8dc6038SJan Glauber { 257b8dc6038SJan Glauber struct crypt_s390_des3_128_ctx *sctx = crypto_tfm_ctx(desc->tfm); 258b8dc6038SJan Glauber int ret; 259b8dc6038SJan Glauber 260b8dc6038SJan Glauber /* only use complete blocks */ 261b8dc6038SJan Glauber nbytes &= ~(DES3_128_BLOCK_SIZE - 1); 262b8dc6038SJan Glauber 263b8dc6038SJan Glauber memcpy(&sctx->iv, desc->info, DES3_128_BLOCK_SIZE); 264b8dc6038SJan Glauber ret = crypt_s390_kmc(KMC_TDEA_128_DECRYPT, &sctx->iv, out, in, nbytes); 265b8dc6038SJan Glauber BUG_ON((ret < 0) || (ret != nbytes)); 266b8dc6038SJan Glauber 267b8dc6038SJan Glauber return nbytes; 268b8dc6038SJan Glauber } 269b8dc6038SJan Glauber 270c1e26e1eSJan Glauber static struct crypto_alg des3_128_alg = { 271c1e26e1eSJan Glauber .cra_name = "des3_ede128", 272c1e26e1eSJan Glauber .cra_flags = CRYPTO_ALG_TYPE_CIPHER, 273c1e26e1eSJan Glauber .cra_blocksize = DES3_128_BLOCK_SIZE, 274c1e26e1eSJan Glauber .cra_ctxsize = sizeof(struct crypt_s390_des3_128_ctx), 275c1e26e1eSJan Glauber .cra_module = THIS_MODULE, 276c1e26e1eSJan Glauber .cra_list = LIST_HEAD_INIT(des3_128_alg.cra_list), 277c1357833SJan Glauber .cra_u = { 278c1357833SJan Glauber .cipher = { 279c1e26e1eSJan Glauber .cia_min_keysize = DES3_128_KEY_SIZE, 280c1e26e1eSJan Glauber .cia_max_keysize = DES3_128_KEY_SIZE, 281c1e26e1eSJan Glauber .cia_setkey = des3_128_setkey, 282c1e26e1eSJan Glauber .cia_encrypt = des3_128_encrypt, 283b8dc6038SJan Glauber .cia_decrypt = des3_128_decrypt, 284b8dc6038SJan Glauber .cia_encrypt_ecb = des3_128_encrypt_ecb, 285b8dc6038SJan Glauber .cia_decrypt_ecb = des3_128_decrypt_ecb, 286b8dc6038SJan Glauber .cia_encrypt_cbc = des3_128_encrypt_cbc, 287b8dc6038SJan Glauber .cia_decrypt_cbc = des3_128_decrypt_cbc, 288c1357833SJan Glauber } 289c1357833SJan Glauber } 290c1e26e1eSJan Glauber }; 291c1e26e1eSJan Glauber 292c1e26e1eSJan Glauber /* 293c1e26e1eSJan Glauber * RFC2451: 294c1e26e1eSJan Glauber * 295c1e26e1eSJan Glauber * For DES-EDE3, there is no known need to reject weak or 296c1e26e1eSJan Glauber * complementation keys. Any weakness is obviated by the use of 297c1e26e1eSJan Glauber * multiple keys. 298c1e26e1eSJan Glauber * 299c1e26e1eSJan Glauber * However, if the first two or last two independent 64-bit keys are 300c1e26e1eSJan Glauber * equal (k1 == k2 or k2 == k3), then the DES3 operation is simply the 301c1e26e1eSJan Glauber * same as DES. Implementers MUST reject keys that exhibit this 302c1e26e1eSJan Glauber * property. 303c1e26e1eSJan Glauber * 304c1e26e1eSJan Glauber */ 3056c2bb98bSHerbert Xu static int des3_192_setkey(struct crypto_tfm *tfm, const u8 *key, 3066c2bb98bSHerbert Xu unsigned int keylen, u32 *flags) 307c1e26e1eSJan Glauber { 308c1e26e1eSJan Glauber int i, ret; 3096c2bb98bSHerbert Xu struct crypt_s390_des3_192_ctx *dctx = crypto_tfm_ctx(tfm); 310c1357833SJan Glauber const u8* temp_key = key; 311c1e26e1eSJan Glauber 312c1e26e1eSJan Glauber if (!(memcmp(key, &key[DES_KEY_SIZE], DES_KEY_SIZE) && 313c1e26e1eSJan Glauber memcmp(&key[DES_KEY_SIZE], &key[DES_KEY_SIZE * 2], 314c1e26e1eSJan Glauber DES_KEY_SIZE))) { 315c1e26e1eSJan Glauber 316c1e26e1eSJan Glauber *flags |= CRYPTO_TFM_RES_BAD_KEY_SCHED; 317c1e26e1eSJan Glauber return -EINVAL; 318c1e26e1eSJan Glauber } 319c1e26e1eSJan Glauber for (i = 0; i < 3; i++, temp_key += DES_KEY_SIZE) { 320c1e26e1eSJan Glauber ret = crypto_des_check_key(temp_key, DES_KEY_SIZE, flags); 321c1357833SJan Glauber if (ret < 0) 322c1e26e1eSJan Glauber return ret; 323c1e26e1eSJan Glauber } 324c1e26e1eSJan Glauber memcpy(dctx->key, key, keylen); 325c1e26e1eSJan Glauber return 0; 326c1e26e1eSJan Glauber } 327c1e26e1eSJan Glauber 3286c2bb98bSHerbert Xu static void des3_192_encrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src) 329c1e26e1eSJan Glauber { 3306c2bb98bSHerbert Xu struct crypt_s390_des3_192_ctx *dctx = crypto_tfm_ctx(tfm); 331c1e26e1eSJan Glauber 332c1e26e1eSJan Glauber crypt_s390_km(KM_TDEA_192_ENCRYPT, dctx->key, dst, (void*)src, 333c1e26e1eSJan Glauber DES3_192_BLOCK_SIZE); 334c1e26e1eSJan Glauber } 335c1e26e1eSJan Glauber 3366c2bb98bSHerbert Xu static void des3_192_decrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src) 337c1e26e1eSJan Glauber { 3386c2bb98bSHerbert Xu struct crypt_s390_des3_192_ctx *dctx = crypto_tfm_ctx(tfm); 339c1e26e1eSJan Glauber 340c1e26e1eSJan Glauber crypt_s390_km(KM_TDEA_192_DECRYPT, dctx->key, dst, (void*)src, 341c1e26e1eSJan Glauber DES3_192_BLOCK_SIZE); 342c1e26e1eSJan Glauber } 343c1e26e1eSJan Glauber 344b8dc6038SJan Glauber static unsigned int des3_192_encrypt_ecb(const struct cipher_desc *desc, 345b8dc6038SJan Glauber u8 *out, const u8 *in, 346b8dc6038SJan Glauber unsigned int nbytes) 347b8dc6038SJan Glauber { 348b8dc6038SJan Glauber struct crypt_s390_des3_192_ctx *sctx = crypto_tfm_ctx(desc->tfm); 349b8dc6038SJan Glauber int ret; 350b8dc6038SJan Glauber 351b8dc6038SJan Glauber /* only use complete blocks */ 352b8dc6038SJan Glauber nbytes &= ~(DES3_192_BLOCK_SIZE - 1); 353b8dc6038SJan Glauber ret = crypt_s390_km(KM_TDEA_192_ENCRYPT, sctx->key, out, in, nbytes); 354b8dc6038SJan Glauber BUG_ON((ret < 0) || (ret != nbytes)); 355b8dc6038SJan Glauber 356b8dc6038SJan Glauber return nbytes; 357b8dc6038SJan Glauber } 358b8dc6038SJan Glauber 359b8dc6038SJan Glauber static unsigned int des3_192_decrypt_ecb(const struct cipher_desc *desc, 360b8dc6038SJan Glauber u8 *out, const u8 *in, 361b8dc6038SJan Glauber unsigned int nbytes) 362b8dc6038SJan Glauber { 363b8dc6038SJan Glauber struct crypt_s390_des3_192_ctx *sctx = crypto_tfm_ctx(desc->tfm); 364b8dc6038SJan Glauber int ret; 365b8dc6038SJan Glauber 366b8dc6038SJan Glauber /* only use complete blocks */ 367b8dc6038SJan Glauber nbytes &= ~(DES3_192_BLOCK_SIZE - 1); 368b8dc6038SJan Glauber ret = crypt_s390_km(KM_TDEA_192_DECRYPT, sctx->key, out, in, nbytes); 369b8dc6038SJan Glauber BUG_ON((ret < 0) || (ret != nbytes)); 370b8dc6038SJan Glauber 371b8dc6038SJan Glauber return nbytes; 372b8dc6038SJan Glauber } 373b8dc6038SJan Glauber 374b8dc6038SJan Glauber static unsigned int des3_192_encrypt_cbc(const struct cipher_desc *desc, 375b8dc6038SJan Glauber u8 *out, const u8 *in, 376b8dc6038SJan Glauber unsigned int nbytes) 377b8dc6038SJan Glauber { 378b8dc6038SJan Glauber struct crypt_s390_des3_192_ctx *sctx = crypto_tfm_ctx(desc->tfm); 379b8dc6038SJan Glauber int ret; 380b8dc6038SJan Glauber 381b8dc6038SJan Glauber /* only use complete blocks */ 382b8dc6038SJan Glauber nbytes &= ~(DES3_192_BLOCK_SIZE - 1); 383b8dc6038SJan Glauber 384b8dc6038SJan Glauber memcpy(sctx->iv, desc->info, DES3_192_BLOCK_SIZE); 385b8dc6038SJan Glauber ret = crypt_s390_kmc(KMC_TDEA_192_ENCRYPT, &sctx->iv, out, in, nbytes); 386b8dc6038SJan Glauber BUG_ON((ret < 0) || (ret != nbytes)); 387b8dc6038SJan Glauber 388b8dc6038SJan Glauber memcpy(desc->info, sctx->iv, DES3_192_BLOCK_SIZE); 389b8dc6038SJan Glauber return nbytes; 390b8dc6038SJan Glauber } 391b8dc6038SJan Glauber 392b8dc6038SJan Glauber static unsigned int des3_192_decrypt_cbc(const struct cipher_desc *desc, 393b8dc6038SJan Glauber u8 *out, const u8 *in, 394b8dc6038SJan Glauber unsigned int nbytes) 395b8dc6038SJan Glauber { 396b8dc6038SJan Glauber struct crypt_s390_des3_192_ctx *sctx = crypto_tfm_ctx(desc->tfm); 397b8dc6038SJan Glauber int ret; 398b8dc6038SJan Glauber 399b8dc6038SJan Glauber /* only use complete blocks */ 400b8dc6038SJan Glauber nbytes &= ~(DES3_192_BLOCK_SIZE - 1); 401b8dc6038SJan Glauber 402b8dc6038SJan Glauber memcpy(&sctx->iv, desc->info, DES3_192_BLOCK_SIZE); 403b8dc6038SJan Glauber ret = crypt_s390_kmc(KMC_TDEA_192_DECRYPT, &sctx->iv, out, in, nbytes); 404b8dc6038SJan Glauber BUG_ON((ret < 0) || (ret != nbytes)); 405b8dc6038SJan Glauber 406b8dc6038SJan Glauber return nbytes; 407b8dc6038SJan Glauber } 408b8dc6038SJan Glauber 409c1e26e1eSJan Glauber static struct crypto_alg des3_192_alg = { 410c1e26e1eSJan Glauber .cra_name = "des3_ede", 411c1e26e1eSJan Glauber .cra_flags = CRYPTO_ALG_TYPE_CIPHER, 412c1e26e1eSJan Glauber .cra_blocksize = DES3_192_BLOCK_SIZE, 413c1e26e1eSJan Glauber .cra_ctxsize = sizeof(struct crypt_s390_des3_192_ctx), 414c1e26e1eSJan Glauber .cra_module = THIS_MODULE, 415c1e26e1eSJan Glauber .cra_list = LIST_HEAD_INIT(des3_192_alg.cra_list), 416c1357833SJan Glauber .cra_u = { 417c1357833SJan Glauber .cipher = { 418c1e26e1eSJan Glauber .cia_min_keysize = DES3_192_KEY_SIZE, 419c1e26e1eSJan Glauber .cia_max_keysize = DES3_192_KEY_SIZE, 420c1e26e1eSJan Glauber .cia_setkey = des3_192_setkey, 421c1e26e1eSJan Glauber .cia_encrypt = des3_192_encrypt, 422b8dc6038SJan Glauber .cia_decrypt = des3_192_decrypt, 423b8dc6038SJan Glauber .cia_encrypt_ecb = des3_192_encrypt_ecb, 424b8dc6038SJan Glauber .cia_decrypt_ecb = des3_192_decrypt_ecb, 425b8dc6038SJan Glauber .cia_encrypt_cbc = des3_192_encrypt_cbc, 426b8dc6038SJan Glauber .cia_decrypt_cbc = des3_192_decrypt_cbc, 427c1357833SJan Glauber } 428c1357833SJan Glauber } 429c1e26e1eSJan Glauber }; 430c1e26e1eSJan Glauber 431c1357833SJan Glauber static int init(void) 432c1e26e1eSJan Glauber { 433c1357833SJan Glauber int ret = 0; 434c1e26e1eSJan Glauber 435c1e26e1eSJan Glauber if (!crypt_s390_func_available(KM_DEA_ENCRYPT) || 436c1e26e1eSJan Glauber !crypt_s390_func_available(KM_TDEA_128_ENCRYPT) || 437c1357833SJan Glauber !crypt_s390_func_available(KM_TDEA_192_ENCRYPT)) 438c1e26e1eSJan Glauber return -ENOSYS; 439c1e26e1eSJan Glauber 440c1e26e1eSJan Glauber ret |= (crypto_register_alg(&des_alg) == 0) ? 0:1; 441c1e26e1eSJan Glauber ret |= (crypto_register_alg(&des3_128_alg) == 0) ? 0:2; 442c1e26e1eSJan Glauber ret |= (crypto_register_alg(&des3_192_alg) == 0) ? 0:4; 443c1e26e1eSJan Glauber if (ret) { 444c1e26e1eSJan Glauber crypto_unregister_alg(&des3_192_alg); 445c1e26e1eSJan Glauber crypto_unregister_alg(&des3_128_alg); 446c1e26e1eSJan Glauber crypto_unregister_alg(&des_alg); 447c1e26e1eSJan Glauber return -EEXIST; 448c1e26e1eSJan Glauber } 449c1e26e1eSJan Glauber return 0; 450c1e26e1eSJan Glauber } 451c1e26e1eSJan Glauber 452c1357833SJan Glauber static void __exit fini(void) 453c1e26e1eSJan Glauber { 454c1e26e1eSJan Glauber crypto_unregister_alg(&des3_192_alg); 455c1e26e1eSJan Glauber crypto_unregister_alg(&des3_128_alg); 456c1e26e1eSJan Glauber crypto_unregister_alg(&des_alg); 457c1e26e1eSJan Glauber } 458c1e26e1eSJan Glauber 459c1e26e1eSJan Glauber module_init(init); 460c1e26e1eSJan Glauber module_exit(fini); 461c1e26e1eSJan Glauber 462c1e26e1eSJan Glauber MODULE_ALIAS("des"); 463c1e26e1eSJan Glauber MODULE_ALIAS("des3_ede"); 464c1e26e1eSJan Glauber 465c1e26e1eSJan Glauber MODULE_LICENSE("GPL"); 466c1e26e1eSJan Glauber MODULE_DESCRIPTION("DES & Triple DES EDE Cipher Algorithms"); 467