diff --git a/scripts/mitmproxy/pyproject.toml b/scripts/mitmproxy/pyproject.toml new file mode 100644 index 0000000..0e81610 --- /dev/null +++ b/scripts/mitmproxy/pyproject.toml @@ -0,0 +1,8 @@ +# pyproject.toml +[tool.pytest.ini_options] +pythonpath = [ + ".", "lib", +] +testpaths = [ + "tests", +] \ No newline at end of file diff --git a/scripts/mitmproxy/tests/data/blsync_packet_client.raw b/scripts/mitmproxy/tests/data/blsync_packet_client.raw new file mode 100644 index 0000000..fea1636 Binary files /dev/null and b/scripts/mitmproxy/tests/data/blsync_packet_client.raw differ diff --git a/scripts/mitmproxy/tests/data/blsync_packet_client.yaml b/scripts/mitmproxy/tests/data/blsync_packet_client.yaml new file mode 100644 index 0000000..905f191 --- /dev/null +++ b/scripts/mitmproxy/tests/data/blsync_packet_client.yaml @@ -0,0 +1,6 @@ +body_length: 20 +body_payload: {pr: 1, r: 1} +body_type: 0 +id: 10006 +loco_command: BLSYNC +status_code: 0 diff --git a/scripts/mitmproxy/tests/data/chatonroom_packet_client.raw b/scripts/mitmproxy/tests/data/chatonroom_packet_client.raw new file mode 100644 index 0000000..3593a9d Binary files /dev/null and b/scripts/mitmproxy/tests/data/chatonroom_packet_client.raw differ diff --git a/scripts/mitmproxy/tests/data/chatonroom_packet_client.yaml b/scripts/mitmproxy/tests/data/chatonroom_packet_client.yaml new file mode 100644 index 0000000..d2280b6 --- /dev/null +++ b/scripts/mitmproxy/tests/data/chatonroom_packet_client.yaml @@ -0,0 +1,6 @@ +body_length: 60 +body_payload: {chatId: 9388759392670092, sc: 0, st: 0, token: 1693554522} +body_type: 0 +id: 10016 +loco_command: CHATONROOM +status_code: 0 diff --git a/scripts/mitmproxy/tests/data/chatonroom_packet_server.raw b/scripts/mitmproxy/tests/data/chatonroom_packet_server.raw new file mode 100644 index 0000000..ee5f6f2 Binary files /dev/null and b/scripts/mitmproxy/tests/data/chatonroom_packet_server.raw differ diff --git a/scripts/mitmproxy/tests/data/chatonroom_packet_server.yaml b/scripts/mitmproxy/tests/data/chatonroom_packet_server.yaml new file mode 100644 index 0000000..375c851 --- /dev/null +++ b/scripts/mitmproxy/tests/data/chatonroom_packet_server.yaml @@ -0,0 +1,23 @@ +body_length: 677 +body_payload: + a: [405368327, 405368740] + c: 9388759392670092 + f: true + l: 0 + m: [] + o: 1693554522 + pct: null + pi: + - {cs: '', ek: + MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAykBFu1jEsa4PW2keOTSAELXE/VCJqGqiYmc9J0NiYAGFZO5R1vcziBg957PJAGL6U3Ut8Y+iNpDyEk8310pswQVZL1r/AJEJL/WPUgyVT0xk40VC72xYGasi/Cao7Cq3ZJo+rk3tCQx7RCGA0GtyosoEvj0yCNI4/NH9TJhkaKXmFgWwp9d42m75TmGHFFbvEkPyFXtcwmNhJH3cgVHAMlMCaspedPHlK8FAdl0jt20VqaScN4VSx7E//9VX2tcMpM/9R80QX/42lD/62r2eC8tO+9jGuJWl0SKOidDXGF4061SleosWZMy2TyS5sk+/Bb777I9GSoJ0bge5wXyaGwIDAQAB, + pt: 3124392943946588704, sk: 0PahpeVCuIzcuIYql9HbFGc4J7Tl9CNTsRqj4ByvvCY=, u: 405368327} + r: null + sc: 3125740649914852441 + status: 0 + sui: 0 + t: SDirectChat + w: [3125740641498169344, 3125740641498169344] +body_type: 0 +id: 10016 +loco_command: CHATONROOM +status_code: 0 diff --git a/scripts/mitmproxy/tests/data/checkin_packet_client.raw b/scripts/mitmproxy/tests/data/checkin_packet_client.raw new file mode 100644 index 0000000..ad2d295 Binary files /dev/null and b/scripts/mitmproxy/tests/data/checkin_packet_client.raw differ diff --git a/scripts/mitmproxy/tests/data/checkin_packet_client.yaml b/scripts/mitmproxy/tests/data/checkin_packet_client.yaml new file mode 100644 index 0000000..71543c2 --- /dev/null +++ b/scripts/mitmproxy/tests/data/checkin_packet_client.yaml @@ -0,0 +1,7 @@ +body_length: 99 +body_payload: {MCCMNC: '310260', appVer: 10.3.3, lang: en, ntype: 3, os: android, + userId: 405368740} +body_type: 0 +id: 10002 +loco_command: CHECKIN +status_code: 0 diff --git a/scripts/mitmproxy/tests/data/empty_loco_packet.raw b/scripts/mitmproxy/tests/data/empty_loco_packet.raw new file mode 100644 index 0000000..8460078 Binary files /dev/null and b/scripts/mitmproxy/tests/data/empty_loco_packet.raw differ diff --git a/scripts/mitmproxy/tests/data/empty_loco_packet.yaml b/scripts/mitmproxy/tests/data/empty_loco_packet.yaml new file mode 100644 index 0000000..a32e897 --- /dev/null +++ b/scripts/mitmproxy/tests/data/empty_loco_packet.yaml @@ -0,0 +1,6 @@ +body_length: 0 +body_payload: !!binary | +body_type: 0 +id: 0 +loco_command: '' +status_code: 0 diff --git a/scripts/mitmproxy/tests/data/encrypted_screate_packet_with_mitm_key.raw b/scripts/mitmproxy/tests/data/encrypted_screate_packet_with_mitm_key.raw new file mode 100644 index 0000000..a77744e Binary files /dev/null and b/scripts/mitmproxy/tests/data/encrypted_screate_packet_with_mitm_key.raw differ diff --git a/scripts/mitmproxy/tests/data/encrypted_setsk_packet.raw b/scripts/mitmproxy/tests/data/encrypted_setsk_packet.raw new file mode 100644 index 0000000..93f70d9 Binary files /dev/null and b/scripts/mitmproxy/tests/data/encrypted_setsk_packet.raw differ diff --git a/scripts/mitmproxy/tests/data/getlpk_packet_client.raw b/scripts/mitmproxy/tests/data/getlpk_packet_client.raw new file mode 100644 index 0000000..3bd73b9 Binary files /dev/null and b/scripts/mitmproxy/tests/data/getlpk_packet_client.raw differ diff --git a/scripts/mitmproxy/tests/data/getlpk_packet_client.yaml b/scripts/mitmproxy/tests/data/getlpk_packet_client.yaml new file mode 100644 index 0000000..1c0aff0 --- /dev/null +++ b/scripts/mitmproxy/tests/data/getlpk_packet_client.yaml @@ -0,0 +1,8 @@ +body_length: 30 +body_payload: + mi: [405368327] + mu: false +body_type: 0 +id: 10013 +loco_command: GETLPK +status_code: 0 diff --git a/scripts/mitmproxy/tests/data/getlpk_packet_server.raw b/scripts/mitmproxy/tests/data/getlpk_packet_server.raw new file mode 100644 index 0000000..5a92768 Binary files /dev/null and b/scripts/mitmproxy/tests/data/getlpk_packet_server.raw differ diff --git a/scripts/mitmproxy/tests/data/getlpk_packet_server.yaml b/scripts/mitmproxy/tests/data/getlpk_packet_server.yaml new file mode 100644 index 0000000..e94ac81 --- /dev/null +++ b/scripts/mitmproxy/tests/data/getlpk_packet_server.yaml @@ -0,0 +1,11 @@ +body_length: 520 +body_payload: + pi: + - {cs: '', ek: + MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAykBFu1jEsa4PW2keOTSAELXE/VCJqGqiYmc9J0NiYAGFZO5R1vcziBg957PJAGL6U3Ut8Y+iNpDyEk8310pswQVZL1r/AJEJL/WPUgyVT0xk40VC72xYGasi/Cao7Cq3ZJo+rk3tCQx7RCGA0GtyosoEvj0yCNI4/NH9TJhkaKXmFgWwp9d42m75TmGHFFbvEkPyFXtcwmNhJH3cgVHAMlMCaspedPHlK8FAdl0jt20VqaScN4VSx7E//9VX2tcMpM/9R80QX/42lD/62r2eC8tO+9jGuJWl0SKOidDXGF4061SleosWZMy2TyS5sk+/Bb777I9GSoJ0bge5wXyaGwIDAQAB, + pt: 3124392943946588704, sk: 0PahpeVCuIzcuIYql9HbFGc4J7Tl9CNTsRqj4ByvvCY=, u: 405368327} + status: 0 +body_type: 0 +id: 10013 +loco_command: GETLPK +status_code: 0 diff --git a/scripts/mitmproxy/tests/data/getmem_packet_client.raw b/scripts/mitmproxy/tests/data/getmem_packet_client.raw new file mode 100644 index 0000000..348d6ec Binary files /dev/null and b/scripts/mitmproxy/tests/data/getmem_packet_client.raw differ diff --git a/scripts/mitmproxy/tests/data/getmem_packet_client.yaml b/scripts/mitmproxy/tests/data/getmem_packet_client.yaml new file mode 100644 index 0000000..136d357 --- /dev/null +++ b/scripts/mitmproxy/tests/data/getmem_packet_client.yaml @@ -0,0 +1,6 @@ +body_length: 21 +body_payload: {chatId: 4884554736017431} +body_type: 0 +id: 10007 +loco_command: GETMEM +status_code: 0 diff --git a/scripts/mitmproxy/tests/data/getmem_packet_server.raw b/scripts/mitmproxy/tests/data/getmem_packet_server.raw new file mode 100644 index 0000000..533fd7a Binary files /dev/null and b/scripts/mitmproxy/tests/data/getmem_packet_server.raw differ diff --git a/scripts/mitmproxy/tests/data/getmem_packet_server.yaml b/scripts/mitmproxy/tests/data/getmem_packet_server.yaml new file mode 100644 index 0000000..9d0d88f --- /dev/null +++ b/scripts/mitmproxy/tests/data/getmem_packet_server.yaml @@ -0,0 +1,19 @@ +body_length: 715 +body_payload: + members: + - {accountId: 262855419, fullProfileImageUrl: '', linkedServices: '', nickName: furztrocken, + originalProfileImageUrl: '', profileImageUrl: '', statusMessage: '', type: -999999, + userId: 405368740, ut: 0} + - {accountId: 0, fullProfileImageUrl: + https://p.kakaocdn.net/th/talkp/wkvq5HO4yw/K2H6hBZUBidOkF4i5yu1p0/pu5dpg_640x640_s.jpg, + linkedServices: '', nickName: KakaoTalk, originalProfileImageUrl: + https://p.kakaocdn.net/th/talkp/wkvq5HO4yw/K2H6hBZUBidOkF4i5yu1p0/pu5dpg_640x640_s.jpg, + profileImageUrl: + https://p.kakaocdn.net/th/talkp/wkvq5HO4yw/K2H6hBZUBidOkF4i5yu1p0/pu5dpg_110x110_c.jpg, + statusMessage: KakaoTeam, type: -999999, userId: 69758567, ut: 1} + status: 0 + token: 1693552382 +body_type: 0 +id: 10007 +loco_command: GETMEM +status_code: 0 diff --git a/scripts/mitmproxy/tests/data/getpk_packet_client.raw b/scripts/mitmproxy/tests/data/getpk_packet_client.raw new file mode 100644 index 0000000..7c5f193 Binary files /dev/null and b/scripts/mitmproxy/tests/data/getpk_packet_client.raw differ diff --git a/scripts/mitmproxy/tests/data/getpk_packet_client.yaml b/scripts/mitmproxy/tests/data/getpk_packet_client.yaml new file mode 100644 index 0000000..b2101f6 --- /dev/null +++ b/scripts/mitmproxy/tests/data/getpk_packet_client.yaml @@ -0,0 +1,8 @@ +body_length: 45 +body_payload: + mi: [405368327] + pt: [3124319739752240031] +body_type: 0 +id: 10014 +loco_command: GETPK +status_code: 0 diff --git a/scripts/mitmproxy/tests/data/getpk_packet_server.raw b/scripts/mitmproxy/tests/data/getpk_packet_server.raw new file mode 100644 index 0000000..78745fc Binary files /dev/null and b/scripts/mitmproxy/tests/data/getpk_packet_server.raw differ diff --git a/scripts/mitmproxy/tests/data/getpk_packet_server.yaml b/scripts/mitmproxy/tests/data/getpk_packet_server.yaml new file mode 100644 index 0000000..f30c0be --- /dev/null +++ b/scripts/mitmproxy/tests/data/getpk_packet_server.yaml @@ -0,0 +1,14 @@ +body_length: 1014 +body_payload: + pi: + - {cs: '', ek: + MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAo1v7+3uOUiAJboG0rVrcoKDi31CuGWPS5h0aKCOwFxY+Epd7MLsCar1FY7tpaz4E0eDse3J60FfRmohDky30f4jVpjTVF4U18VRJY6ex8yAR80/ZLVPbzcOnEwWOYsD+6WzY7UipoQn6osx+0rsTy86WndlSouKXm3cJmFFoIXFupTXMlvU44gQOhXlYOXs+jNnL7eL+6pJS76/mYXoLX1vEtCi3HfdXm3jw5aQMIjCCIRNE375xZz8ZwVyFXMu3A780uWbLPPs/5uPyYZnBCFdunqq/mWDjMeYnia2ncUyN7Il18EGQ8dxQqA26bEZ8A5DV5PEzzUDRIPkxWg2pGwIDAQAB, + pt: 3124319739752240031, sk: x6yH7enPDewXgW+pI4gUTO1n9Yw2M6hTI9jQgl8goLU=, u: 405368327} + - {cs: '', ek: + MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAykBFu1jEsa4PW2keOTSAELXE/VCJqGqiYmc9J0NiYAGFZO5R1vcziBg957PJAGL6U3Ut8Y+iNpDyEk8310pswQVZL1r/AJEJL/WPUgyVT0xk40VC72xYGasi/Cao7Cq3ZJo+rk3tCQx7RCGA0GtyosoEvj0yCNI4/NH9TJhkaKXmFgWwp9d42m75TmGHFFbvEkPyFXtcwmNhJH3cgVHAMlMCaspedPHlK8FAdl0jt20VqaScN4VSx7E//9VX2tcMpM/9R80QX/42lD/62r2eC8tO+9jGuJWl0SKOidDXGF4061SleosWZMy2TyS5sk+/Bb777I9GSoJ0bge5wXyaGwIDAQAB, + pt: 3124392943946588704, sk: 0PahpeVCuIzcuIYql9HbFGc4J7Tl9CNTsRqj4ByvvCY=, u: 405368327} + status: 0 +body_type: 0 +id: 10014 +loco_command: GETPK +status_code: 0 diff --git a/scripts/mitmproxy/tests/data/gettoken_packet_client.raw b/scripts/mitmproxy/tests/data/gettoken_packet_client.raw new file mode 100644 index 0000000..fdfe1d2 Binary files /dev/null and b/scripts/mitmproxy/tests/data/gettoken_packet_client.raw differ diff --git a/scripts/mitmproxy/tests/data/gettoken_packet_client.yaml b/scripts/mitmproxy/tests/data/gettoken_packet_client.yaml new file mode 100644 index 0000000..0089d5e --- /dev/null +++ b/scripts/mitmproxy/tests/data/gettoken_packet_client.yaml @@ -0,0 +1,7 @@ +body_length: 70 +body_payload: + ts: [2, 3, 11, 12, 4, 9, 10, 15] +body_type: 0 +id: 10005 +loco_command: GETTOKEN +status_code: 0 diff --git a/scripts/mitmproxy/tests/data/gettoken_packet_server.raw b/scripts/mitmproxy/tests/data/gettoken_packet_server.raw new file mode 100644 index 0000000..6d4cf7a Binary files /dev/null and b/scripts/mitmproxy/tests/data/gettoken_packet_server.raw differ diff --git a/scripts/mitmproxy/tests/data/gettoken_packet_server.yaml b/scripts/mitmproxy/tests/data/gettoken_packet_server.yaml new file mode 100644 index 0000000..5527594 --- /dev/null +++ b/scripts/mitmproxy/tests/data/gettoken_packet_server.yaml @@ -0,0 +1,9 @@ +body_length: 179 +body_payload: + os: [0, 0, 0, 1, 0, 0, 0, 0] + status: 0 + ts: [2, 3, 11, 12, 4, 9, 10, 15] +body_type: 0 +id: 10005 +loco_command: GETTOKEN +status_code: 0 diff --git a/scripts/mitmproxy/tests/data/loginlist_packet_client.raw b/scripts/mitmproxy/tests/data/loginlist_packet_client.raw new file mode 100644 index 0000000..c68a88f Binary files /dev/null and b/scripts/mitmproxy/tests/data/loginlist_packet_client.raw differ diff --git a/scripts/mitmproxy/tests/data/loginlist_packet_client.yaml b/scripts/mitmproxy/tests/data/loginlist_packet_client.yaml new file mode 100644 index 0000000..a1e16c9 --- /dev/null +++ b/scripts/mitmproxy/tests/data/loginlist_packet_client.yaml @@ -0,0 +1,22 @@ +body_length: 346 +body_payload: + MCCMNC: '310260' + appVer: 10.3.3 + bg: false + chatIds: [] + duuid: 295c990ec4b3470b9df03827b4a9e38b5caf17cfc010bb18abab9aee622ec5f8 + lang: en + lastTokenId: 0 + lbk: 0 + maxIds: [] + ntype: 3 + oauthToken: 55027f93d571437fb5c602a526a77ee300000016935523756660010yGWgXyzccO + os: android + prtVer: '1' + revision: 0 + rp: !!binary | + AAD//wAA +body_type: 0 +id: 10003 +loco_command: LOGINLIST +status_code: 0 diff --git a/scripts/mitmproxy/tests/data/loginlist_packet_client_0.raw b/scripts/mitmproxy/tests/data/loginlist_packet_client_0.raw new file mode 100644 index 0000000..699756c Binary files /dev/null and b/scripts/mitmproxy/tests/data/loginlist_packet_client_0.raw differ diff --git a/scripts/mitmproxy/tests/data/loginlist_packet_client_0.yaml b/scripts/mitmproxy/tests/data/loginlist_packet_client_0.yaml new file mode 100644 index 0000000..53d315c --- /dev/null +++ b/scripts/mitmproxy/tests/data/loginlist_packet_client_0.yaml @@ -0,0 +1,22 @@ +body_length: 346 +body_payload: + MCCMNC: '310260' + appVer: 10.3.3 + bg: false + chatIds: [] + duuid: 295c990ec4b3470b9df03827b4a9e38b5caf17cfc010bb18abab9aee622ec5f8 + lang: en + lastTokenId: 3125722688938653164 + lbk: 1693552381 + maxIds: [] + ntype: 3 + oauthToken: 55027f93d571437fb5c602a526a77ee300000016935523756660010yGWgXyzccO + os: android + prtVer: '1' + revision: 28 + rp: !!binary | + AQD//wEA +body_type: 0 +id: 10011 +loco_command: LOGINLIST +status_code: 0 diff --git a/scripts/mitmproxy/tests/data/loginlist_packet_server_0.raw b/scripts/mitmproxy/tests/data/loginlist_packet_server_0.raw new file mode 100644 index 0000000..9994a6d --- /dev/null +++ b/scripts/mitmproxy/tests/data/loginlist_packet_server_0.raw @@ -0,0 +1,49 @@ +body_length: 1499 +body_payload: + chatDatas: + - a: 2 + c: 4884554736017431 + i: [69758567] + k: [KakaoTalk] + l: {attachment: "{\"P\":{\"TP\":\"Feed\",\"ME\":\"KakaoTalk Login Attempt\",\"\ + SID\":\"plusfriend_tms\",\"DID\":\"https://auth.kakao.com/fa/main.html?close_on_back=true&close_on_completion=true&page=block_try_talk_login&token=%2FdGRqWvV%2F5kbRw%2B%2FD1MEE8DtZEr7AEABKCrv3piI8us%3D\"\ + ,\"SDID\":\"69758567\",\"FW\":false,\"KV\":true,\"AD\":false,\"A\":{\"version\"\ + :1,\"code\":\"34O1972BXONLsjAcpwrH1ivompzIKPpkfJP8Chtqu7k=\",\"createdAt\"\ + :1693552120617}},\"C\":{\"TI\":{\"FT\":true,\"TD\":{\"T\":\"KakaoTalk Login + Attempt\",\"D\":\"KakaoTalk Login Attempt\\n\\n-Date : Fri Sep 1 16:08 (Korea + Standard Time/UTC+9)\\n-Device : SDK_GPHONE_ARM64\\n-IP : 83.171.160.13\\ + n\\nIf you don't recognize this activity, you may temporarily lock your account + to protect it.\\n\\n\"}},\"BUL\":[{\"BU\":{\"T\":\"Lock My Account\",\"HL\"\ + :null},\"L\":{\"LMO\":\"https://auth.kakao.com/fa/main.html?close_on_back=true&close_on_completion=true&page=block_try_talk_login&token=%2FdGRqWvV%2F5kbRw%2B%2FD1MEE8DtZEr7AEABKCrv3piI8us%3D\"\ + }}],\"BUT\":1}}", authorId: 69758567, chatId: 4884554736017431, logId: 3125720503930142720, + message: KakaoTalk Login Attempt, msgId: 1693552192251, prevId: 3124400535045228544, + referer: 0, sendAt: 1693552121, type: 71} + ll: 3125720503930142720 + m: null + ml: 3123783401472000000 + mmr: 0 + n: 2 + o: 0 + p: true + s: 3122239915491457024 + t: PlusChat + delChatIds: [4503599627370497] + eof: true + kc: [] + lastTokenId: 3125740458250115451 + lbk: 1693552381 + ltk: 0 + mcmRevision: 0 + minLogId: 3123783401472000000 + pkToken: 3125722692958571562 + revision: 28 + revisionInfo: '[]' + rp: !!binary | + AQABAAEA + sb: 1 + status: 0 + userId: 405368740 +body_type: 0 +id: 10011 +loco_command: LOGINLIST +status_code: 0 diff --git a/scripts/mitmproxy/tests/data/screate_loco_packet.yaml b/scripts/mitmproxy/tests/data/screate_loco_packet.yaml new file mode 100644 index 0000000..57f8ed0 --- /dev/null +++ b/scripts/mitmproxy/tests/data/screate_loco_packet.yaml @@ -0,0 +1,34 @@ +body_length: 1249 +body_payload: + c: 9388354540351878 + nc: true + pi: + - {cs: '', ek: + MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyfkeppzP/qOIUXRqzHt+KjE/sz5tMCwf3Y7Xz+SoDU2kYVTjZS1NWtNMT4gFhiVVsX+uwdwEU0ijgg07zX9GM45HZJoj+Wrb58pNHBUqfksR/oXcX5jBASDh3Oks7Naw2FLdtFdqh1uISzYKA7Ubo0C8ep4N7PVYJdJvsa83nFYbfVi7WTCZJqixla4of+yVaj+XNq/+n8hew8pJEW2hx1szJjqfZSskTTUwASiWBTSdHktnv6y7N8Ls32buAfZu+Oqzw5DRJrWL8iLLx9hkM1T5dPTrc2RcabuG/YiamPaVN9P1iGz2HM9b0fUBFvH8e8REaujlOQVr3cyl/rezdQIDAQAB, + pt: 3122418946040168677, sk: odgQ7ds/Pz9AlC7kNSVCLFHZAvRCMUVPzc3R3FZlqAI=, u: 405368327} + r: + activeMemberIds: [405368740, 405368327] + chatId: 9388354540351878 + lastLogId: 0 + lastMessage: null + lastUpdatedAt: null + members: + - {accountId: 262855419, countryIso: DE, fullProfileImageUrl: '', linkedServices: '', + nickName: furztrocken, originalProfileImageUrl: '', profileImageUrl: '', statusMessage: '', + suspended: false, type: -999999, userId: 405368740} + - {accountId: 256190398, countryIso: DE, fullProfileImageUrl: '', linkedServices: '', + nickName: peterplan, originalProfileImageUrl: '', profileImageUrl: '', statusMessage: '', + suspended: false, type: -999999, userId: 405368327} + metaRevisions: null + newMessageCount: -1 + o: 1693159158 + pct: null + pushAlert: null + type: SDirectChat + watermarks: [3122424091315798016, 3122424091315798016] + sc: 3122424099724080067 + status: 0 +body_type: 0 +id: 10291 +loco_command: SCREATE +status_code: 0 diff --git a/scripts/mitmproxy/tests/data/screate_packet_client.raw b/scripts/mitmproxy/tests/data/screate_packet_client.raw new file mode 100644 index 0000000..c7dc896 Binary files /dev/null and b/scripts/mitmproxy/tests/data/screate_packet_client.raw differ diff --git a/scripts/mitmproxy/tests/data/screate_packet_client.yaml b/scripts/mitmproxy/tests/data/screate_packet_client.yaml new file mode 100644 index 0000000..db336ac --- /dev/null +++ b/scripts/mitmproxy/tests/data/screate_packet_client.yaml @@ -0,0 +1,7 @@ +body_length: 25 +body_payload: + mi: [405368327] +body_type: 0 +id: 10015 +loco_command: SCREATE +status_code: 0 diff --git a/scripts/mitmproxy/tests/data/screate_packet_server.raw b/scripts/mitmproxy/tests/data/screate_packet_server.raw new file mode 100644 index 0000000..cd9c58c Binary files /dev/null and b/scripts/mitmproxy/tests/data/screate_packet_server.raw differ diff --git a/scripts/mitmproxy/tests/data/screate_packet_server.yaml b/scripts/mitmproxy/tests/data/screate_packet_server.yaml new file mode 100644 index 0000000..377f511 --- /dev/null +++ b/scripts/mitmproxy/tests/data/screate_packet_server.yaml @@ -0,0 +1,34 @@ +body_length: 1249 +body_payload: + c: 9388759392670092 + nc: true + pi: + - {cs: '', ek: + MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAykBFu1jEsa4PW2keOTSAELXE/VCJqGqiYmc9J0NiYAGFZO5R1vcziBg957PJAGL6U3Ut8Y+iNpDyEk8310pswQVZL1r/AJEJL/WPUgyVT0xk40VC72xYGasi/Cao7Cq3ZJo+rk3tCQx7RCGA0GtyosoEvj0yCNI4/NH9TJhkaKXmFgWwp9d42m75TmGHFFbvEkPyFXtcwmNhJH3cgVHAMlMCaspedPHlK8FAdl0jt20VqaScN4VSx7E//9VX2tcMpM/9R80QX/42lD/62r2eC8tO+9jGuJWl0SKOidDXGF4061SleosWZMy2TyS5sk+/Bb777I9GSoJ0bge5wXyaGwIDAQAB, + pt: 3124392943946588704, sk: 0PahpeVCuIzcuIYql9HbFGc4J7Tl9CNTsRqj4ByvvCY=, u: 405368327} + r: + activeMemberIds: [405368740, 405368327] + chatId: 9388759392670092 + lastLogId: 0 + lastMessage: null + lastUpdatedAt: null + members: + - {accountId: 262855419, countryIso: DE, fullProfileImageUrl: '', linkedServices: '', + nickName: furztrocken, originalProfileImageUrl: '', profileImageUrl: '', statusMessage: '', + suspended: false, type: -999999, userId: 405368740} + - {accountId: 256190398, countryIso: DE, fullProfileImageUrl: '', linkedServices: '', + nickName: peterplan, originalProfileImageUrl: '', profileImageUrl: '', statusMessage: '', + suspended: false, type: -999999, userId: 405368327} + metaRevisions: null + newMessageCount: -1 + o: 1693554522 + pct: null + pushAlert: null + type: SDirectChat + watermarks: [3125740641498169344, 3125740641498169344] + sc: 3125740649914852441 + status: 0 +body_type: 0 +id: 10015 +loco_command: SCREATE +status_code: 0 diff --git a/scripts/mitmproxy/tests/data/setpk_packet_client.raw b/scripts/mitmproxy/tests/data/setpk_packet_client.raw new file mode 100644 index 0000000..601a025 Binary files /dev/null and b/scripts/mitmproxy/tests/data/setpk_packet_client.raw differ diff --git a/scripts/mitmproxy/tests/data/setpk_packet_client.yaml b/scripts/mitmproxy/tests/data/setpk_packet_client.yaml new file mode 100644 index 0000000..f859455 --- /dev/null +++ b/scripts/mitmproxy/tests/data/setpk_packet_client.yaml @@ -0,0 +1,13 @@ +body_length: 1006 +body_payload: {cs: + GT8Z+D5U4FNWyD3EDrJw+udvhP4F27EgP6D7Cx7x4Qqxr9f4ghnHFNURIyZfWtMMfY/9HuNrn1YjAhrcVayoAQ==, + ek: + MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsfQxCfx1vkzioz8UtBR/YfWaUGHKZUuXyg1Bhbi8fAtUORvX4tDOc5wb+zYfq/Vb3kywuJsnQo8RHQ6pBTcxHNc7Vcl1RDAynnysFdJNqjXgKRN/egcPQXYb0Hi3r1VI4bWH8TGEJm8AEKzq5PtSo46X1SR/e6wOa3IxRv2hFTKT7zdp7ThwuhpVx9GxuqyEcKSHHTTk+z5V10JuO9EKZR8ybuDv9FyxIVR5BVO+RSC4dCpjSZf1h/j6frft4/TfYkr1KlycqWW04fFiEUmADWAsV7BMB+kEofxIQUpCVO8X7Eo3lrKA3neetLZ7rX/e5RS4LbrkGK4AzcNBsSLKawIDAQAB, + sd: + 0ed8pkaGnT1Iy+xFMz0wO0zsqwlb/PkMWA8AyNO0gC1bqLDifdj3KFDtwPksXd6sGo5JyoZKFnR6ffnmCGNUBg==, + sk: ZZ5eu1z1LSETep51/j2F31uRpqYh7cJISSs0SHhcpfI=, sr: + Cz42sP8mM8FFReM9J7c/BqXjo7FiJcDkLwoQ9I9F9gIrzIUoxohmz8L2pCqB2Hcb4sTG/xkAHnvgMn3Xvou/PhDBh7X0e4ew4oU9rGP+MAkOLL2UqXJy+oI+N/Tw25J1yddZkNrFrC2+HtVyLJjsWgenoKDVKOk/qJo1TBYVLaWiIuQz560hzhv7t+z0807Pj0NihvegLx5EE0B9pGa4jJQL7jtYWPEa4/PxeeE5OIbWes71RqD6PzEecIj9r/DZ8xYoaHwqodQbcmv972CWNh3MJPZhJxuRquxTI1BhF9t0/TVMPp4GzR/s+AM8341lwDRoIdC9ANNk/xMs/0Y6Pg==} +body_type: 0 +id: 10004 +loco_command: SETPK +status_code: 0 diff --git a/scripts/mitmproxy/tests/data/setpk_packet_server.raw b/scripts/mitmproxy/tests/data/setpk_packet_server.raw new file mode 100644 index 0000000..65f1b06 Binary files /dev/null and b/scripts/mitmproxy/tests/data/setpk_packet_server.raw differ diff --git a/scripts/mitmproxy/tests/data/setpk_packet_server.yaml b/scripts/mitmproxy/tests/data/setpk_packet_server.yaml new file mode 100644 index 0000000..2c05e14 --- /dev/null +++ b/scripts/mitmproxy/tests/data/setpk_packet_server.yaml @@ -0,0 +1,6 @@ +body_length: 33 +body_payload: {pt: 3125722692958571562, r: true, status: 0} +body_type: 0 +id: 10004 +loco_command: SETPK +status_code: 0 diff --git a/scripts/mitmproxy/tests/data/setsk_loco_packet_sk_enc_with_kakaotalk_key.yaml b/scripts/mitmproxy/tests/data/setsk_loco_packet_sk_enc_with_kakaotalk_key.yaml new file mode 100644 index 0000000..6bc7d1f --- /dev/null +++ b/scripts/mitmproxy/tests/data/setsk_loco_packet_sk_enc_with_kakaotalk_key.yaml @@ -0,0 +1,16 @@ +body_length: 911 +body_payload: + c: 9388354540351878 + mi: [405368327, 405368740] + mp: [3122418946040168677, 3122241999402188784] + pt: 3122241999402188784 + s: + QjlDPq44qpmfBcO6+B4H99S6kpwV+Ih7KmoYCd7Y7nXLpWrGG34IYEVgg05RAxA3quwsNskiodMtePciZQ+RAw== + sc: 3122424099724080067 + sk: [ + XEnm14ddEydSisfjnb8LUO5vUmBd8EGWss6D0XACcgFKhOQ4370KQy+jDWszAjnJYeToKkBlPbToGjRk6efA4QtBqQeXCRoEpH+Z3bwtFjxcLwGRK22L2qOlxF8fjaJUswBkonLv9M2DeyZp7So2EsLQELrdwgggmry1uxnZqblXOG+6vnq3sYsR2ef7L45Ui2gaIUobEq4HgJJQrE8zp61muexPOMv3Nbj1pRduStBhy9MQ3ZZEuNPSg/6/4lpww8blIDT0HJxrOmXMt+rboaq3hSUfTR/fMIA/Xsxk7PM+nRtDhIsAib8EO5Uwl2L+fWv7QO8DQKM/5ivfgp9fXw==, + Gxh/DpE4+OozxtQmEbmc3Io/Gq+Ynoqpf4IxhSKYdINdePYR0pgggMRUSgJDUe9AkBd5ZiaconSC3CPA9uHdTSvzmHSvHWZJY6po6SbnPnTrSljdQmb6wcVVKKzPXMokp2p4AghGO+U/fIB5O9c0JDnkqgHgkGjsXbgXCZhaaNZpYAypjL8GZwFqnLBKKjJnWsWISD5LUO/78rD++uOvUCg5r+1cxkLH6+BNiU8pGuuCNMnwuowWwG4a8Q0lJjOSKJkV7wtaGEcYmQ0GDYi6n618N168v9VQvLT7P0Mdxaxvl3/KnkupD0IzZENF0odsWMLyNUcSIMfhrM0J7q4A3A==] +body_type: 0 +id: 10293 +loco_command: SETSK +status_code: 0 diff --git a/scripts/mitmproxy/tests/data/setsk_loco_packet_sk_enc_with_mitm_key.yaml b/scripts/mitmproxy/tests/data/setsk_loco_packet_sk_enc_with_mitm_key.yaml new file mode 100644 index 0000000..41ea37d --- /dev/null +++ b/scripts/mitmproxy/tests/data/setsk_loco_packet_sk_enc_with_mitm_key.yaml @@ -0,0 +1,16 @@ +body_length: 911 +body_payload: + c: 9388354540351878 + mi: [405368327, 405368740] + mp: [3122418946040168677, 3122241999402188784] + pt: 3122241999402188784 + s: + QjlDPq44qpmfBcO6+B4H99S6kpwV+Ih7KmoYCd7Y7nXLpWrGG34IYEVgg05RAxA3quwsNskiodMtePciZQ+RAw== + sc: 3122424099724080067 + sk: [ + rmf4zi9VAlvp8YpAECfArw2AdQOg4srpQqNr33TQG2O121NBuZMQV5mrj2ZzIgK3gbPcY8RG7mkt2QNxpe/f9cvJ4BapVMvzmzd/F9TqMhQCpR1c2xNa9zIs7+V7uzTNaRp5mLTMfhb1nvIf5DroHJk+ODyXGH+FTDCrpj1sVpW/p2sJvDuGXRWKYQUCFcXf3/6XdJe9uRaKgPvrfVaW1u4IewhtyvzWZamG0yu6zui3xidQ4eLkZN7L6OJ12tyoeUCVSTB3082BM9Kl4jRg49T1l7EMp3eC/Y6Co+H692//As4+WYbpxZaPn3EzvWnKi7Bd/aWiwKaQBA9eNtxGVQ==, + Gxh/DpE4+OozxtQmEbmc3Io/Gq+Ynoqpf4IxhSKYdINdePYR0pgggMRUSgJDUe9AkBd5ZiaconSC3CPA9uHdTSvzmHSvHWZJY6po6SbnPnTrSljdQmb6wcVVKKzPXMokp2p4AghGO+U/fIB5O9c0JDnkqgHgkGjsXbgXCZhaaNZpYAypjL8GZwFqnLBKKjJnWsWISD5LUO/78rD++uOvUCg5r+1cxkLH6+BNiU8pGuuCNMnwuowWwG4a8Q0lJjOSKJkV7wtaGEcYmQ0GDYi6n618N168v9VQvLT7P0Mdxaxvl3/KnkupD0IzZENF0odsWMLyNUcSIMfhrM0J7q4A3A==] +body_type: 0 +id: 10293 +loco_command: SETSK +status_code: 0 diff --git a/scripts/mitmproxy/tests/data/setsk_packet_client_0.raw b/scripts/mitmproxy/tests/data/setsk_packet_client_0.raw new file mode 100644 index 0000000..b3289f4 Binary files /dev/null and b/scripts/mitmproxy/tests/data/setsk_packet_client_0.raw differ diff --git a/scripts/mitmproxy/tests/data/setsk_packet_client_0.yaml b/scripts/mitmproxy/tests/data/setsk_packet_client_0.yaml new file mode 100644 index 0000000..0e32500 --- /dev/null +++ b/scripts/mitmproxy/tests/data/setsk_packet_client_0.yaml @@ -0,0 +1,16 @@ +body_length: 911 +body_payload: + c: 9388759392670092 + mi: [405368327, 405368740] + mp: [3124392943946588704, 3125722692958571562] + pt: 3125722692958571562 + s: + rIX8Be5HIKVLNxIUVvCvW0Lt3EZb7NATRksklDRZicAUbJLNfsCaN7wNtSw9dr4g+A1+04lUOqGSpcPSxRWECQ== + sc: 3125740649914852441 + sk: [ + ozfnEbdrd0618APqMVe26HG6rcbdULhgUSLt46QE9kzuyIPHxYjH2so0fqjkwt3AYGCENeYuPNxFo3NgGFtDNGMxaMcbbidRd/qpwhX6F6Y5gdf1FSGrhn5l5zTEcx6CRhvyz89WlxV/2lFfujaM2qy3tpSTL1NcUqOW2GWyNpLrFSMSIPOd1O4Ad/+1iHiN9ngRVjZWj2XPoXiaiPHh2RE74k9+n5u+2eVqnMKt5lYpX2K6RUNIr5rPnh0JzNruIA0CLbNTpakkIu0BBKkkAy0JHb9ccDWntCAzfxh3KF9lLy2xX9YxViAh1rkcl2Fysh2SAj69pXlZWdb4LRR6Sg==, + LbGCBNct8F2hv6JkGH+VvCPYCgVjaBs8SCHPqtjd4QJsrlA20rZng81hSL5FhcY+BO8bCzfPzWzK9iPLexDA4BT0TLls8Lt7awP7sz0hK62/HDHDit5ln911+x57Y361eQ2lcJqeOF3Qsa58jyAPfEiiNe6unchcWjZv8Ir5HKos7uEKCCynxmwu9i2Cl91ZVNUeIp7DOchZbg5/XS9tbyxUzf4cRVXmRXlQRePqXPuMy1ClmYX3cectY2waPanfDQxtLtHfESIEgkonyvdvndVRIERNI3ZOiKphHkRGiEJwYJ440j6n2pTvchRkmu4VlrziBxcJiYJvodQveWuHJg==] +body_type: 0 +id: 10017 +loco_command: SETSK +status_code: 0 diff --git a/scripts/mitmproxy/tests/data/setsk_packet_server.raw b/scripts/mitmproxy/tests/data/setsk_packet_server.raw new file mode 100644 index 0000000..474197f Binary files /dev/null and b/scripts/mitmproxy/tests/data/setsk_packet_server.raw differ diff --git a/scripts/mitmproxy/tests/data/setsk_packet_server.yaml b/scripts/mitmproxy/tests/data/setsk_packet_server.yaml new file mode 100644 index 0000000..77429b3 --- /dev/null +++ b/scripts/mitmproxy/tests/data/setsk_packet_server.yaml @@ -0,0 +1,6 @@ +body_length: 17 +body_payload: {status: 0} +body_type: 0 +id: 10017 +loco_command: SETSK +status_code: 0 diff --git a/scripts/mitmproxy/tests/data/swrite_packet_client.raw b/scripts/mitmproxy/tests/data/swrite_packet_client.raw new file mode 100644 index 0000000..97157a8 Binary files /dev/null and b/scripts/mitmproxy/tests/data/swrite_packet_client.raw differ diff --git a/scripts/mitmproxy/tests/data/swrite_packet_client.yaml b/scripts/mitmproxy/tests/data/swrite_packet_client.yaml new file mode 100644 index 0000000..9541594 --- /dev/null +++ b/scripts/mitmproxy/tests/data/swrite_packet_client.yaml @@ -0,0 +1,9 @@ +body_length: 196 +body_payload: {c: 9388759392670092, e: g8M=, m: rNu7YQ==, mid: 1337486070, pt: 3125722692958571562, + s: + 2/V7NhvGlBOJJdnqT9rWB3oTVmNVJeC8k3dKe72Vax2DMneXc43fUmM6xSJme4Kp4WyL1wcjIovZ4t1IbaNhCg==, + sc: 3125740649914852441, st: 3125740649914852441, t: 268435457} +body_type: 0 +id: 10018 +loco_command: SWRITE +status_code: 0 diff --git a/scripts/mitmproxy/tests/data/swrite_packet_server.raw b/scripts/mitmproxy/tests/data/swrite_packet_server.raw new file mode 100644 index 0000000..18880dd --- /dev/null +++ b/scripts/mitmproxy/tests/data/swrite_packet_server.raw @@ -0,0 +1,7 @@ +body_length: 73 +body_payload: {c: 9388759392670092, l: 3125740656103546881, m: 1337486070, prevId: 0, + s: 1693554522, status: 0} +body_type: 0 +id: 10018 +loco_command: SWRITE +status_code: 0 diff --git a/scripts/mitmproxy/tests/data/syncmsg_packet_client.raw b/scripts/mitmproxy/tests/data/syncmsg_packet_client.raw new file mode 100644 index 0000000..b71cb1a Binary files /dev/null and b/scripts/mitmproxy/tests/data/syncmsg_packet_client.raw differ diff --git a/scripts/mitmproxy/tests/data/syncmsg_packet_client.yaml b/scripts/mitmproxy/tests/data/syncmsg_packet_client.yaml new file mode 100644 index 0000000..70e2f3f --- /dev/null +++ b/scripts/mitmproxy/tests/data/syncmsg_packet_client.yaml @@ -0,0 +1,6 @@ +body_length: 56 +body_payload: {chatId: 9388759392670092, cnt: 1, cur: 0, max: 3125740656103546881} +body_type: 0 +id: 10019 +loco_command: SYNCMSG +status_code: 0 diff --git a/scripts/mitmproxy/tests/data/syncmsg_packet_server.raw b/scripts/mitmproxy/tests/data/syncmsg_packet_server.raw new file mode 100644 index 0000000..d41205e Binary files /dev/null and b/scripts/mitmproxy/tests/data/syncmsg_packet_server.raw differ diff --git a/scripts/mitmproxy/tests/data/syncmsg_packet_server.yaml b/scripts/mitmproxy/tests/data/syncmsg_packet_server.yaml new file mode 100644 index 0000000..43f876a --- /dev/null +++ b/scripts/mitmproxy/tests/data/syncmsg_packet_server.yaml @@ -0,0 +1,15 @@ +body_length: 402 +body_payload: + chatLogs: + - {attachment: g8M=, authorId: 405368740, chatId: 9388759392670092, logId: 3125740656103546881, + message: rNu7YQ==, msgId: 1337486070, prevId: 0, sInfo: '{"s":"2/V7NhvGlBOJJdnqT9rWB3oTVmNVJeC8k3dKe72Vax2DMneXc43fUmM6xSJme4Kp4WyL1wcjIovZ4t1IbaNhCg==","st":3125740649914852441,"pt":3125722692958571562}', + sendAt: 1693554523, type: 268435457} + isOK: false + jsi: 3125740641498169344 + lastTokenId: 3125740663907061601 + minLogId: 3123783401472000000 + status: 0 +body_type: 0 +id: 10019 +loco_command: SYNCMSG +status_code: 0 diff --git a/scripts/mitmproxy/tests/test_loco_parser.py b/scripts/mitmproxy/tests/test_loco_parser.py new file mode 100644 index 0000000..3afaa55 --- /dev/null +++ b/scripts/mitmproxy/tests/test_loco_parser.py @@ -0,0 +1,219 @@ +import base64 +from pathlib import Path +from typing import Final + +import pytest +import ruamel.yaml +from cryptography.hazmat.primitives import hashes, serialization +from cryptography.hazmat.primitives.asymmetric import padding +from lib.crypto_utils import get_rsa_public_key_pem, rsa_decrypt, rsa_encrypt +from lib.loco_parser import LocoEncryptedPacket, LocoPacket, LocoParser + +yaml = ruamel.yaml.YAML(typ="safe", pure=True) + +_LOCO_ENYCRYPTED_PACKETS_RAW: Final = [ + "blsync_packet_client.raw", + "chatonroom_packet_client.raw", + "chatonroom_packet_server.raw", + "checkin_packet_client.raw", + "empty_loco_packet.raw", + "getlpk_packet_client.raw", + "getlpk_packet_server.raw", + "getmem_packet_client.raw", + "getmem_packet_server.raw", + "getpk_packet_client.raw", + "getpk_packet_server.raw", + "gettoken_packet_client.raw", + "gettoken_packet_server.raw", + "loginlist_packet_client.raw", + "loginlist_packet_client_0.raw", + "screate_packet_client.raw", + "screate_packet_server.raw", + "setpk_packet_client.raw", + "setpk_packet_server.raw", + "setsk_packet_client_0.raw", + "setsk_packet_server.raw", + "swrite_packet_client.raw", + "syncmsg_packet_client.raw", + "syncmsg_packet_server.raw", +] +_LOCO_PACKETS_YAML: Final = [ + "blsync_packet_client.yaml", + "chatonroom_packet_client.yaml", + "chatonroom_packet_server.yaml", + "checkin_packet_client.yaml", + "empty_loco_packet.yaml", + "getlpk_packet_client.yaml", + "getlpk_packet_server.yaml", + "getmem_packet_client.yaml", + "getmem_packet_server.yaml", + "getpk_packet_client.yaml", + "getpk_packet_server.yaml", + "gettoken_packet_client.yaml", + "gettoken_packet_server.yaml", + "loginlist_packet_client.yaml", + "loginlist_packet_client_0.yaml", + "screate_packet_client.yaml", + "screate_packet_server.yaml", + "setpk_packet_client.yaml", + "setpk_packet_server.yaml", + "setsk_packet_client_0.yaml", + "setsk_packet_server.yaml", + "swrite_packet_client.yaml", + "syncmsg_packet_client.yaml", + "syncmsg_packet_server.yaml", +] +_IV: Final = 16 * b"\x00" +_KAKAOTALK_RSA_PUBLIC_KEY: Final = b"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA9itiCdmMHYWJXq4GE0Xm\ncYy2/ifVv7lYZgPkqw2hjhhhPRYBGchuWUrWynqK0lQODvRIOyM3Q9khv8CPKss2\nipkBbQ4HHRSmpR346TbMQrTUjUCDSSfyY8Awy+DjGzWfn46uY0sHutP6wbGNhlmq\nc8mLP1mjAePYXE3QL1o1oWxhMqyRNY/RSrYMnqowt4u1/Fb3TVQ99uq6q7GkSWJC\nW+ALzx8eTHqnDUl7VqIS0EfNrHsExaR8m5HubWjfg8ZGX4+NNd9kNEINXTVfAcGH\nZ6XuMT1bdeW/F3IbAslbfH7Uj3LRTQhZ8iDzG19DIQy73s/IajPmQllFJaDdIr/w\nFQIDAQAB" +_SHARED_SECRET: Final = b"SHARED_SECRET" + + +def get_rsa_2048_key_pair(): + key_pair_pem = b"-----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQD2K2IJ2YwdhYle\nrgYTReZxjLb+J9W/uVhmA+SrDaGOGGE9FgEZyG5ZStbKeorSVA4O9Eg7IzdD2SG/\nwI8qyzaKmQFtDgcdFKalHfjpNsxCtNSNQINJJ/JjwDDL4OMbNZ+fjq5jSwe60/rB\nsY2GWapzyYs/WaMB49hcTdAvWjWhbGEyrJE1j9FKtgyeqjC3i7X8VvdNVD326rqr\nsaRJYkJb4AvPHx5MeqcNSXtWohLQR82sewTFpHybke5taN+DxkZfj40132Q0Qg1d\nNV8BwYdnpe4xPVt15b8XchsCyVt8ftSPctFNCFnyIPMbX0MhDLvez8hqM+ZCWUUl\noN0iv/AVAgMBAAECggEAMUOqWZVHZKsSPDfwcE/3V7cU8hUPwlA54CScUR0nvTOk\n1iA+tSW267i99oSCnqgCrjx17hvUlgfwqJrFLAfCEQeg0O3TP58f4IB4jVeRljHx\nLZmBDJVpfUv7l/mYCZx4JurbfHSKBfohPz0kuQPdyFFHxDRQmnK6HHLYHHndrMGK\nzmuH+DigjPy2WIJvuWnMQE6kMnIdncHu6PpuZb8syryYQSWEgXUeUL96CHdhNwNk\nayXWRli6uqVM9yBYPUHU11V7LrZYoFp3T1P81Gd+SVSUfMumS37l18q7fZXbrRr8\nsRWes75cwulp5KZsmsQVBaMbl4Dm3iClDJ5nSqpPIQKBgQD/FnftIGnKuiSX382J\nJdGHzR2XkYHiiL/zZEkLAT+5NjJRS6UNeK5o/M1L6boPycvytzJmH0jV0sC3X4SY\n7XOGXnmJmnzG2zxDrdge+j+KGJ3i0eTdQBE8+kC1NUCZHSEYRN4MZEzHfAHop5NF\nIaHBbDnqHOudomrb4DrIow6/5QKBgQD3DL/1jK4qIrryWuPzN7cpWft6vwHG7t+q\nnf9a9tjZ5gec/I6TvbM0Qj4ok005NjwUI1BhR2OGoSd/Axd59Xx4P+Q4mNPiysRi\n+ItmQlnV3U6l1m2A2iznF1/2127pQT7NUfaDoX9MNSOzLCCGBWqSktP+FhLD8csU\nHWLNelyMcQKBgA1LxoR9pAYFHdMsvzHe3sUNU/WKiBKeviKZn5ULQ58LzCOgpcHG\nAJFIXAsQ67nW8uJ72gyopMtAaPsl52txNQxT8FHT050p4EJG1XUH5jf0gIZKGnvN\n0xgykxze4bcZZZg2Pry2nanoNNFDqtF3p07FrV8ekslspdVAItBCb4phAoGAO9Ta\nqJ1pkMrYe9mHW2Ai++DPBus7gvJXOPsK3Pzrh9ot/dcssJtAy2c/ppQGH9UCt93V\nmbmwYOqmphwZk2/gtT7EBvD8X/C7nzyShjGLkEAIzCEiZBJyzYTbuOxz8AndK9yt\n1zNFoS89dic5uTuWk+j7bo3p/YqRpE15oEoCIAECgYEA6Sj9AJKKdtdhY1xRTJvh\n6r85iW24EVN1K4eZqNLKiu6l7N1zofxfwXlZPOwE5YYN965xVKGHocwL0dk3Js5C\nw5+hHfxWLomnz+c2tv7kkTJTZzKfSR/6gzsdR4kX9hS2bntQdH137RpobvdGcJGe\nh5FwC5Myfu2oxAqtvX6ii9g=\n-----END PRIVATE KEY-----\n" + return serialization.load_pem_private_key(key_pair_pem, password=None) + + +@pytest.fixture +def parser(): + return LocoParser() + + +@pytest.fixture(params=_LOCO_PACKETS_YAML) +def loco_packet_packet(request): + with open(Path(request.param), encoding="utf-8") as packet_yaml: + loco_packet_dict = yaml.load(packet_yaml) + + return LocoPacket( + loco_packet_dict.get("id"), + loco_packet_dict.get("status_code"), + loco_packet_dict.get("loco_command"), + loco_packet_dict.get("body_type"), + loco_packet_dict.get("body_length"), + loco_packet_dict.get("body_payload"), + ) + + +@pytest.fixture +def loco_encrypted_packet(): + return LocoEncryptedPacket(length=0, iv=_IV, payload=b"") + + +@pytest.fixture(params=zip(_LOCO_ENYCRYPTED_PACKETS_RAW, _LOCO_PACKETS_YAML)) +def loco_zip(request): + return request.param + + +def test_parse(parser, loco_zip): + encrypted_loco_packet_path, loco_packet_yaml_path = loco_zip + + with open(encrypted_loco_packet_path, "rb") as packet_raw, open( + loco_packet_yaml_path, encoding="utf-8" + ) as packet_yaml: + encrypted_loco_packet = packet_raw.read() + loco_packet_dict = yaml.load(packet_yaml) + + parser.parse(encrypted_loco_packet) + + packet = LocoPacket( + loco_packet_dict.get("id"), + loco_packet_dict.get("status_code"), + loco_packet_dict.get("loco_command"), + loco_packet_dict.get("body_type"), + loco_packet_dict.get("body_length"), + loco_packet_dict.get("body_payload"), + ) + + assert parser.loco_packet.get_packet_as_dict() == packet.get_packet_as_dict() + + +def test_inject_public_key(parser, loco_encrypted_packet): + rsa_key_pair = get_rsa_2048_key_pair() + + with open(Path("encrypted_screate_packet_with_mitm_key.raw"), "rb") as packet_raw: + encrypted_screate_packet_with_mitm_key = packet_raw.read() + + with open(Path("screate_loco_packet.yaml"), encoding="utf-8") as packet_yaml: + screate_dict = yaml.load(packet_yaml) + + original_public_key = screate_dict.get("body_payload").get("pi")[0].get("ek") + assert original_public_key + + screate_packet = LocoPacket( + screate_dict.get("id"), + screate_dict.get("status_code"), + screate_dict.get("loco_command"), + screate_dict.get("body_type"), + screate_dict.get("body_length"), + screate_dict.get("body_payload"), + ) + + parser.loco_packet = screate_packet + assert parser.loco_packet + + parser.loco_encrypted_packet = loco_encrypted_packet + assert parser.loco_encrypted_packet + + assert parser.inject_public_key(rsa_key_pair) == ( + original_public_key.encode(), + encrypted_screate_packet_with_mitm_key, + ) + + +def test_get_shared_secret(parser): + rsa_key_pair = get_rsa_2048_key_pair() + + with open( + Path("setsk_loco_packet_sk_enc_with_mitm_key.yaml"), encoding="utf-8" + ) as packet_yaml: + setsk_dict = yaml.load(packet_yaml) + + encrypted_shared_secret = setsk_dict.get("body_payload").get("sk")[0] + decrypted_shared_secret = rsa_decrypt( + base64.b64decode(encrypted_shared_secret), rsa_key_pair + ) + + assert decrypted_shared_secret == _SHARED_SECRET + + setsk_packet = LocoPacket( + setsk_dict.get("id"), + setsk_dict.get("status_code"), + setsk_dict.get("loco_command"), + setsk_dict.get("body_type"), + setsk_dict.get("body_length"), + setsk_dict.get("body_payload"), + ) + + parser.loco_packet = setsk_packet + assert parser.loco_packet + + assert parser.get_shared_secret(rsa_key_pair) == decrypted_shared_secret + + +def test_encrypt_shared_secret(parser, loco_encrypted_packet): + with open(Path("encrypted_setsk_packet.raw"), "rb") as packet_raw: + encrypted_setsk_packet = packet_raw.read() + + with open( + Path("setsk_loco_packet_sk_enc_with_mitm_key.yaml"), encoding="utf-8" + ) as packet_yaml: + setsk_dict = yaml.load(packet_yaml) + + setsk_packet = LocoPacket( + setsk_dict.get("id"), + setsk_dict.get("status_code"), + setsk_dict.get("loco_command"), + setsk_dict.get("body_type"), + setsk_dict.get("body_length"), + setsk_dict.get("body_payload"), + ) + + parser.loco_packet = setsk_packet + assert parser.loco_packet + + parser.loco_encrypted_packet = loco_encrypted_packet + assert parser.loco_encrypted_packet + + assert ( + parser.encrypt_shared_secret(_SHARED_SECRET, _KAKAOTALK_RSA_PUBLIC_KEY) + == encrypted_setsk_packet + )