int generate_challenge(char **r_challenge, char **r_response, RSA * rsa) { unsigned char secret[32], *tmp; unsigned long length, ret; if(!rsa) return -1; if(get_randomness(secret, 32) == 0) { report_crypto_errors(); return -1; } *r_response = MyMalloc(65); binary_to_hex(secret, *r_response, 32); length = RSA_size(rsa); tmp = MyMalloc(length); ret = RSA_public_encrypt(32, secret, tmp, rsa, RSA_PKCS1_PADDING); *r_challenge = MyMalloc((length << 1) + 1); binary_to_hex(tmp, *r_challenge, length); (*r_challenge)[length << 1] = 0; MyFree(tmp); if(ret < 0) { report_crypto_errors(); return (-1); } return (0); }
/*===========================================================================* * generic_handler * *===========================================================================*/ static int generic_handler(irq_hook_t * hook) { /* This function handles hardware interrupt in a simple and generic way. All * interrupts are transformed into messages to a driver. The IRQ line will be * reenabled if the policy says so. */ int proc_nr; /* As a side-effect, the interrupt handler gathers random information by * timestamping the interrupt events. This is used for /dev/random. */ get_randomness(&krandom, hook->irq); /* Check if the handler is still alive. * If it's dead, this should never happen, as processes that die * automatically get their interrupt hooks unhooked. */ if(!isokendpt(hook->proc_nr_e, &proc_nr)) panic("invalid interrupt handler: %d", hook->proc_nr_e); /* Add a bit for this interrupt to the process' pending interrupts. When * sending the notification message, this bit map will be magically set * as an argument. */ priv(proc_addr(proc_nr))->s_int_pending |= (1 << hook->notify_id); /* Build notification message and return. */ mini_notify(proc_addr(HARDWARE), hook->proc_nr_e); return(hook->policy & IRQ_REENABLE); }