package Ġno . nav . hel se . crypto Ċ Ċ import Ġcom . nim bus ds . j ose .* Ċ import Ġcom . nim bus ds . j ose . crypto . AES Decrypt er Ċ import Ġcom . nim bus ds . j ose . crypto . AES Encrypt er Ċ import Ġcom . nim bus ds . j ose . crypto . RSA Decrypt er Ċ import Ġcom . nim bus ds . j ose . crypto . RSA Encrypt er Ċ import Ġcom . nim bus ds . j ose . j wk . J WK Ċ import Ġcom . nim bus ds . j ose . j wk . J WK Set Ċ import Ġcom . nim bus ds . j ose . j wk . Oct et Sequence Key Ċ import Ġcom . nim bus ds . j ose . j wk . RSA Key Ċ import Ġcom . nim bus ds . j ose . util . Base 6 4 Ċ import Ġcom . nim bus ds . j ose . util . Base 6 4 URL Ċ import Ġkotlinx . serialization . json . Json Element Ċ import Ġkotlinx . serialization . json . build JsonObject Ċ import Ġkotlinx . serialization . json . put Ċ import Ġno . nav . hel se . risk . Json Risk Ċ import Ġjava . net . URI Ċ import Ġjava . util .* Ċ import Ġjavax . crypto . Key Generator Ċ import Ġjavax . crypto . SecretKey Ċ Ċ private Ġval Ġjson Ġ= ĠJson Risk Ċ Ċ fun ĠJson Element . Companion . decrypt From J WE ( j we : ĠString , Ġj w ks : ĠJ WK Set Holder ): ĠJson Element Ġ{ ĊĠĠ Ġreturn Ġjson . parse ToJson Element ( decrypt J WE ( j we , Ġj w ks . j wk Set ())) Ċ } Ċ Ċ fun ĠJson Element . encrypt As J WE ( j wk : ĠJ WK Holder ): ĠString Ġ{ ĊĠĠ Ġreturn Ġencrypt As J WE ( toString (). toByteArray ( charset Ġ= ĠChar sets . UTF _ 8 ), Ġj wk . j wk ()) !! Ċ } Ċ Ċ internal Ġfun Ġdecrypt J WE ( j we String : ĠString , Ġj wk Set : ĠJ WK Set ): ĠString Ġ{ ĊĠĠ Ġval Ġj we Ġ= ĠJ WE Object . parse ( j we String ) ĊĠĠ Ġval Ġkey Id Ġ= Ġj we . header . key ID ĊĠĠ Ġval Ġj wk : ĠJ WK Ġ= Ġj wk Set . getKey By KeyId ( key Id ) Ġ?: Ġthrow ĠRuntimeException (" No Ġde cryption Ġkey Ġfound Ġwith Ġkey Id =$ key Id ") ĊĠĠ Ġval Ġj we Decrypt er : ĠJ WE Decrypt er ĊĠĠ Ġj we Decrypt er Ġ= Ġif Ġ( j wk Ġis ĠOct et Sequence Key ) Ġ{ ĊĠĠĠĠĠ ĠAES Decrypt er ( j wk ) ĊĠĠ Ġ} Ġelse Ġif Ġ( j wk Ġis ĠRSA Key ) Ġ{ ĊĠĠĠĠĠ ĠRSA Decrypt er (( j wk ). to RS AP rivate Key ()) ĊĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġthrow ĠRuntimeException (" Unrecognized ĠJ WK Ġtype : Ġ" Ġ+ Ġj wk . java Class . simple Name ) ĊĠĠ Ġ} ĊĠĠ Ġj we . decrypt ( j we Decrypt er ) ĊĠĠ Ġreturn ĠString ( j we . payload . to Bytes (), ĠChar sets . UTF _ 8 ) Ċ } Ċ Ċ internal Ġfun Ġencrypt As J WE ( content : ĠByteArray , Ġj wk : ĠJ WK ): ĠString ? Ġ{ ĊĠĠ Ġval Ġj we Encrypt er : ĠJ WE Encrypt er ĊĠĠ Ġval Ġj we Algorithm : ĠJ WE Algorithm ĊĠĠ Ġif Ġ( j wk Ġis ĠOct et Sequence Key ) Ġ{ ĊĠĠĠĠĠ Ġj we Encrypt er Ġ= ĠAES Encrypt er ( j wk ) ĊĠĠĠĠĠ Ġj we Algorithm Ġ= ĠJ WE Algorithm . A 2 5 6 KW ĊĠĠ Ġ} Ġelse Ġif Ġ( j wk Ġis ĠRSA Key ) Ġ{ ĊĠĠĠĠĠ Ġj we Encrypt er Ġ= ĠRSA Encrypt er ( j wk . to RS AP ublic Key ()) ĊĠĠĠĠĠ Ġj we Algorithm Ġ= ĠJ WE Algorithm . RSA _ OA EP _ 2 5 6 ĊĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġthrow ĠRuntimeException (" Unrecognized ĠJ WK Ġtype : Ġ" Ġ+ Ġj wk . java Class . simple Name ) ĊĠĠ Ġ} ĊĠĠ Ġval Ġheader Ġ= ĠJ WE Header ( j we Algorithm , ĊĠĠĠĠĠĠ ĠEncryption Method . A 2 5 6 GCM , ĊĠĠĠĠĠĠ Ġnull Ġas ĠJ OSE ObjectType ?, Ġnull Ġas ĠString ?, Ġnull Ġas ĠMutable Set < String > ?, Ġnull Ġas ĠURI ?, Ġnull Ġas ĠJ WK ?, Ġnull Ġas ĠURI ?, Ġnull Ġas ĠBase 6 4 URL ?, Ġnull Ġas ĠBase 6 4 URL ?, Ġnull Ġas ĠMutable List < Base 6 4 > ?, ĊĠĠĠĠĠĠ Ġj wk . key ID , ĊĠĠĠĠĠĠ Ġnull Ġas ĠJ WK ?, ĊĠĠĠĠĠĠ ĠCompression Algorithm . DEF , Ġ Ġ// ĠCompress Ġbefore Ġencryption , Ġbecause Ġencrypted Ġdata Ġcannot Ġbe Ġcompressed ĊĠĠĠĠĠĠ Ġnull Ġas ĠBase 6 4 URL ?, Ġnull Ġas ĠBase 6 4 URL ?, Ġnull Ġas ĠBase 6 4 URL ?, Ġ 0 , ĊĠĠĠĠĠĠ Ġnull Ġas ĠBase 6 4 URL ?, Ġnull Ġas ĠBase 6 4 URL ?, Ġnull Ġas ĠMutable Map < String , ĠAny > ?, Ġnull Ġas ĠBase 6 4 URL ?) ĊĠĠ Ġval Ġj we Ġ= ĠJ WE Object ( header , ĠPayload ( content )) ĊĠĠ Ġj we . encrypt ( j we Encrypt er ) ĊĠĠ Ġreturn Ġj we . serialize () Ċ } Ċ Ċ internal Ġfun Ġj wk SecretKey From ( kid : ĠString , Ġkey : ĠSecret Key ): ĠJ WK Ġ{ ĊĠĠ Ġval Ġkey Base 6 4 Ġ= ĠBase 6 4 URL . encode ( key . encoded ). toString () ĊĠĠ Ġval Ġj wk Json Ġ= Ġbuild JsonObject Ġ{ ĊĠĠĠĠĠ Ġput (" k ty ", Ġ" oct ") ĊĠĠĠĠĠ Ġput (" kid ", Ġkid ) ĊĠĠĠĠĠ Ġput (" alg ", Ġ" A 2 5 6 KW ") ĊĠĠĠĠĠ Ġput (" k ", Ġkey Base 6 4 ) ĊĠĠ Ġ} ĊĠĠ Ġreturn ĠJ WK . parse ( j wk Json . toString ()) Ċ } Ċ Ċ internal Ġfun Ġcreate Random J WK AES ( kid : ĠString Ġ= ĠUUID . randomUUID (). toString ()): ĠJ WK Ġ{ ĊĠĠ Ġval Ġkey gen Ġ= ĠKey Generator . getInstance (" AES ") ĊĠĠ Ġkey gen . init ( 2 5 6 ) ĊĠĠ Ġval Ġkey Ġ= Ġkey gen . generate Key () ĊĠĠ Ġreturn Ġj wk SecretKey From ( kid , Ġkey ) Ċ } Ċ