-
-
Notifications
You must be signed in to change notification settings - Fork 6k
/
KeysApi.kt
57 lines (51 loc) · 1.82 KB
/
KeysApi.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
/*
* Copyright 2024 Signal Messenger, LLC
* SPDX-License-Identifier: AGPL-3.0-only
*/
package org.whispersystems.signalservice.api.keys
import org.signal.core.util.toByteArray
import org.signal.libsignal.protocol.IdentityKey
import org.signal.libsignal.protocol.ecc.ECPublicKey
import org.signal.libsignal.protocol.kem.KEMPublicKey
import org.whispersystems.signalservice.api.NetworkResult
import org.whispersystems.signalservice.api.push.ServiceIdType
import org.whispersystems.signalservice.internal.push.PushServiceSocket
import java.security.MessageDigest
/**
* Contains APIs for interacting with /keys endpoints on the service.
*/
class KeysApi(private val pushServiceSocket: PushServiceSocket) {
companion object {
@JvmStatic
fun create(pushServiceSocket: PushServiceSocket): KeysApi {
return KeysApi(pushServiceSocket)
}
}
/**
* Checks to see if our local view of our repeated-use prekeys matches the server's view. It's an all-or-nothing match, and no details can be given beyond
* whether or not everything perfectly matches or not.
*
* Status codes:
* - 200: Everything matches
* - 409: Something doesn't match
*/
fun checkRepeatedUseKeys(
serviceIdType: ServiceIdType,
identityKey: IdentityKey,
signedPreKeyId: Int,
signedPreKey: ECPublicKey,
lastResortKyberKeyId: Int,
lastResortKyberKey: KEMPublicKey
): NetworkResult<Unit> {
val digest: MessageDigest = MessageDigest.getInstance("SHA-256").apply {
update(identityKey.serialize())
update(signedPreKeyId.toLong().toByteArray())
update(signedPreKey.serialize())
update(lastResortKyberKeyId.toLong().toByteArray())
update(lastResortKyberKey.serialize())
}
return NetworkResult.fromFetch {
pushServiceSocket.checkRepeatedUsePreKeys(serviceIdType, digest.digest())
}
}
}