Problem mit OpenSSL



  • hi

    ich hoffe ich bin hier im richtigen forum mit dieser frage 😉

    ich habe ein problem mit openssl-0.9.7
    ich soll in das programm meinen eigenen square & multiply algorithmus durch den montgomery algorithmus austauschen.
    das habe ich jetzt gemacht und wollte die int variablen durch BIGNUM's von openssl austauschen da die keys bis zu 2048bit groß werden nur kommen jetzt ständig diese fehlermeldungen in eclipse
    Beschreibung Ressource Pfad Position Typ
    bn_mont.c invalid operands to binary != OpenSSL-0.9.7 89 C/C++ Problem
    bn_mont.c invalid operands to binary % OpenSSL-0.9.7 100 C/C++ Problem
    bn_mont.c invalid operands to binary % OpenSSL-0.9.7 97 C/C++ Problem
    bn_mont.c invalid operands to binary == OpenSSL-0.9.7 98 C/C++ Problem
    bn_mont.c invalid operands to binary >> OpenSSL-0.9.7 81 C/C++ Problem

    das ist mein algorithmus

    int BN_Square_Multiply(BIGNUM *m, BIGNUM *e, BIGNUM *n)
    {
    	//Binär umwandlung
    	int i;
    	BIGNUM binArray[2048];
    
    	for(i=sizeof(e)*8-1; i>=0; --i)  //mit i bit für bit durchgehen
    	{								//Du fängst beim ersten Bit an und "shiftest" dich durch alle Bits der Zahl.
    		binArray[i]=((e>>i)&1);		//Durch die bitweise &-Verknüpfung wird immer eine 1 ausgegeben, wenn sie auch beim Bit der Zahl gesetzt ist.
    	}
    
    	int c;
    	int d=2048;
    	BIGNUM *a;
    
    	while(binArray[d]!=a)
    	{
    		d--;               //bis zur ersten 1 durchgehen
    	}
    
            //S&M
    	for(i=d; i>=0; i--)
    	{
    		c=c*c % n;
    		if(binArray[i]==1)
    		{
    			c=c*(m%n);
    		}
    	}
    	printf("Test\n");
    
    	return c;
    }
    

    BIGNUM ist nur ein struct ... kann man da auch die zeichen die nicht funktionieren überladen oder wie könnte ich das machen ?
    ich wäre für jeden tipp dankbar 🙂



  • michi82 schrieb:

    BIGNUM ist nur ein struct ... kann man da auch die zeichen die nicht funktionieren überladen oder wie könnte ich das machen ?

    ^^du müsstest die funktionen von BIGNUM aufrufen, die die operationen machen. operatorüberladung gibts zwar in vielen programmiersprachen, in C aber nicht.
    🙂



  • wäre das ganze in c++ und mit klassen hätte ich wohl weniger probleme damit ... irgendwie mach ich mir das wohl zu schwer 😃

    hmm leider hat BIGNUM keine operationen die mir bei meinem problem weiterhelfen würden
    und diese BN_mod_lshift funktionen helfen mir auch nicht weiter da ich ja die BIGNUM zahl in eine binary-zahl umwandeln will und das kann C nicht bei diesem datentyp

    const BIGNUM *BN_value_one(void);
    char *	BN_options(void);
    BN_CTX *BN_CTX_new(void);
    void	BN_CTX_init(BN_CTX *c);
    void	BN_CTX_free(BN_CTX *c);
    void	BN_CTX_start(BN_CTX *ctx);
    BIGNUM *BN_CTX_get(BN_CTX *ctx);
    void	BN_CTX_end(BN_CTX *ctx);
    int     BN_rand(BIGNUM *rnd, int bits, int top,int bottom);
    int     BN_pseudo_rand(BIGNUM *rnd, int bits, int top,int bottom);
    int	BN_rand_range(BIGNUM *rnd, BIGNUM *range);
    int	BN_pseudo_rand_range(BIGNUM *rnd, BIGNUM *range);
    int	BN_num_bits(const BIGNUM *a);
    int	BN_num_bits_word(BN_ULONG);
    BIGNUM *BN_new(void);
    void	BN_init(BIGNUM *);
    void	BN_clear_free(BIGNUM *a);
    BIGNUM *BN_copy(BIGNUM *a, const BIGNUM *b);
    void	BN_swap(BIGNUM *a, BIGNUM *b);
    BIGNUM *BN_bin2bn(const unsigned char *s,int len,BIGNUM *ret);
    int	BN_bn2bin(const BIGNUM *a, unsigned char *to);
    BIGNUM *BN_mpi2bn(const unsigned char *s,int len,BIGNUM *ret);
    int	BN_bn2mpi(const BIGNUM *a, unsigned char *to);
    int	BN_sub(BIGNUM *r, const BIGNUM *a, const BIGNUM *b);
    int	BN_usub(BIGNUM *r, const BIGNUM *a, const BIGNUM *b);
    int	BN_uadd(BIGNUM *r, const BIGNUM *a, const BIGNUM *b);
    int	BN_add(BIGNUM *r, const BIGNUM *a, const BIGNUM *b);
    int	BN_mul(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx);
    int	BN_sqr(BIGNUM *r, const BIGNUM *a,BN_CTX *ctx);
    
    int	BN_div(BIGNUM *dv, BIGNUM *rem, const BIGNUM *m, const BIGNUM *d,
    	BN_CTX *ctx);
    #define BN_mod(rem,m,d,ctx) BN_div(NULL,(rem),(m),(d),(ctx))
    int	BN_nnmod(BIGNUM *r, const BIGNUM *m, const BIGNUM *d, BN_CTX *ctx);
    int	BN_mod_add(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, const BIGNUM *m, BN_CTX *ctx);
    int	BN_mod_add_quick(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, const BIGNUM *m);
    int	BN_mod_sub(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, const BIGNUM *m, BN_CTX *ctx);
    int	BN_mod_sub_quick(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, const BIGNUM *m);
    int	BN_mod_mul(BIGNUM *r, const BIGNUM *a, const BIGNUM *b,
    	const BIGNUM *m, BN_CTX *ctx);
    int	BN_mod_sqr(BIGNUM *r, const BIGNUM *a, const BIGNUM *m, BN_CTX *ctx);
    int	BN_mod_lshift1(BIGNUM *r, const BIGNUM *a, const BIGNUM *m, BN_CTX *ctx);
    int	BN_mod_lshift1_quick(BIGNUM *r, const BIGNUM *a, const BIGNUM *m);
    int	BN_mod_lshift(BIGNUM *r, const BIGNUM *a, int n, const BIGNUM *m, BN_CTX *ctx);
    int	BN_mod_lshift_quick(BIGNUM *r, const BIGNUM *a, int n, const BIGNUM *m);
    


  • michi82 schrieb:

    wäre das ganze in c++ und mit klassen hätte ich wohl weniger probleme damit

    ach nö, c++ hat, schätze ich mal, auch keine bignum-library. d.h. du müsstest auch auf irgendwas externes zurückgreifen und deinen code daran anpassen.
    btw, Java hat sogar zwei mit dabei.

    michi82 schrieb:

    hmm leider hat BIGNUM keine operationen die mir bei meinem problem weiterhelfen würden

    so wie's aussieht gehen die wichtigsten sachen doch, also z.b. addition würde so ausehen

    BIGNUM a;
    BIGNUM b;
    BIGNUM ergebnis;
    ...
    BN_add (&ergebnis, &a, &b);
    

    ^^natürlich musste vorher in a und b die beiden summanden haben. dafür gibts z.b. in BIGNUM funktionen, die ziffern-strings in BIGNUMs umwandeln.

    michi82 schrieb:

    und diese BN_mod_lshift funktionen helfen mir auch nicht weiter da ich ja die BIGNUM zahl in eine binary-zahl umwandeln will und das kann C nicht bei diesem datentyp

    BIGNUMs sind zu 'big' für die normalen c-datentypen. du kannst sie aber von/nach zahlen-strings hin- und herkonvertieren.
    🙂



  • ja stimmt bei c++ müsste ich wohl bigint oder so benutzten nur wird BIGNUM überall bei openssl benutzt das wäre dann wohl mehr arbeit 😃

    also + / - / * / :
    gehen schon da muss ich nichtmal add(&ergebniss, &a, &b) machen ... zumindest hat er da noch keine fehler ausgespuckt 🙂 ... nur halt der vergleichsoperator oder != was ich für den S&M algo brauche sind nicht dabei

    aba thx für den tipp mit dem string umwandeln ... das werde ich mal testen strings kann er ja wohl noch vergleichen 😉



  • michi82 schrieb:

    also + / - / * / :
    gehen schon da muss ich nichtmal add(&ergebniss, &a, &b) machen ... zumindest hat er da noch keine fehler ausgespuckt

    naja, keine compile-fehler. aber ich vermute mal, es passiert nicht das, was du willst.
    🙂



  • ~fricky schrieb:

    michi82 schrieb:

    also + / - / * / :
    gehen schon da muss ich nichtmal add(&ergebniss, &a, &b) machen ... zumindest hat er da noch keine fehler ausgespuckt

    naja, keine compile-fehler. aber ich vermute mal, es passiert nicht das, was du willst.
    🙂

    da hattest du wieder recht 😃 ich musste das echt so machen mit dem bn_add() ...

    hab meinen code jetzt etwas an den rest angepasst aber ich kann ihn noch nicht testen weil diese fehlermeldungen kommen

    Beschreibung Ressource Pfad Position Typ
    a_type.c Dereferenzierung eines Type-Pun-Zeigers verletzt strict-aliasing-Regeln OpenSSL-0.9.7 74 C/C++ Problem
    b_print.c conflicting types for built-in function 'pow10' OpenSSL-0.9.7 569 C/C++ Problem
    pem_lib.c Dereferenzierung eines Type-Pun-Zeigers verletzt strict-aliasing-Regeln OpenSSL-0.9.7 479 C/C++ Problem
    x_name.c Dereferenzierung eines Type-Pun-Zeigers verletzt strict-aliasing-Regeln OpenSSL-0.9.7 242 C/C++ Problem
    x_name.c Dereferenzierung eines Type-Pun-Zeigers verletzt strict-aliasing-Regeln OpenSSL-0.9.7 239 C/C++ Problem
    x_name.c Dereferenzierung eines Type-Pun-Zeigers verletzt strict-aliasing-Regeln OpenSSL-0.9.7 177 C/C++ Problem
    x_name.c Dereferenzierung eines Type-Pun-Zeigers verletzt strict-aliasing-Regeln OpenSSL-0.9.7 171 C/C++ Problem

    das komische ist ich hab gar nix in den dateien da gemacht und die fehler kommen nur ab und zu ... zur zeit gehen sie zumindest nicht weg

    das ist mein code

    #include <stdio.h>
    #include "cryptlib.h"
    #include "bn_lcl.h"
    
    #define MONT_WORD /* use the faster word-based algorithm */
    
    int BN_Square_Multiply(BIGNUM *m, BIGNUM *e, BIGNUM *n, BN_SM_CTX *sm, BN_CTX *ctx)
    {
    	//Binär umwandlung
    	printf("funktioniert\n");
    	int i;
    	int binArray[2048];
    
    	for(i=sizeof(e)*8-1; i>=0; --i)  //mit i bit für bit durchgehen
    	{								//Du fängst beim ersten Bit an und "shiftest" dich durch alle Bits der Zahl.
    		//binArray[i]=((e>>i)&1);	//Durch die bitweise &-Verknüpfung wird immer eine 1 ausgegeben, wenn sie auch beim Bit
    		binArray[i]=BN_num_bits(e);							//der Zahl gesetzt ist.
    	}
    
    	//S&M
    	BIGNUM *c;
    	int d=2048;
    	int aa=1;
    
    	//unsigned long value=1;
    	BIGNUM *ModCN;
    	BIGNUM *ModMN;
    
    	BN_CTX_start(ctx);
    	c = BN_CTX_get(ctx);
    	ModCN = BN_CTX_get(ctx);
    	ModMN = BN_CTX_get(ctx);
    
    	while(binArray[d]!=aa)
    	{
    		d--;
    	}
    
    	for(i=d; i>=0; i--)
    	{
    		BN_mod(ModCN,c,n,ctx);
    		BN_mul(c, c, ModCN, ctx);
    		if(binArray[i]==1)
    		{
    			BN_mod(ModMN,m,n,ctx);
    			BN_mul(c,c,ModMN,ctx);
    		}
    	}
    	printf("Test\n");
    
    	//return c;
    	return 1;
    }
    
    BN_SM_CTX *BN_SM_CTX_new(void) //allokiert und initialisiert einen neuen SM struct
    	{
    	BN_SM_CTX *ret;
    
    	if ((ret=(BN_SM_CTX *)OPENSSL_malloc(sizeof(BN_SM_CTX))) == NULL)
    		return(NULL);
    
    	BN_SM_CTX_init(ret);
    	//ret->flags=BN_FLG_MALLOCED;
    	return(ret);
    	}
    
    void BN_SM_CTX_init(BN_SM_CTX *ctx) //initialisieren
    	{
    	BN_init(&(ctx->result));
    	BN_init(&(ctx->basis));
    	BN_init(&(ctx->exponent));
    	BN_init(&(ctx->modulo));
    	}
    
    void BN_SM_CTX_free(BN_SM_CTX *sm) //freigeben
    	{
    	if(sm == NULL)
    	    return;
    
    	BN_free(&(sm->result));
    	BN_free(&(sm->basis));
    	BN_free(&(sm->exponent));
    	BN_free(&(sm->modulo));
    	//if (sm->flags & BN_FLG_MALLOCED)
    	//	OPENSSL_free(sm);
    	}
    

Anmelden zum Antworten