speck128256.c 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. #include <stdio.h>
  2. #include <stdint.h>
  3. #include <speck.h>
  4. void Words64ToBytes(u64 words[],u8 bytes[],int numwords)
  5. {
  6. int i,j=0;
  7. for(i=0;i<numwords;i++){
  8. bytes[j]=(u8)words[i];
  9. bytes[j+1]=(u8)(words[i]>>8);
  10. bytes[j+2]=(u8)(words[i]>>16);
  11. bytes[j+3]=(u8)(words[i]>>24);
  12. bytes[j+4]=(u8)(words[i]>>32);
  13. bytes[j+5]=(u8)(words[i]>>40);
  14. bytes[j+6]=(u8)(words[i]>>48);
  15. bytes[j+7]=(u8)(words[i]>>56);
  16. j+=8;
  17. }
  18. }
  19. void BytesToWords64(u8 bytes[],u64 words[],int numbytes)
  20. {
  21. int i,j=0;
  22. for(i=0;i<numbytes/8;i++){
  23. words[i]=(u64)bytes[j] | ((u64)bytes[j+1]<<8) | ((u64)bytes[j+2]<<16) |
  24. ((u64)bytes[j+3]<<24) | ((u64)bytes[j+4]<<32) | ((u64)bytes[j+5]<<40) |
  25. ((u64)bytes[j+6]<<48) | ((u64)bytes[j+7]<<56); j+=8; }
  26. }
  27. void Speck128256KeySchedule(u64 K[],u64 rk[])
  28. {
  29. u64 i,D=K[3],C=K[2],B=K[1],A=K[0];
  30. for(i=0;i<33;){
  31. rk[i]=A; ER64(B,A,i++);
  32. rk[i]=A; ER64(C,A,i++);
  33. rk[i]=A; ER64(D,A,i++);
  34. }
  35. rk[i]=A;
  36. }
  37. void Speck128256Encrypt(u64 Pt[],u64 Ct[],u64 rk[])
  38. {
  39. u64 i;
  40. Ct[0]=Pt[0]; Ct[1]=Pt[1];
  41. for(i=0;i<34;) ER64(Ct[1],Ct[0],rk[i++]);
  42. }
  43. void Speck128256Decrypt(u64 Pt[],u64 Ct[],u64 rk[])
  44. {
  45. int i;
  46. Pt[0]=Ct[0]; Pt[1]=Ct[1];
  47. for(i=33;i>=0;) DR64(Pt[1],Pt[0],rk[i--]);
  48. }
  49. void EncryptBlock(u8 pt[], u8 k[], u8 ct[]) {
  50. u64 Pt[2] = {0};
  51. u64 K[4] = {0};
  52. u64 rk[34] = {0};
  53. u64 Ct[2] = {0};
  54. BytesToWords64(pt,Pt,16);
  55. BytesToWords64(k,K,32);
  56. Speck128256KeySchedule(K,rk);
  57. Speck128256Encrypt(Pt,Ct,rk);
  58. Words64ToBytes(Ct,ct,2);
  59. }