- Timestamp:
- 07/31/11 13:31:00 (13 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
tags/1.10/module-camd35.c
r5567 r5753 72 72 static int32_t camd35_recv(struct s_client *client, uchar *buf, int32_t l) 73 73 { 74 int32_t rc, s, rs, n=0, buflen=0; 75 unsigned char recrc[4]; 76 for (rc=rs=s=0; !rc; s++) switch(s) 77 { 78 case 0: 79 if (client->typ == 'c') 80 { 81 if (!client->udp_fd) return(-9); 82 if (client->is_udp) 83 rs=recv_from_udpipe(buf); 84 else 85 rs=recv(client->udp_fd, buf, l, 0); 86 } 87 else 88 { 89 if (!client->udp_fd) return(-9); 90 if (!client->is_udp) { 91 size_t len = recv(client->udp_fd, buf, l, MSG_PEEK); 92 switch (len) { 93 case -1: break; 94 case 332: 95 case 184: 96 l=36; break; 97 case 348: 98 case 200: 99 l=52; break; 100 case 296: 101 l=148; break; 102 default: 103 l=len; 104 break; 105 } 106 } 107 rs = recv(client->udp_fd, buf, l, 0); 108 } 109 if (rs < 24) rc = -1; 110 break; 111 case 1: 112 memcpy(recrc, buf, 4); 113 memmove(buf, buf+4, rs-=4); 114 switch (camd35_auth_client(recrc)) 115 { 116 case 0: break; // ok 117 case 1: rc=-2; break; // unknown user 118 default: rc=-9; break; // error's from cs_auth() 119 } 120 break; 121 case 2: 122 aes_decrypt(buf, rs); 123 cs_ddump_mask(D_CLIENT, buf, rs, "received %d bytes from %s", rs, remote_txt()); 124 if (rs!=boundary(4, rs)) 125 { 126 cs_debug_mask(D_CLIENT, "WARNING: packet size has wrong decryption boundary"); 127 } 128 //n=(buf[0]==3) ? n=0x34 : 0; this was original, but statement below seems more logical -- dingo35 129 n=(buf[0]==3) ? 0x34 : 0; 130 131 //Fix for ECM request size > 255 132 if(buf[0]==0) 133 { 134 buflen = (((buf[21]&0x0f)<< 8) | buf[22])+3; 135 } 136 else 137 { 138 buflen = buf[1]; 139 } 140 n=boundary(4, n+20+buflen); 141 if (n<rs) 142 { 143 cs_debug_mask(D_CLIENT, "ignoring %d bytes of garbage", rs-n); 144 } 145 else 146 if (n>rs) rc=-3; 147 break; 148 case 3: 149 if (crc32(0L, buf+20, buflen)!=b2i(4, buf+4)) rc=-4; 150 if (!rc) rc=n; 151 break; 152 } 153 if ((rs>0) && ((rc==-1)||(rc==-2))) 154 { 155 cs_ddump_mask(D_CLIENT, buf, rs, "received %d bytes from %s (native)", rs, remote_txt); 156 } 157 client->last=time((time_t *) 0); 158 switch(rc) 159 { 160 case -1: cs_log("packet to small (%d bytes)", rs); 161 break; 162 case -2: cs_auth_client(client, 0, "unknown user"); 163 break; 164 case -3: cs_log("incomplete request !"); 165 break; 166 case -4: cs_log("checksum error (wrong password ?)"); 167 break; 168 } 169 return(rc); 74 int32_t rc, s, rs, n=0, buflen=0, len=0; 75 for (rc=rs=s=0; !rc; s++) { 76 switch(s) { 77 case 0: 78 if (!client->udp_fd) return(-9); 79 if (client->is_udp && client->typ == 'c') { 80 rs=recv_from_udpipe(buf); 81 } else { 82 //read minimum packet size (4 byte ucrc + 32 byte data) to detect packet size (tcp only) 83 rs = recv(client->udp_fd, buf, client->is_udp ? l : 36, 0); 84 } 85 if (rs < 24) rc = -1; 86 break; 87 case 1: 88 switch (camd35_auth_client(buf)) { 89 case 0: break; // ok 90 case 1: rc=-2; break; // unknown user 91 default: rc=-9; break; // error's from cs_auth() 92 } 93 memmove(buf, buf+4, rs-=4); 94 break; 95 case 2: 96 aes_decrypt(buf, rs); 97 if (rs!=boundary(4, rs)) 98 cs_debug_mask(D_CLIENT, "WARNING: packet size has wrong decryption boundary"); 99 100 n=(buf[0]==3) ? 0x34 : 0; 101 102 //Fix for ECM request size > 255 (use ecm length field) 103 if(buf[0]==0) 104 buflen = (((buf[21]&0x0f)<< 8) | buf[22])+3; 105 else 106 buflen = buf[1]; 107 108 n = boundary(4, n+20+buflen); 109 if (!(client->is_udp && client->typ == 'c') && (rs < n) && ((n-32) > 0)) { 110 len = recv(client->udp_fd, buf+32, n-32, 0); // read the rest of the packet 111 if (len>0) { 112 rs+=len; 113 aes_decrypt(buf+32, len); 114 } 115 } 116 117 cs_ddump_mask(D_CLIENT, buf, rs, "received %d bytes from %s", rs, remote_txt()); 118 119 if (n<rs) 120 cs_debug_mask(D_CLIENT, "ignoring %d bytes of garbage", rs-n); 121 else 122 if (n>rs) rc=-3; 123 break; 124 case 3: 125 if (crc32(0L, buf+20, buflen)!=b2i(4, buf+4)) rc=-4; 126 if (!rc) rc=n; 127 break; 128 } 129 } 130 131 if ((rs>0) && ((rc==-1)||(rc==-2))) { 132 cs_ddump_mask(D_CLIENT, buf, rs, "received %d bytes from %s (native)", rs, remote_txt); 133 } 134 client->last=time((time_t *) 0); 135 136 switch(rc) { 137 case -1: cs_log("packet to small (%d bytes)", rs); break; 138 case -2: cs_auth_client(client, 0, "unknown user"); break; 139 case -3: cs_log("incomplete request !"); break; 140 case -4: cs_log("checksum error (wrong password ?)"); break; 141 } 142 143 return(rc); 170 144 } 171 145
Note:
See TracChangeset
for help on using the changeset viewer.