summaryrefslogtreecommitdiff
path: root/unit
diff options
context:
space:
mode:
authorMichaƂ Lowas-Rzechonek <michal.lowas-rzechonek@silvair.com>2020-03-26 22:17:05 +0100
committerBrian Gix <brian.gix@intel.com>2020-04-07 09:52:44 -0700
commit59aae8b1cc5ed0974a2c5a43e16d1862d561fffb (patch)
treecf9d6f805149bc4200247edd9e8b8b4c56764b8a /unit
parente45b7a21f9a508ecaf4746bde5b97a4ded53edf0 (diff)
downloadbluez-59aae8b1cc5ed0974a2c5a43e16d1862d561fffb.tar.gz
mesh: Remove redundant code from mesh/crypto
- Remove application_encrypt/application_decrypt - Make mesh_crypto_privacy_counter private, add mesh_crypto_pecb - Make *_nonce functions private and align their implementation to be more consistent - Refactor network_encrypt/network_decrypt to use *_nonce functions and rename them to packet_encrypt/packet_decrypt - Refactor packet_encode/packet_decode
Diffstat (limited to 'unit')
-rw-r--r--unit/test-mesh-crypto.c205
1 files changed, 103 insertions, 102 deletions
diff --git a/unit/test-mesh-crypto.c b/unit/test-mesh-crypto.c
index 0043b0b10..3ecb3d026 100644
--- a/unit/test-mesh-crypto.c
+++ b/unit/test-mesh-crypto.c
@@ -780,8 +780,8 @@ static void check_encrypt_segment(const struct mesh_crypto_test *keys,
uint8_t priv_rand[16];
uint8_t packet[29];
uint8_t packet_len;
- uint64_t net_mic64;
- uint32_t hdr, net_mic32;
+ uint32_t hdr;
+ uint64_t net_mic64, net_mic32;
size_t net_msg_len;
uint8_t key_aid = keys->key_aid | (keys->akf ? KEY_ID_AKF : 0x00);
@@ -857,13 +857,12 @@ static void check_encrypt_segment(const struct mesh_crypto_test *keys,
net_msg_len = len + 2;
show_data("TransportPayload", 7, packet + 7, net_msg_len);
- mesh_crypto_network_encrypt(keys->ctl,
- keys->net_ttl, keys->net_seq[0],
- keys->net_src,
- keys->iv_index, enc_key,
- packet + 7, len + 2, packet + 7,
- keys->ctl ? (void *)&net_mic64 :
- (void *)&net_mic32);
+ mesh_crypto_packet_encrypt(packet, packet_len,
+ enc_key,
+ keys->iv_index, false,
+ keys->ctl, keys->net_ttl,
+ keys->net_seq[0],
+ keys->net_src);
mesh_crypto_privacy_counter(keys->iv_index, packet + 7, priv_rand);
@@ -883,20 +882,22 @@ static void check_encrypt_segment(const struct mesh_crypto_test *keys,
verify_data("EncNetworkPayload", 7, keys->net_msg[0],
packet + 7, net_msg_len);
if (keys->ctl) {
+ net_mic64 = l_get_be64(packet + 7 + net_msg_len);
verify_uint64("NetworkMIC", 7 + net_msg_len,
- keys->net_mic64, net_mic64);
+ keys->net_mic64, net_mic64);
net_msg_len += 8;
} else {
+ net_mic32 = l_get_be32(packet + 7 + net_msg_len);
verify_uint32("NetworkMIC", 7 + net_msg_len,
- keys->net_mic32[0], net_mic32);
+ keys->net_mic32[0], net_mic32);
net_msg_len += 4;
}
show_data("PreObsPayload", 1, packet + 1, 6 + net_msg_len);
- mesh_crypto_network_obfuscate(priv_key, priv_rand,
- keys->ctl,
- keys->net_ttl, keys->net_seq[0],
- keys->net_src, packet + 1);
+ mesh_crypto_network_obfuscate(packet, priv_key,
+ keys->iv_index,
+ keys->ctl, keys->net_ttl,
+ keys->net_seq[0], keys->net_src);
show_data("PostObsPayload", 1, packet + 1, 6 + net_msg_len);
packet[0] = (keys->iv_index & 0x01) << 7 | nid;
@@ -1019,25 +1020,23 @@ static void check_encrypt(const struct mesh_crypto_test *keys)
if (keys->szmic) {
seg_max = SEG_MAX(keys->segmented, app_msg_len + 8);
enc_msg = l_malloc(app_msg_len + 8);
- mesh_crypto_application_encrypt(key_aid, keys->app_seq,
- keys->net_src, keys->net_dst,
- keys->iv_index,
- keys->akf ? app_key : dev_key,
- aad, aad_len,
- app_msg, app_msg_len,
- enc_msg, &app_mic64, sizeof(app_mic64));
- l_put_be64(app_mic64, enc_msg + app_msg_len);
+
+ mesh_crypto_payload_encrypt(aad, app_msg,
+ enc_msg, app_msg_len,
+ keys->net_src, keys->net_dst, key_aid,
+ keys->app_seq, keys->iv_index,
+ keys->szmic,
+ keys->akf ? app_key : dev_key);
} else {
seg_max = SEG_MAX(keys->segmented, app_msg_len + 4);
enc_msg = l_malloc(app_msg_len + 4);
- mesh_crypto_application_encrypt(key_aid, keys->app_seq,
- keys->net_src, keys->net_dst,
- keys->iv_index,
- keys->akf ? app_key : dev_key,
- aad, aad_len,
- app_msg, app_msg_len,
- enc_msg, &app_mic32, sizeof(app_mic32));
- l_put_be32(app_mic32, enc_msg + app_msg_len);
+
+ mesh_crypto_payload_encrypt(aad, app_msg,
+ enc_msg, app_msg_len,
+ keys->net_src, keys->net_dst, key_aid,
+ keys->app_seq, keys->iv_index,
+ keys->szmic,
+ keys->akf ? app_key : dev_key);
}
if (keys->dev_key && !keys->akf)
@@ -1057,10 +1056,12 @@ static void check_encrypt(const struct mesh_crypto_test *keys)
verify_data("EncryptedAppPayload", 0, keys->enc_msg, enc_msg,
app_msg_len);
if (keys->szmic) {
+ app_mic64 = l_get_be64(enc_msg + app_msg_len);
verify_uint64("ApplicationMIC", app_msg_len,
keys->app_mic64, app_mic64);
app_msg_len += 8;
} else {
+ app_mic32 = l_get_be32(enc_msg + app_msg_len);
verify_uint32("ApplicationMIC", app_msg_len,
keys->app_mic32, app_mic32);
app_msg_len += 4;
@@ -1172,20 +1173,18 @@ static void check_encrypt(const struct mesh_crypto_test *keys)
keys->net_seq[i], keys->net_src,
keys->iv_index, net_nonce);
- verify_data("TransportData", 9, keys->trans_pkt[i],
+ verify_data("TransportData", 9, keys->trans_pkt[i],
packet + 9, seg_len);
verify_uint16("DST", 7, keys->net_dst, l_get_be16(packet + 7));
net_msg_len = seg_len + 2;
show_data("TransportPayload", 7, packet + 7, net_msg_len);
- mesh_crypto_network_encrypt(keys->ctl,
- keys->net_ttl, keys->net_seq[i],
- keys->net_src,
- keys->iv_index, enc_key,
- packet + 7, seg_len + 2, packet + 7,
- keys->ctl ? (void *)&net_mic64 :
- (void *)&net_mic32);
+ mesh_crypto_packet_encrypt(packet, packet_len, enc_key,
+ keys->iv_index, false,
+ keys->ctl, keys->net_ttl,
+ keys->net_seq[i],
+ keys->net_src);
mesh_crypto_privacy_counter(keys->iv_index, packet + 7,
priv_rand);
@@ -1208,20 +1207,23 @@ static void check_encrypt(const struct mesh_crypto_test *keys)
verify_data("EncNetworkPayload", 7, keys->net_msg[i],
packet + 7, net_msg_len);
if (keys->ctl) {
+ net_mic64 = l_get_be64(packet + packet_len - 8);
verify_uint64("NetworkMIC", 7 + net_msg_len,
keys->net_mic64, net_mic64);
net_msg_len += 8;
} else {
+ net_mic32 = l_get_be32(packet + packet_len - 4);
verify_uint32("NetworkMIC", 7 + net_msg_len,
keys->net_mic32[i], net_mic32);
net_msg_len += 4;
}
show_data("PreObsPayload", 1, packet + 1, 6 + net_msg_len);
- mesh_crypto_network_obfuscate(priv_key, priv_rand,
- keys->ctl,
- keys->net_ttl, keys->net_seq[i],
- keys->net_src, packet + 1);
+ mesh_crypto_network_obfuscate(packet, priv_key,
+ keys->iv_index,
+ keys->ctl, keys->net_ttl,
+ keys->net_seq[i], keys->net_src);
+
show_data("PostObsPayload", 1, packet + 1, 6 + net_msg_len);
packet[0] = (keys->iv_index & 0x01) << 7 | nid;
@@ -1242,7 +1244,7 @@ done:
static void check_decrypt_segment(const struct mesh_crypto_test *keys,
uint16_t seg, uint16_t seg_max,
- const uint8_t *pkt, uint8_t pkt_len,
+ uint8_t *pkt, uint8_t pkt_len,
const uint8_t *msg, uint8_t msg_len,
uint8_t *enc_key, uint8_t *priv_key,
uint8_t nid)
@@ -1274,26 +1276,30 @@ static void check_decrypt_segment(const struct mesh_crypto_test *keys,
if (ctl) {
net_mic64 = l_get_be64(pkt + pkt_len - 8);
show_data("EncryptedPayload", 7, pkt + 7, pkt_len - 7 - 8);
- mesh_crypto_network_decrypt(ctl, ttl, seq,
- src, keys->iv_index, enc_key,
- pkt + 7, pkt_len - 7, net_clr + 7,
- &calc_net_mic64,
- sizeof(calc_net_mic64));
+
+ mesh_crypto_packet_decrypt(pkt, pkt_len,
+ enc_key,
+ keys->iv_index, false,
+ ctl, ttl, seq,
+ src);
+ calc_net_mic64 = l_get_be64(pkt + pkt_len - 8);
+
verify_uint64("NetworkMIC", pkt_len - 8, net_mic64,
- calc_net_mic64);
+ net_mic64 ^ calc_net_mic64);
show_data("DecryptedPayload", 7, net_clr + 7, pkt_len - 7 - 8);
} else {
net_mic32 = l_get_be32(pkt + pkt_len - 4);
show_data("EncryptedPayload", 7, pkt + 7, pkt_len - 7 - 4);
- mesh_crypto_network_decrypt(ctl, ttl, seq,
- src, keys->iv_index, enc_key,
- pkt + 7, pkt_len - 7, net_clr + 7,
- &calc_net_mic32,
- sizeof(calc_net_mic32));
+ mesh_crypto_packet_decrypt(pkt, pkt_len,
+ enc_key,
+ keys->iv_index, false,
+ ctl, ttl, seq,
+ src);
+ calc_net_mic32 = l_get_be32(pkt + pkt_len - 4);
verify_uint32("NetworkMIC", pkt_len - 4, net_mic32,
- calc_net_mic32);
+ net_mic32 ^ calc_net_mic32);
show_data("DecryptedPayload", 7, net_clr + 7, pkt_len - 7 - 4);
}
@@ -1387,15 +1393,11 @@ static void check_decrypt(const struct mesh_crypto_test *keys)
uint8_t *app_key;
uint8_t *net_key;
uint8_t enc_key[16];
- uint8_t net_nonce[13];
- uint8_t app_nonce[13];
uint8_t priv_key[16];
- uint8_t priv_rand[16];
uint8_t p[9];
size_t p_len;
uint8_t *packet = NULL;
size_t packet_len;
- const uint8_t *net_hdr;
uint8_t *net_msg;
uint8_t net_msg_len;
uint16_t app_msg_len = 0;
@@ -1469,9 +1471,6 @@ static void check_decrypt(const struct mesh_crypto_test *keys)
goto done;
}
- mesh_crypto_application_nonce(keys->app_seq, keys->net_src,
- keys->net_dst, keys->iv_index,
- keys->szmic, app_nonce);
app_msg = l_malloc(384);
seg_max = (sizeof(keys->packet) / sizeof(keys->packet[0])) - 1;
@@ -1483,19 +1482,13 @@ static void check_decrypt(const struct mesh_crypto_test *keys)
if (keys->segmented)
l_info(COLOR_YELLOW "Segment-%d" COLOR_OFF, i);
- mesh_crypto_network_nonce(keys->frnd, keys->net_ttl,
- keys->net_seq[i], keys->net_src, keys->iv_index,
- net_nonce);
l_free(packet);
packet = l_util_from_hexstring(keys->packet[i], &packet_len);
- net_hdr = packet + 1;
net_msg = packet + 7;
net_msg_len = packet_len - 7;
- mesh_crypto_privacy_counter(keys->iv_index, net_msg, priv_rand);
-
- mesh_crypto_network_clarify(priv_key, priv_rand, net_hdr,
+ mesh_crypto_network_clarify(packet, priv_key, keys->iv_index,
&net_ctl, &net_ttl, &net_seq, &net_src);
show_str("Packet", 0, keys->packet[i]);
@@ -1504,29 +1497,31 @@ static void check_decrypt(const struct mesh_crypto_test *keys)
net_mic64 = l_get_be64(packet + packet_len - 8);
show_data("NetworkMessage", 7, net_msg,
net_msg_len - 8);
- mesh_crypto_network_decrypt(net_ctl, net_ttl, net_seq,
- net_src, keys->iv_index, enc_key,
- net_msg, net_msg_len, net_msg,
- &calc_net_mic64,
- sizeof(calc_net_mic64));
+ mesh_crypto_packet_decrypt(packet, packet_len,
+ enc_key,
+ keys->iv_index, false,
+ net_ctl, net_ttl,
+ net_seq,
+ net_src);
+ calc_net_mic64 = l_get_be64(packet + packet_len - 8);
net_msg_len -= 8;
verify_uint64("NetworkMIC", 7 + net_msg_len, net_mic64,
- calc_net_mic64);
+ net_mic64 ^ calc_net_mic64);
show_data("DecryptedNetwork", 7, net_msg, net_msg_len);
} else {
net_mic32 = l_get_be32(packet + packet_len - 4);
show_data("NetworkMessage", 7, net_msg,
net_msg_len - 4);
-
- mesh_crypto_network_decrypt(net_ctl, net_ttl, net_seq,
- net_src, keys->iv_index, enc_key,
- net_msg, net_msg_len, net_msg,
- &calc_net_mic32,
- sizeof(calc_net_mic32));
-
+ mesh_crypto_packet_decrypt(packet, packet_len,
+ enc_key,
+ keys->iv_index, false,
+ net_ctl, net_ttl,
+ net_seq,
+ net_src);
+ calc_net_mic32 = l_get_be32(packet + packet_len - 4);
net_msg_len -= 4;
verify_uint32("NetworkMIC", 7 + net_msg_len, net_mic32,
- calc_net_mic32);
+ net_mic32 ^ calc_net_mic32);
show_data("DecryptedNetwork", 7, net_msg, net_msg_len);
}
@@ -1645,8 +1640,8 @@ static void check_decrypt(const struct mesh_crypto_test *keys)
packet, &pkt_len);
verify_data("TransportData", 9, keys->trans_pkt[i], packet + 9,
payload_len);
- mesh_crypto_packet_encode(packet, pkt_len, enc_key,
- keys->iv_index, priv_key);
+ mesh_crypto_packet_encode(packet, pkt_len, keys->iv_index,
+ enc_key, priv_key);
mesh_crypto_packet_label(packet, pkt_len, keys->iv_index, nid);
verify_data("Encoded-Packet", 0, keys->packet[i], packet,
@@ -1666,39 +1661,45 @@ static void check_decrypt(const struct mesh_crypto_test *keys)
app_msg_len - 8);
app_mic64 = l_get_be64(app_msg + app_msg_len - 8);
- mesh_crypto_application_decrypt(
- keys_aid | (keys->akf ? KEY_ID_AKF : 0),
- seqZero, net_src,
- net_dst, keys->iv_index,
- keys->akf ? app_key : dev_key,
+ mesh_crypto_payload_decrypt(
aad, aad_len,
app_msg, app_msg_len,
- app_msg, &calc_app_mic64,
- sizeof(calc_app_mic64));
+ true,
+ net_src, net_dst,
+ keys->akf ? keys_aid | KEY_ID_AKF : APP_AID_DEV,
+ seqZero,
+ keys->iv_index,
+ app_msg,
+ keys->akf ? app_key : dev_key);
+
+ calc_app_mic64 = l_get_be64(app_msg + app_msg_len - 8);
verify_data("Payload", 0, keys->app_msg, app_msg,
app_msg_len - 8);
verify_uint64("ApplicationMIC", app_msg_len - 8, app_mic64,
- calc_app_mic64);
+ app_mic64 ^ calc_app_mic64);
} else if (!keys->ctl) {
verify_data("EncryptedPayload", 0, keys->enc_msg, app_msg,
app_msg_len - 4);
app_mic32 = l_get_be32(app_msg + app_msg_len - 4);
- mesh_crypto_application_decrypt(
- keys_aid | (keys->akf ? KEY_ID_AKF : 0),
- seqZero, net_src,
- net_dst, keys->iv_index,
- keys->akf ? app_key : dev_key,
+ mesh_crypto_payload_decrypt(
aad, aad_len,
app_msg, app_msg_len,
- app_msg, &calc_app_mic32,
- sizeof(calc_app_mic32));
+ false,
+ net_src, net_dst,
+ keys->akf ? keys_aid | KEY_ID_AKF : APP_AID_DEV,
+ seqZero,
+ keys->iv_index,
+ app_msg,
+ keys->akf ? app_key : dev_key);
+
+ calc_app_mic32 = l_get_be64(app_msg + app_msg_len - 4);
verify_data("Payload", 0, keys->app_msg, app_msg,
app_msg_len - 4);
verify_uint32("ApplicationMIC", app_msg_len - 4, app_mic32,
- calc_app_mic32);
+ app_mic32 ^ calc_app_mic32);
}
done: