This has not been tested, as I haven't been able to test until compiling. This is only a compile patch for 2.6.26.5. ---
This is patch 2 of 2. It changes 3 things: - the URB callback mechanism changed - the work queue API changed... it no longer takes a pointer to data, so I had to put a pointer to the urb in the modem and blackberry_data structures. This is almost surely the wrong way to do it, since there is only a queue of 1. - all sha1 crypto calls go through the new, untested API. :-) Testing is next of course, after I study the module sources more closely, but I wanted to get this to you so as not to hold you up. - Chris kernel/blackberry.h | 14 +++-- kernel/init.c | 174 ++++++++++++++++++--------------------------------- kernel/modem.c | 102 +++++++++++++++++------------- 3 files changed, 126 insertions(+), 164 deletions(-) diff --git a/kernel/blackberry.h b/kernel/blackberry.h index 49b0107..8808d99 100644 --- a/kernel/blackberry.h +++ b/kernel/blackberry.h @@ -14,6 +14,13 @@ along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +/* + Copyright 2008, Chris Frey, NetDirect (http://www.netdirect.ca/), GPL v2 + 2008/11 - Now compiles on 2.6.26.5: Changes to URB callback mechanism and + work queue API. Also uses new sha1 API. +*/ + #ifndef _BLACKBERRY_H #define _BLACKBERRY_H @@ -62,6 +69,7 @@ struct modem { int max_rx; wait_queue_head_t open_wait; int login_complete; + struct urb *latest_urb; }; struct blackberry_device { @@ -75,6 +83,7 @@ struct blackberry_device { struct modem modem; int read_ep; int write_ep; + struct urb *latest_urb; }; #define to_blackberry_device(d) container_of(d, struct blackberry_device, kref) @@ -82,11 +91,6 @@ extern int debug; extern int num_devices; extern struct device_map *device_map; extern struct workqueue_struct *work_queue; -#if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 18) -extern struct hash_desc crypto_hash; -#else -extern struct crypto_tfm *crypto_tfm; -#endif void blackberry_put(struct blackberry_device *blackberry_device); struct blackberry_device *blackberry_get(struct blackberry_device *blackberry_device); #endif diff --git a/kernel/init.c b/kernel/init.c index e5627ea..a151866 100644 --- a/kernel/init.c +++ b/kernel/init.c @@ -14,6 +14,13 @@ along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +/* + Copyright 2008, Chris Frey, NetDirect (http://www.netdirect.ca/), GPL v2 + 2008/11 - Now compiles on 2.6.26.5: Changes to URB callback mechanism and + work queue API. Also uses new sha1 API. +*/ + #include "config.h" #include <linux/version.h> @@ -25,14 +32,13 @@ #include <linux/tty.h> #include <linux/tty_flip.h> #include <linux/mm.h> -#include <asm/scatterlist.h> -#include <linux/scatterlist.h> #include <asm/uaccess.h> #include "blackberry.h" #include "charge.h" #include "util.h" #include "modem.h" +#include "crypto.h" #ifndef SUCCESS #define SUCCESS (0) @@ -102,11 +108,6 @@ static struct tty_operations desktop_ops = { }; struct workqueue_struct *work_queue = NULL; -#if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 18) -struct hash_desc crypto_hash; -#else -struct crypto_tfm *crypto_tfm = NULL; -#endif static unsigned char serial_header[] = {0xd9, 0xae, 0xfb}; static unsigned char serial_footer[] = {0xbf, 0xea, 0x9d}; @@ -117,63 +118,28 @@ send_password(struct blackberry_device *blackberry_device, int mem_flags) int ret = 0; u8 *response = NULL; -#if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 18) - if (crypto_hash.tfm) + if (blackberry_sha1_avail()) { - response = kmalloc(8 + crypto_hash_digestsize(crypto_hash.tfm), mem_flags); + response = kmalloc(8 + blackberry_sha1_digestsize(), mem_flags); } if (response) { - struct scatterlist sg; - - sg_init_one(&sg, - &device_map[blackberry_device->desktop.tty->index].password_hash[0], - 4 + crypto_hash_digestsize(crypto_hash.tfm)); - crypto_hash_init(&crypto_hash); - crypto_hash_update(&crypto_hash, - &sg, 1); - crypto_hash_final(&crypto_hash, &response[8]); + blackberry_sha1_sum(&device_map[blackberry_device->desktop.tty->index].password_hash[0], + 4 + blackberry_sha1_digestsize(), + &response[8] + ); response[0] = 0x0f; response[1] = (blackberry_device->desktop.socket >> 0) & 0xff; response[2] = (blackberry_device->desktop.socket >> 8) & 0xff; response[3] = blackberry_device->desktop.attempts_remaining + 1; response[4] = 0x00; response[5] = 0x00; - response[6] = crypto_hash_digestsize(crypto_hash.tfm); + response[6] = blackberry_sha1_digestsize(); response[7] = 0x00; - blackberry_write(blackberry_device, 0, response, 8 + crypto_hash_digestsize(crypto_hash.tfm), GFP_ATOMIC); + blackberry_write(blackberry_device, 0, response, 8 + blackberry_sha1_digestsize(), GFP_ATOMIC); kfree(response); } else -#else - if (crypto_tfm) - { - response = kmalloc(8 + crypto_tfm_alg_digestsize(crypto_tfm), mem_flags); - } - if (response) - { - struct scatterlist sg; - - sg_init_one(&sg, - &device_map[blackberry_device->desktop.tty->index].password_hash[0], - 4 + crypto_tfm_alg_digestsize(crypto_tfm)); - crypto_digest_init(crypto_tfm); - crypto_digest_update(crypto_tfm, - &sg, 1); - crypto_digest_final(crypto_tfm, &response[8]); - response[0] = 0x0f; - response[1] = (blackberry_device->desktop.socket >> 0) & 0xff; - response[2] = (blackberry_device->desktop.socket >> 8) & 0xff; - response[3] = blackberry_device->desktop.attempts_remaining + 1; - response[4] = 0x00; - response[5] = 0x00; - response[6] = crypto_tfm_alg_digestsize(crypto_tfm); - response[7] = 0x00; - blackberry_write(blackberry_device, 0, response, 8 + crypto_tfm_alg_digestsize(crypto_tfm), GFP_ATOMIC); - kfree(response); - } - else -#endif { ret = -ENOMEM; } @@ -245,41 +211,15 @@ process_buffer(struct blackberry_device *blackberry_device) blackberry_device->desktop.tty->index); dump_hex("<-- desktop", blackberry_device->desktop.buffer, blackberry_device->desktop.num_buffer); */ -#if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 18) if (device_map[blackberry_device->desktop.tty->index].password_hash) { - struct scatterlist sg; - - sg_init_one(&sg, - &blackberry_device->desktop.buffer[sizeof(serial_header) + 5], - strlen(&blackberry_device->desktop.buffer[sizeof(serial_header) + 5])); - crypto_hash_init(&crypto_hash); - crypto_hash_update(&crypto_hash, - &sg, 1); - crypto_hash_final(&crypto_hash, &device_map[blackberry_device->desktop.tty->index].password_hash[4]); +// blackberry_sha1_sum(&blackberry_device->desktop.buffer[sizeof(serial_header) + 5], +// strlen(&blackberry_device->desktop.buffer[sizeof(serial_header) + 5])); /* Don't leave the unhashed password laying around */ memset(&blackberry_device->desktop.buffer[sizeof(serial_header) + 5], 0, strlen(&blackberry_device->desktop.buffer[sizeof(serial_header) + 5])); send_password(blackberry_device, GFP_ATOMIC); } else -#else - if (device_map[blackberry_device->desktop.tty->index].password_hash) - { - struct scatterlist sg; - - sg_init_one(&sg, - &blackberry_device->desktop.buffer[sizeof(serial_header) + 5], - strlen(&blackberry_device->desktop.buffer[sizeof(serial_header) + 5])); - crypto_digest_init(crypto_tfm); - crypto_digest_update(crypto_tfm, - &sg, 1); - crypto_digest_final(crypto_tfm, &device_map[blackberry_device->desktop.tty->index].password_hash[4]); - /* Don't leave the unhashed password laying around */ - memset(&blackberry_device->desktop.buffer[sizeof(serial_header) + 5], 0, strlen(&blackberry_device->desktop.buffer[sizeof(serial_header) + 5])); - send_password(blackberry_device, GFP_ATOMIC); - } - else -#endif { err("%s(%d) - %08x", __FUNCTION__, __LINE__, blackberry_device ? blackberry_device->pin : (u_int32_t)-1); @@ -793,7 +733,11 @@ struct blackberry_device *blackberry_device = tty ? tty->driver_data : NULL; } static void +#if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 18) +blackberry_write_callback(struct urb *urb) +#else blackberry_write_callback(struct urb *urb, struct pt_regs *regs) +#endif { struct blackberry_device *blackberry_device = urb->context; @@ -1282,21 +1226,12 @@ int ret = 0; unsigned char cmd[] = {0x40, 0x00, 'P'}; int use_old; -#if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 18) if (device_map[blackberry_device->desktop.tty->index].password_hash == NULL) { - device_map[blackberry_device->desktop.tty->index].password_hash = kmalloc(4 + crypto_hash_digestsize(&crypto_hash.tfm), GFP_KERNEL); + device_map[blackberry_device->desktop.tty->index].password_hash = kmalloc(4 + blackberry_sha1_digestsize(), GFP_KERNEL); use_old = 0; } else -#else - if (device_map[blackberry_device->desktop.tty->index].password_hash == NULL) - { - device_map[blackberry_device->desktop.tty->index].password_hash = kmalloc(4 + crypto_tfm_alg_digestsize(crypto_tfm), GFP_KERNEL); - use_old = 0; - } - else -#endif { use_old = 1; } @@ -1525,11 +1460,20 @@ int ret = 0; } static void +#if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 18) +blackberry_read_work(struct work_struct *work) +#else blackberry_read_work(void *data) +#endif { int ret = 0; +#if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 18) +struct blackberry_device *blackberry_device = container_of(work, struct blackberry_device, read_work); +struct urb *urb = blackberry_device->latest_urb; +#else struct urb *urb = data; struct blackberry_device *blackberry_device = urb->context; +#endif if (debug >= 9) { @@ -1582,11 +1526,18 @@ struct blackberry_device *blackberry_device = urb->context; urb->transfer_buffer_length, urb->transfer_buffer, urb->transfer_dma); usb_free_urb(urb); +#if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 18) + blackberry_device->latest_urb = NULL; +#endif blackberry_put(blackberry_device); } static void +#if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 18) +blackberry_read_callback(struct urb *urb) +#else blackberry_read_callback(struct urb *urb, struct pt_regs *pt_regs) +#endif { int ret = 0; struct blackberry_device *blackberry_device = urb->context; @@ -1599,9 +1550,19 @@ struct blackberry_device *blackberry_device = urb->context; if (urb->status == 0) { +#if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 18) + if( blackberry_device->latest_urb == NULL ) + { + usb_get_urb(urb); + blackberry_device->latest_urb = urb; + PREPARE_WORK(&blackberry_device->read_work, blackberry_read_work); + ret = queue_work(work_queue, &blackberry_device->read_work); + } +#else usb_get_urb(urb); PREPARE_WORK(&blackberry_device->read_work, blackberry_read_work, urb); ret = queue_work(work_queue, &blackberry_device->read_work); +#endif } else { @@ -1881,22 +1842,12 @@ int i; } if (ret == 0) { -#if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 18) - crypto_hash.tfm = crypto_alloc_hash("sha1", 0, 0); - crypto_hash.flags = 0; - if (crypto_hash.tfm) - { - info("%s(%d) - passwords are possible", __FUNCTION__, __LINE__); - } - else -#else - crypto_tfm = crypto_alloc_tfm("sha1", 0); - if (crypto_tfm) - { + blackberry_sha1_init(); + if( blackberry_sha1_avail() ) + { info("%s(%d) - passwords are possible", __FUNCTION__, __LINE__); - } - else -#endif + } + else { err("%s(%d) - passwords not supported", __FUNCTION__, __LINE__); } @@ -1912,17 +1863,8 @@ blackberry_exit(void) info("%s(%d) - num_devices = %i", __FUNCTION__, __LINE__, num_devices); } -#if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 18) - if (crypto_hash.tfm) - { - crypto_free_hash(crypto_hash.tfm); - } -#else - if (crypto_tfm) - { - crypto_free_tfm(crypto_tfm); - } -#endif + blackberry_sha1_dnit(); + blackberry_deregister(&blackberry_driver); if (work_queue) { @@ -1990,7 +1932,11 @@ struct usb_device *udev = interface_to_usbdev(intf); blackberry_device->max_packet = 32; blackberry_device->read_ep = intf->cur_altsetting->endpoint[2].desc.bEndpointAddress; blackberry_device->write_ep = intf->cur_altsetting->endpoint[3].desc.bEndpointAddress; +#if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 18) + INIT_WORK(&blackberry_device->read_work, blackberry_read_work); +#else INIT_WORK(&blackberry_device->read_work, blackberry_read_work, NULL); +#endif init_waitqueue_head(&blackberry_device->desktop.open_wait); init_MUTEX(&blackberry_device->desktop.sem); diff --git a/kernel/modem.c b/kernel/modem.c index 4441bd4..cb51079 100644 --- a/kernel/modem.c +++ b/kernel/modem.c @@ -14,18 +14,24 @@ along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +/* + Copyright 2008, Chris Frey, NetDirect (http://www.netdirect.ca/), GPL v2 + 2008/11 - Now compiles on 2.6.26.5: Changes to URB callback mechanism and + work queue API. Also uses new sha1 API. +*/ + #include <linux/version.h> #include <linux/usb.h> #include <linux/tty.h> #include <linux/tty_driver.h> #include <linux/tty_flip.h> #include <linux/mm.h> -#include <asm/scatterlist.h> -#include <linux/scatterlist.h> #include <asm/uaccess.h> #include "modem.h" #include "util.h" +#include "crypto.h" static struct tty_driver *modem_driver = NULL; static char special_tag[] = {0x78, 0x56, 0x34, 0x12}; @@ -73,7 +79,11 @@ static struct tty_operations modem_ops = { }; static void +#if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 18) +modem_write_callback(struct urb *urb) +#else modem_write_callback(struct urb *urb, struct pt_regs *regs) +#endif { struct blackberry_device *blackberry_device = urb->context; @@ -208,10 +218,19 @@ unsigned char *rx_data = input; } static void +#if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 18) +modem_read_work(struct work_struct *work) +#else modem_read_work(void *data) +#endif { int ret = 0; +#if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 18) +struct modem *modem = container_of(work, struct modem, read_work); +struct urb *urb = modem->latest_urb; +#else struct urb *urb = data; +#endif struct blackberry_device *blackberry_device = urb->context; unsigned char *rx_data; @@ -280,65 +299,37 @@ unsigned char *rx_data; */ if (device_map[blackberry_device->modem.tty->index].password_hash) { -#if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 18) - u8 *response = NULL; + u8 *response = NULL, *response_final = NULL; - if (crypto_hash.tfm) + if (blackberry_sha1_avail()) { - response = kmalloc(4 + crypto_hash_digestsize(&crypto_hash.tfm) + sizeof(special_tag), GFP_KERNEL); + response = kmalloc(4 + blackberry_sha1_digestsize() + sizeof(special_tag), GFP_KERNEL); + response_final = kmalloc(4 + blackberry_sha1_digestsize(), GFP_KERNEL); } - if (response) + if (response && response_final) { u8 *data = urb->transfer_buffer; u8 hdr[] = {0x03, 0x00, 0x00, 0x00}; - struct scatterlist sg; memcpy(&device_map[blackberry_device->modem.tty->index].password_hash[0], &data[4], 4); - sg_init_one(&sg, - &device_map[blackberry_device->modem.tty->index].password_hash[0], - 4 + crypto_hash_digestsize(&crypto_hash.tfm)); - crypto_hash_init(&crypto_hash); - crypto_hash_update(&crypto_hash, - &sg, 1); - memcpy(&response[0], hdr, sizeof(hdr)); - crypto_hash_final(&crypto_hash, &response[sizeof(hdr)]); - memcpy(&response[sizeof(hdr) + crypto_hash_digestsize(&crypto_hash.tfm)], special_tag, sizeof(special_tag)); - blackberry_write(blackberry_device, 0, - response, - 4 + crypto_hash_digestsize(&crypto_hash.tfm) + sizeof(special_tag), - GFP_KERNEL); - } - else -#else - u8 *response = NULL; - if (crypto_tfm) - { - response = kmalloc(4 + crypto_tfm_alg_digestsize(crypto_tfm) + sizeof(special_tag), GFP_KERNEL); - } - if (response) - { - u8 *data = urb->transfer_buffer; - u8 hdr[] = {0x03, 0x00, 0x00, 0x00}; - struct scatterlist sg; - - memcpy(&device_map[blackberry_device->modem.tty->index].password_hash[0], &data[4], 4); - sg_init_one(&sg, + blackberry_sha1_sum( &device_map[blackberry_device->modem.tty->index].password_hash[0], - 4 + crypto_tfm_alg_digestsize(crypto_tfm)); - crypto_digest_init(crypto_tfm); - crypto_digest_update(crypto_tfm, - &sg, 1); + 4, &response[4]); + memcpy(&response[0], hdr, sizeof(hdr)); - crypto_digest_final(crypto_tfm, &response[sizeof(hdr)]); - memcpy(&response[sizeof(hdr) + crypto_tfm_alg_digestsize(crypto_tfm)], special_tag, sizeof(special_tag)); + blackberry_sha1_sum(response, 4 + blackberry_sha1_digestsize(), + &response[0]); + memcpy(&response[sizeof(hdr) + blackberry_sha1_digestsize()], special_tag, sizeof(special_tag)); blackberry_write(blackberry_device, 0, response, - 4 + crypto_tfm_alg_digestsize(crypto_tfm) + sizeof(special_tag), + 4 + blackberry_sha1_digestsize() + sizeof(special_tag), GFP_KERNEL); + + kfree(response); + kfree(response_final); } else -#endif { char *err_msg = "ERROR\r\n"; @@ -374,11 +365,18 @@ unsigned char *rx_data; urb->transfer_buffer_length, urb->transfer_buffer, urb->transfer_dma); usb_free_urb(urb); +#if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 18) + modem->latest_urb = NULL; +#endif blackberry_put(blackberry_device); } static void +#if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 18) +modem_read_callback(struct urb *urb) +#else modem_read_callback(struct urb *urb, struct pt_regs *pt_regs) +#endif { int ret = 0; struct blackberry_device *blackberry_device = urb->context; @@ -396,9 +394,19 @@ struct blackberry_device *blackberry_device = urb->context; if (urb->status == 0 || urb->status == -EOVERFLOW) { +#if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 18) + if( blackberry_device->modem.latest_urb == NULL ) + { + usb_get_urb(urb); + blackberry_device->modem.latest_urb = urb; + PREPARE_WORK(&blackberry_device->modem.read_work, modem_read_work); + ret = queue_work(work_queue, &blackberry_device->modem.read_work); + } +#else usb_get_urb(urb); PREPARE_WORK(&blackberry_device->modem.read_work, modem_read_work, urb); ret = queue_work(work_queue, &blackberry_device->modem.read_work); +#endif } else { @@ -750,7 +758,11 @@ int ret = 0; blackberry_device->modem.rx_special_urbs = 0; blackberry_device->modem.read_ep = blackberry_device->interface->cur_altsetting->endpoint[4].desc.bEndpointAddress; blackberry_device->modem.write_ep = blackberry_device->interface->cur_altsetting->endpoint[5].desc.bEndpointAddress; +#if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 18) + INIT_WORK(&blackberry_device->modem.read_work, modem_read_work); +#else INIT_WORK(&blackberry_device->modem.read_work, modem_read_work, NULL); +#endif init_MUTEX(&blackberry_device->modem.sem); blackberry_device->modem.login_complete = 0; init_waitqueue_head(&blackberry_device->modem.open_wait); -- 1.6.0.3 ------------------------------------------------------------------------- This SF.Net email is sponsored by the Moblin Your Move Developer's challenge Build the coolest Linux based applications with Moblin SDK & win great prizes Grand prize is a trip for two to an Open Source event anywhere in the world http://moblin-contest.org/redirect.php?banner_id=100&url=/ _______________________________________________ Barry-devel mailing list Barry-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/barry-devel