Changeset 0d8322da in mainline
- Timestamp:
- 2012-09-23T08:03:08Z (12 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- c99d470
- Parents:
- 8595b954
- Location:
- uspace/lib/ext4
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/ext4/libext4_crc.c
r8595b954 r0d8322da 33 33 /** 34 34 * @file libext4_crc.c 35 * @brief CRC checksumming implementation from Linux.36 35 */ 37 36 38 #include <byteorder.h>39 37 #include "libext4.h" 40 38 41 /** CRC table for the CRC-16.42 *43 * The poly is 0x8005 (x^16 + x^15 + x^2 + 1).44 *45 */46 uint16_t const crc16_table[256] = {47 0x0000, 0xC0C1, 0xC181, 0x0140, 0xC301, 0x03C0, 0x0280, 0xC241,48 0xC601, 0x06C0, 0x0780, 0xC741, 0x0500, 0xC5C1, 0xC481, 0x0440,49 0xCC01, 0x0CC0, 0x0D80, 0xCD41, 0x0F00, 0xCFC1, 0xCE81, 0x0E40,50 0x0A00, 0xCAC1, 0xCB81, 0x0B40, 0xC901, 0x09C0, 0x0880, 0xC841,51 0xD801, 0x18C0, 0x1980, 0xD941, 0x1B00, 0xDBC1, 0xDA81, 0x1A40,52 0x1E00, 0xDEC1, 0xDF81, 0x1F40, 0xDD01, 0x1DC0, 0x1C80, 0xDC41,53 0x1400, 0xD4C1, 0xD581, 0x1540, 0xD701, 0x17C0, 0x1680, 0xD641,54 0xD201, 0x12C0, 0x1380, 0xD341, 0x1100, 0xD1C1, 0xD081, 0x1040,55 0xF001, 0x30C0, 0x3180, 0xF141, 0x3300, 0xF3C1, 0xF281, 0x3240,56 0x3600, 0xF6C1, 0xF781, 0x3740, 0xF501, 0x35C0, 0x3480, 0xF441,57 0x3C00, 0xFCC1, 0xFD81, 0x3D40, 0xFF01, 0x3FC0, 0x3E80, 0xFE41,58 0xFA01, 0x3AC0, 0x3B80, 0xFB41, 0x3900, 0xF9C1, 0xF881, 0x3840,59 0x2800, 0xE8C1, 0xE981, 0x2940, 0xEB01, 0x2BC0, 0x2A80, 0xEA41,60 0xEE01, 0x2EC0, 0x2F80, 0xEF41, 0x2D00, 0xEDC1, 0xEC81, 0x2C40,61 0xE401, 0x24C0, 0x2580, 0xE541, 0x2700, 0xE7C1, 0xE681, 0x2640,62 0x2200, 0xE2C1, 0xE381, 0x2340, 0xE101, 0x21C0, 0x2080, 0xE041,63 0xA001, 0x60C0, 0x6180, 0xA141, 0x6300, 0xA3C1, 0xA281, 0x6240,64 0x6600, 0xA6C1, 0xA781, 0x6740, 0xA501, 0x65C0, 0x6480, 0xA441,65 0x6C00, 0xACC1, 0xAD81, 0x6D40, 0xAF01, 0x6FC0, 0x6E80, 0xAE41,66 0xAA01, 0x6AC0, 0x6B80, 0xAB41, 0x6900, 0xA9C1, 0xA881, 0x6840,67 0x7800, 0xB8C1, 0xB981, 0x7940, 0xBB01, 0x7BC0, 0x7A80, 0xBA41,68 0xBE01, 0x7EC0, 0x7F80, 0xBF41, 0x7D00, 0xBDC1, 0xBC81, 0x7C40,69 0xB401, 0x74C0, 0x7580, 0xB541, 0x7700, 0xB7C1, 0xB681, 0x7640,70 0x7200, 0xB2C1, 0xB381, 0x7340, 0xB101, 0x71C0, 0x7080, 0xB041,71 0x5000, 0x90C1, 0x9181, 0x5140, 0x9301, 0x53C0, 0x5280, 0x9241,72 0x9601, 0x56C0, 0x5780, 0x9741, 0x5500, 0x95C1, 0x9481, 0x5440,73 0x9C01, 0x5CC0, 0x5D80, 0x9D41, 0x5F00, 0x9FC1, 0x9E81, 0x5E40,74 0x5A00, 0x9AC1, 0x9B81, 0x5B40, 0x9901, 0x59C0, 0x5880, 0x9841,75 0x8801, 0x48C0, 0x4980, 0x8941, 0x4B00, 0x8BC1, 0x8A81, 0x4A40,76 0x4E00, 0x8EC1, 0x8F81, 0x4F40, 0x8D01, 0x4DC0, 0x4C80, 0x8C41,77 0x4400, 0x84C1, 0x8581, 0x4540, 0x8701, 0x47C0, 0x4680, 0x8641,78 0x8201, 0x42C0, 0x4380, 0x8341, 0x4100, 0x81C1, 0x8081, 0x404079 };80 81 /** Modify CRC value.82 *83 * @param crc Current CRC value84 * @param data New byte of data to be "added" to CRC85 *86 * @return Updated CRC value87 *88 */89 static inline uint16_t crc16_byte(uint16_t crc, const uint8_t data)90 {91 return (crc >> 8) ^ crc16_table[(crc ^ data) & 0xff];92 }93 94 /** Compute the CRC-16 for the data buffer.95 *96 * @param crc Previous CRC value97 * @param buffer Data pointer98 * @param len Number of bytes in the buffer99 *100 * @return Updated CRC value101 *102 */103 39 uint16_t crc16(uint16_t crc, const uint8_t *buffer, size_t len) 104 40 { 105 while (len--) 106 crc = crc16_byte(crc, *buffer++); 107 108 return crc; 41 // TODO 42 return 0; 109 43 } 110 44 -
uspace/lib/ext4/libext4_filesystem.c
r8595b954 r0d8322da 471 471 472 472 /** Compute checksum of block group descriptor. 473 *474 * It uses crc functions from Linux kernel implementation.475 473 * 476 474 * @param sb Superblock -
uspace/lib/ext4/libext4_hash.c
r8595b954 r0d8322da 35 35 */ 36 36 37 #include "libext4.h" 37 38 #include <errno.h> 38 #include <mem.h>39 #include "libext4.h"40 39 41 #define TEA_DELTA 0x9E3779B942 43 /* F, G and H are basic MD4 functions: selection, majority, parity */44 #define F(x, y, z) ((z) ^ ((x) & ((y) ^ (z))))45 #define G(x, y, z) (((x) & (y)) + (((x) ^ (y)) & (z)))46 #define H(x, y, z) ((x) ^ (y) ^ (z))47 48 /*49 * The generic round function. The application is so specific that50 * we don't bother protecting all the arguments with parens, as is generally51 * good macro practice, in favor of extra legibility.52 * Rotation is separate from addition to prevent recomputation53 */54 #define ROUND(f, a, b, c, d, x, s) \55 (a += f(b, c, d) + x, a = (a << s) | (a >> (32 - s)))56 57 #define K1 058 #define K2 013240474631UL59 #define K3 015666365641UL60 61 static void tea_transform(uint32_t buf[4], uint32_t const in[])62 {63 uint32_t sum = 0;64 uint32_t b0 = buf[0];65 uint32_t b1 = buf[1];66 uint32_t a = in[0];67 uint32_t b = in[1];68 uint32_t c = in[2];69 uint32_t d = in[3];70 71 int n = 16;72 73 do {74 sum += TEA_DELTA;75 b0 += ((b1 << 4) + a) ^ (b1 + sum) ^ ((b1 >> 5) + b);76 b1 += ((b0 << 4) + c) ^ (b0 + sum) ^ ((b0 >> 5) + d);77 } while (--n);78 79 buf[0] += b0;80 buf[1] += b1;81 }82 83 84 static void half_md4_transform(uint32_t buf[4], const uint32_t in[8])85 {86 uint32_t a = buf[0], b = buf[1], c = buf[2], d = buf[3];87 88 /* Round 1 */89 ROUND(F, a, b, c, d, in[0] + K1, 3);90 ROUND(F, d, a, b, c, in[1] + K1, 7);91 ROUND(F, c, d, a, b, in[2] + K1, 11);92 ROUND(F, b, c, d, a, in[3] + K1, 19);93 ROUND(F, a, b, c, d, in[4] + K1, 3);94 ROUND(F, d, a, b, c, in[5] + K1, 7);95 ROUND(F, c, d, a, b, in[6] + K1, 11);96 ROUND(F, b, c, d, a, in[7] + K1, 19);97 98 /* Round 2 */99 ROUND(G, a, b, c, d, in[1] + K2, 3);100 ROUND(G, d, a, b, c, in[3] + K2, 5);101 ROUND(G, c, d, a, b, in[5] + K2, 9);102 ROUND(G, b, c, d, a, in[7] + K2, 13);103 ROUND(G, a, b, c, d, in[0] + K2, 3);104 ROUND(G, d, a, b, c, in[2] + K2, 5);105 ROUND(G, c, d, a, b, in[4] + K2, 9);106 ROUND(G, b, c, d, a, in[6] + K2, 13);107 108 /* Round 3 */109 ROUND(H, a, b, c, d, in[3] + K3, 3);110 ROUND(H, d, a, b, c, in[7] + K3, 9);111 ROUND(H, c, d, a, b, in[2] + K3, 11);112 ROUND(H, b, c, d, a, in[6] + K3, 15);113 ROUND(H, a, b, c, d, in[1] + K3, 3);114 ROUND(H, d, a, b, c, in[5] + K3, 9);115 ROUND(H, c, d, a, b, in[0] + K3, 11);116 ROUND(H, b, c, d, a, in[4] + K3, 15);117 118 buf[0] += a;119 buf[1] += b;120 buf[2] += c;121 buf[3] += d;122 }123 124 static uint32_t hash_unsigned(const char *name, int len)125 {126 uint32_t hash;127 uint32_t hash0 = 0x12a3fe2d;128 uint32_t hash1 = 0x37abe8f9;129 const unsigned char *ucp = (const unsigned char *) name;130 131 while (len--) {132 hash = hash1 + (hash0 ^ (((int) *ucp++) * 7152373));133 134 if (hash & 0x80000000)135 hash -= 0x7fffffff;136 137 hash1 = hash0;138 hash0 = hash;139 }140 141 return hash0 << 1;142 }143 144 static uint32_t hash_signed(const char *name, int len)145 {146 uint32_t hash;147 uint32_t hash0 = 0x12a3fe2d;148 uint32_t hash1 = 0x37abe8f9;149 const signed char *scp = (const signed char *) name;150 151 while (len--) {152 hash = hash1 + (hash0 ^ (((int) *scp++) * 7152373));153 154 if (hash & 0x80000000)155 hash -= 0x7fffffff;156 157 hash1 = hash0;158 hash0 = hash;159 }160 161 return hash0 << 1;162 }163 164 static void str2hashbuf_signed(const char *msg, int len, uint32_t *buf, int num)165 {166 uint32_t pad, val;167 int i;168 const signed char *scp = (const signed char *) msg;169 170 pad = (uint32_t) len | ((uint32_t) len << 8);171 pad |= pad << 16;172 173 val = pad;174 if (len > num * 4)175 len = num * 4;176 177 for (i = 0; i < len; i++) {178 if ((i % 4) == 0)179 val = pad;180 181 val = ((int) scp[i]) + (val << 8);182 if ((i % 4) == 3) {183 *buf++ = val;184 val = pad;185 num--;186 }187 }188 189 if (--num >= 0)190 *buf++ = val;191 192 while (--num >= 0)193 *buf++ = pad;194 }195 196 static void str2hashbuf_unsigned(const char *msg, int len, uint32_t *buf,197 int num)198 {199 uint32_t pad, val;200 int i;201 const unsigned char *ucp = (const unsigned char *) msg;202 203 pad = (uint32_t) len | ((uint32_t) len << 8);204 pad |= pad << 16;205 206 val = pad;207 if (len > num * 4)208 len = num * 4;209 210 for (i = 0; i < len; i++) {211 if ((i % 4) == 0)212 val = pad;213 214 val = ((int) ucp[i]) + (val << 8);215 if ((i % 4) == 3) {216 *buf++ = val;217 val = pad;218 num--;219 }220 }221 222 if (--num >= 0)223 *buf++ = val;224 225 while (--num >= 0)226 *buf++ = pad;227 }228 229 /** Compute hash value of the string.230 *231 * @param hinfo Hash info structure with information about232 * the algorithm, hash seed and with the place233 * for the output hash value234 * @param len Length of the name235 * @param name Name to be hashed236 *237 * @return Error code238 *239 */240 40 int ext4_hash_string(ext4_hash_info_t *hinfo, int len, const char *name) 241 41 { 242 uint32_t hash = 0; 243 uint32_t minor_hash = 0; 244 const char *p; 245 int i; 246 uint32_t in[8], buf[4]; 247 void (*str2hashbuf)(const char *, int, uint32_t *, int) = 248 str2hashbuf_signed; 249 250 /* Initialize the default seed for the hash checksum functions */ 251 buf[0] = 0x67452301; 252 buf[1] = 0xefcdab89; 253 buf[2] = 0x98badcfe; 254 buf[3] = 0x10325476; 255 256 /* Check if the seed is all zero's */ 257 if (hinfo->seed) { 258 for (i = 0; i < 4; i++) { 259 if (hinfo->seed[i] != 0) 260 break; 261 262 } 263 264 if (i < 4) 265 memcpy(buf, hinfo->seed, sizeof(buf)); 266 } 267 268 switch (hinfo->hash_version) { 269 case EXT4_HASH_VERSION_LEGACY_UNSIGNED: 270 hash = hash_unsigned(name, len); 271 break; 272 case EXT4_HASH_VERSION_LEGACY: 273 hash = hash_signed(name, len); 274 break; 275 case EXT4_HASH_VERSION_HALF_MD4_UNSIGNED: 276 str2hashbuf = str2hashbuf_unsigned; 277 case EXT4_HASH_VERSION_HALF_MD4: 278 p = name; 279 280 while (len > 0) { 281 (*str2hashbuf)(p, len, in, 8); 282 half_md4_transform(buf, in); 283 len -= 32; 284 p += 32; 285 } 286 287 minor_hash = buf[2]; 288 hash = buf[1]; 289 break; 290 case EXT4_HASH_VERSION_TEA_UNSIGNED: 291 str2hashbuf = str2hashbuf_unsigned; 292 case EXT4_HASH_VERSION_TEA: 293 p = name; 294 295 while (len > 0) { 296 (*str2hashbuf)(p, len, in, 4); 297 tea_transform(buf, in); 298 len -= 16; 299 p += 16; 300 } 301 302 hash = buf[0]; 303 minor_hash = buf[1]; 304 break; 305 default: 306 hinfo->hash = 0; 307 return EINVAL; 308 } 309 310 hash = hash & ~1; 311 if (hash == (EXT4_DIRECTORY_HTREE_EOF << 1)) 312 hash = (EXT4_DIRECTORY_HTREE_EOF - 1) << 1; 313 314 hinfo->hash = hash; 315 hinfo->minor_hash = minor_hash; 316 317 return EOK; 42 // TODO 43 hinfo->hash = 0; 44 return ENOTSUP; 318 45 } 319 46
Note:
See TracChangeset
for help on using the changeset viewer.