/*     */ package cn.com.esgcc.ai.matrix.sdk.util.encrypt.sm3;
/*     */ 
/*     */

import java.io.*;
import java.math.BigInteger;
import java.util.Arrays;
import java.util.Locale;
/*     */ 
/*     */ 
/*     */ 
/*     */ public class SM3
/*     */ {
/*  16 */   private static char[] hexDigits = new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
/*     */   
/*     */   private static final String ivHexStr = "7380166f 4914b2b9 172442d7 da8a0600 a96f30bc 163138aa e38dee4d b0fb0e4e";
/*  19 */   private static final BigInteger IV = new BigInteger("7380166f 4914b2b9 172442d7 da8a0600 a96f30bc 163138aa e38dee4d b0fb0e4e".replaceAll(" ", ""), 16);
/*     */   
/*  21 */   private static final Integer Tj15 = Integer.valueOf("79cc4519", 16);
/*  22 */   private static final Integer Tj63 = Integer.valueOf("7a879d8a", 16);
/*  23 */   private static final byte[] FirstPadding = new byte[] { Byte.MIN_VALUE };
/*  24 */   private static final byte[] ZeroPadding = new byte[] { 0 };
/*     */   
/*     */   private static int T(int j) {
/*  27 */     if (j >= 0 && j <= 15)
/*  28 */       return Tj15.intValue(); 
/*  29 */     if (j >= 16 && j <= 63) {
/*  30 */       return Tj63.intValue();
/*     */     }
/*  32 */     throw new RuntimeException("data invalid");
/*     */   }
/*     */ 
/*     */   
/*     */   private static Integer FF(Integer x, Integer y, Integer z, int j) {
/*  37 */     if (j >= 0 && j <= 15)
/*  38 */       return Integer.valueOf(x.intValue() ^ y.intValue() ^ z.intValue()); 
/*  39 */     if (j >= 16 && j <= 63) {
/*  40 */       return Integer.valueOf(x.intValue() & y.intValue() | x
/*  41 */           .intValue() & z.intValue() | y
/*  42 */           .intValue() & z.intValue());
/*     */     }
/*  44 */     throw new RuntimeException("data invalid");
/*     */   }
/*     */ 
/*     */   
/*     */   private static Integer GG(Integer x, Integer y, Integer z, int j) {
/*  49 */     if (j >= 0 && j <= 15)
/*  50 */       return Integer.valueOf(x.intValue() ^ y.intValue() ^ z.intValue()); 
/*  51 */     if (j >= 16 && j <= 63) {
/*  52 */       return Integer.valueOf(x.intValue() & y.intValue() | (x
/*  53 */           .intValue() ^ 0xFFFFFFFF) & z.intValue());
/*     */     }
/*  55 */     throw new RuntimeException("data invalid");
/*     */   }
/*     */ 
/*     */   
/*     */   private static Integer P0(Integer x) {
/*  60 */     return Integer.valueOf(x.intValue() ^ 
/*  61 */         Integer.rotateLeft(x.intValue(), 9) ^ 
/*  62 */         Integer.rotateLeft(x.intValue(), 17));
/*     */   }
/*     */   
/*     */   private static Integer P1(Integer x) {
/*  66 */     return Integer.valueOf(x.intValue() ^ 
/*  67 */         Integer.rotateLeft(x.intValue(), 15) ^ 
/*  68 */         Integer.rotateLeft(x.intValue(), 23));
/*     */   }
/*     */   
/*     */   private static byte[] padding(byte[] source) throws IOException {
/*  72 */     if (source.length >= 2305843009213693952L) {
/*  73 */       throw new RuntimeException("src data invalid.");
/*     */     }
/*  75 */     long l = (source.length * 8);
/*  76 */     long k = 448L - (l + 1L) % 512L;
/*  77 */     if (k < 0L) {
/*  78 */       k += 512L;
/*     */     }
/*  80 */     ByteArrayOutputStream baos = new ByteArrayOutputStream();
/*  81 */     baos.write(source);
/*  82 */     baos.write(FirstPadding);
/*  83 */     long i = k - 7L;
/*  84 */     while (i > 0L) {
/*  85 */       baos.write(ZeroPadding);
/*  86 */       i -= 8L;
/*     */     } 
/*  88 */     baos.write(long2bytes(l));
/*  89 */     return baos.toByteArray();
/*     */   }
/*     */   
/*     */   private static byte[] long2bytes(long l) {
/*  93 */     byte[] bytes = new byte[8];
/*  94 */     for (int i = 0; i < 8; i++) {
/*  95 */       bytes[i] = (byte)(int)(l >>> (7 - i) * 8);
/*     */     }
/*  97 */     return bytes;
/*     */   }
/*     */   
/*     */   public static byte[] hash(byte[] source) throws IOException {
/* 101 */     byte[] m1 = padding(source);
/* 102 */     int n = m1.length / 64;
/*     */     
/* 104 */     byte[] vi = IV.toByteArray();
/* 105 */     byte[] vi1 = null;
/* 106 */     for (int i = 0; i < n; i++) {
/* 107 */       byte[] b = Arrays.copyOfRange(m1, i * 64, (i + 1) * 64);
/* 108 */       vi1 = CF(vi, b);
/* 109 */       vi = vi1;
/*     */     } 
/* 111 */     return vi1;
/*     */   }
/*     */ 
/*     */   
/*     */   private static byte[] CF(byte[] vi, byte[] bi) throws IOException {
/* 116 */     int a = toInteger(vi, 0);
/* 117 */     int b = toInteger(vi, 1);
/* 118 */     int c = toInteger(vi, 2);
/* 119 */     int d = toInteger(vi, 3);
/* 120 */     int e = toInteger(vi, 4);
/* 121 */     int f = toInteger(vi, 5);
/* 122 */     int g = toInteger(vi, 6);
/* 123 */     int h = toInteger(vi, 7);
/*     */     
/* 125 */     int[] w = new int[68];
/* 126 */     int[] w1 = new int[64];
/* 127 */     for (int i = 0; i < 16; i++)
/* 128 */       w[i] = toInteger(bi, i); 
/*     */     int j;
/* 130 */     for (j = 16; j < 68; j++) {
/* 131 */       w[j] = P1(Integer.valueOf(w[j - 16] ^ w[j - 9] ^ Integer.rotateLeft(w[j - 3], 15))).intValue() ^ 
/* 132 */         Integer.rotateLeft(w[j - 13], 7) ^ w[j - 6];
/*     */     }
/* 134 */     for (j = 0; j < 64; j++) {
/* 135 */       w1[j] = w[j] ^ w[j + 4];
/*     */     }
/*     */     
/* 138 */     for (int k = 0; k < 64; k++) {
/*     */       
/* 140 */       int ss1 = Integer.rotateLeft(
/* 141 */           Integer.rotateLeft(a, 12) + e + 
/* 142 */           Integer.rotateLeft(T(k), k), 7);
/* 143 */       int ss2 = ss1 ^ Integer.rotateLeft(a, 12);
/* 144 */       int tt1 = FF(Integer.valueOf(a), Integer.valueOf(b), Integer.valueOf(c), k).intValue() + d + ss2 + w1[k];
/* 145 */       int tt2 = GG(Integer.valueOf(e), Integer.valueOf(f), Integer.valueOf(g), k).intValue() + h + ss1 + w[k];
/* 146 */       d = c;
/* 147 */       c = Integer.rotateLeft(b, 9);
/* 148 */       b = a;
/* 149 */       a = tt1;
/* 150 */       h = g;
/* 151 */       g = Integer.rotateLeft(f, 19);
/* 152 */       f = e;
/* 153 */       e = P0(Integer.valueOf(tt2)).intValue();
/*     */     } 
/* 155 */     byte[] v = toByteArray(a, b, c, d, e, f, g, h);
/* 156 */     for (int m = 0; m < v.length; m++) {
/* 157 */       v[m] = (byte)(v[m] ^ vi[m]);
/*     */     }
/* 159 */     return v;
/*     */   }
/*     */   
/*     */   private static int toInteger(byte[] source, int index) {
/* 163 */     StringBuilder valueStr = new StringBuilder("");
/* 164 */     for (int i = 0; i < 4; i++) {
/* 165 */       valueStr.append(hexDigits[(byte)((source[index * 4 + i] & 0xF0) >> 4)]);
/* 166 */       valueStr.append(hexDigits[(byte)(source[index * 4 + i] & 0xF)]);
/*     */     } 
/* 168 */     return Long.valueOf(valueStr.toString(), 16).intValue();
/*     */   }
/*     */ 
/*     */ 
/*     */   
/*     */   private static byte[] toByteArray(int a, int b, int c, int d, int e, int f, int g, int h) throws IOException {
/* 174 */     ByteArrayOutputStream baos = new ByteArrayOutputStream(32);
/* 175 */     baos.write(toByteArray(a));
/* 176 */     baos.write(toByteArray(b));
/* 177 */     baos.write(toByteArray(c));
/* 178 */     baos.write(toByteArray(d));
/* 179 */     baos.write(toByteArray(e));
/* 180 */     baos.write(toByteArray(f));
/* 181 */     baos.write(toByteArray(g));
/* 182 */     baos.write(toByteArray(h));
/* 183 */     return baos.toByteArray();
/*     */   }
/*     */   
/*     */   public static byte[] toByteArray(int i) {
/* 187 */     byte[] byteArray = new byte[4];
/* 188 */     byteArray[0] = (byte)(i >>> 24);
/* 189 */     byteArray[1] = (byte)((i & 0xFFFFFF) >>> 16);
/* 190 */     byteArray[2] = (byte)((i & 0xFFFF) >>> 8);
/* 191 */     byteArray[3] = (byte)(i & 0xFF);
/* 192 */     return byteArray;
/*     */   }
/*     */   private static String byteToHexString(byte b) {
/* 195 */     int n = b;
/* 196 */     if (n < 0)
/* 197 */       n = 256 + n; 
/* 198 */     int d1 = n / 16;
/* 199 */     int d2 = n % 16;
/* 200 */     return "" + hexDigits[d1] + hexDigits[d2];
/*     */   }
/*     */   
/*     */   public static String byteArrayToHexString(byte[] b) {
/* 204 */     StringBuffer resultSb = new StringBuffer();
/* 205 */     for (int i = 0; i < b.length; i++) {
/* 206 */       resultSb.append(byteToHexString(b[i]));
/*     */     }
/* 208 */     return resultSb.toString();
/*     */   }
/*     */   public static byte[] hash(InputStream inputStream) throws IOException {
/* 211 */     byte[] vi = IV.toByteArray();
/* 212 */     byte[] vi1 = null;
/*     */     
/* 214 */     byte[] bytes = new byte[64];
/* 215 */     int length = -1;
/* 216 */     int totalLength = 0;
/* 217 */     while ((length = inputStream.read(bytes)) != -1) {
/* 218 */       totalLength += length;
/* 219 */       if (inputStream.available() == 0) {
/* 220 */         bytes = padding(Arrays.copyOfRange(bytes, 0, length), Integer.valueOf(totalLength));
/*     */       }
/* 222 */       vi1 = CF(vi, bytes);
/* 223 */       vi = vi1;
/*     */     } 
/* 225 */     return vi1;
/*     */   }
/*     */   private static byte[] padding(byte[] source, Integer length) throws IOException {
/* 228 */     if (source.length >= 2305843009213693952L) {
/* 229 */       throw new RuntimeException("src data invalid.");
/*     */     }
/* 231 */     long l = (source.length * 8);
/* 232 */     long k = 448L - (l + 1L) % 512L;
/* 233 */     if (k < 0L) {
/* 234 */       k += 512L;
/*     */     }
/* 236 */     ByteArrayOutputStream baos = new ByteArrayOutputStream();
/* 237 */     baos.write(source);
/* 238 */     baos.write(FirstPadding);
/* 239 */     long i = k - 7L;
/* 240 */     while (i > 0L) {
/* 241 */       baos.write(ZeroPadding);
/* 242 */       i -= 8L;
/*     */     } 
/* 244 */     baos.write(long2bytes((length == null) ? l : (length.intValue() * 8)));
/* 245 */     return baos.toByteArray();
/*     */   }
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */   
/*     */   public static String hash(String data) {
/*     */     try {
/* 256 */       return byteArrayToHexString(hash(data.getBytes())).toLowerCase(Locale.ENGLISH);
/* 257 */     } catch (IOException e) {
/* 258 */       e.printStackTrace();
/* 259 */       return null;
/*     */     } 
/*     */   }
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */   
/*     */   public static String hashInputStream(InputStream inputStream) {
/*     */     try {
/* 270 */       return byteArrayToHexString(hash(inputStream)).toLowerCase(Locale.ENGLISH);
/* 271 */     } catch (IOException e) {
/* 272 */       e.printStackTrace();
/* 273 */       return null;
/*     */     } 
/*     */   }
/*     */   public static void main(String[] args) throws IOException {
/* 277 */     System.out.println(byteArrayToHexString(hash("test sm3 hash".getBytes())));
/*     */     
/* 279 */     File file = new File("C:\\Users\\34840\\Desktop\\test.txt");
/* 280 */     FileInputStream fileInputStream = new FileInputStream(file);
/*     */     
/* 282 */     System.out.println(byteArrayToHexString(hash(fileInputStream)));
/*     */   }
/*     */ }


/* Location:              C:\Users\ningj\Desktop\java-sdk-1.0.0-SNAPSHOT\!\cn\com\esgcc\ai\matrix\sd\\util\encrypt\sm3\SM3.class
 * Java compiler version: 8 (52.0)
 * JD-Core Version:       1.1.3
 */