2013-02-18 10 views
5

Desidero utilizzare RSA_generate_key() su HP-UX 11.11. Ma hp-ux 11.11 non fornisce/dev/random o/dev/urandom, quindi ho bisogno di usare openssl prngd.RSA_generate_key() utilizzando prngd invece di/dev/random o/dev/urandom

Per favore fatemi sapere come usarlo di default nel codice C. Ho openssl installato e prngd è disponibile.

$ ls /opt/openssl/prngd/prngd 
/opt/openssl/prngd/prngd 

Fatemi sapere se avete bisogno di ulteriori informazioni.

risposta

2

prngd simula "/ dev/random" e "/ dev/urandom" su una connessione di rete. Supporta un socket di dominio basato su stream Unix ("/ var/run/egd-pool") o (se configurato) o IP che utilizza le porte TCP 708 o 4840 (i valori predefiniti --- possono essere modificati).

Quindi, utilizzando la presa dominio Unix, sarebbe qualcosa di simile:

#include <string.h> 
#include <sys/types.h> 
#include <sys/socket.h> 
#include <sys/un.h> 

int devrandom(void) 
{ 
    union 
    { 
    struct sockaddr sa; 
    struct sockaddr_un path; 
    } location; 
    int sock;    

    memset(&location,0,sizeof(location)); 
    location.path.sun_family = AF_UNIX; 
    strcpy(location.path.sun_path,"/var/run/egd-pool"); 

    sock = socket(AF_UNIX,SOCK_STREAM,0); 
    if (sock < 0) 
    return -1; 

    if (connect(sock,&location.sa,sizeof(struct sockaddr_un)) < 0) 
    return -1; 

    return sock; 
} 

Ciò restituirà un descrittore di file si può passare a read() al fine di ottenere i dati casuali (nota: questo il codice non è stato testato). Una connessione basata su TCP/IP è un po 'più coinvolta, richiedendo il binding del socket a un indirizzo locale e la connessione all'indirizzo remoto, ma ci sono molti esempi su Internet per quel tipo di codice.

3

Notando che prngd utilizza la stessa interfaccia di EGD, controlla le istruzioni trovate here. Una citazione di interesse:

Sui sistemi senza/dev/* dispositivi casuali che forniscono l'entropia dal kernel

In alternativa, l'EGD interfaccia daemon compatibile prngd possono essere utilizzati.

OpenSSL interroga automaticamente EGD quando viene richiesta l'entropia tramite RAND_bytes() o lo stato viene controllato tramite RAND_status() per la prima volta, se il socket si trova in/var/run/egd-pool,/dev/egd- pool o/etc/egd-pool.

Quindi, quando si esegue prngd, eseguirlo come prngd /dev/egd-pool o una delle altre alternative

Problemi correlati