Hi,
Where is the problem in pthreads ?
I dont't know the BN_mod_exp_mon procedure bat we can try a simple
pthreads program, if I can help you I am happy.
Tomorrow i try openssl pthreads.
I have only a question.
You hare sure the problem is in pthreads end not in your common memory
access syncronization ?

2009/6/23 pcslara <pcsl...@yahoo.com.br>:
>
> Please
> Could someone have a simple example with pthread
> to show me!
> This program was compiled and run on an openSUSE 11.0 x86_64
> kernel 2.6.25.18. The program exits with 'Segmentation fault'.
>
>
> pcslara wrote:
>>
>> Hi friends,
>> This is my fisrt message here!
>> I'm making a parallel version of BN_mod_exp_mont.
>> However I am encountering many problems when using
>> pthreads.
>>
>> #include <openssl/crypto.h>
>> #include <openssl/rsa.h>
>> #include <openssl/bn.h>
>> #include <openssl/ossl_typ.h>
>> #include <openssl/objects.h>
>> #include <openssl/err.h>
>>
>> /* To use as callback in 'pthread_create()' */
>> void BN_mod_exp_mont_call( void * args[6] );
>> /* BN_mod_exp_mont Parallel version */
>> int BN_mod_exp_mont_t2(BIGNUM *r, const BIGNUM *a, const BIGNUM *e,
>>                        const BIGNUM *m, BN_CTX *ctx, BN_MONT_CTX *m_ctx);
>> int BN_split( const BIGNUM * e,  BIGNUM * e1, BIGNUM * e2 );
>>
>> /* Lock Features */
>> void CRYPTO_thread_setup(void);
>> void CRYPTO_thread_cleanup(void);
>>
>> static unsigned long pthreads_thread_id(void );
>> static pthread_mutex_t *lock_cs;
>> static long *lock_count;
>> static void pthreads_locking_callback(int mode,int type,char *file,int
>> line);
>>
>> void CRYPTO_thread_setup(void) {
>>     int i;
>>     lock_cs=OPENSSL_malloc(CRYPTO_num_locks() * sizeof(pthread_mutex_t));
>>     lock_count=OPENSSL_malloc(CRYPTO_num_locks() * sizeof(long));
>>     for (i=0; i<CRYPTO_num_locks(); i++) {
>>         lock_count[i]=0;
>>         pthread_mutex_init(&(lock_cs[i]),NULL);
>>     }
>>
>>     CRYPTO_set_id_callback((unsigned long (*)())pthreads_thread_id);
>>     CRYPTO_set_locking_callback((void (*)())pthreads_locking_callback);
>> }
>> void CRYPTO_thread_cleanup(void) {
>>     int i;
>>     CRYPTO_set_locking_callback(NULL);
>>     for (i=0; i<CRYPTO_num_locks(); i++)
>>         {
>>         pthread_mutex_destroy(&(lock_cs[i]));
>>         }
>>     OPENSSL_free(lock_cs);
>>     OPENSSL_free(lock_count);
>> }
>> void pthreads_locking_callback(int mode, int type, char *file, int line) {
>>     if (mode & CRYPTO_LOCK) {
>>         pthread_mutex_lock(&(lock_cs[type]));
>>         lock_count[type]++;
>>     } else
>>         pthread_mutex_unlock(&(lock_cs[type]));
>> }
>> unsigned long pthreads_thread_id(void) {
>>     unsigned long ret;
>>     ret=(unsigned long)pthread_self();
>>     return(ret);
>> }
>> int BN_split( const BIGNUM * e,  BIGNUM * e1, BIGNUM * e2 ) {
>>     int r = (BN_num_bits( e ) + 1) / 2;
>>     BN_copy( e1, e );
>>     BN_mask_bits( e1, r );
>>     BN_rshift( e2, e, r );
>>     return r;
>> }
>> int BN_mod_exp_mont_t2(BIGNUM *r, const BIGNUM *a, const BIGNUM *e,
>>                        const BIGNUM *m, BN_CTX *ctx, BN_MONT_CTX *m_ctx) {
>>     BIGNUM * e1, * e2, * a1, * a2;
>>     BIGNUM * tmp;
>>     int t = 0;
>>
>>     BN_CTX_start( ctx );
>>     e1 = BN_CTX_get( ctx );
>>     e2 = BN_CTX_get( ctx );
>>     a1 = BN_CTX_get( ctx );
>>     a2 = BN_CTX_get( ctx );
>>     tmp = BN_CTX_get( ctx );
>>
>>     t = BN_split( e, e1, e2 );
>>     BN_lshift( tmp, BN_value_one(), t );
>>
>>     void * args[6];
>>     pthread_t th;
>>     args[0] = (void *) a1;
>>     args[1] = (void *) a;
>>     args[2] = (void *) e1;
>>     args[3] = (void *) m;
>>     args[4] = (void *) ctx;
>>     args[5] = (void *) m_ctx;
>>     pthread_create( &th, NULL, (void *)BN_mod_exp_mont_call, (void *) args
>> );
>>     //BN_mod_exp_mont_call( args );
>>     BN_mod_exp_mont( a2, a, tmp, m, ctx, m_ctx );
>>     BN_mod_exp_mont( a2, a2, e2, m, ctx, m_ctx );
>>     pthread_join( th, NULL );
>>     BN_mod_mul( r, a1, a2, m, ctx );
>>     BN_CTX_end( ctx );
>> }
>> void BN_mod_exp_mont_call( void * args[6] ) {
>>     BN_mod_exp_mont( (BIGNUM *) args[0], (BIGNUM *)args[1], (BIGNUM
>> *)args[2],
>>                      (BIGNUM *)args[3], (BN_CTX *) args[4], (BN_MONT_CTX
>> *)args[5] );
>> }
>> int TestEncrypt() {
>>     RSA * key;
>>
>>     unsigned char ctext[256];
>>     unsigned char ptext[256];
>>     static unsigned char ptext_ex[] = "\x25\x44\x65\x66";
>>
>>     key = RSA_generate_key( 512, RSA_F4, NULL, NULL );
>>     key->meth->bn_mod_exp = BN_mod_exp_mont_t2;
>>
>>     int clen = RSA_private_encrypt( sizeof( ptext_ex ) - 1, ptext_ex,
>> ctext, key, RSA_PKCS1_PADDING );
>>
>>     if( clen == -1 ) { fprintf( stderr, "Bad encrypt\n"); return -1; }
>>
>>     int plen = RSA_public_decrypt( clen, ctext, ptext, key,
>> RSA_PKCS1_PADDING );
>>
>>     if( plen == -1 ) { fprintf( stderr, "Bad decrypt\n"); return -1; }
>>
>>     if( memcmp( ptext, ptext_ex, plen ) != 0 ) {
>>         fprintf( stderr,"Diffs ptext's\n");
>>         return -1;
>>     } else
>>         return 0;
>> }
>> int main( int argc, char ** argv ) {
>>     CRYPTO_thread_setup();
>>         if( TestEncrypt() == 0 ){ fprintf( stdout, "Encrypt Ok!\n"); }
>>     CRYPTO_thread_cleanup();
>>     return 0;
>> }
>>
>> Obs:
>> For the test, I do
>>
>> key-> meth-> bn_mod_exp = BN_mod_exp_mont_t2;
>>
>> Thus the attribute 'meth' of RSA struct can not be const.
>>
>
> --
> View this message in context: 
> http://www.nabble.com/Problem-with-pthread-and-OpenSSL-tp24073660p24165584.html
> Sent from the OpenSSL - User mailing list archive at Nabble.com.
> ______________________________________________________________________
> OpenSSL Project                                 http://www.openssl.org
> User Support Mailing List                    openssl-us...@openssl.org
> Automated List Manager                           majord...@openssl.org
>
______________________________________________________________________
OpenSSL Project                                 http://www.openssl.org
User Support Mailing List                    openssl-users@openssl.org
Automated List Manager                           majord...@openssl.org

Reply via email to