AEProtocol.h
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014 #ifndef _AEPROTOCOL_H_
00015 #define _AEPROTOCOL_H_
00016
00017 #include "Word.h"
00018 #include "ThLeftNormalForm.h"
00019 #include <vector>
00020 #include <utility>
00021
00022 using namespace std;
00023
00024 class TTPTuple;
00025
00027
00028
00029
00031
00032
00033
00034
00035
00036
00037
00038
00039
00041 struct TTP_Conf{
00042
00043 int nBL;
00044 int nBR;
00045 int N;
00046 int nGamma;
00047
00048 int len_z;
00049 int len_w;
00050
00051 friend ostream& operator << (ostream& out, const TTP_Conf& ttp_conf){
00052
00053 int len_z = 20;
00054 int len_w = 20;
00055 out << " #BL :" << ttp_conf.nBL << endl;
00056 out << " #BR :" << ttp_conf.nBR << endl;
00057 out << " N :" << ttp_conf.N << endl;
00058 out << " Gamma :" << ttp_conf.nGamma << endl;
00059 out << " len z :" << ttp_conf.len_z << endl;
00060 out << " len w :" << ttp_conf.len_w << endl;
00061
00062 return out;
00063 }
00064
00065 };
00066
00067
00068
00069
00070
00071
00072
00073
00075 class BSets
00076 {
00077 public:
00078 vector<Word> BL;
00079 vector<Word> BR;
00080
00082 static BSets generateRandom(int N);
00084 static BSets generateEqual(int N);
00085
00087 friend ostream& operator << ( ostream& out, const BSets& bs ) {
00088 out << "BL{ ";
00089 for (int i=0;i<bs.BL.size();i++)
00090 out << bs.BL[i] << " , ";
00091 out << "} BR{ ";
00092 for (int i=0;i<bs.BR.size();i++)
00093 out << bs.BR[i] << " , ";
00094 out << "}";
00095
00096 return out;
00097 }
00098
00099 };
00100
00101
00102
00103
00104
00105
00106
00108 class TTPTuple
00109 {
00110 public:
00111 TTPTuple( ) {}
00112 TTPTuple( const vector< Word >& L, const vector< Word >& R):
00113 WL( L ),
00114 WR( R ) {}
00115
00116 TTPTuple( const vector< Word >& L, const vector< Word >& R, const Word& conj):
00117 WL( L ),
00118 WR( R ),
00119 z( conj) {}
00120
00121 vector<Word> WL;
00122 vector<Word> WR;
00123
00124
00126 int length() const;
00128 void shorten( int N );
00130
00134 bool testTuples( int N, bool details )const ;
00135
00137 bool shortAndTestTuples( int N, bool details=false ) {
00138 shorten( N );
00139 return testTuples( N,details );
00140 }
00141
00143 friend bool operator < ( const TTPTuple& t1, const TTPTuple& t2 ) {
00144 return t1.WL < t2.WL && t1.WR < t2.WR;
00145 }
00146
00147
00148 Word z;
00149 private:
00150 vector<Word> origWL;
00151 vector<Word> origWR;
00152 };
00153
00155
00156
00157
00159
00160
00161
00162
00163
00164
00165
00166
00167 class MatrixFp
00168 {
00169 public:
00170 MatrixFp( int n, int p ): the_n( n ), the_p( p ) { init(); }
00171 ~MatrixFp() { clean(); }
00172 MatrixFp( const MatrixFp& m );
00173 MatrixFp& operator = (const MatrixFp& m);
00174
00175 inline MatrixFp operator + ( const MatrixFp& w ) const;
00176 inline MatrixFp operator * ( const MatrixFp& w ) const;
00177 inline MatrixFp scalar_mult( int l ) const;
00178 MatrixFp getPower( int e )const;
00179
00180 static MatrixFp random( int n, int p );
00181 static MatrixFp ID( int n, int p );
00182
00183 void set(int i,int j, int v) {
00184 theMatrix[i][j] = v;
00185 }
00186 private:
00187
00188
00189 void init();
00190 void clean();
00191
00192 int the_n;
00193 int the_p;
00194
00195 vector< vector<int> > theMatrix;
00196 };
00197
00198 typedef pair<MatrixFp,Permutation> ProdElement;
00199 typedef pair<int,Permutation> BurauGenerator;
00200
00201
00202 class AEKeyExchange
00203 {
00204 public:
00205 AEKeyExchange( int n,int p, const TTPTuple& ttpt ):
00206 the_n( n ),
00207 the_p( p ),
00208 theTTPTuple( ttpt ),
00209 M0( MatrixFp::random(n,p) )
00210 {
00211 }
00212
00213 ProdElement alicePublicKey() {
00214 int r = 10;
00215 int m = 10;
00216 int wl = 10;
00217 generatePublicKey( theTTPTuple.WL , r , m , wl );
00218 }
00219 ProdElement bobPublicKey() {
00220 int r = 10;
00221 int m = 10;
00222 int wl = 10;
00223 generatePublicKey( theTTPTuple.WR , r , m , wl );
00224 }
00225
00226
00227 static TTPTuple generateTuples( const TTP_Conf& ttp_conf , const BSets& bs);
00228
00229 private:
00230
00231 ProdElement starMult( const ProdElement& pe, const BurauGenerator& bg );
00232 ProdElement generatePublicKey( const vector<Word>& v, int r, int m, int wl );
00233
00234 int the_n;
00235 int the_p;
00236 TTPTuple theTTPTuple;
00237 MatrixFp M0;
00238 };
00239 #endif