diff options
author | Denis Vlasenko <vda.linux@googlemail.com> | 2008-02-18 21:08:49 +0000 |
---|---|---|
committer | Denis Vlasenko <vda.linux@googlemail.com> | 2008-02-18 21:08:49 +0000 |
commit | de7684a309ad20c1b889d048d741cb1dd52245f7 (patch) | |
tree | efae3387e1978cdd128ff2a922b734d0e9d0180f /util-linux/volume_id/luks.c | |
parent | 27dd495b98a6135554b1d839fefe436ba3c6ca71 (diff) | |
download | busybox-w32-de7684a309ad20c1b889d048d741cb1dd52245f7.tar.gz busybox-w32-de7684a309ad20c1b889d048d741cb1dd52245f7.tar.bz2 busybox-w32-de7684a309ad20c1b889d048d741cb1dd52245f7.zip |
support for mount by label (not yet tested)
Also adds findfs applet. Closes bug 1143.
Diffstat (limited to 'util-linux/volume_id/luks.c')
-rw-r--r-- | util-linux/volume_id/luks.c | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/util-linux/volume_id/luks.c b/util-linux/volume_id/luks.c new file mode 100644 index 000000000..e73ce3a03 --- /dev/null +++ b/util-linux/volume_id/luks.c | |||
@@ -0,0 +1,76 @@ | |||
1 | /* | ||
2 | * volume_id - reads filesystem label and uuid | ||
3 | * | ||
4 | * Copyright (C) 2005 W. Michael Petullo <mike@flyn.org> | ||
5 | * | ||
6 | * This library is free software; you can redistribute it and/or | ||
7 | * modify it under the terms of the GNU Lesser General Public | ||
8 | * License as published by the Free Software Foundation; either | ||
9 | * version 2.1 of the License, or (at your option) any later version. | ||
10 | * | ||
11 | * This library is distributed in the hope that it will be useful, | ||
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
14 | * Lesser General Public License for more details. | ||
15 | * | ||
16 | * You should have received a copy of the GNU Lesser General Public | ||
17 | * License along with this library; if not, write to the Free Software | ||
18 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
19 | */ | ||
20 | |||
21 | #include "volume_id_internal.h" | ||
22 | |||
23 | #define SECTOR_SHIFT 9 | ||
24 | #define SECTOR_SIZE (1 << SECTOR_SHIFT) | ||
25 | |||
26 | #define LUKS_CIPHERNAME_L 32 | ||
27 | #define LUKS_CIPHERMODE_L 32 | ||
28 | #define LUKS_HASHSPEC_L 32 | ||
29 | #define LUKS_DIGESTSIZE 20 | ||
30 | #define LUKS_SALTSIZE 32 | ||
31 | #define LUKS_NUMKEYS 8 | ||
32 | |||
33 | static const uint8_t LUKS_MAGIC[] = { 'L','U','K','S', 0xba, 0xbe }; | ||
34 | #define LUKS_MAGIC_L 6 | ||
35 | #define LUKS_PHDR_SIZE (sizeof(struct luks_phdr)/SECTOR_SIZE+1) | ||
36 | #define UUID_STRING_L 40 | ||
37 | |||
38 | struct luks_phdr { | ||
39 | uint8_t magic[LUKS_MAGIC_L]; | ||
40 | uint16_t version; | ||
41 | uint8_t cipherName[LUKS_CIPHERNAME_L]; | ||
42 | uint8_t cipherMode[LUKS_CIPHERMODE_L]; | ||
43 | uint8_t hashSpec[LUKS_HASHSPEC_L]; | ||
44 | uint32_t payloadOffset; | ||
45 | uint32_t keyBytes; | ||
46 | uint8_t mkDigest[LUKS_DIGESTSIZE]; | ||
47 | uint8_t mkDigestSalt[LUKS_SALTSIZE]; | ||
48 | uint32_t mkDigestIterations; | ||
49 | uint8_t uuid[UUID_STRING_L]; | ||
50 | struct { | ||
51 | uint32_t active; | ||
52 | uint32_t passwordIterations; | ||
53 | uint8_t passwordSalt[LUKS_SALTSIZE]; | ||
54 | uint32_t keyMaterialOffset; | ||
55 | uint32_t stripes; | ||
56 | } keyblock[LUKS_NUMKEYS]; | ||
57 | }; | ||
58 | |||
59 | int volume_id_probe_luks(struct volume_id *id, uint64_t off) | ||
60 | { | ||
61 | struct luks_phdr *header; | ||
62 | |||
63 | header = volume_id_get_buffer(id, off, LUKS_PHDR_SIZE); | ||
64 | if (header == NULL) | ||
65 | return -1; | ||
66 | |||
67 | if (memcmp(header->magic, LUKS_MAGIC, LUKS_MAGIC_L)) | ||
68 | return -1; | ||
69 | |||
70 | volume_id_set_usage(id, VOLUME_ID_CRYPTO); | ||
71 | volume_id_set_uuid(id, header->uuid, UUID_DCE_STRING); | ||
72 | |||
73 | id->type = "crypto_LUKS"; | ||
74 | |||
75 | return 0; | ||
76 | } | ||