hhhhhhfuck
This commit is contained in:
parent
ead19b2175
commit
1687d16832
|
@ -0,0 +1,48 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
|
||||||
|
namespace libsharperang {
|
||||||
|
public class CRC32 {
|
||||||
|
public uint Initial { get; private set; } = 0xFFFFFFFF;
|
||||||
|
private uint Polynomial = 0xedb88320;
|
||||||
|
//private uint Polynomial = 0x04c11db7;
|
||||||
|
private uint[] Table;
|
||||||
|
public bool Initialised=false;
|
||||||
|
public CRC32(uint Initial) => this.Initial=Initial;
|
||||||
|
public CRC32() { }
|
||||||
|
public void Initialise() {
|
||||||
|
Table=Enumerable.Range(0, 256).Select(i => {
|
||||||
|
uint e=(uint)i;
|
||||||
|
for (ushort eb = 0; eb<8; ++eb) {
|
||||||
|
e=((e&1)!=0)
|
||||||
|
? (Polynomial^(e>>1))
|
||||||
|
: (e>>1);
|
||||||
|
}
|
||||||
|
return e;
|
||||||
|
}).ToArray();
|
||||||
|
Initialised=true;
|
||||||
|
}
|
||||||
|
public uint Reflect(uint iv) {
|
||||||
|
uint ivr=0;
|
||||||
|
for (int i = 0; i<32; i++) {
|
||||||
|
uint bit=(iv>>i)&1;
|
||||||
|
ivr |= (bit<<(31-i));
|
||||||
|
}
|
||||||
|
return ~ivr;
|
||||||
|
}
|
||||||
|
public uint GetChecksum<T>(IEnumerable<T> bytes) {
|
||||||
|
if (!Initialised) Initialise();
|
||||||
|
try {
|
||||||
|
return ~bytes.Aggregate(Initial,
|
||||||
|
(csR, cB) => Table[(csR & 0xFF) ^ Convert.ToByte(cB)] ^ (csR>>8));
|
||||||
|
} catch (FormatException e) {
|
||||||
|
throw new Exception("Could not read stream as bytes", e);
|
||||||
|
} catch (InvalidCastException e) {
|
||||||
|
throw new Exception("Could not read stream as bytes", e);
|
||||||
|
} catch (OverflowException e) {
|
||||||
|
throw new Exception("Could not read stream as bytes", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -3,29 +3,40 @@ using Crc;
|
||||||
|
|
||||||
namespace libsharperang {
|
namespace libsharperang {
|
||||||
public class DataTransforms {
|
public class DataTransforms {
|
||||||
public class CrcSum : Crc32Base {
|
/*public class CrcSum : Crc32Base {
|
||||||
public uint CrcKey;
|
public uint CrcKey;
|
||||||
public CrcSum(uint Mangled, uint Key) : base(0x04c11db7, Mangled, 0xffffffff, true, true) => CrcKey=Key;
|
public CrcSum(uint Mangled, uint Key) : base(0x04c11db7, Mangled, 0xffffffff, true, true) => CrcKey=Key;
|
||||||
}
|
}
|
||||||
private uint Bludgeon(uint iv) {
|
|
||||||
uint ivr=0;
|
public CrcSum CRC;*/
|
||||||
for (int i=0;i<32;i++) {
|
public CRC32 hasher;
|
||||||
uint bit=(iv>>i)&1;
|
private uint MagicNumber=0x35769521;
|
||||||
ivr |= (bit<<(31-i));
|
//public bool IsCrcInitialised() => (CRC!=null);
|
||||||
}
|
public bool IsCrcInitialised() => (hasher!=null && hasher.Initialised);
|
||||||
return ~ivr;
|
//public void InitialiseCrc() => CRC=new CrcSum(Bludgeon(0x77c40d4d^0x35769521), 0x77c40d4d);
|
||||||
|
//public void InitialiseCrc(uint Key) => CRC=new CrcSum(Bludgeon(Key), Key);
|
||||||
|
public void InitialiseCrc(uint Key=0x35769521) {
|
||||||
|
if (hasher==null || (hasher.Initialised && hasher.Initial != Key)) hasher=new CRC32(Key);
|
||||||
|
hasher.Initialise();
|
||||||
|
}
|
||||||
|
public byte[] GetHashSum(byte[] data) {
|
||||||
|
if (!IsCrcInitialised()) InitialiseCrc();
|
||||||
|
//return CRC.ComputeHash(data);
|
||||||
|
return BitConverter.GetBytes(hasher.GetChecksum(data));
|
||||||
}
|
}
|
||||||
public CrcSum CRC;
|
|
||||||
public bool IsCrcInitialised() => (CRC!=null);
|
|
||||||
public void InitialiseCrc() => CRC=new CrcSum(Bludgeon(0x77c40d4d^0x35769521), 0x77c40d4d);
|
|
||||||
public void InitialiseCrc(uint Key) => CRC=new CrcSum(Bludgeon(Key), Key);
|
|
||||||
public uint GetCrcKey() {
|
public uint GetCrcKey() {
|
||||||
if (!IsCrcInitialised()) InitialiseCrc();
|
if (!IsCrcInitialised()) InitialiseCrc();
|
||||||
return CRC.CrcKey;
|
//return CRC.CrcKey;
|
||||||
|
return (hasher.Initial == MagicNumber? hasher.Initial : hasher.Initial ^ MagicNumber);
|
||||||
}
|
}
|
||||||
public byte[] GetCrcKeyBytes() {
|
public byte[] GetCrcKeyBytes() {
|
||||||
if (!IsCrcInitialised()) InitialiseCrc();
|
if (!IsCrcInitialised()) InitialiseCrc();
|
||||||
return BitConverter.GetBytes(GetCrcKey());
|
return BitConverter.GetBytes(GetCrcKey());
|
||||||
}
|
}
|
||||||
|
public uint SwapEndianness(uint value) => (
|
||||||
|
(value & 0x000000FFU) << 24) |
|
||||||
|
((value & 0x0000FF00U) << 8) |
|
||||||
|
((value & 0x00FF0000U) >> 8) |
|
||||||
|
((value & 0xFF000000U) >> 24);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -62,6 +62,7 @@ using LibUsbDotNet.Main;
|
||||||
namespace libsharperang {
|
namespace libsharperang {
|
||||||
public class Frame {
|
public class Frame {
|
||||||
public DataTransforms transformer=new DataTransforms();
|
public DataTransforms transformer=new DataTransforms();
|
||||||
|
|
||||||
public enum Opcode {
|
public enum Opcode {
|
||||||
SessionBegin = 10,
|
SessionBegin = 10,
|
||||||
SessionEnd,
|
SessionEnd,
|
||||||
|
@ -69,6 +70,8 @@ namespace libsharperang {
|
||||||
PrintContinue,
|
PrintContinue,
|
||||||
CrcTransmit = 30
|
CrcTransmit = 30
|
||||||
}
|
}
|
||||||
|
private byte FrameStart = 0x02;
|
||||||
|
private byte FrameEnd = 0x03;
|
||||||
private byte[] ResolveOpcode(Opcode opcode) {
|
private byte[] ResolveOpcode(Opcode opcode) {
|
||||||
switch (opcode) {
|
switch (opcode) {
|
||||||
case Opcode.SessionBegin: return new byte[] { 0x06, 0x00, 0x02, 0x00 };
|
case Opcode.SessionBegin: return new byte[] { 0x06, 0x00, 0x02, 0x00 };
|
||||||
|
@ -81,24 +84,24 @@ namespace libsharperang {
|
||||||
}
|
}
|
||||||
public byte[] Build(Opcode opcode, byte[] data) => Build(opcode, data, transformer);
|
public byte[] Build(Opcode opcode, byte[] data) => Build(opcode, data, transformer);
|
||||||
public byte[] Build(Opcode opcode, byte[] data, DataTransforms transformer) {
|
public byte[] Build(Opcode opcode, byte[] data, DataTransforms transformer) {
|
||||||
if (!transformer.IsCrcInitialised()) transformer.InitialiseCrc();
|
|
||||||
byte[] result=new byte[data.Length+10];
|
byte[] result=new byte[data.Length+10];
|
||||||
result[0]=0x02;
|
result[0]=FrameStart;
|
||||||
result[result.Length-1]=0x03;
|
result[result.Length-1]=FrameEnd;
|
||||||
Buffer.BlockCopy(ResolveOpcode(opcode), 0, result, 1, 4);
|
Buffer.BlockCopy(ResolveOpcode(opcode), 0, result, 1, 4);
|
||||||
Buffer.BlockCopy(data, 0, result, 5, data.Length);
|
Buffer.BlockCopy(data, 0, result, 5, data.Length);
|
||||||
Buffer.BlockCopy(transformer.CRC.ComputeHash(data), 0, result, result.Length-5, 4);
|
Buffer.BlockCopy(transformer.GetHashSum(data), 0, result, result.Length-5, 4);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
public byte[] BuildTransmitCrc() {
|
public byte[] BuildTransmitCrc() {
|
||||||
|
if (!transformer.IsCrcInitialised()) transformer.InitialiseCrc(0x77c40d4d^0x35769521);
|
||||||
DataTransforms _=new DataTransforms();
|
DataTransforms _=new DataTransforms();
|
||||||
_.InitialiseCrc(0x35769521);
|
_.InitialiseCrc();
|
||||||
return Build(Opcode.CrcTransmit, transformer.GetCrcKeyBytes(), _);
|
return Build(Opcode.CrcTransmit, transformer.GetCrcKeyBytes(), _);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
public class USBPrinter : Base, IPrinter {
|
public class USBPrinter : Base, IPrinter {
|
||||||
// TODO - work out if it's possible to get this working with the default usbprint.inf driver Windows uses on plugging in
|
// TODO - work out if it's possible to get this working with the default usbprint.inf driver Windows uses on plugging in
|
||||||
// otherwise any user would have to first use Zadig to change the driver to WinUSB
|
// otherwise any user would have to first use Zadig to change the driver to WinUSB
|
||||||
private UsbDevice _uDv;
|
private UsbDevice _uDv;
|
||||||
private UsbEndpointWriter _uWr;
|
private UsbEndpointWriter _uWr;
|
||||||
private UsbEndpointReader _uRd;
|
private UsbEndpointReader _uRd;
|
||||||
|
|
Loading…
Reference in New Issue