seos_common.c 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. #include "seos_common.h"
  2. char* seos_file_header = "Flipper Seos Credential";
  3. uint32_t seos_file_version = 1;
  4. void seos_log_buffer(char* TAG, char* prefix, uint8_t* buffer, size_t buffer_len) {
  5. char display[SEOS_WORKER_MAX_BUFFER_SIZE * 2 + 1];
  6. size_t limit = MIN((size_t)SEOS_WORKER_MAX_BUFFER_SIZE, buffer_len);
  7. memset(display, 0, sizeof(display));
  8. for(uint8_t i = 0; i < limit; i++) {
  9. snprintf(display + (i * 2), sizeof(display), "%02x", buffer[i]);
  10. }
  11. if(prefix) {
  12. FURI_LOG_D(TAG, "%s %d: %s", prefix, limit, display);
  13. } else {
  14. FURI_LOG_D(TAG, "Buffer %d: %s", limit, display);
  15. }
  16. }
  17. void seos_log_bitbuffer(char* TAG, char* prefix, BitBuffer* buffer) {
  18. furi_assert(buffer);
  19. size_t length = bit_buffer_get_size_bytes(buffer);
  20. const uint8_t* data = bit_buffer_get_data(buffer);
  21. char display[SEOS_WORKER_MAX_BUFFER_SIZE * 2 + 1];
  22. size_t limit = MIN((size_t)SEOS_WORKER_MAX_BUFFER_SIZE, length);
  23. memset(display, 0, sizeof(display));
  24. for(uint8_t i = 0; i < limit; i++) {
  25. snprintf(display + (i * 2), sizeof(display), "%02x", data[i]);
  26. }
  27. if(prefix) {
  28. FURI_LOG_D(TAG, "%s %d: %s", prefix, length, display);
  29. } else {
  30. FURI_LOG_D(TAG, "Buffer %d: %s", length, display);
  31. }
  32. }
  33. void seos_worker_diversify_key(
  34. uint8_t master_key_value[16],
  35. uint8_t* diversifier,
  36. size_t diversifier_len,
  37. uint8_t* adf_oid,
  38. size_t adf_oid_len,
  39. uint8_t algo_id1,
  40. uint8_t algo_id2,
  41. uint8_t keyId,
  42. bool is_encryption,
  43. uint8_t* div_key) {
  44. char* TAG = "SeosCommon";
  45. // 0000000000000000000000 04 00 0080 01 0907 01 2B0601040181E4380101020118010102 3D50AD518CD820
  46. size_t index = 0;
  47. uint8_t buffer[128];
  48. memset(buffer, 0, sizeof(buffer));
  49. index += 11;
  50. buffer[index++] = is_encryption ? 0x04 : 0x06;
  51. index++; // separation
  52. index++; // 0x00 that goes with 0x80 to indicate 128bit key
  53. buffer[index++] = 0x80;
  54. buffer[index++] = 0x01; // i
  55. buffer[index++] = algo_id1;
  56. buffer[index++] = algo_id2;
  57. buffer[index++] = keyId;
  58. memcpy(buffer + index, adf_oid, adf_oid_len);
  59. index += adf_oid_len;
  60. memcpy(buffer + index, diversifier, diversifier_len);
  61. index += diversifier_len;
  62. aes_cmac(master_key_value, 16, buffer, index, div_key);
  63. char display[33];
  64. memset(display, 0, sizeof(display));
  65. for(uint8_t i = 0; i < 16; i++) {
  66. snprintf(display + (i * 2), sizeof(display), "%02x", div_key[i]);
  67. }
  68. FURI_LOG_I(TAG, "Diversified %s key: %s", is_encryption ? "Encrypt" : "Mac", display);
  69. }
  70. void seos_worker_aes_decrypt(
  71. uint8_t key[16],
  72. size_t length,
  73. const uint8_t* encrypted,
  74. uint8_t* clear) {
  75. uint8_t iv[16];
  76. memset(iv, 0, sizeof(iv));
  77. mbedtls_aes_context ctx;
  78. mbedtls_aes_init(&ctx);
  79. mbedtls_aes_setkey_dec(&ctx, key, 128);
  80. mbedtls_aes_crypt_cbc(&ctx, MBEDTLS_AES_DECRYPT, length, iv, encrypted, clear);
  81. mbedtls_aes_free(&ctx);
  82. }
  83. void seos_worker_des_decrypt(
  84. uint8_t key[16],
  85. size_t length,
  86. const uint8_t* encrypted,
  87. uint8_t* clear) {
  88. uint8_t iv[8];
  89. memset(iv, 0, sizeof(iv));
  90. mbedtls_des3_context ctx;
  91. mbedtls_des3_init(&ctx);
  92. mbedtls_des3_set2key_dec(&ctx, key);
  93. mbedtls_des3_crypt_cbc(&ctx, MBEDTLS_DES_DECRYPT, length, iv, encrypted, clear);
  94. mbedtls_des3_free(&ctx);
  95. }
  96. void seos_worker_aes_encrypt(
  97. uint8_t key[16],
  98. size_t length,
  99. const uint8_t* clear,
  100. uint8_t* encrypted) {
  101. uint8_t iv[16];
  102. memset(iv, 0, sizeof(iv));
  103. mbedtls_aes_context ctx;
  104. mbedtls_aes_init(&ctx);
  105. mbedtls_aes_setkey_enc(&ctx, key, 128);
  106. mbedtls_aes_crypt_cbc(&ctx, MBEDTLS_AES_ENCRYPT, length, iv, clear, encrypted);
  107. mbedtls_aes_free(&ctx);
  108. }
  109. void seos_worker_des_encrypt(
  110. uint8_t key[16],
  111. size_t length,
  112. const uint8_t* clear,
  113. uint8_t* encrypted) {
  114. uint8_t iv[8];
  115. memset(iv, 0, sizeof(iv));
  116. mbedtls_des3_context ctx;
  117. mbedtls_des3_init(&ctx);
  118. mbedtls_des3_set2key_enc(&ctx, key);
  119. mbedtls_des3_crypt_cbc(&ctx, MBEDTLS_DES_ENCRYPT, length, iv, clear, encrypted);
  120. mbedtls_des3_free(&ctx);
  121. }