Skip to content

Crypto-Agility update: ECDSA, ML-DSA, SLH-DSA signature validation #100

Open

Description

@restena-sw

This feature request relates to the use of the library in simplesamlphp-module-metarefresh - see issue there: simplesamlphp/simplesamlphp-module-metarefresh#80 (comment)

Our federation publishes metadata with four algorithms simultaneously: RSA, ECDSA, ML-DSA, SLH-DSA (the latter two being PQC algorithms for future quantum readiness).

xml-security currently appears to understand exclusively RSA, judging from the failing signature validation for the other three variants in the metarefresh module:

10:53:14.176Z [metarefresh]: Executing set [eduID-LU]
10:53:14.178Z [metarefresh]: In set [eduID-LU] loading source [http://www.eduid.lu/metadata/upstream-rsa.xml]
10:53:14.412Z Found 28 entities
10:53:22.006Z Writing: /export/hosting/restena/clueless/private/deploy-test/simplesamlphp-2.5.3.1/metadata/metadata-eduID-LU/saml20-sp-remote.php
10:53:23.210Z [metarefresh]: Executing set [eduID-LU-ECDSA]
10:53:23.228Z [metarefresh]: In set [eduID-LU-ECDSA] loading source [http://www.eduid.lu/metadata/upstream-ecdsa.xml]
10:53:23.428Z Could not validate signature
10:53:23.428Z Skipping "https://clueless.restena.lu/simplesaml_dev/saml2/idp/metadata.php" - could not verify signature using certificate.
[...]
10:53:23.440Z Found 28 entities
10:53:23.441Z [metarefresh]: Executing set [eduID-LU-MLDSA]
10:53:23.441Z [metarefresh]: In set [eduID-LU-MLDSA] loading source [http://www.eduid.lu/metadata/upstream-mldsa.xml]
10:53:23.593Z Could not validate signature
10:53:23.593Z Skipping "https://clueless.restena.lu/simplesaml_dev/saml2/idp/metadata.php" - could not verify signature using certificate.
[...]
10:53:23.607Z Found 28 entities
10:53:23.607Z [metarefresh]: Executing set [eduID-LU-SLHDSA]
10:53:23.608Z [metarefresh]: In set [eduID-LU-SLHDSA] loading source [http://www.eduid.lu/metadata/upstream-slhdsa.xml]
[...]
10:53:23.787Z Found 28 entities

The config points to the respective signing certificates as per config below. eduGAIN is able to validate these files with an independent implementation so the files and signing certs are known good.

This is happening on simpleSAMLphp 2.5.3.1 and metarefresh 1.3.1.

    'sets' => [

            'eduID-LU' => [
                    'cron'          => ['daily'],
                    'sources'       => [
                            [
                                    'types' => ['saml20-sp-remote'],
                                    'src' => 'http://www.eduid.lu/metadata/upstream-rsa.xml',
                                    'certificates' => [ 'eduID-rsa.pubcert', ]
                            ],
                    ],
                    'expireAfter'   => 60*60*24*365, // Maximum 365 days cache time.
                    'outputDir'     => 'metadata/metadata-eduID-LU/',
                    'outputFormat'  => 'flatfile',
            ],
            'eduID-LU-ECDSA' => [
                    'cron'          => ['daily'],
                    'sources'       => [
                            [
                                    'types' => ['saml20-sp-remote'],
                                    'src' => 'http://www.eduid.lu/metadata/upstream-ecdsa.xml',
                                    'certificates' => [ 'eduID-ecdsa.pubcert', ]
                            ],
                    ],
                    'expireAfter'   => 60*60*24*365, // Maximum 365 days cache time.
                    'outputDir'     => 'metadata/metadata-eduID-LU-ECDSA/',
                    'outputFormat'  => 'flatfile',
            ],
            'eduID-LU-MLDSA' => [
                    'cron'          => ['daily'],
                    'sources'       => [
                            [
                                    'types' => ['saml20-sp-remote'],
                                    'src' => 'http://www.eduid.lu/metadata/upstream-mldsa.xml',
                                    'certificates' => [ 'eduID-mldsa.pubcert', ]
                            ],
                    ],
                    'expireAfter'   => 60*60*24*365, // Maximum 365 days cache time.
                    'outputDir'     => 'metadata/metadata-eduID-LU-MLDSA/',
                    'outputFormat'  => 'flatfile',
            ],
            'eduID-LU-SLHDSA' => [
                    'cron'          => ['daily'],
                    'sources'       => [
                            [
                                    'types' => ['saml20-sp-remote'],
                                    'src' => 'http://www.eduid.lu/metadata/upstream-slhdsa.xml',
                                    'certificates' => [ 'eduID-slhdsa.pubcert', ]
                            ],
                    ],
                    'expireAfter'   => 60*60*24*365, // Maximum 365 days cache time.
                    'outputDir'     => 'metadata/metadata-eduID-LU-SLHDSA/',
                    'outputFormat'  => 'flatfile',
            ],

Activity

  1. tvdijen commented on Nov 10, 2026

    @tvdijen
    Member

    ECDSA was implemented in #99, but not yet released at time of writing.
    The quantum-proof algo's should be implemented as well and then we can pull in this support into simplesamlphp and/or simplesamlphp-module-metarefresh

  2. tvdijen commented on Nov 10, 2026

    @tvdijen
    Member

    This should probably also be our cue to start migrating from openssl to #45 phpseclib. Crypto is not our strongest point, and although this library is solid and code-reviewed, I think this part should be outsourced.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions