diff options
author | Richard van der Hoff <github@rvanderhoff.org.uk> | 2016-12-22 14:43:01 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2016-12-22 14:43:01 +0000 |
commit | 90b36130532d2d8040b39e310d8d0d5ee22aea0a (patch) | |
tree | 26eabdea9bc04077b1621deb34b5d0cbe669dedd /xcode/OLMKit/OLMUtility.m | |
parent | fb91b1f18269c5b681c972dc4448858db0966c3a (diff) | |
parent | 46ad79517ec8e005bd2d1de767d3cd59ec038fe2 (diff) |
Merge pull request #36 from matrix-org/manuroe/olmkit
OLMKit
Diffstat (limited to 'xcode/OLMKit/OLMUtility.m')
-rw-r--r-- | xcode/OLMKit/OLMUtility.m | 121 |
1 files changed, 121 insertions, 0 deletions
diff --git a/xcode/OLMKit/OLMUtility.m b/xcode/OLMKit/OLMUtility.m new file mode 100644 index 0000000..936785a --- /dev/null +++ b/xcode/OLMKit/OLMUtility.m @@ -0,0 +1,121 @@ +/* + Copyright 2016 Chris Ballinger + Copyright 2016 OpenMarket Ltd + Copyright 2016 Vector Creations Ltd + + 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. + */ + +#import "OLMUtility.h" + +#include "olm/olm.h" + +NSString *const OLMErrorDomain = @"org.matrix.olm"; + +@interface OLMUtility() + +@property (nonatomic) OlmUtility *utility; + +@end + +@implementation OLMUtility + +- (void) dealloc { + olm_clear_utility(_utility); + free(_utility); +} + +- (BOOL) initializeUtilityMemory { + size_t utilitySize = olm_utility_size(); + _utility = malloc(utilitySize); + NSParameterAssert(_utility != nil); + if (!_utility) { + return NO; + } + _utility = olm_utility(_utility); + NSParameterAssert(_utility != nil); + if (!_utility) { + return NO; + } + return YES; +} + +- (instancetype) init { + self = [super init]; + if (!self) { + return nil; + } + BOOL success = [self initializeUtilityMemory]; + if (!success) { + return nil; + } + return self; +} + +- (NSString *)sha256:(NSData *)message { + size_t length = olm_sha256_length(_utility); + + NSMutableData *shaData = [NSMutableData dataWithLength:length]; + if (!shaData) { + return nil; + } + + size_t result = olm_sha256(_utility, message.bytes, message.length, shaData.mutableBytes, shaData.length); + if (result == olm_error()) { + const char *error = olm_utility_last_error(_utility); + NSLog(@"olm_sha256 error: %s", error); + return nil; + } + + NSString *sha = [[NSString alloc] initWithData:shaData encoding:NSUTF8StringEncoding]; + return sha; +} + +- (BOOL)verifyEd25519Signature:(NSString*)signature key:(NSString*)key message:(NSData*)message error:(NSError**)error { + + NSData *keyData = [key dataUsingEncoding:NSUTF8StringEncoding]; + NSData *signatureData = [signature dataUsingEncoding:NSUTF8StringEncoding]; + + size_t result = olm_ed25519_verify(_utility, + keyData.bytes, keyData.length, + message.bytes, message.length, + (void*)signatureData.bytes, signatureData.length + ); + + if (result == olm_error()) { + if (error) { + NSDictionary *userInfo = @{NSLocalizedFailureReasonErrorKey: [NSString stringWithUTF8String:olm_utility_last_error(_utility)]}; + + // @TODO + *error = [[NSError alloc] initWithDomain:@"OLMKitErrorDomain" code:0 userInfo:userInfo]; + } + return NO; + } + else { + return YES; + } +} + ++ (NSMutableData*) randomBytesOfLength:(NSUInteger)length { + NSMutableData *randomData = [NSMutableData dataWithLength:length]; + if (!randomData) { + return nil; + } + int result = SecRandomCopyBytes(kSecRandomDefault, randomData.length, randomData.mutableBytes); + if (result != 0) { + return nil; + } + return randomData; +} + +@end |