From 45ecaaedd1eab582965f2cca8d2a04e6c906491b Mon Sep 17 00:00:00 2001
From: manuroe <manu@matrix.org>
Date: Wed, 28 Sep 2016 16:07:39 +0200
Subject: [PATCH] OLMKit: Add [OLMUtility ed25519Verify]

---
 xcode/OLMKit/OLMUtility.h | 14 +++++++++
 xcode/OLMKit/OLMUtility.m | 66 +++++++++++++++++++++++++++++++++++++++
 2 files changed, 80 insertions(+)

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) {
-- 
GitLab