// ĠCopyright Ġ( c ) ĠDaniel ĠH ug en ro th Ċ // Ċ // ĠThis Ġsource Ġcode Ġis Ġlicensed Ġunder Ġthe ĠMIT Ġlicense Ġfound Ġin Ġthe Ċ // ĠLICENSE Ġfile Ġin Ġthe Ġroot Ġdirectory Ġof Ġthis Ġsource Ġtree . Ċ Ċ package Ġcom . lamb dap ione er . argon 2 kt Ċ Ċ import Ġjava . nio . ByteBuffer Ċ Ċ internal Ġconst Ġval ĠARG ON 2 KT _ DEFAULT _ T _ CO ST Ġ= Ġ 1 Ġ// Ġnumber Ġof Ġiterations Ċ internal Ġconst Ġval ĠARG ON 2 KT _ DEFAULT _ M _ CO ST Ġ= Ġ 6 5 5 3 6 Ġ// Ġresulting Ġin Ġ 6 4 ĠM iB Ġmemory Ġcost Ċ internal Ġconst Ġval ĠARG ON 2 KT _ DEFAULT _ PAR ALLEL IS M Ġ= Ġ 2 Ġ// Ġrunning Ġtwo Ġthreads Ġin Ġparallel Ċ internal Ġconst Ġval ĠARG ON 2 KT _ DEFAULT _ HASH _ LENGTH Ġ= Ġ 3 2 Ġ// Ġresulting Ġin Ġ 3 2 Ġbytes Ġ= Ġ 1 2 8 Ġbit Ġoutput Ċ internal Ġval ĠARG ON 2 KT _ DEFAULT _ VERSION Ġ= ĠArg on 2 Version . V 1 3 Ġ// Ġdefault Ġto Ġnewest Ġversion ĠV 1 3 Ċ Ċ /** Ċ Ġ* ĠThe Ġdifferent ĠArg on 2 Ġmodes Ġthat Ġdiffer Ġregarding Ġside - channel - and - memory - trade offs . ĠPlease Ġrefer Ġto Ġthe Ġdocumentation Ċ Ġ* Ġof Ġthe ĠArg on 2 Ġproject Ġfor Ġdetails . Ċ Ġ*/ Ċ enum Ġclass ĠArg on 2 Mode ( val Ġidentifier : ĠInt ) Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠArg on 2 d Ġch oo ses Ġmemory Ġdepending Ġon Ġthe Ġpassword Ġand Ġsalt . ĠNot Ġsuitable Ġfor Ġenvironments ĊĠĠĠĠ Ġ* Ġwith Ġpotential Ġside - channel Ġattacks . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ ĠARG ON 2 _ D ( 0 ), ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠArg on 2 i Ġch oo ses Ġmemory Ġindependent Ġof Ġthe Ġpassword Ġand Ġsalt Ġreducing Ġthe Ġrisk Ġfrom Ġside - channels . ĠHowever , Ġthe ĊĠĠĠĠ Ġ* Ġmemory Ġtrade - off Ġis Ġwe aker . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ ĠARG ON 2 _ I ( 1 ), ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠArg on 2 id Ġcombin es Ġthe ĠArg on 2 d Ġand ĠArg on 2 i Ġproviding Ġa Ġreasonable Ġtrade - off Ġbetween Ġmemory Ġdepend ence Ġand Ġside - ĊĠĠĠĠ Ġ* Ġchannels . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ ĠARG ON 2 _ ID ( 2 ) Ċ } Ċ Ċ /** Ċ Ġ* ĠThe ĠArg on 2 Ġversion Ġto Ġuse . ĠIt 's Ġpreferred Ġto Ġuse Ġthe Ġlatest Ġ( V 1 3 ) Ġversion Ġwhere Ġsuitable . Ċ Ġ*/ Ċ enum Ġclass ĠArg on 2 Version ( val Ġversion : ĠInt ) Ġ{ ĊĊĠĠĠ Ġ/** ĠThe Ġversion ĠV 1 0 ) Ġ*/ ĊĠĠĠ ĠV 1 0 ( 0 x 1 0 ), ĊĊĠĠĠ Ġ/** ĠThe Ġ( default ) Ġversion ĠV 1 3 ) Ġ*/ ĊĠĠĠ ĠV 1 3 ( 0 x 1 3 ) Ċ } Ċ Ċ /** Ċ Ġ* ĠThe Ġmain Ġentry Ġpoint Ġfor Ġthe ĠArg on 2 Kt Ġlibrary . ĠThe Ġinitialization Ġwill Ġexecute Ġthe Ġload Ġof Ġthe Ġ. so Ġlibrary Ġ( native Ċ Ġ* ĠC Ġcode ). ĠTherefore , Ġit Ġshould Ġbe Ġinitialized Ġoff Ġthe Ġmain Ġthread . Ċ Ġ* Ċ Ġ* Ġ@ param Ġso Loader ĠCallback Ġfor Ġloading Ġthe Ġ. so Ġlibrary . ĠDefaults Ġto Ġthe ĠSystem So Loader . ĠHowever , Ġone Ġcan Ġeasily Ġreplace Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit Ġwith Ġe . g . Ġthe ĠRe Link er Ġlibrary Ġfor Ġmore Ġrobust Ġ. so Ġloading . Ċ Ġ*/ Ċ class ĠArg on 2 Kt ( so Loader : ĠSo Loader Sh im Ġ= ĠSystem So Loader ()) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġj ni Ġ= ĠArg on 2 J ni ( so Loader ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠComputes Ġthe ĠArg on 2 Ġhash Ġfor Ġthe Ġgiven Ġparameters . ĠUsing Ġdirect - allocated ĠByte Buffers Ġis Ġthe Ġpreferred Ġmethod Ġas ĊĠĠĠĠ Ġ* Ġthey Ġcan Ġbe Ġdeterministic ally Ġw ip ed Ġafterwards . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġmode ĠThe ĠArg on 2 Mode Ġto Ġuse . ĊĠĠĠĠ Ġ* Ġ@ param Ġpassword ĠThe Ġpassword . ĊĠĠĠĠ Ġ* Ġ@ param Ġsalt ĠThe Ġpassword . ĊĠĠĠĠ Ġ* Ġ@ param Ġt Cost In Iterations ĠThe Ġcomputational Ġcost Ġin Ġiterations . ĠThe Ġapplication Ġshould Ġchoose Ġthis Ġto Ġfit Ġa ĊĠĠĠĠ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcertain Ġamount Ġof Ġtime Ġafter Ġfixing Ġthe Ġm _ cost . ĊĠĠĠĠ Ġ* Ġ@ param Ġm Cost In K ib ib yte ĠThe Ġmemory Ġcost Ġin ĠK ib i Byte Ġ( i . e . Ġ 1 0 2 4 Ġbyte ). ĊĠĠĠĠ Ġ* Ġ@ param Ġhash Length InBytes ĠThe Ġlength Ġof Ġthe Ġraw Ġhash Ġin Ġbytes . ĠI . e . Ġfor Ġa Ġ 5 1 2 Ġbit Ġoutput Ġchoose Ġ 6 4 . ĊĠĠĠĠ Ġ* Ġ@ param Ġversion ĠThe ĠArg on 2 Version Ġto Ġuse . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĠThe ĠArg on 2 Kt Result Ġexposes Ġboth Ġthe Ġraw Ġhash Ġand Ġthe Ġencoded Ġstring Ġrepresentation . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ throws ĠArg on 2 Exception Ġfor Ġparameter Ġand Ġruntime Ġerrors . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Jvm Over loads ĊĠĠĠ Ġfun Ġhash ( ĊĠĠĠĠĠĠĠ Ġmode : ĠArg on 2 Mode , ĊĠĠĠĠĠĠĠ Ġpassword : ĠByteBuffer , ĊĠĠĠĠĠĠĠ Ġsalt : ĠByteBuffer , ĊĠĠĠĠĠĠĠ Ġt Cost In Iterations : ĠInt Ġ= ĠARG ON 2 KT _ DEFAULT _ T _ CO ST , ĊĠĠĠĠĠĠĠ Ġm Cost In K ib ib yte : ĠInt Ġ= ĠARG ON 2 KT _ DEFAULT _ M _ CO ST , ĊĠĠĠĠĠĠĠ Ġparallel ism : ĠInt Ġ= ĠARG ON 2 KT _ DEFAULT _ PAR ALLEL IS M , ĊĠĠĠĠĠĠĠ Ġhash Length InBytes : ĠInt Ġ= ĠARG ON 2 KT _ DEFAULT _ HASH _ LENGTH , ĊĠĠĠĠĠĠĠ Ġversion : ĠArg on 2 Version Ġ= ĠARG ON 2 KT _ DEFAULT _ VERSION ĊĠĠĠ Ġ): ĠArg on 2 Kt Result Ġ= Ġj ni . argon 2 Hash ( ĊĠĠĠĠĠĠĠ Ġmode Ġ= Ġmode . identifier , ĊĠĠĠĠĠĠĠ Ġversion Ġ= Ġversion . version , ĊĠĠĠĠĠĠĠ Ġpassword Ġ= Ġpassword , ĊĠĠĠĠĠĠĠ Ġsalt Ġ= Ġsalt , ĊĠĠĠĠĠĠĠ Ġt Cost In Iterations Ġ= Ġt Cost In Iterations , ĊĠĠĠĠĠĠĠ Ġm Cost In K ib ib yte Ġ= Ġm Cost In K ib ib yte , ĊĠĠĠĠĠĠĠ Ġparallel ism Ġ= Ġparallel ism , ĊĠĠĠĠĠĠĠ Ġhash Length InBytes Ġ= Ġhash Length InBytes ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠComputes Ġthe ĠArg on 2 Ġhash Ġfor Ġthe Ġgiven Ġparameters . ĠUsing Ġthis Ġmethod Ġwill Ġcause ĠByte Arrays Ġto Ġbe Ġallocated Ġon Ġthe ĊĠĠĠĠ Ġ* ĠJVM Ġheap Ġwhich Ġare Ġhard Ġto Ġclear . ĠIt 's Ġsuggested Ġthat Ġyou Ġalways Ġhandle Ġsecrets Ġthrough Ġdirect - allocated ĊĠĠĠĠ Ġ* ĠByte Buffers . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġmode ĠThe ĠArg on 2 Mode Ġto Ġuse . ĊĠĠĠĠ Ġ* Ġ@ param Ġpassword ĠThe Ġpassword Ġ( must Ġbe Ġa ĠByteBuffer Ġthat Ġhas Ġbeen Ġallocated Ġas Ġdirect ). ĊĠĠĠĠ Ġ* Ġ@ param Ġsalt ĠThe Ġpassword Ġ( must Ġbe Ġa ĠByteBuffer Ġthat Ġhas Ġbeen Ġallocated Ġas Ġdirect ). ĊĠĠĠĠ Ġ* Ġ@ param Ġt Cost In Iterations ĠThe Ġcomputational Ġcost Ġin Ġiterations . ĠThe Ġapplication Ġshould Ġchoose Ġthis Ġto Ġfit Ġa ĊĠĠĠĠ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcertain Ġamount Ġof Ġtime Ġafter Ġfixing Ġthe Ġm _ cost . ĊĠĠĠĠ Ġ* Ġ@ param Ġm Cost In K ib ib yte ĠThe Ġmemory Ġcost Ġin ĠK ib i Byte Ġ( i . e . Ġ 1 0 2 4 Ġbyte ). ĊĠĠĠĠ Ġ* Ġ@ param Ġhash Length InBytes ĠThe Ġlength Ġof Ġthe Ġraw Ġhash Ġin Ġbytes . ĠI . e . Ġfor Ġa Ġ 5 1 2 Ġbit Ġoutput Ġchoose Ġ 6 4 . ĊĠĠĠĠ Ġ* Ġ@ param Ġversion ĠThe ĠArg on 2 Version Ġto Ġuse . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĠThe ĠArg on 2 Kt Result Ġexposes Ġboth Ġthe Ġraw Ġhash Ġand Ġthe Ġencoded Ġstring Ġrepresentation . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ throws ĠArg on 2 Exception Ġfor Ġparameter Ġand Ġruntime Ġerrors . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Jvm Over loads ĊĠĠĠ Ġfun Ġhash ( ĊĠĠĠĠĠĠĠ Ġmode : ĠArg on 2 Mode , ĊĠĠĠĠĠĠĠ Ġpassword : ĠByteArray , ĊĠĠĠĠĠĠĠ Ġsalt : ĠByteArray , ĊĠĠĠĠĠĠĠ Ġt Cost In Iterations : ĠInt Ġ= ĠARG ON 2 KT _ DEFAULT _ T _ CO ST , ĊĠĠĠĠĠĠĠ Ġm Cost In K ib ib yte : ĠInt Ġ= ĠARG ON 2 KT _ DEFAULT _ M _ CO ST , ĊĠĠĠĠĠĠĠ Ġparallel ism : ĠInt Ġ= ĠARG ON 2 KT _ DEFAULT _ PAR ALLEL IS M , ĊĠĠĠĠĠĠĠ Ġhash Length InBytes : ĠInt Ġ= ĠARG ON 2 KT _ DEFAULT _ HASH _ LENGTH , ĊĠĠĠĠĠĠĠ Ġversion : ĠArg on 2 Version Ġ= ĠARG ON 2 KT _ DEFAULT _ VERSION ĊĠĠĠ Ġ): ĠArg on 2 Kt Result Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpassword Buffer Ġ= ĠByteBuffer . allocate Direct ( password . size ). put ( password ) ĊĠĠĠĠĠĠĠ Ġval Ġsalt Buffer Ġ= ĠByteBuffer . allocate Direct ( salt . size ). put ( salt ) ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġhash ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmode Ġ= Ġmode , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpassword Ġ= Ġpassword Buffer , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsalt Ġ= Ġsalt Buffer , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġt Cost In Iterations Ġ= Ġt Cost In Iterations , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Cost In K ib ib yte Ġ= Ġm Cost In K ib ib yte , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparallel ism Ġ= Ġparallel ism , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhash Length InBytes Ġ= Ġhash Length InBytes , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġversion Ġ= Ġversion ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpassword Buffer . w ipe Direct Buffer () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsalt Buffer . w ipe Direct Buffer () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠVerifies Ġa Ġgiven Ġpassword Ġagainst Ġthe Ġencoded Ġstring Ġrepresentation . ĠAs Ġthe Ġencoded Ġstring Ġalready Ġcontains Ġthe ĊĠĠĠĠ Ġ* Ġparameter Ġinformation Ġ( e . g . Ġt _ cost , Ġm _ cost ) Ġthis Ġis Ġpreferred Ġover Ġstoring Ġthe Ġraw Ġhash . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġmode ĠThe ĠArg on 2 Mode Ġto Ġuse . ĊĠĠĠĠ Ġ* Ġ@ param Ġencoded ĠThe Ġencoded Ġstring Ġrepresentation Ġretrieved Ġfrom Ġa ĠArg on 2 Kt Result Ġor Ġan Ġexternal Ġsource . ĊĠĠĠĠ Ġ* Ġ@ param Ġpassword ĠThe Ġpassword Ġto Ġverify Ġagainst Ġthe Ġencoded Ġstring Ġrepresentation . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ throws ĠArg on 2 Exception Ġfor Ġparameter Ġand Ġruntime Ġerrors . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġverify ( ĊĠĠĠĠĠĠĠ Ġmode : ĠArg on 2 Mode , ĊĠĠĠĠĠĠĠ Ġencoded : ĠString , ĊĠĠĠĠĠĠĠ Ġpassword : ĠByteBuffer ĊĠĠĠ Ġ): ĠBoolean Ġ= Ġj ni . argon 2 Verify ( ĊĠĠĠĠĠĠĠ Ġmode Ġ= Ġmode . identifier , ĊĠĠĠĠĠĠĠ Ġencoded Ġ= Ġencoded . toByteArray ( charset Ġ= ĠChar sets . US _ ASCII ), ĊĠĠĠĠĠĠĠ Ġpassword Ġ= Ġpassword ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠVerifies Ġa Ġgiven Ġpassword Ġagainst Ġthe Ġencoded Ġstring Ġrepresentation . ĠAs Ġthe Ġencoded Ġstring Ġalready Ġcontains Ġthe ĊĠĠĠĠ Ġ* Ġparameter Ġinformation Ġ( e . g . Ġt _ cost , Ġm _ cost ) Ġthis Ġis Ġpreferred Ġover Ġstoring Ġthe Ġraw Ġhash . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠOne Ġshould Ġprefer Ġthe Ġverify Ġversion Ġaccepting Ġa ĠByteArray Ġas Ġit Ġwill Ġallow Ġto Ġw ipe Ġthe Ġsecret Ġfrom Ġmemory . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġmode ĠThe ĠArg on 2 Mode Ġto Ġuse . ĊĠĠĠĠ Ġ* Ġ@ param Ġencoded ĠThe Ġencoded Ġstring Ġrepresentation Ġretrieved Ġfrom Ġa ĠArg on 2 Kt Result Ġor Ġan Ġexternal Ġsource . ĊĠĠĠĠ Ġ* Ġ@ param Ġpassword ĠThe Ġpassword Ġto Ġverify Ġagainst Ġthe Ġencoded Ġstring Ġrepresentation . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ throws ĠArg on 2 Exception Ġfor Ġparameter Ġand Ġruntime Ġerrors . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġverify ( ĊĠĠĠĠĠĠĠ Ġmode : ĠArg on 2 Mode , ĊĠĠĠĠĠĠĠ Ġencoded : ĠString , ĊĠĠĠĠĠĠĠ Ġpassword : ĠByteArray ĊĠĠĠ Ġ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpassword Buffer Ġ= ĠByteBuffer . allocate Direct ( password . size ). put ( password ) ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġverify ( mode Ġ= Ġmode , Ġencoded Ġ= Ġencoded , Ġpassword Ġ= Ġpassword Buffer ) ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpassword Buffer . w ipe Direct Buffer () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠReturns Ġafter Ġloading Ġand Ġverify ing Ġthe ĠJNI Ġimplementation . ĠIt Ġthrows Ġan ĠIllegalStateException Ġor Ġsimilar ĊĠĠĠĠĠĠĠĠ Ġ* Ġotherwise . ĠAs Ġthis Ġmethod Ġperforms Ġdisk ĠI / O Ġ( for Ġloading Ġthe Ġlibrary ) Ġit Ġshould Ġbe Ġrun Ġin Ġthe Ġbackground Ġand ĊĠĠĠĠĠĠĠĠ Ġ* Ġnot Ġon Ġthe Ġmain Ġthread . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġassert J ni Working ( so Loader : ĠSo Loader Sh im Ġ= ĠSystem So Loader ()) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠArg on 2 J ni Verification ( so Loader ). assert J ni Working () ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠResult Ġfrom Ġthe ĠArg on 2 Kt . hash Ġmethod Ġcontaining Ġboth Ġthe Ġraw Hash Ġand Ġencoded Output Ġas Ġdirect - allocated ĠByte Buffers . Ċ Ġ*/ Ċ class ĠArg on 2 Kt Result ( val Ġraw Hash : ĠByteBuffer , Ġval Ġencoded Output : ĠByteBuffer ) Ġ{ ĊĊĠĠĠ Ġ/** ĠThe Ġraw Ġhash Ġas Ġa ĠByteArray . Ġ*/ ĊĠĠĠ Ġfun Ġraw Hash As ByteArray (): ĠByteArray Ġ= Ġraw Hash . toByteArray () ĊĊĠĠĠ Ġ/** ĠThe Ġraw Ġhash Ġas Ġa ĠString Ġencoded Ġin Ġhexadecimal . Ġ*/ ĊĠĠĠ Ġfun Ġraw Hash As Hex adecimal ( uppercase : ĠBoolean Ġ= Ġfalse ): ĠString Ġ= Ġraw Hash As ByteArray (). encode As Hex ( uppercase ) ĊĊĠĠĠ Ġ/** ĠThe Ġencoded Ġoutput Ġstring Ġas Ġa ĠByteArray . Ġ*/ ĊĠĠĠ Ġfun Ġencoded Output As ByteArray (): ĠByteArray Ġ= Ġencoded Output . toByteArray () ĊĊĠĠĠ Ġ/** ĠThe Ġencoded Ġoutput Ġstring Ġas Ġa ĠBase 6 4 ĠString Ġusing Ġ$ Ġas Ġde limiters . Ġ*/ ĊĠĠĠ Ġfun Ġencoded Output AsString (): ĠString Ġ= Ġencoded Output As ByteArray (). toString ( charset Ġ= ĠChar sets . US _ ASCII ) Ċ } Ċ