Skip to content

Commit 7640a92

Browse files
Merge branch '0.0.5' of github.com:LarryLaffer-dev/opensips into 0.0.5
2 parents c35c23c + 4d0b4cc commit 7640a92

File tree

1 file changed

+37
-11
lines changed

1 file changed

+37
-11
lines changed

modules/auth_aka/aka_av_mgm.c

Lines changed: 37 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -87,28 +87,47 @@ static int aka_cdb_serialize_av(struct aka_av *av, str *value)
8787
{
8888
char state_buf[16], algmask_buf[16], alg_buf[16];
8989
int state_len, algmask_len, alg_len;
90+
char *authorize_hex;
91+
int authorize_hex_len;
92+
char *p;
93+
int i;
9094

9195
state_len = snprintf(state_buf, sizeof(state_buf), "%d", av->state);
9296
algmask_len = snprintf(algmask_buf, sizeof(algmask_buf), "%d", av->algmask);
9397
alg_len = snprintf(alg_buf, sizeof(alg_buf), "%d", av->alg);
9498

99+
/* authorize (XRES) is binary - hex encode it */
100+
authorize_hex_len = av->authorize.len * 2;
101+
authorize_hex = pkg_malloc(authorize_hex_len + 1);
102+
if (!authorize_hex) {
103+
LM_ERR("oom for authorize hex encoding\n");
104+
return -1;
105+
}
106+
for (i = 0; i < av->authorize.len; i++)
107+
sprintf(authorize_hex + i * 2, "%02x", (unsigned char)av->authorize.s[i]);
108+
authorize_hex[authorize_hex_len] = '\0';
109+
95110
value->len = state_len + 1 + algmask_len + 1 + alg_len + 1 +
96-
av->authenticate.len + 1 + av->authorize.len + 1 +
111+
av->authenticate.len + 1 + authorize_hex_len + 1 +
97112
av->ck.len + 1 + av->ik.len;
98113
value->s = pkg_malloc(value->len + 1);
99114
if (!value->s) {
100115
LM_ERR("oom for cachedb value\n");
116+
pkg_free(authorize_hex);
101117
return -1;
102118
}
103119

104-
snprintf(value->s, value->len + 1, "%s%c%s%c%s%c%.*s%c%.*s%c%.*s%c%.*s",
120+
p = value->s;
121+
p += sprintf(p, "%s%c%s%c%s%c%.*s%c%s%c%.*s%c%.*s",
105122
state_buf, AKA_CDB_DELIM,
106123
algmask_buf, AKA_CDB_DELIM,
107124
alg_buf, AKA_CDB_DELIM,
108125
av->authenticate.len, av->authenticate.s, AKA_CDB_DELIM,
109-
av->authorize.len, av->authorize.s, AKA_CDB_DELIM,
126+
authorize_hex, AKA_CDB_DELIM,
110127
av->ck.len, av->ck.s, AKA_CDB_DELIM,
111128
av->ik.len, av->ik.s);
129+
130+
pkg_free(authorize_hex);
112131
return 0;
113132
}
114133

@@ -142,7 +161,8 @@ static struct aka_av *aka_cdb_deserialize_av(str *value)
142161
str field;
143162
char *pos, *end;
144163
int state, algmask, alg;
145-
str authenticate, authorize, ck, ik;
164+
str authenticate, authorize_hex, ck, ik;
165+
int authorize_len;
146166
char *p;
147167

148168
pos = value->s;
@@ -172,17 +192,18 @@ static struct aka_av *aka_cdb_deserialize_av(str *value)
172192
/* Parse authenticate */
173193
aka_cdb_parse_field(pos, end, &authenticate, &pos);
174194

175-
/* Parse authorize */
176-
aka_cdb_parse_field(pos, end, &authorize, &pos);
195+
/* Parse authorize (hex encoded) */
196+
aka_cdb_parse_field(pos, end, &authorize_hex, &pos);
197+
authorize_len = authorize_hex.len / 2;
177198

178199
/* Parse ck */
179200
aka_cdb_parse_field(pos, end, &ck, &pos);
180201

181202
/* Parse ik */
182203
aka_cdb_parse_field(pos, end, &ik, &pos);
183204

184-
/* Allocate AV structure */
185-
av = shm_malloc(sizeof(*av) + authenticate.len + authorize.len + ck.len + ik.len);
205+
/* Allocate AV structure - authorize is stored as binary (half of hex len) */
206+
av = shm_malloc(sizeof(*av) + authenticate.len + authorize_len + ck.len + ik.len);
186207
if (!av) {
187208
LM_ERR("oom for cached AV\n");
188209
return NULL;
@@ -198,10 +219,15 @@ static struct aka_av *aka_cdb_deserialize_av(str *value)
198219
memcpy(p, authenticate.s, authenticate.len);
199220
p += authenticate.len;
200221

222+
/* Hex decode authorize (XRES) */
201223
av->authorize.s = p;
202-
av->authorize.len = authorize.len;
203-
memcpy(p, authorize.s, authorize.len);
204-
p += authorize.len;
224+
av->authorize.len = authorize_len;
225+
if (hex2string(authorize_hex.s, authorize_hex.len, p) < 0) {
226+
LM_ERR("failed to decode authorize hex\n");
227+
shm_free(av);
228+
return NULL;
229+
}
230+
p += authorize_len;
205231

206232
av->ck.s = p;
207233
av->ck.len = ck.len;

0 commit comments

Comments
 (0)