From a9be04fa4b53e7012406a9a89596e94b65947c20 Mon Sep 17 00:00:00 2001
From: manuroe <manu@matrix.org>
Date: Mon, 17 Oct 2016 15:47:52 +0200
Subject: [PATCH] OLMKit: Add [OLMUtility sha256:]

---
 xcode/OLMKit/OLMUtility.h |  8 ++++++++
 xcode/OLMKit/OLMUtility.m | 21 ++++++++++++++++++++-
 2 files changed, 28 insertions(+), 1 deletion(-)

diff --git a/xcode/OLMKit/OLMUtility.h b/xcode/OLMKit/OLMUtility.h
index a8a3743..1952b8e 100644
--- a/xcode/OLMKit/OLMUtility.h
+++ b/xcode/OLMKit/OLMUtility.h
@@ -10,6 +10,14 @@
 
 @interface OLMUtility : NSObject
 
+/**
+ Calculate the SHA-256 hash of the input and encodes it as base64.
+ 
+ @param message the message to hash.
+ @return the base64-encoded hash value.
+ */
+- (NSString*)sha256:(NSData*)message;
+
 /**
  Verify an ed25519 signature.
 
diff --git a/xcode/OLMKit/OLMUtility.m b/xcode/OLMKit/OLMUtility.m
index 041da2f..292fc21 100644
--- a/xcode/OLMKit/OLMUtility.m
+++ b/xcode/OLMKit/OLMUtility.m
@@ -50,6 +50,25 @@
     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);
+        NSAssert(NO, @"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];
@@ -61,7 +80,7 @@
                                        signatureData.bytes, signatureData.length
                                        );
 
-    if (result < 0 || result == (size_t)-1) {
+    if (result == olm_error()) {
         if (error) {
             NSDictionary *userInfo = @{NSLocalizedFailureReasonErrorKey: [NSString stringWithUTF8String:olm_utility_last_error(_utility)]};
 
-- 
GitLab