Commit c4962665 authored by vysheng's avatar vysheng

Added more checks on g_a and g

parent f11ae198
...@@ -43,7 +43,7 @@ ...@@ -43,7 +43,7 @@
#include "mtproto-common.h" #include "mtproto-common.h"
#define ALLOW_MULT 1 //#define ALLOW_MULT 1
char *default_prompt = "> "; char *default_prompt = "> ";
int unread_messages; int unread_messages;
......
...@@ -462,7 +462,7 @@ int check_DH_params (BIGNUM *p, int g) { ...@@ -462,7 +462,7 @@ int check_DH_params (BIGNUM *p, int g) {
return 0; return 0;
} }
int check_g (BIGNUM *g) { int check_g (unsigned char p[256], BIGNUM *g) {
static unsigned char s[256]; static unsigned char s[256];
memset (s, 0, 256); memset (s, 0, 256);
assert (BN_num_bytes (g) <= 256); assert (BN_num_bytes (g) <= 256);
...@@ -484,9 +484,28 @@ int check_g (BIGNUM *g) { ...@@ -484,9 +484,28 @@ int check_g (BIGNUM *g) {
} }
} }
if (!ok) { return -1; } if (!ok) { return -1; }
ok = 0;
for (i = 0; i < 64; i++) {
if (s[i] < p[i]) {
ok = 1;
break;
} else if (s[i] > p[i]) {
logprintf ("i = %d (%d %d)\n", i, (int)s[i], (int)p[i]);
return -1;
}
}
if (!ok) { return -1; }
return 0; return 0;
} }
int check_g_bn (BIGNUM *p, BIGNUM *g) {
static unsigned char s[256];
memset (s, 0, 256);
assert (BN_num_bytes (p) <= 256);
BN_bn2bin (p, s);
return check_g (s, g);
}
int process_dh_answer (struct connection *c, char *packet, int len) { int process_dh_answer (struct connection *c, char *packet, int len) {
if (verbosity) { if (verbosity) {
logprintf ( "process_dh_answer(), len=%d\n", len); logprintf ( "process_dh_answer(), len=%d\n", len);
...@@ -519,7 +538,7 @@ int process_dh_answer (struct connection *c, char *packet, int len) { ...@@ -519,7 +538,7 @@ int process_dh_answer (struct connection *c, char *packet, int len) {
BN_init (&g_a); BN_init (&g_a);
assert (fetch_bignum (&dh_prime) > 0); assert (fetch_bignum (&dh_prime) > 0);
assert (fetch_bignum (&g_a) > 0); assert (fetch_bignum (&g_a) > 0);
assert (check_g (&g_a) >= 0); assert (check_g_bn (&dh_prime, &g_a) >= 0);
int server_time = *in_ptr++; int server_time = *in_ptr++;
assert (in_ptr <= in_end); assert (in_ptr <= in_end);
......
...@@ -26,6 +26,7 @@ long long encrypt_send_message (struct connection *c, int *msg, int msg_ints, in ...@@ -26,6 +26,7 @@ long long encrypt_send_message (struct connection *c, int *msg, int msg_ints, in
void dc_authorize (struct dc *DC); void dc_authorize (struct dc *DC);
void work_update (struct connection *c, long long msg_id); void work_update (struct connection *c, long long msg_id);
void work_update_binlog (void); void work_update_binlog (void);
int check_g (BIGNUM *g); int check_g (unsigned char p[256], BIGNUM *g);
int check_g_bn (BIGNUM *p, BIGNUM *g);
int check_DH_params (BIGNUM *p, int g); int check_DH_params (BIGNUM *p, int g);
#endif #endif
...@@ -596,7 +596,7 @@ void insert_seqno (struct session *S, int seqno) { ...@@ -596,7 +596,7 @@ void insert_seqno (struct session *S, int seqno) {
extern struct dc *DC_list[]; extern struct dc *DC_list[];
struct dc *alloc_dc (int id, char *ip, int port) { struct dc *alloc_dc (int id, char *ip, int port UU) {
assert (!DC_list[id]); assert (!DC_list[id]);
struct dc *DC = malloc (sizeof (*DC)); struct dc *DC = malloc (sizeof (*DC));
memset (DC, 0, sizeof (*DC)); memset (DC, 0, sizeof (*DC));
......
...@@ -2270,7 +2270,7 @@ void do_send_accept_encr_chat (struct secret_chat *E, unsigned char *random) { ...@@ -2270,7 +2270,7 @@ void do_send_accept_encr_chat (struct secret_chat *E, unsigned char *random) {
assert (b); assert (b);
BIGNUM *g_a = BN_bin2bn (E->g_key, 256, 0); BIGNUM *g_a = BN_bin2bn (E->g_key, 256, 0);
assert (g_a); assert (g_a);
assert (check_g (g_a) >= 0); assert (check_g (encr_prime, g_a) >= 0);
if (!ctx) { if (!ctx) {
ctx = BN_CTX_new (); ctx = BN_CTX_new ();
BN_CTX_init (ctx); BN_CTX_init (ctx);
...@@ -2316,7 +2316,7 @@ void do_create_keys_end (struct secret_chat *U) { ...@@ -2316,7 +2316,7 @@ void do_create_keys_end (struct secret_chat *U) {
assert (encr_prime); assert (encr_prime);
BIGNUM *g_b = BN_bin2bn (U->g_key, 256, 0); BIGNUM *g_b = BN_bin2bn (U->g_key, 256, 0);
assert (g_b); assert (g_b);
assert (check_g (g_b) >= 0); assert (check_g (encr_prime, g_b) >= 0);
if (!ctx) { if (!ctx) {
ctx = BN_CTX_new (); ctx = BN_CTX_new ();
BN_CTX_init (ctx); BN_CTX_init (ctx);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment