blob: b5ad57e8586a06aae3f3f427eb1d8c6e35372977 [file] [log] [blame]
% PCOM tests
+ Syntax check
= Import the pcom layer
from scapy.contrib.scada.pcom import *
+ Test PCOM/TCP
= PCOM/TCP Default values
raw(PCOMRequest())[2:] == b'\x65\x00\x00\x00'
raw(PCOMResponse())[2:] == b'\x65\x00\x00\x00'
= PCOM/TCP Len
r = b'\x65\x00\x04\x00\x00\x00\x00\x00'
raw(PCOMRequest() / b'\x00\x00\x00\x00')[2:] == r
r = b'\x65\x00\x04\x00\x00\x00\x00\x00'
raw(PCOMResponse() / b'\x00\x00\x00\x00')[2:] == r
= PCOM/TCP Guess Payload Class
assert isinstance(PCOMRequest(b'\x00\x00\x65\x00\x01\x00\x00\x00\x00\x00\x00\x00').payload, PCOMAsciiRequest)
assert isinstance(PCOMResponse(b'\x00\x00\x65\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00').payload, PCOMAsciiResponse)
assert isinstance(PCOMRequest(b'\x00\x00\x66\x00\x01\x00\x00\x00' + b'\x00' * 25).payload, PCOMBinaryRequest)
assert isinstance(PCOMResponse(b'\x00\x00\x66\x00\x01\x00\x00\x00' + b'\x00' * 25).payload, PCOMBinaryResponse)
+ Test PCOM/Ascii
= PCOM/ASCII Default values
r = b'\x65\x00\x06\x00\x2f\x30\x30\x36\x30\x0d'
raw(PCOMRequest() / PCOMAsciiRequest())[2:] == r
r = b'\x65\x00\x07\x00\x2f\x41\x30\x30\x36\x30\x0d'
raw(PCOMResponse() / PCOMAsciiResponse())[2:] == r
= PCOM/ASCII Checksum
r = b'\x65\x00\x08\x00\x2f\x30\x30\x49\x44\x45\x44\x0d'
raw(PCOMRequest() / PCOMAsciiRequest(unitId='00',command='ID'))[2:] == r
r = b'\x65\x00\x09\x00\x2f\x41\x30\x30\x49\x44\x45\x44\x0d'
raw(PCOMResponse() / PCOMAsciiResponse(unitId='00',command='ID'))[2:] == r
= PCOM/ASCII Known Codes
f = PCOMAsciiCommandField('command', '', length_from= None)
assert f.i2repr(None, 'CCS') == 'Send Stop Command \'CCS\''
assert f.i2repr(None, 'CC') == 'Reply of Admin Commands (CC*) \'CC\''
+ Test PCOM/Binary
= PCOM/Binary Default values
r = b'\x66\x00\x1b\x00\x2f\x5f\x4f\x50\x4c\x43\x00\xfe\x01\x00\x00\x00\x00\x00\
\x00\x00\x00\x00\x00\x00\x00\x00\x45\xfd\x00\x00\x5c'
raw(PCOMRequest(mode=0x66) / PCOMBinaryRequest())[2:] == r
r = b'\x66\x00\x1b\x00\x2f\x5f\x4f\x50\x4c\x43\xfe\x00\x01\x00\x00\x00\x00\x00\
\x00\x00\x00\x00\x00\x00\x00\x00\x45\xfd\x00\x00\x5c'
raw(PCOMResponse(mode=0x66) / PCOMBinaryResponse())[2:] == r
= PCOM/Binary Checksum
data = b'\x01\x00\x01\x01'
r = b'\x66\x00\x1f\x00\x2f\x5f\x4f\x50\x4c\x43\x00\xfe\x01\x01\x00\x00\x4d\x00\
\x00\x00\x00\x00\x00\x01\x04\x00\xf2\xfc\x01\x00\x01\x01\xfd\xff\x5c'
raw(PCOMRequest(mode=0x66) / PCOMBinaryRequest(command=0x4d,reserved3=0x01,
commandSpecific='\x00\x00\x00\x00\x00\x01', len=4, data= data))[2:] == r
r = b'\x66\x00\x1f\x00\x2f\x5f\x4f\x50\x4c\x43\xfe\x00\x01\x01\x00\x00\x4d\x00\
\x00\x00\x00\x00\x00\x01\x04\x00\xf2\xfc\x01\x00\x01\x01\xfd\xff\x5c'
raw(PCOMResponse(mode=0x66) / PCOMBinaryResponse(command=0x4d,reserved3=0x01,
commandSpecific='\x00\x00\x00\x00\x00\x01', len=4, data= data))[2:] == r
= PCOM/Binary Known Codes
f = PCOMBinaryCommandField('command', None)
assert f.i2repr(None, 0x4d) == 'Read Operands Request - 0x4d'