Hello,

after receiving

INVITE sip:test-gnome-ca...@bapha.be SIP/2.0
Via: SIP/2.0/WSS bapha.be;branch=z9hG4bK974100
Max-Forwards: 70
To: <sip:test-gnome-ca...@bapha.be>
From: "Online https://sip.bapha.be"; <sip:onl...@bapha.be>;tag=12q2efc423
Call-ID: fkhe8faq0fh80glmq59i
CSeq: 5622 INVITE
Contact: <sip:4q5ne...@bapha.be;transport=ws;ob>
Allow: ACK,CANCEL,INVITE,MESSAGE,BYE,OPTIONS,INFO,NOTIFY,REFER
Supported: outbound
User-Agent: SIP.js/0.7.8
Content-Type: application/sdp
Content-Length: 1964

v=0
o=mozilla...THIS_IS_SDPARTA-99.0 8263261229339246488 0 IN IP4 0.0.0.0
s=-
…

kamailio calls 

th_mask_encode(
char *in = "sip:test-gnome-ca...@bapha.be;gr=urn:uuid:f2f5a3cf-a0fb-0047-be50-
740fb9bdc562;alias=87.118.146.153~60722~2>;+sip.instance=\"<urn:uuid:f2f5a3cf-a0fb-0047-be50-
740fb9bdc562>";+org.linphone.specs=\"conference/1.0,ephemeral/1.1,groupchat/1.1,groupchat/1.2,lime\n"\
"Content-Type: application/sdp and so on",
int ilen = 107,
str prefix = { .len = 23, .s ="sip:127.3.4.84;line=sr-" },
int *olen).

It returns olen=167, and the string "sip:127.3.4.84;line=sr-
if7s1mg7i36PNf0AbdwPpfzlbqWEpLzsSGItpLwyN39ZMY4t1mCTSd6DNo4LWdIOpfpPp5FLpUQscX63Kd47W5EPWO6sNL90pLgoW5p-1fzlSdzO25n3KoIk1vHkWXptc5wOeopsWO9-eo9*".

Then Kamailio forwards (sends):

Contact: 
<sip:127.3.4.84;line=sr-if7s1mg7i36PNf0AbdwPpfzlbqWEpLzsSGItpLwyN39ZMY4t1mCTSd6DNo4LWdIOpfpPp5FLpUQscX63Kd47W5EPWO6sNL90pLgoW5p-
1fzlSdzO25n3KoIk1vHkWXptc5wOeopsWO9-eo9*>;+sip.instance="<urn:uuid:f2f5a3cf-a0fb-0047-be50-
740fb9bdc562>";+org.linphone.specs="conference/1.0,ephemeral/1.1,groupchat/1.1,groupchat/1.2,lime"


which at some point leads to

ACK 
sip:127.3.4.84;line=sr-if7s1mg7i36pnf0abdwppfzlbqweplzssgitplwyn39zmy4t1mctsd6dno4lwdiopfppp5flpuqscx63kd47w5epwo6snl90plgow5p-
1fzlsdzo25n3koik1vhkwxptc5woeopswo9-eo9* SIP/2.0

and 

BYE 
sip:127.3.4.84;line=sr-if7s1mg7i36pnf0abdwppfzlbqweplzssgitplwyn39zmy4t1mctsd6dno4lwdiopfppp5flpuqscx63kd47w5epwo6snl90plgow5p-
1fzlsdzo25n3koik1vhkwxptc5woeopswo9-eo9* SIP/2.0

Below you can find th_test.c .  The functions th_mask_encode() and 
th_mask_decode() there are identical to the same functions in
src/modules/topoh/th_mask.c . main() provides some tests:

Passing «sip:test-gnome-ca...@bapha.be;gr=urn:uuid:f2f5a3cf-a0fb-0047-be50-
740fb9bdc562;alias=87.118.146.153~60472~2>;+sip.instance="<urn:uuid:f2f5a3cf-a0fb-0047-be50-
740fb9bdc562>";+org.linphone.specs="conference/1.0,ephemeral/1.1,groupchat/1.1,groupchat/1.2,lime»
 to th_mask_encode() returns

sip:127.3.4.84;line=sr-if7s1mg7i36PNf0AbdwPpfzlbqWEpLzsSGItpLwyN39ZMY4t1mCTSd6DNo4LWdIOpfpPp5FLpUQscX63Kd47W5EPWO6sNL90pLgoW5p-
1fzlSdzO25n3KoIk1vHkWXptc5wOeopsWXi-eo9*

(this is what Kamailio does send out).  Passing the last string to 
th_mask_decode() returns

sip:test-gnome-ca...@bapha.be;gr=urn:uuid:f2f5a3cf-a0fb-0047-be50-740fb9bdc562;alias=87.118.1

the ;alias= is incomplete, compared to the origin.


The above ACK leads to passing

"sr-if7s1mg7i36pnf0abdwppfzlbqweplzssgitplwyn39zmy4t1mctsd6dno4lwdiopfppp5flpuqscx63kd47w5epwo6snl90plgow5p-1fzlsdzo25n3koik1vhkwxptc5woeopswo9-eo9*
SIP/2.0\n"\
"Route: 
<sip:Q+L06HX94DMPtQWQTI5OE8SQTI5O4MY=@144.76.142.78;transport=ws;r2=on;lr;nat=yes>\n"\
"Route: 
<sip:127.3.4.84;line=sr-if7s17IB5XEfVzn0WIgWwqggCTzwV5C2g5R5wCg4WwrQ5CuZ6XIQWvH3WUHkWX9tWOnyMq4RbmWsb34Q2YgoiXP-coTAboPlioPtpY6Z8dCO>\n"\

to th_mask_decode() and the result is 
callub.p.b;rn:s.d2lQg#cfa=bA07beQ7R409bcQ62;alac=87718*1P.15#~60R22~2 with the 
dots being unprintable
characters. (result is garbage).

I have seen that callub.p.b in the unparsable R-URI reports from Kamailio.

That is an indication that th_mask_decode() does not decode the Contact encoded 
by th_mask_encode() correctly.

Valgrind does not report improper memory usage.

Greetings
  Dilyan

gcc -g -o th-test ./th-test.c && ./th-test

th-test.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define TH_EB64I \
                
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.-"
char _th_EB64[65] = 
"EFvXIzGq94xKcW126gV5wCdYpNSbiM8enRUou7LmhajBlPtAsk-OQTf3H0DyrZ.J";
int _th_DB64[256];
char *_th_PD64 = "*";

struct str_ {
        char* s; /**< Pointer to the first character of the string */
        int len; /**< Length of the string */
};
typedef struct str_ str;

str prefix = { .len = 23, .s ="sip:127.3.4.84;line=sr-" };

char* th_mask_encode(char *in, int ilen, const str *prefix, int *olen);
char* th_mask_decode(char *in, int ilen, const str *prefix, int extra, int 
*olen);
char* th_mask_encode(char *in, int ilen, const str *prefix, int *olen)
{
        char *out;
        int  left;
        int  idx;
        int  i;
        int  r;
        char *p;
        int  block;
        *olen = (((ilen+2)/3)<<2) + 
((prefix!=NULL&&prefix->len>0)?prefix->len:0);
        out = (char*)malloc((*olen+1)*sizeof(char));
        if(out==NULL)
        {
                fprintf(stderr, "malloc error\n");
                *olen = 0;
                return NULL;
        }
        memset(out, 0, (*olen+1)*sizeof(char));
        if(prefix!=NULL&&prefix->len>0)
                memcpy(out, prefix->s, prefix->len);

        p = out + (int)((prefix!=NULL&&prefix->len>0)?prefix->len:0);
        for(idx=0; idx<ilen; idx+=3)
        {
                left = ilen - idx - 1 ;
                left = (left>1)?2:left;

                block = 0;
                for(i=0, r=16; i<=left; i++, r-=8)
                        block += ((unsigned char)in[idx+i]) << r;

                *(p++) = _th_EB64[(block >> 18) & 0x3f];
                *(p++) = _th_EB64[(block >> 12) & 0x3f];
                *(p++) = (left>0)?_th_EB64[(block >> 6) & 0x3f]:_th_PD64[0];
                *(p++) = (left>1)?_th_EB64[block & 0x3f]:_th_PD64[0];
        }

        return out;
}

char* th_mask_decode(char *in, int ilen, const str *prefix, int extra, int 
*olen)
{
        char *out;
        int n;
        int block;
        int idx;
        int i;
        int j;
        int end;
        char c;

        for(n=0,i=ilen-1; in[i]==_th_PD64[0]; i--)
                n++;

        *olen = (((ilen-((prefix!=NULL&&prefix->len>0)?prefix->len:0)) * 6) >> 
3)
                                - n;

        if (*olen<=0) {
                return NULL;
        }

        out = (char*)malloc((*olen+1+extra)*sizeof(char));
        if(out==NULL)
        {
                fprintf(stderr, "malloc error\n");
                *olen = 0;
                return NULL;
        }
        memset(out, 0, (*olen+1+extra)*sizeof(char));

        end = ilen - n;
        i = (prefix!=NULL&&prefix->len>0)?prefix->len:0;
        for(idx=0; i<end; idx+=3)
        {
                block = 0;
                for(j=0; j<4 && i<end ; j++)
                {
                        c = _th_DB64[(int)in[i++]];
                        if(c<0)
                        {
                                free(out);
                                *olen = 0;
                                return NULL;
                        }
                        block += c << (18 - 6*j);
                }

                for(j=0, n=16; j<3 && idx+j< *olen; j++, n-=8)
                        out[idx+j] = (char)((block >> n) & 0xff);
        }

        return out;
}

int main() {
  //this is from th_mask_init
  for(int i=0; i<256; i++)
        _th_DB64[i] = -1;
  for(int i=0; i<64; i++)
        _th_DB64[(int)_th_EB64[i]] = i;
  int olen, o2;
  char *end;
  char *input = 
"sip:test-gnome-ca...@bapha.be;gr=urn:uuid:f2f5a3cf-a0fb-0047-be50-
740fb9bdc562;alias=87.118.146.153~60472~2>;+sip.instance=\"<urn:uuid:f2f5a3cf-a0fb-0047-be50-
740fb9bdc562>\";+org.linphone.specs=\"conference/1.0,ephemeral/1.1,groupchat/1.1,groupchat/1.2,lime\"";
  printf("input=[%s]\n", input);
  char* middle = th_mask_encode (input, 107, &prefix, &olen);
  printf("olen = %i, middle=[%s]\n", olen, middle);
  end = th_mask_decode(middle, 147, &prefix, 0, &o2);
  printf("o2 = %i, end=[%s]\n", o2, end);
  char * b1 = 
"sr-if7s1mg7i36pnf0abdwppfzlbqweplzssgitplwyn39zmy4t1mctsd6dno4lwdiopfppp5flpuqscx63kd47w5epwo6snl90plgow5p-
1fzlsdzo25n3koik1vhkwxptc5woeopswo9-eo9*";
  o2 = 0;
  end = th_mask_decode(b1, 147, &prefix, 0, &o2);
  printf("o2 = %i, end=[%s]\n", o2, end);

  char* b2 = 
"sr-if7s1mg7i36pnf0abdwppfzlbqweplzssgitplwyn39zmy4t1mctsd6dno4lwdiopfppp5flpuqscx63kd47w5epwo6snl90plgow5p-1fzlsdzo25n3koik1vhkwxptc5woeopswo9-eo9*
SIP/2.0\n"\
"Route: 
<sip:Q+L06HX94DMPtQWQTI5OE8SQTI5O4MY=@144.76.142.78;transport=ws;r2=on;lr;nat=yes>\n"\
"Route: 
<sip:127.3.4.84;line=sr-if7s17IB5XEfVzn0WIgWwqggCTzwV5C2g5R5wCg4WwrQ5CuZ6XIQWvH3WUHkWX9tWOnyMq4RbmWsb34Q2YgoiXP-coTAboPlioPtpY6Z8dCO>\n"\
"Via: SIP/2.0/WSS bapha.be;branch=z9hG4bK9069155\n"\
"Max-Forwards: 70\n"\
"To: <sip:test-gnome-ca...@bapha.be>;tag=Pn4npAj\n"\
"From: \"Online https://sip.bapha.be\"; <sip:onl...@bapha.be>;tag=12q2efc423\n"\
"Call-ID: fkhe8faq0fh80glmq59i\n"\
"CSeq: 5623 ACK\n"\
"Supported: outbound\n"\
"User-Agent: SIP.js/0.7.8\n"\
"Content-Length: 0\n"\
"\n";

  o2 = 0;
  end = th_mask_decode(b2, 147, &prefix, 0, &o2);
  printf("o2 = %i, end=[%s]\n", o2, end);

  return 0;
}


__________________________________________________________
Kamailio - Users Mailing List - Non Commercial Discussions
To unsubscribe send an email to sr-users-le...@lists.kamailio.org
Important: keep the mailing list in the recipients, do not reply only to the 
sender!
Edit mailing list options or unsubscribe:

Reply via email to