public override void doUpdate(byte[] i, int inOffset, int len) { byte[] data; if (nonProcessed != null) { int totalLen = len + nonProcessed.Length; data = new byte[totalLen]; ConversionUtils.arraycopy(nonProcessed, 0, data, 0, nonProcessed.Length); ConversionUtils.arraycopy(i, inOffset, data, nonProcessed.Length, len); } else { data = new byte[len]; ConversionUtils.arraycopy(i, inOffset, data, 0, len); } int count = 0; while (count < data.Length - 0x10) { byte[] aux = new byte[0x10]; ConversionUtils.arraycopy(data, count, aux, 0, aux.Length); ToolsImpl.XOR(aux, aux, previous); ToolsImpl.aesecbEncrypt(key, aux, 0, previous, 0, aux.Length); count += 0x10; } nonProcessed = new byte[data.Length - count]; ConversionUtils.arraycopy(data, count, nonProcessed, 0, nonProcessed.Length); }
private bool checkNPDHash2(byte[] klicensee, byte[] npd) { byte[] xoredKey = new byte[0x10]; ToolsImpl.XOR(xoredKey, klicensee, EDATKeys.npdrm_omac_key2); byte[] calculated = ToolsImpl.CMAC128(xoredKey, npd, 0, 0x60); bool result2 = compareBytes(calculated, 0, npd, 0x60, 0x10); if (result2) { Debug.WriteLine("NPD hash 2 is valid (" + ConversionUtils.getHexString(calculated) + ")"); } return(result2); }
public override bool doFinal(byte[] expectedhash, int hashOffset, bool hashDebug) { byte[] aux = new byte[0x10]; ConversionUtils.arraycopy(nonProcessed, 0, aux, 0, nonProcessed.Length); if (nonProcessed.Length == 0x10) { ToolsImpl.XOR(aux, aux, K1); } else { aux[nonProcessed.Length] = (byte)0x80; ToolsImpl.XOR(aux, aux, K2); } ToolsImpl.XOR(aux, aux, previous); byte[] calculatedhash = new byte[0x10]; ToolsImpl.aesecbEncrypt(key, aux, 0, calculatedhash, 0, aux.Length); return(hashDebug || compareBytes(expectedhash, hashOffset, calculatedhash, 0, hashLen)); }
private byte[] getKey(NPD npd, EDATData data, byte[] devKLic, byte[] keyFromRif) { byte[] result = null; if ((data.getFlags() & FLAG_SDAT) != 0) { //Case SDAT result = new byte[0x10]; ToolsImpl.XOR(result, npd.getDevHash(), EDATKeys.SDATKEY); } else { //Case EDAT if (npd.getLicense() == 0x03) { result = devKLic; } else if (npd.getLicense() == 0x02) { result = keyFromRif; } } return(result); }