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++ Problemdas 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 datentypconst 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 ausgespucktnaja, 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 ausgespucktnaja, 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++ Problemdas 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); }