diff --git a/xcode/OLMKit/OLMUtility.h b/xcode/OLMKit/OLMUtility.h
index a8a37436f1066aeb3efbf2992e42ff058e23baf9..1952b8e863231b20f822dc952a01a8571098e188 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 041da2fc147012ceecf62d10f486edc7fc71f7af..292fc212249532aee6d6a179f5110b70e1106102 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)]};