static int bf_init(PX_Cipher *c, const uint8 *key, unsigned klen, const uint8 *iv) { ossldata *od = c->ptr; unsigned bs = gen_ossl_block_size(c); static int bf_is_strong = -1; /* * Test if key len is supported. BF_set_key silently cut large keys and it * could be a problem when user transfer crypted data from one server to * another. */ if (bf_is_strong == -1) bf_is_strong = bf_check_supported_key_len(); if (!bf_is_strong && klen > 16) return PXE_KEY_TOO_BIG; /* Key len is supported. We can use it. */ od->klen = klen; memcpy(od->key, key, klen); if (iv) memcpy(od->iv, iv, bs); else memset(od->iv, 0, bs); return 0; }
static int ossl_cast_ecb_decrypt(PX_Cipher *c, const uint8 *data, unsigned dlen, uint8 *res) { unsigned bs = gen_ossl_block_size(c); ossldata *od = c->ptr; const uint8 *end = data + dlen - bs; for (; data <= end; data += bs, res += bs) CAST_ecb_encrypt(data, res, &od->u.cast_key, CAST_DECRYPT); return 0; }
static int bf_ecb_decrypt(PX_Cipher *c, const uint8 *data, unsigned dlen, uint8 *res) { unsigned bs = gen_ossl_block_size(c), i; ossldata *od = c->ptr; for (i = 0; i < dlen / bs; i++) BF_ecb_encrypt(data + i * bs, res + i * bs, &od->u.bf.key, BF_DECRYPT); return 0; }
static int ossl_cast_init(PX_Cipher *c, const uint8 *key, unsigned klen, const uint8 *iv) { ossldata *od = c->ptr; unsigned bs = gen_ossl_block_size(c); CAST_set_key(&od->u.cast_key, klen, key); if (iv) memcpy(od->iv, iv, bs); else memset(od->iv, 0, bs); return 0; }
static int ossl_des3_ecb_decrypt(PX_Cipher *c, const uint8 *data, unsigned dlen, uint8 *res) { unsigned bs = gen_ossl_block_size(c); unsigned i; ossldata *od = c->ptr; for (i = 0; i < dlen / bs; i++) DES_ecb3_encrypt((void *) (data + i * bs), (void *) (res + i * bs), &od->u.des3.k1, &od->u.des3.k2, &od->u.des3.k3, 0); return 0; }
static int ossl_des_ecb_decrypt(PX_Cipher *c, const uint8 *data, unsigned dlen, uint8 *res) { unsigned bs = gen_ossl_block_size(c); unsigned i; ossldata *od = c->ptr; for (i = 0; i < dlen / bs; i++) DES_ecb_encrypt((DES_cblock *) (data + i * bs), (DES_cblock *) (res + i * bs), &od->u.des.key_schedule, 0); return 0; }
static int ossl_aes_ecb_decrypt(PX_Cipher * c, const uint8 *data, unsigned dlen, uint8 *res) { unsigned bs = gen_ossl_block_size(c); ossldata *od = c->ptr; const uint8 *end = data + dlen - bs; if (!od->init) ossl_aes_key_init(od, AES_DECRYPT); for (; data <= end; data += bs, res += bs) AES_ecb_encrypt(data, res, &od->u.aes_key, AES_DECRYPT); return 0; }
static int ossl_des3_init(PX_Cipher *c, const uint8 *key, unsigned klen, const uint8 *iv) { ossldata *od = c->ptr; unsigned bs = gen_ossl_block_size(c); od->klen = 24; memset(od->key, 0, 24); memcpy(od->key, key, klen > 24 ? 24 : klen); if (iv) memcpy(od->iv, iv, bs); else memset(od->iv, 0, bs); return 0; }
static int ossl_aes_init(PX_Cipher *c, const uint8 *key, unsigned klen, const uint8 *iv) { ossldata *od = c->ptr; unsigned bs = gen_ossl_block_size(c); if (klen <= 128 / 8) od->klen = 128 / 8; else if (klen <= 192 / 8) od->klen = 192 / 8; else if (klen <= 256 / 8) od->klen = 256 / 8; else return PXE_KEY_TOO_BIG; memcpy(od->key, key, klen); if (iv) memcpy(od->iv, iv, bs); else memset(od->iv, 0, bs); return 0; }