Skip to content

Commit 740e662

Browse files
committed
Add KeyName to XML if specified
1 parent 02a30bd commit 740e662

File tree

4 files changed

+45
-8
lines changed

4 files changed

+45
-8
lines changed

README

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,10 @@ METHODS
134134

135135
* sha512 <http://www.w3.org/2001/04/xmlenc#sha512>
136136

137+
key_name
138+
Specify a key name to add to the KeyName element. If it is not
139+
specified then no KeyName element is added to the KeyInfo
140+
137141
decrypt( ... )
138142
Main decryption function.
139143

lib/XML/Enc.pm

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -231,6 +231,13 @@ The default is sha1. Supported algorithms are:
231231
232232
=back
233233
234+
=item B<key_name>
235+
236+
Specify a key name to add to the KeyName element. If it is not specified then no
237+
KeyName element is added to the KeyInfo
238+
239+
=back
240+
234241
=cut
235242

236243
sub new {
@@ -267,6 +274,8 @@ sub new {
267274

268275
$self->{'oaep_params'} = exists($params->{'oaep_params'}) ? $params->{'oaep_params'} : '';
269276

277+
$self->{'key_name'} = $params->{'key_name'} if exists($params->{'key_name'});
278+
270279
return $self;
271280
}
272281

@@ -539,6 +548,11 @@ sub encrypt {
539548
my $base64_key = encode_base64($key);
540549
my $base64_data = encode_base64($encrypteddata);
541550

551+
# Insert KeyName into the XML
552+
if (defined $self->{key_name} and $self->{key_name} ne '') {
553+
$encrypted = $self->_setKeyName($encrypted, $xpc, $self->{key_name});
554+
}
555+
542556
# Insert OAEPparams into the XML
543557
if ($self->{oaep_params} ne '') {
544558
$encrypted = $self->_setOAEPparams($encrypted, $xpc, encode_base64($self->{oaep_params}));
@@ -570,6 +584,19 @@ sub _setEncryptionMethod {
570584
return exists($methods{$method}) ? $methods{$method} : $methods{'aes256-cbc'};
571585
}
572586

587+
sub _setKeyName {
588+
my $self = shift;
589+
my $context = shift;
590+
my $xpc = shift;
591+
my $keyname = shift;
592+
593+
my $node = $xpc->findnodes('//xenc:EncryptedKey/dsig:KeyInfo/dsig:KeyName', $context);
594+
595+
$node->[0]->removeChildNodes();
596+
$node->[0]->appendText(defined $keyname ? $keyname : 'key_name');
597+
return $context;
598+
}
599+
573600
sub _setOAEPparams {
574601
my $self = shift;
575602
my $context = shift;
@@ -1177,12 +1204,14 @@ sub _create_encrypted_data_xml {
11771204
'dsig:KeyInfo',
11781205
);
11791206

1180-
my $keyname = $self->_create_node(
1207+
if (defined $self->{key_name}) {
1208+
my $keyname = $self->_create_node(
11811209
$doc,
11821210
$dsigns,
11831211
$keyinfo2,
11841212
'dsig:KeyName',
11851213
);
1214+
};
11861215

11871216
my $keycipherdata = $self->_create_node(
11881217
$doc,

t/06-test-encryption-methods.t

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ my $xml = <<'XML';
1313
</foo>
1414
XML
1515

16+
my $key_name = 'mykey';
1617
my @key_methods = qw/rsa-1_5 rsa-oaep-mgf1p/;
1718
my @data_methods = qw/aes128-cbc aes192-cbc aes256-cbc tripledes-cbc aes128-gcm aes192-gcm aes256-gcm/;
1819
my @oaep_mgf_algs = qw/rsa-oaep-mgf1p mgf1sha1 mgf1sha224 mgf1sha256 mgf1sha384 mgf1sha512/;
@@ -28,6 +29,7 @@ foreach my $km (@key_methods) {
2829
{
2930
key => 't/sign-private.pem',
3031
cert => 't/sign-certonly.pem',
32+
key_name => $key_name,
3133
data_enc_method => $dm,
3234
key_transport => $km,
3335
no_xml_declaration => 1
@@ -42,17 +44,16 @@ foreach my $km (@key_methods) {
4244
SKIP: {
4345
skip "xmlsec1 not installed", 2 unless $xmlsec->{installed};
4446
skip "xmlsec version 1.2.27 minimum for GCM", 2 if ! $xmlsec->{aes_gcm};
45-
ok( open XML, '>', 'tmp.xml' );
47+
ok( open XML, '>', "enc-xml-$km-$dm.xml" );
4648
print XML $encrypted;
4749
close XML;
48-
my $verify_response = `xmlsec1 --decrypt $lax_key_search --privkey-pem t/sign-private.pem tmp.xml 2>&1`;
50+
my $verify_response = `xmlsec1 --decrypt $lax_key_search --privkey-pem:$key_name t/sign-private.pem,t/sign-certonly.pem enc-xml-$km-$dm.xml 2>&1`;
4951
like($verify_response, qr/XML-SIG_1/, "Successfully decrypted with xmlsec1" )
5052
or warn "calling xmlsec1 failed: '$verify_response'\n";
51-
unlink 'tmp.xml';
53+
unlink "enc-xml-$km-$dm.xml";
5254
}
5355
}
5456
}
55-
5657
foreach my $om (@oaep_mgf_algs) {
5758
foreach my $omdig (@oaep_label_hashes) {
5859
SKIP: {
@@ -67,6 +68,7 @@ foreach my $om (@oaep_mgf_algs) {
6768
{
6869
key => 't/sign-private.pem',
6970
cert => 't/sign-certonly.pem',
71+
key_name => $key_name,
7072
data_enc_method => $dm,
7173
key_transport => $km,
7274
oaep_mgf_alg => $om,
@@ -82,13 +84,14 @@ foreach my $om (@oaep_mgf_algs) {
8284
SKIP: {
8385
skip "xmlsec1 not installed", 2 unless $xmlsec->{installed};
8486
skip "xmlsec version 1.2.27 minimum for GCM", 2 if ! $xmlsec->{aes_gcm};
85-
ok( open XML, '>', "$km-$om-$omdig-$dm-tmp.xml" );
87+
skip "xmlsec version 1.3.00 minimum for rsa-oeap", 2 if ! $xmlsec->{rsa_oaep};
88+
ok( open XML, '>', "enc-xml-$km-$om-$omdig-$dm.xml" );
8689
print XML $encrypted;
8790
close XML;
88-
my $verify_response = `xmlsec1 --decrypt $lax_key_search --privkey-pem t/sign-private.pem $km-$om-$omdig-$dm-tmp.xml 2>&1`;
91+
my $verify_response = `xmlsec1 --decrypt $lax_key_search --privkey-pem:$key_name t/sign-private.pem,t/sign-certonly.pem enc-xml-$km-$om-$omdig-$dm.xml 2>&1`;
8992
ok( $verify_response =~ m/XML-SIG_1/, "Successfully decrypted with xmlsec1" )
9093
or warn "calling xmlsec1 failed: '$verify_response'\n";
91-
unlink "$km-$om-$omdig-$dm-tmp.xml";
94+
unlink "enc-xml-$km-$om-$omdig-$dm.xml";
9295
}
9396
ok($encrypter->decrypt($encrypted) =~ /XML-SIG_1/, "Successfully Decrypted with XML::Enc");
9497
}

t/lib/Test/XML/Enc/Util.pm

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ sub get_xmlsec_features {
5454
ripemd160 => ($major >= 1 and $minor >= 3) ? 1 : 0,
5555
aes_gcm => ($major <= 1 and $minor <= 2 and $patch <= 27) ? 0 : 1,
5656
lax_key_search => ($major >= 1 and $minor >= 3) ? 1 : 0,
57+
rsa_oaep => ($major >= 1 and $minor >= 3) ? 1 : 0,
5758
);
5859
return \%xmlsec;
5960
}

0 commit comments

Comments
 (0)