That fuck shit the fascists are using
1package org.tm.archive.testing
2
3import okio.ByteString.Companion.toByteString
4import org.signal.core.util.Base64
5import org.signal.libsignal.internal.Native
6import org.signal.libsignal.internal.NativeHandleGuard
7import org.signal.libsignal.metadata.certificate.CertificateValidator
8import org.signal.libsignal.metadata.certificate.SenderCertificate
9import org.signal.libsignal.metadata.certificate.ServerCertificate
10import org.signal.libsignal.protocol.ecc.Curve
11import org.signal.libsignal.protocol.ecc.ECKeyPair
12import org.signal.libsignal.protocol.ecc.ECPublicKey
13import org.signal.libsignal.zkgroup.profiles.ProfileKey
14import org.tm.archive.messages.SignalServiceProtoUtil.buildWith
15import org.whispersystems.signalservice.api.crypto.ContentHint
16import org.whispersystems.signalservice.api.crypto.EnvelopeContent
17import org.whispersystems.signalservice.api.crypto.UnidentifiedAccess
18import org.whispersystems.signalservice.api.crypto.UnidentifiedAccessPair
19import org.whispersystems.signalservice.api.push.ServiceId
20import org.whispersystems.signalservice.internal.push.Content
21import org.whispersystems.signalservice.internal.push.DataMessage
22import org.whispersystems.signalservice.internal.push.Envelope
23import org.whispersystems.signalservice.internal.push.OutgoingPushMessage
24import java.util.Optional
25import java.util.UUID
26
27object FakeClientHelpers {
28
29 val noOpCertificateValidator = object : CertificateValidator(null) {
30 override fun validate(certificate: SenderCertificate, validationTime: Long) = Unit
31 }
32
33 fun createCertificateFor(trustRoot: ECKeyPair, uuid: UUID, e164: String, deviceId: Int, identityKey: ECPublicKey, expires: Long): SenderCertificate {
34 val serverKey: ECKeyPair = Curve.generateKeyPair()
35 NativeHandleGuard(serverKey.publicKey).use { serverPublicGuard ->
36 NativeHandleGuard(trustRoot.privateKey).use { trustRootPrivateGuard ->
37 val serverCertificate = ServerCertificate(Native.ServerCertificate_New(1, serverPublicGuard.nativeHandle(), trustRootPrivateGuard.nativeHandle()))
38 NativeHandleGuard(identityKey).use { identityGuard ->
39 NativeHandleGuard(serverCertificate).use { serverCertificateGuard ->
40 NativeHandleGuard(serverKey.privateKey).use { serverPrivateGuard ->
41 return SenderCertificate(Native.SenderCertificate_New(uuid.toString(), e164, deviceId, identityGuard.nativeHandle(), expires, serverCertificateGuard.nativeHandle(), serverPrivateGuard.nativeHandle()))
42 }
43 }
44 }
45 }
46 }
47 }
48
49 fun getTargetUnidentifiedAccess(myProfileKey: ProfileKey, theirProfileKey: ProfileKey, senderCertificate: SenderCertificate): Optional<UnidentifiedAccess> {
50 val selfUnidentifiedAccessKey = UnidentifiedAccess.deriveAccessKeyFrom(myProfileKey)
51 val themUnidentifiedAccessKey = UnidentifiedAccess.deriveAccessKeyFrom(theirProfileKey)
52
53 return UnidentifiedAccessPair(UnidentifiedAccess(selfUnidentifiedAccessKey, senderCertificate.serialized, false), UnidentifiedAccess(themUnidentifiedAccessKey, senderCertificate.serialized, false)).targetUnidentifiedAccess
54 }
55
56 fun encryptedTextMessage(now: Long, message: String = "Test body message"): EnvelopeContent {
57 val content = Content.Builder().apply {
58 dataMessage(
59 DataMessage.Builder().buildWith {
60 body = message
61 timestamp = now
62 }
63 )
64 }
65 return EnvelopeContent.encrypted(content.build(), ContentHint.RESENDABLE, Optional.empty())
66 }
67
68 fun OutgoingPushMessage.toEnvelope(timestamp: Long, destination: ServiceId): Envelope {
69 return Envelope.Builder()
70 .type(Envelope.Type.fromValue(this.type))
71 .sourceDevice(1)
72 .timestamp(timestamp)
73 .serverTimestamp(timestamp + 1)
74 .destinationServiceId(destination.toString())
75 .serverGuid(UUID.randomUUID().toString())
76 .content(Base64.decode(this.content).toByteString())
77 .urgent(true)
78 .story(false)
79 .build()
80 }
81}