Changeset 5295
- Timestamp:
- 02/21/08 08:42:56 (6 months ago)
- Files:
-
- libwired/trunk/libwired/misc/wi-error.c (modified) (1 diff)
- libwired/trunk/libwired/misc/wi-error.h (modified) (1 diff)
- libwired/trunk/libwired/p7/wi-p7-socket.c (modified) (10 diffs)
- libwired/trunk/libwired/p7/wi-p7-socket.h (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
libwired/trunk/libwired/misc/wi-error.c
r5279 r5295 108 108 /* WI_ERROR_P7_NORSAKEY */ 109 109 "No private RSA key set", 110 /* WI_ERROR_P7_MESSSAGETOOLARGE */ 111 "Message too large", 110 112 111 113 /* WI_ERROR_REGEXP_NOSLASH */ libwired/trunk/libwired/misc/wi-error.h
r5279 r5295 67 67 WI_ERROR_P7_CHECKSUMMISMATCH, 68 68 WI_ERROR_P7_NORSAKEY, 69 WI_ERROR_P7_MESSSAGETOOLARGE, 69 70 70 71 WI_ERROR_REGEXP_NOSLASH, libwired/trunk/libwired/p7/wi-p7-socket.c
r5280 r5295 60 60 #define _WI_P7_SOCKET_BINARY_MAGIC_SIZE 66 61 61 #define _WI_P7_SOCKET_LENGTH_SIZE 4 62 #define _WI_P7_SOCKET_MAX_BINARY_SIZE 65536 62 63 63 64 #define _WI_P7_SOCKET_CHECKSUM_LENGTH SHA_DIGEST_LENGTH … … 185 186 static void _wi_p7_socket_configure_checksum(wi_p7_socket_t *); 186 187 static void _wi_p7_socket_checksum_binary_message(wi_p7_socket_t *, wi_p7_message_t *, void *); 188 static void _wi_p7_socket_checksum_buffer(wi_p7_socket_t *, const void *, uint32_t, void *); 187 189 188 190 … … 1082 1084 int32_t length; 1083 1085 1086 if(length > _WI_P7_SOCKET_MAX_BINARY_SIZE) { 1087 wi_error_set_libwired_error(WI_ERROR_P7_MESSSAGETOOLARGE); 1088 1089 return NULL; 1090 } 1091 1084 1092 p7_message = wi_autorelease(wi_p7_message_init_with_serialization(wi_p7_message_alloc(), 1085 1093 WI_P7_BINARY, wi_p7_socket_spec(p7_socket))); … … 1317 1325 1318 1326 1319 static void _wi_p7_socket_checksum_binary_message(wi_p7_socket_t *p7_socket, wi_p7_message_t *p7_message, void *buffer) { 1327 static void _wi_p7_socket_checksum_binary_message(wi_p7_socket_t *p7_socket, wi_p7_message_t *p7_message, void *out_buffer) { 1328 _wi_p7_socket_checksum_buffer(p7_socket, p7_message->binary_buffer, p7_message->binary_size, out_buffer); 1329 } 1330 1331 1332 1333 static void _wi_p7_socket_checksum_buffer(wi_p7_socket_t *p7_socket, const void *buffer, uint32_t size, void *out_buffer) { 1320 1334 SHA_CTX c; 1321 1335 1322 1336 if(p7_socket->options & WI_P7_CHECKSUM_SHA1) { 1323 1337 SHA1_Init(&c); 1324 SHA1_Update(&c, p7_message->binary_buffer, p7_message->binary_size);1325 SHA1_Final( buffer, &c);1338 SHA1_Update(&c, buffer, size); 1339 SHA1_Final(out_buffer, &c); 1326 1340 } 1327 1341 } … … 1492 1506 1493 1507 1494 wi_ integer_t wi_p7_socket_write_oobdata(wi_p7_socket_t *p7_socket, wi_time_interval_t timeout, const void *buffer, uint32_t size) {1508 wi_boolean_t wi_p7_socket_write_oobdata(wi_p7_socket_t *p7_socket, wi_time_interval_t timeout, const void *buffer, uint32_t size) { 1495 1509 const void *send_buffer; 1496 1510 void *compressed_buffer = NULL, *encrypted_buffer = NULL; 1497 1511 char length_buffer[_WI_P7_SOCKET_LENGTH_SIZE]; 1498 wi_integer_t result = -1;1512 unsigned char checksum_buffer[_WI_P7_SOCKET_CHECKSUM_LENGTH]; 1499 1513 uint32_t send_size, compressed_size, encrypted_size; 1500 1501 send_size = size; 1514 wi_boolean_t result = false; 1515 1516 send_size = size; 1502 1517 send_buffer = buffer; 1503 1518 1519 if(p7_socket->checksum_enabled) 1520 _wi_p7_socket_checksum_buffer(p7_socket, send_buffer, send_size, checksum_buffer); 1521 1504 1522 if(p7_socket->compression_enabled) { 1505 1523 if(!_wi_p7_socket_xcompress_buffer(p7_socket, … … 1534 1552 goto end; 1535 1553 1536 result = wi_socket_write_buffer(p7_socket->socket, timeout, send_buffer, send_size); 1554 if(wi_socket_write_buffer(p7_socket->socket, timeout, send_buffer, send_size) < 0) 1555 goto end; 1556 1557 if(p7_socket->checksum_enabled) { 1558 if(wi_socket_write_buffer(p7_socket->socket, timeout, checksum_buffer, p7_socket->checksum_length) < 0) 1559 goto end; 1560 } 1561 1562 result = true; 1537 1563 1538 1564 end: … … 1545 1571 1546 1572 1547 wi_integer_t wi_p7_socket_read_oobdata(wi_p7_socket_t *p7_socket, wi_time_interval_t timeout, void * out_buffer, uint32_t out_size) {1573 wi_integer_t wi_p7_socket_read_oobdata(wi_p7_socket_t *p7_socket, wi_time_interval_t timeout, void **out_buffer) { 1548 1574 void *receive_buffer = NULL, *decrypted_buffer, *decompressed_buffer; 1549 1575 char length_buffer[_WI_P7_SOCKET_LENGTH_SIZE]; 1550 wi_integer_t result = -1; 1551 uint32_t receive_size, decompressed_size, decrypted_size; 1552 1553 if(wi_socket_read_buffer(p7_socket->socket, timeout, length_buffer, sizeof(length_buffer)) <= 0) 1554 goto end; 1555 1556 receive_size = wi_read_swap_big_to_host_int32(length_buffer, 0); 1557 receive_buffer = wi_malloc(receive_size); 1558 1559 result = wi_socket_read_buffer(p7_socket->socket, timeout, receive_buffer, receive_size); 1576 unsigned char local_checksum_buffer[_WI_P7_SOCKET_CHECKSUM_LENGTH]; 1577 unsigned char remote_checksum_buffer[_WI_P7_SOCKET_CHECKSUM_LENGTH]; 1578 wi_integer_t result; 1579 uint32_t receive_size, received_size, decompressed_size, decrypted_size; 1580 1581 result = wi_socket_read_buffer(p7_socket->socket, timeout, length_buffer, sizeof(length_buffer)); 1560 1582 1561 1583 if(result <= 0) 1562 1584 goto end; 1585 1586 receive_size = wi_read_swap_big_to_host_int32(length_buffer, 0); 1587 1588 if(receive_size > _WI_P7_SOCKET_MAX_BINARY_SIZE) { 1589 wi_error_set_libwired_error(WI_ERROR_P7_MESSSAGETOOLARGE); 1590 1591 result = -1; 1592 1593 goto end; 1594 } 1595 1596 receive_buffer = wi_malloc(receive_size); 1597 received_size = 0; 1598 1599 while(received_size < receive_size) { 1600 result = wi_socket_read_buffer(p7_socket->socket, timeout, receive_buffer + received_size, receive_size - received_size); 1601 1602 if(result <= 0) 1603 goto end; 1604 1605 received_size += result; 1606 } 1563 1607 1564 1608 if(p7_socket->encryption_enabled) { … … 1568 1612 &decrypted_buffer, 1569 1613 &decrypted_size)) { 1614 result = -1; 1615 1570 1616 goto end; 1571 1617 } … … 1584 1630 &decompressed_buffer, 1585 1631 &decompressed_size)) { 1632 result = -1; 1633 1586 1634 goto end; 1587 1635 } … … 1593 1641 } 1594 1642 1595 memcpy(out_buffer, receive_buffer, receive_size); 1596 1643 if(p7_socket->checksum_enabled) { 1644 result = wi_socket_read_buffer(p7_socket->socket, timeout, remote_checksum_buffer, p7_socket->checksum_length); 1645 1646 if(result <= 0) 1647 goto end; 1648 1649 _wi_p7_socket_checksum_buffer(p7_socket, receive_buffer, receive_size, local_checksum_buffer); 1650 1651 if(memcmp(remote_checksum_buffer, local_checksum_buffer, p7_socket->checksum_length) != 0) { 1652 wi_error_set_libwired_p7_error(WI_ERROR_P7_CHECKSUMMISMATCH, WI_STR("")); 1653 1654 result = -1; 1655 1656 goto end; 1657 } 1658 } 1659 1597 1660 result = receive_size; 1598 1661 1599 1662 end: 1600 wi_free(receive_buffer); 1663 if(result > 0) 1664 *out_buffer = receive_buffer; 1665 else if(receive_buffer) 1666 wi_free(receive_buffer); 1601 1667 1602 1668 return result; libwired/trunk/libwired/p7/wi-p7-socket.h
r5253 r5295 93 93 WI_EXPORT wi_boolean_t wi_p7_socket_write_message(wi_p7_socket_t *, wi_time_interval_t, wi_p7_message_t *); 94 94 WI_EXPORT wi_p7_message_t * wi_p7_socket_read_message(wi_p7_socket_t *, wi_time_interval_t); 95 WI_EXPORT int32_twi_p7_socket_write_oobdata(wi_p7_socket_t *, wi_time_interval_t, const void *, uint32_t);96 WI_EXPORT int32_t wi_p7_socket_read_oobdata(wi_p7_socket_t *, wi_time_interval_t, void *, uint32_t);95 WI_EXPORT wi_boolean_t wi_p7_socket_write_oobdata(wi_p7_socket_t *, wi_time_interval_t, const void *, uint32_t); 96 WI_EXPORT wi_integer_t wi_p7_socket_read_oobdata(wi_p7_socket_t *, wi_time_interval_t, void **); 97 97 98 98
