Browse Source

Issue #77: Add test case to make sure we can decrypt our old files.

Rob Napier 10 years ago
parent
commit
d8b1ee219b
3 changed files with 32 additions and 10 deletions
  1. 14 6
      RNCryptor.xcodeproj/project.pbxproj
  2. 15 2
      RNCryptorTests/RNCryptorTests.m
  3. 3 2
      rncrypt/main.m

+ 14 - 6
RNCryptor.xcodeproj/project.pbxproj

@@ -227,6 +227,19 @@
 			name = "Supporting Files";
 			sourceTree = "<group>";
 		};
+		FB6C961C185A149400CC2098 /* OpenSSL */ = {
+			isa = PBXGroup;
+			children = (
+				FB7565241512D9BE007B806E /* RNOpenSSLCryptor.h */,
+				FB7565241512D9BE007B806C /* RNOpenSSLCryptor.m */,
+				FB7565241512D9BE007B8090 /* RNOpenSSLDecryptor.m */,
+				FB7565241512D9BE007B808E /* RNOpenSSLDecryptor.h */,
+				FB7565241512D9BE007B808C /* RNOpenSSLEncryptor.h */,
+				FB7565241512D9BE007B808A /* RNOpenSSLEncryptor.m */,
+			);
+			name = OpenSSL;
+			sourceTree = "<group>";
+		};
 		FB7564E51512D3C4007B806B = {
 			isa = PBXGroup;
 			children = (
@@ -274,15 +287,10 @@
 				FB7565241512D9BE007B8078 /* RNDecryptor.m */,
 				FB7565241512D9BE007B8076 /* RNEncryptor.h */,
 				FB7565241512D9BE007B8074 /* RNEncryptor.m */,
-				FB7565241512D9BE007B806E /* RNOpenSSLCryptor.h */,
-				FB7565241512D9BE007B806C /* RNOpenSSLCryptor.m */,
-				FB7565241512D9BE007B8090 /* RNOpenSSLDecryptor.m */,
-				FB7565241512D9BE007B808E /* RNOpenSSLDecryptor.h */,
-				FB7565241512D9BE007B808C /* RNOpenSSLEncryptor.h */,
-				FB7565241512D9BE007B808A /* RNOpenSSLEncryptor.m */,
 				FB7565241512D9BE007B807E /* RNCryptorEngine.h */,
 				FB7565241512D9BE007B807C /* RNCryptorEngine.m */,
 				FB7565241512D9BE007B8084 /* RNCryptor+Private.h */,
+				FB6C961C185A149400CC2098 /* OpenSSL */,
 				FB7564F61512D3C4007B806B /* Supporting Files */,
 			);
 			path = RNCryptor;

+ 15 - 2
RNCryptorTests/RNCryptorTests.m

@@ -319,8 +319,8 @@ NSString *const kBadPassword = @"NotThePassword";
 // Issue #77: KeyForPassword() broken for multi-byte passwords (UTF-8)
 - (void)testMultibytePasswordTruncation {
   NSData *data = [RNCryptor randomDataOfLength:1024];
-  NSString *password = @"中文密码";
-  NSString *truncatedPassword = @"中文中文";  // Same first-half, different last-half (but same overall length).
+  NSString *password = @"中文密码"; // 4 characters, 8 bytes => uses first 2 characters
+  NSString *truncatedPassword = @"中文xx";  // 4 characters, 6 bytes => uses first 2 characters
 
   NSError *error;
   NSData *encryptedData = [RNEncryptor encryptData:data withSettings:kRNCryptorAES256Settings password:password error:&error];
@@ -334,6 +334,19 @@ NSString *const kBadPassword = @"NotThePassword";
   XCTAssertEqual([decryptionError code], (NSInteger)kRNCryptorHMACMismatch, @"Should have received kRNCryptorHMACMismatch");
 }
 
+// Issue #77: KeyForPassword() broken for multi-byte passwords (UTF-8)
+- (void)testReadVersion2PasswordTruncation {
+  NSString *plaintext = @"Attack at dawn";
+  NSString *password = @"中文密码";
+  NSData *v2EncryptionWithPasswordTrunction =
+  [[NSData alloc] initWithBase64Encoding:@"AgHOKe1rygDPDDk5DBInKERD85Ezo1EAU5uj+PyEz22o2dtFAjPyaJhY3jW0BXD4W9L4GnAhiscr8PKZ+zOzWDbTFB3/6alv2LWQ1TCG4cpT0g=="];
+
+  NSError *decryptionError = nil;
+  NSData *decryptedData = [RNDecryptor decryptData:v2EncryptionWithPasswordTrunction withPassword:password error:&decryptionError];
+  XCTAssertNil(decryptionError, @"Error decrypting:%@", decryptionError);
+  XCTAssertEqualObjects(decryptedData, [plaintext dataUsingEncoding:NSUTF8StringEncoding], @"Incorrect decryption.");
+}
+
 //
 //- (void)_testDataOfLength:(NSUInteger)length encryptPassword:(NSString *)encryptPassword decryptPassword:(NSString *)decryptPassword
 //{

+ 3 - 2
rncrypt/main.m

@@ -42,7 +42,7 @@ void OutputData(NSData *data)
     printf("%s\n", [string UTF8String]);
   }
   else {
-    printf("%s\n", [[data description] UTF8String]);
+    printf("%s\n", [[data base64EncodedStringWithOptions:0] UTF8String]);
   }
 }
 
@@ -86,7 +86,8 @@ int main(int argc, char * const argv[])
     NSError *error;
     NSData *data;
     if (decrypt_flag) {
-      data = [RNDecryptor decryptData:GetDataForHex(message)
+      data = [RNDecryptor decryptData:[[NSData alloc] initWithBase64EncodedString:message
+                                                                          options:NSDataBase64DecodingIgnoreUnknownCharacters]
                          withPassword:password
                                 error:&error];
     }