[lvm-devel] [PATCH 02/15] Add lvm-crypto header file with basic crypto struct definintions:
Milan Broz
mbroz at redhat.com
Wed Jan 21 11:19:43 UTC 2009
- crypto_store_type it the crypto equivalent for segment type,
it says how the crypto attributes are retrieved.
In future there will be separate libraries
which can provide various key stores.
- crypto_store represents particular crypto store.
Every crypt lv_segment must be linked to some crypto_store.
Basically it says "how the cipher attributes and key" can
be obtained for this segment.
crypto_store can be shared by several LV segments.
crypto_store can have special areas on disk (where it stores
key material in some obfuscatted form - e.g. LUKS slots).
If there is no area on disk, the cipher & key parameters
can be stored directly in metadata (or provided through
other interface - depends on crypto_store_type.)
There are hardcoded attributes, which are mainly for
supporting basic crypto segment operations
(compatible mappings created by cryptsetup in non-luks mode)
(see following patches).
The keystore is identified by UUID (~= LV UUID)
(Becuse crypto_store is represented by special LV,
it is real LV UUID internally.)
Signed-off-by: Milan Broz <mbroz at redhat.com>
---
include/.symlinks | 1 +
lib/crypt/lvm-crypto.h | 65 ++++++++++++++++++++++++++++++++++++++
lib/format1/format1.c | 1 +
lib/format_pool/format_pool.c | 1 +
lib/format_text/import_vsn1.c | 1 +
lib/metadata/metadata-exported.h | 5 +++
lib/metadata/metadata.c | 2 +
7 files changed, 76 insertions(+), 0 deletions(-)
create mode 100644 lib/crypt/lvm-crypto.h
diff --git a/include/.symlinks b/include/.symlinks
index 1a4bd93..4033e18 100644
--- a/include/.symlinks
+++ b/include/.symlinks
@@ -4,6 +4,7 @@
../lib/activate/activate.h
../lib/activate/targets.h
../lib/cache/lvmcache.h
+../lib/crypt/lvm-crypto.h
../lib/commands/errors.h
../lib/commands/toolcontext.h
../lib/config/config.h
diff --git a/lib/crypt/lvm-crypto.h b/lib/crypt/lvm-crypto.h
new file mode 100644
index 0000000..7ce3941
--- /dev/null
+++ b/lib/crypt/lvm-crypto.h
@@ -0,0 +1,65 @@
+/*
+ * Copyright (C) 2008-2009 Red Hat, Inc. All rights reserved.
+ *
+ * This file is part of LVM2.
+ *
+ * This copyrighted material is made available to anyone wishing to use,
+ * modify, copy, or redistribute it subject to the terms and conditions
+ * of the GNU Lesser General Public License v.2.1.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#ifndef _LVM_CRYPTO_H
+#define _LVM_CRYPTO_H
+
+#include "device.h"
+#include "uuid.h"
+
+/*
+ * Crypto config & key store
+ */
+struct crypto_store_type {
+ struct dm_list list;
+
+ const char *name; /* cs type: plain/hashed/luks1 etc. */
+ uint32_t flags; /* CS_IGNORE_* flags */
+ struct crypto_store_ops *ops;
+};
+
+struct crypto_store {
+ struct dm_list list;
+
+ int ref; /* reference counter */
+ struct crypto_store_type *type;
+ struct dm_pool *mem;
+
+ struct id id; /* ID, the same as LV id*/
+ const char *name; /* Name used in crypt segments */
+ const char *type_name; /* used if keystore type is unknown */
+
+ const char *cipher; /* Cipher in dm-crypt form */
+ const char *keyhash; /* Key hashing algorithm */
+ uint32_t key_size; /* Master Key size in bits */
+
+ struct dm_list dev_areas; /* disk areas maintained */
+};
+
+struct crypto_area_list {
+ struct dm_list list;
+ struct device_area area;
+};
+
+struct crypto_store_ops {
+ int (*scan) (struct device_area *da);
+ int (*master_key_retrieve) (struct crypto_store *cs,
+ const char *name,
+ char *buffer, unsigned buffer_len);
+ // int (*backup) (struct crypto_store *cs, ...);
+ // int (*restore) (struct crypto_store *cs, ...);
+ // FIXME: key management, area formatting functions, etc
+};
+
+#endif
diff --git a/lib/format1/format1.c b/lib/format1/format1.c
index 8ab9363..a9ed088 100644
--- a/lib/format1/format1.c
+++ b/lib/format1/format1.c
@@ -130,6 +130,7 @@ static struct volume_group *_build_vg(struct format_instance *fid,
vg->seqno = 0;
dm_list_init(&vg->pvs);
dm_list_init(&vg->lvs);
+ dm_list_init(&vg->crypto_stores);
dm_list_init(&vg->tags);
if (!_check_vgs(pvs))
diff --git a/lib/format_pool/format_pool.c b/lib/format_pool/format_pool.c
index 0f72bd3..53c995f 100644
--- a/lib/format_pool/format_pool.c
+++ b/lib/format_pool/format_pool.c
@@ -124,6 +124,7 @@ static struct volume_group *_build_vg_from_pds(struct format_instance
vg->system_id = NULL;
dm_list_init(&vg->pvs);
dm_list_init(&vg->lvs);
+ dm_list_init(&vg->crypto_stores);
dm_list_init(&vg->tags);
if (!import_pool_vg(vg, smem, pds))
diff --git a/lib/format_text/import_vsn1.c b/lib/format_text/import_vsn1.c
index b7d06af..b610501 100644
--- a/lib/format_text/import_vsn1.c
+++ b/lib/format_text/import_vsn1.c
@@ -768,6 +768,7 @@ static struct volume_group *_read_vg(struct format_instance *fid,
dm_list_init(&vg->lvs);
dm_list_init(&vg->tags);
+ dm_list_init(&vg->crypto_stores);
/* Optional tags */
if ((cn = find_config_node(vgn, "tags")) &&
diff --git a/lib/metadata/metadata-exported.h b/lib/metadata/metadata-exported.h
index 40ece6f..16c216a 100644
--- a/lib/metadata/metadata-exported.h
+++ b/lib/metadata/metadata-exported.h
@@ -22,6 +22,7 @@
#define _LVM_METADATA_EXPORTED_H
#include "uuid.h"
+#include "lvm-crypto.h"
struct physical_volume;
typedef struct physical_volume pv_t;
@@ -231,6 +232,8 @@ struct volume_group {
uint32_t snapshot_count;
struct dm_list lvs;
+ struct dm_list crypto_stores;
+
struct dm_list tags;
};
@@ -271,6 +274,8 @@ struct lv_segment {
uint32_t extents_copied;
struct logical_volume *log_lv;
+ struct crypto_store *crypto_store;
+
struct dm_list tags;
struct lv_segment_area *areas;
diff --git a/lib/metadata/metadata.c b/lib/metadata/metadata.c
index a49c4d8..cb5dcbd 100644
--- a/lib/metadata/metadata.c
+++ b/lib/metadata/metadata.c
@@ -546,6 +546,7 @@ struct volume_group *vg_create(struct cmd_context *cmd, const char *vg_name,
vg->snapshot_count = 0;
+ dm_list_init(&vg->crypto_stores);
dm_list_init(&vg->tags);
if (!(vg->fid = cmd->fmt->ops->create_instance(cmd->fmt, vg_name,
@@ -1617,6 +1618,7 @@ static struct volume_group *_vg_read_orphans(struct cmd_context *cmd,
}
dm_list_init(&vg->pvs);
dm_list_init(&vg->lvs);
+ dm_list_init(&vg->crypto_stores);
dm_list_init(&vg->tags);
vg->cmd = cmd;
if (!(vg->name = dm_pool_strdup(cmd->mem, orphan_vgname))) {
--
1.5.6.5
More information about the lvm-devel
mailing list