/* Ċ Ġ* ĠCopyright ĠAmazon . com , ĠInc . Ġor Ġits Ġaffiliates . ĠAll ĠRights ĠReserved . Ċ Ġ* ĠSPDX - License - Identifier : ĠApache - 2 . 0 . Ċ Ġ*/ Ċ Ċ package Ġaws . sdk . kotlin . crt . auth . signing Ċ Ċ import Ġaws . sdk . kotlin . crt . Platform Ċ import Ġaws . sdk . kotlin . crt . auth . credentials . Credentials Ċ import Ġaws . sdk . kotlin . crt . auth . credentials . Credentials Provider Ċ Ċ public Ġenum Ġclass ĠAws Signing Algorithm ( public Ġval Ġvalue : ĠInt ) Ġ{ ĊĠĠĠ ĠSIG V 4 ( 0 ), ĊĠĠĠ ĠSIG V 4 _ ASY M METRIC ( 1 ); Ċ } Ċ Ċ public Ġenum Ġclass ĠAws Signature Type ( public Ġval Ġvalue : ĠInt ) Ġ{ ĊĠĠĠ ĠHTTP _ REQUEST _ V IA _ HEADERS ( 0 ), ĊĠĠĠ ĠHTTP _ REQUEST _ V IA _ QUERY _ PARAMS ( 1 ), ĊĠĠĠ ĠHTTP _ REQUEST _ CHUNK ( 2 ), ĊĠĠĠ ĠHTTP _ REQUEST _ EVENT ( 3 ); Ċ } Ċ Ċ public Ġobject ĠAws Signed Body Value Ġ{ ĊĠĠĠ Ġpublic Ġconst Ġval ĠEMPTY _ SHA 2 5 6 : ĠString Ġ= Ġ" e 3 b 0 c 4 4 2 9 8 fc 1 c 1 4 9 af bf 4 c 8 9 9 6 fb 9 2 4 2 7 ae 4 1 e 4 6 4 9 b 9 3 4 ca 4 9 5 9 9 1 b 7 8 5 2 b 8 5 5 " ĊĠĠĠ Ġpublic Ġconst Ġval ĠUNSIGNED _ PAYLOAD : ĠString Ġ= Ġ" UNSIGNED - PAYLOAD " ĊĠĠĠ Ġpublic Ġconst Ġval ĠST REAM ING _ AWS 4 _ HMAC _ SHA 2 5 6 _ PAYLOAD : ĠString Ġ= Ġ" STREAM ING - AWS 4 - HMAC - SHA 2 5 6 - PAYLOAD " ĊĠĠĠ Ġpublic Ġconst Ġval ĠST REAM ING _ AWS 4 _ HMAC _ SHA 2 5 6 _ EVENTS : ĠString Ġ= Ġ" STREAM ING - AWS 4 - HMAC - SHA 2 5 6 - EVENTS " Ċ } Ċ Ċ public Ġenum Ġclass ĠAws Signed Body Header Type ( public Ġval Ġvalue : ĠInt ) Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDo Ġnot Ġadd Ġa Ġheader ĊĠĠĠĠ Ġ*/ ĊĠĠĠ ĠNONE ( 0 ), ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAdd Ġthe Ġ" x - amz - content - sha 2 5 6 " Ġheader Ġwith Ġthe Ġcanonical Ġrequest 's Ġbody Ġvalue ĊĠĠĠĠ Ġ*/ ĊĠĠĠ ĠX _ AM Z _ CONTENT _ SHA 2 5 6 ( 1 ); Ċ } Ċ Ċ /** Ċ Ġ* ĠPredicate Ġfunction Ġused Ġto Ġdetermine Ġif Ġa Ġspecific Ġheader Ġshould Ġbe Ġsigned Ġor Ġnot Ċ Ġ*/ Ċ public Ġtype alias ĠShould Sign Header Fn Ġ= Ġ( String ) Ġ-> ĠBoolean Ċ Ċ /** Ċ Ġ* ĠA Ġconfiguration Ġstructure Ġfor Ġuse Ġin ĠAWS - related Ġsigning Ċ Ġ*/ Ċ public Ġclass ĠAws Signing Config ( builder : ĠBuilder ) Ġ{ ĊĊĠĠĠ Ġpublic Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġpublic Ġfun Ġbuild ( block : ĠBuilder . () Ġ-> ĠUnit ): ĠAws Signing Config Ġ= ĠBuilder (). apply ( block ). build () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġregion Ġto Ġsign Ġagainst ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġval Ġregion : ĠString Ġ= Ġrequire NotNull ( builder . region ) Ġ{ Ġ" signing Ġconfig Ġmust Ġspecify Ġa Ġregion " Ġ} ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġname Ġof Ġservice Ġto Ġsign Ġa Ġrequest Ġfor ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġval Ġservice : ĠString Ġ= Ġrequire NotNull ( builder . service ) Ġ{ Ġ" signing Ġconfig Ġmust Ġspecify Ġa Ġservice " Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRaw Ġdate Ġ( epoch Ġmilliseconds ) Ġto Ġuse Ġduring Ġthe Ġsigning Ġprocess . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġval Ġdate : ĠLong Ġ= Ġbuilder . date Ġ?: ĠPlatform . epoch Milli Now () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠOptional Ġfunction Ġto Ġcontrol Ġwhich Ġheaders Ġare Ġa Ġpart Ġof Ġthe Ġcanonical Ġrequest . ĊĠĠĠĠ Ġ* ĠSk ipping Ġauth - required Ġheaders Ġwill Ġresult Ġin Ġan Ġun usable Ġsignature . Ġ ĠHeaders Ġinjected Ġby Ġthe Ġsigning Ġprocess ĊĠĠĠĠ Ġ* Ġare Ġnot Ġsk ipp able . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThis Ġfunction Ġdoes Ġnot Ġoverride Ġthe Ġinternal Ġcheck Ġfunction Ġ( x - amzn - trace - id , Ġuser - agent ), Ġbut Ġrather ĊĠĠĠĠ Ġ* Ġsupp lement s Ġit . Ġ ĠIn Ġparticular , Ġa Ġheader Ġwill Ġget Ġsigned Ġif Ġand Ġonly Ġif Ġit Ġreturns Ġtrue Ġto Ġboth ĊĠĠĠĠ Ġ* Ġthe Ġinternal Ġcheck Ġ( skip s Ġx - amzn - trace - id , Ġuser - agent ) Ġand Ġthis Ġfunction Ġ( if Ġdefined ). ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġval Ġshould Sign Header : ĠShould Sign Header Fn ? Ġ= Ġbuilder . should Sign Header ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠWhat Ġsigning Ġalgorithm Ġto Ġuse . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġval Ġalgorithm : ĠAws Signing Algorithm Ġ= Ġbuilder . algorithm ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠWhat Ġsort Ġof Ġsignature Ġshould Ġbe Ġcomputed ? ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġval Ġsignature Type : ĠAws Signature Type Ġ= Ġbuilder . signature Type ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠWe Ġassume Ġthe Ġuri Ġwill Ġbe Ġencoded Ġonce Ġin Ġpreparation Ġfor Ġtransmission . Ġ ĠCert ain Ġservices ĊĠĠĠĠ Ġ* Ġdo Ġnot Ġdecode Ġbefore Ġchecking Ġsignature , Ġrequiring Ġus Ġto Ġactually Ġdouble - encode Ġthe Ġuri Ġin Ġthe Ġcanonical ĊĠĠĠĠ Ġ* Ġrequest Ġin Ġorder Ġto Ġpass Ġa Ġsignature Ġcheck . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġval Ġuse Double Uri Encode : ĠBoolean Ġ= Ġbuilder . use Double Uri Encode ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠControls Ġwhether Ġor Ġnot Ġthe Ġuri Ġpaths Ġshould Ġbe Ġnormalized Ġwhen Ġbuilding Ġthe Ġcanonical Ġrequest ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġval Ġnormalize Uri Path : ĠBoolean Ġ= Ġbuilder . normalize Uri Path ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠShould Ġthe Ġ" X - Amz - Security - Token " Ġquery Ġparam Ġbe Ġomitted ? ĊĠĠĠĠ Ġ* ĠNorm ally , Ġthis Ġparameter Ġis Ġadded Ġduring Ġsigning Ġif Ġthe Ġcredentials Ġhave Ġa Ġsession Ġtoken . ĊĠĠĠĠ Ġ* ĠThe Ġonly Ġknown Ġcase Ġwhere Ġthis Ġshould Ġbe Ġtrue Ġis Ġwhen Ġsigning Ġa Ġwebsocket Ġhandshake Ġto ĠIoT ĠCore . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġval Ġomit Session Token : ĠBoolean Ġ= Ġbuilder . omit Session Token ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠOptional Ġstring Ġto Ġuse Ġas Ġthe Ġcanonical Ġrequest 's Ġbody Ġpublic Ġvalue . ĊĠĠĠĠ Ġ* ĠIf Ġstring Ġis Ġempty , Ġa Ġpublic Ġvalue Ġwill Ġbe Ġcalculated Ġfrom Ġthe Ġpayload Ġduring Ġsigning . ĊĠĠĠĠ Ġ* ĠTypically , Ġthis Ġis Ġthe ĠSHA - 2 5 6 Ġof Ġthe Ġ( request / chunk / event ) Ġpayload , Ġwritten Ġas Ġlowercase Ġhex . ĊĠĠĠĠ Ġ* ĠIf Ġthis Ġhas Ġbeen Ġpre calculated , Ġit Ġcan Ġbe Ġset Ġhere . ĠSpecial Ġpublic Ġvalues Ġused Ġby Ġcertain Ġservices Ġcan Ġalso Ġbe Ġset ĊĠĠĠĠ Ġ* Ġ( e . g . Ġ" UNSIGNED - PAYLOAD " Ġ" STREAM ING - AWS 4 - HMAC - SHA 2 5 6 - PAYLOAD " Ġ" STREAM ING - AWS 4 - HMAC - SHA 2 5 6 - EVENTS "). ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġval Ġsigned Body Value : ĠString ? Ġ= Ġbuilder . signed Body Value ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠControls Ġwhat Ġbody Ġ" hash " Ġheader , Ġif Ġany , Ġshould Ġbe Ġadded Ġto Ġthe Ġcanonical Ġrequest Ġand Ġthe Ġsigned Ġrequest : ĊĠĠĠĠ Ġ* ĠĠ ĠAWS _ SB HT _ NONE Ġ- Ġno Ġheader Ġshould Ġbe Ġadded ĊĠĠĠĠ Ġ* ĠĠ ĠAWS _ SB HT _ X _ AM Z _ CONTENT _ SHA 2 5 6 Ġ- Ġthe Ġbody Ġ" hash " Ġshould Ġbe Ġadded Ġin Ġthe ĠX - Amz - Content - Sha 2 5 6 Ġheader ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġval Ġsigned Body Header : ĠAws Signed Body Header Type Ġ= Ġbuilder . signed Body Header ĊĊĠĠĠ Ġ/* ĊĠĠĠĠ Ġ* ĠSign ing Ġkey Ġcontrol : ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠĠ Ġ( 1 ) ĠIf Ġ" credentials " Ġis Ġpublic Ġvalid , Ġuse Ġit ĊĠĠĠĠ Ġ* ĠĠ Ġ( 2 ) ĠElse Ġif Ġ" credentials _ provider " Ġis Ġpublic Ġvalid , Ġquery Ġcredentials Ġfrom Ġthe Ġprovider Ġand Ġuse Ġthe Ġresult ĊĠĠĠĠ Ġ* ĠĠ Ġ( 3 ) ĠElse Ġfail ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ*/ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAWS ĠCredentials Ġto Ġsign Ġwith . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġval Ġcredentials : ĠCredentials ? Ġ= Ġbuilder . credentials ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAWS Ġcredentials Ġprovider Ġto Ġfetch Ġcredentials Ġfrom . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġval Ġcredentials Provider : ĠCredentials Provider ? Ġ= Ġbuilder . credentials Provider ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( credentials Ġ== Ġnull Ġ&& Ġcredentials Provider Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" signing Ġconfig Ġmust Ġspecify Ġone Ġof Ġ` credentials ` Ġor Ġ` credentials Provider ` ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠIf Ġnon - zero Ġand Ġthe Ġsigning Ġtransform Ġis Ġquery Ġparam , Ġthen Ġsigning Ġwill Ġadd ĠX - Amz - Expires Ġto Ġthe Ġquery ĊĠĠĠĠ Ġ* Ġstring , Ġequal Ġto Ġthe Ġpublic Ġvalue Ġspecified Ġhere . Ġ ĠIf Ġthis Ġpublic Ġvalue Ġis Ġzero Ġor Ġif Ġheader Ġsigning Ġis Ġbeing Ġused Ġthen ĊĠĠĠĠ Ġ* Ġthis Ġparameter Ġhas Ġno Ġeffect . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġval Ġexpiration InSeconds : ĠLong Ġ= Ġbuilder . expiration InSeconds ĊĊĠĠĠ Ġpublic Ġclass ĠBuilder Ġ{ ĊĠĠĠĠĠĠĠ Ġpublic Ġvar Ġregion : ĠString ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġpublic Ġvar Ġservice : ĠString ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġpublic Ġvar Ġdate : ĠLong ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġpublic Ġvar Ġalgorithm : ĠAws Signing Algorithm Ġ= ĠAws Signing Algorithm . SIG V 4 ĊĠĠĠĠĠĠĠ Ġpublic Ġvar Ġshould Sign Header : ĠShould Sign Header Fn ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġpublic Ġvar Ġsignature Type : ĠAws Signature Type Ġ= ĠAws Signature Type . HTTP _ REQUEST _ V IA _ HEADERS ĊĠĠĠĠĠĠĠ Ġpublic Ġvar Ġuse Double Uri Encode : ĠBoolean Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġpublic Ġvar Ġnormalize Uri Path : ĠBoolean Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġpublic Ġvar Ġomit Session Token : ĠBoolean Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġpublic Ġvar Ġsigned Body Value : ĠString ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġpublic Ġvar Ġsigned Body Header : ĠAws Signed Body Header Type Ġ= ĠAws Signed Body Header Type . NONE ĊĠĠĠĠĠĠĠ Ġpublic Ġvar Ġcredentials : ĠCredentials ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġpublic Ġvar Ġcredentials Provider : ĠCredentials Provider ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġpublic Ġvar Ġexpiration InSeconds : ĠLong Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġpublic Ġfun Ġbuild (): ĠAws Signing Config Ġ= ĠAws Signing Config ( this ) ĊĠĠĠ Ġ} Ċ } Ċ