import Ġpw . bin om . ByteBuffer Ċ import Ġpw . bin om . base 6 4 . Base 1 6 Ċ import Ġpw . bin om . base 6 4 . Base 6 4 Ċ import Ġpw . bin om . crypto . H Mac Ċ import Ġpw . bin om . crypto . MD 5 Message Digest Ċ import Ġpw . bin om . crypto . Sha 2 5 6 Message Digest Ċ import Ġpw . bin om . date . Date Ċ import Ġpw . bin om . date . format . toDate Pattern Ċ import Ġpw . bin om . io . UTF 8 Ċ import Ġpw . bin om . io . http . Headers Ċ import Ġpw . bin om . net . URI Ċ import Ġpw . bin om . net . to URI Ċ import Ġkotlin . jvm . Jvm Name Ċ Ċ class ĠSign er Ġprivate Ġconstructor ( ĊĠĠĠ Ġval Ġrequest : ĠRequest , ĊĠĠĠ Ġval Ġcontent Sha 2 5 6 : ĠString , ĊĠĠĠ Ġval Ġdate : ĠDate , ĊĠĠĠ Ġval Ġregion : ĠString , ĊĠĠĠ Ġval Ġaccess Key : ĠString , ĊĠĠĠ Ġval Ġsecret Key : ĠString , ĊĠĠĠ Ġval Ġprev Signature : ĠString ? Ċ ) Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġsign V 4 ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠserviceName : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequest : ĠRequest , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġregion : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaccess Key : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsecret Key : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Sha 2 5 6 : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdate : ĠDate , ĊĠĠĠĠĠĠĠ Ġ): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsigner Ġ= ĠSign er ( request , Ġcontent Sha 2 5 6 , Ġdate , Ġregion , Ġaccess Key , Ġsecret Key , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsigner . set Scope ( serviceName ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsigner . set Canonical Request () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsigner . setString To Sign () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsigner . set Signing Key ( serviceName ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsigner . set Signature () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsigner . set Authorization () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsigner . authorization Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġrequest . newBuilder (). header (" Authorization ", Ġsigner . authorization ). build () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset Authorization () Ġ{ ĊĠĠĠĠĠĠĠ Ġauthorization Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" AWS 4 - HMAC - SHA 2 5 6 ĠCredential =$ access Key /$ scope , ĠSigned Headers =$ signed Headers , ĠSignature =$ signature " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġlateinit Ġvar Ġsigning Key : ĠByteArray ĊĠĠĠ Ġprivate Ġfun Ġset Signing Key ( serviceName : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġaws 4 SecretKey Ġ= Ġ" AWS 4 " Ġ+ Ġthis . secret Key ; ĊĊĠĠĠĠĠĠĠ Ġval Ġdate Key Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsum H mac ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaws 4 SecretKey . encode To ByteArray (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSIGN ER _ DATE _ FORMAT . toString ( this . date . calendar ( 0 )). encode To ByteArray () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ); ĊĊĠĠĠĠĠĠĠ Ġval Ġdate Region Key Ġ= Ġsum H mac ( date Key , Ġthis . region . encode To ByteArray ()) ĊĊĠĠĠĠĠĠĠ Ġval Ġdate Region Service Key Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsum H mac ( date Region Key , ĠserviceName . encode To ByteArray ()) ĊĊĠĠĠĠĠĠĠ Ġthis . signing Key Ġ= Ġsum H mac ( date Region Service Key , Ġ" aws 4 _ request ". encode To ByteArray ()); ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġpublic Ġfun Ġsum H mac ( key : ĠByteArray , Ġdata : ĠByteArray ): ĠByteArray Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmac Ġ= ĠH Mac ( H Mac . Algorithm . SHA 2 5 6 , Ġkey ) ĊĠĠĠĠĠĠĠ Ġmac . update ( data ); ĊĊĠĠĠĠĠĠĠ Ġreturn Ġmac . finish () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset StringTo Sign () Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . string To Sign Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" AWS 4 - HMAC - SHA 2 5 6 " Ġ+ Ġ"\ n " Ġ+ ĠAM Z _ DATE _ FORMAT . toString ( this . date . calendar ( 0 )) Ġ+ Ġ"\ n " Ġ+ Ġthis . scope Ġ+ Ġ"\ n " Ġ+ Ġthis . canonical Request Hash ; ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġlateinit Ġvar Ġstring To Sign : ĠString ĊĠĠĠ Ġlateinit Ġvar Ġscope : ĠString ĊĠĠĠ Ġlateinit Ġvar Ġcanonical Request : ĠString ĊĠĠĠ Ġlateinit Ġvar Ġcanonical Request Hash : ĠString ĊĊĠĠĠ Ġ@ Jvm Name (" set Scope 2 ") ĊĠĠĠ Ġprivate Ġfun Ġset Scope ( serviceName : ĠString ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġthis . scope Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSIGN ER _ DATE _ FORMAT . toString ( date . calendar ( 0 )) Ġ+ Ġ"/" Ġ+ Ġthis . region Ġ+ Ġ"/" Ġ+ ĠserviceName Ġ+ Ġ"/ aws 4 _ request "; ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġurl : ĠURI Ġ= Ġ" http :// aaa / ". to URI () ĊĠĠĠ Ġlateinit Ġvar Ġcanonical Headers : ĠHashMap < String , ĠString > ĊĠĠĠ Ġlateinit Ġvar Ġsigned Headers : ĠString ĊĊĠĠĠ Ġprivate Ġfun Ġset Canonical Headers ( ignored _ headers : ĠSet < String >) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . canonical Headers Ġ= ĠHashMap < String , ĠString >() ĊĠĠĠĠĠĠĠ Ġval Ġheaders : ĠHeaders Ġ= Ġrequest . headers ĊĠĠĠĠĠĠĠ Ġfor Ġ( name Ġin Ġheaders . names ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsigned Header Ġ= Ġname . lowercase () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! ignored _ headers . contains ( signed Header )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠConvert Ġand Ġadd Ġheader Ġvalues Ġas Ġper ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġhttps :// docs . aws . amazon . com / general / latest / gr / sig v 4 - create - canonical - request . html ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ* ĠHeader Ġhaving Ġmultiple Ġvalues Ġshould Ġbe Ġconverted Ġto Ġcomma Ġseparated Ġvalues . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ* ĠMulti - spaced Ġvalue Ġof Ġheader Ġshould Ġbe Ġtrimmed Ġto Ġsingle Ġsp aced Ġvalue . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheaders . values ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . canonical Headers [ signed Header ] Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheaders [ name ] !!. map Ġ{ Ġit . split (' Ġ'). filter Ġ{ Ġit . isNotEmpty () Ġ}. join ToString (" Ġ") Ġ}. join ToString (",") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġthis . signed Headers Ġ= Ġthis . canonical Headers . keys . join ToString ("; ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġlateinit Ġvar Ġcanonical QueryString : ĠString ĊĠĠĠ Ġprivate Ġfun Ġset Canonical QueryString () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġencoded Query Ġ= Ġthis . url . query ?. raw ĊĠĠĠĠĠĠĠ Ġif Ġ( encoded Query Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . canonical QueryString Ġ= Ġ""; ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġthis . canonical QueryString Ġ= Ġencoded Query ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset Canonical Request () Ġ{ ĊĠĠĠĠĠĠĠ Ġset Canonical Headers ( IG NO RED _ HEADERS ) ĊĠĠĠĠĠĠĠ Ġthis . url Ġ= Ġrequest . url ĊĠĠĠĠĠĠĠ Ġset Canonical QueryString () ĊĊĠĠĠĠĠĠĠ Ġ// ĠCan onical Request Ġ= ĊĠĠĠĠĠĠĠ Ġ// ĠĠ ĠHTTP Request Method Ġ+ Ġ'\ n ' Ġ+ ĊĠĠĠĠĠĠĠ Ġ// ĠĠ ĠCan onical URI Ġ+ Ġ'\ n ' Ġ+ ĊĠĠĠĠĠĠĠ Ġ// ĠĠ ĠCan onical QueryString Ġ+ Ġ'\ n ' Ġ+ ĊĠĠĠĠĠĠĠ Ġ// ĠĠ ĠCan onical Headers Ġ+ Ġ'\ n ' Ġ+ ĊĠĠĠĠĠĠĠ Ġ// ĠĠ ĠSigned Headers Ġ+ Ġ'\ n ' Ġ+ ĊĠĠĠĠĠĠĠ Ġ// ĠĠ ĠHex Encode ( Hash ( Request Payload )) ĊĠĠĠĠĠĠĠ Ġcanonical Request Ġ= Ġ( request . method ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. toString () Ġ+ Ġ"\ n " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġthis . url . path . raw . split ('/ '). map Ġ{ ĠUTF 8 . encode ( it ) Ġ}. join ToString ("/") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ"\ n " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġthis . canonical QueryString ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ"\ n " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġthis . canonical Headers . map Ġ{ Ġ"${ it . key }:${ it . value }" Ġ}. join ToString ("\ n ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ"\ n \ n " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġthis . signed Headers ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ"\ n " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġcontent Sha 2 5 6 ) ĊĠĠĠĠĠĠĠ Ġcanonical Request Hash Ġ= ĠDigest . sha 2 5 6 Hash ( canonical Request ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġlateinit Ġvar Ġsignature : ĠString ĊĠĠĠ Ġprivate Ġfun Ġset Signature () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdigest Ġ= Ġsum H mac ( this . signing Key , Ġthis . string To Sign . encode To ByteArray ()) ĊĠĠĠĠĠĠĠ Ġthis . signature Ġ= ĠBase 1 6 . encode ( digest ). lowercase () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġlateinit Ġvar Ġauthorization : ĠString Ċ // ĠĠĠĠĠĠĠ Ġ" AWS 4 - HMAC - SHA 2 5 6 ĠCredential =" Ġ+ Ġthis . access Key Ġ+ Ġ"/" Ġ+ Ġthis . scope Ġ+ Ġ", ĠSigned Headers =" Ġ+ Ġthis . signed Headers Ġ+ Ġ", ĠSignature =" Ġ+ Ġthis . signature Ċ } Ċ Ċ object ĠDigest Ġ{ ĊĠĠĠ Ġfun Ġsha 2 5 6 Hash ( string : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsha 2 5 6 Digest Ġ= ĠSh a 2 5 6 Message Digest () ĊĠĠĠĠĠĠĠ Ġsha 2 5 6 Digest . update ( string . encode To ByteArray ()) ĊĠĠĠĠĠĠĠ Ġreturn ĠBase 1 6 . encode ( sha 2 5 6 Digest . finish ()). lowercase () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsha 2 5 6 Hash ( data : ByteBuffer ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsha 2 5 6 Digest Ġ= ĠSh a 2 5 6 Message Digest () ĊĠĠĠĠĠĠĠ Ġsha 2 5 6 Digest . update ( data ) ĊĠĠĠĠĠĠĠ Ġreturn ĠBase 1 6 . encode ( sha 2 5 6 Digest . finish ()). lowercase () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġmd 5 Hash ( data : ByteBuffer ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmd 5 Digest Ġ= ĠMD 5 Message Digest () ĊĠĠĠĠĠĠĠ Ġmd 5 Digest . update ( data ) ĊĠĠĠĠĠĠĠ Ġreturn ĠBase 6 4 . encode ( md 5 Digest . finish ()). lowercase () ĊĠĠĠ Ġ} Ċ } Ċ Ċ val ĠSIGN ER _ DATE _ FORMAT Ġ= Ġ" yyyy MM dd ". toDate Pattern () Ċ val ĠIG NO RED _ HEADERS Ġ= Ġset Of (" accept - encoding ", Ġ" authorization ", Ġ" content - type ", Ġ" content - length ", Ġ" user - agent ", Ġ" accept ") Ċ val ĠAM Z _ DATE _ FORMAT Ġ= Ġ" yyyy MM dd ' T ' HH mm ss ' Z ' ". toDate Pattern () Ċ Ċ data Ġclass ĠRequest ( val Ġmethod : ĠString , Ġval Ġurl : ĠURI , Ġval Ġheaders : ĠHeaders )