Skip to content

Commit 7c7c607

Browse files
committed
Add xenc11:KeyDerivationMethod element
1 parent 9c6dde5 commit 7c7c607

File tree

5 files changed

+174
-1
lines changed

5 files changed

+174
-1
lines changed
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace SimpleSAML\XMLSecurity\XML\xenc11;
6+
7+
use DOMElement;
8+
use SimpleSAML\Assert\Assert;
9+
use SimpleSAML\XML\Exception\InvalidDOMElementException;
10+
use SimpleSAML\XML\Exception\SchemaViolationException;
11+
use SimpleSAML\XML\ExtendableElementTrait;
12+
use SimpleSAML\XML\XsNamespace as NS;
13+
14+
/**
15+
* Class representing <xenc11:KeyDerivationMethodType>.
16+
*
17+
* @package simplesamlphp/xml-security
18+
*/
19+
abstract class AbstractKeyDerivationMethodType extends AbstractXenc11Element
20+
{
21+
use ExtendableElementTrait;
22+
23+
/** The namespace-attribute for the xs:any element */
24+
public const XS_ANY_ELT_NAMESPACE = NS::ANY;
25+
26+
27+
/**
28+
* KeyDerivationMethod constructor.
29+
*
30+
* @param string $Algorithm
31+
* @param \SimpleSAML\XML\SerializableElementInterface[] $children
32+
*/
33+
final public function __construct(
34+
protected string $Algorithm,
35+
array $children,
36+
) {
37+
Assert::validURI($Algorithm, SchemaViolationException::class);
38+
39+
$this->setElements($children);
40+
}
41+
42+
43+
/**
44+
* Get the value of the $Algorithm property.
45+
*
46+
* @return string
47+
*/
48+
public function getAlgorithm(): string
49+
{
50+
return $this->Algorithm;
51+
}
52+
53+
54+
/**
55+
* @inheritDoc
56+
*
57+
* @throws \SimpleSAML\XML\Exception\InvalidDOMElementException
58+
* If the qualified name of the supplied element is wrong
59+
*/
60+
public static function fromXML(DOMElement $xml): static
61+
{
62+
Assert::same($xml->localName, static::getLocalName(), InvalidDOMElementException::class);
63+
Assert::same($xml->namespaceURI, static::getNamespaceURI(), InvalidDOMElementException::class);
64+
65+
return new static(
66+
self::getOptionalAttribute($xml, 'Algorithm', null),
67+
self::getChildElementsFromXML($xml),
68+
);
69+
}
70+
71+
72+
/**
73+
* @inheritDoc
74+
*/
75+
public function toXML(?DOMElement $parent = null): DOMElement
76+
{
77+
$e = $this->instantiateParentElement($parent);
78+
$e->setAttribute('Algorithm', $this->getAlgorithm());
79+
80+
foreach ($this->getElements() as $child) {
81+
if (!$child->isEmptyElement()) {
82+
$child->toXML($e);
83+
}
84+
}
85+
86+
return $e;
87+
}
88+
}

src/XML/xenc11/AbstractXenc11Element.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
*
1313
* @package simplesamlphp/xml-security
1414
*/
15-
abstract class AbstractXencElement extends AbstractElement
15+
abstract class AbstractXenc11Element extends AbstractElement
1616
{
1717
/** @var string */
1818
public const NS = C::NS_XENC11;
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace SimpleSAML\XMLSecurity\XML\xenc11;
6+
7+
/**
8+
* A class implementing the xenc11:KeyDerivationMethod element.
9+
*
10+
* @package simplesamlphp/xml-security
11+
*/
12+
final class KeyDerivationMethod extends AbstractKeyDerivationMethodType
13+
{
14+
}
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace SimpleSAML\XMLSecurity\Test\XML\xenc11;
6+
7+
use PHPUnit\Framework\Attributes\CoversClass;
8+
use PHPUnit\Framework\TestCase;
9+
use SimpleSAML\XML\DOMDocumentFactory;
10+
use SimpleSAML\XML\TestUtils\SchemaValidationTestTrait;
11+
use SimpleSAML\XML\TestUtils\SerializableElementTestTrait;
12+
use SimpleSAML\XMLSecurity\XML\ds\KeyName;
13+
use SimpleSAML\XMLSecurity\XML\xenc11\AbstractKeyDerivationMethodType;
14+
use SimpleSAML\XMLSecurity\XML\xenc11\AbstractXenc11Element;
15+
use SimpleSAML\XMLSecurity\XML\xenc11\KeyDerivationMethod;
16+
17+
use function dirname;
18+
use function strval;
19+
20+
/**
21+
* Tests for the xenc:KeyDerivationMethod element.
22+
*
23+
* @covers \SimpleSAML\XMLSecurity\XML\xenc11\AbstractXenc11Element
24+
* @covers \SimpleSAML\XMLSecurity\XML\xenc11\AbstractKeyDerivationMethodType
25+
* @covers \SimpleSAML\XMLSecurity\XML\xenc11\KeyDerivationMethod
26+
* @package simplesamlphp/xml-security
27+
*/
28+
#[CoversClass(AbstractXenc11Element::class)]
29+
#[CoversClass(AbstractKeyDerivationMethodType::class)]
30+
#[CoversClass(KeyDerivationMethod::class)]
31+
final class KeyDerivationMethodTest extends TestCase
32+
{
33+
use SchemaValidationTestTrait;
34+
use SerializableElementTestTrait;
35+
36+
/**
37+
*/
38+
public static function setUpBeforeClass(): void
39+
{
40+
self::$testedClass = KeyDerivationMethod::class;
41+
42+
self::$schemaFile = dirname(__FILE__, 4) . '/resources/schemas/xenc-schema-11.xsd';
43+
44+
self::$xmlRepresentation = DOMDocumentFactory::fromFile(
45+
dirname(__FILE__, 3) . '/resources/xml/xenc11_KeyDerivationMethod.xml',
46+
);
47+
}
48+
49+
50+
// test marshalling
51+
52+
53+
/**
54+
* Test creating an KeyDerivationMethod object from scratch.
55+
*/
56+
public function testMarshalling(): void
57+
{
58+
$alg = 'http://www.w3.org/2009/xmlenc11#ConcatKDF';
59+
$keyName = new KeyName('testkey');
60+
61+
$kdm = new KeyDerivationMethod($alg, [$keyName]);
62+
63+
$this->assertEquals(
64+
self::$xmlRepresentation->saveXML(self::$xmlRepresentation->documentElement),
65+
strval($kdm),
66+
);
67+
}
68+
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
<xenc11:KeyDerivationMethod xmlns:xenc11="http://www.w3.org/2009/xmlenc11#" Algorithm="http://www.w3.org/2009/xmlenc11#ConcatKDF">
2+
<ds:KeyName xmlns:ds="http://www.w3.org/2000/09/xmldsig#">testkey</ds:KeyName>
3+
</xenc11:KeyDerivationMethod>

0 commit comments

Comments
 (0)