luks.c 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  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. //config:config FEATURE_VOLUMEID_LUKS
  21. //config: bool "luks filesystem"
  22. //config: default y
  23. //config: depends on VOLUMEID
  24. //kbuild:lib-$(CONFIG_FEATURE_VOLUMEID_LUKS) += luks.o
  25. #include "volume_id_internal.h"
  26. #define LUKS_MAGIC_L 6
  27. #define UUID_STRING_L 40
  28. #define LUKS_CIPHERNAME_L 32
  29. #define LUKS_CIPHERMODE_L 32
  30. #define LUKS_HASHSPEC_L 32
  31. #define LUKS_DIGESTSIZE 20
  32. #define LUKS_SALTSIZE 32
  33. #define LUKS_NUMKEYS 8
  34. static const uint8_t LUKS_MAGIC[] ALIGN1 = { 'L','U','K','S', 0xba, 0xbe };
  35. struct luks_phdr {
  36. uint8_t magic[LUKS_MAGIC_L];
  37. uint16_t version;
  38. uint8_t cipherName[LUKS_CIPHERNAME_L];
  39. uint8_t cipherMode[LUKS_CIPHERMODE_L];
  40. uint8_t hashSpec[LUKS_HASHSPEC_L];
  41. uint32_t payloadOffset;
  42. uint32_t keyBytes;
  43. uint8_t mkDigest[LUKS_DIGESTSIZE];
  44. uint8_t mkDigestSalt[LUKS_SALTSIZE];
  45. uint32_t mkDigestIterations;
  46. uint8_t uuid[UUID_STRING_L];
  47. struct {
  48. uint32_t active;
  49. uint32_t passwordIterations;
  50. uint8_t passwordSalt[LUKS_SALTSIZE];
  51. uint32_t keyMaterialOffset;
  52. uint32_t stripes;
  53. } keyblock[LUKS_NUMKEYS];
  54. };
  55. enum {
  56. EXPECTED_SIZE_luks_phdr = 0
  57. + 1 * LUKS_MAGIC_L
  58. + 2
  59. + 1 * LUKS_CIPHERNAME_L
  60. + 1 * LUKS_CIPHERMODE_L
  61. + 1 * LUKS_HASHSPEC_L
  62. + 4
  63. + 4
  64. + 1 * LUKS_DIGESTSIZE
  65. + 1 * LUKS_SALTSIZE
  66. + 4
  67. + 1 * UUID_STRING_L
  68. + LUKS_NUMKEYS * (0
  69. + 4
  70. + 4
  71. + 1 * LUKS_SALTSIZE
  72. + 4
  73. + 4
  74. )
  75. };
  76. struct BUG_bad_size_luks_phdr {
  77. char BUG_bad_size_luks_phdr[
  78. sizeof(struct luks_phdr) == EXPECTED_SIZE_luks_phdr ?
  79. 1 : -1];
  80. };
  81. int FAST_FUNC volume_id_probe_luks(struct volume_id *id /*,uint64_t off*/)
  82. {
  83. #define off ((uint64_t)0)
  84. struct luks_phdr *header;
  85. header = volume_id_get_buffer(id, off, sizeof(*header));
  86. if (header == NULL)
  87. return -1;
  88. if (memcmp(header->magic, LUKS_MAGIC, LUKS_MAGIC_L))
  89. return -1;
  90. // volume_id_set_usage(id, VOLUME_ID_CRYPTO);
  91. volume_id_set_uuid(id, header->uuid, UUID_DCE_STRING);
  92. IF_FEATURE_BLKID_TYPE(id->type = "crypto_LUKS";)
  93. return 0;
  94. }