Skip to content

Commit d3cc534

Browse files
committed
refactor: Use structs for extended public/secret keys.
1 parent d75796e commit d3cc534

File tree

9 files changed

+193
-137
lines changed

9 files changed

+193
-137
lines changed

toxcore/Messenger.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -404,7 +404,7 @@ bool m_create_group_connection(Messenger *m, GC_Chat *chat)
404404
const int onion_friend_number = friend_conn_get_onion_friendnum(connection);
405405
Onion_Friend *onion_friend = onion_get_friend(m->onion_c, (uint16_t)onion_friend_number);
406406

407-
onion_friend_set_gc_public_key(onion_friend, get_chat_id(chat->chat_public_key));
407+
onion_friend_set_gc_public_key(onion_friend, get_chat_id(&chat->chat_public_key));
408408
onion_friend_set_gc_data(onion_friend, nullptr, 0);
409409

410410
return true;
@@ -2594,8 +2594,8 @@ static bool self_announce_group(const Messenger *m, GC_Chat *chat, Onion_Friend
25942594
memcpy(&announce.base_announce.ip_port, &chat->self_ip_port, sizeof(IP_Port));
25952595
}
25962596

2597-
memcpy(announce.base_announce.peer_public_key, chat->self_public_key, ENC_PUBLIC_KEY_SIZE);
2598-
memcpy(announce.chat_public_key, get_chat_id(chat->chat_public_key), ENC_PUBLIC_KEY_SIZE);
2597+
memcpy(announce.base_announce.peer_public_key, chat->self_public_key.enc, ENC_PUBLIC_KEY_SIZE);
2598+
memcpy(announce.chat_public_key, get_chat_id(&chat->chat_public_key), ENC_PUBLIC_KEY_SIZE);
25992599

26002600
uint8_t gc_data[GCA_MAX_DATA_LENGTH];
26012601
const int length = gca_pack_public_announce(m->log, gc_data, GCA_MAX_DATA_LENGTH, &announce);

toxcore/crypto_core.c

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -46,45 +46,45 @@ static_assert(CRYPTO_SIGN_SECRET_KEY_SIZE == crypto_sign_SECRETKEYBYTES,
4646
"CRYPTO_SIGN_SECRET_KEY_SIZE should be equal to crypto_sign_SECRETKEYBYTES");
4747

4848

49-
bool create_extended_keypair(uint8_t pk[EXT_PUBLIC_KEY_SIZE], uint8_t sk[EXT_SECRET_KEY_SIZE], const Random *rng)
49+
bool create_extended_keypair(Extended_Public_Key *pk, Extended_Secret_Key *sk, const Random *rng)
5050
{
5151
/* create signature key pair */
5252
uint8_t seed[crypto_sign_SEEDBYTES];
5353
random_bytes(rng, seed, crypto_sign_SEEDBYTES);
54-
crypto_sign_seed_keypair(pk + ENC_PUBLIC_KEY_SIZE, sk + ENC_SECRET_KEY_SIZE, seed);
54+
crypto_sign_seed_keypair(pk->sig, sk->sig, seed);
5555

5656
/* convert public signature key to public encryption key */
57-
const int res1 = crypto_sign_ed25519_pk_to_curve25519(pk, pk + ENC_PUBLIC_KEY_SIZE);
57+
const int res1 = crypto_sign_ed25519_pk_to_curve25519(pk->enc, pk->sig);
5858

5959
/* convert secret signature key to secret encryption key */
60-
const int res2 = crypto_sign_ed25519_sk_to_curve25519(sk, sk + ENC_SECRET_KEY_SIZE);
60+
const int res2 = crypto_sign_ed25519_sk_to_curve25519(sk->enc, sk->sig);
6161

6262
return res1 == 0 && res2 == 0;
6363
}
6464

65-
const uint8_t *get_enc_key(const uint8_t *key)
65+
const uint8_t *get_enc_key(const Extended_Public_Key *key)
6666
{
67-
return key;
67+
return key->enc;
6868
}
6969

70-
const uint8_t *get_sig_pk(const uint8_t *key)
70+
const uint8_t *get_sig_pk(const Extended_Public_Key *key)
7171
{
72-
return key + ENC_PUBLIC_KEY_SIZE;
72+
return key->sig;
7373
}
7474

75-
void set_sig_pk(uint8_t *key, const uint8_t *sig_pk)
75+
void set_sig_pk(Extended_Public_Key *key, const uint8_t *sig_pk)
7676
{
77-
memcpy(key + ENC_PUBLIC_KEY_SIZE, sig_pk, SIG_PUBLIC_KEY_SIZE);
77+
memcpy(key->sig, sig_pk, SIG_PUBLIC_KEY_SIZE);
7878
}
7979

80-
const uint8_t *get_sig_sk(const uint8_t *key)
80+
const uint8_t *get_sig_sk(const Extended_Secret_Key *key)
8181
{
82-
return key + ENC_SECRET_KEY_SIZE;
82+
return key->sig;
8383
}
8484

85-
const uint8_t *get_chat_id(const uint8_t *key)
85+
const uint8_t *get_chat_id(const Extended_Public_Key *key)
8686
{
87-
return key + ENC_PUBLIC_KEY_SIZE;
87+
return key->sig;
8888
}
8989

9090
#if !defined(FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION)

toxcore/crypto_core.h

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -324,6 +324,21 @@ void random_bytes(const Random *rng, uint8_t *bytes, size_t length);
324324
non_null()
325325
bool public_key_valid(const uint8_t public_key[CRYPTO_PUBLIC_KEY_SIZE]);
326326

327+
typedef uint8_t Public_Key[CRYPTO_PUBLIC_KEY_SIZE];
328+
typedef uint8_t Secret_Key[CRYPTO_SECRET_KEY_SIZE];
329+
typedef uint8_t Sign_Public_Key[CRYPTO_SIGN_PUBLIC_KEY_SIZE];
330+
typedef uint8_t Sign_Secret_Key[CRYPTO_SIGN_SECRET_KEY_SIZE];
331+
332+
typedef struct Extended_Public_Key {
333+
Public_Key enc;
334+
Sign_Public_Key sig;
335+
} Extended_Public_Key;
336+
337+
typedef struct Extended_Secret_Key {
338+
Secret_Key enc;
339+
Sign_Secret_Key sig;
340+
} Extended_Secret_Key;
341+
327342
/**
328343
* @brief Creates an extended keypair: curve25519 and ed25519 for encryption and signing
329344
* respectively. The Encryption keys are derived from the signature keys.
@@ -338,14 +353,14 @@ bool public_key_valid(const uint8_t public_key[CRYPTO_PUBLIC_KEY_SIZE]);
338353
* @retval true on success.
339354
*/
340355
non_null()
341-
bool create_extended_keypair(uint8_t pk[EXT_PUBLIC_KEY_SIZE], uint8_t sk[EXT_SECRET_KEY_SIZE], const Random *rng);
356+
bool create_extended_keypair(Extended_Public_Key *pk, Extended_Secret_Key *sk, const Random *rng);
342357

343358
/** Functions for groupchat extended keys */
344-
non_null() const uint8_t *get_enc_key(const uint8_t *key);
345-
non_null() const uint8_t *get_sig_pk(const uint8_t *key);
346-
non_null() void set_sig_pk(uint8_t *key, const uint8_t *sig_pk);
347-
non_null() const uint8_t *get_sig_sk(const uint8_t *key);
348-
non_null() const uint8_t *get_chat_id(const uint8_t *key);
359+
non_null() const uint8_t *get_enc_key(const Extended_Public_Key *key);
360+
non_null() const uint8_t *get_sig_pk(const Extended_Public_Key *key);
361+
non_null() void set_sig_pk(Extended_Public_Key *key, const uint8_t *sig_pk);
362+
non_null() const uint8_t *get_sig_sk(const Extended_Secret_Key *key);
363+
non_null() const uint8_t *get_chat_id(const Extended_Public_Key *key);
349364

350365
/**
351366
* @brief Generate a new random keypair.

toxcore/crypto_core_test.cc

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,6 @@ namespace {
1414
using HmacKey = std::array<uint8_t, CRYPTO_HMAC_KEY_SIZE>;
1515
using Hmac = std::array<uint8_t, CRYPTO_HMAC_SIZE>;
1616
using SecretKey = std::array<uint8_t, CRYPTO_SECRET_KEY_SIZE>;
17-
using ExtPublicKey = std::array<uint8_t, EXT_PUBLIC_KEY_SIZE>;
18-
using ExtSecretKey = std::array<uint8_t, EXT_SECRET_KEY_SIZE>;
1917
using Signature = std::array<uint8_t, CRYPTO_SIGNATURE_SIZE>;
2018
using Nonce = std::array<uint8_t, CRYPTO_NONCE_SIZE>;
2119

@@ -72,10 +70,10 @@ TEST(CryptoCore, Signatures)
7270
{
7371
Test_Random rng;
7472

75-
ExtPublicKey pk;
76-
ExtSecretKey sk;
73+
Extended_Public_Key pk;
74+
Extended_Secret_Key sk;
7775

78-
EXPECT_TRUE(create_extended_keypair(pk.data(), sk.data(), rng));
76+
EXPECT_TRUE(create_extended_keypair(&pk, &sk, rng));
7977

8078
std::vector<uint8_t> message{0};
8179
message.clear();
@@ -84,9 +82,9 @@ TEST(CryptoCore, Signatures)
8482
for (uint8_t i = 0; i < 100; ++i) {
8583
Signature signature;
8684
EXPECT_TRUE(crypto_signature_create(
87-
signature.data(), message.data(), message.size(), get_sig_sk(sk.data())));
85+
signature.data(), message.data(), message.size(), get_sig_sk(&sk)));
8886
EXPECT_TRUE(crypto_signature_verify(
89-
signature.data(), message.data(), message.size(), get_sig_pk(pk.data())));
87+
signature.data(), message.data(), message.size(), get_sig_pk(&pk)));
9088

9189
message.push_back(random_u08(rng));
9290
}

0 commit comments

Comments
 (0)