-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathCRC40_gsm.pas
84 lines (74 loc) · 5.8 KB
/
CRC40_gsm.pas
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
unit CRC40_gsm;
//CRC-40 GSM
//Author: domasz
//Version: 0.1 (2022-11-17)
//Licence: MIT
interface
uses SysUtils, HasherBase;
type THasherCRC40_gsm = class(THasherBase)
private
FHash: QWord;
public
constructor Create; override;
procedure Update(Msg: PByte; Length: Integer); override;
function Final: String; override;
end;
implementation
var Table: array[0..255] of QWord = (
$0000000000000000, $0000000004820009, $0000000009040012, $000000000D86001B, $0000000012080024, $00000000168A002D, $000000001B0C0036, $000000001F8E003F,
$0000000024100048, $0000000020920041, $000000002D14005A, $0000000029960053, $000000003618006C, $00000000329A0065, $000000003F1C007E, $000000003B9E0077,
$0000000048200090, $000000004CA20099, $0000000041240082, $0000000045A6008B, $000000005A2800B4, $000000005EAA00BD, $00000000532C00A6, $0000000057AE00AF,
$000000006C3000D8, $0000000068B200D1, $00000000653400CA, $0000000061B600C3, $000000007E3800FC, $000000007ABA00F5, $00000000773C00EE, $0000000073BE00E7,
$0000000090400120, $0000000094C20129, $0000000099440132, $000000009DC6013B, $0000000082480104, $0000000086CA010D, $000000008B4C0116, $000000008FCE011F,
$00000000B4500168, $00000000B0D20161, $00000000BD54017A, $00000000B9D60173, $00000000A658014C, $00000000A2DA0145, $00000000AF5C015E, $00000000ABDE0157,
$00000000D86001B0, $00000000DCE201B9, $00000000D16401A2, $00000000D5E601AB, $00000000CA680194, $00000000CEEA019D, $00000000C36C0186, $00000000C7EE018F,
$00000000FC7001F8, $00000000F8F201F1, $00000000F57401EA, $00000000F1F601E3, $00000000EE7801DC, $00000000EAFA01D5, $00000000E77C01CE, $00000000E3FE01C7,
$0000000120800240, $0000000124020249, $0000000129840252, $000000012D06025B, $0000000132880264, $00000001360A026D, $000000013B8C0276, $000000013F0E027F,
$0000000104900208, $0000000100120201, $000000010D94021A, $0000000109160213, $000000011698022C, $00000001121A0225, $000000011F9C023E, $000000011B1E0237,
$0000000168A002D0, $000000016C2202D9, $0000000161A402C2, $00000001652602CB, $000000017AA802F4, $000000017E2A02FD, $0000000173AC02E6, $00000001772E02EF,
$000000014CB00298, $0000000148320291, $0000000145B4028A, $0000000141360283, $000000015EB802BC, $000000015A3A02B5, $0000000157BC02AE, $00000001533E02A7,
$00000001B0C00360, $00000001B4420369, $00000001B9C40372, $00000001BD46037B, $00000001A2C80344, $00000001A64A034D, $00000001ABCC0356, $00000001AF4E035F,
$0000000194D00328, $0000000190520321, $000000019DD4033A, $0000000199560333, $0000000186D8030C, $00000001825A0305, $000000018FDC031E, $000000018B5E0317,
$00000001F8E003F0, $00000001FC6203F9, $00000001F1E403E2, $00000001F56603EB, $00000001EAE803D4, $00000001EE6A03DD, $00000001E3EC03C6, $00000001E76E03CF,
$00000001DCF003B8, $00000001D87203B1, $00000001D5F403AA, $00000001D17603A3, $00000001CEF8039C, $00000001CA7A0395, $00000001C7FC038E, $00000001C37E0387,
$0000000241000480, $0000000245820489, $0000000248040492, $000000024C86049B, $00000002530804A4, $00000002578A04AD, $000000025A0C04B6, $000000025E8E04BF,
$00000002651004C8, $00000002619204C1, $000000026C1404DA, $00000002689604D3, $00000002771804EC, $00000002739A04E5, $000000027E1C04FE, $000000027A9E04F7,
$0000000209200410, $000000020DA20419, $0000000200240402, $0000000204A6040B, $000000021B280434, $000000021FAA043D, $00000002122C0426, $0000000216AE042F,
$000000022D300458, $0000000229B20451, $000000022434044A, $0000000220B60443, $000000023F38047C, $000000023BBA0475, $00000002363C046E, $0000000232BE0467,
$00000002D14005A0, $00000002D5C205A9, $00000002D84405B2, $00000002DCC605BB, $00000002C3480584, $00000002C7CA058D, $00000002CA4C0596, $00000002CECE059F,
$00000002F55005E8, $00000002F1D205E1, $00000002FC5405FA, $00000002F8D605F3, $00000002E75805CC, $00000002E3DA05C5, $00000002EE5C05DE, $00000002EADE05D7,
$0000000299600530, $000000029DE20539, $0000000290640522, $0000000294E6052B, $000000028B680514, $000000028FEA051D, $00000002826C0506, $0000000286EE050F,
$00000002BD700578, $00000002B9F20571, $00000002B474056A, $00000002B0F60563, $00000002AF78055C, $00000002ABFA0555, $00000002A67C054E, $00000002A2FE0547,
$00000003618006C0, $00000003650206C9, $00000003688406D2, $000000036C0606DB, $00000003738806E4, $00000003770A06ED, $000000037A8C06F6, $000000037E0E06FF,
$0000000345900688, $0000000341120681, $000000034C94069A, $0000000348160693, $00000003579806AC, $00000003531A06A5, $000000035E9C06BE, $000000035A1E06B7,
$0000000329A00650, $000000032D220659, $0000000320A40642, $000000032426064B, $000000033BA80674, $000000033F2A067D, $0000000332AC0666, $00000003362E066F,
$000000030DB00618, $0000000309320611, $0000000304B4060A, $0000000300360603, $000000031FB8063C, $000000031B3A0635, $0000000316BC062E, $00000003123E0627,
$00000003F1C007E0, $00000003F54207E9, $00000003F8C407F2, $00000003FC4607FB, $00000003E3C807C4, $00000003E74A07CD, $00000003EACC07D6, $00000003EE4E07DF,
$00000003D5D007A8, $00000003D15207A1, $00000003DCD407BA, $00000003D85607B3, $00000003C7D8078C, $00000003C35A0785, $00000003CEDC079E, $00000003CA5E0797,
$00000003B9E00770, $00000003BD620779, $00000003B0E40762, $00000003B466076B, $00000003ABE80754, $00000003AF6A075D, $00000003A2EC0746, $00000003A66E074F,
$000000039DF00738, $0000000399720731, $0000000394F4072A, $0000000390760723, $000000038FF8071C, $000000038B7A0715, $0000000386FC070E, $00000003827E0707
);
constructor THasherCRC40_gsm.Create;
begin
inherited Create;
FHash := 0;
Check := 'D4164FC646';
end;
procedure THasherCRC40_gsm.Update(Msg: PByte; Length: Integer);
var i: Integer;
Index: Cardinal;
begin
for i:=0 to Length-1 do begin
FHash := (FHash shl 8) xor Table[(Msg^ xor (FHash shr 32)) and $FF];
Inc(Msg);
end;
end;
function THasherCRC40_gsm.Final: String;
begin
FHash := FHash and $FFFFFFFFFF;
FHash := FHash xor $FFFFFFFFFF;
Result := IntToHex(FHash, 10);
end;
initialization
HasherList.RegisterHasher('CRC-40 GSM', THasherCRC40_gsm);
end.