Skip to content

Commit

Permalink
Makes NSError** argument __autoreleasing; adds check against null def…
Browse files Browse the repository at this point in the history
…erence - NSError** by convension might be null if caller is not interested in error handling (#257)
  • Loading branch information
valeriyvan authored and vixentael committed Dec 8, 2017
1 parent 132b39b commit ce470f6
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 14 deletions.
8 changes: 4 additions & 4 deletions src/wrappers/themis/Obj-C/objcthemis/scell_seal.h
Original file line number Diff line number Diff line change
Expand Up @@ -59,15 +59,15 @@ NS_ASSUME_NONNULL_BEGIN
* @param [in] error pointer to Error on failure
* @return Wrapped message as NSData object on success or nil on failure
*/
- (nullable NSData *)wrapData:(NSData *)message error:(NSError **)error;
- (nullable NSData *)wrapData:(NSData *)message error:(NSError * __autoreleasing *)error;

/**
* @brief Unwrap message
* @param [in] message message to unwrap
* @param [in] error pointer to Error on failure
* @return Unwrapped message as NSData object on success or nil on failure
*/
- (nullable NSData *)unwrapData:(NSData *)message error:(NSError **)error;
- (nullable NSData *)unwrapData:(NSData *)message error:(NSError * __autoreleasing *)error;

/**
* @brief Wrap message with context
Expand All @@ -76,15 +76,15 @@ NS_ASSUME_NONNULL_BEGIN
* @param [in] error pointer to Error on failure
* @return Wrapped message as NSData object on success or nil on failure
*/
- (nullable NSData *)wrapData:(NSData *)message context:(nullable NSData *)context error:(NSError **)error;
- (nullable NSData *)wrapData:(NSData *)message context:(nullable NSData *)context error:(NSError * __autoreleasing *)error;

/**
* @brief Unwrap message
* @param [in] message message to unwrap
* @param [in] error pointer to Error on failure
* @return Unwrapped message as NSData object on success or nil on failure
*/
- (nullable NSData *)unwrapData:(NSData *)message context:(nullable NSData *)context error:(NSError **)error;
- (nullable NSData *)unwrapData:(NSData *)message context:(nullable NSData *)context error:(NSError * __autoreleasing *)error;

@end

Expand Down
32 changes: 22 additions & 10 deletions src/wrappers/themis/Obj-C/objcthemis/scell_seal.m
Original file line number Diff line number Diff line change
Expand Up @@ -26,17 +26,17 @@ - (nullable instancetype)initWithKey:(NSData *)key {
}


- (nullable NSData *)wrapData:(NSData *)message error:(NSError **)error {
- (nullable NSData *)wrapData:(NSData *)message error:(NSError * __autoreleasing *)error {
return [self wrapData:message context:nil error:error];
}


- (nullable NSData *)unwrapData:(NSData *)message error:(NSError **)error {
- (nullable NSData *)unwrapData:(NSData *)message error:(NSError * __autoreleasing *)error {
return [self unwrapData:message context:nil error:error];
}


- (nullable NSData *)wrapData:(NSData *)message context:(nullable NSData *)context error:(NSError **)error {
- (nullable NSData *)wrapData:(NSData *)message context:(nullable NSData *)context error:(NSError * __autoreleasing *)error {
size_t wrappedMessageLength = 0;

const void * contextData = [context bytes];
Expand All @@ -46,28 +46,34 @@ - (nullable NSData *)wrapData:(NSData *)message context:(nullable NSData *)conte
contextData, contextLength, [message bytes], [message length], NULL, &wrappedMessageLength);

if (result != TSErrorTypeBufferTooSmall) {
*error = SCERROR(result, @"Secure Cell (Seal) encrypted message length determination failed");
if (error) {
*error = SCERROR(result, @"Secure Cell (Seal) encrypted message length determination failed");
}
return nil;
}

unsigned char * wrappedMessage = malloc(wrappedMessageLength);
if (!wrappedMessage) {
*error = SCERROR(result, @"Secure Cell (Seal) encryption failed, not enough memory");
if (error) {
*error = SCERROR(result, @"Secure Cell (Seal) encryption failed, not enough memory");
}
return nil;
}
result = (TSErrorType) themis_secure_cell_encrypt_seal([self.key bytes], [self.key length],
contextData, contextLength, [message bytes], [message length], wrappedMessage, &wrappedMessageLength);

if (result != TSErrorTypeSuccess) {
*error = SCERROR(result, @"Secure Cell (Seal) encryption failed");
if (error) {
*error = SCERROR(result, @"Secure Cell (Seal) encryption failed");
}
free(wrappedMessage);
return nil;
}

return [NSData dataWithBytesNoCopy:wrappedMessage length:wrappedMessageLength];
}

- (nullable NSData *)unwrapData:(NSData *)message context:(nullable NSData *)context error:(NSError **)error {
- (nullable NSData *)unwrapData:(NSData *)message context:(nullable NSData *)context error:(NSError * __autoreleasing *)error {
size_t unwrappedMessageLength = 0;

const void * contextData = [context bytes];
Expand All @@ -77,21 +83,27 @@ - (nullable NSData *)unwrapData:(NSData *)message context:(nullable NSData *)con
contextData, contextLength, [message bytes], [message length], NULL, &unwrappedMessageLength);

if (result != TSErrorTypeBufferTooSmall) {
*error = SCERROR(result, @"Secure Cell (Seal) decrypted message length determination failed");
if (error) {
*error = SCERROR(result, @"Secure Cell (Seal) decrypted message length determination failed");
}
return nil;
}

unsigned char * unwrappedMessage = malloc(unwrappedMessageLength);
if (!unwrappedMessage) {
*error = SCERROR(result, @"Secure Cell (Seal) decryption failed, not enough memory");
if (error) {
*error = SCERROR(result, @"Secure Cell (Seal) decryption failed, not enough memory");
}
return nil;
}

result = (TSErrorType) themis_secure_cell_decrypt_seal([self.key bytes], [self.key length],
contextData, contextLength, [message bytes], [message length], unwrappedMessage, &unwrappedMessageLength);

if (result != TSErrorTypeSuccess) {
*error = SCERROR(result, @"Secure Cell (Seal) decryption failed");
if (error) {
*error = SCERROR(result, @"Secure Cell (Seal) decryption failed");
}
free(unwrappedMessage);
return nil;
}
Expand Down

0 comments on commit ce470f6

Please sign in to comment.