/* * Copyright 2015 Victor Albertos * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package io.rx_cache2.internal.encrypt; import io.rx_cache2.internal.encrypt.Encryptor; import org.junit.Before; import org.junit.ClassRule; import org.junit.FixMethodOrder; import org.junit.Test; import org.junit.rules.TemporaryFolder; import org.junit.runners.MethodSorters; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotEquals; @FixMethodOrder(MethodSorters.NAME_ASCENDING) public class BuiltInEncryptorTest { private static final String FILENAME_IN = "fileIn"; private static final String FILENAME_ENCRYPTED = "fileEncrypted"; private static final String FILENAME_OUT = "fileOut"; private Encryptor encryptor; private static File fileIn, fileOut, fileEncrypted; @ClassRule public static TemporaryFolder temporaryFolder = new TemporaryFolder(); @Before public void setUp() { encryptor = new io.rx_cache2.internal.encrypt.BuiltInEncryptor(); } @Test public void _01_When_Encrypt_And_Decrypt_Then_Retrieve_Original_Content() { fileIn = getFile(FILENAME_IN, "A Dummy Content"); fileOut = getFile(FILENAME_OUT); fileEncrypted = getFile(FILENAME_ENCRYPTED); encryptor.encrypt("key", fileIn, fileEncrypted); encryptor.decrypt("key", fileEncrypted, fileOut); assertEquals(getFileContent(fileIn), getFileContent(fileOut)); } @Test public void _02_When_Encrypt_Then_Original_Content_Does_Not_Match() { fileIn = getFile(FILENAME_IN, "A Dummy Content 2"); fileEncrypted = getFile(FILENAME_ENCRYPTED); encryptor.encrypt("key2", fileIn, fileEncrypted); assertNotEquals(getFileContent(fileIn), getFileContent(fileEncrypted)); } @Test public void _03_When_Decrypt_Then_Original_Content_Does_Match() { fileOut = getFile(FILENAME_OUT); encryptor.decrypt("key2", fileEncrypted, fileOut); assertEquals(getFileContent(fileIn), (getFileContent(fileOut))); } @Test public void _04_When_Decrypt_With_Other_Key_Then_Original_Content_Does_Not_Match() { fileOut = getFile(FILENAME_OUT); encryptor.decrypt("keyFail", fileEncrypted, fileOut); assertNotEquals(getFileContent(fileIn), (getFileContent(fileOut))); } @Test public void _05_When_Decrypt_With_Original_Key_Then_Original_Content_Does_Match() { fileOut = getFile(FILENAME_OUT); encryptor.decrypt("key2", fileEncrypted, fileOut); assertEquals(getFileContent(fileIn), (getFileContent(fileOut))); } @Test public void _06_When_Encrypt_And_Decrypt_With_Long_Key_Then_Retrieve_Original_Content() { String key2048 = "[n(s4v7nf?~]k'bP$/m]tc.VYXN2;H@C<~qL[{?LX!s$#$(zMh&ec}2R9$n.Zp)2%c}chbfQ5;#[t@7J\".\\-a\\SnBZGMF/VLHmc/c5yZ-<;7n(Eb4xJE%{CXX\"&msz{fVdT2HJN7Hvf(Eh>{fc2M8,}\"z8/;Ycv(H~./Lq-Q`=`N]9_T$[WmQKnKYu$MLf$6&]V`>k.DaxEfFgeZ:`uwZ^p,42-%ekT\"ef`DG]mjhK>_.6dTM}p`kgeZ%B$$H^Pz$[5$^x()t'@k?F=DX',cHj~ag%yFCm?m>u>xN2-R.WWb{zcH6\\Qe63PA[w<?ssg,@hRXeN6h[*yqYA6`;]K2j=3Z_}Gg)Rpz$r@4+`Q3?uF'n/xP]K(va&tRB22^*]}\\m9H@]<SZ=\">G=y[fWBAJp^4%-J2ju_>^}K^?`9!(CU[W9s(Zgvkx*x)c'*/]7kKU@{&wh<@mQVk^M(e}F?_]sYBR;G/J_k>!LkzW2c-~#q75bbwZ}]K{;@yg`[%\\ksHwJb]ugxP]zUz73Ur7?'S-~4L`c+m/'Tu{b&#SYSDQ!nvWaeV6Z\\[~yD<^j7aV>/RK(&gS(g9x,EG+9%w}W5LE~vNYKQj3)SM%pQ;V;U3NB.Se\\qF9wc>_~=r)aQ'd7<,\\3Xmze^N=38c2{N\"dQQX;}-)C?b[GMWb2d(8:/4j*!<VW9wE~;[umE@Z2]Nz='7CrF3F(9W5rS;WmpL$R4ZAbBtG`3r!4U/HuA3V@t}-mkbnfmk7qmzcr\\F'fe-fWBVEx.F2Q37\\T:&$u,,~7HFx7HeHD<7~\\M@*S*L&2>N+'zBTes.6GW]mW&eQ&v,zE/9\"w2<Z`Ap?s]yCj@3W&~#nUgx3b%#@_V_ZHWxf8W6^g\\V#L+s@Ra8ug-U7D(gK;S*>_GT8($ZVjv?@BzVeyZqH\\7y?bX?ZZ[Aq3Km=Jr.(2SMgBVd$$T[Qq`mHdJVM>4FRcL{a,Yv\"3=&SVrP:_[Bpk?Wq4/ZSGG:/;PD$3;gEu~w?k/}/DQZm9T{p=4&F#.VG+;7~w\\.\\/]$wvUQ-38=Ejq+4He7:X&$ZN]F=GHM<^Ftw/pt/]L`>$&6^z(3p4MhHt&xu,Eem>}~bfn+^mBY<$RS}q:&n\\qZ[#&G^N6m\\j<U]k@63N$ThU65A&G_aN$a9-Tgp]CYH!vV'EG_5eqgH-WRRu!Q~@2nE93D\"N@<S7+32j-@{,mU{x#$#ZF'z6C+HQPPw/#]y'VPnqx=-cm9M^6Xh:\")wj*tS~ge@N>&a#->cGzkjDLH6#!55,7Z6+-UBF49=3N+u^CPG*>EsXk7'X{AELfD:pb`!D5v'=}G;7xSZ'&6~=Tp2v'V(UKM)b[Q+^+;{=#2+J*tA~!AH\"VbD;%8nd_S3,+Z]vzKQss5:\\tJ38B^&6*j@~[W_sLR5<!(aXz\"6%DJ8vr'3$:=\\Unf44PB5[?L%J'D)~P$$njSt.UDV5NM'm=EjNry:t{tg8Mn*6v@S@'?V!&_wxRUP3Fh`]uZg^\\E5H:9r#2(UWbnxfa7.,_@u;V,2(/9:JE_BZb`V59N/kq(K<tJz'~_H[k;c\"E#!j9G[M(=#vyt'K2hAMe?+WsA,cu,QVL9]EV&fW~&XNThRL][8#LpR`K?UDdqHY+\"G\"K(PLf@ew+^&rB9pn%q#9h[\\5hbj7WKVLr2V!&nG~<DKnL8H6McGUn3]q;%*:\"{^f\"C8w^&w8B$B,Q#J\\j{bN+Xqq.VJ>:m=LJ^_:2f,_:U7k!N^dH!D4p'Rj}#E)%rZwb,{%Tc@a!^f$Q=a]T((k^R^Gy.4us&;RhDaBZwd>`?p>-MU:/F;d>u`Z8YL_Rz`\\}`t8GzWfqYecrw3N@=]rXn6;*_<r;/_/yCjPTVFp{*nVmEDryDkf`_vU^~6?m-rGNnk9u)t(`hsw;2=^m,?+r}&Sw[&`qDUDvVv:<u2d2PRF^p?#kLz7\"\\*5Xf=RrTDM;Sj8>M}}5>4QBa=w)}M[%v9\\NEy%C6?m[WhSZVA3gztd^Ps;9%/__@xk\"5Je6?FbSn=V_:C{BRk%vqqE/ruFFqeDPrKYB\\r=Kag75M<y"; fileIn = getFile(FILENAME_IN, "A Dummy Content"); fileOut = getFile(FILENAME_OUT); fileEncrypted = getFile(FILENAME_ENCRYPTED); encryptor.encrypt(key2048, fileIn, fileEncrypted); encryptor.decrypt(key2048, fileEncrypted, fileOut); assertEquals(getFileContent(fileIn), getFileContent(fileOut)); } @Test public void _07_When_Encrypt_And_Decrypt_With_Long_Key_And_Long_Content_Then_Retrieve_Original_Content() { String key2048 = "[n(s4v7nf?~]k'bP$/m]tc.VYXN2;H@C<~qL[{?LX!s$#$(zMh&ec}2R9$n.Zp)2%c}chbfQ5;#[t@7J\".\\-a\\SnBZGMF/VLHmc/c5yZ-<;7n(Eb4xJE%{CXX\"&msz{fVdT2HJN7Hvf(Eh>{fc2M8,}\"z8/;Ycv(H~./Lq-Q`=`N]9_T$[WmQKnKYu$MLf$6&]V`>k.DaxEfFgeZ:`uwZ^p,42-%ekT\"ef`DG]mjhK>_.6dTM}p`kgeZ%B$$H^Pz$[5$^x()t'@k?F=DX',cHj~ag%yFCm?m>u>xN2-R.WWb{zcH6\\Qe63PA[w<?ssg,@hRXeN6h[*yqYA6`;]K2j=3Z_}Gg)Rpz$r@4+`Q3?uF'n/xP]K(va&tRB22^*]}\\m9H@]<SZ=\">G=y[fWBAJp^4%-J2ju_>^}K^?`9!(CU[W9s(Zgvkx*x)c'*/]7kKU@{&wh<@mQVk^M(e}F?_]sYBR;G/J_k>!LkzW2c-~#q75bbwZ}]K{;@yg`[%\\ksHwJb]ugxP]zUz73Ur7?'S-~4L`c+m/'Tu{b&#SYSDQ!nvWaeV6Z\\[~yD<^j7aV>/RK(&gS(g9x,EG+9%w}W5LE~vNYKQj3)SM%pQ;V;U3NB.Se\\qF9wc>_~=r)aQ'd7<,\\3Xmze^N=38c2{N\"dQQX;}-)C?b[GMWb2d(8:/4j*!<VW9wE~;[umE@Z2]Nz='7CrF3F(9W5rS;WmpL$R4ZAbBtG`3r!4U/HuA3V@t}-mkbnfmk7qmzcr\\F'fe-fWBVEx.F2Q37\\T:&$u,,~7HFx7HeHD<7~\\M@*S*L&2>N+'zBTes.6GW]mW&eQ&v,zE/9\"w2<Z`Ap?s]yCj@3W&~#nUgx3b%#@_V_ZHWxf8W6^g\\V#L+s@Ra8ug-U7D(gK;S*>_GT8($ZVjv?@BzVeyZqH\\7y?bX?ZZ[Aq3Km=Jr.(2SMgBVd$$T[Qq`mHdJVM>4FRcL{a,Yv\"3=&SVrP:_[Bpk?Wq4/ZSGG:/;PD$3;gEu~w?k/}/DQZm9T{p=4&F#.VG+;7~w\\.\\/]$wvUQ-38=Ejq+4He7:X&$ZN]F=GHM<^Ftw/pt/]L`>$&6^z(3p4MhHt&xu,Eem>}~bfn+^mBY<$RS}q:&n\\qZ[#&G^N6m\\j<U]k@63N$ThU65A&G_aN$a9-Tgp]CYH!vV'EG_5eqgH-WRRu!Q~@2nE93D\"N@<S7+32j-@{,mU{x#$#ZF'z6C+HQPPw/#]y'VPnqx=-cm9M^6Xh:\")wj*tS~ge@N>&a#->cGzkjDLH6#!55,7Z6+-UBF49=3N+u^CPG*>EsXk7'X{AELfD:pb`!D5v'=}G;7xSZ'&6~=Tp2v'V(UKM)b[Q+^+;{=#2+J*tA~!AH\"VbD;%8nd_S3,+Z]vzKQss5:\\tJ38B^&6*j@~[W_sLR5<!(aXz\"6%DJ8vr'3$:=\\Unf44PB5[?L%J'D)~P$$njSt.UDV5NM'm=EjNry:t{tg8Mn*6v@S@'?V!&_wxRUP3Fh`]uZg^\\E5H:9r#2(UWbnxfa7.,_@u;V,2(/9:JE_BZb`V59N/kq(K<tJz'~_H[k;c\"E#!j9G[M(=#vyt'K2hAMe?+WsA,cu,QVL9]EV&fW~&XNThRL][8#LpR`K?UDdqHY+\"G\"K(PLf@ew+^&rB9pn%q#9h[\\5hbj7WKVLr2V!&nG~<DKnL8H6McGUn3]q;%*:\"{^f\"C8w^&w8B$B,Q#J\\j{bN+Xqq.VJ>:m=LJ^_:2f,_:U7k!N^dH!D4p'Rj}#E)%rZwb,{%Tc@a!^f$Q=a]T((k^R^Gy.4us&;RhDaBZwd>`?p>-MU:/F;d>u`Z8YL_Rz`\\}`t8GzWfqYecrw3N@=]rXn6;*_<r;/_/yCjPTVFp{*nVmEDryDkf`_vU^~6?m-rGNnk9u)t(`hsw;2=^m,?+r}&Sw[&`qDUDvVv:<u2d2PRF^p?#kLz7\"\\*5Xf=RrTDM;Sj8>M}}5>4QBa=w)}M[%v9\\NEy%C6?m[WhSZVA3gztd^Ps;9%/__@xk\"5Je6?FbSn=V_:C{BRk%vqqE/ruFFqeDPrKYB\\r=Kag75M<y"; fileIn = getFile(FILENAME_IN, key2048, 10000); // 20 Mb aprox fileOut = getFile(FILENAME_OUT); fileEncrypted = getFile(FILENAME_ENCRYPTED); encryptor.encrypt(key2048, fileIn, fileEncrypted); encryptor.decrypt(key2048, fileEncrypted, fileOut); assertEquals(getFileContent(fileIn), getFileContent(fileOut)); } private File getFile(String filename) { return getFile(filename, ""); } private File getFile(String filename, String content) { return getFile(filename, content, 1); } private File getFile(String filename, String content, int iterations) { File file = new File(temporaryFolder.getRoot().getAbsolutePath(), filename); FileWriter fileWriter = null; try { fileWriter = new FileWriter(file, false); for (int i = 0; i < iterations; i++) { if (i == 0) fileWriter.write(content); else fileWriter.append(content); } } catch (Exception e) { throw new RuntimeException(e.getMessage()); } finally { try { if (fileWriter != null) { fileWriter.flush(); fileWriter.close(); } } catch (IOException e) { e.printStackTrace(); } } return file; } private String getFileContent(File file) { StringBuilder builder = new StringBuilder(); BufferedReader reader = null; try { reader = new BufferedReader(new FileReader(file.getAbsoluteFile())); String aux; while ((aux = reader.readLine()) != null) { builder.append(aux); } } catch (Exception e) { throw new RuntimeException(e.getMessage()); } finally { try { if (reader != null) { reader.close(); } } catch (IOException e) { e.printStackTrace(); } } return builder.toString(); } }