http://git-wip-us.apache.org/repos/asf/incubator-milagro-crypto/blob/1add7560/version22/rust/src/gcm.rs
----------------------------------------------------------------------
diff --git a/version22/rust/src/gcm.rs b/version22/rust/src/gcm.rs
deleted file mode 100644
index 32e2749..0000000
--- a/version22/rust/src/gcm.rs
+++ /dev/null
@@ -1,356 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-
-const GCM_NB:usize=4;
-const GCM_ACCEPTING_HEADER:usize=0;
-const GCM_ACCEPTING_CIPHER:usize=1;
-const GCM_NOT_ACCEPTING_MORE:usize=2;
-const GCM_FINISHED:usize=3;
-const GCM_ENCRYPTING:usize=0;
-const GCM_DECRYPTING:usize=1;
-
-use aes;
-use aes::AES;
-
-pub struct GCM {
-       table: [[u32;4];128],
-       statex: [u8;16],
-       y_0: [u8;16],
-//     counter: usize,
-       lena:[u32;2],
-       lenc:[u32;2],
-       status:usize,
-       a:AES
-}
-
-impl GCM {
-
-       fn pack(b: [u8;4]) -> u32 { /* pack bytes into a 32-bit Word */
-        return ((((b[0])&0xff) as u32)<<24)|((((b[1])&0xff) as 
u32)<<16)|((((b[2])&0xff) as u32)<<8)|(((b[3])&0xff) as u32);
-       }
-  
-       fn unpack(a: u32) -> [u8;4] { /* unpack bytes from a word */
-        let b:[u8;4]=[((a>>24)&0xff) as u8,((a>>16)&0xff) as u8,((a>>8)&0xff) 
as u8,(a&0xff) as u8];
-               return b;
-       }
-
-       fn precompute(&mut self,h: &[u8]) {
-               let mut b:[u8;4]=[0;4];
-        let mut j=0;
-        for i in 0..GCM_NB {
-            b[0]=h[j]; b[1]=h[j+1]; b[2]=h[j+2]; b[3]=h[j+3];
-            self.table[0][i]=GCM::pack(b);
-            j+=4;
-        }
-        for i in 1..128 {
-               let mut c:u32=0;
-            for j in 0..GCM_NB {self.table[i][j]=c|(self.table[i-1][j])>>1; 
c=self.table[i-1][j]<<31;}
-            if c != 0  {self.table[i][0]^=0xE1000000} /* irreducible 
polynomial */
-        }          
-       }
-
-       fn gf2mul(&mut self) { /* gf2m mul - Z=H*X mod 2^128 */
-        let mut p:[u32;4]=[0;4]; 
-    
-        for i in 0..4 {p[i]=0}
-        let mut j:usize=8; 
-        let mut m=0;
-        for i in 0..128 {
-               j-=1;
-            let mut c=((self.statex[m]>>j)&1) as u32; c= (!c) +1;
-               for k in 0..GCM_NB {p[k]^=self.table[i][k]&c}
-            if j==0 {
-                               j=8; m+=1;
-                if m==16 {break}
-            }
-        }
-        j=0;
-        for i in 0..GCM_NB {
-            let b=GCM::unpack(p[i]);
-            self.statex[j]=b[0]; self.statex[j+1]=b[1]; self.statex[j+2]=b[2]; 
self.statex[j+3]=b[3];
-            j+=4;
-        }
-       }
-
-       fn wrap(&mut self) { /* Finish off GHASH */
-        let mut f:[u32;4]=[0;4]; 
-        let mut el:[u8;16]=[0;16];  
-   
-    /* convert lengths from bytes to bits */
-        f[0]=(self.lena[0]<<3)|(self.lena[1]&0xE0000000)>>29;
-        f[1]=self.lena[1]<<3;
-        f[2]=(self.lenc[0]<<3)|(self.lenc[1]&0xE0000000)>>29;
-        f[3]=self.lenc[1]<<3;
-        let mut j=0;
-        for i in 0..GCM_NB {
-            let b=GCM::unpack(f[i]);
-            el[j]=b[0]; el[j+1]=b[1]; el[j+2]=b[2]; el[j+3]=b[3];
-            j+=4;
-        }
-        for i in 0..16 {self.statex[i]^=el[i]}
-        self.gf2mul();
-       }
-
-       fn ghash(&mut self,plain: &[u8],len: usize) -> bool {
-        if self.status==GCM_ACCEPTING_HEADER {self.status=GCM_ACCEPTING_CIPHER}
-        if self.status != GCM_ACCEPTING_CIPHER {return false}
-        
-        let mut j=0;
-        while j<len {
-            for i in 0..16 {
-               if j>=len {break}
-                               self.statex[i]^=plain[j]; j+=1;
-                self.lenc[1]+=1; if self.lenc[1]==0 {self.lenc[0]+=1}
-            }
-            self.gf2mul();
-        }
-        if len%16 != 0 {self.status=GCM_NOT_ACCEPTING_MORE}
-        return true;
-    }
-
-    /* Initialize GCM mode */
-       pub fn init(&mut self,nk: usize,key: &[u8],niv: usize,iv: &[u8]) { /* 
iv size niv is usually 12 bytes (96 bits). AES key size nk can be 16,24 or 32 
bytes */
-               let mut h:[u8;16]=[0;16];
-    
-        for i in 0..16 {h[i]=0; self.statex[i]=0}
-        
-               self.a=AES::new();
-
-        self.a.init(aes::ECB,nk,key,None);
-        self.a.ecb_encrypt(&mut h);    /* E(K,0) */
-        self.precompute(&h);
-        
-        self.lena[0]=0;self.lenc[0]=0;self.lena[1]=0;self.lenc[1]=0;
-        if niv==12 {
-            for i in 0..12 {self.a.f[i]=iv[i]}
-            let b=GCM::unpack(1);
-            self.a.f[12]=b[0]; self.a.f[13]=b[1]; self.a.f[14]=b[2]; 
self.a.f[15]=b[3];  /* initialise IV */
-            for i in 0..16 {self.y_0[i]=self.a.f[i]}
-        } else {
-            self.status=GCM_ACCEPTING_CIPHER;
-            self.ghash(iv,niv); /* GHASH(H,0,IV) */
-            self.wrap();
-            for i in 0..16 
{self.a.f[i]=self.statex[i];self.y_0[i]=self.a.f[i];self.statex[i]=0}
-            self.lena[0]=0;self.lenc[0]=0;self.lena[1]=0;self.lenc[1]=0;
-        }
-        self.status=GCM_ACCEPTING_HEADER;
-       }
-
-       pub fn new() -> GCM {
-               GCM {
-                       table:[[0;4];128],
-                       statex:[0;16],
-                       y_0:[0;16],
-                       //counter:0,
-                       lena:[0;2],
-                       lenc:[0;2],
-                       status:0,
-                       a:AES::new()
-               }
-       }
-
-/* Add Header data - included but not encrypted */
-       pub fn add_header(&mut self,header: &[u8],len: usize) -> bool { /* Add 
some header. Won't be encrypted, but will be authenticated. len is length of 
header */
-        if self.status != GCM_ACCEPTING_HEADER {return false}
-        let mut j=0;
-        while j<len {
-            for i in 0..16 {
-               if j>=len {break}
-                               self.statex[i]^=header[j]; j+=1;
-                self.lena[1]+=1; if self.lena[1]==0 {self.lena[0]+=1}
-            }
-            self.gf2mul();
-        }
-        if len%16 != 0 {self.status=GCM_ACCEPTING_CIPHER}
-        return true;
-    }
-
-/* Add Plaintext - included and encrypted */
-       pub fn add_plain(&mut self,cipher: &mut [u8],plain: &[u8],len: usize) 
-> bool {
-               let mut cb:[u8;16]=[0;16]; 
-               let mut b:[u8;4]=[0;4];
-       
-        let mut counter: u32;
-        if self.status == GCM_ACCEPTING_HEADER 
{self.status=GCM_ACCEPTING_CIPHER}
-        if self.status != GCM_ACCEPTING_CIPHER {return false}
-        
-        let mut j=0;
-        while j<len {
-            b[0]=self.a.f[12]; b[1]=self.a.f[13]; b[2]=self.a.f[14]; 
b[3]=self.a.f[15];
-            counter=GCM::pack(b);
-            counter+=1;
-            b=GCM::unpack(counter);
-            self.a.f[12]=b[0]; self.a.f[13]=b[1]; self.a.f[14]=b[2]; 
self.a.f[15]=b[3]; /* increment counter */
-            for i in 0..16 {cb[i]=self.a.f[i]}
-            self.a.ecb_encrypt(&mut cb);        /* encrypt it  */
-    
-            for i in 0..16 {
-               if j>=len {break}
-                               cipher[j]=plain[j]^cb[i];
-                               self.statex[i]^=cipher[j]; j+=1;
-                self.lenc[1]+=1; if self.lenc[1]==0 {self.lenc[0]+=1}
-            }
-            self.gf2mul()
-        }
-        if len%16 != 0 {self.status=GCM_NOT_ACCEPTING_MORE}
-        return true;
-       }
-
-/* Add Ciphertext - decrypts to plaintext */
-       pub fn add_cipher(&mut self,plain: &mut [u8],cipher: &[u8],len: usize) 
-> bool {
-               let mut cb:[u8;16]=[0;16]; 
-               let mut b:[u8;4]=[0;4];
-        
-       let mut counter: u32;
-        
-        if self.status==GCM_ACCEPTING_HEADER {self.status=GCM_ACCEPTING_CIPHER}
-        if self.status != GCM_ACCEPTING_CIPHER {return false}
-    
-        let mut j=0;
-        while j<len {
-            b[0]=self.a.f[12]; b[1]=self.a.f[13]; b[2]=self.a.f[14]; 
b[3]=self.a.f[15];
-            counter=GCM::pack(b);
-            counter+=1;
-            b=GCM::unpack(counter);
-            self.a.f[12]=b[0]; self.a.f[13]=b[1]; self.a.f[14]=b[2]; 
self.a.f[15]=b[3]; /* increment counter */
-            for i in 0..16 {cb[i]=self.a.f[i]}
-            self.a.ecb_encrypt(&mut cb);        /* encrypt it  */
-            for i in 0..16 {
-               if j>=len {break}
-                               let oc=cipher[j];
-                               plain[j]=cipher[j]^cb[i];
-                               self.statex[i]^=oc; j+=1;
-                self.lenc[1]+=1; if self.lenc[1]==0 {self.lenc[0]+=1}
-            }
-            self.gf2mul()
-        }
-        if len%16 != 0 {self.status=GCM_NOT_ACCEPTING_MORE}
-        return true;
-       }
-
-/* Finish and extract Tag */
-       pub fn finish(&mut self,extract: bool) -> [u8;16]  { /* Finish off 
GHASH and extract tag (MAC) */
-               let mut tag:[u8;16]=[0;16]; 
-    
-        self.wrap();
-        /* extract tag */
-        if extract {
-            self.a.ecb_encrypt(&mut (self.y_0));        /* E(K,Y0) */
-            for i in 0..16 {self.y_0[i]^=self.statex[i]}
-            for i in 0..16 {tag[i]=self.y_0[i];self.y_0[i]=0;self.statex[i]=0}
-        }
-        self.status=GCM_FINISHED;
-        self.a.end();
-        return tag;
-       }
-
-       pub fn hex2bytes(hex: &[u8],bin: &mut [u8]) {
-               let len=hex.len();
-
-               for i in 0..len/2 {
-                       let mut v:u8;
-               let mut c = hex[2*i];
-               if c >= b'0' && c <= b'9' {
-               v = c - b'0';
-               } else if c >= b'A' && c <= b'F' {
-               v = c - b'A' + 10;
-               } else if c >= b'a' && c <= b'f' {
-               v = c - b'a' + 10;
-               } else {
-               v = 0;
-               }
-               v <<= 4;
-               c = hex[2*i + 1];
-               if c >= b'0' && c <= b'9' {
-               v += c - b'0';
-               } else if c >= b'A' && c <= b'F' {
-               v += c - b'A' + 10;
-               } else if c >= b'a' && c <= b'f' {
-               v += c - b'a' + 10;
-               } else {
-               v = 0;
-               }
-               bin[i] = v;
-       }
-       }
-
-}
-/*
-fn main()
-{
-       let kt=b"feffe9928665731c6d6a8f9467308308";
-       let 
mt=b"d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39";
-       let ht=b"feedfacedeadbeeffeedfacedeadbeefabaddad2";
-       let 
nt=b"9313225df88406e555909c5aff5269aa6a7a9538534f7da1e4c303d2a318a728c3c0c95156809539fcf0e2429a6b525416aedbf5a0de6a57a637b39b";
-// Tag should be 619cc5aefffe0bfa462af43c1699d050
-
-       let mut gcm=GCM::new();
-
-       let len=mt.len()/2;
-       let lenh=ht.len()/2;
-       let lenk=kt.len()/2;
-       let leniv=nt.len()/2;
-
-       //let mut t:[u8;16]=[0;16];     // Tag
-       let mut k:[u8;16]=[0;16];   // AES Key
-       let mut h:[u8;64]=[0;64];       // Header - to be included in 
Authentication, but not encrypted
-       let mut n:[u8;100]=[0;100];     // IV - Initialisation vector
-       let mut m:[u8;100]=[0;100];     // Plaintext to be 
encrypted/authenticated
-       let mut c:[u8;100]=[0;100];     // Ciphertext
-       let mut p:[u8;100]=[0;100];     // Recovered Plaintext 
-
-       GCM::hex2bytes(mt,&mut m);
-       GCM::hex2bytes(ht,&mut h);
-       GCM::hex2bytes(kt,&mut k);
-       GCM::hex2bytes(nt,&mut n);
-
-       println!("Plaintext=");
-       for i in 0..len {print!("{:02x}",m[i])}
-       println!("");
-
-       gcm.init(lenk,&k,leniv,&n);
-       
-       gcm.add_header(&h,lenh);
-       gcm.add_plain(&mut c,&m,len);
-       let mut t=gcm.finish(true);
-
-       println!("Ciphertext=");
-       for i in 0..len {print!("{:02x}",c[i])}
-       println!("");
-  
-       println!("Tag=");
-       for i in 0..16 {print!("{:02x}",t[i])}
-       println!("");
-
-       gcm.init(lenk,&k,leniv,&n);
-       
-       gcm.add_header(&h,lenh);
-       gcm.add_cipher(&mut p,&c,len);
-       t=gcm.finish(true);
-
-       println!("Plaintext=");
-       for i in 0..len {print!("{:02x}",p[i])}
-       println!("");
-
-       println!("Tag=");
-       for i in 0..16 {print!("{:02x}",t[i])}
-       println!("");
-
-}
-*/

http://git-wip-us.apache.org/repos/asf/incubator-milagro-crypto/blob/1add7560/version22/rust/src/hash256.rs
----------------------------------------------------------------------
diff --git a/version22/rust/src/hash256.rs b/version22/rust/src/hash256.rs
deleted file mode 100644
index e2aca06..0000000
--- a/version22/rust/src/hash256.rs
+++ /dev/null
@@ -1,182 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-
-const HASH256_H0: u32=0x6A09E667;
-const HASH256_H1: u32=0xBB67AE85;
-const HASH256_H2: u32=0x3C6EF372;
-const HASH256_H3: u32=0xA54FF53A;
-const HASH256_H4: u32=0x510E527F;
-const HASH256_H5: u32=0x9B05688C;
-const HASH256_H6: u32=0x1F83D9AB;
-const HASH256_H7: u32=0x5BE0CD19;
-
-const HASH256_K : [u32;64]=[
-       
0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5,0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5,
-       
0xd807aa98,0x12835b01,0x243185be,0x550c7dc3,0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174,
-       
0xe49b69c1,0xefbe4786,0x0fc19dc6,0x240ca1cc,0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da,
-       
0x983e5152,0xa831c66d,0xb00327c8,0xbf597fc7,0xc6e00bf3,0xd5a79147,0x06ca6351,0x14292967,
-       
0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13,0x650a7354,0x766a0abb,0x81c2c92e,0x92722c85,
-       
0xa2bfe8a1,0xa81a664b,0xc24b8b70,0xc76c51a3,0xd192e819,0xd6990624,0xf40e3585,0x106aa070,
-       
0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5,0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3,
-       
0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208,0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2];
-
-
-pub struct HASH256 {
-       length: [u32;2],
-       h: [u32;8],
-       w: [u32;64]
-}
-
-impl HASH256 {
-       fn s(n: u32,x: u32) -> u32 {
-               return ((x)>>n) | ((x)<<(32-n));
-       }
-       fn r(n: u32,x: u32) -> u32 {
-               return (x)>>n;
-       }
-
-       fn ch(x: u32,y: u32,z: u32) -> u32 {
-               return (x&y)^(!(x)&z);
-       }
-
-       fn maj(x: u32,y: u32,z: u32) -> u32 {
-               return (x&y)^(x&z)^(y&z);
-       }
-       fn sig0(x: u32) -> u32 {
-               return HASH256::s(2,x)^HASH256::s(13,x)^HASH256::s(22,x);
-       }
-
-       fn sig1(x: u32) -> u32 {
-               return HASH256::s(6,x)^HASH256::s(11,x)^HASH256::s(25,x);
-       }
-
-       fn theta0(x: u32) -> u32 {
-               return HASH256::s(7,x)^HASH256::s(18,x)^HASH256::r(3,x);
-       }
-
-       fn theta1(x: u32) -> u32 {
-               return HASH256::s(17,x)^HASH256::s(19,x)^HASH256::r(10,x);
-       }
-
-       fn transform(&mut self) { /* basic transformation step */
-               for j in 16..64 {
-                       
self.w[j]=HASH256::theta1(self.w[j-2]).wrapping_add(self.w[j-7]).wrapping_add(HASH256::theta0(self.w[j-15])).wrapping_add(self.w[j-16]);
-               }
-               let mut a=self.h[0]; let mut b=self.h[1]; let mut c=self.h[2]; 
let mut d=self.h[3];
-               let mut e=self.h[4]; let mut f=self.h[5]; let mut g=self.h[6]; 
let mut hh=self.h[7];
-               for j in 0..64 { /* 64 times - mush it up */
-                       let 
t1=hh.wrapping_add(HASH256::sig1(e)).wrapping_add(HASH256::ch(e,f,g)).wrapping_add(HASH256_K[j]).wrapping_add(self.w[j]);
-                       let 
t2=HASH256::sig0(a).wrapping_add(HASH256::maj(a,b,c));
-                       hh=g; g=f; f=e;
-                       e=d.wrapping_add(t1);
-                       d=c;
-                       c=b;
-                       b=a;
-                       a=t1.wrapping_add(t2);
-               }
-               self.h[0] = self.h[0].wrapping_add(a);
-               self.h[1] = self.h[1].wrapping_add(b);
-               self.h[2] = self.h[2].wrapping_add(c);
-               self.h[3] = self.h[3].wrapping_add(d);
-               self.h[4] = self.h[4].wrapping_add(e);
-               self.h[5] = self.h[5].wrapping_add(f);
-               self.h[6] = self.h[6].wrapping_add(g);
-               self.h[7] = self.h[7].wrapping_add(hh);
-       }
-
-/* Initialise Hash function */
-       pub fn init(&mut self) { /* initialise */
-               for i in 0..64 {self.w[i]=0}
-               self.length[0]=0; self.length[1]=0;
-               self.h[0]=HASH256_H0;
-               self.h[1]=HASH256_H1;
-               self.h[2]=HASH256_H2;
-               self.h[3]=HASH256_H3;
-               self.h[4]=HASH256_H4;
-               self.h[5]=HASH256_H5;
-               self.h[6]=HASH256_H6;
-               self.h[7]=HASH256_H7;
-       }       
-
-       pub fn new() -> HASH256 {
-               let mut nh=HASH256 {
-                       length: [0;2],
-                       h: [0;8],
-                       w: [0;64]
-               };
-               nh.init();
-               return nh;
-       }
-
-/* process a single byte */
-       pub fn process(&mut self,byt: u8) { /* process the next message byte */
-               let cnt=((self.length[0]/32)%16) as usize;
-               self.w[cnt]<<=8;
-               self.w[cnt]|=(byt&0xFF) as u32;
-               self.length[0]+=8;
-               if self.length[0]==0 {self.length[1]+=1; self.length[0]=0}
-               if (self.length[0]%512)==0 {self.transform()}
-       }
-
-/* process an array of bytes */        
-       pub fn process_array(&mut self,b: &[u8]) {
-               for i in 0..b.len() {self.process((b[i]))}
-       }
-
-/* process a 32-bit integer */
-       pub fn process_num(&mut self,n: i32) {
-               self.process(((n>>24)&0xff) as u8);
-               self.process(((n>>16)&0xff) as u8);
-               self.process(((n>>8)&0xff) as u8);
-               self.process((n&0xff) as u8);
-       }
-
-/* Generate 32-byte Hash */
-       pub fn hash(&mut self) -> [u8;32] { /* pad message and finish - supply 
digest */
-               let mut digest:[u8;32]=[0;32];
-               let len0=self.length[0];
-               let len1=self.length[1];
-               self.process(0x80);
-               while (self.length[0]%512)!=448 {self.process(0)}
-               self.w[14]=len1;
-               self.w[15]=len0;    
-               self.transform();
-               for i in 0..32 { /* convert to bytes */
-                       digest[i]=((self.h[i/4]>>(8*(3-i%4))) & 0xff) as u8;
-               }
-               self.init();
-               return digest;
-       }
-}
-
-//248d6a61 d20638b8 e5c02693 0c3e6039 a33ce459 64ff2167 f6ecedd4 19db06c1
-/*
-fn main() {
-       let s = 
String::from("abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq");       
-       let test = s.into_bytes();
-       let mut sh=HASH256::new();
-
-       for i in 0..test.len(){
-               sh.process(test[i]);
-       }
-               
-       let digest=sh.hash();    
-       for i in 0..32 {print!("{:02x}",digest[i])}
-}
-*/

http://git-wip-us.apache.org/repos/asf/incubator-milagro-crypto/blob/1add7560/version22/rust/src/hash384.rs
----------------------------------------------------------------------
diff --git a/version22/rust/src/hash384.rs b/version22/rust/src/hash384.rs
deleted file mode 100644
index 2c8fc6f..0000000
--- a/version22/rust/src/hash384.rs
+++ /dev/null
@@ -1,188 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-
-const HASH384_H0: u64=0xcbbb9d5dc1059ed8;
-const HASH384_H1: u64=0x629a292a367cd507;
-const HASH384_H2: u64=0x9159015a3070dd17;
-const HASH384_H3: u64=0x152fecd8f70e5939;
-const HASH384_H4: u64=0x67332667ffc00b31;
-const HASH384_H5: u64=0x8eb44a8768581511;
-const HASH384_H6: u64=0xdb0c2e0d64f98fa7;
-const HASH384_H7: u64=0x47b5481dbefa4fa4;
-
-const HASH384_K : [u64;80]=[
-       
0x428a2f98d728ae22,0x7137449123ef65cd,0xb5c0fbcfec4d3b2f,0xe9b5dba58189dbbc,
-       
0x3956c25bf348b538,0x59f111f1b605d019,0x923f82a4af194f9b,0xab1c5ed5da6d8118,
-       
0xd807aa98a3030242,0x12835b0145706fbe,0x243185be4ee4b28c,0x550c7dc3d5ffb4e2,
-       
0x72be5d74f27b896f,0x80deb1fe3b1696b1,0x9bdc06a725c71235,0xc19bf174cf692694,
-       
0xe49b69c19ef14ad2,0xefbe4786384f25e3,0x0fc19dc68b8cd5b5,0x240ca1cc77ac9c65,
-       
0x2de92c6f592b0275,0x4a7484aa6ea6e483,0x5cb0a9dcbd41fbd4,0x76f988da831153b5,
-       
0x983e5152ee66dfab,0xa831c66d2db43210,0xb00327c898fb213f,0xbf597fc7beef0ee4,
-       
0xc6e00bf33da88fc2,0xd5a79147930aa725,0x06ca6351e003826f,0x142929670a0e6e70,
-       
0x27b70a8546d22ffc,0x2e1b21385c26c926,0x4d2c6dfc5ac42aed,0x53380d139d95b3df,
-       
0x650a73548baf63de,0x766a0abb3c77b2a8,0x81c2c92e47edaee6,0x92722c851482353b,
-       
0xa2bfe8a14cf10364,0xa81a664bbc423001,0xc24b8b70d0f89791,0xc76c51a30654be30,
-       
0xd192e819d6ef5218,0xd69906245565a910,0xf40e35855771202a,0x106aa07032bbd1b8,
-       
0x19a4c116b8d2d0c8,0x1e376c085141ab53,0x2748774cdf8eeb99,0x34b0bcb5e19b48a8,
-       
0x391c0cb3c5c95a63,0x4ed8aa4ae3418acb,0x5b9cca4f7763e373,0x682e6ff3d6b2b8a3,
-       
0x748f82ee5defb2fc,0x78a5636f43172f60,0x84c87814a1f0ab72,0x8cc702081a6439ec,
-       
0x90befffa23631e28,0xa4506cebde82bde9,0xbef9a3f7b2c67915,0xc67178f2e372532b,
-       
0xca273eceea26619c,0xd186b8c721c0c207,0xeada7dd6cde0eb1e,0xf57d4f7fee6ed178,
-       
0x06f067aa72176fba,0x0a637dc5a2c898a6,0x113f9804bef90dae,0x1b710b35131c471b,
-       
0x28db77f523047d84,0x32caab7b40c72493,0x3c9ebe0a15c9bebc,0x431d67c49c100d4c,
-       
0x4cc5d4becb3e42b6,0x597f299cfc657e2a,0x5fcb6fab3ad6faec,0x6c44198c4a475817];
-
-
-pub struct HASH384 {
-       length: [u64;2],
-       h: [u64;8],
-       w: [u64;80]
-}
-
-impl HASH384 {
-       fn s(n: u64,x: u64) -> u64 {
-               return ((x)>>n) | ((x)<<(64-n));
-       }
-       fn r(n: u64,x: u64) -> u64 {
-               return (x)>>n;
-       }
-
-       fn ch(x: u64,y: u64,z: u64) -> u64 {
-               return (x&y)^(!(x)&z);
-       }
-
-       fn maj(x: u64,y: u64,z: u64) -> u64 {
-               return (x&y)^(x&z)^(y&z);
-       }
-
-       fn sig0(x: u64) -> u64 {
-               return HASH384::s(28,x)^HASH384::s(34,x)^HASH384::s(39,x);
-       }
-
-       fn sig1(x: u64) -> u64 {
-               return HASH384::s(14,x)^HASH384::s(18,x)^HASH384::s(41,x);
-       }
-
-       fn theta0(x: u64) -> u64 {
-               return HASH384::s(1,x)^HASH384::s(8,x)^HASH384::r(7,x);
-       }
-
-       fn theta1(x: u64) -> u64 {
-               return HASH384::s(19,x)^HASH384::s(61,x)^HASH384::r(6,x);
-       }
-
-       fn transform(&mut self) { /* basic transformation step */
-               for j in 16..80 {
-                       
self.w[j]=HASH384::theta1(self.w[j-2])+self.w[j-7]+HASH384::theta0(self.w[j-15])+self.w[j-16];
-               }
-               let mut a=self.h[0]; let mut b=self.h[1]; let mut c=self.h[2]; 
let mut d=self.h[3]; 
-               let mut e=self.h[4]; let mut f=self.h[5]; let mut g=self.h[6]; 
let mut hh=self.h[7];
-               for j in 0..80 { /* 64 times - mush it up */
-                       let 
t1=hh+HASH384::sig1(e)+HASH384::ch(e,f,g)+HASH384_K[j]+self.w[j];
-                       let t2=HASH384::sig0(a)+HASH384::maj(a,b,c);
-                       hh=g; g=f; f=e;
-                       e=d+t1;
-                       d=c;
-                       c=b;
-                       b=a;
-                       a=t1+t2 ; 
-               }
-               self.h[0]+=a; self.h[1]+=b; self.h[2]+=c; self.h[3]+=d;
-               self.h[4]+=e; self.h[5]+=f; self.h[6]+=g; self.h[7]+=hh; 
-       }       
-
-/* Initialise Hash function */
-       pub fn init(&mut self) { /* initialise */
-               for i in 0..64 {self.w[i]=0}
-               self.length[0]=0; self.length[1]=0;
-               self.h[0]=HASH384_H0;
-               self.h[1]=HASH384_H1;
-               self.h[2]=HASH384_H2;
-               self.h[3]=HASH384_H3;
-               self.h[4]=HASH384_H4;
-               self.h[5]=HASH384_H5;
-               self.h[6]=HASH384_H6;
-               self.h[7]=HASH384_H7;
-       }       
-
-       pub fn new() -> HASH384 {
-               let mut nh=HASH384 {
-                       length: [0;2],
-                       h: [0;8],
-                       w: [0;80]
-               };
-               nh.init();
-               return nh;
-       }
-
-/* process a single byte */
-       pub fn process(&mut self,byt: u8) { /* process the next message byte */
-               let cnt=((self.length[0]/64)%16) as usize;
-               self.w[cnt]<<=8;
-               self.w[cnt]|=(byt&0xFF) as u64;
-               self.length[0]+=8;
-               if self.length[0]==0 {self.length[1]+=1; self.length[0]=0}
-               if (self.length[0]%1024)==0 {self.transform()}
-       }
-
-/* process an array of bytes */        
-       pub fn process_array(&mut self,b: &[u8]) {
-               for i in 0..b.len() {self.process((b[i]))}
-       }
-
-/* process a 32-bit integer */
-       pub fn process_num(&mut self,n: i32) {
-               self.process(((n>>24)&0xff) as u8);
-               self.process(((n>>16)&0xff) as u8);
-               self.process(((n>>8)&0xff) as u8);
-               self.process((n&0xff) as u8);
-       }
-
-/* Generate 32-byte Hash */
-       pub fn hash(&mut self) -> [u8;48] { /* pad message and finish - supply 
digest */
-               let mut digest:[u8;48]=[0;48];
-               let len0=self.length[0];
-               let len1=self.length[1];
-               self.process(0x80);
-               while (self.length[0]%1024)!=896 {self.process(0)}
-               self.w[14]=len1;
-               self.w[15]=len0;    
-               self.transform();
-               for i in 0..48 { /* convert to bytes */
-                       digest[i]=((self.h[i/8]>>(8*(7-i%8))) & 0xff) as u8;
-               }
-               self.init();
-               return digest;
-       }
-}
-
-//09330c33f71147e8 3d192fc782cd1b47 53111b173b3b05d2 2fa08086e3b0f712 
fcc7c71a557e2db9 66c3e9fa91746039
-/*
-fn main() {
-       let s = 
String::from("abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu");
       
-       let test = s.into_bytes();
-       let mut sh=HASH384::new();
-
-       for i in 0..test.len(){
-               sh.process(test[i]);
-       }
-               
-       let digest=sh.hash();    
-       for i in 0..48 {print!("{:02x}",digest[i])}
-} */

http://git-wip-us.apache.org/repos/asf/incubator-milagro-crypto/blob/1add7560/version22/rust/src/hash512.rs
----------------------------------------------------------------------
diff --git a/version22/rust/src/hash512.rs b/version22/rust/src/hash512.rs
deleted file mode 100644
index a345781..0000000
--- a/version22/rust/src/hash512.rs
+++ /dev/null
@@ -1,189 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-
-
-const HASH512_H0: u64=0x6a09e667f3bcc908;
-const HASH512_H1: u64=0xbb67ae8584caa73b;
-const HASH512_H2: u64=0x3c6ef372fe94f82b;
-const HASH512_H3: u64=0xa54ff53a5f1d36f1;
-const HASH512_H4: u64=0x510e527fade682d1;
-const HASH512_H5: u64=0x9b05688c2b3e6c1f;
-const HASH512_H6: u64=0x1f83d9abfb41bd6b;
-const HASH512_H7: u64=0x5be0cd19137e2179;
-
-const HASH512_K : [u64;80]=[
-       
0x428a2f98d728ae22,0x7137449123ef65cd,0xb5c0fbcfec4d3b2f,0xe9b5dba58189dbbc,
-       
0x3956c25bf348b538,0x59f111f1b605d019,0x923f82a4af194f9b,0xab1c5ed5da6d8118,
-       
0xd807aa98a3030242,0x12835b0145706fbe,0x243185be4ee4b28c,0x550c7dc3d5ffb4e2,
-       
0x72be5d74f27b896f,0x80deb1fe3b1696b1,0x9bdc06a725c71235,0xc19bf174cf692694,
-       
0xe49b69c19ef14ad2,0xefbe4786384f25e3,0x0fc19dc68b8cd5b5,0x240ca1cc77ac9c65,
-       
0x2de92c6f592b0275,0x4a7484aa6ea6e483,0x5cb0a9dcbd41fbd4,0x76f988da831153b5,
-       
0x983e5152ee66dfab,0xa831c66d2db43210,0xb00327c898fb213f,0xbf597fc7beef0ee4,
-       
0xc6e00bf33da88fc2,0xd5a79147930aa725,0x06ca6351e003826f,0x142929670a0e6e70,
-       
0x27b70a8546d22ffc,0x2e1b21385c26c926,0x4d2c6dfc5ac42aed,0x53380d139d95b3df,
-       
0x650a73548baf63de,0x766a0abb3c77b2a8,0x81c2c92e47edaee6,0x92722c851482353b,
-       
0xa2bfe8a14cf10364,0xa81a664bbc423001,0xc24b8b70d0f89791,0xc76c51a30654be30,
-       
0xd192e819d6ef5218,0xd69906245565a910,0xf40e35855771202a,0x106aa07032bbd1b8,
-       
0x19a4c116b8d2d0c8,0x1e376c085141ab53,0x2748774cdf8eeb99,0x34b0bcb5e19b48a8,
-       
0x391c0cb3c5c95a63,0x4ed8aa4ae3418acb,0x5b9cca4f7763e373,0x682e6ff3d6b2b8a3,
-       
0x748f82ee5defb2fc,0x78a5636f43172f60,0x84c87814a1f0ab72,0x8cc702081a6439ec,
-       
0x90befffa23631e28,0xa4506cebde82bde9,0xbef9a3f7b2c67915,0xc67178f2e372532b,
-       
0xca273eceea26619c,0xd186b8c721c0c207,0xeada7dd6cde0eb1e,0xf57d4f7fee6ed178,
-       
0x06f067aa72176fba,0x0a637dc5a2c898a6,0x113f9804bef90dae,0x1b710b35131c471b,
-       
0x28db77f523047d84,0x32caab7b40c72493,0x3c9ebe0a15c9bebc,0x431d67c49c100d4c,
-       
0x4cc5d4becb3e42b6,0x597f299cfc657e2a,0x5fcb6fab3ad6faec,0x6c44198c4a475817];
-
-
-pub struct HASH512 {
-       length: [u64;2],
-       h: [u64;8],
-       w: [u64;80]
-}
-
-impl HASH512 {
-       fn s(n: u64,x: u64) -> u64 {
-               return ((x)>>n) | ((x)<<(64-n));
-       }
-       fn r(n: u64,x: u64) -> u64 {
-               return (x)>>n;
-       }
-
-       fn ch(x: u64,y: u64,z: u64) -> u64 {
-               return (x&y)^(!(x)&z);
-       }
-
-       fn maj(x: u64,y: u64,z: u64) -> u64 {
-               return (x&y)^(x&z)^(y&z);
-       }
-
-       fn sig0(x: u64) -> u64 {
-               return HASH512::s(28,x)^HASH512::s(34,x)^HASH512::s(39,x);
-       }
-
-       fn sig1(x: u64) -> u64 {
-               return HASH512::s(14,x)^HASH512::s(18,x)^HASH512::s(41,x);
-       }
-
-       fn theta0(x: u64) -> u64 {
-               return HASH512::s(1,x)^HASH512::s(8,x)^HASH512::r(7,x);
-       }
-
-       fn theta1(x: u64) -> u64 {
-               return HASH512::s(19,x)^HASH512::s(61,x)^HASH512::r(6,x);
-       }
-
-       fn transform(&mut self) { /* basic transformation step */
-               for j in 16..80 {
-                       
self.w[j]=HASH512::theta1(self.w[j-2])+self.w[j-7]+HASH512::theta0(self.w[j-15])+self.w[j-16];
-               }
-               let mut a=self.h[0]; let mut b=self.h[1]; let mut c=self.h[2]; 
let mut d=self.h[3]; 
-               let mut e=self.h[4]; let mut f=self.h[5]; let mut g=self.h[6]; 
let mut hh=self.h[7];
-               for j in 0..80 { /* 64 times - mush it up */
-                       let 
t1=hh+HASH512::sig1(e)+HASH512::ch(e,f,g)+HASH512_K[j]+self.w[j];
-                       let t2=HASH512::sig0(a)+HASH512::maj(a,b,c);
-                       hh=g; g=f; f=e;
-                       e=d+t1;
-                       d=c;
-                       c=b;
-                       b=a;
-                       a=t1+t2 ; 
-               }
-               self.h[0]+=a; self.h[1]+=b; self.h[2]+=c; self.h[3]+=d;
-               self.h[4]+=e; self.h[5]+=f; self.h[6]+=g; self.h[7]+=hh; 
-       }       
-
-/* Initialise Hash function */
-       pub fn init(&mut self) { /* initialise */
-               for i in 0..64 {self.w[i]=0}
-               self.length[0]=0; self.length[1]=0;
-               self.h[0]=HASH512_H0;
-               self.h[1]=HASH512_H1;
-               self.h[2]=HASH512_H2;
-               self.h[3]=HASH512_H3;
-               self.h[4]=HASH512_H4;
-               self.h[5]=HASH512_H5;
-               self.h[6]=HASH512_H6;
-               self.h[7]=HASH512_H7;
-       }       
-
-       pub fn new() -> HASH512 {
-               let mut nh=HASH512 {
-                       length: [0;2],
-                       h: [0;8],
-                       w: [0;80]
-               };
-               nh.init();
-               return nh;
-       }
-
-/* process a single byte */
-       pub fn process(&mut self,byt: u8) { /* process the next message byte */
-               let cnt=((self.length[0]/64)%16) as usize;
-               self.w[cnt]<<=8;
-               self.w[cnt]|=(byt&0xFF) as u64;
-               self.length[0]+=8;
-               if self.length[0]==0 {self.length[1]+=1; self.length[0]=0}
-               if (self.length[0]%1024)==0 {self.transform()}
-       }
-
-/* process an array of bytes */        
-       pub fn process_array(&mut self,b: &[u8]) {
-               for i in 0..b.len() {self.process((b[i]))}
-       }
-
-/* process a 32-bit integer */
-       pub fn process_num(&mut self,n: i32) {
-               self.process(((n>>24)&0xff) as u8);
-               self.process(((n>>16)&0xff) as u8);
-               self.process(((n>>8)&0xff) as u8);
-               self.process((n&0xff) as u8);
-       }
-
-/* Generate 32-byte Hash */
-       pub fn hash(&mut self) -> [u8;64] { /* pad message and finish - supply 
digest */
-               let mut digest:[u8;64]=[0;64];
-               let len0=self.length[0];
-               let len1=self.length[1];
-               self.process(0x80);
-               while (self.length[0]%1024)!=896 {self.process(0)}
-               self.w[14]=len1;
-               self.w[15]=len0;    
-               self.transform();
-               for i in 0..64 { /* convert to bytes */
-                       digest[i]=((self.h[i/8]>>(8*(7-i%8))) & 0xff) as u8;
-               }
-               self.init();
-               return digest;
-       }
-}
-
-//8e959b75dae313da 8cf4f72814fc143f 8f7779c6eb9f7fa1 7299aeadb6889018 
501d289e4900f7e4 331b99dec4b5433a c7d329eeb6dd2654 5e96e55b874be909
-/*
-fn main() {
-       let s = 
String::from("abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu");
       
-       let test = s.into_bytes();
-       let mut sh=HASH512::new();
-
-       for i in 0..test.len(){
-               sh.process(test[i]);
-       }
-               
-       let digest=sh.hash();    
-       for i in 0..64 {print!("{:02x}",digest[i])}
-} */

http://git-wip-us.apache.org/repos/asf/incubator-milagro-crypto/blob/1add7560/version22/rust/src/lib.rs
----------------------------------------------------------------------
diff --git a/version22/rust/src/lib.rs b/version22/rust/src/lib.rs
deleted file mode 100644
index db9c412..0000000
--- a/version22/rust/src/lib.rs
+++ /dev/null
@@ -1,36 +0,0 @@
-#![allow(dead_code)]
-#![allow(unused_variables)]
-
-pub mod aes;
-pub mod big;
-pub mod dbig;
-pub mod ecdh;
-pub mod ecp;
-pub mod ecp2;
-pub mod ff;
-pub mod fp;
-pub mod fp2;
-pub mod fp4;
-pub mod fp12;
-pub mod pair;
-pub mod mpin;
-pub mod rand;
-pub mod hash256;
-pub mod hash384;
-pub mod hash512;
-pub mod rsa;
-
-#[cfg(target_pointer_width = "32")]
-#[path = "rom32.rs"]
-pub mod rom;
-
-#[cfg(target_pointer_width = "64")]
-#[path = "rom64.rs"]
-pub mod rom;
-
-#[cfg(test)]
-mod tests {
-    #[test]
-    fn it_works() {
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-milagro-crypto/blob/1add7560/version22/rust/src/mpin.rs
----------------------------------------------------------------------
diff --git a/version22/rust/src/mpin.rs b/version22/rust/src/mpin.rs
deleted file mode 100644
index 8644d1a..0000000
--- a/version22/rust/src/mpin.rs
+++ /dev/null
@@ -1,768 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-
-use std::time::{SystemTime};
-use std::time::UNIX_EPOCH;
-
-use ecp::ECP;
-use fp2::FP2;
-use ecp2::ECP2;
-use fp4::FP4;
-use fp12::FP12;
-use big::BIG;
-use rand::RAND;
-use hash256::HASH256;
-use hash384::HASH384;
-use hash512::HASH512;
-use pair;
-use rom;
-
-/* MPIN API Functions */
-
-/* Configure mode of operation */
-
-pub const PERMITS:bool=true;
-pub const PINERROR:bool=true;
-pub const FULL: bool=true;
-pub const SINGLE_PASS:bool=false;
-
-pub const EFS: usize=rom::MODBYTES as usize;
-pub const EGS: usize=rom::MODBYTES as usize;
-pub const PAS: usize=16;
-pub const BAD_PARAMS: isize=-11;
-pub const INVALID_POINT: isize=-14;
-pub const WRONG_ORDER: isize=-18;
-pub const BAD_PIN: isize=-19;
-pub const SHA256: usize=32;
-pub const SHA384: usize=48;
-pub const SHA512: usize=64;
-
-/* Configure your PIN here */
-
-pub const MAXPIN: i32=10000;  /* PIN less than this */
-pub const PBLEN: i32=14;      /* Number of bits in PIN */
-pub const TS: usize=10;         /* 10 for 4 digit PIN, 14 for 6-digit PIN - 
2^TS/TS approx = sqrt(MAXPIN) */
-pub const TRAP:usize=200;      /* 200 for 4 digit PIN, 2000 for 6-digit PIN  - 
approx 2*sqrt(MAXPIN) */
-
-pub const HASH_TYPE: usize=SHA256;
-
-#[allow(non_snake_case)]
-fn hash(sha: usize,c: &mut FP4,U: &mut ECP,r: &mut [u8]) -> bool {
-       let mut w:[u8;EFS]=[0;EFS];
-       let mut t:[u8;6*EFS]=[0;6*EFS];
-
-       c.geta().geta().tobytes(&mut w); for i in 0..EFS {t[i]=w[i]}
-       c.geta().getb().tobytes(&mut w); for i in EFS..2*EFS {t[i]=w[i-EFS]}
-       c.getb().geta().tobytes(&mut w); for i in 2*EFS..3*EFS {t[i]=w[i-2*EFS]}
-       c.getb().getb().tobytes(&mut w); for i in 3*EFS..4*EFS {t[i]=w[i-3*EFS]}
-
-       U.getx().tobytes(&mut w); for i in 4*EFS..5*EFS {t[i]=w[i-4*EFS]}
-       U.gety().tobytes(&mut w); for i in 5*EFS..6*EFS {t[i]=w[i-5*EFS]}
-
-       if sha==SHA256 {
-               let mut h=HASH256::new();
-               h.process_array(&t);
-               let sh=h.hash();
-               for i in 0..PAS {r[i]=sh[i]}    
-               return true;    
-       }
-       if sha==SHA384 {
-               let mut h=HASH384::new();
-               h.process_array(&t);
-               let sh=h.hash();
-               for i in 0..PAS {r[i]=sh[i]}            
-               return true;
-       }
-       if sha==SHA512 {
-               let mut h=HASH512::new();
-               h.process_array(&t);
-               let sh=h.hash();
-               for i in 0..PAS {r[i]=sh[i]}
-               return true;            
-       }
-       return false;
-
-}
-
-/* Hash number (optional) and string to point on curve */
-
-fn hashit(sha: usize,n: usize,id: &[u8],w: &mut [u8]) -> bool {
-       let mut r:[u8;64]=[0;64];
-       let mut didit=false;
-       if sha==SHA256 {
-               let mut h=HASH256::new();
-               if n>0 {h.process_num(n as i32)}
-               h.process_array(id);
-        let hs=h.hash();       
-        for i in 0..sha {r[i]=hs[i];}  
-        didit=true;
-       }
-       if sha==SHA384 {
-               let mut h=HASH384::new();
-               if n>0 {h.process_num(n as i32)}
-               h.process_array(id);
-               let hs=h.hash();
-        for i in 0..sha {r[i]=hs[i];}                  
-               didit=true;
-       }
-       if sha==SHA512 {
-               let mut h=HASH512::new();
-               if n>0 {h.process_num(n as i32)}
-               h.process_array(id);
-               let hs=h.hash();
-        for i in 0..sha {r[i]=hs[i];}  
-        didit=true;            
-       }
-       if !didit {return false}
-
-       let rm=rom::MODBYTES as usize;
-
-       if sha>rm {
-               for i in 0..rm {w[i]=r[i]}
-       } else {
-               for i in 0..sha {w[i]=r[i]}     
-               for i in sha..rm {w[i]=0}
-       }
-
-       return true;
-}
-
-#[allow(non_snake_case)]
-fn mapit(h: &[u8]) -> ECP {
-       let mut q=BIG::new_ints(&rom::MODULUS);
-       let mut x=BIG::frombytes(h);
-       x.rmod(&mut q);
-       let mut P:ECP;
-
-       loop {
-               P=ECP::new_bigint(&x,0);
-               if !P.is_infinity() {break}
-               x.inc(1); x.norm();
-       }
-       if rom::CURVE_PAIRING_TYPE!=rom::BN_CURVE {
-               let mut c=BIG::new_ints(&rom::CURVE_COF);
-               P=P.mul(&mut c);
-       }       
-       return P;
-}
-
-/* return time in slots since epoch */
-pub fn today() -> usize {
-       return 
(SystemTime::now().duration_since(UNIX_EPOCH).unwrap().as_secs()/(60*1440)) as 
usize;
-}
-
-/* these next two functions help to implement elligator squared - 
http://eprint.iacr.org/2014/043 */
-/* maps a random u to a point on the curve */
-#[allow(non_snake_case)]
-fn emap(u: &BIG,cb: isize) -> ECP {
-       let mut P:ECP;
-       let mut x=BIG::new_copy(u);
-       let mut p=BIG::new_ints(&rom::MODULUS);
-       x.rmod(&mut p);
-       loop {
-               P=ECP::new_bigint(&x,cb);
-               if !P.is_infinity() {break}
-               x.inc(1);  x.norm();
-       }
-       return P;
-}
-
-/* returns u derived from P. Random value in range 1 to return value should 
then be added to u */
-#[allow(non_snake_case)]
-fn unmap(u: &mut BIG,P: &mut ECP) -> isize {
-       let s=P.gets();
-       let mut R:ECP;
-       let mut r=0;
-       let x=P.getx();
-       u.copy(&x);
-       loop {
-               u.dec(1); u.norm();
-               r+=1;
-               R=ECP::new_bigint(u,s);
-               if !R.is_infinity() {break}
-       }
-       return r as isize;
-}
-
-pub fn hash_id(sha: usize,id: &[u8],w: &mut [u8]) -> bool {
-       return hashit(sha,0,id,w);
-}
-
-/* these next two functions implement elligator squared - 
http://eprint.iacr.org/2014/043 */
-/* Elliptic curve point E in format (0x04,x,y} is converted to form {0x0-,u,v} 
*/
-/* Note that u and v are indistinguisible from random strings */
-#[allow(non_snake_case)]
-pub fn encoding(rng: &mut RAND,e: &mut [u8]) ->isize {
-       let mut t:[u8;EFS]=[0;EFS];
-
-       for i in 0..EFS {t[i]=e[i+1]}
-       let mut u=BIG::frombytes(&t);
-       for i in 0..EFS {t[i]=e[i+EFS+1]}
-       let mut v=BIG::frombytes(&t);
-               
-       let mut P=ECP::new_bigs(&u,&v);
-       if P.is_infinity() {return INVALID_POINT}
-
-       let p=BIG::new_ints(&rom::MODULUS);
-       u=BIG::randomnum(&p,rng);
-
-       let mut su=rng.getbyte() as isize; /*if (su<0) su=-su;*/ su%=2;
-               
-       let mut W=emap(&mut u,su);
-       P.sub(&mut W);
-       let sv=P.gets();
-       let rn=unmap(&mut v,&mut P);
-       let mut m=rng.getbyte() as isize; /*if (m<0) m=-m;*/ m%=rn;
-       v.inc(m+1);
-       e[0]=(su+2*sv) as u8;
-       u.tobytes(&mut t);
-       for i in 0..EFS {e[i+1]=t[i]}
-       v.tobytes(&mut t);
-       for i in 0..EFS {e[i+EFS+1]=t[i]}               
-               
-       return 0;
-}
-
-#[allow(non_snake_case)]
-pub fn decoding(d: &mut [u8]) -> isize {
-       let mut t:[u8;EFS]=[0;EFS];
-
-       if (d[0]&0x04)!=0 {return INVALID_POINT}
-
-       for i in 0..EFS {t[i]=d[i+1]}
-       let mut u=BIG::frombytes(&t);
-       for i in 0..EFS {t[i]=d[i+EFS+1]}
-       let mut v=BIG::frombytes(&t);
-
-       let su=(d[0]&1) as isize;
-       let sv=((d[0]>>1)&1) as isize;
-       let mut W=emap(&mut u,su);
-       let mut P=emap(&mut v,sv);
-       P.add(&mut W);
-       u=P.getx();
-       v=P.gety();
-       d[0]=0x04;
-       u.tobytes(&mut t);
-       for i in 0..EFS {d[i+1]=t[i]}
-       v.tobytes(&mut t);
-       for i in 0..EFS {d[i+EFS+1]=t[i]}               
-               
-       return 0;
-}
-
-/* R=R1+R2 in group G1 */
-#[allow(non_snake_case)]
-pub fn recombine_g1(r1: &[u8],r2: &[u8],r: &mut [u8]) -> isize {
-       let mut P=ECP::frombytes(&r1);
-       let mut Q=ECP::frombytes(&r2);
-
-       if P.is_infinity() || Q.is_infinity() {return INVALID_POINT}
-
-       P.add(&mut Q);
-
-       P.tobytes(r);
-       return 0;
-}
-
-/* W=W1+W2 in group G2 */
-#[allow(non_snake_case)]
-pub fn recombine_g2(w1: &[u8],w2: &[u8],w: &mut [u8]) -> isize {
-       let mut P=ECP2::frombytes(&w1);
-       let mut Q=ECP2::frombytes(&w2);
-
-       if P.is_infinity() || Q.is_infinity() {return INVALID_POINT}
-
-       P.add(&mut Q);
-       
-       P.tobytes(w);
-       return 0;
-}
-       
-/* create random secret S */
-pub fn random_generate(rng: &mut RAND,s: &mut [u8]) -> isize {
-       let r=BIG::new_ints(&rom::CURVE_ORDER);
-       let mut sc=BIG::randomnum(&r,rng);
-       if rom::AES_S>0 {
-               sc.mod2m(2*rom::AES_S);
-       }               
-       sc.tobytes(s);
-       return 0;
-}
-
-/* Extract Server Secret SST=S*Q where Q is fixed generator in G2 and S is 
master secret */
-#[allow(non_snake_case)]
-pub fn get_server_secret(s: &[u8],sst: &mut [u8]) -> isize {
-
-       let mut 
Q=ECP2::new_fp2s(&FP2::new_bigs(&BIG::new_ints(&rom::CURVE_PXA),&BIG::new_ints(&rom::CURVE_PXB)),&FP2::new_bigs(&BIG::new_ints(&rom::CURVE_PYA),&BIG::new_ints(&rom::CURVE_PYB)));
-
-       let mut sc=BIG::frombytes(s);
-       Q=pair::g2mul(&mut Q,&mut sc);
-       Q.tobytes(sst);
-       return 0;
-}
-
-/*
- W=x*H(G);
- if RNG == NULL then X is passed in 
- if RNG != NULL the X is passed out 
- if type=0 W=x*G where G is point on the curve, else W=x*M(G), where M(G) is 
mapping of octet G to point on the curve
-*/
-#[allow(non_snake_case)]
-pub fn get_g1_multiple(rng: Option<&mut RAND>,typ: usize,x: &mut [u8],g: 
&[u8],w: &mut [u8]) -> isize {
-       let mut sx:BIG;
-       let r=BIG::new_ints(&rom::CURVE_ORDER);
-
-       if let Some(mut rd)=rng
-       {
-               sx=BIG::randomnum(&r,rd);
-               if rom::AES_S>0 {
-                       sx.mod2m(2*rom::AES_S);
-               }
-               sx.tobytes(x);
-       } else {
-               sx=BIG::frombytes(x);
-       }
-       let mut P:ECP;
-
-       if typ==0 {
-               P=ECP::frombytes(g);
-               if P.is_infinity() {return INVALID_POINT}
-       } else {
-               P=mapit(g)
-       }
-
-
-
-       pair::g1mul(&mut P,&mut sx).tobytes(w);
-       return 0;
-}
-
-
-/* Client secret CST=S*H(CID) where CID is client ID and S is master secret */
-/* CID is hashed externally */
-pub fn get_client_secret(s: &mut [u8],cid: &[u8],cst: &mut [u8]) -> isize {
-       return get_g1_multiple(None,1,s,cid,cst);
-}
-
-/* Extract PIN from TOKEN for identity CID */
-#[allow(non_snake_case)]
-pub fn extract_pin(sha: usize,cid: &[u8],pin: i32,token: &mut [u8]) -> isize {
-       let mut P=ECP::frombytes(&token);
-       const RM:usize=rom::MODBYTES as usize;
-       let mut h:[u8;RM]=[0;RM];
-       if P.is_infinity() {return INVALID_POINT}
-       hashit(sha,0,cid,&mut h);
-       let mut R=mapit(&h);
-
-       R=R.pinmul(pin%MAXPIN,PBLEN);
-       P.sub(&mut R);
-
-       P.tobytes(token);
-
-       return 0;
-}
-
-/* Functions to support M-Pin Full */
-#[allow(non_snake_case)]
-pub fn precompute(token: &[u8],cid: &[u8],g1: &mut [u8],g2: &mut [u8]) -> 
isize {
-       let mut T=ECP::frombytes(&token);
-       if T.is_infinity() {return INVALID_POINT} 
-
-       let mut P=mapit(&cid);
-
-       let mut 
Q=ECP2::new_fp2s(&FP2::new_bigs(&BIG::new_ints(&rom::CURVE_PXA),&BIG::new_ints(&rom::CURVE_PXB)),&FP2::new_bigs(&BIG::new_ints(&rom::CURVE_PYA),&BIG::new_ints(&rom::CURVE_PYB)));
-
-       let mut g=pair::ate(&mut Q,&mut T);
-       g=pair::fexp(&g);
-       g.tobytes(g1);
-
-       g=pair::ate(&mut Q,&mut P);
-       g=pair::fexp(&g);
-       g.tobytes(g2);
-
-       return 0;
-}
-
-/* Time Permit CTT=S*(date|H(CID)) where S is master secret */
-#[allow(non_snake_case)]
-pub fn get_client_permit(sha: usize,date: usize,s: &[u8],cid: &[u8],ctt: &mut 
[u8]) ->isize {
-       const RM:usize=rom::MODBYTES as usize;
-       let mut h:[u8;RM]=[0;RM];       
-       hashit(sha,date,cid,&mut h);
-       let mut P=mapit(&h);
-
-       let mut sc=BIG::frombytes(s);
-       pair::g1mul(&mut P,&mut sc).tobytes(ctt);
-       return 0;
-}
-
-/* Implement step 1 on client side of MPin protocol */
-#[allow(non_snake_case)]
-pub fn client_1(sha: usize,date: usize,client_id: &[u8],rng: Option<&mut 
RAND>,x: &mut [u8],pin: usize,token: &[u8],sec: &mut [u8],xid: Option<&mut 
[u8]>,xcid: Option<&mut [u8]>,permit: Option<&[u8]>) ->isize {
-       let r=BIG::new_ints(&rom::CURVE_ORDER);
-               
-       let mut sx:BIG;
-
-       if let Some(mut rd)=rng
-       {
-               sx=BIG::randomnum(&r,rd);
-               if rom::AES_S>0 {
-                       sx.mod2m(2*rom::AES_S);
-               }
-               sx.tobytes(x);
-       } else {
-               sx=BIG::frombytes(x);
-       }
-
-       const RM:usize=rom::MODBYTES as usize;
-       let mut h:[u8;RM]=[0;RM];
-
-       hashit(sha,0,&client_id,&mut h);
-       let mut P=mapit(&h);
-       
-       let mut T=ECP::frombytes(&token);
-       if T.is_infinity() {return INVALID_POINT}
-
-       let mut W=P.pinmul((pin as i32)%MAXPIN,PBLEN);
-       T.add(&mut W);
-       if date!=0 {
-               if let Some(rpermit)=permit {W=ECP::frombytes(&rpermit);}
-               if W.is_infinity() {return INVALID_POINT}
-               T.add(&mut W);
-               let mut h2:[u8;RM]=[0;RM];              
-               hashit(sha,date,&h,&mut h2);
-               W=mapit(&h2);
-               if let Some(mut rxid)=xid {
-                       P=pair::g1mul(&mut P,&mut sx);
-                       P.tobytes(&mut rxid);
-                       W=pair::g1mul(&mut W,&mut sx);
-                       P.add(&mut W);
-               } else {
-                       P.add(&mut W);
-                       P=pair::g1mul(&mut P,&mut sx);
-               }
-               if let Some(mut rxcid)=xcid {P.tobytes(&mut rxcid)}
-       } else {
-               if let Some(mut rxid)=xid {
-                       P=pair::g1mul(&mut P,&mut sx);
-                       P.tobytes(&mut rxid);
-               }
-       }
-
-       T.tobytes(sec);
-       return 0;
-}
-
-/* Outputs H(CID) and H(T|H(CID)) for time permits. If no time permits set 
HID=HTID */
-#[allow(non_snake_case)]
-pub fn server_1(sha: usize,date: usize,cid: &[u8],hid: &mut [u8],htid: 
Option<&mut [u8]>) {
-       const RM:usize=rom::MODBYTES as usize;
-       let mut h:[u8;RM]=[0;RM];
-
-       hashit(sha,0,cid,&mut h);       
-
-       let mut P=mapit(&h);
-       
-       P.tobytes(hid);
-       if date!=0 {
-               let mut h2:[u8;RM]=[0;RM];              
-               hashit(sha,date,&h,&mut h2);
-               let mut R=mapit(&h2);
-               P.add(&mut R);
-               if let Some(rhtid)=htid {P.tobytes(rhtid);}
-       } 
-}
-
-/* Implement step 2 on client side of MPin protocol */
-#[allow(non_snake_case)]
-pub fn client_2(x: &[u8],y: &[u8],sec: &mut [u8]) -> isize {
-       let mut r=BIG::new_ints(&rom::CURVE_ORDER);
-       let mut P=ECP::frombytes(sec);
-       if P.is_infinity() {return INVALID_POINT}
-
-       let mut px=BIG::frombytes(x);
-       let py=BIG::frombytes(y);
-       px.add(&py);
-       px.rmod(&mut r);
-       //px.rsub(r)
-
-       P=pair::g1mul(&mut P,&mut px);
-       P.neg();
-       P.tobytes(sec);
-       
-       return 0;
-}
-
-/* return time since epoch */
-pub fn get_time() -> usize {
-       return 
(SystemTime::now().duration_since(UNIX_EPOCH).unwrap().as_secs()) as usize;     
 
-}
-
-/* Generate Y = H(epoch, xCID/xID) */
-pub fn get_y(sha: usize,timevalue: usize,xcid: &[u8],y: &mut [u8]) {
-       const RM:usize=rom::MODBYTES as usize;
-       let mut h:[u8;RM]=[0;RM];
-
-       hashit(sha,timevalue,xcid,&mut h);      
-
-       let mut sy= BIG::frombytes(&h);
-       let mut q=BIG::new_ints(&rom::CURVE_ORDER);
-       sy.rmod(&mut q);
-       if rom::AES_S>0 {
-               sy.mod2m(2*rom::AES_S);
-       }
-       sy.tobytes(y);
-}
-
-/* Implement step 2 of MPin protocol on server side */
-#[allow(non_snake_case)]
-pub fn server_2(date: usize,hid: &[u8],htid: Option<&[u8]>,y: &[u8],sst: 
&[u8],xid: Option<&[u8]>,xcid: Option<&[u8]>,msec: &[u8],e: Option<&mut 
[u8]>,f: Option<&mut [u8]>) -> isize {
-//     q:=NewBIGints(Modulus)
-       let mut 
Q=ECP2::new_fp2s(&FP2::new_bigs(&BIG::new_ints(&rom::CURVE_PXA),&BIG::new_ints(&rom::CURVE_PXB)),&FP2::new_bigs(&BIG::new_ints(&rom::CURVE_PYA),&BIG::new_ints(&rom::CURVE_PYB)));
-
-       let mut sQ=ECP2::frombytes(&sst);
-       if sQ.is_infinity() {return INVALID_POINT}      
-
-       let mut R:ECP;
-       if date!=0 {
-               if let Some(rxcid)=xcid {R=ECP::frombytes(&rxcid);}
-               else {return BAD_PARAMS}
-       } else {
-               if let Some(rxid)=xid {R=ECP::frombytes(&rxid)}
-               else {return BAD_PARAMS}
-       }
-       if R.is_infinity() {return INVALID_POINT}
-
-       let mut sy=BIG::frombytes(&y);
-       let mut P:ECP;
-       if date!=0 {
-               if let Some(rhtid)=htid {P=ECP::frombytes(&rhtid)}
-               else {return BAD_PARAMS}
-       } else {
-               P=ECP::frombytes(&hid);
-       }
-       
-       if P.is_infinity() {return INVALID_POINT}
-
-       P=pair::g1mul(&mut P,&mut sy);
-       P.add(&mut R);
-       R=ECP::frombytes(&msec);
-       if R.is_infinity() {return INVALID_POINT}
-
-       let mut g:FP12;
-//             FP12 g1=new FP12(0);
-
-       g=pair::ate2(&mut Q,&mut R,&mut sQ,&mut P);
-       g=pair::fexp(&g);
-
-       if !g.isunity() {
-               
-               if let Some(rxid)=xid {
-                       if let Some(re)=e {
-                               if let Some(rf)=f {
-
-                                       g.tobytes(re);
-                                       if date!=0 {
-                                               P=ECP::frombytes(&hid);
-                                               if P.is_infinity() {return 
INVALID_POINT}               
-                                               R=ECP::frombytes(&rxid);
-                                               if R.is_infinity() {return 
INVALID_POINT}                       
-                                               P=pair::g1mul(&mut P,&mut sy);
-                                               P.add(&mut R);                  
                                                
-                                       }
-                                       g=pair::ate(&mut Q,&mut P);
-                                       g=pair::fexp(&g);
-                                       g.tobytes(rf);
-
-                               }
-                       }
-               }
-       
-               return BAD_PIN;
-       }
-
-       return 0;
-}
-
-/* Pollards kangaroos used to return PIN error */
-pub fn kangaroo(e: &[u8],f: &[u8]) -> isize {
-       let mut ge=FP12::frombytes(e);
-       let mut gf=FP12::frombytes(f);
-       let mut distance: [isize;TS]=[0;TS];
-       let mut t=FP12::new_copy(&gf);
-
-       let mut table: [FP12;TS]=[FP12::new();TS];
-       let mut s:isize=1;
-       for m in 0..TS {
-               distance[m]=s;
-               table[m]=FP12::new_copy(&t);
-               s*=2;
-               t.usqr();
-       }
-       t.one();
-       let mut dn:isize=0;
-       let mut i:usize;
-       for _ in 0..TRAP {
-               i=(t.geta().geta().geta().lastbits(20)%(TS as isize)) as usize;
-               t.mul(&mut table[i]);
-               dn+=distance[i];
-       }
-       gf.copy(&t); gf.conj();
-       let mut steps:usize=0; let mut dm:isize=0;
-       let mut res:isize=0;
-       while dm-dn<MAXPIN as isize {
-               steps+=1;
-               if steps>4*TRAP {break}
-               i=(ge.geta().geta().geta().lastbits(20)%(TS as isize)) as usize;
-               ge.mul(&mut table[i]);
-               dm+=distance[i];
-               if ge.equals(&mut t) {
-                       res=dm-dn;
-                       break;
-               }
-               if ge.equals(&mut gf) {
-                       res=dn-dm;
-                       break;
-               }
-
-       }
-       if steps>4*TRAP || dm-dn>=MAXPIN as isize {res=0 }    // Trap Failed  - 
probable invalid token
-       return res;
-}
-
-/* Hash the M-Pin transcript - new */
-
-pub fn hash_all(sha: usize,hid: &[u8],xid: &[u8],xcid: Option<&[u8]>,sec: 
&[u8],y: &[u8],r: &[u8],w: &[u8],h: &mut[u8]) -> bool {
-       let mut tlen:usize=0;
-       const RM:usize=rom::MODBYTES as usize;  
-       let mut t: [u8;10*RM+4]=[0;10*RM+4];
-
-       for i in 0 .. hid.len() {t[i]=hid[i]}
-       tlen+=hid.len();
-
-       if let Some(rxcid)=xcid {
-               for i in 0..rxcid.len() {t[i+tlen]=rxcid[i]}
-               tlen+=rxcid.len();
-       } else {
-               for i in 0..xid.len() {t[i+tlen]=xid[i]}
-               tlen+=xid.len();
-       }       
-
-       for i in 0..sec.len() {t[i+tlen]=sec[i]}
-       tlen+=sec.len();                
-       for i in 0..y.len() {t[i+tlen]=y[i]}
-       tlen+=y.len();
-       for i in 0..r.len() {t[i+tlen]=r[i]}
-       tlen+=r.len();          
-       for i in 0..w.len() {t[i+tlen]=w[i]}
-       tlen+=w.len();  
-       if tlen!=10*RM+4 {return false}
-
-       return hashit(sha,0,&t,h);
-}
-
-/* calculate common key on client side */
-/* wCID = w.(A+AT) */
-#[allow(non_snake_case)]
-pub fn client_key(sha: usize,g1: &[u8],g2: &[u8],pin: usize,r: &[u8],x: 
&[u8],h: &[u8],wcid: &[u8],ck: &mut [u8]) -> isize {
-
-       let mut g1=FP12::frombytes(&g1);
-       let mut g2=FP12::frombytes(&g2);
-       let mut z=BIG::frombytes(&r);
-       let mut x=BIG::frombytes(&x);
-       let h=BIG::frombytes(&h);
-
-       let mut W=ECP::frombytes(&wcid);
-       if W.is_infinity() {return INVALID_POINT} 
-
-       W=pair::g1mul(&mut W,&mut x);
-
-       let mut 
f=FP2::new_bigs(&BIG::new_ints(&rom::CURVE_FRA),&BIG::new_ints(&rom::CURVE_FRB));
-       let mut r=BIG::new_ints(&rom::CURVE_ORDER);
-       let q=BIG::new_ints(&rom::MODULUS);
-
-       z.add(&h);      //new
-       z.rmod(&mut r);
-
-       let mut m=BIG::new_copy(&q);
-       m.rmod(&mut r);
-
-       let mut a=BIG::new_copy(&z);
-       a.rmod(&mut m);
-
-       let mut b=BIG::new_copy(&z);
-       b.div(&mut m);
-
-       g2.pinpow(pin as i32,PBLEN);
-       g1.mul(&mut g2);
-
-       let mut c=g1.trace();
-       g2.copy(&g1);
-       g2.frob(&mut f);
-       let cp=g2.trace();
-       g1.conj();
-       g2.mul(&mut g1);
-       let cpm1=g2.trace();
-       g2.mul(&mut g1);
-       let cpm2=g2.trace();
-
-       c=c.xtr_pow2(&cp,&cpm1,&cpm2,&mut a,&mut b);
-
-       hash(sha,&mut c,&mut W,ck);
-
-       return 0
-}
-
-/* calculate common key on server side */
-/* Z=r.A - no time permits involved */
-#[allow(non_snake_case)]
-pub fn server_key(sha: usize,z: &[u8],sst: &[u8],w: &[u8],h: &[u8],hid: 
&[u8],xid: &[u8],xcid: Option<&[u8]>,sk: &mut [u8]) -> isize {
-       let mut sQ=ECP2::frombytes(&sst);
-       if sQ.is_infinity() {return INVALID_POINT} 
-       let mut R=ECP::frombytes(&z);
-       if R.is_infinity() {return INVALID_POINT} 
-       let mut A=ECP::frombytes(&hid);
-       if A.is_infinity() {return INVALID_POINT} 
-
-       let mut U=ECP::new();
-       if let Some(rxcid)=xcid {
-               U.copy(&ECP::frombytes(&rxcid));
-       } else {
-               U.copy(&ECP::frombytes(&xid));
-       }
-       
-       if U.is_infinity() {return INVALID_POINT} 
-
-       let mut w=BIG::frombytes(&w);
-       let mut h=BIG::frombytes(&h);
-       A=pair::g1mul(&mut A,&mut h);   // new
-       R.add(&mut A);
-
-       U=pair::g1mul(&mut U,&mut w);
-       let mut g=pair::ate(&mut sQ,&mut R);
-       g=pair::fexp(&g);
-
-       let mut c=g.trace();
-
-       hash(sha,&mut c,&mut U,sk);
-
-       return 0
-}
-
-

http://git-wip-us.apache.org/repos/asf/incubator-milagro-crypto/blob/1add7560/version22/rust/src/pair.rs
----------------------------------------------------------------------
diff --git a/version22/rust/src/pair.rs b/version22/rust/src/pair.rs
deleted file mode 100644
index 9e162db..0000000
--- a/version22/rust/src/pair.rs
+++ /dev/null
@@ -1,674 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-
-//mod fp;
-use fp::FP;
-//mod ecp;
-use ecp::ECP;
-//mod fp2;
-use fp2::FP2;
-//mod ecp2;
-use ecp2::ECP2;
-//mod fp4;
-use fp4::FP4;
-//mod fp12;
-use fp12::FP12;
-//mod big;
-use big::BIG;
-//mod dbig;
-use dbig::DBIG;
-//mod rand;
-//mod hash256;
-//mod rom;
-use rom;
-
-#[allow(non_snake_case)]
-
-fn linedbl(A: &mut ECP2,qx: &mut FP,qy: &mut  FP) -> FP12 {
-       let mut P=ECP2::new();
-
-       P.copy(A);
-       let mut zz=FP2::new_copy(&P.getpz());
-       zz.sqr();
-       let d=A.dbl();  
-
-       if d<0 {return FP12::new_int(1)}
-
-       let mut z3=FP2::new_copy(&A.getpz());
-       let mut a=FP4::new();
-       let mut b=FP4::new();
-       let c=FP4::new();       
-
-       let mut x=FP2::new_copy(&P.getpx());
-       let mut y=FP2::new_copy(&P.getpy());
-       let mut t=FP2::new_copy(&P.getpx());
-       t.sqr();
-       t.imul(3);
-
-       y.sqr();
-       y.dbl();
-       z3.mul(&mut zz);
-       z3.pmul(qy);
-
-       x.mul(&mut t);
-       x.sub(&y);
-       a.copy(&FP4::new_fp2s(&z3,&x));
-       t.neg();
-       zz.mul(&mut t);
-       zz.pmul(qx);
-       b.copy(&FP4::new_fp2(&zz));
-
-       return FP12::new_fp4s(&a,&b,&c);
-}
-
-#[allow(non_snake_case)]
-fn lineadd(A: &mut ECP2,B: &mut ECP2,qx: &mut FP,qy: &mut  FP) -> FP12 {
-
-       let mut P=ECP2::new();
-
-       P.copy(A);
-       let mut zz=FP2::new_copy(&P.getpz());
-       zz.sqr();
-
-       let d=A.add(B);
-       if d<0 {return FP12::new_int(1)}        
-
-       let mut z3=FP2::new_copy(&A.getpz());
-       let mut a=FP4::new();
-       let mut b=FP4::new();
-       let c=FP4::new();       
-
-       if d==0 { /* Addition */
-               let mut x=FP2::new_copy(&B.getpx());
-               let mut y=FP2::new_copy(&B.getpy());
-               let mut t=FP2::new_copy(&P.getpz()); 
-               t.mul(&mut y);
-               zz.mul(&mut t);
-
-               let mut ny=FP2::new_copy(&P.getpy()); ny.neg();
-               zz.add(&ny); 
-               z3.pmul(qy);
-               t.mul(&mut P.getpx());
-               x.mul(&mut ny);
-               t.add(&x);
-               a.copy(&FP4::new_fp2s(&z3,&t));
-               zz.neg();
-               zz.pmul(qx);
-               b.copy(&FP4::new_fp2(&zz));
-       } else { /* Doubling */
-               let mut x=FP2::new_copy(&P.getpx());
-               let mut y=FP2::new_copy(&P.getpy());
-               let mut t=FP2::new_copy(&P.getpx());
-               t.sqr();
-               t.imul(3);
-
-               y.sqr();
-               y.dbl();
-               z3.mul(&mut zz);
-               z3.pmul(qy);
-
-               x.mul(&mut t);
-               x.sub(&y);
-               a.copy(&FP4::new_fp2s(&z3,&x));
-               t.neg();
-               zz.mul(&mut t);
-               zz.pmul(qx);
-               b.copy(&FP4::new_fp2(&zz));
-       }
-       return FP12::new_fp4s(&a,&b,&c);
-}
-
-#[allow(non_snake_case)]
-/* Optimal R-ate pairing */
-pub fn ate(P: & mut ECP2,Q: &mut ECP) -> FP12 {
-       let mut f = 
FP2::new_bigs(&BIG::new_ints(&rom::CURVE_FRA),&BIG::new_ints(&rom::CURVE_FRB));
-       let x = BIG::new_ints(&rom::CURVE_BNX);
-       let mut n = BIG::new_copy(&x);
-       let mut K = ECP2::new();
-
-       
-       if rom::CURVE_PAIRING_TYPE == rom::BN_CURVE {
-               n.pmul(6); n.dec(2);
-       } else {n.copy(&x)}
-       
-       n.norm();
-       P.affine();
-       Q.affine();
-       let mut qx=FP::new_copy(&Q.getpx());
-       let mut qy=FP::new_copy(&Q.getpy());
-
-       let mut A=ECP2::new();
-       let mut r=FP12::new_int(1);
-
-       A.copy(&P);
-       let nb=n.nbits();
-
-       for i in (1..nb-1).rev() {
-               let mut lv=linedbl(&mut A,&mut qx,&mut qy);
-               r.smul(&mut lv);
-               if n.bit(i)==1 {
-               
-                       lv=lineadd(&mut A,P,&mut qx,&mut qy);
-               
-                       r.smul(&mut lv);
-               }               
-               r.sqr();        
-       }
-
-       let mut lv=linedbl(&mut A,&mut qx,&mut qy);
-       r.smul(&mut lv);
-
-       if n.parity()==1 {
-               lv=lineadd(&mut A,P,&mut qx,&mut qy);
-               r.smul(&mut lv);
-       }
-
-/* R-ate fixup required for BN curves */
-
-       if rom::CURVE_PAIRING_TYPE == rom::BN_CURVE {
-               r.conj();
-               K.copy(&P);
-               K.frob(&mut f);
-               A.neg();
-               lv=lineadd(&mut A,&mut K,&mut qx,&mut qy);
-               r.smul(&mut lv);
-               K.frob(&mut f);
-               K.neg();
-               lv=lineadd(&mut A,&mut K,&mut qx,&mut qy);
-               r.smul(&mut lv);
-       }
-
-       return r;
-}
-
-#[allow(non_snake_case)]
-/* Optimal R-ate double pairing e(P,Q).e(R,S) */
-pub fn ate2(P: &mut ECP2,Q: &mut ECP,R: &mut ECP2,S: &mut ECP) -> FP12 {
-       let mut f = 
FP2::new_bigs(&BIG::new_ints(&rom::CURVE_FRA),&BIG::new_ints(&rom::CURVE_FRB));
-       let x = BIG::new_ints(&rom::CURVE_BNX);
-       let mut n = BIG::new_copy(&x);
-       let mut K = ECP2::new();
-
-
-       if rom::CURVE_PAIRING_TYPE == rom::BN_CURVE {
-               n.pmul(6); n.dec(2);
-       } else {n.copy(&x)}
-       
-       n.norm();
-       P.affine();
-       Q.affine();
-       R.affine();
-       S.affine();
-
-       let mut qx=FP::new_copy(&Q.getpx());
-       let mut qy=FP::new_copy(&Q.getpy());
-
-       let mut sx=FP::new_copy(&S.getpx());
-       let mut sy=FP::new_copy(&S.getpy());
-
-       let mut A=ECP2::new();
-       let mut B=ECP2::new();
-       let mut r=FP12::new_int(1);
-
-       A.copy(&P);
-       B.copy(&R);
-       let nb=n.nbits();
-
-       for i in (1..nb-1).rev() {
-               let mut lv=linedbl(&mut A,&mut qx,&mut qy);
-               r.smul(&mut lv);
-               lv=linedbl(&mut B,&mut sx,&mut sy);
-               r.smul(&mut lv);
-
-               if n.bit(i)==1 {
-                       lv=lineadd(&mut A,P,&mut qx,&mut qy);
-                       r.smul(&mut lv);
-                       lv=lineadd(&mut B,R,&mut sx,&mut sy);
-                       r.smul(&mut lv);
-               }
-               r.sqr();
-       }
-
-       let mut lv=linedbl(&mut A,&mut qx,&mut qy);
-       r.smul(&mut lv);
-       lv=linedbl(&mut B,&mut sx,&mut sy);
-       r.smul(&mut lv);
-       if n.parity()==1 {
-               lv=lineadd(&mut A,P,&mut qx,&mut qy);
-               r.smul(&mut lv);
-               lv=lineadd(&mut B,R,&mut sx,&mut sy);
-               r.smul(&mut lv);
-       }
-
-/* R-ate fixup */
-       if rom::CURVE_PAIRING_TYPE == rom::BN_CURVE {
-               r.conj();
-               K.copy(&P);
-               K.frob(&mut f);
-               A.neg();
-               lv=lineadd(&mut A,&mut K,&mut qx,&mut qy);
-               r.smul(&mut lv);
-               K.frob(&mut f);
-               K.neg();
-               lv=lineadd(&mut A,&mut K,&mut qx,&mut qy);
-               r.smul(&mut lv);
-
-               K.copy(&R);
-               K.frob(&mut f);
-               B.neg();
-               lv=lineadd(&mut B,&mut K,&mut sx,&mut sy);
-               r.smul(&mut lv);
-               K.frob(&mut f);
-               K.neg();
-               lv=lineadd(&mut B,&mut K,&mut sx,&mut sy);
-               r.smul(&mut lv);
-       }
-
-       return r;
-}
-
-/* final exponentiation - keep separate for multi-pairings and to avoid 
thrashing stack */
-pub fn fexp(m: &FP12) -> FP12 {
-       let mut f = 
FP2::new_bigs(&BIG::new_ints(&rom::CURVE_FRA),&BIG::new_ints(&rom::CURVE_FRB));
-       let mut x = BIG::new_ints(&rom::CURVE_BNX);
-       let mut r=FP12::new_copy(m);
-               
-/* Easy part of final exp */
-       let mut lv=FP12::new_copy(&r);
-       lv.inverse();
-       r.conj();
-
-       r.mul(&mut lv);
-       lv.copy(&r);
-       r.frob(&mut f);
-       r.frob(&mut f);
-       r.mul(&mut lv);
-/* Hard part of final exp */
-       if rom::CURVE_PAIRING_TYPE == rom::BN_CURVE {
-               lv.copy(&r);
-               lv.frob(&mut f);
-               let mut x0=FP12::new_copy(&lv);
-               x0.frob(&mut f);
-               lv.mul(&mut r);
-               x0.mul(&mut lv);
-               x0.frob(&mut f);
-               let mut x1=FP12::new_copy(&r);
-               x1.conj();
-               let mut x4=r.pow(&mut x);
-
-               let mut x3=FP12::new_copy(&x4);
-               x3.frob(&mut f);
-
-               let mut x2=x4.pow(&mut x);
-
-               let mut x5=FP12::new_copy(&x2); x5.conj();
-               lv=x2.pow(&mut x);
-
-               x2.frob(&mut f);
-               r.copy(&x2); r.conj();
-
-               x4.mul(&mut r);
-               x2.frob(&mut f);
-
-               r.copy(&lv);
-               r.frob(&mut f);
-               lv.mul(&mut r);
-
-               lv.usqr();
-               lv.mul(&mut x4);
-               lv.mul(&mut x5);
-               r.copy(&x3);
-               r.mul(&mut x5);
-               r.mul(&mut lv);
-               lv.mul(&mut x2);
-               r.usqr();
-               r.mul(&mut lv);
-               r.usqr();
-               lv.copy(&r);
-               lv.mul(&mut x1);
-               r.mul(&mut x0);
-               lv.usqr();
-               r.mul(&mut lv);
-               r.reduce();
-       } else {
-
-// Ghamman & Fouotsa Method
-
-               let mut y0=FP12::new_copy(&r); y0.usqr();
-               let mut y1=y0.pow(&mut x);
-               x.fshr(1); let mut y2=y1.pow(&mut x); x.fshl(1);
-               let mut y3=FP12::new_copy(&r); y3.conj();
-               y1.mul(&mut y3);
-
-               y1.conj();
-               y1.mul(&mut y2);
-
-               y2=y1.pow(&mut x);
-
-               y3=y2.pow(&mut x);
-               y1.conj();
-               y3.mul(&mut y1);
-
-               y1.conj();
-               y1.frob(&mut f); y1.frob(&mut f); y1.frob(&mut f);
-               y2.frob(&mut f); y2.frob(&mut f);
-               y1.mul(&mut y2);
-
-               y2=y3.pow(&mut x);
-               y2.mul(&mut y0);
-               y2.mul(&mut r);
-
-               y1.mul(&mut y2);
-               y2.copy(&y3); y2.frob(&mut f);
-               y1.mul(&mut y2);
-               r.copy(&y1);
-               r.reduce();
-
-
-/*
-               let mut x0=FP12::new_copy(&r);
-               let mut x1=FP12::new_copy(&r);
-               lv.copy(&r); lv.frob(&mut f);
-               let mut x3=FP12::new_copy(&lv); x3.conj(); x1.mul(&mut x3);
-               lv.frob(&mut f); lv.frob(&mut f);
-               x1.mul(&mut lv);
-
-               r=r.pow(&mut x);  //r=r.pow(x);
-               x3.copy(&r); x3.conj(); x1.mul(&mut x3);
-               lv.copy(&r); lv.frob(&mut f);
-               x0.mul(&mut lv);
-               lv.frob(&mut f);
-               x1.mul(&mut lv);
-               lv.frob(&mut f);
-               x3.copy(&lv); x3.conj(); x0.mul(&mut x3);
-
-               r=r.pow(&mut x);
-               x0.mul(&mut r);
-               lv.copy(&r); lv.frob(&mut f); lv.frob(&mut f);
-               x3.copy(&lv); x3.conj(); x0.mul(&mut x3);
-               lv.frob(&mut f);
-               x1.mul(&mut lv);
-
-               r=r.pow(&mut x);
-               lv.copy(&r); lv.frob(&mut f);
-               x3.copy(&lv); x3.conj(); x0.mul(&mut x3);
-               lv.frob(&mut f);
-               x1.mul(&mut lv);
-
-               r=r.pow(&mut x);
-               x3.copy(&r); x3.conj(); x0.mul(&mut x3);
-               lv.copy(&r); lv.frob(&mut f);
-               x1.mul(&mut lv);
-
-               r=r.pow(&mut x);
-               x1.mul(&mut r);
-
-               x0.usqr();
-               x0.mul(&mut x1);
-               r.copy(&x0);
-               r.reduce();  */
-       }
-       return r;
-}
-
-#[allow(non_snake_case)]
-/* GLV method */
-fn glv(e: &mut BIG) -> [BIG;2] {
-       let mut u:[BIG;2]=[BIG::new(),BIG::new()];
-       if rom::CURVE_PAIRING_TYPE == rom::BN_CURVE {
-               let mut t=BIG::new();
-               let q=BIG::new_ints(&rom::CURVE_ORDER);
-               let mut v:[BIG;2]=[BIG::new(),BIG::new()];
-
-               for i in 0..2 {
-                       t.copy(&BIG::new_ints(&rom::CURVE_W[i]));  // why not 
just t=new BIG(ROM.CURVE_W[i]); 
-                       let mut d:DBIG = BIG::mul(&mut t,e);
-                       v[i].copy(&d.div(&q));
-               }
-               u[0].copy(&e);
-               for i in 0..2 {
-                       for j in 0..2 {
-                               t=BIG::new_ints(&rom::CURVE_SB[j][i]);
-                               t=BIG::modmul(&mut v[j],&mut t,&q);
-                               u[i].add(&q);
-                               u[i].sub(&t);
-                               u[i].rmod(&q);
-                       }
-               }
-       } else {
-               let q=BIG::new_ints(&rom::CURVE_ORDER);
-               let x=BIG::new_ints(&rom::CURVE_BNX);
-               let x2=BIG::smul(&x,&x);
-               u[0].copy(&e);  
-               u[0].rmod(&x2);
-               u[1].copy(&e); 
-               u[1].div(&x2);
-               u[1].rsub(&q);
-       }
-       return u;
-}
-
-#[allow(non_snake_case)]
-/* Galbraith & Scott Method */
-pub fn gs(e: &mut BIG) -> [BIG;4] {
-       let mut u:[BIG;4]=[BIG::new(),BIG::new(),BIG::new(),BIG::new()];
-       if rom::CURVE_PAIRING_TYPE == rom::BN_CURVE {
-               let mut t=BIG::new();
-               let q=BIG::new_ints(&rom::CURVE_ORDER);
-
-               let mut v:[BIG;4]=[BIG::new(),BIG::new(),BIG::new(),BIG::new()];
-               for i in 0..4 {
-                       t.copy(&BIG::new_ints(&rom::CURVE_WB[i]));
-                       let mut d:DBIG=BIG::mul(&mut t,e);
-                       v[i].copy(&d.div(&q));
-               }
-               u[0].copy(&e);
-               for i in 0..4 {
-                       for j in 0..4 {
-                               t=BIG::new_ints(&rom::CURVE_BB[j][i]);
-                               t=BIG::modmul(&mut v[j],&mut t,&q);
-                               u[i].add(&q);
-                               u[i].sub(&t);
-                               u[i].rmod(&q);
-                       }
-               }
-       } else {
-               let x=BIG::new_ints(&rom::CURVE_BNX);
-               let mut w=BIG::new_copy(&e);
-               for i in 0..4 {
-                       u[i].copy(&w);
-                       u[i].rmod(&x);
-                       w.div(&x);
-               }
-       }
-       return u;
-}      
-
-#[allow(non_snake_case)]
-/* Multiply P by e in group G1 */
-pub fn g1mul(P: &mut ECP,e: &mut BIG) -> ECP {
-       let mut R=ECP::new();
-       if rom::USE_GLV {
-               P.affine();
-               R.copy(P);
-               let mut Q=ECP::new();
-               Q.copy(P);
-               let q=BIG::new_ints(&rom::CURVE_ORDER);
-               let mut cru=FP::new_big(&BIG::new_ints(&rom::CURVE_CRU));
-               let mut u=glv(e);
-               Q.mulx(&mut cru);
-
-               let mut np=u[0].nbits();
-               let mut t:BIG=BIG::modneg(&mut u[0],&q);
-               let mut nn=t.nbits();
-               if nn<np {
-                       u[0].copy(&t);
-                       R.neg();
-               }
-
-               np=u[1].nbits();
-               t=BIG::modneg(&mut u[1],&q);
-               nn=t.nbits();
-               if nn<np {
-                       u[1].copy(&t);
-                       Q.neg();
-               }
-
-               R=R.mul2(&u[0],&mut Q,&u[1]);
-                       
-       } else {
-               R=P.mul(e);
-       }
-       return R;
-}
-
-#[allow(non_snake_case)]
-/* Multiply P by e in group G2 */
-pub fn g2mul(P: &mut ECP2,e: &mut BIG) -> ECP2 {
-       let mut R=ECP2::new();
-       if rom::USE_GS_G2 {
-               let mut 
Q:[ECP2;4]=[ECP2::new(),ECP2::new(),ECP2::new(),ECP2::new()];
-               let mut f = 
FP2::new_bigs(&BIG::new_ints(&rom::CURVE_FRA),&BIG::new_ints(&rom::CURVE_FRB));
-               let q=BIG::new_ints(&rom::CURVE_ORDER);
-               let mut u=gs(e);
-               let mut T=ECP2::new();
-
-               let mut t=BIG::new();
-               P.affine();
-               Q[0].copy(&P);
-               for i in 1..4 {
-                       T.copy(&Q[i-1]);
-                       Q[i].copy(&T);
-                       Q[i].frob(&mut f);
-               }
-               for i in 0..4 {
-                       let np=u[i].nbits();
-                       t.copy(&BIG::modneg(&mut u[i],&q));
-                       let nn=t.nbits();
-                       if nn<np {
-                               u[i].copy(&t);
-                               Q[i].neg();
-                       }
-               }
-
-               R.copy(&ECP2::mul4(&mut Q,&u));
-
-       } else {
-               R.copy(&P.mul(e));
-       }
-       return R;
-}
-
-/* f=f^e */
-/* Note that this method requires a lot of RAM! Better to use compressed XTR 
method, see FP4.java */
-pub fn gtpow(d: &mut FP12,e: &mut BIG) -> FP12 {
-       let mut r=FP12::new();
-       if rom::USE_GS_GT {
-               let mut 
g:[FP12;4]=[FP12::new(),FP12::new(),FP12::new(),FP12::new()];
-               let mut f = 
FP2::new_bigs(&BIG::new_ints(&rom::CURVE_FRA),&BIG::new_ints(&rom::CURVE_FRB));
-               let q=BIG::new_ints(&rom::CURVE_ORDER);
-               let mut t=BIG::new();
-               let mut u=gs(e);
-               let mut w=FP12::new();
-
-               g[0].copy(&d);
-               for i in 1..4 {
-                       w.copy(&g[i-1]);
-                       g[i].copy(&w);
-                       g[i].frob(&mut f);
-               }
-               for i in 0..4 {
-                       let np=u[i].nbits();
-                       t.copy(&BIG::modneg(&mut u[i],&q));
-                       let nn=t.nbits();
-                       if nn<np {
-                               u[i].copy(&t);
-                               g[i].conj();
-                       }
-               }
-               r.copy(&FP12::pow4(&mut g,&u));
-       } else {
-               r.copy(&d.pow(e));
-       }
-       return r;
-}
-
-/*
-#[allow(non_snake_case)]
-fn main()
-{
-       let mut 
Q=ECP::new_bigs(&BIG::new_ints(&rom::CURVE_GX),&BIG::new_ints(&rom::CURVE_GY));
-       let mut 
P=ECP2::new_fp2s(&FP2::new_bigs(&BIG::new_ints(&rom::CURVE_PXA),&BIG::new_ints(&rom::CURVE_PXB)),&FP2::new_bigs(&BIG::new_ints(&rom::CURVE_PYA),&BIG::new_ints(&rom::CURVE_PYB)));
-
-       let mut r=BIG::new_ints(&rom::CURVE_ORDER);
-       
-       println!("P= {}",P.tostring());
-       println!("Q= {}",Q.tostring());
-
-       //m:=NewBIGint(17)
-
-       let mut e=ate(&mut P,&mut Q);
-       println!("\ne= {}",e.tostring());
-
-       e=fexp(&e);
-
-       for i in 1..10 {
-               e=ate(&mut P,&mut Q);
-               e=fexp(&e);
-       }
-
-
-       //      e=GTpow(e,m);
-
-       println!("\ne= {}",e.tostring());
-
-       
-       fmt.Printf("\n");
-       GLV:=glv(r)
-
-       fmt.Printf("GLV[0]= "+GLV[0].toString())
-       fmt.Printf("\n")
-
-       fmt.Printf("GLV[0]= "+GLV[1].toString())
-       fmt.Printf("\n")
-
-       G:=NewECP(); G.copy(Q)
-       R:=NewECP2(); R.copy(P)
-
-
-       e=ate(R,Q)
-       e=fexp(e)
-
-       e=GTpow(e,xa)
-       fmt.Printf("\ne= "+e.toString());
-       fmt.Printf("\n")
-
-       R=G2mul(R,xa)
-       e=ate(R,G)
-       e=fexp(e)
-
-       fmt.Printf("\ne= "+e.toString())
-       fmt.Printf("\n")
-
-       G=G1mul(G,xa)
-       e=ate(P,G)
-       e=fexp(e)
-       fmt.Printf("\ne= "+e.toString())
-       fmt.Printf("\n") 
-}*/

http://git-wip-us.apache.org/repos/asf/incubator-milagro-crypto/blob/1add7560/version22/rust/src/rand.rs
----------------------------------------------------------------------
diff --git a/version22/rust/src/rand.rs b/version22/rust/src/rand.rs
deleted file mode 100644
index 5cf79ac..0000000
--- a/version22/rust/src/rand.rs
+++ /dev/null
@@ -1,147 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-
-//mod hash256;
-
-use hash256::HASH256;
-
-const RAND_NK: usize=21;
-const RAND_NJ: usize=6;
-const RAND_NV: usize=8;
-
-pub struct RAND {
-       ira: [u32;RAND_NK],  /* random number...   */
-       rndptr: usize,
-       borrow: u32,
-       pool_ptr: usize,
-       pool: [u8;32]
-}
-
-impl RAND {
-
-       pub fn new() -> RAND {
-               RAND {
-                       ira: [0;RAND_NK],
-                       rndptr:0,
-                       borrow: 0,
-                       pool_ptr:0,
-                       pool:[0;32]
-               }
-       }
-
-       pub fn clean(&mut self) {
-               self.pool_ptr=0; self.rndptr=0;
-               for i in 0..32 {self.pool[i]=0}
-               for i in 0..RAND_NK {self.ira[i]=0}
-               self.borrow=0;          
-       }
-
-       fn sbrand(&mut self) -> u32 { /* Marsaglia & Zaman random number 
generator */
-               self.rndptr+=1;
-               if self.rndptr<RAND_NK {return self.ira[self.rndptr]}
-               self.rndptr=0;
-               let mut k=RAND_NK-RAND_NJ;
-               for i in 0..RAND_NK { /* calculate next NK values */
-                       if k==RAND_NK {k=0}
-                       let t=self.ira[k];
-                       let 
pdiff=t.wrapping_sub(self.ira[i]).wrapping_sub(self.borrow);
-                       if pdiff<t {self.borrow=0}
-                       if pdiff>t {self.borrow=1}
-                       self.ira[i]=pdiff;
-                       k+=1;
-               }
-               return self.ira[0];
-       }
-
-       fn sirand(&mut self,seed: u32) {
-               let mut m: u32=1;
-               let mut sd=seed;
-               self.borrow=0;
-               self.rndptr=0;
-               self.ira[0]^=sd;
-               for i in 1..RAND_NK { /* fill initialisation vector */
-                       let inn=(RAND_NV*i)%RAND_NK;
-                       self.ira[inn]^=m;      /* note XOR */
-                       let t=m;
-                       m=sd.wrapping_sub(m);
-                       sd=t;
-               }
-               for _ in 0..10000 {self.sbrand();} /* "warm-up" & stir the 
generator */
-       }
-
-       fn fill_pool(&mut self) {
-               let mut sh=HASH256::new();
-               for _ in 0..128 {sh.process((self.sbrand()&0xff) as u8)}
-               let w=sh.hash();
-               for i in 0..32 {self.pool[i]=w[i]}
-               self.pool_ptr=0;
-       }
-
-       fn pack(b: [u8;4]) -> u32 { /* pack 4 bytes into a 32-bit Word */
-               return ((((b[3] as u32))&0xff)<<24)|(((b[2] as 
u32)&0xff)<<16)|(((b[1] as u32)&0xff)<<8)|((b[0] as u32)&0xff);
-       }
-
-/* Initialize RNG with some real entropy from some external source */
-       pub fn seed(&mut self,rawlen: usize,raw: &[u8]) { /* initialise from at 
least 128 byte string of raw random entropy */
-               let mut b: [u8;4]=[0;4];
-               let mut sh=HASH256::new();
-               self.pool_ptr=0;
-
-               for i in 0..RAND_NK {self.ira[i]=0}
-               if rawlen>0 {
-                       for i in 0..rawlen {
-                               sh.process(raw[i]);
-                       }
-                       let digest=sh.hash();
-
-/* initialise PRNG from distilled randomness */
-
-                       for i in 0..8  {
-                               b[0]=digest[4*i]; b[1]=digest[4*i+1]; 
b[2]=digest[4*i+2]; b[3]=digest[4*i+3];
-                               self.sirand(RAND::pack(b));
-                       }
-               }
-               self.fill_pool();
-       }       
-
-/* get random byte */
-       pub fn getbyte(&mut self) -> u8 { 
-               let r=self.pool[self.pool_ptr];
-               self.pool_ptr+=1;
-               if self.pool_ptr>=32 {self.fill_pool()}
-               return (r&0xff) as u8;
-       }
-}
-
-/* test main program */
-/*
-fn main() {
-       let mut raw : [u8;100]=[0;100];
-       let mut rng=RAND::new();
-
-       rng.clean();
-       for i in 0..100 {raw[i]=i as u8}
-
-       rng.seed(100,&raw);
- 
-       for _ in 0..1000 {
-               print!("{:03} ",rng.getbyte());
-       }
-}
-*/

Reply via email to