Commit Graph

812 Commits

Author SHA1 Message Date
Suciu Mircea Adrian 28d2227fc4 Revert "Enable Nullability for important Certificate Handling classes (#2989)" (#3007)
This reverts commit 23d167abb7.
2025-02-20 10:24:51 +02:00
Martin Regen c75c8a0153 By default set NoDelay and Lingerstate to 5 sec (#3000)
Set NoDelay=true to disable the Nagle algorithm and set Lingerstate to 5 seconds by default.

After careful evaluation of the PR provided by @sxleixer in #2882 we found that the default setting of the socket with NoDelay=false can not only cause issues on the client side, but also on the server side.

Due to the nature of Nagle's implementation the issue only occurs when many small service requests or responses are sent over the network. In that case, when packets are still in flight, the secondary small packets are delayed and combined until the MTU is exceeded or the previous packages are acknoledged.

The expectation in the UA protocol is to not add additional latency in the client-server communication.

As a conclusion defaulting to NoDelay=true appears to be the better default option which works for all use cases.
If there are new bandwidth issues related to more and larger packets imposed by this change, they should be solved at the UA application level by combining service requests of the same type.

Setting Lingerstate to 5 seconds should help to finish communications when sockets are closed.

Co-authored-by: @sxleixer <mail@ralfschleicher.de>
2025-02-18 05:20:57 +01:00
Archie Miller 37cebe33be [Server] Add support for SupportsFilteredRetain (#2913)
* Work In Progress

* Working Implementation of SupportsFilteredRetain

* Potential solution

Contains test debug messages that should be cleaned up

* Update comments showing discussion required

* Address Comments

* Use the NodeId from the ConditionState for the ConditionId.

Existing case was not guaranteed to be correct.
2025-02-17 13:42:24 +02:00
romanett 23d167abb7 Enable Nullability for important Certificate Handling classes (#2989)
* enable nrts for CertificatIdentifier&CertificateStoreIdentifier&CertificateTrustList

* make RSA Utils and  Certificate Stores nullable

* Make Certificate validator nullable

* fix nullability of CertificateTypeParameter
2025-02-13 16:53:06 +02:00
Martin Regen cbf789d41e Fix a case where NodeId.Null is modified (#2995)
* Add tests to catch if NodeId.Null is modified in DEBUG, fix an issue where NodeId.Null was overwritten

* add (C)

* only enable immutable NodeId to catch issues

* typos and comments
2025-02-13 10:54:41 +02:00
romanett 703b52da13 Make FiniteStateMachine DoTransition virtual (#2988)
* Add Lock to finiteStateMachineDoTransition

* assign lock

* Revert "assign lock"

This reverts commit f8d2b9392c.

* Revert "Add Lock to finiteStateMachineDoTransition"

This reverts commit 2449006ac1.

* make DoTransitionVirtual

* make CauseProcessingCompleted virtual
2025-02-12 10:44:54 +02:00
Suciu Mircea Adrian d540baf10f Remove oldest channel if not used by session, when number of channels reaches MaxChannelCount - 1 (#2986)
* Remove older channel if not used by session, when number of channels reaches MaxChannelCount - 1

* Corrected channelCount and renamings

* Operate on snapshot

* Snapshot the entire concurentdictionary
2025-02-11 17:13:26 +02:00
romanett 8e408dba3e fix Token renewal (#2990) 2025-02-11 17:05:08 +02:00
romanett 7cbeee7155 [Test] Add ECC Certificates to various tests (#2961)
* Generate ECC Certificates in Client Tests

* Add more tests

* reenable check of certificate

* fix tests

* Dont use random in test

* fix unsupported certificate types

* fix Hash algorithm for nistP384 curve on linux as the friendly name is ECDSA_P384 instead of nistP384

* use friendly name by default and add special case only for linux while taking care of nullability

* disable special casing for finding correct certificates

* fix tests on net 462

* update Certificate Identifier
2025-02-11 14:20:21 +02:00
Suciu Mircea Adrian 14d78caf21 Set default value for NonceLength to 32 (#2970) 2025-01-28 16:41:08 +02:00
Suciu Mircea Adrian 7c0e806736 Set initial value of LastActiveTickCount (#2953) 2025-01-23 15:25:17 +02:00
mrsuciu f4c852a61d Merged develop/main374 into master 2025-01-22 15:31:50 +02:00
romanett 493da5d5be Extend ServerConfiguration & GDS Server for ECC (#2817)
* update ServerConfiguration Node to support multiple Application Certificates. Trust List Support for User Certificates & Https Certificates

* GDS ready for ECC Step1

* fix test

* fix build

* ensure hash algorithm is set

* update configurations to new format, fix minor ecc bugs

* implicitly set certificate type of certificate identifier
extend CertificateFactory to allow Revocation with ECC Issuer Certificate

* Revert "update configurations to new format, fix minor ecc bugs"

This reverts commit 9ee17f3aff.

* Allow GDS Certificate Group to have multiple CA Certificates with different Certificate Types

* fix minor bugs

* adress review feedback

* fix some issues

* fix creation of CA signed ECC Certificates

* Update configurations to new ApplicationCertificateFormat and add extra CA Certificates for ECC Certificates

* remove brainpool certs from configuration

* Generate ECC Certificates in Client Tests

* Revert "Generate ECC Certificates in Client Tests"

This reverts commit 90b395f4ff.

* fix crl tests on platforms not supporting ECC

* fix crl test

* Update READMEs for ECC
2025-01-21 16:34:48 +02:00
romanett 4a44238b8c [Server] Allow Subject Name Change of Application Certificate in GDS Push scenario (#2833)
* allow Subject Name change

* modifiy subject names in push test
2025-01-21 12:23:14 +02:00
Suciu Mircea Adrian 8733a33594 Fix net462 build (#2949) 2025-01-20 17:00:26 +01:00
Martin Regen 61056d0d30 Some .NET 9 maintenance and JSON encoder improvements (#2922)
- Reduce memory allocations in JSON encoder by using stackalloc/ArrayPool
- Fix some new warnings in .NET9 code analyzers
- Fix fuzzing error in JsonDecoder
- do not use .NET9 libraries with .NET8 LTS builds #2931, #2940
- Bump langversion to 9 (max VS2019)
- Use official ASP.Net 2.3. libraries for .NET Framework (rel. Jan 15th)
2025-01-20 08:45:12 +01:00
Suciu Mircea Adrian 62b4f050bc Add ECDSA support for importing private key from PEM (#2941)
* Add ECDSA support for reading private key from PEM

* Padded x, y EC point coordinates and the d private key with leading zeros to match keySize

* CreateCertificateWithPEMPrivateKey creates either ECDSA or RSA certificate depending on certificate type
2025-01-17 17:51:21 +02:00
Martin Regen a0b12d7116 Fix race condition on Nuget build (#2930)
- nodeset xmlzip is created in obj folders if multiple targets are built in parallel
2025-01-16 21:33:41 +01:00
romanett 760bfd92bc [Server] Fix: Return full CertificateChain after Certificate Update (#2861)
* simpler update process

* update endpoint descriptions

* adress review feedback

* cleanup
2025-01-13 17:17:15 +02:00
romanett 6038a69656 [ECC] Implicitly set CertificateType of Certificate Identifier & allow Revocation with ECC Issuer Certificate & fix VerifyECDsaKeyPair (#2924)
* implicitly set certificate type of certificate identifier
extend CertificateFactory to allow Revocation with ECC Issuer Certificate

* Add Crl tests for ECC

* fix X509 PFXUtils VerifyECDsaKeyPair
2025-01-13 17:08:37 +02:00
Stephan Larws df881be3ac Handle status code Uncertain according to the specification (#2898)
* #2896: Write output arguments for good and uncertain status code

When a method state's call method is invoked the output arguments should be written in case the status code is good or uncertain. This behavior would be conform with the current specification.

* #2896: The service result corresponds the method call result

The result of the Call method in the CustomNodeManager2 class represents the status of the CallMethodResult. It does not correspond to the ServiceResult of the CallResponse, thus returning Good as a general response is incorrect behavior.
2025-01-08 13:36:41 +01:00
romanett 444b2c8e51 Add port number check in the MatchEndpoints method to ensure the correct endpoint is returned (#2925) 2025-01-07 17:08:23 +01:00
mtx500 57d638ea90 Typos again (#2906)
* Fixed a lot of typos in comments, strings and local variable names. No changes to misspelled function names/parameters.

* Fixed some more typos
2024-12-20 09:33:13 +02:00
romanett de688aca18 [Server] Improve GetManagerHandle & introduce a threadSafe NodeIdDictionary (#2915)
* Make NodeIdDictionary threadsafe by changing the underlying dict from `Dictionary` to `ConcurrentDictionary`
* reduce blocking in CustomNodeManager2 for GetManagerHandle & other uncritical supporting functions
2024-12-19 17:17:25 +01:00
Suciu Mircea Adrian 6489c1283f Removed unreachable code (#2916) 2024-12-19 09:04:20 +02:00
Suciu Mircea Adrian 5e11541b81 Set corresponding security signature hash and validate ECDSA security signature hash algorithm length for ECC certificates (#2912)
* Use correctly and validate certificate ECDSA signature hash algorithm

* Added tests for validating length of EC certificate signature

* Improved invalidation condition of SignatureAlgorithm

* Changed result text

* Test fix

* Added helper method to set hash algorithm depending on key size;
Reverted ApplicationInstance code

* Fix test CreateSelfSignedForECDsaDefaultTest
2024-12-19 08:50:09 +02:00
Stephan Larws 5b3f91d9dd Handle status code Uncertain according to the specification (#2898)
* #2896: Write output arguments for good and uncertain status code

When a method state's call method is invoked the output arguments should be written in case the status code is good or uncertain. This behavior would be conform with the current specification.

* #2896: The service result corresponds the method call result

The result of the Call method in the CustomNodeManager2 class represents the status of the CallMethodResult. It does not correspond to the ServiceResult of the CallResponse, thus returning Good as a general response is incorrect behavior.
2024-12-17 13:38:51 +02:00
Martin Regen 9a434b860c Fix misc. build issues and warnings (#2908)
- Fix errors and warnings on stricter build systems.
- Some Linux distri do not support brainpool, detect if tests can be run.
2024-12-13 17:41:14 +01:00
Martin Regen dc661bac46 Fix server CurrentTime source timestamp and improve readerwriter locks (#2903)
Fix server time source timestamp is not updated.
There are duplicate objects in generated code, on of which which holds the last timestamp was not updated.

Move all readerwriter locks outside of try/finally to avoid a SynchronizationLockException when a reader writer lock is disposed or is cancelled.

Currently there is no obvious fundamental bug in how the readerwriter locks are used, but outside the try/finally clause e.g. a disposed lock may not trigger a false exception.
2024-12-13 08:59:28 +01:00
romanett f431d53c89 Fix Null reference Exception in NodeState for AccessRestrictions (#2894)
* fix cast that throws when Enum is null
2024-12-11 08:48:09 +01:00
Martin Regen 5ed73fcd95 merge latest release 2024-12-07 17:30:58 +01:00
romanett 67a0df1960 Fix read of NodeId attribute AccessRestrictions by casting return type from Enum to ushort (#2883)
In the read NodeId servcie call an enum is by default cast to Int32, so the cast to ushort is needed here to return the expected type for the AccessRestrictions.
2024-12-05 08:39:09 +01:00
romanett 6c62eb26fd Fix serialization of CertificateTrustList (#2879) 2024-12-04 09:42:19 +01:00
Suciu Mircea Adrian d0e89a3bf1 Support mutual TLS on server https endpoints (#2849)
A new configuration variable 
    <HttpsMutualTls>true</HttpsMutualTls>
enables the mutual TLS authentication support. The behavior of the TLS endpoint changes as the following:

HttpsMutualTls is true:
The server checks the trust on the certificate which is used by the client for TLS authentication. It must be a valid OPC UA application certificate which is trusted.
A client can still connect without providing a client certificate, but then it is only able to call discovery services.
In order to create a session, the client must use the same application certificate that was used for the TLS channel.

HttpsMutualTls is false:
- There is no application authentication. The server endpoint uses security None and there is no client application authentication.
Instead, only user authentication is used to secure the server, anonymous user authentication is disabled.
Discovery service calls are supported.

Co-authored-by: Martin Regen <mregen@microsoft.com>
2024-12-03 12:43:39 +01:00
Martin Regen a887f909f1 Allow ExtensionObjects which are encoded with an unknown size (#2869)
An older OPC UA server returns well known extension object(811) which cannot be decoded by the client because the server doesn't set the length of the extension object. 
Recently, based on fuzz testing, the length check has been changed to enforce an exact match, according to spec.

Workaround: Allow a value of -1 for the length, then allow to decode well known extension objects.

Also improve some internal calls to Safe Read functions by calling not via the interface.
2024-12-03 12:06:11 +01:00
Archie Miller ab364b9e98 Update CauseMappings to reflect issue (#2877)
SyspendedToRead caused by Reset remains as per Part 10 Table 7
2024-12-03 10:23:56 +01:00
Archie Miller 6925e1560f Update CauseMappings to reflect issue (#2877)
SyspendedToRead caused by Reset remains as per Part 10 Table 7
2024-12-03 10:03:29 +01:00
Martin Regen 1fa0b7f26e Register callback to notify about new channel token activation (#2872) (#2873)
For better client diagnostic it is important to have access to the channel token. Today tooling must monitor the channel token change to be aware of the current token, it is more efficient for the tooling to be called back when the token changes. This can be now accomplished in that the owner of a client (Discovery, Session) can retrieve the Transport channel after connect, read the current token and register a change callback.

* Add OnTokenActivated event for token change notifications

Added a new event `OnTokenActivated` to the `UaChannelBase` class in the `Opc.Ua` namespace to notify when a channel token is activated. Implemented this event in the `HttpsTransportChannel` class within the `Opc.Ua.Bindings` namespace. Introduced a protected internal `OnTokenActivated` event handler in the `UaSCBinaryChannel.Symmetric` class, invoked during token changes in the `ActivateToken` and `DiscardTokens` methods. Cleaned up the event handler in the `Dispose` method of the `UaSCBinaryClientChannel` class. Registered the event handler with the internal channel in the `UaSCBinaryTransportChannel` class. Added a new delegate `ChannelTokenActivatedEventHandler` in the `ITransportChannel` interface and updated the interface to include the `OnTokenActivated` event. Made minor formatting and comment adjustments for improved readability and consistency.

* Include channel in callback

Co-authored-by: Marc Schier <marcschier@users.noreply.github.com>
2024-12-02 11:21:07 +01:00
Marc Schier 6aedc787b8 Register callback to notify about new channel token activation (#2872)
For better client diagnostic it is important to have access to the channel token. Today tooling must monitor the channel token change to be aware of the current token, it is more efficient for the tooling to be called back when the token changes. This can be now accomplished in that the owner of a client (Discovery, Session) can retrieve the Transport channel after connect, read the current token and register a change callback.

* Add OnTokenActivated event for token change notifications

Added a new event `OnTokenActivated` to the `UaChannelBase` class in the `Opc.Ua` namespace to notify when a channel token is activated. Implemented this event in the `HttpsTransportChannel` class within the `Opc.Ua.Bindings` namespace. Introduced a protected internal `OnTokenActivated` event handler in the `UaSCBinaryChannel.Symmetric` class, invoked during token changes in the `ActivateToken` and `DiscardTokens` methods. Cleaned up the event handler in the `Dispose` method of the `UaSCBinaryClientChannel` class. Registered the event handler with the internal channel in the `UaSCBinaryTransportChannel` class. Added a new delegate `ChannelTokenActivatedEventHandler` in the `ITransportChannel` interface and updated the interface to include the `OnTokenActivated` event. Made minor formatting and comment adjustments for improved readability and consistency.

* Include channel in callback
2024-12-02 09:48:54 +01:00
Martin Regen 0a4804f4c5 Client perf and memory improvements for JSON encoding and subscriptions (#2864)
- reduce EscapeString overhead in JSON encoder
- client monitored items: allocate queues only if needed
- replace SortedDictionary with Dictionary for perf reasons
- revert a change in padding and reduce a log level
2024-11-28 21:32:55 +01:00
Martin Regen f76c457c72 Support .NET 9.0 build (#2865)
* support .NET 9.0 build
* provide a helper to use the X509CertificateLoader also on older .NET versions
2024-11-28 12:57:10 +01:00
Suciu Mircea Adrian 3543d02925 Added a minimal rogue client detection mechanism at the transport level (#2850)
Clients that are failing too often to pass the security validationin a certain interval of time with the Basic128 security profile are now tracked and blocked.
2024-11-22 10:01:30 +01:00
Martin Regen 76b53184de ChannelToken: Dispose HMAC and improve lifetime calculations. (#2846)
- Channels are not disposed (client and server)
- During long running tests an HMAC object leak was observed.
- The HMAC and SymmetricSign objects were not disposed after use, leading to a small incremental memory leak per key renewal. 
- The channel token lifetime is calculated by the system clock, which can change. Instead use the continous HiResClock.TickCount to calculate the lifetimes.
- Token renewal and connection requests are not removed from the request dictionary

Improvements:
- Make ChannelToken disposable. Dispose channels.
- Dispose HMAC and SymmetricSign objects after use.
- Use TickCount to calculate key renewal and key expiry.
- Introduce a 5% jitter to the token renewal timer, to avoid token renewal storms.
- Reduce the allocation per use of the HMAC objects by using ReadOnlySpan and avoid MemoryStream.
2024-11-21 10:16:13 +01:00
KircMax 56dd06d97f Using Uri.TryCreate causes regression with namespace uri that use mixed lower/uppercase letters in the <hostname> of the Uri.(#2837)
Uri.TryCreate lower cases the hostnames. Switch always back to the legacy implementation which maintains the casing.
2024-11-07 10:31:18 +01:00
romanett ff3674fe58 Improve crl handling in certificate stores (#2829)
* improve crl handling in certificate stores by not loading CRL with invalid or unsupported content. Hence the revocation check for such certificates may fail.
2024-11-02 11:44:51 +01:00
Martin Regen ce9850c491 Fix bugs in JSON decoder (#2828)
JSON ReadEnumeratedString does not decode the number in e.g. "Red_0".
JSON reencode of JSON content in an extension object runs into an encoder error.
2024-10-31 08:02:32 +01:00
romanett b2d715d6cb Fix net462 build last issue (#2816) 2024-10-26 09:44:10 +02:00
romanett 0c6b38b0a8 Fix build for legacy platforms by disabling ECC on .NET 4.6.2 & NET-Standard2.0 (#2811)
* added ifdef for code that doesn't support ECC
2024-10-24 09:02:05 +02:00
Suciu Mircea Adrian f001eabcc8 Add support for ECC profiles (#2398)
- Port support for ECC NIST/Brainpool profiles from prototyping_ecc branch
- Implement CertProvider to load certs per connection / profile
- Backward compatibility of configuration for existing apps
- SecurityConfiguration specifies app cert types for each profile
- Autodetect the ECC support for brainpool/nist based on platform (mac OS 10 doesn't support brainpool)
- ECC supported on net48 / net5.0 / net 6.0 / netstandard2.1
- ECC supported on windows / linux / macOS (brainpool not < macOS11)
- Self signed certs for each profile are created on start similar to RSA
- RSA only profiles are supported on .NET standard 2.0

Co-authored-by: Martin Regen <mregen@microsoft.com>
2024-10-17 16:02:20 +02:00
Marc Schier 3672ebefe9 Null pointer exception when reading a complex type with empty arrays. (#2798)
The server under test has a extension object with a complex type.  Type id = {nsu=http://opcfoundation.org/UA/Machinery/Result/;i=5008}.  This contains something with a variant array that is null though (-1).  SetProperty should support setting a Array that is null.  Therefore, test for null collection (case when length was encoded as -1) before dereferencing ahead of the ToArrray() conversion to Array.
2024-10-14 17:18:50 +02:00