mirror of
https://github.com/Sneed-Group/pypush-plus-plus
synced 2024-12-24 20:02:31 -06:00
trying to get this working
This commit is contained in:
parent
eee69e17bd
commit
54815bac70
5 changed files with 34 additions and 16 deletions
2
demo.py
2
demo.py
|
@ -42,7 +42,7 @@ except FileNotFoundError:
|
||||||
CONFIG = {}
|
CONFIG = {}
|
||||||
|
|
||||||
# Re-register if the commit hash has changed
|
# Re-register if the commit hash has changed
|
||||||
if CONFIG.get("commit_hash") != commit_hash:
|
if CONFIG.get("commit_hash") != commit_hash or True:
|
||||||
logging.warning("pypush commit is different, forcing re-registration...")
|
logging.warning("pypush commit is different, forcing re-registration...")
|
||||||
CONFIG["commit_hash"] = commit_hash
|
CONFIG["commit_hash"] = commit_hash
|
||||||
if "id" in CONFIG:
|
if "id" in CONFIG:
|
||||||
|
|
|
@ -59,6 +59,7 @@ class IDSUser:
|
||||||
self.user_id = user_id
|
self.user_id = user_id
|
||||||
self.handles = handles
|
self.handles = handles
|
||||||
self.current_handle = self.handles[0]
|
self.current_handle = self.handles[0]
|
||||||
|
self.ngm = encryption.NGMIdentity(self.extra.get("device_key"), self.extra.get("prekey"))
|
||||||
|
|
||||||
# This is a separate call so that the user can make sure the first part succeeds before asking for validation data
|
# This is a separate call so that the user can make sure the first part succeeds before asking for validation data
|
||||||
def register(self, validation_data: str):
|
def register(self, validation_data: str):
|
||||||
|
@ -67,7 +68,6 @@ class IDSUser:
|
||||||
if they are not already set
|
if they are not already set
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
|
||||||
self.ngm = encryption.NGMIdentity(self.extra.get("device_key"), self.extra.get("prekey"))
|
self.ngm = encryption.NGMIdentity(self.extra.get("device_key"), self.extra.get("prekey"))
|
||||||
self.extra["device_key"] = self.ngm.device_key
|
self.extra["device_key"] = self.ngm.device_key
|
||||||
self.extra["prekey"] = self.ngm.pre_key
|
self.extra["prekey"] = self.ngm.pre_key
|
||||||
|
@ -90,8 +90,7 @@ class IDSUser:
|
||||||
self._id_keypair = id_keypair
|
self._id_keypair = id_keypair
|
||||||
|
|
||||||
def auth_and_set_encryption_from_config(self, config: dict[str, dict[str, Any]]):
|
def auth_and_set_encryption_from_config(self, config: dict[str, dict[str, Any]]):
|
||||||
if "extra" in config:
|
self.extra = config.get("extra", {})
|
||||||
self.extra = config["extra"]
|
|
||||||
|
|
||||||
auth = config.get("auth", {})
|
auth = config.get("auth", {})
|
||||||
if (
|
if (
|
||||||
|
|
|
@ -16,17 +16,12 @@ class NGMIdentity:
|
||||||
self.device_key = device_key
|
self.device_key = device_key
|
||||||
self.pre_key = pre_key
|
self.pre_key = pre_key
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def serialize_timestamp(timestamp: float):
|
|
||||||
import struct
|
|
||||||
return struct.pack("<d", timestamp)
|
|
||||||
import time
|
|
||||||
time.time()
|
|
||||||
|
|
||||||
|
|
||||||
def sign_prekey(self):
|
def sign_prekey(self):
|
||||||
timestamp = time.time()
|
timestamp = time.time()
|
||||||
to_sign = b"NGMPrekeySignature" + _helpers.compact_key(_helpers.parse_key(self.pre_key)) + struct.pack("<d", timestamp)
|
to_sign = b"NGMPrekeySignature" + _helpers.compact_key(_helpers.parse_key(self.pre_key)) + struct.pack("<d", timestamp)
|
||||||
|
# Extend to the next multiple of 8
|
||||||
|
to_sign += b"\x00" * (8 - (len(to_sign) % 8))
|
||||||
|
print(to_sign)
|
||||||
signed = _helpers.parse_key(self.device_key).sign(to_sign, ec.ECDSA(hashes.SHA256()))
|
signed = _helpers.parse_key(self.device_key).sign(to_sign, ec.ECDSA(hashes.SHA256()))
|
||||||
|
|
||||||
prekey_signed = ids_pb2.PublicDevicePrekey()
|
prekey_signed = ids_pb2.PublicDevicePrekey()
|
||||||
|
|
|
@ -154,7 +154,7 @@ def register(
|
||||||
# },
|
# },
|
||||||
"client-data": {
|
"client-data": {
|
||||||
"supports-ack-v1": True,
|
"supports-ack-v1": True,
|
||||||
"public-message-identity-key": identity.encode(),
|
#"public-message-identity-key": identity.encode(),
|
||||||
"supports-update-attachments-v1": True,
|
"supports-update-attachments-v1": True,
|
||||||
"supports-keep-receipts": True,
|
"supports-keep-receipts": True,
|
||||||
"supports-people-request-messages-v2": True,
|
"supports-people-request-messages-v2": True,
|
||||||
|
@ -195,6 +195,7 @@ def register(
|
||||||
"supports-dq-nr": True,
|
"supports-dq-nr": True,
|
||||||
"public-message-identity-ngm-version": 12.0,
|
"public-message-identity-ngm-version": 12.0,
|
||||||
"supports-audio-messaging-v2": True,
|
"supports-audio-messaging-v2": True,
|
||||||
|
#"ngm-public-identity": ngm.generate_loggable_data()
|
||||||
},
|
},
|
||||||
"kt-loggable-data": ngm.generate_loggable_data(),
|
"kt-loggable-data": ngm.generate_loggable_data(),
|
||||||
"kt-mismatch-account-flag": True,
|
"kt-mismatch-account-flag": True,
|
||||||
|
|
27
imessage.py
27
imessage.py
|
@ -156,7 +156,8 @@ class Message:
|
||||||
raise NotImplementedError()
|
raise NotImplementedError()
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
raise NotImplementedError()
|
#raise NotImplementedError()
|
||||||
|
return self.text
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
class SMSReflectedMessage(Message):
|
class SMSReflectedMessage(Message):
|
||||||
|
@ -467,8 +468,10 @@ class iMessageUser:
|
||||||
payload = iMessageUser._parse_payload(p)
|
payload = iMessageUser._parse_payload(p)
|
||||||
|
|
||||||
body = BytesIO(payload[0])
|
body = BytesIO(payload[0])
|
||||||
|
#print(self.user.ngm.pre_key)
|
||||||
rsa_body = ids._helpers.parse_key(
|
rsa_body = ids._helpers.parse_key(
|
||||||
self.user.encryption_identity.encryption_key # type: ignore
|
self.user.encryption_identity.encryption_key # type: ignore
|
||||||
|
#self.user.ngm.pre_key
|
||||||
).decrypt( # type: ignore
|
).decrypt( # type: ignore
|
||||||
body.read(160),
|
body.read(160),
|
||||||
padding.OAEP(
|
padding.OAEP(
|
||||||
|
@ -516,12 +519,32 @@ class iMessageUser:
|
||||||
body: dict[str, Any] = await self._receive_raw(list(MESSAGE_TYPES.keys()), [t[0] for t in MESSAGE_TYPES.values()])
|
body: dict[str, Any] = await self._receive_raw(list(MESSAGE_TYPES.keys()), [t[0] for t in MESSAGE_TYPES.values()])
|
||||||
t: type[Message] = MESSAGE_TYPES[body["c"]][1]
|
t: type[Message] = MESSAGE_TYPES[body["c"]][1]
|
||||||
|
|
||||||
|
if not 'E' in body:
|
||||||
|
logger.error(f"Received message with no encryption type")
|
||||||
|
logger.error(f"Message : {body}")
|
||||||
|
return Message(text="Received message with no encryption type", sender="System", participants=[], id=uuid.uuid4(), _raw=body)
|
||||||
|
if body['E'] != 'pair':
|
||||||
|
logger.error(f"Received message with unknown encryption type {body['E']}")
|
||||||
|
return Message(text="Received message with unknown encryption type", sender="System", participants=[], id=uuid.uuid4(), _raw=body)
|
||||||
|
if not 'P' in body:
|
||||||
|
logger.error(f"Received message with no payload")
|
||||||
|
logger.error(f"Message : {body}")
|
||||||
|
return Message(text="Received message with no payload", sender="System", participants=[], id=uuid.uuid4(), _raw=body)
|
||||||
|
|
||||||
if not await self._verify_payload(body["P"], body["sP"], body["t"]):
|
if not await self._verify_payload(body["P"], body["sP"], body["t"]):
|
||||||
raise Exception("Failed to verify payload")
|
#raise Exception("Failed to verify payload")
|
||||||
|
logger.error(f"Failed to verify payload")
|
||||||
|
logger.error(f"Message : {body}")
|
||||||
|
return Message(text="Failed to verify payload", sender="System", participants=[], id=uuid.uuid4(), _raw=body)
|
||||||
|
|
||||||
logger.debug(f"Encrypted body : {body}")
|
logger.debug(f"Encrypted body : {body}")
|
||||||
|
|
||||||
|
try:
|
||||||
decrypted: bytes = self._decrypt_payload(body["P"])
|
decrypted: bytes = self._decrypt_payload(body["P"])
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(f"Failed to decrypt message : {e}")
|
||||||
|
logger.error(f"Message : {body}")
|
||||||
|
return Message(text="Failed to decrypt message", sender="System", participants=[], id=uuid.uuid4(), _raw=body)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
return t.from_raw(decrypted, body["sP"])
|
return t.from_raw(decrypted, body["sP"])
|
||||||
|
|
Loading…
Reference in a new issue