Note
Add more information about: * ua time format * the Construct * openSSL
The OpenSecureChannel request contains the following fields:
| Parameter | Datatype | Value | Comments |
|---|---|---|---|
| MessageType | 3 ACII bytes | OPN | from Open |
| IsFinal | 1 ASCII byte | F | from final |
| MessageSize | ULInt32 | ||
| SecureChannelId | ULInt32 | ||
| SecurityPolicyUriLength | ULInt32 | ||
| SecurityPolicyUri | String | NONE [SecPol] | utf-8 encoded. |
| SenderCertificateLength | ULInt32 | ||
| SenderCertificate | Array of bytes | a DER encoded blob | |
| ReceiverCertificateThumbprintLength | ULInt32 | ||
| ReceiverCertificateThumbprint | Array of bytes | ||
| Sequencenumber | ULInt32 | ||
| RequestId | ULInt32 | ||
| EncodingByte | ULInt8 (ENUM) | ||
| NameSpace | Byte | ||
| Identifier | UInt16 | ||
| AuthenticationTokenEncodingByte | Byte | ||
| AuthenticationTokenIdentifier | Byte | ||
| TimeStamp | ULInt64 | ||
| RequestHandle | ULInt32 | ||
| ReturnDiagnostics | ULInt32 | ||
| AuditEntryId | String | ||
| TimeOutHint | ULInt32 | ||
| AHEncodingByte | ULInt8 (ENUM) | ||
| AHIdentifier | Byte | ||
| AHEncoding | Byte | ||
| ProtocolVersion | ULInt32 | ||
| RequestType | ULInt32 | ||
| SecurityMode | ULInt32 | ||
| ClientNonce | ULInt32 | ||
| RequestedLifetime | ULInt32 |
Using Construct we can create a struct, containing these fields.
from construct import *
c = Struct('OPC UASC OpenSecureChannel Request',
String('MessageType', 3),
String('IsFinal', 1),
ULInt32('MessageSize'),
ULInt32('SecureChannelId'),
PascalString('SecurityPolicyUri', length_field=ULInt32('length')),
SLInt32('SenderCertificateLength'),
Bytes('SenderCertificate', lambda ctx:ctx['SenderCertificateLength']),
SLInt32('ReceiverCertificateThumbprintLength'),
Bytes('ReceiverCertificateThumbprint', lambda ctx:ctx['ReceiverCertificateThumbprintLength']),
ULInt32('SequenceNumber'),
ULInt32('RequestId'),
ULInt8('EncodingByte'),
ULInt8('NameSpace'),
ULInt16('Identifier'),
ULInt8('AuthenticationTokenEncodingByte'),
ULInt8('AuthenticationTokenIdentifier'),
ULInt64('TimeStamp'),
ULInt32('RequestHandle'),
ULInt32('ReturnDiagnostics'),
PascalString('AuditEntryId',
length_field=ULInt32('length'),
encoding='utf8'),
ULInt32('TimeOutHint'),
ULInt8('AHEncodingByte'),# AdditionalHeader
ULInt8('AHIdentifier'),
ULInt8('AHEncoding'),
ULInt32('ProtocolVersion'),
ULInt32('RequestType'),
ULInt32('SecurityMode'),
ULInt32('ClientNonce'),
ULInt32('RequestedLifetime'),
)
| [SecPol] | The correct URL is something like: http://opcfoundation.org/UA/SecurityPolicy#None |