Explorar el Código

DRY up key diversification

Eric Betts hace 9 meses
padre
commit
7c05345f96
Se han modificado 1 ficheros con 8 adiciones y 36 borrados
  1. 8 36
      secure_messaging.c

+ 8 - 36
secure_messaging.c

@@ -17,12 +17,12 @@ void secure_messaging_adjust_parity(uint8_t key[16]) {
     }
 }
 
-void secure_messaging_key_diversification(uint8_t input[20], uint8_t* output) {
+void secure_messaging_key_diversification(uint8_t input[20], size_t input_len, uint8_t* output) {
     uint8_t sha[20];
     mbedtls_sha1_context ctx;
     mbedtls_sha1_init(&ctx);
     mbedtls_sha1_starts(&ctx);
-    mbedtls_sha1_update(&ctx, input, 20);
+    mbedtls_sha1_update(&ctx, input, input_len);
     mbedtls_sha1_finish(&ctx, sha);
 
     memcpy(output, sha, 16);
@@ -60,26 +60,12 @@ SecureMessaging* secure_messaging_alloc(
     uint8_t D[20];
     memset(D, 0, sizeof(D));
     memcpy(D, sha, 16);
-    D[19] = 0x01;
-    mbedtls_sha1_init(&ctx);
-    mbedtls_sha1_starts(&ctx);
-    mbedtls_sha1_update(&ctx, D, sizeof(D));
-    mbedtls_sha1_finish(&ctx, sha);
-
-    memcpy(secure_messaging->KENC, sha, 16);
 
-    // Adjust the parity bits
-    secure_messaging_adjust_parity(secure_messaging->KENC);
+    D[19] = 0x01;
+    secure_messaging_key_diversification(D, sizeof(D), secure_messaging->KENC);
 
     D[19] = 0x02;
-    mbedtls_sha1_init(&ctx);
-    mbedtls_sha1_starts(&ctx);
-    mbedtls_sha1_update(&ctx, D, sizeof(D));
-    mbedtls_sha1_finish(&ctx, sha);
-
-    memcpy(secure_messaging->KMAC, sha, 16);
-
-    secure_messaging_adjust_parity(secure_messaging->KMAC);
+    secure_messaging_key_diversification(D, sizeof(D), secure_messaging->KMAC);
 
     mbedtls_sha1_free(&ctx);
     return secure_messaging;
@@ -96,30 +82,17 @@ void secure_messaging_calculate_session_keys(SecureMessaging* secure_messaging)
     for(size_t i = 0; i < sizeof(Kseed); i++) {
         Kseed[i] = secure_messaging->Kifd[i] ^ secure_messaging->Kicc[i];
     }
-    mbedtls_sha1_context ctx;
 
     uint8_t D[20];
-    uint8_t sha[20];
 
     memset(D, 0, sizeof(D));
     memcpy(D, Kseed, sizeof(Kseed));
+
     D[19] = 0x01;
-    mbedtls_sha1_init(&ctx);
-    mbedtls_sha1_starts(&ctx);
-    mbedtls_sha1_update(&ctx, D, sizeof(D));
-    mbedtls_sha1_finish(&ctx, sha);
+    secure_messaging_key_diversification(D, sizeof(D), secure_messaging->KSenc);
 
-    memcpy(secure_messaging->KSenc, sha, 16);
-    secure_messaging_adjust_parity(secure_messaging->KSenc);
-    memset(D, 0, sizeof(D));
-    memcpy(D, Kseed, sizeof(Kseed));
     D[19] = 0x02;
-    mbedtls_sha1_init(&ctx);
-    mbedtls_sha1_starts(&ctx);
-    mbedtls_sha1_update(&ctx, D, sizeof(D));
-    mbedtls_sha1_finish(&ctx, sha);
-    memcpy(secure_messaging->KSmac, sha, 16);
-    secure_messaging_adjust_parity(secure_messaging->KSmac);
+    secure_messaging_key_diversification(D, sizeof(D), secure_messaging->KSmac);
 }
 
 void secure_messaging_increment_context(SecureMessaging* secure_messaging) {
@@ -340,7 +313,6 @@ void secure_messaging_unwrap_rapdu(SecureMessaging* secure_messaging, BitBuffer*
         // Remove padding
         do {
         } while(decrypted[--decrypted_len] == 0 && decrypted_len > 0);
-
     }
 
     // Don't reset until after data has been decrypted