@@ -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