+ \r
+ printf("event: %s\n", eventBuffer);\r
+\r
+ // verify\r
+ char theirDeviceKey[DEVICE_KEY_SIZE];\r
+ MatrixClientRequestDeviceKey(&client,\r
+ DEVICE_ID,\r
+ theirDeviceKey, DEVICE_KEY_SIZE);\r
+ \r
+ char transactionId[256];\r
+ GetLine(transactionId, 128);\r
+\r
+ char verificationReadyBuffer[2048];\r
+ snprintf(verificationReadyBuffer, 2048,\r
+ "{"\r
+ "\"from_device\":\"%s\","\r
+ "\"methods\":[\"m.sas.v1\"],"\r
+ "\"transaction_id\":\"%s\""\r
+ "}",\r
+ client.deviceId,\r
+ transactionId);\r
+ \r
+ MatrixClientSendToDevice(&client,\r
+ USER_ID,\r
+ DEVICE_ID,\r
+ verificationReadyBuffer,\r
+ "m.key.verification.ready");\r
+ \r
+ OlmSAS * olmSas = olm_sas(malloc(olm_sas_size()));\r
+ void * sasRandomBytes = malloc(olm_create_sas_random_length(olmSas));\r
+ olm_create_sas(olmSas,\r
+ sasRandomBytes,\r
+ olm_create_sas_random_length(olmSas));\r
+ \r
+ OlmUtility * olmUtil = olm_utility(malloc(olm_utility_size()));\r
+ \r
+ char publicKey[128];\r
+ char keyStartJson[1024];\r
+ char concat[1024];\r
+ char commitment[256];\r
+ olm_sas_get_pubkey(olmSas,\r
+ publicKey,\r
+ 128);\r
+ GetLine(keyStartJson, 1024);\r
+ printf("keyStartJson: %s\n", keyStartJson);\r
+ int concatLen =\r
+ snprintf(concat, 1024, "%s%s", publicKey, keyStartJson);\r
+ printf("concat: %s\n", concat);\r
+ olm_sha256(olmUtil, concat, strlen(concat), commitment, 256);\r
+ printf("hash: %s\n", commitment);\r
+ \r
+ char verificationAcceptBuffer[2048];\r
+ snprintf(verificationAcceptBuffer, 2048,\r
+ "{"\r
+ "\"commitment\":\"%s\","\r
+ "\"hash\":\"sha256\","\r
+ "\"key_agreement_protocol\":\"curve25519\","\r
+ "\"message_authentication_code\":\"hkdf-hmac-sha256.v2\","\r
+ "\"method\":\"m.sas.v1\","\r
+ "\"short_authentication_string\":[\"decimal\"],"\r
+ "\"transaction_id\":\"%s\""\r
+ "}",\r
+ commitment,\r
+ transactionId);\r
+ \r
+ MatrixClientSendToDevice(&client,\r
+ USER_ID,\r
+ DEVICE_ID,\r
+ verificationAcceptBuffer,\r
+ "m.key.verification.accept");\r
+ \r
+ char theirPublicKey[128];\r
+ GetLine(theirPublicKey, 128);\r
+ olm_sas_set_their_key(olmSas, theirPublicKey, strlen(theirPublicKey));\r
+ \r
+ char verificationKeyBuffer[2048];\r
+ snprintf(verificationKeyBuffer, 2048,\r
+ "{"\r
+ "\"key\":\"%s\","\r
+ "\"transaction_id\":\"%s\""\r
+ "}",\r
+ publicKey,\r
+ transactionId);\r
+ \r
+ MatrixClientSendToDevice(&client,\r
+ USER_ID,\r
+ DEVICE_ID,\r
+ verificationKeyBuffer,\r
+ "m.key.verification.key");\r
+\r
+ char hkdfInfo[1024];\r
+ int hkdfInfoLen =\r
+ snprintf(hkdfInfo, 1024,\r
+ "MATRIX_KEY_VERIFICATION_SAS%s%s%s%s%s",\r
+ USER_ID,\r
+ DEVICE_ID,\r
+ USER_ID,\r
+ client.deviceId,\r
+ transactionId);\r
+\r
+ unsigned char sasBytes[5];\r
+ olm_sas_generate_bytes(olmSas,\r
+ hkdfInfo, hkdfInfoLen,\r
+ sasBytes, 5);\r
+ int b0 = sasBytes[0];\r
+ int b1 = sasBytes[1];\r
+ int b2 = sasBytes[2];\r
+ int b3 = sasBytes[3];\r
+ int b4 = sasBytes[4];\r
+ \r
+ printf("%d %d %d %d %d\n", b0, b1, b2, b3, b4);\r