@@ -581,6 +581,30 @@ describe("CipherTransformFactory", function () {
581
581
}
582
582
}
583
583
584
+ function ensureAESEncryptedStringHasCorrectLength (
585
+ dict ,
586
+ fileId ,
587
+ password ,
588
+ string
589
+ ) {
590
+ const factory = new CipherTransformFactory ( dict , fileId , password ) ;
591
+ const cipher = factory . createCipherTransform ( 123 , 0 ) ;
592
+ const encrypted = cipher . encryptString ( string ) ;
593
+
594
+ // The final length is a multiple of 16.
595
+ // If the initial string has a length which is a multiple of 16
596
+ // then 16 chars of padding are added.
597
+ // So we've the mapping:
598
+ // - length: [0-15] => new length: 16
599
+ // - length: [16-31] => new length: 32
600
+ // - length: [32-47] => new length: 48
601
+ // ...
602
+ expect ( encrypted . length ) . toEqual (
603
+ 16 /* initialization vector length */ +
604
+ 16 * Math . ceil ( ( string . length + 1 ) / 16 )
605
+ ) ;
606
+ }
607
+
584
608
function ensureEncryptDecryptIsIdentity ( dict , fileId , password , string ) {
585
609
const factory = new CipherTransformFactory ( dict , fileId , password ) ;
586
610
const cipher = factory . createCipherTransform ( 123 , 0 ) ;
@@ -807,6 +831,8 @@ describe("CipherTransformFactory", function () {
807
831
} ) ,
808
832
} ) ;
809
833
const dict = buildDict ( dict3 ) ;
834
+ // 0 char
835
+ ensureEncryptDecryptIsIdentity ( dict , fileId1 , "user" , "" ) ;
810
836
// 1 char
811
837
ensureEncryptDecryptIsIdentity ( dict , fileId1 , "user" , "a" ) ;
812
838
// 2 chars
@@ -828,6 +854,8 @@ describe("CipherTransformFactory", function () {
828
854
} ) ,
829
855
} ) ;
830
856
const dict = buildDict ( dict3 ) ;
857
+ // 0 chars
858
+ ensureEncryptDecryptIsIdentity ( dict , fileId1 , "user" , "" ) ;
831
859
// 4 chars
832
860
ensureEncryptDecryptIsIdentity ( dict , fileId1 , "user" , "aaaa" ) ;
833
861
// 5 chars
@@ -842,5 +870,61 @@ describe("CipherTransformFactory", function () {
842
870
"aaaaaaaaaaaaaaaaaaaaaa"
843
871
) ;
844
872
} ) ;
873
+ it ( "should encrypt and have the correct length using AES128" , function ( ) {
874
+ dict3 . CF = buildDict ( {
875
+ Identity : buildDict ( {
876
+ CFM : Name . get ( "AESV2" ) ,
877
+ } ) ,
878
+ } ) ;
879
+ const dict = buildDict ( dict3 ) ;
880
+ // 0 char
881
+ ensureAESEncryptedStringHasCorrectLength ( dict , fileId1 , "user" , "" ) ;
882
+ // 1 char
883
+ ensureAESEncryptedStringHasCorrectLength ( dict , fileId1 , "user" , "a" ) ;
884
+ // 2 chars
885
+ ensureAESEncryptedStringHasCorrectLength ( dict , fileId1 , "user" , "aa" ) ;
886
+ // 16 chars
887
+ ensureAESEncryptedStringHasCorrectLength (
888
+ dict ,
889
+ fileId1 ,
890
+ "user" ,
891
+ "aaaaaaaaaaaaaaaa"
892
+ ) ;
893
+ // 19 chars
894
+ ensureAESEncryptedStringHasCorrectLength (
895
+ dict ,
896
+ fileId1 ,
897
+ "user" ,
898
+ "aaaaaaaaaaaaaaaaaaa"
899
+ ) ;
900
+ } ) ;
901
+ it ( "should encrypt and have the correct length using AES256" , function ( ) {
902
+ dict3 . CF = buildDict ( {
903
+ Identity : buildDict ( {
904
+ CFM : Name . get ( "AESV3" ) ,
905
+ } ) ,
906
+ } ) ;
907
+ const dict = buildDict ( dict3 ) ;
908
+ // 0 char
909
+ ensureAESEncryptedStringHasCorrectLength ( dict , fileId1 , "user" , "" ) ;
910
+ // 4 chars
911
+ ensureAESEncryptedStringHasCorrectLength ( dict , fileId1 , "user" , "aaaa" ) ;
912
+ // 5 chars
913
+ ensureAESEncryptedStringHasCorrectLength ( dict , fileId1 , "user" , "aaaaa" ) ;
914
+ // 16 chars
915
+ ensureAESEncryptedStringHasCorrectLength (
916
+ dict ,
917
+ fileId1 ,
918
+ "user" ,
919
+ "aaaaaaaaaaaaaaaa"
920
+ ) ;
921
+ // 22 chars
922
+ ensureAESEncryptedStringHasCorrectLength (
923
+ dict ,
924
+ fileId1 ,
925
+ "user" ,
926
+ "aaaaaaaaaaaaaaaaaaaaaa"
927
+ ) ;
928
+ } ) ;
845
929
} ) ;
846
930
} ) ;
0 commit comments