i release my private librairy "qbytes" (quantique bytes) this is a mathematic tool where all bits of a double word have 3 states : one , zero and unknow i implemented the addition , multiplication (with an integer), a new concept "fusion" (equivalent to = ) , and all basic booleean functions (binary version of xor, or, no , and) there are some utilities like error detection, error depth etc ... i used this lib for coding fuckmd5.cpp if you want to use multithreading the code need modification i think this tool is good for easy recomputation and error detection in the case of a cryptographic attack quantique.h : structure definition qbyte.h : class definition qbyte.cpp : all the functions download link : http://81.57.125.106/~slythers/qbyte%20and%20md5%20recomputation.rar the quantique.h ----------------------------------------------------------------------------- /* (c) b4d coder Malloc(0) Wicked Attitude Copyright (c) 2006, overdose : slythers@gmail.com All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the Malloc(0) Wicked Attitude nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #define PARAM_LIST_SIZE_BASE (sizeof(unsigned int)+sizeof(unsigned char)+sizeof(char)+sizeof(bool)) #define MAX_ADD (255) struct quantique { unsigned int value; unsigned int know; }; struct quantparam{ unsigned int size; char type; unsigned char nb; bool error; struct quantique *wesh[2]; }; the qbyte.h ----------------------------------------------------------------------------- /* B4d coder (c) Quantique Bytes librairy (cryptographic attack tool) coded by overdose/slythers@gmail.com Malloc(0) Wicked Attitude http://malloczerowickedattitude.new.fr created:10/03/2006 */ #include #include "quantique.h" class qbyte { public: qbyte(); bool error; unsigned int value; unsigned int know; static unsigned int ldepth; static unsigned int hdepth; bool multi(qbyte &un,unsigned int entier); bool add(qbyte &un,qbyte &deux); bool xor(qbyte &un,qbyte &deux); bool and(qbyte &un,qbyte &deux); bool or(qbyte &un,qbyte &deux); bool no(qbyte &un); void no(); bool fusion(qbyte &of); void copy(qbyte &a); bool existbit(unsigned int number); void setbit(unsigned int number,bool value); void disablebit(unsigned int number); bool getbit(unsigned int number); void copyrealvalue(); void setvalue(); void setvalue(unsigned int v); void leftrotation(unsigned int nb); void rightrotation(unsigned int nb); void leftdecalage(unsigned int nb); void rightdecalage(unsigned int nb); //systeme de profondeur des erreur bool enabledepth(); bool depthisenable(); bool disabledepth(); void reinitdepth(); unsigned int getldepth(); unsigned int gethdepth(); unsigned int getredzone(); bool depthsaved(); bool enablecopyerror(); bool disablecopyerror(); //surcharge des opérateurs, be aware to memory leak struct quantparam * operator * (unsigned int constante); struct quantparam * operator + (qbyte &a); struct quantparam * operator + (struct quantparam * list); struct quantparam * operator | (qbyte &a); struct quantparam * operator | (struct quantparam * list); struct quantparam * operator & (qbyte &a); struct quantparam * operator & (struct quantparam * list); struct quantparam * operator ^ (qbyte &a); struct quantparam * operator ^ (struct quantparam * list); bool operator = (struct quantparam *list); bool operator = (qbyte &a); //machin amie friend ostream &operator << (ostream &sortie, qbyte &a) { sortie << "Quantique Bytes value: "<value = 0x00; this->know = 0x00; me.value = 0x00; me.know = 0x00; error = 0; if(!initialised) { initialised = 1; copyerror = 1; disabledepth(); } } bool qbyte::checkbitforadd(struct quantique *x,struct quantique *y,struct quantique *z) { bool modified=0; bool retenuemodified =0; bool retmod=0; unsigned int flagerror = 0x00; unsigned int mask; struct quantique save1,save2,save3; save1 = *x; save2 = *y; save3 = *z; struct quantique retenue; retenue.value = 0x00; retenue.know = 0x00; increment(); do{ if(modified) retmod = 1; modified = 0; retenuemodified = 0; mask = 0x01; for(unsigned char cpt = 0;cpt <32;cpt++) { //si on connait toute les valeurs on calcul la retenue et on se casse pas if((z->know & mask) && (x->know & mask) && (y->know & mask) && !( retenue.know & mask)) { /*if(retenue.know & mask) continue;*/ if(!cpt) { retenuemodified = 1; retenue.know |= mask; if((x->value & mask) && (y->value & mask)) retenue.value |= mask; else retenue.value &= ~mask; } else if(retenue.know & (mask>>1)) { retenuemodified = 1; retenue.know |= mask; if( ((x->value & mask) || (y->value & mask)) && ( ((x->value & mask) && (y->value & mask)) || (retenue.value & (mask>>1)) ) ) retenue.value |= mask; else retenue.value &= ~mask; } else if(((x->value & mask) && (y->value & mask))) { retenuemodified = 1; retenue.know |= mask; retenue.value |= mask; }; //continue; } //premier bit pas de retenue if(!cpt) { //au cas ou on connait la retenue if((retenue.know & mask) && (!(x->know & mask) || !(y->know & mask)) && (retenue.value & mask)) { modified = 1; y->know |= mask; x->know |= mask; y->value |= mask; x->value |= mask; } else if((retenue.know & mask) && !(x->know & mask) && (y->know & mask) && (y->value & mask) && !(retenue.value & mask)) { modified = 1; x->know |= mask; x->value &= ~mask; } else if((retenue.know & mask) && !(y->know & mask) && (x->know & mask) && (x->value & mask) && !(retenue.value & mask)) { modified = 1; y->know |= mask; y->value &= ~mask; }; //si on connait le bit du resultat if(z->know & mask) { //si on connait le bit de x a 1 et pas y if((x->know & mask) && (x->value & mask) && !(y->know & mask)) { modified = 1; y->know |= mask; //on met y a 0 if(z->value & mask) y->value &= ~mask; else y->value |= mask; } else if((x->know & mask) && !(x->value & mask) && !(y->know & mask))// bit de x a 0 { modified = 1; y->know |= mask; if(z->value & mask) y->value |= mask; else y->value &= ~mask; } //on connait y et pas x else if((y->know & mask) && (y->value & mask) && !(x->know & mask)) { modified = 1; x->know |= mask; //on met y a 0 if(z->value & mask) x->value &= ~mask; else x->value |= mask; } else if((y->know & mask) && !(y->value & mask) && !(x->know & mask) )// bit de x a 0 { modified = 1; x->know |= mask; if(z->value & mask) x->value |= mask; else x->value &= ~mask; } } //si on connait les deux ! else if((x->know & mask) && (y->know & mask) && !(z->know & mask)) { modified = 1; z->know |= mask; if( (x->value & mask) ^ (y->value & mask) ) z->value |= mask; else z->value &= ~mask; }; //calcul de la retenue if((x->know & mask) && (y->know & mask) && !(retenue.know & mask)) { retenuemodified = 1; retenue.know |= mask; if((x->value & mask) && (y->value & mask)) retenue.value |= mask; else retenue.value &= ~mask; } //on verifie les erreurs if((z->know & mask) && (x->know & mask) && (y->know & mask)) { if(( (x->value & mask) ^ (y->value & mask) ) != (z->value & mask)) { if(!(flagerror & mask)) { flagerror |= mask; savedepth(1); } error = 1; } } } else { //au cas ou on connait la retenue courante et peut etre la precedente pas z mais !a | !b if((retenue.know & mask) && (!(x->know & mask) || !(y->know & mask))/* && !(z->know & mask)*/) { if((retenue.value & mask) && (retenue.know & (mask>>1)) && !( retenue.value & (mask>>1))) { modified = 1; y->know |= mask; x->know |= mask; y->value |= mask; x->value |= mask; } else if((retenue.value & mask) && (retenue.know & (mask>>1)) && ( retenue.value & (mask>>1))) { if((x->know & mask) && !(x->value & mask) && !(y->know & mask)) { modified = 1; y->know |= mask; y->value |= mask; } else if((y->know & mask) && !(y->value & mask) && !(x->know & mask)) { modified = 1; x->know |= mask; x->value |= mask; }; } else if((retenue.know & (mask>>1)) && (retenue.value & (mask>>1)) && !( retenue.value & mask)) { modified = 1; y->know |= mask; x->know |= mask; y->value &= ~mask; x->value &= ~mask; } else if((retenue.know & (mask>>1)) && !(retenue.value & (mask>>1)) && !(retenue.value & mask)) { if((y->know & mask) && (y->value & mask) && !(x->know & mask)) { modified = 1; x->know |= mask; x->value &= ~mask; } else if((x->know & mask) && (x->value & mask) && !(y->know & mask)) { modified = 1; y->know |= mask; y->value &= ~mask; }; } //au cas ou on connait pas la précendente valeur else if(!(retenue.know & (mask>>1))) { if((retenue.value & mask) && (x->know & mask) && !(x->value & mask)) { modified = 1; y->know |= mask; y->value |= mask; } else if((retenue.value & mask) && (y->know & mask) && !(y->value & mask)) { modified = 1; x->know |= mask; x->value |= mask; }; }; } //calcul avec retenue precedente inconnu wesh if(!(retenue.know & (mask >> 1))) { if((retenue.know & mask) && (z->know & mask) && !(retenue.value & mask) && !(z->value & mask)) { //cout <<"debug ret"<>1); retenue.value &= ~(mask>>1); } //calcul de la retenu precedente if((x->know & mask) && (y->know & mask) && (z->know & mask)) { retenuemodified = 1; retenue.know |= (mask >> 1); if( ((x->value & mask) ^ (y->value & mask)) ^ (z->value & mask)) retenue.value |= (mask >> 1); else retenue.value &= ~(mask >> 1); } //on connait la retenue actuel et x et y else if((x->know & mask) && (y->know & mask) && (retenue.know & mask)) { //si Rx=1 et !(x&&y) alors rx-1 = 1 if((retenue.value & mask) && !((x->value & mask) && (y->value & mask))) { //cout <<"debug 17"<>1); retenue.value |= (mask>>1); } // si rx = 0 et x||y rx-1 = 0 else if(!(retenue.value & mask) && ((x->value & mask) || (y->value & mask)) ) { retenuemodified = 1; retenue.know |= (mask>>1); retenue.value &= ~(mask>>1); }; }; } //calcul avec retenue precedente connu else if( retenue.know & (mask >> 1)) { if((x->know & mask) && (y->know & mask) && !(z->know & mask)) { modified = 1; z->know |= mask; if((x->value & mask) ^ (y->value & mask) ^ ((retenue.value & (mask>>1))<<1)) z->value |= mask; else z->value &= ~mask; } else if((x->know & mask) && !(y->know & mask) && (z->know & mask)) { modified = 1; y->know |= mask; if((x->value & mask) ^ (z->value & mask) ^ ((retenue.value & (mask>>1))<<1)) y->value |= mask; else y->value &= ~mask; } else if(!(x->know & mask) && (y->know & mask) && (z->know & mask)) { modified = 1; x->know |= mask; if((z->value & mask) ^ (y->value & mask) ^ ((retenue.value & (mask>>1))<<1)) x->value |= mask; else x->value &= ~mask; }; //calcul retenu if(!(retenue.know & mask) && (x->know & mask) && !(y->know & mask) && !(z->know & mask) ) { if(!(retenue.value & (mask>>1)) && !(x->value & mask)) { retenuemodified = 1; retenue.know |= mask; retenue.value &= ~mask; } else if((retenue.value & (mask>>1)) && (x->value & mask)) { retenuemodified = 1; retenue.know |= mask; retenue.value |= mask; }; } else if(!(retenue.know & mask) && (y->know & mask) && !(x->know & mask) && !(z->know & mask)) { if(!(retenue.value & (mask>>1)) && !(y->value & mask)) { retenuemodified = 1; retenue.know |= mask; retenue.value &= ~mask; } else if((retenue.value & (mask>>1)) && (y->value & mask)) { retenuemodified = 1; retenue.know |= mask; retenue.value |= mask; }; }; } //calcul de la retenu if(!(retenue.know & mask) && (retenue.know & (mask>>1)) && (x->know & mask) && (y->know & mask)) { retenuemodified = 1; retenue.know |= mask; if( ((x->value & mask) && (y->value & mask)) || ((x->value & mask) && ( retenue.value & (mask>>1))) || ((retenue.value & (mask>>1)) && (y->value & mask)) ) retenue.value |= mask; else retenue.value &= ~mask; } else if(!(retenue.know & mask) && !(retenue.know & (mask>>1)) && (x->know & mask) && (y->know & mask) && (x->value & mask) && (y->value & mask)) { retenuemodified = 1; retenue.know |= mask; retenue.value |= mask; } else if(!(retenue.know & mask) && (retenue.know & (mask>>1)) && (x->know & mask) && !(y->know & mask) && !(retenue.value & (mask>>1)) && !(x->value & mask)) { retenuemodified = 1; retenue.know |= mask; retenue.value &= ~mask; } else if(!(retenue.know & mask) && (retenue.know & (mask>>1)) && !(x->know & mask) && (y->know & mask) && !(retenue.value & (mask>>1)) && !(y->value & mask)) { retenuemodified = 1; retenue.know |= mask; retenue.value &= ~mask; }; if((x->know & mask) && (y->know & mask) && !(x->value & mask) && !(y->value & mask) && !(retenue.know & mask) ) { //cout <<"debug ret 2"<know & mask) && (y->know & mask) && (x->value & mask) && (y->value & mask) && !(retenue.know & mask) ) { //cout <<"debug ret 3"<know & mask) && (x->know & mask) && (y->know & mask) && cpt && ( retenue.know & (mask>>1))) { if(( (x->value & mask) ^ (y->value & mask) ^ ((retenue.value & (mask>>1))<<1) ) != (z->value & mask)) { if(!(flagerror & mask)) { flagerror |= mask; savedepth(1); } error = 1; } } mask = mask <<1; } }while(modified || retenuemodified); //verification des erreur if(!(~(x->know)) && !(~(y->know)) && !(~(z->know))) { if((x->value + y->value) != z->value) { savedepth(); error = 1; } } if((save1.value & save1.know) != (x->value & save1.know)) { savedepth(); error = 1; } if((save2.value & save2.know) != (y->value & save2.know)) { savedepth(); error = 1; } if((save3.value & save3.know) != (z->value & save3.know)) { savedepth(); error = 1; } return retmod; } //version fast ... bool qbyte::checkmulti(struct quantique *x,unsigned int entier,struct quantique *z) { struct quantique pile[32]; struct quantique palier; struct quantique copiedex; struct quantique cx,cz; unsigned int mask; unsigned char cpt,nb,max; bool modified=0; cx = *x; cz = *z; palier.value = 0x00; palier.know = 0x00; nb = 0; increment(); for(cpt =0; cpt<32;cpt++) { pile[cpt].value = 0x00; pile[cpt].know = 0x00; } for(max =31;!((0x01<value << (31-cpt); palier.know = (x->know << (31-cpt)) | ((cpt == 31) ? 0x00 : (0xffffffff >> (cpt+1)) ); if(checkbitforadd(&(pile[nb]),&palier, (cpt == max)? z : &(pile[nb+1]) )) modified = 1; nb++; palier.value = palier.value >> (31-cpt); palier.know = palier.know >> (31-cpt); copiedex.know = x->know; if(checkfusion(&palier,x)) { if(copiedex.know != x->know) modified = 1; } } mask = mask >>1; } //on refait dans l'autre sens for(;cpt;cpt--) { if(mask & entier) { palier.value = (x->value) << (31-(cpt-1)); palier.know = (x->know) << (31-(cpt-1)) | ((cpt == 32) ? 0x00 : (0xffffffff >> (cpt)) ); if(checkbitforadd(&(pile[nb]),&palier, (cpt == (max+1))? z : &(pile[nb+1]) )) modified = 1; nb--; palier.value = (palier.value) >> (31-(cpt-1)); palier.know = (palier.know) >> (31-(cpt-1)); copiedex.know = x->know; if(checkfusion(&palier,x)) { if(copiedex.know != x->know) modified = 1; } } mask = mask <<1; } }while(modified && !error); //verification erreur if(cx.value != (x->value & cx.know)) { savedepth(); error = 1; } if(cz.value != (z->value & cz.know)) { savedepth(); error = 1; } if((cz.know != z->know) || (cx.know != x->know)) return 1; return 0; } bool qbyte::checkbitforxor(struct quantique *x,struct quantique *y,struct quantique *z) { bool modified=0; unsigned int mask=0x01; unsigned int tmp; unsigned int flagerror=0x00; increment(); tmp = z->know & x->know & y->know; if((z->value & tmp) != ((x->value & tmp) ^ (y->value & tmp))) { savedepth(); error = 1; } for(unsigned int cpt = 0;cpt<32;cpt++) { if(z->know & mask) { if(z->value & mask) { if((x->know & mask) && (x->value & mask)) { //cout <<"debug 1"<know & mask)) modified = 1; y->know |= mask; y->value &= ~mask; } else if((y->know & mask) && (y->value & mask)) { //cout <<"debug 2"<know & mask)) modified = 1; x->know |= mask; x->value &= ~mask; }; } else { if(x->know & mask) { //cout <<"debug 3"<know & mask)) modified = 1; y->know |= mask; if(x->value&mask) y->value |= mask; else y->value &= ~mask; } else if(y->know & mask) { //cout <<"debug 4"<know & mask)) modified = 1; x->know |= mask; if(y->value&mask) x->value |= mask; else x->value &= ~mask; }; } } else if((x->know & mask) && (y->know & mask)) { //cout <<"debug 5"<know |= mask; if((x->value & mask) ^ (y->value & mask)) z->value |= mask; else z->value &= ~mask; }; //on check les erreur if((z->know & mask) && (x->know & mask) && (y->know & mask)) { if((z->value & mask) != ((x->value & mask) ^ (y->value & mask))) { if(!(flagerror & mask)) { flagerror |= mask; savedepth(1); } error = 1; } } mask = mask << 1; } return modified; } bool qbyte::checkbitforand(struct quantique *x,struct quantique *y,struct quantique *z) { bool modified=0; unsigned int mask=0x01; unsigned int flagerror = 0x00; unsigned int tmp; increment(); tmp = z->know & x->know & y->know; if((z->value & tmp) != ((x->value & tmp) & (y->value & tmp))) { savedepth(); error = 1; } for(unsigned int cpt = 0;cpt<32;cpt++) { if((z->know & mask) && (z->value & mask)) { if(!((x->know & mask) && (y->know & mask)) ) modified = 1; x->know |= mask; y->know |= mask; x->value |= mask; y->value |= mask; } else if((z->know & mask) && !(z->value & mask)) { if((x->know & mask)&&(x->value & mask)) { if(!(y->know & mask)) modified = 1; y->know |= mask; y->value &= ~mask; } else if((y->know & mask)&&(y->value & mask)) { if(!(x->know & mask)) modified = 1; x->know |= mask; x->value &= ~mask; }; } else if(!(z->know & mask) && ((x->know & mask) || (y->know & mask))) { if((x->know & mask) && !(x->value & mask)) { modified = 1; z->know |= mask; z->value &= ~mask; } else if((y->know & mask) && !(y->value & mask)) { modified = 1; z->know |= mask; z->value &= ~mask; } else if((x->know & mask) && (y->know & mask))// normelement les deux sont a 1 { modified = 1; z->know |= mask; z->value |= mask; } }; //on check les erreur if((z->know & mask) && (x->know & mask) && (y->know & mask)) { if((z->value & mask) != ((x->value & mask) & (y->value & mask))) { if(!(flagerror & mask)) { flagerror |= mask; savedepth(1); } error = 1; } } mask = mask<<1; } return modified; } bool qbyte::checkbitforor(struct quantique *x,struct quantique *y,struct quantique *z) { bool modified=0; unsigned int mask=0x01; unsigned int tmp; unsigned int flagerror = 0x00; increment(); tmp = z->know & x->know & y->know; if((z->value & tmp) != ((x->value & tmp) | (y->value & tmp))) { savedepth(); error = 1; } for(unsigned int cpt = 0;cpt<32;cpt++) { if((z->know & mask) && !(z->value & mask)) { if(!((x->know & mask) && (y->know & mask)) ) modified = 1; x->know |= mask; y->know |= mask; x->value &= ~mask; y->value &= ~mask; } else if((z->know & mask) && (z->value & mask)) { if((x->know & mask) && !(x->value & mask)) { if(!(y->know & mask)) modified = 1; y->know |= mask; y->value |= mask; } else if((y->know & mask) && !(y->value & mask)) { if(!(x->know & mask)) modified = 1; x->know |= mask; x->value |= mask; }; } else if(!(z->know & mask) && ((x->know & mask) || (y->know & mask))) { if((x->know & mask) && (x->value & mask)) { modified = 1; z->know |= mask; z->value |= mask; } else if((y->know & mask) && (y->value & mask)) { modified = 1; z->know |= mask; z->value |= mask; } else if((x->know & mask) && (y->know & mask))// normelement le deux sont a 0 { modified = 1; z->know |= mask; z->value &= ~mask; } }; //on check les erreur if((z->know & mask) && (x->know & mask) && (y->know & mask)) { if((z->value & mask) != ((x->value & mask) | (y->value & mask))) { if(!(flagerror & mask)) { flagerror |= mask; savedepth(1); } error = 1; } } mask = mask<<1; } return modified; } bool qbyte::multi(qbyte &un,unsigned int entier) { bool ret; error |= un.error ; if(error) return 0; ret = checkmulti(&(un.me),entier,&(this->me)); copyrealvalue(); return ret; } bool qbyte::add(qbyte &un,qbyte &deux) { bool ret; error |= un.error | deux.error; /*if(error) return 0;*/ ret = checkbitforadd(&(un.me),&(deux.me),&(this->me)); copyrealvalue(); return ret; } bool qbyte::xor(qbyte &un,qbyte &deux) { bool ret; error |= un.error | deux.error; /*if(error) return 0;*/ ret = checkbitforxor(&(un.me),&(deux.me),&(this->me)); copyrealvalue(); return ret; } bool qbyte::and(qbyte &un,qbyte &deux) { bool ret; error |= un.error | deux.error; /*if(error) return 0;*/ ret = checkbitforand(&(un.me),&(deux.me),&(this->me)); copyrealvalue(); return ret; } bool qbyte::or(qbyte &un,qbyte &deux) { bool ret; error |= un.error | deux.error; /*if(error) return 0;*/ ret = checkbitforor(&(un.me),&(deux.me),&(this->me)); copyrealvalue(); return ret; } bool qbyte::no(qbyte &un) { bool modified=0; unsigned int mask=0x01; unsigned int tmp; struct quantique *x; increment(); x = &(un.me); tmp = me.know & x->know; if((me.value & tmp) != (~(x->value) & tmp) ) { savedepth(); error = 1; } for(unsigned int cpt = 0;cpt<32;cpt++) { if((me.know & mask) && !(x->know & mask)) { modified = 1; x->know |= mask; if(me.value & mask) x->value &= ~mask; else x->value |= mask; } else if(!(me.know & mask) && (x->know & mask)) { modified = 1; x->know |= mask; if(x->value & mask) me.value &= ~mask; else me.value |= mask; }; if( (me.know & mask) && (x->know & mask) && ((me.value & mask) != (~(x->value) & mask)) ) { savedepth(1); error = 1; } mask = mask << 1; } copyrealvalue(); return modified; } void qbyte::no() { me.value = ~(me.value); me.value &= me.know; copyrealvalue(); } bool qbyte::checkfusion(struct quantique *x,struct quantique *y) { bool modified=0; unsigned int mask=0x01; increment(); for(unsigned int cpt = 0;cpt<32;cpt++) { if(x->know & mask) { if((y->know & mask) && ((x->value & mask) != (y->value & mask)) ) { savedepth(1); error = 1; } if(!(y->know & mask)) modified = 1; y->know |= mask; if(x->value & mask) y->value |= mask; else y->value &= ~mask; } else if(y->know & mask) { modified = 1; x->know |= mask; if(y->value & mask) x->value |= mask; else x->value &= ~mask; } mask = mask << 1; } return modified; } bool qbyte::fusion(qbyte &of) { bool modified=0; modified = checkfusion(&(of.me),&(this->me)); copyrealvalue(); return modified; } void qbyte::copy(qbyte &a) { me.value = a.me.value; me.know = a.me.know; if(copyerror) this->error = a.error; copyrealvalue(); } void qbyte::setbit(unsigned int number,bool value) { me.know |= (0x01<value = me.value; this->know = me.know; } void qbyte::setvalue() { me.value = this->value & this->know ; me.know = this->know; } void qbyte::setvalue(unsigned int v) { me.value = v; me.know = 0xffffffff; } void qbyte::leftrotation(unsigned int nb) { if(!(nb %32)) return; me.value = ( ((me.value) << (nb)) | ((me.value) >> (32-(nb))) ); me.know = ( ((me.know) << (nb)) | ((me.know) >> (32-(nb))) ); copyrealvalue(); } void qbyte::rightrotation(unsigned int nb) { if(!(nb %32)) return; me.value = (((me.value) >> (nb)) | ((me.value) << (32-(nb)))); me.know = (((me.know) >> (nb)) | ((me.know) << (32-(nb)))); copyrealvalue(); } void qbyte::leftdecalage(unsigned int nb) { me.value = me.value << nb; me.know = me.know << nb; copyrealvalue(); } void qbyte::rightdecalage(unsigned int nb) { me.value = me.value >> nb; me.know = me.know >> nb; copyrealvalue(); } //surcharge des operateurs //a debugguer ... surtout le return modif faut checker que les entrée/sorie qui pourrait avoir changer bool qbyte::pyramide(struct quantparam *list,char type) { struct quantique abc[MAX_ADD][MAX_ADD/2]; unsigned char endessous[MAX_ADD]; unsigned char nbporte[MAX_ADD]; unsigned char cpt,ptr,hauteur,tmp; bool modified=0; bool ret; ret =0; if(list->nb < 3) { switch(type) { case '+': return checkbitforadd(list->wesh[0],list->wesh[1],&(this->me)); case '|': return checkbitforor(list->wesh[0],list->wesh[1],&(this->me)); case '&': return checkbitforand(list->wesh[0],list->wesh[1],&(this->me)); case '^': return checkbitforxor(list->wesh[0],list->wesh[1],&(this->me)); case '*': return checkmulti(list->wesh[0],(unsigned int) list->wesh[1],&(this->me)); } return 0; } for(cpt=0;cptnb/2; if(hauteur %2) hauteur++; hauteur -= 2; hauteur = hauteur/2; tmp = list->nb; if(tmp%2) { abc[(tmp/2)+1][0] = *(list->wesh[tmp]); endessous[0] = tmp; tmp = tmp /2; nbporte[0] = tmp; tmp++; } else { tmp = tmp /2; nbporte[0] = tmp; } for(unsigned char ok=0;ok < list->nb;ok+=2) { switch(type) { case '+': checkbitforadd(list->wesh[ok],list->wesh[ok+1],&(abc[ok/2][0])); break; case '|': checkbitforor(list->wesh[ok],list->wesh[ok+1],&(abc[ok/2][0])); break; case '&': checkbitforand(list->wesh[ok],list->wesh[ok+1],&(abc[ok/2][0])); break; case '^': checkbitforxor(list->wesh[ok],list->wesh[ok+1],&(abc[ok/2][0])); break; } } for(cpt = 0;cpt < hauteur;cpt++) { if(tmp%2) { abc[(tmp/2)+1][cpt+1] = abc[tmp][cpt]; endessous[cpt+1] = tmp; tmp = tmp /2; nbporte[cpt+1] = tmp; tmp++; } else { tmp = tmp /2; nbporte[cpt+1] = tmp; } for(ptr=0;ptr < nbporte[cpt+1];ptr++) { switch(type) { case '+': checkbitforadd(&(abc[ptr*2][cpt]),&(abc[(ptr*2)+1][cpt]),&(abc[ptr][cpt+1])); break; case '|': checkbitforor(&(abc[ptr*2][cpt]),&(abc[(ptr*2)+1][cpt]),&(abc[ptr][cpt+1])); break; case '&': checkbitforand(&(abc[ptr*2][cpt]),&(abc[(ptr*2)+1][cpt]),&(abc[ptr][cpt+1])); break; case '^': checkbitforxor(&(abc[ptr*2][cpt]),&(abc[(ptr*2)+1][cpt]),&(abc[ptr][cpt+1])); break; } } } switch(type) { case '+': if(checkbitforadd(&(abc[0][cpt]),&(abc[1][cpt]),&(this->me))) modified = 1; break; case '|': if(checkbitforor(&(abc[0][cpt]),&(abc[1][cpt]),&(this->me))) modified = 1; break; case '&': if(checkbitforand(&(abc[0][cpt]),&(abc[1][cpt]),&(this->me))) modified = 1; break; case '^': if(checkbitforxor(&(abc[0][cpt]),&(abc[1][cpt]),&(this->me))) modified = 1; break; } //on refait dans l'autre sens peut etre on aura pas besoin de boucler ^^ a verifier if(endessous[cpt] != 0xff) abc[endessous[cpt]][cpt-1] = abc[1][cpt]; for(;cpt;cpt--) { for(ptr=0; ptr < nbporte[cpt];ptr++) { switch(type) { case '+': checkbitforadd(&(abc[ptr*2][cpt-1]),&(abc[(ptr*2)+1][cpt-1]),&(abc[ptr][cpt])); break; case '|': checkbitforor(&(abc[ptr*2][cpt-1]),&(abc[(ptr*2)+1][cpt-1]),&(abc[ptr][cpt])); break; case '&': checkbitforand(&(abc[ptr*2][cpt-1]),&(abc[(ptr*2)+1][cpt-1]),&(abc[ptr][cpt])); break; case '^': checkbitforxor(&(abc[ptr*2][cpt-1]),&(abc[(ptr*2)+1][cpt-1]),&(abc[ptr][cpt])); break; } } if(endessous[cpt] != 0xff) abc[endessous[cpt]][cpt-1] = abc[ptr+1][cpt]; } if(endessous[0] != 0xff) *(list->wesh[tmp]) = abc[nbporte[cpt]][0]; for(unsigned char ok=0;ok < list->nb;ok+=2) { switch(type) { case '+': if(checkbitforadd(list->wesh[ok],list->wesh[ok+1],&(abc[ok/2][0]))) modified = 1; break; case '|': if(checkbitforor(list->wesh[ok],list->wesh[ok+1],&(abc[ok/2][0]))) modified = 1; break; case '&': if(checkbitforand(list->wesh[ok],list->wesh[ok+1],&(abc[ok/2][0]))) modified = 1; break; case '^': if(checkbitforxor(list->wesh[ok],list->wesh[ok+1],&(abc[ok/2][0]))) modified = 1; break; } } }while(modified); delete[] (char *)list; return ret; } struct quantparam *qbyte::newlist(qbyte &a,char type) { struct quantparam *abc; abc = (struct quantparam *) new char[PARAM_LIST_SIZE_BASE + (sizeof(struct quantique *)*2)]; abc->size = PARAM_LIST_SIZE_BASE + (sizeof(struct quantique *)*2); abc->type = type; abc->nb = 2; abc->error = this->error | a.error; abc->wesh[0] = &(this->me); abc->wesh[1] = &(a.me); return abc; } struct quantparam *qbyte::addtolist(struct quantparam * list,char type) { struct quantparam *tmp; if(type != list->type) { cout <<"wesh lascar, on supporte pas trop les melange sur ste version modif ton code la lib fait un exit(0); la:P"<size + sizeof(struct quantique *)]; memcpy(tmp,list,list->size); tmp->wesh[list->nb] = &(this->me); delete[] (char *)list; tmp->nb++; return tmp; } struct quantparam * qbyte::operator + (qbyte &a) { return newlist(a,'+'); } struct quantparam * qbyte::operator + (struct quantparam * list) { return addtolist(list,'+'); } bool qbyte::operator = (struct quantparam *list) { return pyramide(list,list->type); } bool qbyte::operator = (qbyte &a) { return fusion(a); } struct quantparam * qbyte::operator | (qbyte &a) { return newlist(a,'|'); } struct quantparam * qbyte::operator | (struct quantparam * list) { return addtolist(list,'|'); } struct quantparam * qbyte::operator & (qbyte &a) { return newlist(a,'&'); } struct quantparam * qbyte::operator & (struct quantparam * list) { return addtolist(list,'&'); } struct quantparam * qbyte::operator ^ (qbyte &a) { return newlist(a,'^'); } struct quantparam * qbyte::operator ^ (struct quantparam * list) { return addtolist(list,'^'); } struct quantparam * qbyte::operator * (unsigned int constante) { struct quantparam *abc; abc = (struct quantparam *) new char[PARAM_LIST_SIZE_BASE + (sizeof(struct quantique *)*2)]; abc->size = PARAM_LIST_SIZE_BASE + (sizeof(struct quantique *)*2); abc->type = '*'; abc->nb = 2; abc->error = this->error ; abc->wesh[0] = &(this->me); abc->wesh[1] = (struct quantique *) constante; return abc; } //profondeur d'erreur ... void qbyte::increment() { if(!enable) return; if(saved) { //redzone++; return ; } if(compteur == ~0x00) compteur2++; compteur++; } void qbyte::savedepth() { savedepth(0); } void qbyte::savedepth(bool b) { if(!enable) return; if(saved) { if(b) redzone++; return; } profondeur = compteur; profondeur2 = compteur2; ldepth = compteur; hdepth = compteur2; saved = 1; redzone = 1; } bool qbyte::enabledepth() { reinitdepth(); if(enable) return 0; enable = 1; return 1; } bool qbyte::depthisenable() { return enable; } bool qbyte::disabledepth() { if(!enable) return 0; enable = 0; reinitdepth(); return 1; } void qbyte::reinitdepth() { compteur = 0; compteur2 = 0; profondeur = 0; profondeur2 = 0; ldepth = 0; hdepth = 0; redzone = 0; saved = 0; } unsigned int qbyte::getldepth() { if(saved) return profondeur; else return compteur; } unsigned int qbyte::gethdepth() { if(saved) return profondeur2; else return compteur2; } unsigned int qbyte::getredzone() { return redzone; } bool qbyte::depthsaved() { return saved; } bool qbyte::enablecopyerror() { if(copyerror) return 0; copyerror = 1; return 1; } bool qbyte::disablecopyerror() { if(!copyerror) return 0; copyerror = 0; return 1; }