Skip to content

Commit 72515f0

Browse files
committed
Fixes #116, Fixes #117 - revised patch and test certs from @tlhackque
1 parent 8c7cf61 commit 72515f0

File tree

4 files changed

+63
-2
lines changed

4 files changed

+63
-2
lines changed

X509.pm

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ sub Crypt::OpenSSL::X509::subjectaltname {
114114
my $ok = $asn->prepare(q<
115115
AnotherName ::= SEQUENCE {
116116
type OBJECT IDENTIFIER,
117-
value [0] EXPLICIT ANY } --DEFINED BY type-id }
117+
value [0] EXPLICIT ANY DEFINED BY type }
118118
119119
EDIPartyName ::= SEQUENCE {
120120
nameAssigner [0] DirectoryString OPTIONAL,
@@ -158,6 +158,7 @@ sub Crypt::OpenSSL::X509::subjectaltname {
158158
GeneralNames ::= SEQUENCE OF GeneralName
159159
160160
GeneralName ::= CHOICE {
161+
otherName [0] AnotherName,
161162
rfc822Name [1] IA5String,
162163
dNSName [2] IA5String,
163164
x400Address [3] ANY, --ORAddress,
@@ -172,6 +173,11 @@ sub Crypt::OpenSSL::X509::subjectaltname {
172173
die '*** Could not prepare definition: '.$asn->error()
173174
if !$ok;
174175

176+
# Microsoft's User Principal Name (Smart Card Logon)
177+
my $upn = Convert::ASN1->new or die( "New UPN" );
178+
$upn->prepare(q(microsoftUPN UTF8String)) or die ( "Prepare UPN" );
179+
$asn->registeroid( '1.3.6.1.4.1.311.20.2.3', $upn );
180+
175181
# This is an important bit - if you don't do the find the decode
176182
# will randomly fail/succeed. This is required to work
177183
my $asn_node = $asn->find('SubjectAltName')
@@ -180,6 +186,30 @@ sub Crypt::OpenSSL::X509::subjectaltname {
180186
my $san = $asn_node->decode($bin_data)
181187
or die 'Unable to decode SubjectAltName: '.$asn_node->error;
182188

189+
foreach my $name ( @$san ) {
190+
foreach my $item (keys %$name) {
191+
if( $item eq 'iPAddress' ) {
192+
my $ip = $name->{$item};
193+
if( length $ip == 4 ) {
194+
$name->{iPAddress} = sprintf( '%d.%d.%d.%d', unpack( 'C4', $ip ) );
195+
} elsif( length $ip == 16 ) {
196+
$name->{iPAddress} = sprintf( '%x:%x:%x:%x:%x:%x:%x:%x', unpack( 'n8', $ip ) );
197+
} else {
198+
$name->{iPAddress} = unpack( 'H*', $ip );
199+
}
200+
} elsif ( $item eq 'otherName' ) {
201+
my $otherName = $name->{otherName};
202+
if ( $otherName->{type} eq '1.3.6.1.4.1.311.20.2.3' ) {
203+
my $value;
204+
foreach my $val (keys %{$otherName->{value}}) {
205+
$value .= $val . "::" . $otherName->{value}{$val};
206+
}
207+
$name->{otherName} = $value;
208+
}
209+
}
210+
}
211+
}
212+
183213
return $san;
184214
}
185215

certs/ipacert.pem

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIDAzCCAeugAwIBAgICA+gwDQYJKoZIhvcNAQELBQAwFjEUMBIGA1UEAwwLZXhh
3+
bXBsZS5uZXQwHhcNMjQwNTE4MjI1NzM5WhcNMzQwNTE2MjI1NzM5WjAWMRQwEgYD
4+
VQQDDAtleGFtcGxlLm5ldDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
5+
ALMEHPyELA3raG9/ATjFGhl3iFX1no+Iko7TxW68O7PX083+g+jOPVLY7lDSExkz
6+
y3ka2Y/lldRPdi0HoEDl1kTYXsC25zNrRIgePSNF4gsFqHKtJCxIf40M7o3Ic/i6
7+
ginVAi8pVDEXkag4i1Lna6ERA9ExU68M31klB1Dm9ZimodN3wC5hMlMS4jjM7hhc
8+
SEXsxmTgBs57yBNIkUVgbOBpDJZs7ZZPlVPjyafQtJebiDfi/HUbFELA/KTWgSrn
9+
s5WYPf5/Pjt30j0Hx5C+Po8g5C6z9Jk+aOe+SXt+S1XUa6bvLu0DvG964sjWtYqN
10+
qI5MFJSpZrAzJt+5vHu/XRECAwEAAaNbMFkwDwYDVR0TBAgwBgEB/wIBADBGBgNV
11+
HREEPzA9ggtleGFtcGxlLm5ldIcEwAAAAYcEwAAAAocQIAENuAEjAAAAAAAAAAAA
12+
BIcQIAECuAEjAAAAAAAAAAAABTANBgkqhkiG9w0BAQsFAAOCAQEAYlbJosKKRi1E
13+
m0As7w+LsZeOsFBvUuH62FJLMet3S/nbtXbqvjaiCcH+KOknwJ7dVby2OToEtmb9
14+
t5SuhuZuADNbjPM+QOO6E5Ti1pIz+3gluqhfumGbmLRSf1IaDaQg0u2JnRiEICP0
15+
w6q43ln6+0A+i92n/CfTiSwtWQi4QJC/V31S33t+fvZ5yHZpA+U7PjNjLUvGPOQ9
16+
jl4SM42jDQ/Ob46EeDPhS8CEG2SsgCtFuvn4EwOdoZ1VedJA4q2VfJUpew5KJton
17+
8PkTA8407DhuwAXXzoGnczm8VNuxTEL11QrRKZe/t9v9sOjLIb4dmvmz665nzcPE
18+
PFYLjo3fJQ==
19+
-----END CERTIFICATE-----
20+

certs/upn-cert.pem

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIBoTCCAUagAwIBAgIRAIPqMfAzi3GkNeRTRJLFkkswCgYIKoZIzj0EAwIwHjEc
3+
MBoGA1UEAwwTam9obkRvZUBleGFtcGxlLmNvbTAeFw0yNDA1MTcxODU3MDBaFw0y
4+
NTA1MTcxODU3MDBaMB4xHDAaBgNVBAMME2pvaG5Eb2VAZXhhbXBsZS5jb20wWTAT
5+
BgcqhkjOPQIBBggqhkjOPQMBBwNCAAT1L7LWhF85IOFgdxvSVqVhwypneowwJq+c
6+
XR80zUhLJbAsd+EA6GZwhFmjNts3L9Vhpw7WfN6p5DCyQHyQa61ho2UwYzAOBgNV
7+
HQ8BAf8EBAMCBaAwEwYDVR0lBAwwCgYIKwYBBQUHAwIwDAYDVR0TAQH/BAIwADAu
8+
BgNVHREEJzAloCMGCisGAQQBgjcUAgOgFQwTam9obkRvZUBleGFtcGxlLmNvbTAK
9+
BggqhkjOPQQDAgNJADBGAiEAqUejaH3IJznnb/zLPoz0IzBcI380UEDP/EyGuKDg
10+
o/0CIQDZgr6tAF/GAjCw7z/qzWpS0YfwlBAcoY4XLa0Yl2R0ag==
11+
-----END CERTIFICATE-----

t/san.t

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use Test::More tests => 17;
1+
use Test::More tests => 21;
22

33
BEGIN { use_ok('Crypt::OpenSSL::X509') };
44

0 commit comments

Comments
 (0)