1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 |
- #include <stdio.h>
- #include <stdint.h>
- #include <speck.h>
- void Words64ToBytes(u64 words[],u8 bytes[],int numwords)
- {
- int i,j=0;
- for(i=0;i<numwords;i++){
- bytes[j]=(u8)words[i];
- bytes[j+1]=(u8)(words[i]>>8);
- bytes[j+2]=(u8)(words[i]>>16);
- bytes[j+3]=(u8)(words[i]>>24);
- bytes[j+4]=(u8)(words[i]>>32);
- bytes[j+5]=(u8)(words[i]>>40);
- bytes[j+6]=(u8)(words[i]>>48);
- bytes[j+7]=(u8)(words[i]>>56);
- j+=8;
- }
- }
- void BytesToWords64(u8 bytes[],u64 words[],int numbytes)
- {
- int i,j=0;
- for(i=0;i<numbytes/8;i++){
- words[i]=(u64)bytes[j] | ((u64)bytes[j+1]<<8) | ((u64)bytes[j+2]<<16) |
- ((u64)bytes[j+3]<<24) | ((u64)bytes[j+4]<<32) | ((u64)bytes[j+5]<<40) |
- ((u64)bytes[j+6]<<48) | ((u64)bytes[j+7]<<56); j+=8; }
- }
- void Speck128256KeySchedule(u64 K[],u64 rk[])
- {
- u64 i,D=K[3],C=K[2],B=K[1],A=K[0];
- for(i=0;i<33;){
- rk[i]=A; ER64(B,A,i++);
- rk[i]=A; ER64(C,A,i++);
- rk[i]=A; ER64(D,A,i++);
- }
- rk[i]=A;
- }
- void Speck128256Encrypt(u64 Pt[],u64 Ct[],u64 rk[])
- {
- u64 i;
- Ct[0]=Pt[0]; Ct[1]=Pt[1];
- for(i=0;i<34;) ER64(Ct[1],Ct[0],rk[i++]);
- }
- void Speck128256Decrypt(u64 Pt[],u64 Ct[],u64 rk[])
- {
- int i;
- Pt[0]=Ct[0]; Pt[1]=Ct[1];
- for(i=33;i>=0;) DR64(Pt[1],Pt[0],rk[i--]);
- }
- void EncryptBlock(u8 pt[], u8 k[], u8 ct[]) {
- u64 Pt[2] = {0};
- u64 K[4] = {0};
- u64 rk[34] = {0};
- u64 Ct[2] = {0};
- BytesToWords64(pt,Pt,16);
- BytesToWords64(k,K,32);
- Speck128256KeySchedule(K,rk);
- Speck128256Encrypt(Pt,Ct,rk);
- Words64ToBytes(Ct,ct,2);
- }
|