Changes in uspace/lib/crypto/crypto.c [1b20da0:a35b458] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/crypto/crypto.c
r1b20da0 ra35b458 101 101 uint32_t f, g, temp; 102 102 uint32_t w[HASH_MD5 / 4]; 103 103 104 104 memcpy(w, h, (HASH_MD5 / 4) * sizeof(uint32_t)); 105 105 106 106 for (size_t k = 0; k < 64; k++) { 107 107 if (k < 16) { … … 118 118 g = 7 * k % 16; 119 119 } 120 120 121 121 temp = w[3]; 122 122 w[3] = w[2]; … … 127 127 w[0] = temp; 128 128 } 129 129 130 130 for (uint8_t k = 0; k < HASH_MD5 / 4; k++) 131 131 h[k] += w[k]; … … 142 142 uint32_t f, cf, temp; 143 143 uint32_t w[HASH_SHA1 / 4]; 144 144 145 145 for (size_t k = 16; k < 80; k++) { 146 146 sched_arr[k] = rotl_uint32( … … 151 151 1); 152 152 } 153 153 154 154 memcpy(w, h, (HASH_SHA1 / 4) * sizeof(uint32_t)); 155 155 156 156 for (size_t k = 0; k < 80; k++) { 157 157 if (k < 20) { … … 168 168 cf = 0xca62c1d6; 169 169 } 170 170 171 171 temp = rotl_uint32(w[0], 5) + f + w[4] + cf + sched_arr[k]; 172 172 173 173 w[4] = w[3]; 174 174 w[3] = w[2]; … … 177 177 w[0] = temp; 178 178 } 179 179 180 180 for (uint8_t k = 0; k < HASH_SHA1 / 4; k++) 181 181 h[k] += w[k]; … … 199 199 if (!input) 200 200 return EINVAL; 201 201 202 202 if (!output) 203 203 return ENOMEM; 204 204 205 205 hash_fnc_t hash_func = (hash_sel == HASH_MD5) ? md5_proc : sha1_proc; 206 206 207 207 /* Prepare scheduled input. */ 208 208 uint8_t work_input[input_size + 1]; 209 209 memcpy(work_input, input, input_size); 210 210 work_input[input_size] = 0x80; 211 211 212 212 // FIXME: double? 213 213 size_t blocks = ceil_uint32((((double) input_size + 1) / 4 + 2) / 16); … … 222 222 } 223 223 } 224 224 225 225 uint64_t bits_size = (uint64_t) (input_size * 8); 226 226 if (hash_sel == HASH_MD5) 227 227 bits_size = uint64_t_byteorder_swap(bits_size); 228 228 229 229 work_arr[(blocks - 1) * 16 + 14] = bits_size >> 32; 230 230 work_arr[(blocks - 1) * 16 + 15] = bits_size & 0xffffffff; 231 231 232 232 /* Hash computation. */ 233 233 uint32_t h[hash_sel / 4]; … … 237 237 for (size_t k = 0; k < 16; k++) 238 238 sched_arr[k] = work_arr[i * 16 + k]; 239 239 240 240 hash_func(h, sched_arr); 241 241 } 242 242 243 243 /* Copy hash parts into final result. */ 244 244 for (size_t i = 0; i < hash_sel / 4; i++) { 245 245 if (hash_sel == HASH_SHA1) 246 246 h[i] = uint32_t_byteorder_swap(h[i]); 247 247 248 248 memcpy(output + i * sizeof(uint32_t), &h[i], sizeof(uint32_t)); 249 249 } 250 250 251 251 return EOK; 252 252 } … … 271 271 if ((!key) || (!msg)) 272 272 return EINVAL; 273 273 274 274 if (!hash) 275 275 return ENOMEM; 276 276 277 277 uint8_t work_key[HMAC_BLOCK_LENGTH]; 278 278 uint8_t o_key_pad[HMAC_BLOCK_LENGTH]; … … 280 280 uint8_t temp_hash[hash_sel]; 281 281 memset(work_key, 0, HMAC_BLOCK_LENGTH); 282 282 283 283 if(key_size > HMAC_BLOCK_LENGTH) 284 284 create_hash(key, key_size, work_key, hash_sel); 285 285 else 286 286 memcpy(work_key, key, key_size); 287 287 288 288 for (size_t i = 0; i < HMAC_BLOCK_LENGTH; i++) { 289 289 o_key_pad[i] = work_key[i] ^ 0x5c; 290 290 i_key_pad[i] = work_key[i] ^ 0x36; 291 291 } 292 292 293 293 uint8_t temp_work[HMAC_BLOCK_LENGTH + max(msg_size, hash_sel)]; 294 294 memcpy(temp_work, i_key_pad, HMAC_BLOCK_LENGTH); 295 295 memcpy(temp_work + HMAC_BLOCK_LENGTH, msg, msg_size); 296 296 297 297 create_hash(temp_work, HMAC_BLOCK_LENGTH + msg_size, temp_hash, 298 298 hash_sel); 299 299 300 300 memcpy(temp_work, o_key_pad, HMAC_BLOCK_LENGTH); 301 301 memcpy(temp_work + HMAC_BLOCK_LENGTH, temp_hash, hash_sel); 302 302 303 303 create_hash(temp_work, HMAC_BLOCK_LENGTH + hash_sel, hash, hash_sel); 304 304 305 305 return EOK; 306 306 } … … 327 327 if ((!pass) || (!salt)) 328 328 return EINVAL; 329 329 330 330 if (!hash) 331 331 return ENOMEM; 332 332 333 333 uint8_t work_salt[salt_size + 4]; 334 334 memcpy(work_salt, salt, salt_size); … … 337 337 uint8_t xor_hmac[HASH_SHA1]; 338 338 uint8_t temp_hash[HASH_SHA1 * 2]; 339 339 340 340 for (size_t i = 0; i < 2; i++) { 341 341 uint32_t be_i = host2uint32_t_be(i + 1); 342 342 343 343 memcpy(work_salt + salt_size, &be_i, 4); 344 344 hmac(pass, pass_size, work_salt, salt_size + 4, 345 345 work_hmac, HASH_SHA1); 346 346 memcpy(xor_hmac, work_hmac, HASH_SHA1); 347 347 348 348 for (size_t k = 1; k < 4096; k++) { 349 349 memcpy(temp_hmac, work_hmac, HASH_SHA1); 350 350 hmac(pass, pass_size, temp_hmac, HASH_SHA1, 351 351 work_hmac, HASH_SHA1); 352 352 353 353 for (size_t t = 0; t < HASH_SHA1; t++) 354 354 xor_hmac[t] ^= work_hmac[t]; 355 355 } 356 356 357 357 memcpy(temp_hash + i * HASH_SHA1, xor_hmac, HASH_SHA1); 358 358 } 359 359 360 360 memcpy(hash, temp_hash, PBKDF2_KEY_LENGTH); 361 361 362 362 return EOK; 363 363 }
Note:
See TracChangeset
for help on using the changeset viewer.