From 40e5c7d09598c03240865333feab80759082a3e3 Mon Sep 17 00:00:00 2001 From: Milan Broz Date: Wed, 24 Apr 2024 21:42:10 +0200 Subject: [PATCH] Use crypt_safe_memcpy for operations with key. --- lib/bitlk/bitlk.c | 2 +- lib/crypt_plain.c | 2 +- lib/fvault2/fvault2.c | 4 ++-- lib/libdevmapper.c | 2 +- lib/luks2/hw_opal/hw_opal.c | 24 ++++++++++++------------ lib/luks2/luks2_token.c | 2 +- lib/setup.c | 10 +++++----- lib/tcrypt/tcrypt.c | 12 ++++++------ lib/volumekey.c | 2 +- 9 files changed, 30 insertions(+), 30 deletions(-) diff --git a/lib/bitlk/bitlk.c b/lib/bitlk/bitlk.c index ae533e5a..303d0c66 100644 --- a/lib/bitlk/bitlk.c +++ b/lib/bitlk/bitlk.c @@ -1092,7 +1092,7 @@ static int decrypt_key(struct crypt_device *cd, crypt_get_volume_key_size(cd) == 32) { /* 128bit AES-CBC with Elephant -- key size is 256 bit (2 keys) but key data is 512 bits, data: 16B CBC key, 16B empty, 16B elephant key, 16B empty */ - memcpy(outbuf + 16 + BITLK_OPEN_KEY_METADATA_LEN, + crypt_safe_memcpy(outbuf + 16 + BITLK_OPEN_KEY_METADATA_LEN, outbuf + 2 * 16 + BITLK_OPEN_KEY_METADATA_LEN, 16); key_size = 32 + BITLK_OPEN_KEY_METADATA_LEN; } diff --git a/lib/crypt_plain.c b/lib/crypt_plain.c index 99155e8a..5e3d32ea 100644 --- a/lib/crypt_plain.c +++ b/lib/crypt_plain.c @@ -105,7 +105,7 @@ int crypt_plain_hash(struct crypt_device *cd, log_dbg(cd, "Too short plain passphrase."); return -EINVAL; } - memcpy(key, passphrase, hash_size); + crypt_safe_memcpy(key, passphrase, hash_size); r = 0; } else r = hash(hash_name_buf, hash_size, key, passphrase_size, passphrase); diff --git a/lib/fvault2/fvault2.c b/lib/fvault2/fvault2.c index 0b0c9ce5..c500839b 100644 --- a/lib/fvault2/fvault2.c +++ b/lib/fvault2/fvault2.c @@ -579,8 +579,8 @@ static int _read_volume_header( *block_size = le32_to_cpu(vol_header->block_size); *disklbl_blkoff = le64_to_cpu(vol_header->disklbl_blkoff); uuid_unparse(vol_header->ph_vol_uuid, ph_vol_uuid); - memcpy((*enc_md_key)->key, vol_header->key_data, FVAULT2_AES_KEY_SIZE); - memcpy((*enc_md_key)->key + FVAULT2_AES_KEY_SIZE, + crypt_safe_memcpy((*enc_md_key)->key, vol_header->key_data, FVAULT2_AES_KEY_SIZE); + crypt_safe_memcpy((*enc_md_key)->key + FVAULT2_AES_KEY_SIZE, vol_header->ph_vol_uuid, FVAULT2_AES_KEY_SIZE); out: free(vol_header); diff --git a/lib/libdevmapper.c b/lib/libdevmapper.c index ebee542a..480c1d7b 100644 --- a/lib/libdevmapper.c +++ b/lib/libdevmapper.c @@ -2045,7 +2045,7 @@ static int _dm_target_query_crypt(struct crypt_device *cd, uint32_t get_flags, } else { buffer[2] = '\0'; for(i = 0; i < vk->keylength; i++) { - memcpy(buffer, &key_[i * 2], 2); + crypt_safe_memcpy(buffer, &key_[i * 2], 2); vk->key[i] = strtoul(buffer, &endp, 16); if (endp != &buffer[2]) { r = -EINVAL; diff --git a/lib/luks2/hw_opal/hw_opal.c b/lib/luks2/hw_opal/hw_opal.c index cd63aada..5797f680 100644 --- a/lib/luks2/hw_opal/hw_opal.c +++ b/lib/luks2/hw_opal/hw_opal.c @@ -317,7 +317,7 @@ static int opal_range_check_attributes_fd(struct crypt_device *cd, } } }; - memcpy(lrs->session.opal_key.key, vk->key, vk->keylength); + crypt_safe_memcpy(lrs->session.opal_key.key, vk->key, vk->keylength); r = opal_ioctl(cd, fd, IOC_OPAL_GET_LR_STATUS, lrs); if (r != OPAL_STATUS_SUCCESS) { @@ -458,7 +458,7 @@ int opal_setup_ranges(struct crypt_device *cd, */ .lr = { 1, 2, 3, 4, 5, 6, 7, 8 }, }; - memcpy(activate->key.key, admin_key, admin_key_len); + crypt_safe_memcpy(activate->key.key, admin_key, admin_key_len); r = opal_ioctl(cd, fd, IOC_OPAL_TAKE_OWNERSHIP, &activate->key); if (r < 0) { @@ -500,7 +500,7 @@ int opal_setup_ranges(struct crypt_device *cd, .key_len = admin_key_len, }, }; - memcpy(user_session->opal_key.key, admin_key, admin_key_len); + crypt_safe_memcpy(user_session->opal_key.key, admin_key, admin_key_len); r = opal_ioctl(cd, fd, IOC_OPAL_ERASE_LR, user_session); if (r != OPAL_STATUS_SUCCESS) { @@ -529,7 +529,7 @@ int opal_setup_ranges(struct crypt_device *cd, .key_len = admin_key_len, }, }; - memcpy(user_session->opal_key.key, admin_key, admin_key_len); + crypt_safe_memcpy(user_session->opal_key.key, admin_key, admin_key_len); r = opal_ioctl(cd, fd, IOC_OPAL_ACTIVATE_USR, user_session); if (r != OPAL_STATUS_SUCCESS) { @@ -554,7 +554,7 @@ int opal_setup_ranges(struct crypt_device *cd, }, .l_state = OPAL_RO, }; - memcpy(user_add_to_lr->session.opal_key.key, admin_key, admin_key_len); + crypt_safe_memcpy(user_add_to_lr->session.opal_key.key, admin_key, admin_key_len); r = opal_ioctl(cd, fd, IOC_OPAL_ADD_USR_TO_LR, user_add_to_lr); if (r != OPAL_STATUS_SUCCESS) { @@ -593,8 +593,8 @@ int opal_setup_ranges(struct crypt_device *cd, }, }, }; - memcpy(new_pw->new_user_pw.opal_key.key, vk->key, vk->keylength); - memcpy(new_pw->session.opal_key.key, admin_key, admin_key_len); + crypt_safe_memcpy(new_pw->new_user_pw.opal_key.key, vk->key, vk->keylength); + crypt_safe_memcpy(new_pw->session.opal_key.key, admin_key, admin_key_len); r = opal_ioctl(cd, fd, IOC_OPAL_SET_PW, new_pw); if (r != OPAL_STATUS_SUCCESS) { @@ -626,7 +626,7 @@ int opal_setup_ranges(struct crypt_device *cd, }, }, }; - memcpy(setup->session.opal_key.key, admin_key, admin_key_len); + crypt_safe_memcpy(setup->session.opal_key.key, admin_key, admin_key_len); r = opal_ioctl(cd, fd, IOC_OPAL_LR_SETUP, setup); if (r != OPAL_STATUS_SUCCESS) { @@ -653,7 +653,7 @@ int opal_setup_ranges(struct crypt_device *cd, }, } }; - memcpy(lock->session.opal_key.key, vk->key, vk->keylength); + crypt_safe_memcpy(lock->session.opal_key.key, vk->key, vk->keylength); r = opal_ioctl(cd, fd, IOC_OPAL_LOCK_UNLOCK, lock); if (r != OPAL_STATUS_SUCCESS) { @@ -709,7 +709,7 @@ static int opal_lock_unlock(struct crypt_device *cd, assert(vk->keylength <= OPAL_KEY_MAX); unlock.session.opal_key.key_len = vk->keylength; - memcpy(unlock.session.opal_key.key, vk->key, vk->keylength); + crypt_safe_memcpy(unlock.session.opal_key.key, vk->key, vk->keylength); } r = opal_ioctl(cd, fd, IOC_OPAL_LOCK_UNLOCK, &unlock); @@ -801,7 +801,7 @@ int opal_factory_reset(struct crypt_device *cd, if (fd < 0) return -EIO; - memcpy(reset.key, password, password_len); + crypt_safe_memcpy(reset.key, password, password_len); r = opal_ioctl(cd, fd, IOC_OPAL_PSID_REVERT_TPR, &reset); if (r < 0) { @@ -858,7 +858,7 @@ int opal_reset_segment(struct crypt_device *cd, .key_len = password_len, }, }; - memcpy(user_session->opal_key.key, password, password_len); + crypt_safe_memcpy(user_session->opal_key.key, password, password_len); fd = device_open(cd, dev, O_RDONLY); if (fd < 0) { diff --git a/lib/luks2/luks2_token.c b/lib/luks2/luks2_token.c index 9c09be23..2a5c45a8 100644 --- a/lib/luks2/luks2_token.c +++ b/lib/luks2/luks2_token.c @@ -1150,7 +1150,7 @@ out: if (!r) { *passphrase = crypt_safe_alloc(buffer_size); if (*passphrase) { - memcpy(*passphrase, buffer, buffer_size); + crypt_safe_memcpy(*passphrase, buffer, buffer_size); *passphrase_size = buffer_size; } else r = -ENOMEM; diff --git a/lib/setup.c b/lib/setup.c index 70b2ceec..1706d50f 100644 --- a/lib/setup.c +++ b/lib/setup.c @@ -325,9 +325,9 @@ static int process_key(struct crypt_device *cd, const char *hash_name, return -EINVAL; } } else if (passLen > key_size) { - memcpy((*vk)->key, pass, key_size); + crypt_safe_memcpy((*vk)->key, pass, key_size); } else { - memcpy((*vk)->key, pass, passLen); + crypt_safe_memcpy((*vk)->key, pass, passLen); } return 0; @@ -5465,7 +5465,7 @@ static int _activate_loopaes(struct crypt_device *cd, buffer_copy = crypt_safe_alloc(buffer_size); if (!buffer_copy) return -ENOMEM; - memcpy(buffer_copy, buffer, buffer_size); + crypt_safe_memcpy(buffer_copy, buffer, buffer_size); r = LOOPAES_parse_keyfile(cd, &vk, cd->u.loopaes.hdr.hash, &key_count, buffer_copy, buffer_size); @@ -6178,7 +6178,7 @@ int crypt_volume_key_get_by_keyslot_context(struct crypt_device *cd, } else if (isVERITY(cd->type)) { /* volume_key == root hash */ if (cd->u.verity.root_hash) { - memcpy(volume_key, cd->u.verity.root_hash, cd->u.verity.root_hash_size); + crypt_safe_memcpy(volume_key, cd->u.verity.root_hash, cd->u.verity.root_hash_size); *volume_key_size = cd->u.verity.root_hash_size; r = 0; } else @@ -6204,7 +6204,7 @@ int crypt_volume_key_get_by_keyslot_context(struct crypt_device *cd, } if (r >= 0 && vk) { - memcpy(volume_key, vk->key, vk->keylength); + crypt_safe_memcpy(volume_key, vk->key, vk->keylength); *volume_key_size = vk->keylength; } diff --git a/lib/tcrypt/tcrypt.c b/lib/tcrypt/tcrypt.c index 4b455515..d964f80c 100644 --- a/lib/tcrypt/tcrypt.c +++ b/lib/tcrypt/tcrypt.c @@ -320,16 +320,16 @@ static void TCRYPT_copy_key(struct tcrypt_alg *alg, const char *mode, int ks2; if (!strncmp(mode, "xts", 3)) { ks2 = alg->key_size / 2; - memcpy(out_key, &key[alg->key_offset], ks2); - memcpy(&out_key[ks2], &key[alg->iv_offset], ks2); + crypt_safe_memcpy(out_key, &key[alg->key_offset], ks2); + crypt_safe_memcpy(&out_key[ks2], &key[alg->iv_offset], ks2); } else if (!strncmp(mode, "lrw", 3)) { ks2 = alg->key_size - TCRYPT_LRW_IKEY_LEN; - memcpy(out_key, &key[alg->key_offset], ks2); - memcpy(&out_key[ks2], key, TCRYPT_LRW_IKEY_LEN); + crypt_safe_memcpy(out_key, &key[alg->key_offset], ks2); + crypt_safe_memcpy(&out_key[ks2], key, TCRYPT_LRW_IKEY_LEN); } else if (!strncmp(mode, "cbc", 3)) { - memcpy(out_key, &key[alg->key_offset], alg->key_size); + crypt_safe_memcpy(out_key, &key[alg->key_offset], alg->key_size); /* IV + whitening */ - memcpy(&out_key[alg->key_size], &key[alg->iv_offset], + crypt_safe_memcpy(&out_key[alg->key_size], &key[alg->iv_offset], alg->key_extra_size); } } diff --git a/lib/volumekey.c b/lib/volumekey.c index 3de7f76c..caa3cf21 100644 --- a/lib/volumekey.c +++ b/lib/volumekey.c @@ -45,7 +45,7 @@ struct volume_key *crypt_alloc_volume_key(size_t keylength, const char *key) /* keylength 0 is valid => no key */ if (vk->keylength) { if (key) - memcpy(&vk->key, key, keylength); + crypt_safe_memcpy(&vk->key, key, keylength); else crypt_safe_memzero(&vk->key, keylength); }