package Ġno . nav . g and alf . ac ces sto ken . saml Ċ Ċ import Ġcom . nim bus ds . oauth 2 . sdk . OAuth 2 Error Ċ import Ġjava . io . IOException Ċ import Ġjava . io . String Reader Ċ import Ġjava . io . String Writer Ċ import Ġjava . security . PrivateKey Ċ import Ġjava . security . cert . X 5 0 9 Certificate Ċ import Ġjava . time . Z onedDateTime Ċ import Ġjava . time . format . DateTime Formatter Ċ import Ġjava . time . temporal . Ch rono Unit Ċ import Ġjava . util . UUID Ċ import Ġjavax . xml . crypto . Key Selector Ċ import Ġjavax . xml . crypto . Marshal Exception Ċ import Ġjavax . xml . crypto . XML Structure Ċ import Ġjavax . xml . crypto . ds ig . Canonical ization Method Ċ import Ġjavax . xml . crypto . ds ig . Digest Method Ċ import Ġjavax . xml . crypto . ds ig . Reference Ċ import Ġjavax . xml . crypto . ds ig . Signature Method Ċ import Ġjavax . xml . crypto . ds ig . Transform Ċ import Ġjavax . xml . crypto . ds ig . XML Signature Ċ import Ġjavax . xml . crypto . ds ig . XML Signature Exception Ċ import Ġjavax . xml . crypto . ds ig . XML Signature Factory Ċ import Ġjavax . xml . crypto . ds ig . dom . DO MS ign Context Ċ import Ġjavax . xml . crypto . ds ig . dom . DOM Validate Context Ċ import Ġjavax . xml . crypto . ds ig . spec . C 1 4 N Method Parameter Spec Ċ import Ġjavax . xml . crypto . ds ig . spec . Transform Parameter Spec Ċ import Ġjavax . xml . parsers . Document BuilderFactory Ċ import Ġjavax . xml . parsers . Parser ConfigurationException Ċ import Ġjavax . xml . transform . Transformer Factory Ċ import Ġjavax . xml . transform . dom . DOM Source Ċ import Ġjavax . xml . transform . stream . Stream Result Ċ import Ġno . nav . g and alf . ac ces sto ken . Clock Sk ew Ċ import Ġno . nav . g and alf . ac ces sto ken . OAuth Exception Ċ import Ġno . nav . g and alf . keystore . KeyStore Reader Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġorg . w 3 c . dom . Element Ċ import Ġorg . w 3 c . dom . Node Ċ import Ġorg . xml . sax . Input Source Ċ import Ġorg . xml . sax . SAX Exception Ċ Ċ class ĠS aml Object Ġ: ĠClock Sk ew Ġ{ ĊĠĠĠ Ġvar Ġissuer : ĠString ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġid : ĠString ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĠĠĠ Ġvar Ġname ID : ĠString ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġdate Not Before : ĠZ onedDateTime ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġnot On Or After : ĠZ onedDateTime ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĠĠĠ Ġvar Ġissue Instant : ĠZ onedDateTime ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġnow : ĠZ onedDateTime ĊĠĠĠ Ġvar Ġauthentication Level : ĠString ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġconsumer Id : ĠString ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġident Type : ĠString ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġaudit Tracking Id : ĠString ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġsignature Node : ĠNode ? Ġ= Ġnull ĊĠĠĠ Ġval Ġformat : ĠDateTime Formatter Ġ= ĠDateTime Formatter . ISO _ INST ANT Ġ// ĠDateTime Formatter . of Pattern (" yyyy - MM - dd ' T ' HH : mm : ss ' Z '"); ĊĠĠĠ Ġprivate Ġval Ġlog Ġ= ĠLoggerFactory . getLogger ( java Class ) ĊĊĠĠĠ Ġconstructor () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġthis . now Ġ= ĠZ onedDateTime . now (); ĊĠĠĠĠĠĠĠ Ġnow Ġ= ĠZ onedDateTime . parse ( Z onedDateTime . now (). format ( format )) ĊĠĠĠĠĠĠĠ ĠsetId (" SAML -" Ġ+ ĠUUID . randomUUID (). toString ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġconstructor ( now : ĠZ onedDateTime ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . now Ġ= ĠZ onedDateTime . parse ( now . format ( format )) ĊĠĠĠĠĠĠĠ ĠsetId (" SAML -" Ġ+ ĠUUID . randomUUID (). toString ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( Parser ConfigurationException :: class , ĠSAX Exception :: class , ĠIOException :: class ) ĊĠĠĠ Ġfun Ġread ( saml Token : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġlog . info (" Reading ĠSAML Ġtoken Ġfrom ĠString ") ĊĠĠĠĠĠĠĠ Ġ// Ġget Ġdocument Ġelements ĊĠĠĠĠĠĠĠ Ġval Ġdb Fact Ġ= ĠDocument BuilderFactory . newInstance () ĊĠĠĠĠĠĠĠ Ġdb Fact . is Namespace Aware Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġval Ġdoc Builder Ġ= Ġdb Fact . new Document Builder () ĊĠĠĠĠĠĠĠ Ġval Ġdoc Ġ= Ġdoc Builder . parse ( Input Source ( String Reader ( saml Token !! ))) ĊĠĠĠĠĠĠĠ Ġdoc . documentElement . normalize () ĊĠĠĠĠĠĠĠ Ġ// Ġread ĠId ĊĠĠĠĠĠĠĠ Ġvar Ġmap Ġ= Ġdoc . firstChild . attributes ĊĠĠĠĠĠĠĠ Ġvar Ġnode Ġ= Ġmap . getName d Item (" ID ") ĊĠĠĠĠĠĠĠ Ġif Ġ( node Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġnode . node Value ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// Ġread ĠIssue Instant ĊĠĠĠĠĠĠĠ Ġnode Ġ= Ġmap . getName d Item (" Issue Instant ") ĊĠĠĠĠĠĠĠ Ġif Ġ( node Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġissue Instant Ġ= ĠZ onedDateTime . parse ( node . node Value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// Ġread ĠIss uer ĊĠĠĠĠĠĠĠ Ġvar Ġn List Ġ= Ġdoc . getElementsByTagName (" saml 2 : Issuer ") ĊĠĠĠĠĠĠĠ Ġissuer Ġ= Ġif Ġ( n List . length Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġn List . item ( 0 ). textContent ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// Ġread ĠName ID Ġ( Subject ) ĊĠĠĠĠĠĠĠ Ġn List Ġ= Ġdoc . getElementsByTagName (" saml 2 : Name ID ") ĊĠĠĠĠĠĠĠ Ġname ID Ġ= Ġif Ġ( n List . length Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġn List . item ( 0 ). textContent ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// Ġread ĠConditions ĊĠĠĠĠĠĠĠ Ġn List Ġ= Ġdoc . getElementsByTagName (" saml 2 : Conditions ") ĊĠĠĠĠĠĠĠ Ġif Ġ( n List . length Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġread ĠConditions : ĠNot Before ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmap Ġ= Ġn List . item ( 0 ). attributes ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnode Ġ= Ġmap . getName d Item (" Not Before ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdate Not Before Ġ= Ġif Ġ( node Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠZ onedDateTime . parse ( node . node Value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġread ĠConditions : ĠNot On Or After ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnode Ġ= Ġmap . getName d Item (" Not On Or After ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnot On Or After Ġ= Ġif Ġ( node Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠZ onedDateTime . parse ( node . node Value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// Ġread ĠAttributes : Ġident Type , Ġauthentication Level , Ġconsumer Id , Ġaudit Tracking Id ĊĠĠĠĠĠĠĠ Ġn List Ġ= Ġdoc . getElementsByTagName (" saml 2 : Attribute ") ĊĠĠĠĠĠĠĠ Ġval Ġv List Ġ= Ġdoc . getElementsByTagName (" saml 2 : AttributeValue ") ĊĠĠĠĠĠĠĠ Ġvar Ġattr Name : ĠString ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġn List . length ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġattr Name Ġ= Ġn List . item ( i ). attributes . getName d Item (" Name "). node Value ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( attr Name ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" authentication Level " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġauthentication Level Ġ= Ġv List . item ( i ). textContent ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" consumer Id " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconsumer Id Ġ= Ġv List . item ( i ). textContent ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ident Type " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġident Type Ġ= Ġv List . item ( i ). textContent ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" audit Tracking Id " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaudit Tracking Id Ġ= Ġv List . item ( i ). textContent ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// Ġread ĠSignature ĊĠĠĠĠĠĠĠ Ġn List Ġ= Ġdoc . getElementsByTagName NS ( XML Signature . XML NS , Ġ" Signature ") ĊĠĠĠĠĠĠĠ Ġsignature Node Ġ= Ġif Ġ( n List . length Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġn List . item ( 0 ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( Marshal Exception :: class , ĠXML Signature Exception :: class ) ĊĠĠĠ Ġfun Ġvalidate ( key Selector : ĠKey Selector ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmax Clock Sk ew Ġ= ĠgetMax Clock Sk ew () ĊĠĠĠĠĠĠĠ Ġval Ġn bf Clock Sk ew Ġ= Ġnow . to Instant (). plus Seconds ( max Clock Sk ew ) ĊĠĠĠĠĠĠĠ Ġval Ġno aC lock Sk ew Ġ= Ġnow . to Instant (). minus Seconds ( max Clock Sk ew ) ĊĠĠĠĠĠĠĠ Ġval Ġmessage : ĠString ĊĠĠĠĠĠĠĠ Ġ// Ġvalidate Ġissuer ĊĠĠĠĠĠĠĠ Ġif Ġ( issuer . isNull OrEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Ġ= Ġ" Invalid ĠSAML Ġtoken : ĠIss uer Ġis Ġempty " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠOAuth Exception ( OAuth 2 Error . INVALID _ REQUEST . setDescription ( message )). also Ġ{ Ġlog . warn ( message ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġvalidate ĠName ID ĊĠĠĠĠĠĠĠ Ġif Ġ( name ID . isNull OrEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Ġ= Ġ" Invalid ĠSAML Ġtoken : ĠName ID Ġis Ġempty " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠOAuth Exception ( OAuth 2 Error . INVALID _ REQUEST . setDescription ( message )). also Ġ{ Ġlog . warn ( message ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġvalidate ĠNot Before ĊĠĠĠĠĠĠĠ Ġif Ġ( date Not Before Ġ!= Ġnull Ġ&& Ġn bf Clock Sk ew . is Before ( date Not Before !!. to Instant ())) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Ġ= Ġ" Invalid ĠSAML Ġtoken : Ġcondition Ġn bf : Ġ$ date Not Before , Ġis Ġbefore : Ġ$ nb f Clock Sk ew " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠOAuth Exception ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOAuth 2 Error . INVALID _ REQUEST . setDescription ( message ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). also Ġ{ Ġlog . warn ( message ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// Ġvalidate ĠNot On Or After ĊĠĠĠĠĠĠĠ Ġif Ġ( no aC lock Sk ew . compareTo ( not On Or After !!. to Instant ()) Ġ== Ġ 0 Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠ Ġno aC lock Sk ew . is After ( not On Or After !!. to Instant ()) ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Ġ= Ġ" Invalid ĠSAML Ġtoken : Ġcondition Ġnot On Or After : Ġ$ not On Or After , Ġis Ġnot Ġon Ġor Ġafter : Ġ$ no aC lock Sk ew " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠOAuth Exception ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOAuth 2 Error . INVALID _ REQUEST . setDescription ( message ). also Ġ{ Ġlog . warn ( message ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġno Ġvalidation Ġon Ġattributes ... ? ĊĊĠĠĠĠĠĠĠ Ġ// Ġvalidate ĠSignature ĊĠĠĠĠĠĠĠ Ġif Ġ( signature Node Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Ġ= Ġ" Invalid ĠSAML Ġtoken : ĠSignature Ġis Ġmissing " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠOAuth Exception ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOAuth 2 Error . INVALID _ REQUEST . setDescription ( message ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). also Ġ{ Ġlog . warn ( message ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġval Context Ġ= ĠDOM Validate Context ( key Selector , Ġsignature Node ) ĊĠĠĠĠĠĠĠ Ġval Context . setId Attribute NS ( signature Node !!. parentNode Ġas ĠElement , Ġnull , Ġ" ID ") ĊĠĠĠĠĠĠĠ Ġval Ġfactory Ġ= ĠXML Signature Factory . getInstance (" DOM ") ĊĠĠĠĠĠĠĠ Ġval Ġsignature Ġ= Ġfactory . un marshal XML Signature ( val Context ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! signature . validate ( val Context )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! signature . signature Value . validate ( val Context )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Ġ= Ġ" Invalid ĠSAML Ġtoken : ĠSignature Ġvalidation Ġfailed " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠOAuth Exception ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOAuth 2 Error . INVALID _ REQUEST . setDescription ( message ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). also Ġ{ Ġlog . warn ( message ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( ref Ġin Ġsignature . signed Info . references ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(!( ref Ġas ĠReference ). validate ( val Context )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Ġ= Ġ" Invalid ĠSAML Ġtoken : ĠSignature Ġvalidation Ġfailed Ġon Ġreference Ġ${ ref . uri }" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠOAuth Exception ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOAuth 2 Error . INVALID _ REQUEST . setDescription ( message ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). also Ġ{ Ġlog . warn ( message ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Ġ= Ġ" Invalid ĠSAML Ġtoken : Ġvalidation Ġfailed " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠOAuth Exception ( OAuth 2 Error . INVALID _ REQUEST . setDescription ( message )). also Ġ{ Ġlog . warn ( message ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġmessage Ġ= Ġ" SAML Ġvalidation Ġis ĠOK Ġfor Ġissuer : Ġ$ issuer " ĊĠĠĠĠĠĠĠ Ġlog . info ( message ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġexpires In (): ĠLong Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( not On Or After Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCh rono Unit . SECONDS . between ( now , Ġnot On Or After ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ- 1 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠsetId ( id : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . id Ġ= Ġid ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Duration ( duration : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġissue Instant Ġ= Ġnow ĊĠĠĠĠĠĠĠ Ġdate Not Before Ġ= Ġissue Instant ĊĠĠĠĠĠĠĠ Ġnot On Or After Ġ= Ġissue Instant !!. plus Seconds ( duration ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ" Issuer : Ġ" Ġ+ Ġissuer Ġ+ Ġ" Ġname ID : Ġ" Ġ+ Ġname ID Ġ+ Ġ" Ġnot Before : Ġ" Ġ+ Ġdate Not Before Ġ+ Ġ" Ġnot On Or After : Ġ" Ġ+ Ġnot On Or After Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" ĠConsumer Id : Ġ" Ġ+ Ġconsumer Id Ġ+ Ġ" ĠIdent Type : Ġ" Ġ+ Ġident Type Ġ+ Ġ" ĠAuth level : Ġ" Ġ+ Ġauthentication Level ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠgetMax Clock Sk ew (): ĠLong Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠC LOCK _ S KE W ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġset Max Clock Sk ew ( max Clock Sk ew Seconds : ĠLong ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( max Clock Sk ew Seconds Ġ!= Ġnull ) ĠC LOCK _ S KE W Ġ= Ġmax Clock Sk ew Seconds ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( Exception :: class ) ĊĠĠĠ Ġfun Ġget Signed S aml ( key Store Reader : ĠKey Store Reader ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġs aml Token Ġ= Ġget Unsigned S aml ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdoc Fac Ġ= ĠDocument BuilderFactory . newInstance () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdoc Fac . is Namespace Aware Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdoc Builder Ġ= Ġdoc Fac . new Document Builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdoc Ġ= Ġdoc Builder . parse ( Input Source ( String Reader ( saml Token ))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdoc . documentElement . normalize () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġassertion Node Ġ= Ġdoc . firstChild ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnext Sibling Ġ= Ġassertion Node . firstChild . next Sibling ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSigned Info ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsign Fac Ġ= ĠXML Signature Factory . getInstance (" DOM ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġt List : ĠMutable List < Transform > Ġ= ĠArrayList () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġt List . add ( sign Fac . new Transform ( Transform . EN VELO PED , Ġnull Ġas ĠTransform Parameter Spec ? )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġt List . add ( sign Fac . new Transform ( Canonical ization Method . EXCL USIVE , Ġnull Ġas ĠTransform Parameter Spec ? )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġref Ġ= Ġsign Fac . new Reference ("# $ id ", Ġsign Fac . new Digest Method ( Digest Method . SHA 1 , Ġnull ), Ġt List , Ġnull , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsi Ġ= Ġsign Fac . new Signed Info ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsign Fac . new Canonical ization Method ( Canonical ization Method . EXCL USIVE , Ġnull Ġas ĠC 1 4 N Method Parameter Spec ? ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsign Fac . new Signature Method ( Signature Method . RSA _ SHA 1 , Ġnull ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( ref ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcert : ĠX 5 0 9 Certificate ? Ġ= Ġkey Store Reader . signing Certificate ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cert Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . error (" Failed Ġto Ġfind Ġsigning Ġcertificate Ġin Ġkeystore ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Failed Ġto Ġfind Ġsigning Ġcertificate Ġin Ġkeystore ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠprivateKey : ĠPrivate Key ? Ġ= Ġkey Store Reader . get PrivateKey () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( privateKey Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . error (" Failed Ġto Ġfind ĠPrivate Key Ġin Ġkeystore ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Failed Ġto Ġfind ĠPrivate Key Ġin Ġkeystore ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġki Fac Ġ= Ġsign Fac . key Info Factory ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx 5 0 9 Issuer Serial Ġ= Ġki Fac . new X 5 0 9 Issuer Serial ( cert . issuer DN . name , Ġcert . serial Number ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġd List : ĠMutable List < Any ?> Ġ= ĠArrayList () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġd List . add ( cert ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġd List . add ( x 5 0 9 Issuer Serial ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx 5 0 9 data Ġ= Ġki Fac . new X 5 0 9 Data ( d List ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġki List : ĠMutable List < XML Structure > Ġ= ĠArrayList () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġki List . add ( x 5 0 9 data ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġki Ġ= Ġki Fac . new Key Info ( ki List ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSignature ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsignature Ġ= Ġsign Fac . new XML Signature ( si , Ġki ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontext Ġ= ĠDO MS ign Context ( privateKey , Ġassertion Node , Ġnext Sibling ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . setId Attribute NS ( assertion Node Ġas ĠElement , Ġnull , Ġ" ID ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsignature . sign ( context ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTransform Ġto ĠXML ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtransformer Factory Ġ= ĠTransformer Factory . newInstance () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtransformer Ġ= Ġtransformer Factory . new Transformer () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransformer . setOutput Property (" omit - xml - declaration ", Ġ" yes ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsource Ġ= ĠDOM Source ( doc ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠStream Result ( String Writer ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransformer . transform ( source , Ġresult ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . writer . toString () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . error (" Error : Ġ" Ġ+ Ġe . message , Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠException (" Error : Ġ" Ġ+ Ġe . message , Ġe ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġvar ĠC LOCK _ S KE W Ġ= Ġ 6 0 L ĊĠĠĠ Ġ} Ċ } Ċ