|
Class: CRC16Stream
Object
|
+--Stream
|
+--HashStream
|
+--CRCStream
|
+--CRC16Stream
- Package:
- stx:libbasic2
- Category:
- System-Crypt-Hashing
- Version:
- rev:
1.12
date: 2021/07/12 14:22:57
- user: stefan
- file: CRC16Stream.st directory: libbasic2
- module: stx stc-classLibrary: libbasic2
Only use CRC to protect against communication errors;
DO NOT use CRC for cryptography, authentication, security, etc.
- use secure hashes for those instead.
ATTENTION: CRC16Stream is currently BROKEN (in development)
crc16 is a full zoo of different implementations;
they differ in the polynom, the initial value and the final xor value.
Also, some return an MSB, others an LSB first value (i.e. byteswapped).
Make sure to use the correct one:
newCRC_CCITT:
Standard CRC method as defined by CCITT with FFFF as start value
(ITU-T-T30, ITU-T V42, ITU-T X25, RFC1331, RFC1662, ISO/IEC FCD14443-3).
This is used in data link protocols such as HDLC, SS7, and ISDN.
The polynomial is
x^16 + x^12 + x^5 + 1
newCRC_DNP:
Standard CRC method as defined by DNP.
This is used in data link protocols such as HDLC, SS7, and ISDN.
DNP 3.0, or distributed network protocol is a communication protocol
designed for use between substation computers, RTUs remote terminal units,
IEDs intelligent electronic devices
and master stations for the electric utility industry.
It is now also used in familiar industries like waste water treatment,
transportation and the oil and gas industry.
The polynomial is 0x3d65
newKERMIT:
CRC as used in kermit protocol
newMODBUS:
CRC as used in the modbus protocol
[instance variables:]
[class variables:]
copyrightCOPYRIGHT (c) 2003 by eXept Software AG
All Rights Reserved
This software is furnished under a license and may be used
only in accordance with the terms of that license and with the
inclusion of the above copyright notice. This software may not
be provided or otherwise made available to, or used by, any
other person. No title to or ownership of the software is
hereby transferred.
instance creation
-
generatorPolynomMSB: anInteger
-
notice, in literature, the generator polynom is usually specified as an MSB number
-
generatorPolynomMSB: anInteger initValue: initValue
-
notice, in literature, the generator polynom is usually specified as an MSB number
-
generatorPolynomMSB: anInteger initValue: initValueArg xorOut: xorOut
-
notice, in literature, the generator polynom is usually specified as an MSB number
-
new
-
return an instance of the CCITT CRC-16
-
newCCITT
-
return an instance of the CCITT CRC-16 with FFFF as initial value
x16 + x12 + x5 + 1
-
newCCITT_1D0F
-
return an instance of the CCITT CRC-16 with 1D0F as initial value
x16 + x12 + x5 + 1
-
newCRC_16
-
return an instance of the CRC-16
x16 + x15 + x2 + 1
-
newDNP
-
return an instance of the DNP CRC-16
x16 + x13 + x12 + x11 + x10 + x8 + x6 + x5 + x2 + 1
DNP 3.0, or distributed network protocol is a communication protocol
designed for use between substation computers, RTUs remote terminal units,
IEDs intelligent electronic devices
and master stations for the electric utility industry.
It is now also used in familiar industries like waste water treatment,
transportation and the oil and gas industry.
-
newKERMIT
-
return an instance of the CRC-16 used by kermit
2r11110101100101
x16 + x13 + x12 + x11 + x10 + x8 + x6 + x5 + x2 + 1
-
newMODBUS
-
return an instance of the MODBUS CRC-16
x16 + x15 + x2 + 1
-
newXMODEM
-
return an instance of the XMODEM protocol
x16 + x12 + x5 + 1
1 2r0001000000100001
queries
-
hashSize
-
return the size of the hashvalue returned by instances of this class (in bytes)
initialization
-
byteSwapped
-
-
byteSwapped: aBoolean
-
-
generatorPolynom: anLSBInteger
-
set the generator polynom for this instance,
set start and xorOut to 16rFFFF.
Note: you have to set the bit-reversed value, so the LSB must be first
-
generatorPolynom: anLSBInteger initValue: initValueArg
-
set the generator polynom for this instance.
set start to initValueArg and xorOut to 16rFFFF.
Note: you have to set the bit-reversed value, so the LSB must be first
queries
-
hashValue
-
return the computed CRC.
For unknown reasons, the standard crc16 needs byte swapping
expect xxx:
self information:(CRC16Stream hashValueOf:'resume') hexPrintString
|
expect xxx:
self information:(CRC16Stream new
nextPut:$r;
nextPut:$e;
nextPut:$s;
nextPut:$u;
nextPut:$m;
nextPut:$e;
hashValue) hexPrintString
|
expect xxx:
self information:(CRC16Stream hashValueOf:#[1 2 3 4 5 6 7]) hexPrintString
|
expect xxx:
self information:((CRC16Stream hashValueOf:#[16rFF 16rFF 16rFF 16rFF 16rFF 16rFF 16rFF 16rFF 16rFF 16rFF
16rFF 16rFF 16rFF 16rFF 16rFF 16rFF 16rFF 16rFF 16rFF 16rFF
16rFF 16rFF 16rFF 16rFF 16rFF 16rFF 16rFF 16rFF 16rFF 16rFF
16rFF 16rFF 16rFF 16rFF 16rFF 16rFF 16rFF 16rFF 16rFF 16rFF]) hexPrintString)
|
expect xxx:
timing throughput:
|hashStream n t|
hashStream := CRC16Stream new.
n := 1000000.
t := Time millisecondsToRun:[
n timesRepeat:[
hashStream nextPutAll:'12345678901234567890123456789012345678901234567890'.
].
].
t := (t / 1000) asFloat.
Transcript show:'crc16:'; showCR: hashStream hashValue hexPrintString.
Transcript show:t; show:' seconds for '; show:(50*n/1024) asFloat; showCR:' Kb'.
Transcript show:(n*50/1024 / t); showCR:' Kb/s'
|
|