1 5 package org.h2.security; 6 7 import org.h2.engine.Constants; 8 import org.h2.message.Message; 9 10 15 public class XTEA implements BlockCipher { 16 17 19 private static final int DELTA = 0x9E3779B9; 21 private int k0, k1, k2, k3, k4, k5, k6, k7, k8, k9, k10, k11, k12, k13, k14, k15; 22 private int k16, k17, k18, k19, k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k30, k31; 23 24 public void setKey(byte[] b) { 25 int[] key = new int[4]; 26 for (int i = 0; i < 16;) { 27 key[i / 4] = (b[i++] << 24) + ((b[i++] & 255) << 16) + ((b[i++] & 255) << 8) + (b[i++] & 255); 28 } 29 int[] r = new int[32]; 30 for (int i = 0, sum = 0; i < 32;) { 31 r[i++] = sum + key[sum & 3]; 32 sum += DELTA; 33 r[i++] = sum + key[ (sum >>> 11) & 3]; 34 } 35 k0=r[0];k1=r[1];k2=r[2];k3=r[3];k4=r[4];k5=r[5];k6=r[6];k7=r[7]; 36 k8=r[8];k9=r[9];k10=r[10];k11=r[11];k12=r[12];k13=r[13];k14=r[14];k15=r[15]; 37 k16=r[16];k17=r[17];k18=r[18];k19=r[19];k20=r[20];k21=r[21];k22=r[22];k23=r[23]; 38 k24=r[24];k25=r[25];k26=r[26];k27=r[27];k28=r[28];k29=r[29];k30=r[30];k31=r[31]; 39 } 40 41 public void encrypt(byte[] bytes, int off, int len) { 42 if (Constants.CHECK && (len % ALIGN != 0)) { 43 throw Message.getInternalError("unaligned len " + len); 44 } 45 for (int i = off; i < off + len; i += 8) { 46 encryptBlock(bytes, bytes, i); 47 } 48 } 49 50 public void decrypt(byte[] bytes, int off, int len) { 51 if (Constants.CHECK && (len % ALIGN != 0)) { 52 throw Message.getInternalError("unaligned len " + len); 53 } 54 for (int i = off; i < off + len; i += 8) { 55 decryptBlock(bytes, bytes, i); 56 } 57 } 58 59 public void encryptBlock(byte[] in, byte[] out, int off) { 60 int y = (in[off] << 24) | ((in[off+1] & 255) << 16) | ((in[off+2] & 255) << 8) | (in[off+3] & 255); 61 int z = (in[off+4] << 24) | ((in[off+5] & 255) << 16) | ((in[off+6] & 255) << 8) | (in[off+7] & 255); 62 y += (((z << 4) ^ (z >>> 5)) + z) ^ k0 ; z += (((y >>> 5) ^ (y << 4)) + y) ^ k1; 63 y += (((z << 4) ^ (z >>> 5)) + z) ^ k2 ; z += (((y >>> 5) ^ (y << 4)) + y) ^ k3; 64 y += (((z << 4) ^ (z >>> 5)) + z) ^ k4; z += (((y >>> 5) ^ (y << 4)) + y) ^ k5; 65 y += (((z << 4) ^ (z >>> 5)) + z) ^ k6; z += (((y >>> 5) ^ (y << 4)) + y) ^ k7; 66 y += (((z << 4) ^ (z >>> 5)) + z) ^ k8; z += (((y >>> 5) ^ (y << 4)) + y) ^ k9; 67 y += (((z << 4) ^ (z >>> 5)) + z) ^ k10; z += (((y >>> 5) ^ (y << 4)) + y) ^ k11; 68 y += (((z << 4) ^ (z >>> 5)) + z) ^ k12; z += (((y >>> 5) ^ (y << 4)) + y) ^ k13; 69 y += (((z << 4) ^ (z >>> 5)) + z) ^ k14; z += (((y >>> 5) ^ (y << 4)) + y) ^ k15; 70 y += (((z << 4) ^ (z >>> 5)) + z) ^ k16; z += (((y >>> 5) ^ (y << 4)) + y) ^ k17; 71 y += (((z << 4) ^ (z >>> 5)) + z) ^ k18; z += (((y >>> 5) ^ (y << 4)) + y) ^ k19; 72 y += (((z << 4) ^ (z >>> 5)) + z) ^ k20; z += (((y >>> 5) ^ (y << 4)) + y) ^ k21; 73 y += (((z << 4) ^ (z >>> 5)) + z) ^ k22; z += (((y >>> 5) ^ (y << 4)) + y) ^ k23; 74 y += (((z << 4) ^ (z >>> 5)) + z) ^ k24; z += (((y >>> 5) ^ (y << 4)) + y) ^ k25; 75 y += (((z << 4) ^ (z >>> 5)) + z) ^ k26; z += (((y >>> 5) ^ (y << 4)) + y) ^ k27; 76 y += (((z << 4) ^ (z >>> 5)) + z) ^ k28; z += (((y >>> 5) ^ (y << 4)) + y) ^ k29; 77 y += (((z << 4) ^ (z >>> 5)) + z) ^ k30; z += (((y >>> 5) ^ (y << 4)) + y) ^ k31; 78 out[off] = (byte) (y >> 24); out[off+1] = (byte) (y >> 16); out[off+2] = (byte) (y >> 8); out[off+3] = (byte) y; 79 out[off+4] = (byte) (z >> 24); out[off+5] = (byte) (z >> 16); out[off+6] = (byte) (z >> 8); out[off+7] = (byte) z; 80 } 81 82 public void decryptBlock(byte[] in, byte[] out, int off) { 83 int y = (in[off] << 24) | ((in[off+1] & 255) << 16) | ((in[off+2] & 255) << 8) | (in[off+3] & 255) ; 84 int z = (in[off+4] << 24) | ((in[off+5] & 255) << 16) | ((in[off+6] & 255) << 8) | (in[off+7] & 255); 85 z -= (((y >>> 5) ^ (y << 4)) + y) ^ k31; y -= (((z << 4) ^ (z >>> 5)) + z) ^ k30; 86 z -= (((y >>> 5) ^ (y << 4)) + y) ^ k29; y -= (((z << 4) ^ (z >>> 5)) + z) ^ k28; 87 z -= (((y >>> 5) ^ (y << 4)) + y) ^ k27; y -= (((z << 4) ^ (z >>> 5)) + z) ^ k26; 88 z -= (((y >>> 5) ^ (y << 4)) + y) ^ k25; y -= (((z << 4) ^ (z >>> 5)) + z) ^ k24; 89 z -= (((y >>> 5) ^ (y << 4)) + y) ^ k23; y -= (((z << 4) ^ (z >>> 5)) + z) ^ k22; 90 z -= (((y >>> 5) ^ (y << 4)) + y) ^ k21; y -= (((z << 4) ^ (z >>> 5)) + z) ^ k20; 91 z -= (((y >>> 5) ^ (y << 4)) + y) ^ k19; y -= (((z << 4) ^ (z >>> 5)) + z) ^ k18; 92 z -= (((y >>> 5) ^ (y << 4)) + y) ^ k17; y -= (((z << 4) ^ (z >>> 5)) + z) ^ k16; 93 z -= (((y >>> 5) ^ (y << 4)) + y) ^ k15; y -= (((z << 4) ^ (z >>> 5)) + z) ^ k14; 94 z -= (((y >>> 5) ^ (y << 4)) + y) ^ k13; y -= (((z << 4) ^ (z >>> 5)) + z) ^ k12; 95 z -= (((y >>> 5) ^ (y << 4)) + y) ^ k11; y -= (((z << 4) ^ (z >>> 5)) + z) ^ k10; 96 z -= (((y >>> 5) ^ (y << 4)) + y) ^ k9; y -= (((z << 4) ^ (z >>> 5)) + z) ^ k8; 97 z -= (((y >>> 5) ^ (y << 4)) + y) ^ k7; y -= (((z << 4) ^ (z >>> 5)) + z) ^ k6; 98 z -= (((y >>> 5) ^ (y << 4)) + y) ^ k5; y -= (((z << 4) ^ (z >>> 5)) + z) ^ k4; 99 z -= (((y >>> 5) ^ (y << 4)) + y) ^ k3; y -= (((z << 4) ^ (z >>> 5)) + z) ^ k2; 100 z -= (((y >>> 5) ^ (y << 4)) + y) ^ k1; y -= (((z << 4) ^ (z >>> 5)) + z) ^ k0; 101 out[off] = (byte) (y >> 24); out[off+1] = (byte) (y >> 16); out[off+2] = (byte) (y >> 8); out[off+3] = (byte) y; 102 out[off+4] = (byte) (z >> 24); out[off+5] = (byte) (z >> 16); out[off+6] = (byte) (z >> 8); out[off+7] = (byte) z; 103 } 104 105 public int getKeyLength() { 106 return 16; 107 } 108 109 } 110 | Popular Tags |