aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--xcode/OLMKit/OLMUtility.h14
-rw-r--r--xcode/OLMKit/OLMUtility.m66
2 files changed, 80 insertions, 0 deletions
diff --git a/xcode/OLMKit/OLMUtility.h b/xcode/OLMKit/OLMUtility.h
index 8acbf40..eca9d3a 100644
--- a/xcode/OLMKit/OLMUtility.h
+++ b/xcode/OLMKit/OLMUtility.h
@@ -10,6 +10,20 @@
@interface OLMUtility : NSObject
+/**
+ Verify an ed25519 signature.
+
+ @param key the ed25519 key.
+ @param message the message which was signed.
+ @param signature the base64-encoded signature to be checked.
+ @param the result error if there is a problem with the verification.
+ If the key was too small then the message will be "OLM.INVALID_BASE64".
+ If the signature was invalid then the message will be "OLM.BAD_MESSAGE_MAC".
+
+ @return YES if valid.
+ */
+- (BOOL)ed25519Verify:(NSString*)key message:(NSString*)message signature:(NSString*)signature error:(NSError**)error;
+
+ (NSMutableData*) randomBytesOfLength:(NSUInteger)length;
@end
diff --git a/xcode/OLMKit/OLMUtility.m b/xcode/OLMKit/OLMUtility.m
index 5dbe644..1553a81 100644
--- a/xcode/OLMKit/OLMUtility.m
+++ b/xcode/OLMKit/OLMUtility.m
@@ -8,8 +8,74 @@
#import "OLMUtility.h"
+#include "olm/olm.h"
+
+@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;
+}
+
+- (BOOL)ed25519Verify:(NSString *)key message:(NSString *)message signature:(NSString *)signature error:(NSError *__autoreleasing *)error {
+
+ NSData *keyData = [key dataUsingEncoding:NSUTF8StringEncoding];
+ NSData *messageData = [message dataUsingEncoding:NSUTF8StringEncoding];
+ NSData *signatureData = [signature dataUsingEncoding:NSUTF8StringEncoding];
+
+ size_t result = olm_ed25519_verify(_utility,
+ keyData.bytes, keyData.length,
+ messageData.bytes, messageData.length,
+ signatureData.bytes, signatureData.length
+ );
+
+ if (result < 0) {
+ 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) {