Documentation ¶
Overview ¶
Package uasc provides encoding/decoding and automated secure channel and session handling for OPC UA Secure Conversation.
Index ¶
- Constants
- type AsymmetricSecurityHeader
- type Config
- type Header
- type Message
- type MessageAbort
- type MessageChunk
- type MessageHeader
- type SecureChannel
- func (s *SecureChannel) Close() error
- func (s *SecureChannel) EncryptUserPassword(policyURI, password string, cert, nonce []byte) ([]byte, string, error)
- func (s *SecureChannel) LocalEndpoint() string
- func (s *SecureChannel) NewSessionSignature(cert, nonce []byte) ([]byte, string, error)
- func (s *SecureChannel) NewUserTokenSignature(policyURI string, cert, nonce []byte) ([]byte, string, error)
- func (s *SecureChannel) Open(ctx context.Context) error
- func (s *SecureChannel) Renew(ctx context.Context) error
- func (s *SecureChannel) SendRequest(req ua.Request, authToken *ua.NodeID, h func(interface{}) error) error
- func (s *SecureChannel) SendRequestWithTimeout(req ua.Request, authToken *ua.NodeID, timeout time.Duration, ...) error
- func (s *SecureChannel) VerifySessionSignature(cert, nonce, signature []byte) error
- type SequenceHeader
- type SessionConfig
- type SymmetricSecurityHeader
Constants ¶
const ( MessageTypeMessage = "MSG" MessageTypeOpenSecureChannel = "OPN" MessageTypeCloseSecureChannel = "CLO" )
MessageType definitions.
const ( ChunkTypeIntermediate = 'C' ChunkTypeFinal = 'F' ChunkTypeError = 'A' )
ChunkType definitions.
const (
MaxTimeout = math.MaxUint32 * time.Millisecond
)
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type AsymmetricSecurityHeader ¶
type AsymmetricSecurityHeader struct { SecurityPolicyURI string SenderCertificate []byte ReceiverCertificateThumbprint []byte }
AsymmetricSecurityHeader represents a Asymmetric Algorithm Security Header in OPC UA Secure Conversation.
func NewAsymmetricSecurityHeader ¶
func NewAsymmetricSecurityHeader(uri string, cert, thumbprint []byte) *AsymmetricSecurityHeader
NewAsymmetricSecurityHeader creates a new OPC UA Secure Conversation Asymmetric Algorithm Security Header.
func (*AsymmetricSecurityHeader) Decode ¶
func (h *AsymmetricSecurityHeader) Decode(b []byte) (int, error)
func (*AsymmetricSecurityHeader) Encode ¶
func (h *AsymmetricSecurityHeader) Encode() ([]byte, error)
func (*AsymmetricSecurityHeader) Len ¶
func (h *AsymmetricSecurityHeader) Len() int
Len returns the Header Length in bytes.
func (*AsymmetricSecurityHeader) String ¶
func (a *AsymmetricSecurityHeader) String() string
String returns Header in string.
type Config ¶
type Config struct { // SecurityPolicyURI is the URI of the Security Policy used to secure the Message. // This field is encoded as a UTF-8 string without a null terminator. SecurityPolicyURI string // Certificate is the X.509 v3 Certificate assigned to the sending application Instance. // This is a DER encoded blob. // The structure of an X.509 v3 Certificate is defined in X.509 v3. // The DER format for a Certificate is defined in X690. // This indicates what Private Key was used to sign the MessageChunk. // The Stack shall close the channel and report an error to the application if // the Certificate is too large for the buffer size supported by the // transport layer. // This field shall be null if the Message is not signed. Certificate []byte // LocalKey is a RSA Private Key which will be used to encrypt the OpenSecureChannel // messages. It is the key associated with Certificate LocalKey *rsa.PrivateKey // Thumbprint is the thumbprint of the X.509 v3 Certificate assigned to the receiving // application Instance. // The thumbprint is the CertificateDigest of the DER encoded form of the // Certificate. // This indicates what public key was used to encrypt the MessageChunk. // This field shall be null if the Message is not encrypted. Thumbprint []byte // RemoteCertificate is the X.509 Certificate for the receiving instance. // Used to encrypt the message chunks in the OpenSecureChannel phase. RemoteCertificate []byte // RequestIDSeed is the initial value for RequestID counter in each new SecureChannel RequestIDSeed uint32 // SecurityMode is The type of security to apply to the messages. The type MessageSecurityMode // is defined in 7.15. // A SecureChannel may have to be created even if the securityMode is NONE. The exact behaviour // depends on the mapping used and is described in the Part 6. SecurityMode ua.MessageSecurityMode // AutoReconnect will make sure that once communication is restored, // the old session is used whenever possible and that Susbcription data is not missed. // You may choose to use AutoReconnect (true by default) or do it manually. // AutoReconnect will make the UaClient to try to reconnect to the server every second, // once the communication is broken. If you do it manually, you must be prepared to do it until it succeeds. AutoReconnect bool // ReconnectInterval is interval duration between each reconnection attempt, // ignored if AutoReconnect is set to false. ReconnectInterval time.Duration // Lifetime is the requested lifetime, in milliseconds, for the new SecurityToken when the // SecureChannel works as client. It specifies when the Client expects to renew the SecureChannel // by calling the OpenSecureChannel Service again. If a SecureChannel is not renewed, then all // Messages sent using the current SecurityTokens shall be rejected by the receiver. // Lifetime can also be the revised lifetime, the lifetime of the SecurityToken in milliseconds. // The UTC expiration time for the token may be calculated by adding the lifetime to the createdAt time. Lifetime uint32 // RequestTimeout is timeout duration for all synchronous requests over SecureChannel. // If the Server doesn't respond within RequestTimeout time, Client returns StatusBadTimeout RequestTimeout time.Duration }
Config represents a configuration which UASC client/server has in common.
type Header ¶
Header represents a OPC UA Secure Conversation Header.
type Message ¶
type Message struct { *MessageHeader TypeID *ua.ExpandedNodeID Service interface{} }
Message represents a OPC UA Secure Conversation message.
type MessageAbort ¶
MessageAbort represents a non-terminal OPC UA Secure Channel error.
Specification: Part6, 7.3
func (*MessageAbort) Encode ¶
func (m *MessageAbort) Encode() ([]byte, error)
func (*MessageAbort) MessageAbort ¶
func (m *MessageAbort) MessageAbort() string
type MessageChunk ¶
type MessageChunk struct { *MessageHeader Data []byte }
type MessageHeader ¶
type MessageHeader struct { *Header *AsymmetricSecurityHeader *SymmetricSecurityHeader *SequenceHeader }
type SecureChannel ¶
type SecureChannel struct {
// contains filtered or unexported fields
}
func NewSecureChannel ¶
func (*SecureChannel) Close ¶
func (s *SecureChannel) Close() error
Close closes an existing secure channel
func (*SecureChannel) EncryptUserPassword ¶
func (s *SecureChannel) EncryptUserPassword(policyURI, password string, cert, nonce []byte) ([]byte, string, error)
EncryptUserPassword issues a new signature for the client to send in ActivateSessionRequest
func (*SecureChannel) LocalEndpoint ¶
func (s *SecureChannel) LocalEndpoint() string
func (*SecureChannel) NewSessionSignature ¶
func (s *SecureChannel) NewSessionSignature(cert, nonce []byte) ([]byte, string, error)
NewSessionSignature issues a new signature for the client to send on the next ActivateSessionRequest
func (*SecureChannel) NewUserTokenSignature ¶
func (s *SecureChannel) NewUserTokenSignature(policyURI string, cert, nonce []byte) ([]byte, string, error)
NewUserTokenSignature issues a new signature for the client to send in ActivateSessionRequest
func (*SecureChannel) SendRequest ¶
func (s *SecureChannel) SendRequest(req ua.Request, authToken *ua.NodeID, h func(interface{}) error) error
SendRequest sends the service request and calls h with the response.
func (*SecureChannel) SendRequestWithTimeout ¶
func (*SecureChannel) VerifySessionSignature ¶
func (s *SecureChannel) VerifySessionSignature(cert, nonce, signature []byte) error
VerifySessionSignature checks the integrity of a Create/Activate Session response's signature
type SequenceHeader ¶
SequenceHeader represents a Sequence Header in OPC UA Secure Conversation.
func NewSequenceHeader ¶
func NewSequenceHeader(seq, req uint32) *SequenceHeader
NewSequenceHeader creates a new OPC UA Secure Conversation Sequence Header.
func (*SequenceHeader) Encode ¶
func (h *SequenceHeader) Encode() ([]byte, error)
func (*SequenceHeader) String ¶
func (s *SequenceHeader) String() string
String returns Header in string.
type SessionConfig ¶
type SessionConfig struct { // AuthenticationToken is the secret Session identifier used to verify that the request is // associated with the Session. The SessionAuthenticationToken type is defined in 7.31. AuthenticationToken *ua.NodeID // ClientDescription is the information that describes the Client application. // The type ApplicationDescription is defined in 7.1. ClientDescription *ua.ApplicationDescription // ServerEndpoints is the list of Endpoints that the Server supports. // The Server shall return a set of EndpointDescriptions available for the serverUri // specified in the request. The EndpointDescription type is defined in 7.10. The Client // shall verify this list with the list from a DiscoveryEndpoint if it used a // DiscoveryEndpoint to fetch the EndpointDescriptions. // It is recommended that Servers only include the server.applicationUri, endpointUrl, // securityMode, securityPolicyUri, userIdentityTokens, transportProfileUri and // securityLevel with all other parameters set to null. Only the recommended // parameters shall be verified by the client. ServerEndpoints []*ua.EndpointDescription // LocaleIDs is the list of locale ids in priority order for localized strings. The first // LocaleId in the list has the highest priority. If the Server returns a localized string // to the Client, the Server shall return the translation with the highest priority that // it can. If it does not have a translation for any of the locales identified in this list, // then it shall return the string value that it has and include the locale id with the // string. See Part 3 for more detail on locale ids. If the Client fails to specify at least // one locale id, the Server shall use any that it has. // This parameter only needs to be specified during the first call to ActivateSession during // a single application Session. If it is not specified the Server shall keep using the // current localeIds for the Session. LocaleIDs []string // UserIdentityToken is the credentials of the user associated with the Client application. // The Server uses these credentials to determine whether the Client should be allowed to // activate a Session and what resources the Client has access to during this Session. // The UserIdentityToken is an extensible parameter type defined in 7.36. // The EndpointDescription specifies what UserIdentityTokens the Server shall accept. // Null or empty user token shall always be interpreted as anonymous. UserIdentityToken interface{} // If the Client specified a user identity token that supports digital signatures, then it // shall create a signature and pass it as this parameter. Otherwise the parameter is null. // The SignatureAlgorithm depends on the identity token type. // The SignatureData type is defined in 7.32. UserTokenSignature *ua.SignatureData // SessionName is an optional name of the session. // The default is a unique value for every new session. SessionName string // If Session works as a client, SessionTimeout is the requested maximum number of milliseconds // that a Session should remain open without activity. If the Client fails to issue a Service // request within this interval, then the Server shall automatically terminate the Client Session. // If Session works as a server, SessionTimeout is an actual maximum number of milliseconds // that a Session shall remain open without activity. The Server should attempt to honour the // Client request for this parameter,but may negotiate this value up or down to meet its own constraints. SessionTimeout time.Duration // Stored version of the password to authenticate against a server // todo: storing passwords in memory seems wrong AuthPassword string // PolicyURI to use when encrypting secrets for the User Identity Token // Could be different from the secure channel's policy AuthPolicyURI string }
SessionConfig is a set of common configurations used in Session.
type SymmetricSecurityHeader ¶
type SymmetricSecurityHeader struct {
TokenID uint32
}
SymmetricSecurityHeader represents a Symmetric Algorithm Security Header in OPC UA Secure Conversation.
func NewSymmetricSecurityHeader ¶
func NewSymmetricSecurityHeader(token uint32) *SymmetricSecurityHeader
NewSymmetricSecurityHeader creates a new OPC UA Secure Conversation Symmetric Algorithm Security Header.
func (*SymmetricSecurityHeader) Decode ¶
func (h *SymmetricSecurityHeader) Decode(b []byte) (int, error)
func (*SymmetricSecurityHeader) Encode ¶
func (h *SymmetricSecurityHeader) Encode() ([]byte, error)
func (*SymmetricSecurityHeader) Len ¶
func (h *SymmetricSecurityHeader) Len() int
Len returns the Header Length in bytes.
func (*SymmetricSecurityHeader) String ¶
func (h *SymmetricSecurityHeader) String() string
String returns Header in string.