Files
NF-MSL/modules/__pycache__/msl_mgk.cpython-310.pyc
T

150 lines
24 KiB
Plaintext
Raw Normal View History

2026-05-29 17:53:25 +08:00
o
…Zjj�ã@slddlmZddlZddlZddlZddlZddlZddlZddlZddl m Z m
Z
ddl m Z ddl
mZddlmZddlmZmZmZmZmZmZddlZddlZddlmZdd lmZmZmZdd
l m!Z!dd l"m#Z#m$Z$Gd d
„d
ƒZ%Gdd„de%ƒZ&Gdd„de ƒZ'Gdd„de'ƒZ(Gdd„de'ƒZ)Gdd„de%ƒZ*Gdd„de%ƒZ+Gdd„dƒZ,gd¢Z-dS)é)Ú annotationsN)ÚdatetimeÚtimezone)ÚEnum)ÚBytesIO)ÚPath)ÚAnyÚDictÚListÚOptionalÚTupleÚUnion)ÚAES)ÚHMACÚSHA256ÚSHA384)Úget_random_bytes)ÚpadÚunpadc@óeZdZddd„ZdS)Ú MSLObjectÚreturnÚstrcCsd|jj›d|j›d�S)NÚ<Ú Ú>)Ú __class__Ú__name__Ú__dict__©Úself©r!ú8F:\Pari\PERSONAL-PROJECT\VT-STAGING\k\modules\msl_mgk.pyÚ__repr__szMSLObject.__repr__N©rr)rÚ
__module__Ú __qualname__r#r!r!r!r"rórc@s"eZdZ     d
dd d „ZdS)ÚMSLKeysNÚ
encryptionúOptional[bytes]ÚsignÚ mastertokenúOptional[dict]ÚwrapdataÚderivation_keyrÚNonecCs"||_||_||_||_||_dS©N)r)r+r,r.r/)r r)r+r,r.r/r!r!r"Ú__init__s

zMSLKeys.__init__)NNNNN) r)r*r+r*r,r-r.r*r/r*rr0)rr%r&r2r!r!r!r"r(súr(c@r)ÚSchemerrcCs
t|jƒSr1)rÚvaluerr!r!r"Ú__str__,s
zScheme.__str__Nr$)rr%r&r5r!r!r!r"r3+r'r3c@seZdZdZdS)ÚEntityAuthenticationSchemesÚMGKN)rr%r&Ú
ModelGroupr!r!r!r"r60sr6c@seZdZdZdZdZdS)ÚUserAuthenticationSchemesZEMAIL_PASSWORDZ NETFLIXIDZ
USER_ID_TOKENN)rr%r&Ú
EmailPasswordÚNetflixIDCookiesÚ UserIDTokenr!r!r!r"r94sr9c@s$eZdZddd„Zedd d
„ƒZdS)ÚEntityAuthenticationÚschemer6ÚauthdataúDict[str, Any]rr0cCót|ƒ|_||_dSr1©rr>r?©r r>r?r!r!r"r2;ó

zEntityAuthentication.__init__Úidentityrú'EntityAuthentication'cCs|tjd|iƒS)NrE)r6r8)ÚclsrEr!r!r"r8?ózEntityAuthentication.ModelGroupN)r>r6r?r@rr0)rErrrF)rr%r&r2Ú classmethodr8r!r!r!r"r=:s
r=c@s@eZdZddd„Zedd
d„ƒZeddd„ƒZeddd„ƒZdS)ÚUserAuthenticationr>r9r?r@rr0cCrAr1rBrCr!r!r"r2ErDzUserAuthentication.__init__ÚemailrÚpasswordú'UserAuthentication'cCó|tj||dœƒS)N)rKrL)r9r:)rGrKrLr!r!r"r:Isþz UserAuthentication.EmailPasswordÚ
token_dataÚ signatureÚ master_tokenÚdictcCs|tj||dœ|dœƒS)N)Ú tokendatarP)Ú useridtokenr,)r9r<)rGrOrPrQr!r!r"r<PsþûþzUserAuthentication.UserIDTokenÚ netflixidú
Optional[str]ÚsecurenetflixidcCrN)N)rUrW)r9r;)rGrUrWr!r!r"r;bs þþz#UserAuthentication.NetflixIDCookiesN)r>r9r?r@rr0)rKrrLrrrM)rOrrPrrQrRrrM)rUrVrWrVrrM)rr%r&r2rIr:r<r;r!r!r!r"rJDs
  rJc@sheZdZdZdddœZdZdZdZdZddd d
d dd d
œZ gd¢Z
e   d¡Z
e   d¡Ze gd¢ƒZe ed¡ZdZ  dªd«d#d$„Ze      % d¬d­d1d2„ƒZed®d4d5„ƒZed¯d8d9„ƒZed°d<d=„ƒZed±d@dA„ƒZed²dBdC„ƒZed³dGdH„ƒZed´dKdL„ƒZedµdNdO„ƒZed¶d·dRdS„ƒZ ed¸dUdV„ƒZ!ed¹dYdZ„ƒZ"edºd[d\„ƒZ#ed»d]d^„ƒZ$ed¼d`da„ƒZ%ed½ddde„ƒZ&ed¾dhdi„ƒZ'ed¿dldm„ƒZ(edÀdodp„ƒZ)edÁdrds„ƒZ*edÂdudv„ƒZ+e   wdÃdÄd}d~„ƒZ,e      €dÅdÆd‡dˆ„ƒZ-      dÇdÈdŽd�„Z. d¶dÉd�d‘„Z/dÊd”d•„Z0dËd˜d™„Z1edÌd›dœ„ƒZ2dÍdždŸ„Z3dÎd¡d¢„Z4edÏd¥d¦„ƒZ5edÐd¨d©„ƒZ6dS)ÑÚMSL_MGKz7https://api-global.netflix.com/playapi/nrdjs/manifest/1Údarwinz
2025.2.2.0)Ú ab_ui_verÚnrdapp_versionz{Netflix/2025.2.2.0 (DEVTYPE=NFANDROID2-PRV-NVIDIASHIELDANDROIDTV2019; Milo=1.0.6315; build_number=6315; build_sha=a1b915de)z,{"appstate":"foreground","reason":"unknown"}z v3.11.512z3.0.5z~12.1.6-23045 R 2025.2 android-30-JPLAYER2 ninja_6==NVIDIA/mdarcy/mdarcy:11/RQ1A.210105.003/7825230_4040.2147:user/release-keyszVUI-release-20260303_43809-gibbon-r100-darwinql-69067=5,78214=2,78929=8,80045=1,80048=2Útv_uiz12.1.6)ÚsdkÚplatformÚ applicationÚ uiversionÚ
uiPlatformÚ
clientVersionÚ
apkVersion)zen-CAúen-USÚenZ 027617984f6227539a630b897c017d69Z 809f82a7addf548d3ea9dd067ff9bb91)€é–é”éééØéÙé:éZéÇéLéPé›éKé¼éèé^é’éé,éÑéœéÎéGé}éé~r{éÕé'rjéìé)érƒéðé¸é³éáéêéíroér‡é±é¹éé¢é[é‘é éééârsé4r…éÖé`é²éãé!é­édrnr‡é¨é;é2é�é�ééîr~ééñéäéOéþé‰éWéšéÃr£r{r–éhé¶é·éfé‡éÂr¨r¡é£r�rtr—é(éýééïrˆéˆé#ésr�éöé rŽr»é7r¦éÍéªr’r—r©r–éÀéµéar�éåé éçrféÞr€éßÚbigéNÚsessionúrequests.SessionÚsenderrÚkeysr(Ú
message_idÚintÚ user_authr-ÚcookiesúOptional[Dict[str, str]]rr0cCs(||_||_||_||_||_||_dSr1)rÊrÌrÍrÎrÐrÑ)r rÊrÌrÍrÎrÐrÑr!r!r"r2s  
zMSL_MGK.__init__éÎ1Ú request_nameÚ
user_agentrVÚrefererÚ viewable_idú
Optional[int]Ú profile_guidÚesnÚexpiry_timeoutÚ
extra_headersúDict[str, str]c Cs„|ptjdd|ddtjtjtjddœ
}|durt|ƒ|d<|r#||d<|dur-t|ƒ|d <|r3||d
<|r9||d <|r@| |¡|S) Nz*/*zapplication/jsonÚ1ÚtrueÚ0)
z
User-AgentÚAcceptú Content-TypezX-Netflix.Client.Request.NamezX-Netflix.request.attemptz!X-Netflix.Request.NonJson.Headersz X-Netflix.Request.Client.Contextzx-netflix.client.nrdjs.versionzx-netflix.client.netjs.versionz%x-netflix.client.last-interacted-daysz x-netflix.request.expiry.timeoutÚRefererz+x-netflix.playback.main-content-viewable-idz%x-netflix.client.current-profile-guidzx-netflix.client.ftl.esn)rXÚDEFAULT_USER_AGENTÚDEFAULT_REQUEST_CONTEXTÚDEFAULT_NRDJS_VERSIONÚDEFAULT_NETJS_VERSIONrÚupdate) rÔrÕrÖr×rÙrÚrÛrÜÚheadersr!r!r"Úbuild_request_headers%s0 ö
 
zMSL_MGK.build_request_headersúTuple[str, Dict[str, str]]cCstjttjƒfSr1)rXÚDEFAULT_MANIFEST_ENDPOINTrRÚDEFAULT_MANIFEST_PARAMSr!r!r!r"Úmanifest_request_defaultsQrHz!MSL_MGK.manifest_request_defaultsÚobjr@cCstj|ddd�S)N©ú,ú:F)Ú
separatorsÚ ensure_ascii)ÚjsonÚdumps)rïr!r!r"Ú stable_jsonUrHzMSL_MGK.stable_jsonÚmessageúList[Dict[str, Any]]cCsˆt ¡}g}d}t|ƒ}||krB||kr(|| ¡r(|d7}||kr(|| ¡s||kr/ |S| ||¡\}}| |¡|}||ks|S)Nré)rõÚ JSONDecoderÚlenÚisspaceÚ
raw_decodeÚappend)røÚdecoderÚitemsÚindexÚlengthÚitemÚ
next_indexr!r!r"Úparse_concatenated_jsonYs ÿü
÷ zMSL_MGK.parse_concatenated_jsonr4ÚbytescCst |¡ d¡S)NÚascii)Úbase64Ú b64encodeÚdecode©r4r!r!r"Úb64_encode_bytesmrHzMSL_MGK.b64_encode_bytescCs(| ¡ d¡ d¡}tj| d¡dd�S)Nú"ú'rT)Úvalidate)Ústripr Ú b64decodeÚencode)r4Znormalized_valuer!r!r"Úb64_decode_strictqszMSL_MGK.b64_decode_strictÚfilenameÚenv_nameúOptional[Path]c
Cs¸t |¡}g}|r| t|ƒ¡t ¡ttƒ ¡jg}|D]}| ||¡| |  d|›�¡¡qt
ƒ}|D]"}|  ¡rCt | ¡ƒnt |ƒ} | |vrLq7| 
| ¡| ¡rY|Sq7dS)Nz**/)ÚosÚgetenvrÿrÚcwdÚ__file__ÚresolveÚparentÚextendÚglobÚsetÚexistsrÚaddÚis_file)
rGrrZ env_valueZ
candidatesÚrootsÚrootÚseenÚ candidateÚkeyr!r!r"Úfind_sidecar_filevs$

ÿzMSL_MGK.find_sidecar_fileÚpathrcCs(|jddd� ¡}|std|›�ƒ‚|S)Núutf-8Úignore)ÚencodingÚerrorszEmpty ESNID file: )Ú read_textrÚ
ValueError)r*r4r!r!r"Úload_esnid_file“szMSL_MGK.load_esnid_fileúTuple[bytes, bytes, bytes]c Cs´| ¡}| d¡r|dd…}|jddd� ¡}t dd|¡}| dd¡\}}| |¡}| |¡}t|ƒd kr@t d
t|ƒ›�ƒ‚t|ƒd krOt d t|ƒ›�ƒ‚| 
||¡}|||fS)
Nsér+Ústrict©r.z\s*,\s*rñrúr“z!Kpe must decode to 16 bytes, got rÄz!Kph must decode to 32 bytes, got ) Ú
read_bytesÚ
startswithr rÚreÚsubÚsplitrrür0Úderive_wrapping_key) rGr*ÚrawÚtextÚleftÚrightÚenc_keyÚhmac_keyZwrap_keyr!r!r"Úload_kpe_kph_fileœs
 

   
zMSL_MGK.load_kpe_kph_fileÚ
msl_keys_pathúOptional[MSLKeys]cCs¼|r| ¡sdSt |jdd�¡}t|tƒsdS|jrLt t  
|jd¡ d¡¡  d¡}|durLt j
t|ƒtjd�}|t  tj¡ ¡d}|dkrLdSt|dƒsTd|_t|d ƒs\d|_|S)
Nr+©r-rSZ
expiration)Útzié
r.r/)r#Ú
jsonpickler r/Ú
isinstancer(r,rõÚloadsr rÚgetrÚ
fromtimestamprÏrÚutcÚnowÚ
total_secondsÚhasattrr.r/)rGrCZ loaded_keysZ expiry_valueZexpiryZhours_remainingr!r!r"Úload_cache_data²s* 
ÿþ

zMSL_MGK.load_cache_dataÚmsl_keyscCs,|jjddd�|jtj|dd�dd�dS)NT)ÚparentsÚexist_okr¶)Úindentr+rE)rÚmkdirÚ
write_textrHr)rRrCr!r!r"Ú
cache_keysÐszMSL_MGK.cache_keysÚencryption_key_16Ú hmac_key_32cCstt|ƒdkr
tdƒ‚t|ƒdkrtdƒ‚tj|jtd�}| ||¡tj| ¡td�}| |j¡| ¡dd…S)Nr“zencryptionKey must be 16 bytesrÄzhmacKey must be 32 bytes©Ú digestmod) rür0rÚnewÚ WRAP_SALTrrèÚdigestÚ WRAP_INFO)rGrYrZÚinnerÚouterr!r!r"r;Õs   zMSL_MGK.derive_wrapping_keycCs8|dkrtdƒ‚|dkrdS|j| ¡ddddd�S) Nrzvalue must be non-negativeóéérÈF©Úsigned)r0Úto_bytesÚ
bit_lengthr r!r!r"Úint_to_unsigned_bytesås
zMSL_MGK.int_to_unsigned_bytescCs@d}|D] }|dkr|d7}q|dkr|S||d…}d|S)Nrrúrcr!)r4ÚcountÚbyteÚtrimmedr!r!r"Úcorrect_null_bytesïs
 zMSL_MGK.correct_null_bytesúTuple[int, bytes]cCsNt t t|jƒ¡d¡|jdd}t|j||jƒ}|  |¡}|| 
|¡fS)NrÈr3é) rÏÚ
from_bytesrÚurandomrüÚDH_PRIMEÚDH_PÚpowÚDH_Grjrn)rGÚ private_keyÚ
public_keyZpublic_key_bytesr!r!r"Údh_generate_keypairÿs&
zMSL_MGK.dh_generate_keypairÚdh_private_keyÚserver_public_key_wirecCsX| |¡}|dd…dkr|dd…n|}tj|ddd�}t|||jƒ}| | |¡¡S)NrúrcrÈFrf)rnrÏrqrurtrj)rGrzr{Znormalized_server_public_keyZserver_public_key_rawZserver_public_keyÚ
shared_secretr!r!r"Údh_compute_shared_secret_bytess
 ÿýz&MSL_MGK.dh_compute_shared_secret_bytesr/Úshared_secret_bytesc Csl|durtdƒ‚t |¡ ¡}tj|td�}| |¡| ¡}|dd…}|dd…}| ||¡}|||fS)Nz/derivation key is required for AUTHENTICATED_DHr[r“é0)r0rr]r_rrèr;) rGr/r~Zsalt_keyZ
hmac_valueZraw_key_materialÚencryption_keyrAZ wrapping_keyr!r!r"Úkdf_authenticated_dhs
   
zMSL_MGK.kdf_authenticated_dhÚkey_idÚplaintext_bytescCs`tdƒ}t |tj|¡ t|tjƒ¡}|t |¡  d¡t |¡  d¡ddœ}t
j |dd�  d¡S)Nr“rúAA==)ÚkeyidÚivÚ
ciphertextÚsha256rð©rór+)
rrr]ÚMODE_CBCÚencryptrÚ
block_sizer r
r rõrör)r‚rYrƒr†r‡Úenveloper!r!r"Úmsl_encrypt_v1$s
ÿüzMSL_MGK.msl_encrypt_v1Úenvelope_bytescCsNt | d¡¡}t |d¡}t |d¡}t |tj|¡ |¡}t |tj
ƒS)Nr+r†r‡) rõrJr r rrr]rŠÚdecryptrrŒ)rYr�r�r†r‡Úpadded_plaintextr!r!r"Úmsl_decrypt_v13s
 zMSL_MGK.msl_decrypt_v1Ú
data_bytescCs,tj|td�}| |¡t | ¡¡ d¡S)Nr[r)rr]rrèr r
r_r )rZr“Úsignerr!r!r"Ú msl_sign_b64<s
zMSL_MGK.msl_sign_b64Ú
signature_b64cCs>tj|td�}| |¡| ¡}t |¡}||krtdƒ‚dS)Nr[z5Response signature verification failed: HMAC mismatch)rr]rrèr_r rr0)rZr“r–r”Zexpected_signatureZreceived_signaturer!r!r"Úmsl_verify_sigCs

ÿzMSL_MGK.msl_verify_sigÚGZIPÚ is_handshakeÚboolÚ userauthdataÚkeyrequestdataÚ compressioncCsb|d||r|gngdgdgdœtt tj¡ ¡ƒ|ddœ}|r#||d<|r*|g|d<tj|d d
�S) NTrdÚJSON)ÚcompressionalgosÚ languagesÚencoderformatsF)Ú messageidÚ renewableÚ handshakeÚ capabilitiesÚ timestamprÌÚ
nonreplayabler›rœrðr‰)rÏrrNrrMr¦rõrö)rÎrÌr™r›rœr�Ú header_datar!r!r"Úgenerate_msg_headerMs 
 ýõ
zMSL_MGK.generate_msg_headerr�FÚ kpekph_pathúOptional[Union[str, Path]]réÚtimeoutÚnew_mslú'MSL'c -Cs6d} t dtddƒ¡}
|r|j |¡|rt|ƒnd} |rdn| | ¡} | dur1|||| |
|d�S|s7tdƒ‚|r>t|ƒ}
n | dd¡}
|
sJtd ƒ‚|  |
¡\}}}t
ƒ}| rZ| j nd}| ra| j nd}|ri|rid
nd }|pn|}| 
¡\}}|| | |¡¡d d
œ}|d
krŒ| |¡|d<d|dœ}t |¡j}|j|
|d|dd� d¡}| |||¡}| |
ddddœ¡ d¡}| |||¡}| || |¡| ||¡dœ¡}|| | |¡| ||¡dœ¡7}|j| ||pçi|d�} | jdk�rtd| j›d| jdd…›�ƒ‚| | j¡}!|!�stdƒ‚|!d}"d |"v�r)t |"d ¡ dd!¡}#td"|#›�ƒ‚d#|"v�r;td$t|"ƒdd…›�ƒ‚t  !t |"d#¡ d¡¡}$|$d%}%|%d&}&| t |&d'¡¡}'|& "d¡}(|(�rit |(¡|_ n||_ | #||'¡})| $||)¡\}*}+},|*|_%|+|_&|,|_ |%d(|_'| �r’| (|| ¡|||||
|d�S))Nz>https://www.netflix.com/msl/playapi/cadmium/licensedmanifest/1rrpr•)rÊrÌrÍrÎrÑz)Missing sender or ESNID for MGK handshakeZKpeKphZMSL_KPEKPH_PATHz‡KpeKph was not found. Place KpeKph next to the client, inside a child folder, in the current working directory, or set MSL_KPEKPH_PATH.ÚWRAPr7rÞ)Ú mechanismÚ publickeyZ parametersidr.ZAUTHENTICATED_DH)r>ÚkeydataTr˜)rÎrÌr™rœr�r+Úrú)r¢ÚdataÚsequencenumberÚendofmsg)ÚentityauthdataÚ
headerdatarP©ÚpayloadrP)Úurlr´rér¬éÈzKey exchange failed: HTTP réôz'Key exchange failed: empty MSL responseÚ errordatar,zKey exchange failed: r¸z5Key exchange failed: missing headerdata in response: Úkeyresponsedatar²r±r,))ÚrandomÚrandintrurÑrèrrQÚ RuntimeErrorr)rBr(r.r/ryr
rnr=r8rr©rrŽr÷r•ÚpostÚ status_coder=rr rr rrõrJrKr}r�r)r+r,rX)-rGrÊrÌrªrCrÑrér¬r­ÚendpointrÎÚ
cache_pathÚ cached_keysZresolved_kpekph_pathZentity_encryption_keyZentity_hmac_keyZentity_wrapping_keyrRZcached_wrapdataZcached_derivation_keyr°r/rzZdh_public_key_wireÚkey_dataZkey_request_dataZentity_auth_dataZheader_plaintextZheader_ciphertextZpayload_plaintextZpayload_ciphertextZ request_bodyÚresponseZparsed_responseÚ key_exchangeÚ
decoded_errorÚ header_jsonÚkey_response_dataZresponse_key_datar{Zresponse_wrapdatar|r€Úsign_keyZnext_derivation_keyr!r!r"r¤lsú  û
 ÿ
ÿ ýþ ûúüÿù
ýÿ
þÿü ÿ 

ÿ ÿ
þ
þ
 ûzMSL_MGK.handshakerÅÚparamsÚapplication_dataúOptional[Dict[str, Any]]úTuple[Dict[str, Any], Any]c
CsÊ| |pi|¡}|jj|p|j||pi|pi|j|d�}|jdkr?|jr+|jdd…n|jdd… ¡} t d|j›d| ›�ƒ‚| 
|¡\}
} d|
vrat   t
 |
d d¡¡ d¡¡} t d| ›�ƒ‚|
| fS) N)r»r´rÏrérÑr¬r¼r½zMSL request failed: HTTP rr¾r+z MSL response contains an error: )Úcreate_messagerÊrÃrìrÑrÄr=ÚcontentÚhexrÂÚ
parse_messagerõrJr rrr )
r rÅrÏrÐr›rér¬rørÉZ body_previewÚheaderÚ payload_datarËr!r!r"Ú send_messages& ú
&ÿzMSL_MGK.send_messagec Csà|jd7_| |j|j|jd|dd�¡}tjt | d¡¡  d¡| 
|¡  d¡|j j dœdd�}|