seos_common.c 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  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_common_copy_credential(const SeosCredential* src, SeosCredential* dst) {
  34. furi_assert(src);
  35. furi_assert(dst);
  36. dst->diversifier_len = src->diversifier_len;
  37. memcpy(dst->diversifier, src->diversifier, dst->diversifier_len);
  38. dst->sio_len = src->sio_len;
  39. memcpy(dst->sio, src->sio, dst->sio_len);
  40. }
  41. void seos_worker_diversify_key(
  42. uint8_t master_key_value[16],
  43. uint8_t* diversifier,
  44. size_t diversifier_len,
  45. uint8_t* adf_oid,
  46. size_t adf_oid_len,
  47. uint8_t algo_id1,
  48. uint8_t algo_id2,
  49. uint8_t keyId,
  50. bool is_encryption,
  51. uint8_t* div_key) {
  52. char* TAG = "SeosCommon";
  53. // 0000000000000000000000 04 00 0080 01 0907 01 2B0601040181E4380101020118010102 3D50AD518CD820
  54. size_t index = 0;
  55. uint8_t buffer[128];
  56. memset(buffer, 0, sizeof(buffer));
  57. index += 11;
  58. buffer[index++] = is_encryption ? 0x04 : 0x06;
  59. index++; // separation
  60. index++; // 0x00 that goes with 0x80 to indicate 128bit key
  61. buffer[index++] = 0x80;
  62. buffer[index++] = 0x01; // i
  63. buffer[index++] = algo_id1;
  64. buffer[index++] = algo_id2;
  65. buffer[index++] = keyId;
  66. memcpy(buffer + index, adf_oid, adf_oid_len);
  67. index += adf_oid_len;
  68. memcpy(buffer + index, diversifier, diversifier_len);
  69. index += diversifier_len;
  70. aes_cmac(master_key_value, 16, buffer, index, div_key);
  71. char display[33];
  72. memset(display, 0, sizeof(display));
  73. for(uint8_t i = 0; i < 16; i++) {
  74. snprintf(display + (i * 2), sizeof(display), "%02x", div_key[i]);
  75. }
  76. FURI_LOG_I(TAG, "Diversified %s key: %s", is_encryption ? "Encrypt" : "Mac", display);
  77. }
  78. void seos_worker_aes_decrypt(
  79. uint8_t key[16],
  80. size_t length,
  81. const uint8_t* encrypted,
  82. uint8_t* clear) {
  83. uint8_t iv[16];
  84. memset(iv, 0, sizeof(iv));
  85. mbedtls_aes_context ctx;
  86. mbedtls_aes_init(&ctx);
  87. mbedtls_aes_setkey_dec(&ctx, key, 128);
  88. mbedtls_aes_crypt_cbc(&ctx, MBEDTLS_AES_DECRYPT, length, iv, encrypted, clear);
  89. mbedtls_aes_free(&ctx);
  90. }
  91. void seos_worker_des_decrypt(
  92. uint8_t key[16],
  93. size_t length,
  94. const uint8_t* encrypted,
  95. uint8_t* clear) {
  96. uint8_t iv[8];
  97. memset(iv, 0, sizeof(iv));
  98. mbedtls_des3_context ctx;
  99. mbedtls_des3_init(&ctx);
  100. mbedtls_des3_set2key_dec(&ctx, key);
  101. mbedtls_des3_crypt_cbc(&ctx, MBEDTLS_DES_DECRYPT, length, iv, encrypted, clear);
  102. mbedtls_des3_free(&ctx);
  103. }
  104. void seos_worker_aes_encrypt(
  105. uint8_t key[16],
  106. size_t length,
  107. const uint8_t* clear,
  108. uint8_t* encrypted) {
  109. uint8_t iv[16];
  110. memset(iv, 0, sizeof(iv));
  111. mbedtls_aes_context ctx;
  112. mbedtls_aes_init(&ctx);
  113. mbedtls_aes_setkey_enc(&ctx, key, 128);
  114. mbedtls_aes_crypt_cbc(&ctx, MBEDTLS_AES_ENCRYPT, length, iv, clear, encrypted);
  115. mbedtls_aes_free(&ctx);
  116. }
  117. void seos_worker_des_encrypt(
  118. uint8_t key[16],
  119. size_t length,
  120. const uint8_t* clear,
  121. uint8_t* encrypted) {
  122. uint8_t iv[8];
  123. memset(iv, 0, sizeof(iv));
  124. mbedtls_des3_context ctx;
  125. mbedtls_des3_init(&ctx);
  126. mbedtls_des3_set2key_enc(&ctx, key);
  127. mbedtls_des3_crypt_cbc(&ctx, MBEDTLS_DES_ENCRYPT, length, iv, clear, encrypted);
  128. mbedtls_des3_free(&ctx);
  129. }