@basmilius/apple-companion-link 0.0.2 → 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +3 -3
- package/dist/index.js.map +3 -3
- package/dist/socket/companionLink.d.ts +1 -0
- package/package.json +1 -1
- package/src/socket/companionLink.ts +6 -0
- package/src/test.ts +3 -0
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import le from"node-dns-sd";import{createInterface as fe}from"node:readline";import{styleText as me}from"node:util";var Ee=fe({input:process.stdin,output:process.stdout});function P(...e){console.debug(me("cyan","[debug]"),...e)}async function D(e){return new Promise((n)=>setTimeout(n,e))}var
|
|
2
|
-
`)),n--,n===0)throw Error("Device not found after serveral tries, aborting.");await D(o)}}static airplay(){return new I(z)}static companionLink(){return new I(L)}static raop(){return new I(j)}}class O extends Number{size;constructor(e,n){super(e);this.size=n}}function k(e,n){return new O(e,n)}class N{value;constructor(e){this.value=e}}function b(e){return new N(e)}class q{value;constructor(e){this.value=e}}function ye(e){return new q(e)}function h(e){let n=e.reduce((r,i)=>r+i.length,0),o=new Uint8Array(n),s=0;for(let r of e)o.set(r,s),s+=r.length;return o}function m(e){return Uint8Array.of(e)}function u(e,n){let o=new Uint8Array(n),s=BigInt(e);for(let r=0;r<n;r++)o[r]=Number(s&0xffn),s>>=8n;return o}function C(e){let n=e.reduce((r,i)=>r+i.length,0),o=new Uint8Array(n),s=0;for(let r of e)o.set(r,s),s+=r.length;return o}function R(e){return V(e,[])}function V(e,n){let o=null;if(e===null||e===void 0)o=m(4);else if(typeof e==="boolean")o=m(e?1:2);else if(e instanceof N){let r=new ArrayBuffer(8);new DataView(r).setFloat64(0,e.value,!0),o=h([m(54),new Uint8Array(r)])}else if(e instanceof q){let r=e.value;if(r<40)o=m(8+r);else if(r<=255)o=C([m(48),u(r,1)]);else if(r<=65535)o=C([m(49),u(r,2)]);else if(r<=4294967295)o=C([m(50),u(r,4)]);else o=C([m(51),u(r,8)])}else if(typeof e==="number")if(!Number.isInteger(e)){let r=new ArrayBuffer(8);new DataView(r).setFloat64(0,e,!0),o=h([m(54),new Uint8Array(r)])}else if(e<40)o=m(8+e);else if(e<=255)o=h([m(48),u(e,1)]);else if(e<=65535)o=h([m(49),u(e,2)]);else if(e<=4294967295)o=h([m(50),u(e,4)]);else o=h([m(51),u(e,8)]);else if(e instanceof O)o=h([m(48+Math.log2(e.size)),u(e.valueOf(),e.size)]);else if(typeof e==="string"){let r=new TextEncoder().encode(e),i=r.length;if(i<=32)o=h([m(64+i),r]);else if(i<=255)o=h([m(97),u(i,1),r]);else if(i<=65535)o=h([m(98),u(i,2),r]);else if(i<=16777215)o=h([m(99),u(i,3),r]);else o=h([m(100),u(i,4),r])}else if(e instanceof Uint8Array||Buffer.isBuffer(e)){let r=e instanceof Uint8Array?e:new Uint8Array(e),i=r.length;if(i<=32)o=h([m(112+i),r]);else if(i<=255)o=h([m(145),u(i,1),r]);else if(i<=65535)o=h([m(146),u(i,2),r]);else o=h([m(147),u(i,4),r])}else if(Array.isArray(e)){let r=h(e.map((t)=>V(t,n))),i=e.length;if(i<=15){if(o=h([m(208+i),r]),i>=15)o=h([o,m(3)])}else o=h([m(223),r,m(3)])}else if(typeof e==="object"){let r=Object.keys(e),i=r.length,t=[];for(let y of r)t.push(V(y,n)),t.push(V(e[y],n));let l;if(i<=15)l=m(224+i);else l=m(239);if(o=C([l,C(t)]),i>=15||n.some((y)=>y===o))o=C([o,m(129)])}else throw TypeError(typeof e);let s=n.findIndex((r)=>r.length===o.length&&r.every((i,t)=>i===o[t]));if(s>=0)if(s<33)o=m(160+s);else if(s<=255)o=h([m(193),u(s,1)]);else if(s<=65535)o=h([m(194),u(s,2)]);else if(s<=4294967295)o=h([m(195),u(s,4)]);else o=h([m(196),u(s,8)]);else if(o.length>1)n.push(o);return o}function H(e){return K(e,[])}function K(e,n){if(e.length===0)throw TypeError("No data to unpack");let o=!0,s=e[0];if(s===1)return[!0,e.subarray(1)];if(s===2)return[!1,e.subarray(1)];if(s===4)return[null,e.subarray(1)];if(s===5)return[e.subarray(1,17),e.subarray(17)];if(s===6)return[E(e,1,8),e.subarray(9)];if(s>=8&&s<=47)return[s-8,e.subarray(1)];if(s===53)return[new DataView(e.buffer,e.byteOffset+1,4).getFloat32(0,!0),e.subarray(5)];if(s===54)return[new DataView(e.buffer,e.byteOffset+1,8).getFloat64(0,!0),e.subarray(9)];if((s&240)===48){let r=2**(s&15),i=E(e,1,r);return[k(i,r),e.subarray(1+r)]}if(s>=64&&s<=96){let r=s-64;return[new TextDecoder().decode(e.subarray(1,1+r)),e.subarray(1+r)]}if(s>=97&&s<=100){let r=s&15,i=E(e,1,r);return[new TextDecoder().decode(e.subarray(1+r,1+r+i)),e.subarray(1+r+i)]}if(s>=112&&s<=144){let r=s-112;return[e.subarray(1,1+r),e.subarray(1+r)]}if(s>=145&&s<=148){let r=1<<(s&15)-1,i=E(e,1,r),t=1+r;return[e.subarray(t,t+i),e.subarray(t+i)]}if((s&240)===208){let r=s&15,i=e.subarray(1),t=[];if(r===15){while(i[0]!==3){let[l,y]=K(i,n);t.push(l),i=y}i=i.subarray(1)}else for(let l=0;l<r;l++){let[y,a]=K(i,n);t.push(y),i=a}return o=!1,[t,i]}if((s&224)===224){let r=s&15,i=e.subarray(1),t={};if(r===15){while(i[0]!==3){let[l,y]=K(i,n),[a,M]=K(y,n);t[l]=a,i=M}i=i.subarray(1)}else for(let l=0;l<r;l++){let[y,a]=K(i,n),[M,v]=K(a,n);t[y]=M,i=v}return o=!1,[t,i]}if(s>=160&&s<=192){let r=s-160;return[n[r],e.subarray(1)]}if(s>=193&&s<=196){let r=s-192,i=E(e,1,r);return[n[i],e.subarray(1+r)]}throw TypeError(`Unknown tag 0x${s.toString(16)}`)}function E(e,n,o){let s=0n;for(let r=o-1;r>=0;r--)s=s<<8n|BigInt(e[n+r]);return Number(s)}import{parse as $}from"@plist/binary.parse";import{serialize as he}from"@plist/binary.serialize";var Y={TransientPairing:16},W={PairSetup:0,PairSetupWithAuth:1,PairVerify:2,AddPairing:3,RemovePairing:4,ListPairing:5},_={M1:1,M2:2,M3:3,M4:4,M5:5,M6:6},c={Method:0,Identifier:1,Salt:2,PublicKey:3,Proof:4,EncryptedData:5,State:6,Error:7,BackOff:8,Certificate:9,Signature:10,Permissions:11,FragmentData:12,FragmentLast:13,Name:17,Flags:19};function T(e){if(e.has(c.BackOff)){let n=e.get(c.BackOff),o=n.readUintLE(0,n.length);throw Error(`Device is busy, try again in ${o} seconds.`)}if(e.has(c.Error))throw Error(`Device returned an error code: ${e.get(c.Error).readUint8()}`);throw console.error(e),Error("Invalid response")}function S(e){let n=[];for(let[o,s]of e){let r;if(typeof s==="number")r=Buffer.from([s]);else r=s;let i=0;do{let t=Math.min(r.length-i,255);if(n.push(o,t),t>0)for(let l=0;l<t;l++)n.push(r[i+l]);i+=t}while(i<r.length)}return Buffer.from(n)}function B(e){let n=new Map,o=0;while(o<e.length){let s=e[o++],r=e[o++],i=new Uint8Array(e).slice(o,o+r);o+=r;let t=n.get(s);if(t)n.set(s,Buffer.concat([t,i]));else n.set(s,Buffer.from(i))}return n}import{randomInt as ge}from"node:crypto";import{Socket as Se}from"node:net";import{createCipher as ue,createDecipher as pe}from"chacha";var ee=12;function x(e,n,o,s,r){n=re(n);let i=pe(e,n);o&&i.setAAD(o),i.setAuthTag(r);let t=i._update(s);return i._final(),t}function A(e,n,o,s){n=re(n);let r=ue(e,n);o&&r.setAAD(o);let i=r._update(s);r._final();let t=r.getAuthTag();return{ciphertext:i,authTag:t}}function re(e){if(e.length>=ee)return e;return Buffer.concat([Buffer.alloc(ee-e.length,0),e])}import{randomBytes as ae}from"node:crypto";import{x25519 as ne}from"@noble/curves/ed25519.js";function X(){let e=ae(32);return{publicKey:ne.getPublicKey(e),secretKey:e}}function G(e,n){return ne.getSharedSecret(e,n)}import{hkdfSync as Pe}from"node:crypto";function g(e){return Buffer.from(Pe(e.hash,e.key,e.salt,e.info,e.length))}class F extends EventTarget{get address(){return this.#r}get port(){return this.#e}#r;#e;constructor(e,n){super();this.#r=e,this.#e=n}async connect(){}}class J extends F{get isEncrypted(){return!!this.#o&&!!this.#i}#r;#e={};#n=Buffer.alloc(0);#s;#o;#c;#i;#t;constructor(e,n){super(e,n);this.#t=ge(0,65536),this.onClose=this.onClose.bind(this),this.onConnect=this.onConnect.bind(this),this.onData=this.onData.bind(this),this.onEnd=this.onEnd.bind(this),this.onError=this.onError.bind(this),this.#r=new Se,this.#r.on("close",this.onClose),this.#r.on("connect",this.onConnect),this.#r.on("data",this.onData),this.#r.on("end",this.onEnd),this.#r.on("error",this.onError)}async connect(){return P(`Connecting to ${this.address}:${this.port}...`),await new Promise((e)=>{this.#r.connect({host:this.address,port:this.port,keepAlive:!0},e)})}async enableEncryption(e,n){this.#o=e,this.#i=n,this.#s=0,this.#c=0}async exchange(e,n){let o=this.#t;return new Promise((s,r)=>{if(we.includes(e))this.#e[-1]=s;else this.#e[o]=s;this.send(e,n).catch(r)})}async send(e,n){let o=this.#t++;n._x??=k(o,8);let s=Buffer.from(R(n)),r=s.byteLength;if(this.isEncrypted&&r>0)r+=16;let i=Buffer.alloc(4);i.writeUint8(e,0),i.writeUintBE(r,1,3);let t;if(this.isEncrypted){let l=Buffer.alloc(12);l.writeBigUInt64LE(BigInt(this.#c++),0);let y=A(this.#i,l,i,s);t=Buffer.concat([i,y.ciphertext,y.authTag])}else t=Buffer.concat([i,s]);return P("Send data frame",this.isEncrypted,Buffer.from(t).toString("hex"),n),new Promise((l,y)=>{this.#r.write(t,(a)=>a&&y(a)),l()})}async onClose(){P(`Connection closed from ${this.address}:${this.port}`)}async onConnect(){P(`Connected to ${this.address}:${this.port}`)}async onData(e){this.#n=Buffer.concat([this.#n,e]);while(this.#n.byteLength>=4){let n=this.#n.subarray(0,4),o=n.readUintBE(1,3);if(this.#n.byteLength<o){P("Not enough data yet, waiting on the next frame..");break}let s=this.#n.subarray(0,4+o);s=await this.#f(s),this.#n=this.#n.subarray(s.byteLength);let r=s.subarray(4);if(_e.includes(n.readInt8()))[r]=H(r);if(P("Decoded OPACK",{header:n,payload:r}),"_x"in r){let i=r._x;if(i in this.#e)(this.#e[i]??null)?.([n,r]),delete this.#e[i];else{let t=r._c,l=Object.keys(t).map((y)=>y.substring(0,-3));for(let y of l)this.dispatchEvent(new CustomEvent(y,{detail:t[y]}))}}else if(this.#e[-1])(this.#e[-1]??null)?.([n,r]),delete this.#e[-1];else P("No handler for message",[n,r])}}async onEnd(){P("Connection ended")}async onError(e){P("Error received",e)}async#f(e){if(!this.isEncrypted)return e;let n=e.subarray(0,4),o=n.readUintBE(1,3),s=e.subarray(4,o+16),r=s.subarray(s.byteLength-16),i=s.subarray(0,s.byteLength-16),t=Buffer.alloc(12);t.writeBigUint64LE(BigInt(this.#s++),0);let l=x(this.#o,t,n,i,r);return Buffer.concat([n,l,r])}}var f={Unknown:0,Noop:1,PS_Start:3,PS_Next:4,PV_Start:5,PV_Next:6,U_OPACK:7,E_OPACK:8,P_OPACK:9,PA_Request:10,PA_Response:11,SessionStartRequest:16,SessionStartResponse:17,SessionData:18,FamilyIdentityRequest:32,FamilyIdentityResponse:33,FamilyIdentityUpdate:34},p={Event:1,Request:2,Response:3},_e=[f.PS_Start,f.PS_Next,f.PV_Start,f.PV_Next,f.U_OPACK,f.E_OPACK,f.P_OPACK],we=[f.PS_Start,f.PS_Next,f.PV_Start,f.PV_Next];import{randomInt as Ce}from"node:crypto";class U{#r;#e;constructor(e,n){this.#r=e,this.#e=n}async fetchMediaControlStatus(){let[,e]=await this.#e.exchange(f.E_OPACK,{_i:"FetchMediaControlStatus",_t:p.Request,_c:{}})}async fetchNowPlayingInfo(){let[,e]=await this.#e.exchange(f.E_OPACK,{_i:"FetchCurrentNowPlayingInfoEvent",_t:p.Request,_c:{}})}async fetchSupportedActions(){let[,e]=await this.#e.exchange(f.E_OPACK,{_i:"FetchSupportedActionsEvent",_t:p.Request,_c:{}})}async getAttentionState(){let[,e]=await this.#e.exchange(f.E_OPACK,{_i:"FetchAttentionState",_t:p.Request,_c:{}}),{_c:n}=w(e);switch(n.state){case 1:return"asleep";case 2:return"screensaver";case 3:return"awake";case 4:return"idle";default:return"unknown"}}async getLaunchableApps(){let[,e]=await this.#e.exchange(f.E_OPACK,{_i:"FetchLaunchableApplicationssEvent",_t:p.Request,_c:{}}),{_c:n}=w(e);return Object.entries(n).map(([o,s])=>({bundleId:o,name:s}))}async getSiriRemoteInfo(){let[,e]=await this.#e.exchange(f.E_OPACK,{_i:"FetchSiriRemoteInfo",_t:p.Request,_c:{}});return $(Buffer.from(e._c.SiriRemoteInfoKey).buffer)}async getUserAccounts(){let[,e]=await this.#e.exchange(f.E_OPACK,{_i:"FetchUserAccountsEvent",_t:p.Request,_c:{}}),{_c:n}=w(e);return Object.entries(n).map(([o,s])=>({accountId:o,name:s}))}async hidCommand(e,n=!1){await this.#e.exchange(f.E_OPACK,{_i:"_hidC",_t:p.Request,_c:{_hBtS:n?1:2,_hidC:Ke[e]}})}async launchApp(e){await this.#e.exchange(f.E_OPACK,{_i:"_launchApp",_t:p.Request,_c:{_bundleID:e}})}async launchUrl(e){await this.#e.exchange(f.E_OPACK,{_i:"_launchApp",_t:p.Request,_c:{_urlS:e}})}async mediaControlCommand(e,n){let[,o]=await this.#e.exchange(f.E_OPACK,{_i:"_mcc",_t:p.Request,_c:{_mcc:Be[e],...n||{}}});return w(o)}async pressButton(e,n="SingleTap",o=500){switch(n){case"DoubleTap":await this.hidCommand(e,!0),await this.hidCommand(e,!1),await this.hidCommand(e,!0),await this.hidCommand(e,!1);break;case"Hold":await this.hidCommand(e,!0),await D(o),await this.hidCommand(e,!1);break;case"SingleTap":await this.hidCommand(e,!0),await this.hidCommand(e,!1);break}}async switchUserAccount(e){await this.#e.exchange(f.E_OPACK,{_i:"SwitchUserAccountEvent",_t:p.Request,_c:{SwitchAccountID:e}})}async _subscribe(e,n){this.#e.addEventListener(e,n),await this.#e.send(f.E_OPACK,{_i:"_interest",_t:p.Event,_c:{_regEvents:[e]}})}async _unsubscribe(e,n){if(n)this.#e.removeEventListener(e,n);await this.#e.send(f.E_OPACK,{_i:"_interest",_t:p.Event,_c:{_deregEvents:[e]}})}async _sessionStart(){let[,e]=await this.#e.exchange(f.E_OPACK,{_i:"_sessionStart",_t:p.Request,_c:{_srvT:"com.apple.tvremoteservices",_sid:Ce(0,4294967295)}});return w(e)}async _systemInfo(e){let[,n]=await this.#e.exchange(f.E_OPACK,{_i:"_systemInfo",_t:p.Request,_c:{_bf:0,_cf:512,_clFl:128,_i:"cafecafecafe",_idsID:e.toString(),_pubID:"FF:70:79:61:74:76",_sf:256,_sv:"170.18",model:"iPhone10,6",name:"Bas Companion Link"}});return w(n)}async _touchStart(){let[,e]=await this.#e.exchange(f.E_OPACK,{_i:"_touchStart",_t:p.Request,_c:{_height:b(1000),_tFl:0,_width:b(1000)}});return w(e)}async _tvrcSessionStart(){let[,e]=await this.#e.exchange(f.E_OPACK,{_i:"TVRCSessionStart",_t:p.Request,_btHP:!1,_inUseProc:"tvremoted",_c:{}});return w(e)}}var Ke={Up:1,Down:2,Left:3,Right:4,Menu:5,Select:6,Home:7,VolumeUp:8,VolumeDown:9,Siri:10,Screensaver:11,Sleep:12,Wake:13,PlayPause:14,ChannelIncrement:15,ChannelDecrement:16,Guide:17,PageUp:18,PageDown:19},Be={Play:1,Pause:2,NextTrack:3,PreviousTrack:4,GetVolume:5,SetVolume:6,SkipBy:7,FastForwardBegin:8,FastForwardEnd:9,RewindBegin:10,RewindEnd:11,GetCaptionSettings:12,SetCaptionSettings:13};function w(e){if(typeof e==="object")return e;throw P("Expected an object.",{obj:e}),Error("Expected an object.")}import{SRP as oe,SrpClient as xe}from"fast-srp-hap";import{v4 as Ae}from"uuid";import Q from"tweetnacl";class se{get name(){return this.#r}get pairingId(){return this.#e}#r;#e;#n;#s;#o;#c;#i;constructor(e,n){this.#n=e,this.#s=n,this.#r="Bas Companion Link",this.#e=Buffer.from(Ae().toUpperCase())}async start(){let e=Q.sign.keyPair();this.#o=Buffer.from(e.publicKey),this.#c=Buffer.from(e.secretKey)}async pin(e){let n=await this.m1(),o=await this.m2(n,await e()),s=await this.m3(o),r=await this.m4(s),i=await this.m5(r),t=await this.m6(r,i);if(!t)throw Error("Pairing failed, could not get accessory keys.");return t}async transient(){let e=await this.m1([[c.Flags,Y.TransientPairing]]),n=await this.m2(e),o=await this.m3(n),s=await this.m4(o),r=g({hash:"sha512",key:s.sharedSecret,length:32,salt:Buffer.from("Control-Salt"),info:Buffer.from("Control-Read-Encryption-Key")}),i=g({hash:"sha512",key:s.sharedSecret,length:32,salt:Buffer.from("Control-Salt"),info:Buffer.from("Control-Write-Encryption-Key")});return{pairingId:this.#e,sharedSecret:s.sharedSecret,accessoryToControllerKey:r,controllerToAccessoryKey:i}}async m1(e=[]){let[,n]=await this.#s.exchange(f.PS_Start,{_pd:S([[c.Method,W.PairSetup],[c.State,_.M1],...e]),_pwTy:1}),o=this.#t(n),s=o.get(c.PublicKey),r=o.get(c.Salt);return{publicKey:s,salt:r}}async m2(e,n=d){let o=await oe.genKey(32);this.#i=new xe(oe.params.hap,e.salt,Buffer.from("Pair-Setup"),Buffer.from(n),o,!0),this.#i.setB(e.publicKey);let s=this.#i.computeA(),r=this.#i.computeM1();return{publicKey:s,proof:r}}async m3(e){let[,n]=await this.#s.exchange(f.PS_Next,{_pd:S([[c.State,_.M3],[c.PublicKey,e.publicKey],[c.Proof,e.proof]]),_pwTy:1});return{serverProof:this.#t(n).get(c.Proof)}}async m4(e){return this.#i.checkM2(e.serverProof),{sharedSecret:this.#i.computeK()}}async m5(e){let n=g({hash:"sha512",key:e.sharedSecret,length:32,salt:Buffer.from("Pair-Setup-Controller-Sign-Salt","utf8"),info:Buffer.from("Pair-Setup-Controller-Sign-Info","utf8")}),o=g({hash:"sha512",key:e.sharedSecret,length:32,salt:Buffer.from("Pair-Setup-Encrypt-Salt","utf8"),info:Buffer.from("Pair-Setup-Encrypt-Info","utf8")}),s=Buffer.concat([n,this.#e,this.#o]),r=Q.sign.detached(s,this.#c),i=S([[c.Identifier,this.#e],[c.PublicKey,this.#o],[c.Signature,Buffer.from(r)],[c.Name,Buffer.from(R({name:this.#r}))]]),{authTag:t,ciphertext:l}=A(o,Buffer.from("PS-Msg05"),null,i),y=Buffer.concat([l,t]),[,a]=await this.#s.exchange(f.PS_Next,{_pd:S([[c.State,_.M5],[c.EncryptedData,y]]),_pwTy:1}),v=this.#t(a).get(c.EncryptedData),ce=v.subarray(0,-16);return{authTag:v.subarray(-16),data:ce,sessionKey:o}}async m6(e,n){let o=x(n.sessionKey,Buffer.from("PS-Msg06"),null,n.data,n.authTag),s=B(o),r=s.get(c.Identifier),i=s.get(c.PublicKey),t=s.get(c.Signature),l=g({hash:"sha512",key:e.sharedSecret,length:32,salt:Buffer.from("Pair-Setup-Accessory-Sign-Salt"),info:Buffer.from("Pair-Setup-Accessory-Sign-Info")}),y=Buffer.concat([l,r,i]);if(!Q.sign.detached.verify(y,t,i))throw Error("Invalid accessory signature.");return{accessoryIdentifier:r.toString(),accessoryLongTermPublicKey:i,pairingId:this.#e,publicKey:this.#o,secretKey:this.#c}}#t(e){if(typeof e!=="object"||e===null)throw Error("Invalid response from receiver.");let n=B(e._pd);if(n.has(c.Error))T(n);return P("Decoded TLV",n),n}}import ie from"tweetnacl";class te{#r;#e;#n;constructor(e,n){this.#r=e,this.#e=n,this.#n=X()}async start(e){let n=await this.#s(),o=await this.#o(e.accessoryIdentifier,e.accessoryLongTermPublicKey,n);return await this.#c(e.pairingId,e.secretKey,o),await this.#i(o)}async#s(){let[,e]=await this.#e.exchange(f.PV_Start,{_pd:S([[c.State,_.M1],[c.PublicKey,Buffer.from(this.#n.publicKey)]]),_auTy:4}),n=this.#t(e),o=n.get(c.PublicKey);return{encryptedData:n.get(c.EncryptedData),serverPublicKey:o}}async#o(e,n,o){let s=Buffer.from(G(this.#n.secretKey,o.serverPublicKey)),r=g({hash:"sha512",key:s,length:32,salt:Buffer.from("Pair-Verify-Encrypt-Salt"),info:Buffer.from("Pair-Verify-Encrypt-Info")}),i=o.encryptedData.subarray(0,-16),t=o.encryptedData.subarray(-16),l=x(r,Buffer.from("PV-Msg02"),null,i,t),y=B(l),a=y.get(c.Identifier),M=y.get(c.Signature);if(a.toString()!==e)throw Error(`Invalid accessory identifier. Expected ${a.toString()} to be ${e}.`);let v=Buffer.concat([o.serverPublicKey,a,this.#n.publicKey]);if(!ie.sign.detached.verify(v,M,n))throw Error("Invalid accessory signature.");return{serverEphemeralPublicKey:o.serverPublicKey,sessionKey:r,sharedSecret:s}}async#c(e,n,o){let s=Buffer.concat([this.#n.publicKey,e,o.serverEphemeralPublicKey]),r=Buffer.from(ie.sign.detached(s,n)),i=S([[c.Identifier,e],[c.Signature,r]]),{authTag:t,ciphertext:l}=A(o.sessionKey,Buffer.from("PV-Msg03"),null,i),y=Buffer.concat([l,t]),[,a]=await this.#e.exchange(f.PV_Next,{_pd:S([[c.State,_.M3],[c.EncryptedData,y]]),_auTy:4});return console.log(this.#t(a)),{}}async#i(e){let n=g({hash:"sha512",key:e.sharedSecret,length:32,salt:Buffer.alloc(0),info:Buffer.from("ServerEncrypt-main")}),o=g({hash:"sha512",key:e.sharedSecret,length:32,salt:Buffer.alloc(0),info:Buffer.from("ClientEncrypt-main")});return{accessoryToControllerKey:n,controllerToAccessoryKey:o}}#t(e){if(typeof e!=="object"||e===null)throw Error("Invalid response from receiver.");let n=B(e._pd);if(n.has(c.Error))T(n);return P("Decoded TLV",n),n}}class Z{get api(){return this.#r}get socket(){return this.#n}get pairing(){return this.#s}get verify(){return this.#o}#r;#e;#n;#s;#o;constructor(e){this.#e=e,this.#n=new J(e.address,e.service.port),this.#r=new U(this,this.#n),this.#s=new se(this,this.#n),this.#o=new te(this,this.#n)}async connect(){await this.#n.connect()}}export{he as serializeBinaryPlist,$ as parseBinaryPlist,k as opackSizedInt,ye as opackInt,b as opackFloat,S as encodeTlv,R as encodeOPack,B as decodeTlv,H as decodeOPack,T as bailTlv,c as TlvValue,_ as TlvState,W as TlvMethod,Y as TlvFlags,I as Discovery,Z as CompanionLink};
|
|
1
|
+
import le from"node-dns-sd";import{createInterface as fe}from"node:readline";import{styleText as me}from"node:util";var Ee=fe({input:process.stdin,output:process.stdout});function P(...e){console.debug(me("cyan","[debug]"),...e)}async function D(e){return new Promise((n)=>setTimeout(n,e))}var z="3939";var L="_airplay._tcp.local",d="_companion-link._tcp.local",j="_raop._tcp.local";class I{#r;constructor(e){this.#r=e}async find(){return await le.discover({name:this.#r})}async findUntil(e,n=10,o=1000){while(n>0){let s=await this.find(),r=s.find((i)=>i.fqdn===e);if(r)return r;if(console.log(),console.log(`Device not found, retrying in ${o}ms...`),console.log(s.map((i)=>` ● ${i.fqdn}`).join(`
|
|
2
|
+
`)),n--,n===0)throw Error("Device not found after serveral tries, aborting.");await D(o)}}static airplay(){return new I(L)}static companionLink(){return new I(d)}static raop(){return new I(j)}}class O extends Number{size;constructor(e,n){super(e);this.size=n}}function b(e,n){return new O(e,n)}class N{value;constructor(e){this.value=e}}function k(e){return new N(e)}class q{value;constructor(e){this.value=e}}function ye(e){return new q(e)}function h(e){let n=e.reduce((r,i)=>r+i.length,0),o=new Uint8Array(n),s=0;for(let r of e)o.set(r,s),s+=r.length;return o}function m(e){return Uint8Array.of(e)}function u(e,n){let o=new Uint8Array(n),s=BigInt(e);for(let r=0;r<n;r++)o[r]=Number(s&0xffn),s>>=8n;return o}function C(e){let n=e.reduce((r,i)=>r+i.length,0),o=new Uint8Array(n),s=0;for(let r of e)o.set(r,s),s+=r.length;return o}function R(e){return V(e,[])}function V(e,n){let o=null;if(e===null||e===void 0)o=m(4);else if(typeof e==="boolean")o=m(e?1:2);else if(e instanceof N){let r=new ArrayBuffer(8);new DataView(r).setFloat64(0,e.value,!0),o=h([m(54),new Uint8Array(r)])}else if(e instanceof q){let r=e.value;if(r<40)o=m(8+r);else if(r<=255)o=C([m(48),u(r,1)]);else if(r<=65535)o=C([m(49),u(r,2)]);else if(r<=4294967295)o=C([m(50),u(r,4)]);else o=C([m(51),u(r,8)])}else if(typeof e==="number")if(!Number.isInteger(e)){let r=new ArrayBuffer(8);new DataView(r).setFloat64(0,e,!0),o=h([m(54),new Uint8Array(r)])}else if(e<40)o=m(8+e);else if(e<=255)o=h([m(48),u(e,1)]);else if(e<=65535)o=h([m(49),u(e,2)]);else if(e<=4294967295)o=h([m(50),u(e,4)]);else o=h([m(51),u(e,8)]);else if(e instanceof O)o=h([m(48+Math.log2(e.size)),u(e.valueOf(),e.size)]);else if(typeof e==="string"){let r=new TextEncoder().encode(e),i=r.length;if(i<=32)o=h([m(64+i),r]);else if(i<=255)o=h([m(97),u(i,1),r]);else if(i<=65535)o=h([m(98),u(i,2),r]);else if(i<=16777215)o=h([m(99),u(i,3),r]);else o=h([m(100),u(i,4),r])}else if(e instanceof Uint8Array||Buffer.isBuffer(e)){let r=e instanceof Uint8Array?e:new Uint8Array(e),i=r.length;if(i<=32)o=h([m(112+i),r]);else if(i<=255)o=h([m(145),u(i,1),r]);else if(i<=65535)o=h([m(146),u(i,2),r]);else o=h([m(147),u(i,4),r])}else if(Array.isArray(e)){let r=h(e.map((t)=>V(t,n))),i=e.length;if(i<=15){if(o=h([m(208+i),r]),i>=15)o=h([o,m(3)])}else o=h([m(223),r,m(3)])}else if(typeof e==="object"){let r=Object.keys(e),i=r.length,t=[];for(let y of r)t.push(V(y,n)),t.push(V(e[y],n));let l;if(i<=15)l=m(224+i);else l=m(239);if(o=C([l,C(t)]),i>=15||n.some((y)=>y===o))o=C([o,m(129)])}else throw TypeError(typeof e);let s=n.findIndex((r)=>r.length===o.length&&r.every((i,t)=>i===o[t]));if(s>=0)if(s<33)o=m(160+s);else if(s<=255)o=h([m(193),u(s,1)]);else if(s<=65535)o=h([m(194),u(s,2)]);else if(s<=4294967295)o=h([m(195),u(s,4)]);else o=h([m(196),u(s,8)]);else if(o.length>1)n.push(o);return o}function H(e){return K(e,[])}function K(e,n){if(e.length===0)throw TypeError("No data to unpack");let o=!0,s=e[0];if(s===1)return[!0,e.subarray(1)];if(s===2)return[!1,e.subarray(1)];if(s===4)return[null,e.subarray(1)];if(s===5)return[e.subarray(1,17),e.subarray(17)];if(s===6)return[E(e,1,8),e.subarray(9)];if(s>=8&&s<=47)return[s-8,e.subarray(1)];if(s===53)return[new DataView(e.buffer,e.byteOffset+1,4).getFloat32(0,!0),e.subarray(5)];if(s===54)return[new DataView(e.buffer,e.byteOffset+1,8).getFloat64(0,!0),e.subarray(9)];if((s&240)===48){let r=2**(s&15),i=E(e,1,r);return[b(i,r),e.subarray(1+r)]}if(s>=64&&s<=96){let r=s-64;return[new TextDecoder().decode(e.subarray(1,1+r)),e.subarray(1+r)]}if(s>=97&&s<=100){let r=s&15,i=E(e,1,r);return[new TextDecoder().decode(e.subarray(1+r,1+r+i)),e.subarray(1+r+i)]}if(s>=112&&s<=144){let r=s-112;return[e.subarray(1,1+r),e.subarray(1+r)]}if(s>=145&&s<=148){let r=1<<(s&15)-1,i=E(e,1,r),t=1+r;return[e.subarray(t,t+i),e.subarray(t+i)]}if((s&240)===208){let r=s&15,i=e.subarray(1),t=[];if(r===15){while(i[0]!==3){let[l,y]=K(i,n);t.push(l),i=y}i=i.subarray(1)}else for(let l=0;l<r;l++){let[y,a]=K(i,n);t.push(y),i=a}return o=!1,[t,i]}if((s&224)===224){let r=s&15,i=e.subarray(1),t={};if(r===15){while(i[0]!==3){let[l,y]=K(i,n),[a,M]=K(y,n);t[l]=a,i=M}i=i.subarray(1)}else for(let l=0;l<r;l++){let[y,a]=K(i,n),[M,v]=K(a,n);t[y]=M,i=v}return o=!1,[t,i]}if(s>=160&&s<=192){let r=s-160;return[n[r],e.subarray(1)]}if(s>=193&&s<=196){let r=s-192,i=E(e,1,r);return[n[i],e.subarray(1+r)]}throw TypeError(`Unknown tag 0x${s.toString(16)}`)}function E(e,n,o){let s=0n;for(let r=o-1;r>=0;r--)s=s<<8n|BigInt(e[n+r]);return Number(s)}import{parse as $}from"@plist/binary.parse";import{serialize as he}from"@plist/binary.serialize";var Y={TransientPairing:16},W={PairSetup:0,PairSetupWithAuth:1,PairVerify:2,AddPairing:3,RemovePairing:4,ListPairing:5},_={M1:1,M2:2,M3:3,M4:4,M5:5,M6:6},c={Method:0,Identifier:1,Salt:2,PublicKey:3,Proof:4,EncryptedData:5,State:6,Error:7,BackOff:8,Certificate:9,Signature:10,Permissions:11,FragmentData:12,FragmentLast:13,Name:17,Flags:19};function T(e){if(e.has(c.BackOff)){let n=e.get(c.BackOff),o=n.readUintLE(0,n.length);throw Error(`Device is busy, try again in ${o} seconds.`)}if(e.has(c.Error))throw Error(`Device returned an error code: ${e.get(c.Error).readUint8()}`);throw console.error(e),Error("Invalid response")}function S(e){let n=[];for(let[o,s]of e){let r;if(typeof s==="number")r=Buffer.from([s]);else r=s;let i=0;do{let t=Math.min(r.length-i,255);if(n.push(o,t),t>0)for(let l=0;l<t;l++)n.push(r[i+l]);i+=t}while(i<r.length)}return Buffer.from(n)}function B(e){let n=new Map,o=0;while(o<e.length){let s=e[o++],r=e[o++],i=new Uint8Array(e).slice(o,o+r);o+=r;let t=n.get(s);if(t)n.set(s,Buffer.concat([t,i]));else n.set(s,Buffer.from(i))}return n}import{randomInt as ge}from"node:crypto";import{Socket as Se}from"node:net";import{createCipher as ue,createDecipher as pe}from"chacha";var ee=12;function x(e,n,o,s,r){n=re(n);let i=pe(e,n);o&&i.setAAD(o),i.setAuthTag(r);let t=i._update(s);return i._final(),t}function A(e,n,o,s){n=re(n);let r=ue(e,n);o&&r.setAAD(o);let i=r._update(s);r._final();let t=r.getAuthTag();return{ciphertext:i,authTag:t}}function re(e){if(e.length>=ee)return e;return Buffer.concat([Buffer.alloc(ee-e.length,0),e])}import{randomBytes as ae}from"node:crypto";import{x25519 as ne}from"@noble/curves/ed25519.js";function X(){let e=ae(32);return{publicKey:ne.getPublicKey(e),secretKey:e}}function G(e,n){return ne.getSharedSecret(e,n)}import{hkdfSync as Pe}from"node:crypto";function g(e){return Buffer.from(Pe(e.hash,e.key,e.salt,e.info,e.length))}class F extends EventTarget{get address(){return this.#r}get port(){return this.#e}#r;#e;constructor(e,n){super();this.#r=e,this.#e=n}async connect(){}}class J extends F{get isEncrypted(){return!!this.#o&&!!this.#i}#r;#e={};#n=Buffer.alloc(0);#s;#o;#c;#i;#t;constructor(e,n){super(e,n);this.#t=ge(0,65536),this.onClose=this.onClose.bind(this),this.onConnect=this.onConnect.bind(this),this.onData=this.onData.bind(this),this.onEnd=this.onEnd.bind(this),this.onError=this.onError.bind(this),this.#r=new Se,this.#r.on("close",this.onClose),this.#r.on("connect",this.onConnect),this.#r.on("data",this.onData),this.#r.on("end",this.onEnd),this.#r.on("error",this.onError)}async connect(){return P(`Connecting to ${this.address}:${this.port}...`),await new Promise((e)=>{this.#r.connect({host:this.address,port:this.port,keepAlive:!0},e)})}async disconnect(){this.#r.destroy()}async enableEncryption(e,n){this.#o=e,this.#i=n,this.#s=0,this.#c=0}async exchange(e,n){let o=this.#t;return new Promise((s,r)=>{if(we.includes(e))this.#e[-1]=s;else this.#e[o]=s;this.send(e,n).catch(r)})}async send(e,n){let o=this.#t++;n._x??=b(o,8);let s=Buffer.from(R(n)),r=s.byteLength;if(this.isEncrypted&&r>0)r+=16;let i=Buffer.alloc(4);i.writeUint8(e,0),i.writeUintBE(r,1,3);let t;if(this.isEncrypted){let l=Buffer.alloc(12);l.writeBigUInt64LE(BigInt(this.#c++),0);let y=A(this.#i,l,i,s);t=Buffer.concat([i,y.ciphertext,y.authTag])}else t=Buffer.concat([i,s]);return P("Send data frame",this.isEncrypted,Buffer.from(t).toString("hex"),n),new Promise((l,y)=>{this.#r.write(t,(a)=>a&&y(a)),l()})}async onClose(){P(`Connection closed from ${this.address}:${this.port}`)}async onConnect(){P(`Connected to ${this.address}:${this.port}`)}async onData(e){this.#n=Buffer.concat([this.#n,e]);while(this.#n.byteLength>=4){let n=this.#n.subarray(0,4),o=n.readUintBE(1,3);if(this.#n.byteLength<o){P("Not enough data yet, waiting on the next frame..");break}let s=this.#n.subarray(0,4+o);s=await this.#f(s),this.#n=this.#n.subarray(s.byteLength);let r=s.subarray(4);if(_e.includes(n.readInt8()))[r]=H(r);if(P("Decoded OPACK",{header:n,payload:r}),"_x"in r){let i=r._x;if(i in this.#e)(this.#e[i]??null)?.([n,r]),delete this.#e[i];else if("_i"in r)this.dispatchEvent(new CustomEvent(r._i,{detail:r._c}));else{let t=r._c,l=Object.keys(t).map((y)=>y.substring(0,-3));for(let y of l)this.dispatchEvent(new CustomEvent(y,{detail:t[y]}))}}else if(this.#e[-1])(this.#e[-1]??null)?.([n,r]),delete this.#e[-1];else P("No handler for message",[n,r])}}async onEnd(){P("Connection ended")}async onError(e){P("Error received",e)}async#f(e){if(!this.isEncrypted)return e;let n=e.subarray(0,4),o=n.readUintBE(1,3),s=e.subarray(4,o+16),r=s.subarray(s.byteLength-16),i=s.subarray(0,s.byteLength-16),t=Buffer.alloc(12);t.writeBigUint64LE(BigInt(this.#s++),0);let l=x(this.#o,t,n,i,r);return Buffer.concat([n,l,r])}}var f={Unknown:0,Noop:1,PS_Start:3,PS_Next:4,PV_Start:5,PV_Next:6,U_OPACK:7,E_OPACK:8,P_OPACK:9,PA_Request:10,PA_Response:11,SessionStartRequest:16,SessionStartResponse:17,SessionData:18,FamilyIdentityRequest:32,FamilyIdentityResponse:33,FamilyIdentityUpdate:34},p={Event:1,Request:2,Response:3},_e=[f.PS_Start,f.PS_Next,f.PV_Start,f.PV_Next,f.U_OPACK,f.E_OPACK,f.P_OPACK],we=[f.PS_Start,f.PS_Next,f.PV_Start,f.PV_Next];import{randomInt as Ce}from"node:crypto";class U{#r;#e;constructor(e,n){this.#r=e,this.#e=n}async fetchMediaControlStatus(){let[,e]=await this.#e.exchange(f.E_OPACK,{_i:"FetchMediaControlStatus",_t:p.Request,_c:{}})}async fetchNowPlayingInfo(){let[,e]=await this.#e.exchange(f.E_OPACK,{_i:"FetchCurrentNowPlayingInfoEvent",_t:p.Request,_c:{}})}async fetchSupportedActions(){let[,e]=await this.#e.exchange(f.E_OPACK,{_i:"FetchSupportedActionsEvent",_t:p.Request,_c:{}})}async getAttentionState(){let[,e]=await this.#e.exchange(f.E_OPACK,{_i:"FetchAttentionState",_t:p.Request,_c:{}}),{_c:n}=w(e);switch(n.state){case 1:return"asleep";case 2:return"screensaver";case 3:return"awake";case 4:return"idle";default:return"unknown"}}async getLaunchableApps(){let[,e]=await this.#e.exchange(f.E_OPACK,{_i:"FetchLaunchableApplicationssEvent",_t:p.Request,_c:{}}),{_c:n}=w(e);return Object.entries(n).map(([o,s])=>({bundleId:o,name:s}))}async getSiriRemoteInfo(){let[,e]=await this.#e.exchange(f.E_OPACK,{_i:"FetchSiriRemoteInfo",_t:p.Request,_c:{}});return $(Buffer.from(e._c.SiriRemoteInfoKey).buffer)}async getUserAccounts(){let[,e]=await this.#e.exchange(f.E_OPACK,{_i:"FetchUserAccountsEvent",_t:p.Request,_c:{}}),{_c:n}=w(e);return Object.entries(n).map(([o,s])=>({accountId:o,name:s}))}async hidCommand(e,n=!1){await this.#e.exchange(f.E_OPACK,{_i:"_hidC",_t:p.Request,_c:{_hBtS:n?1:2,_hidC:Ke[e]}})}async launchApp(e){await this.#e.exchange(f.E_OPACK,{_i:"_launchApp",_t:p.Request,_c:{_bundleID:e}})}async launchUrl(e){await this.#e.exchange(f.E_OPACK,{_i:"_launchApp",_t:p.Request,_c:{_urlS:e}})}async mediaControlCommand(e,n){let[,o]=await this.#e.exchange(f.E_OPACK,{_i:"_mcc",_t:p.Request,_c:{_mcc:Be[e],...n||{}}});return w(o)}async pressButton(e,n="SingleTap",o=500){switch(n){case"DoubleTap":await this.hidCommand(e,!0),await this.hidCommand(e,!1),await this.hidCommand(e,!0),await this.hidCommand(e,!1);break;case"Hold":await this.hidCommand(e,!0),await D(o),await this.hidCommand(e,!1);break;case"SingleTap":await this.hidCommand(e,!0),await this.hidCommand(e,!1);break}}async switchUserAccount(e){await this.#e.exchange(f.E_OPACK,{_i:"SwitchUserAccountEvent",_t:p.Request,_c:{SwitchAccountID:e}})}async _subscribe(e,n){this.#e.addEventListener(e,n),await this.#e.send(f.E_OPACK,{_i:"_interest",_t:p.Event,_c:{_regEvents:[e]}})}async _unsubscribe(e,n){if(n)this.#e.removeEventListener(e,n);await this.#e.send(f.E_OPACK,{_i:"_interest",_t:p.Event,_c:{_deregEvents:[e]}})}async _sessionStart(){let[,e]=await this.#e.exchange(f.E_OPACK,{_i:"_sessionStart",_t:p.Request,_c:{_srvT:"com.apple.tvremoteservices",_sid:Ce(0,4294967295)}});return w(e)}async _systemInfo(e){let[,n]=await this.#e.exchange(f.E_OPACK,{_i:"_systemInfo",_t:p.Request,_c:{_bf:0,_cf:512,_clFl:128,_i:"cafecafecafe",_idsID:e.toString(),_pubID:"FF:70:79:61:74:76",_sf:256,_sv:"170.18",model:"iPhone10,6",name:"Bas Companion Link"}});return w(n)}async _touchStart(){let[,e]=await this.#e.exchange(f.E_OPACK,{_i:"_touchStart",_t:p.Request,_c:{_height:k(1000),_tFl:0,_width:k(1000)}});return w(e)}async _tvrcSessionStart(){let[,e]=await this.#e.exchange(f.E_OPACK,{_i:"TVRCSessionStart",_t:p.Request,_btHP:!1,_inUseProc:"tvremoted",_c:{}});return w(e)}}var Ke={Up:1,Down:2,Left:3,Right:4,Menu:5,Select:6,Home:7,VolumeUp:8,VolumeDown:9,Siri:10,Screensaver:11,Sleep:12,Wake:13,PlayPause:14,ChannelIncrement:15,ChannelDecrement:16,Guide:17,PageUp:18,PageDown:19},Be={Play:1,Pause:2,NextTrack:3,PreviousTrack:4,GetVolume:5,SetVolume:6,SkipBy:7,FastForwardBegin:8,FastForwardEnd:9,RewindBegin:10,RewindEnd:11,GetCaptionSettings:12,SetCaptionSettings:13};function w(e){if(typeof e==="object")return e;throw P("Expected an object.",{obj:e}),Error("Expected an object.")}import{SRP as oe,SrpClient as xe}from"fast-srp-hap";import{v4 as Ae}from"uuid";import Q from"tweetnacl";class se{get name(){return this.#r}get pairingId(){return this.#e}#r;#e;#n;#s;#o;#c;#i;constructor(e,n){this.#n=e,this.#s=n,this.#r="Bas Companion Link",this.#e=Buffer.from(Ae().toUpperCase())}async start(){let e=Q.sign.keyPair();this.#o=Buffer.from(e.publicKey),this.#c=Buffer.from(e.secretKey)}async pin(e){let n=await this.m1(),o=await this.m2(n,await e()),s=await this.m3(o),r=await this.m4(s),i=await this.m5(r),t=await this.m6(r,i);if(!t)throw Error("Pairing failed, could not get accessory keys.");return t}async transient(){let e=await this.m1([[c.Flags,Y.TransientPairing]]),n=await this.m2(e),o=await this.m3(n),s=await this.m4(o),r=g({hash:"sha512",key:s.sharedSecret,length:32,salt:Buffer.from("Control-Salt"),info:Buffer.from("Control-Read-Encryption-Key")}),i=g({hash:"sha512",key:s.sharedSecret,length:32,salt:Buffer.from("Control-Salt"),info:Buffer.from("Control-Write-Encryption-Key")});return{pairingId:this.#e,sharedSecret:s.sharedSecret,accessoryToControllerKey:r,controllerToAccessoryKey:i}}async m1(e=[]){let[,n]=await this.#s.exchange(f.PS_Start,{_pd:S([[c.Method,W.PairSetup],[c.State,_.M1],...e]),_pwTy:1}),o=this.#t(n),s=o.get(c.PublicKey),r=o.get(c.Salt);return{publicKey:s,salt:r}}async m2(e,n=z){let o=await oe.genKey(32);this.#i=new xe(oe.params.hap,e.salt,Buffer.from("Pair-Setup"),Buffer.from(n),o,!0),this.#i.setB(e.publicKey);let s=this.#i.computeA(),r=this.#i.computeM1();return{publicKey:s,proof:r}}async m3(e){let[,n]=await this.#s.exchange(f.PS_Next,{_pd:S([[c.State,_.M3],[c.PublicKey,e.publicKey],[c.Proof,e.proof]]),_pwTy:1});return{serverProof:this.#t(n).get(c.Proof)}}async m4(e){return this.#i.checkM2(e.serverProof),{sharedSecret:this.#i.computeK()}}async m5(e){let n=g({hash:"sha512",key:e.sharedSecret,length:32,salt:Buffer.from("Pair-Setup-Controller-Sign-Salt","utf8"),info:Buffer.from("Pair-Setup-Controller-Sign-Info","utf8")}),o=g({hash:"sha512",key:e.sharedSecret,length:32,salt:Buffer.from("Pair-Setup-Encrypt-Salt","utf8"),info:Buffer.from("Pair-Setup-Encrypt-Info","utf8")}),s=Buffer.concat([n,this.#e,this.#o]),r=Q.sign.detached(s,this.#c),i=S([[c.Identifier,this.#e],[c.PublicKey,this.#o],[c.Signature,Buffer.from(r)],[c.Name,Buffer.from(R({name:this.#r}))]]),{authTag:t,ciphertext:l}=A(o,Buffer.from("PS-Msg05"),null,i),y=Buffer.concat([l,t]),[,a]=await this.#s.exchange(f.PS_Next,{_pd:S([[c.State,_.M5],[c.EncryptedData,y]]),_pwTy:1}),v=this.#t(a).get(c.EncryptedData),ce=v.subarray(0,-16);return{authTag:v.subarray(-16),data:ce,sessionKey:o}}async m6(e,n){let o=x(n.sessionKey,Buffer.from("PS-Msg06"),null,n.data,n.authTag),s=B(o),r=s.get(c.Identifier),i=s.get(c.PublicKey),t=s.get(c.Signature),l=g({hash:"sha512",key:e.sharedSecret,length:32,salt:Buffer.from("Pair-Setup-Accessory-Sign-Salt"),info:Buffer.from("Pair-Setup-Accessory-Sign-Info")}),y=Buffer.concat([l,r,i]);if(!Q.sign.detached.verify(y,t,i))throw Error("Invalid accessory signature.");return{accessoryIdentifier:r.toString(),accessoryLongTermPublicKey:i,pairingId:this.#e,publicKey:this.#o,secretKey:this.#c}}#t(e){if(typeof e!=="object"||e===null)throw Error("Invalid response from receiver.");let n=B(e._pd);if(n.has(c.Error))T(n);return P("Decoded TLV",n),n}}import ie from"tweetnacl";class te{#r;#e;#n;constructor(e,n){this.#r=e,this.#e=n,this.#n=X()}async start(e){let n=await this.#s(),o=await this.#o(e.accessoryIdentifier,e.accessoryLongTermPublicKey,n);return await this.#c(e.pairingId,e.secretKey,o),await this.#i(o)}async#s(){let[,e]=await this.#e.exchange(f.PV_Start,{_pd:S([[c.State,_.M1],[c.PublicKey,Buffer.from(this.#n.publicKey)]]),_auTy:4}),n=this.#t(e),o=n.get(c.PublicKey);return{encryptedData:n.get(c.EncryptedData),serverPublicKey:o}}async#o(e,n,o){let s=Buffer.from(G(this.#n.secretKey,o.serverPublicKey)),r=g({hash:"sha512",key:s,length:32,salt:Buffer.from("Pair-Verify-Encrypt-Salt"),info:Buffer.from("Pair-Verify-Encrypt-Info")}),i=o.encryptedData.subarray(0,-16),t=o.encryptedData.subarray(-16),l=x(r,Buffer.from("PV-Msg02"),null,i,t),y=B(l),a=y.get(c.Identifier),M=y.get(c.Signature);if(a.toString()!==e)throw Error(`Invalid accessory identifier. Expected ${a.toString()} to be ${e}.`);let v=Buffer.concat([o.serverPublicKey,a,this.#n.publicKey]);if(!ie.sign.detached.verify(v,M,n))throw Error("Invalid accessory signature.");return{serverEphemeralPublicKey:o.serverPublicKey,sessionKey:r,sharedSecret:s}}async#c(e,n,o){let s=Buffer.concat([this.#n.publicKey,e,o.serverEphemeralPublicKey]),r=Buffer.from(ie.sign.detached(s,n)),i=S([[c.Identifier,e],[c.Signature,r]]),{authTag:t,ciphertext:l}=A(o.sessionKey,Buffer.from("PV-Msg03"),null,i),y=Buffer.concat([l,t]),[,a]=await this.#e.exchange(f.PV_Next,{_pd:S([[c.State,_.M3],[c.EncryptedData,y]]),_auTy:4});return console.log(this.#t(a)),{}}async#i(e){let n=g({hash:"sha512",key:e.sharedSecret,length:32,salt:Buffer.alloc(0),info:Buffer.from("ServerEncrypt-main")}),o=g({hash:"sha512",key:e.sharedSecret,length:32,salt:Buffer.alloc(0),info:Buffer.from("ClientEncrypt-main")});return{accessoryToControllerKey:n,controllerToAccessoryKey:o}}#t(e){if(typeof e!=="object"||e===null)throw Error("Invalid response from receiver.");let n=B(e._pd);if(n.has(c.Error))T(n);return P("Decoded TLV",n),n}}class Z{get api(){return this.#r}get socket(){return this.#n}get pairing(){return this.#s}get verify(){return this.#o}#r;#e;#n;#s;#o;constructor(e){this.#e=e,this.#n=new J(e.address,e.service.port),this.#r=new U(this,this.#n),this.#s=new se(this,this.#n),this.#o=new te(this,this.#n)}async connect(){await this.#n.connect()}}export{he as serializeBinaryPlist,$ as parseBinaryPlist,b as opackSizedInt,ye as opackInt,k as opackFloat,S as encodeTlv,R as encodeOPack,B as decodeTlv,H as decodeOPack,T as bailTlv,c as TlvValue,_ as TlvState,W as TlvMethod,Y as TlvFlags,I as Discovery,Z as CompanionLink};
|
|
3
3
|
|
|
4
|
-
//# debugId=
|
|
4
|
+
//# debugId=6CE534457516F25564756E2164756E21
|
|
5
5
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
"type Packed = Uint8Array;\ntype ObjectList = Packed[];\n\nclass SizedInt extends Number {\n size: number;\n\n constructor(value: number, size: number) {\n super(value);\n this.size = size;\n }\n}\n\nconst _SIZED_INT_TYPES: Record<number, typeof SizedInt> = {};\n\nexport function sizedInt(value: number, size: number): SizedInt {\n return new SizedInt(value, size);\n}\n\nclass OPACKFloat {\n value: number;\n\n constructor(value: number) {\n this.value = value;\n }\n}\n\nexport function float(value: number) {\n return new OPACKFloat(value);\n}\n\nclass OPACKInt {\n value: number;\n\n constructor(value: number) {\n this.value = value;\n }\n}\n\nexport function int(value: number) {\n return new OPACKInt(value);\n}\n\nfunction concat(arr: Uint8Array[]): Uint8Array {\n const total = arr.reduce((s, a) => s + a.length, 0);\n const out = new Uint8Array(total);\n let off = 0;\n for (const a of arr) {\n out.set(a, off);\n off += a.length;\n }\n return out;\n}\n\nfunction u8(b: number) {\n return Uint8Array.of(b);\n}\n\nfunction uintToLEBytes(value: number | bigint, byteLen: number): Uint8Array {\n const out = new Uint8Array(byteLen);\n let v = BigInt(value);\n for (let i = 0; i < byteLen; i++) {\n out[i] = Number(v & 0xffn);\n v >>= 8n;\n }\n return out;\n}\n\nfunction concatUint8Arrays(arrays: Uint8Array[]): Uint8Array {\n const total = arrays.reduce((sum, a) => sum + a.length, 0);\n const out = new Uint8Array(total);\n let offset = 0;\n for (const a of arrays) {\n out.set(a, offset);\n offset += a.length;\n }\n return out;\n}\n\nexport function pack(data: any): Uint8Array {\n return _pack(data, []);\n}\n\nfunction _pack(data: any, objectList: ObjectList): Uint8Array {\n let packed: Uint8Array | null = null;\n\n if (data === null || data === undefined) packed = u8(0x04);\n else if (typeof data === 'boolean') packed = u8(data ? 0x01 : 0x02);\n else if (data instanceof OPACKFloat) {\n const buf = new ArrayBuffer(8);\n new DataView(buf).setFloat64(0, data.value, true);\n packed = concat([u8(0x36), new Uint8Array(buf)]);\n } else if (data instanceof OPACKInt) {\n const val = data.value;\n if (val < 0x28) packed = u8(0x08 + val);\n else if (val <= 0xff) packed = concatUint8Arrays([u8(0x30), uintToLEBytes(val, 1)]);\n else if (val <= 0xffff) packed = concatUint8Arrays([u8(0x31), uintToLEBytes(val, 2)]);\n else if (val <= 0xffffffff) packed = concatUint8Arrays([u8(0x32), uintToLEBytes(val, 4)]);\n else packed = concatUint8Arrays([u8(0x33), uintToLEBytes(val, 8)]);\n } else if (typeof data === 'number') {\n if (!Number.isInteger(data)) {\n const buf = new ArrayBuffer(8);\n new DataView(buf).setFloat64(0, data, true);\n packed = concat([u8(0x36), new Uint8Array(buf)]);\n } else {\n if (data < 0x28) packed = u8(0x08 + data);\n else if (data <= 0xff) packed = concat([u8(0x30), uintToLEBytes(data, 1)]);\n else if (data <= 0xffff) packed = concat([u8(0x31), uintToLEBytes(data, 2)]);\n else if (data <= 0xffffffff) packed = concat([u8(0x32), uintToLEBytes(data, 4)]);\n else packed = concat([u8(0x33), uintToLEBytes(data, 8)]);\n }\n } else if (data instanceof SizedInt) {\n packed = concat([u8(0x30 + Math.log2(data.size)), uintToLEBytes(data.valueOf(), data.size)]);\n } else if (typeof data === 'string') {\n const b = new TextEncoder().encode(data);\n const len = b.length;\n if (len <= 0x20) packed = concat([u8(0x40 + len), b]);\n else if (len <= 0xff) packed = concat([u8(0x61), uintToLEBytes(len, 1), b]);\n else if (len <= 0xffff) packed = concat([u8(0x62), uintToLEBytes(len, 2), b]);\n else if (len <= 0xffffff) packed = concat([u8(0x63), uintToLEBytes(len, 3), b]);\n else packed = concat([u8(0x64), uintToLEBytes(len, 4), b]);\n } else if (data instanceof Uint8Array || Buffer.isBuffer(data)) {\n const bytes = data instanceof Uint8Array ? data : new Uint8Array(data);\n const len = bytes.length;\n if (len <= 0x20) packed = concat([u8(0x70 + len), bytes]);\n else if (len <= 0xff) packed = concat([u8(0x91), uintToLEBytes(len, 1), bytes]);\n else if (len <= 0xffff) packed = concat([u8(0x92), uintToLEBytes(len, 2), bytes]);\n else packed = concat([u8(0x93), uintToLEBytes(len, 4), bytes]);\n } else if (Array.isArray(data)) {\n const body = concat(data.map(d => _pack(d, objectList)));\n const len = data.length;\n if (len <= 0x0f) {\n packed = concat([u8(0xd0 + len), body]);\n if (len >= 0x0f) packed = concat([packed, u8(0x03)]);\n } else packed = concat([u8(0xdf), body, u8(0x03)]);\n } else if (typeof data === 'object') {\n const keys = Object.keys(data);\n const len = keys.length;\n const pairs: Uint8Array[] = [];\n for (const k of keys) {\n pairs.push(_pack(k, objectList));\n pairs.push(_pack((data as any)[k], objectList));\n }\n let header: Uint8Array;\n if (len <= 0x0f) {\n header = u8(0xE0 + len);\n } else {\n header = u8(0xEF);\n }\n packed = concatUint8Arrays([header, concatUint8Arrays(pairs)]);\n // terminator\n if (len >= 0x0f || objectList.some(v => v === packed)) {\n packed = concatUint8Arrays([packed, u8(0x81)]);\n }\n } else throw new TypeError(typeof data + '');\n\n // Object reuse\n const idx = objectList.findIndex(v => v.length === packed!.length && v.every((x, i) => x === packed![i]));\n if (idx >= 0) {\n if (idx < 0x21) packed = u8(0xA0 + idx);\n else if (idx <= 0xff) packed = concat([u8(0xC1), uintToLEBytes(idx, 1)]);\n else if (idx <= 0xffff) packed = concat([u8(0xC2), uintToLEBytes(idx, 2)]);\n else if (idx <= 0xffffffff) packed = concat([u8(0xC3), uintToLEBytes(idx, 4)]);\n else packed = concat([u8(0xC4), uintToLEBytes(idx, 8)]);\n } else if (packed!.length > 1) objectList.push(packed!);\n\n return packed!;\n}\n\n/* UNPACK */\nexport function unpack(data: Uint8Array): [any, Uint8Array] {\n return _unpack(data, []);\n}\n\nfunction _unpack(data: Uint8Array, objectList: ObjectList): [any, Uint8Array] {\n if (data.length === 0) throw new TypeError('No data to unpack');\n let addToObjectList = true;\n const tag = data[0];\n\n // simple tokens\n if (tag === 0x01) return [true, data.subarray(1)];\n if (tag === 0x02) return [false, data.subarray(1)];\n if (tag === 0x04) return [null, data.subarray(1)];\n if (tag === 0x05) {\n const uuidBytes = data.subarray(1, 17);\n return [uuidBytes, data.subarray(17)];\n }\n if (tag === 0x06) {\n // pyatv: dummy parse as integer (little-endian 8 bytes)\n const val = readLittleEndian(data, 1, 8);\n return [val, data.subarray(9)];\n }\n if (tag >= 0x08 && tag <= 0x2f) return [tag - 8, data.subarray(1)];\n if (tag === 0x35) {\n const view = new DataView(data.buffer, data.byteOffset + 1, 4);\n return [view.getFloat32(0, true), data.subarray(5)];\n }\n if (tag === 0x36) {\n const view = new DataView(data.buffer, data.byteOffset + 1, 8);\n return [view.getFloat64(0, true), data.subarray(9)];\n }\n if ((tag & 0xF0) === 0x30) {\n const noOfBytes = 2 ** (tag & 0xF);\n const val = readLittleEndian(data, 1, noOfBytes);\n const sized = sizedInt(val, noOfBytes);\n return [sized, data.subarray(1 + noOfBytes)];\n }\n if (tag >= 0x40 && tag <= 0x60) {\n const length = tag - 0x40;\n const str = new TextDecoder().decode(data.subarray(1, 1 + length));\n return [str, data.subarray(1 + length)];\n }\n if (tag >= 0x61 && tag <= 0x64) {\n const lenBytes = tag & 0xF;\n const length = readLittleEndian(data, 1, lenBytes);\n const str = new TextDecoder().decode(data.subarray(1 + lenBytes, 1 + lenBytes + length));\n return [str, data.subarray(1 + lenBytes + length)];\n }\n if (tag >= 0x70 && tag <= 0x90) {\n const length = tag - 0x70;\n const bytes = data.subarray(1, 1 + length);\n return [bytes, data.subarray(1 + length)];\n }\n if (tag >= 0x91 && tag <= 0x94) {\n // number of length bytes = 1 << ((tag & 0xF) - 1)\n const noOfBytes = 1 << ((tag & 0xF) - 1);\n const length = readLittleEndian(data, 1, noOfBytes);\n const start = 1 + noOfBytes;\n return [data.subarray(start, start + length), data.subarray(start + length)];\n }\n if ((tag & 0xF0) === 0xD0) {\n const count = tag & 0xF;\n let ptr = data.subarray(1);\n const output: any[] = [];\n if (count === 0xF) {\n // endless list\n while (ptr[0] !== 0x03) {\n const [val, rem] = _unpack(ptr, objectList);\n output.push(val);\n ptr = rem;\n }\n ptr = ptr.subarray(1); // skip terminator\n } else {\n for (let i = 0; i < count; i++) {\n const [val, rem] = _unpack(ptr, objectList);\n output.push(val);\n ptr = rem;\n }\n }\n addToObjectList = false;\n return [output, ptr];\n }\n if ((tag & 0xE0) === 0xE0) {\n const count = tag & 0xF;\n let ptr = data.subarray(1);\n const output: Record<string, any> = {};\n if (count === 0xF) {\n // endless dict\n while (ptr[0] !== 0x03) {\n const [key, rem1] = _unpack(ptr, objectList);\n const [val, rem2] = _unpack(rem1, objectList);\n output[key] = val;\n ptr = rem2;\n }\n ptr = ptr.subarray(1);\n } else {\n for (let i = 0; i < count; i++) {\n const [key, rem1] = _unpack(ptr, objectList);\n const [val, rem2] = _unpack(rem1, objectList);\n output[key] = val;\n ptr = rem2;\n }\n }\n addToObjectList = false;\n return [output, ptr];\n }\n if (tag >= 0xA0 && tag <= 0xC0) {\n const idx = tag - 0xA0;\n return [objectList[idx], data.subarray(1)];\n }\n if (tag >= 0xC1 && tag <= 0xC4) {\n const len = tag - 0xC0;\n const uid = readLittleEndian(data, 1, len);\n return [objectList[uid], data.subarray(1 + len)];\n }\n\n throw new TypeError(`Unknown tag 0x${tag.toString(16)}`);\n}\n\nfunction readLittleEndian(buf: Uint8Array, offset: number, len: number) {\n let v = 0n;\n for (let i = len - 1; i >= 0; i--) v = (v << 8n) | BigInt(buf[offset + i]);\n return Number(v);\n}\n",
|
|
9
9
|
"export { parse } from '@plist/binary.parse';\nexport { serialize } from '@plist/binary.serialize';\n",
|
|
10
10
|
"export const Flags = {\n TransientPairing: 0x10\n} as const;\n\nexport const Method = {\n PairSetup: 0x00,\n PairSetupWithAuth: 0x01,\n PairVerify: 0x02,\n AddPairing: 0x03,\n RemovePairing: 0x04,\n ListPairing: 0x05\n} as const;\n\nexport const State = {\n M1: 0x01,\n M2: 0x02,\n M3: 0x03,\n M4: 0x04,\n M5: 0x05,\n M6: 0x06\n} as const;\n\nexport const Value = {\n Method: 0x00,\n Identifier: 0x01,\n Salt: 0x02,\n PublicKey: 0x03,\n Proof: 0x04,\n EncryptedData: 0x05,\n State: 0x06,\n Error: 0x07,\n BackOff: 0x08,\n Certificate: 0x09,\n Signature: 0x0A,\n Permissions: 0x0B,\n FragmentData: 0x0C,\n FragmentLast: 0x0D,\n\n Name: 0x11,\n Flags: 0x13\n} as const;\n\nexport function bail(data: Map<number, Buffer>): never {\n if (data.has(Value.BackOff)) {\n const buffer = data.get(Value.BackOff);\n const time = buffer.readUintLE(0, buffer.length);\n\n throw new Error(`Device is busy, try again in ${time} seconds.`);\n }\n\n if (data.has(Value.Error)) {\n throw new Error(`Device returned an error code: ${data.get(Value.Error).readUint8()}`);\n }\n\n console.error(data);\n\n throw new Error('Invalid response');\n}\n\nexport function encode(entries: [number, number | Buffer][]): Buffer {\n const chunks: number[] = [];\n\n for (const [type, valueRaw] of entries) {\n let value: Buffer;\n\n if (typeof valueRaw === 'number') {\n value = Buffer.from([valueRaw]);\n } else {\n value = valueRaw;\n }\n\n let offset = 0;\n\n do {\n const len = Math.min(value.length - offset, 255);\n chunks.push(type, len);\n\n if (len > 0) {\n for (let i = 0; i < len; i++) {\n chunks.push(value[offset + i]);\n }\n }\n\n offset += len;\n } while (offset < value.length);\n }\n\n return Buffer.from(chunks);\n}\n\nexport function decode(buf: Buffer): Map<number, Buffer> {\n const map = new Map<number, Buffer>();\n let i = 0;\n\n while (i < buf.length) {\n const type = buf[i++];\n const len = buf[i++];\n\n const value = (new Uint8Array(buf)).slice(i, i + len);\n i += len;\n\n const existing = map.get(type);\n if (existing) {\n map.set(type, Buffer.concat([existing, value]));\n } else {\n map.set(type, Buffer.from(value));\n }\n }\n\n return map;\n}\n",
|
|
11
|
-
"import { randomInt } from 'node:crypto';\nimport { Socket } from 'node:net';\nimport { debug } from '@/cli';\nimport { decryptChacha20, encryptChacha20 } from '@/crypto';\nimport { decodeOPack, encodeOPack, opackSizedInt } from '@/encoding';\nimport BaseSocket from './base';\n\nexport default class extends BaseSocket {\n get isEncrypted(): boolean {\n return !!this.#readKey && !!this.#writeKey;\n }\n\n readonly #socket: Socket;\n readonly #queue: Record<number, Function> = {};\n #buffer: Buffer = Buffer.alloc(0);\n #readCount: number;\n #readKey?: Buffer;\n #writeCount: number;\n #writeKey?: Buffer;\n #xid: number;\n\n constructor(address: string, port: number) {\n super(address, port);\n\n this.#xid = randomInt(0, 2 ** 16);\n\n this.onClose = this.onClose.bind(this);\n this.onConnect = this.onConnect.bind(this);\n this.onData = this.onData.bind(this);\n this.onEnd = this.onEnd.bind(this);\n this.onError = this.onError.bind(this);\n\n this.#socket = new Socket();\n this.#socket.on('close', this.onClose);\n this.#socket.on('connect', this.onConnect);\n this.#socket.on('data', this.onData);\n this.#socket.on('end', this.onEnd);\n this.#socket.on('error', this.onError);\n }\n\n async connect(): Promise<void> {\n debug(`Connecting to ${this.address}:${this.port}...`);\n\n return await new Promise(resolve => {\n this.#socket.connect({\n host: this.address,\n port: this.port,\n keepAlive: true\n }, resolve);\n });\n }\n\n async enableEncryption(readKey: Buffer, writeKey: Buffer): Promise<void> {\n this.#readKey = readKey;\n this.#writeKey = writeKey;\n this.#readCount = 0;\n this.#writeCount = 0;\n }\n\n async exchange(type: number, obj: Record<string, unknown>): Promise<[number, unknown]> {\n const _x = this.#xid;\n\n return new Promise<[number, number]>((resolve, reject) => {\n if (PairFrameTypes.includes(type)) {\n this.#queue[-1] = resolve;\n } else {\n this.#queue[_x] = resolve;\n }\n\n this.send(type, obj).catch(reject);\n });\n }\n\n async send(type: number, obj: Record<string, unknown>): Promise<void> {\n const _x = this.#xid++;\n obj._x ??= opackSizedInt(_x, 8);\n\n let payload = Buffer.from(encodeOPack(obj));\n let payloadLength = payload.byteLength;\n\n if (this.isEncrypted && payloadLength > 0) {\n payloadLength += 16;\n }\n\n const header = Buffer.alloc(4);\n header.writeUint8(type, 0);\n header.writeUintBE(payloadLength, 1, 3);\n\n let data: Buffer;\n\n if (this.isEncrypted) {\n const nonce = Buffer.alloc(12);\n nonce.writeBigUInt64LE(BigInt(this.#writeCount++), 0);\n\n const encrypted = encryptChacha20(this.#writeKey, nonce, header, payload);\n data = Buffer.concat([header, encrypted.ciphertext, encrypted.authTag]);\n } else {\n data = Buffer.concat([header, payload]);\n }\n\n debug('Send data frame', this.isEncrypted, Buffer.from(data).toString('hex'), obj);\n\n return new Promise((resolve, reject) => {\n this.#socket.write(data, err => err && reject(err));\n resolve();\n });\n }\n\n async onClose(): Promise<void> {\n debug(`Connection closed from ${this.address}:${this.port}`);\n }\n\n async onConnect(): Promise<void> {\n debug(`Connected to ${this.address}:${this.port}`);\n }\n\n async onData(buffer: Buffer): Promise<void> {\n // debug('Received data frame', buffer.toString('hex'));\n\n this.#buffer = Buffer.concat([this.#buffer, buffer]);\n\n while (this.#buffer.byteLength >= 4) {\n const header = this.#buffer.subarray(0, 4);\n const payloadLength = header.readUintBE(1, 3);\n\n if (this.#buffer.byteLength < payloadLength) {\n debug('Not enough data yet, waiting on the next frame..');\n break;\n }\n\n let data = this.#buffer.subarray(0, 4 + payloadLength);\n data = await this.#decrypt(data);\n\n this.#buffer = this.#buffer.subarray(data.byteLength);\n\n let payload = data.subarray(4);\n\n if (OPackFrameTypes.includes(header.readInt8())) {\n [payload] = decodeOPack(payload);\n }\n\n debug('Decoded OPACK', {header, payload});\n\n if ('_x' in payload) {\n const _x = (payload as any)._x;\n\n if (_x in this.#queue) {\n const resolve = this.#queue[_x] ?? null;\n resolve?.([header, payload]);\n\n delete this.#queue[_x];\n } else {\n // probably an event\n const content = payload['_c'];\n const keys = Object.keys(content).map(k => k.substring(0, -3));\n\n for (const key of keys) {\n this.dispatchEvent(new CustomEvent(key, {detail: content[key]}));\n }\n }\n } else if (this.#queue[-1]) {\n const _x = -1;\n const resolve = this.#queue[_x] ?? null;\n resolve?.([header, payload]);\n\n delete this.#queue[_x];\n } else {\n debug('No handler for message', [header, payload]);\n }\n }\n }\n\n async onEnd(): Promise<void> {\n debug('Connection ended');\n }\n\n async onError(err: Error): Promise<void> {\n debug('Error received', err);\n }\n\n async #decrypt(data: Buffer): Promise<Buffer> {\n if (!this.isEncrypted) {\n return data;\n }\n\n const header = data.subarray(0, 4);\n const payloadLength = header.readUintBE(1, 3);\n\n const payload = data.subarray(4, payloadLength + 16);\n const authTag = payload.subarray(payload.byteLength - 16);\n const ciphertext = payload.subarray(0, payload.byteLength - 16);\n\n const nonce = Buffer.alloc(12);\n nonce.writeBigUint64LE(BigInt(this.#readCount++), 0);\n\n const decrypted = decryptChacha20(this.#readKey, nonce, header, ciphertext, authTag);\n\n return Buffer.concat([header, decrypted, authTag]);\n }\n}\n\nexport const FrameType = {\n Unknown: 0,\n Noop: 1,\n\n PS_Start: 3,\n PS_Next: 4,\n PV_Start: 5,\n PV_Next: 6,\n\n U_OPACK: 7,\n E_OPACK: 8,\n P_OPACK: 9,\n\n PA_Request: 10,\n PA_Response: 11,\n\n SessionStartRequest: 16,\n SessionStartResponse: 17,\n SessionData: 18,\n\n FamilyIdentityRequest: 32,\n FamilyIdentityResponse: 33,\n FamilyIdentityUpdate: 34\n} as const;\n\nexport const MessageType = {\n Event: 1,\n Request: 2,\n Response: 3\n} as const;\n\nexport const OPackFrameTypes: number[] = [\n FrameType.PS_Start,\n FrameType.PS_Next,\n FrameType.PV_Start,\n FrameType.PV_Next,\n\n FrameType.U_OPACK,\n FrameType.E_OPACK,\n FrameType.P_OPACK\n];\n\nconst PairFrameTypes: number[] = [\n FrameType.PS_Start,\n FrameType.PS_Next,\n FrameType.PV_Start,\n FrameType.PV_Next\n];\n",
|
|
11
|
+
"import { randomInt } from 'node:crypto';\nimport { Socket } from 'node:net';\nimport { debug } from '@/cli';\nimport { decryptChacha20, encryptChacha20 } from '@/crypto';\nimport { decodeOPack, encodeOPack, opackSizedInt } from '@/encoding';\nimport BaseSocket from './base';\n\nexport default class extends BaseSocket {\n get isEncrypted(): boolean {\n return !!this.#readKey && !!this.#writeKey;\n }\n\n readonly #socket: Socket;\n readonly #queue: Record<number, Function> = {};\n #buffer: Buffer = Buffer.alloc(0);\n #readCount: number;\n #readKey?: Buffer;\n #writeCount: number;\n #writeKey?: Buffer;\n #xid: number;\n\n constructor(address: string, port: number) {\n super(address, port);\n\n this.#xid = randomInt(0, 2 ** 16);\n\n this.onClose = this.onClose.bind(this);\n this.onConnect = this.onConnect.bind(this);\n this.onData = this.onData.bind(this);\n this.onEnd = this.onEnd.bind(this);\n this.onError = this.onError.bind(this);\n\n this.#socket = new Socket();\n this.#socket.on('close', this.onClose);\n this.#socket.on('connect', this.onConnect);\n this.#socket.on('data', this.onData);\n this.#socket.on('end', this.onEnd);\n this.#socket.on('error', this.onError);\n }\n\n async connect(): Promise<void> {\n debug(`Connecting to ${this.address}:${this.port}...`);\n\n return await new Promise(resolve => {\n this.#socket.connect({\n host: this.address,\n port: this.port,\n keepAlive: true\n }, resolve);\n });\n }\n\n async disconnect(): Promise<void> {\n this.#socket.destroy();\n }\n\n async enableEncryption(readKey: Buffer, writeKey: Buffer): Promise<void> {\n this.#readKey = readKey;\n this.#writeKey = writeKey;\n this.#readCount = 0;\n this.#writeCount = 0;\n }\n\n async exchange(type: number, obj: Record<string, unknown>): Promise<[number, unknown]> {\n const _x = this.#xid;\n\n return new Promise<[number, number]>((resolve, reject) => {\n if (PairFrameTypes.includes(type)) {\n this.#queue[-1] = resolve;\n } else {\n this.#queue[_x] = resolve;\n }\n\n this.send(type, obj).catch(reject);\n });\n }\n\n async send(type: number, obj: Record<string, unknown>): Promise<void> {\n const _x = this.#xid++;\n obj._x ??= opackSizedInt(_x, 8);\n\n let payload = Buffer.from(encodeOPack(obj));\n let payloadLength = payload.byteLength;\n\n if (this.isEncrypted && payloadLength > 0) {\n payloadLength += 16;\n }\n\n const header = Buffer.alloc(4);\n header.writeUint8(type, 0);\n header.writeUintBE(payloadLength, 1, 3);\n\n let data: Buffer;\n\n if (this.isEncrypted) {\n const nonce = Buffer.alloc(12);\n nonce.writeBigUInt64LE(BigInt(this.#writeCount++), 0);\n\n const encrypted = encryptChacha20(this.#writeKey, nonce, header, payload);\n data = Buffer.concat([header, encrypted.ciphertext, encrypted.authTag]);\n } else {\n data = Buffer.concat([header, payload]);\n }\n\n debug('Send data frame', this.isEncrypted, Buffer.from(data).toString('hex'), obj);\n\n return new Promise((resolve, reject) => {\n this.#socket.write(data, err => err && reject(err));\n resolve();\n });\n }\n\n async onClose(): Promise<void> {\n debug(`Connection closed from ${this.address}:${this.port}`);\n }\n\n async onConnect(): Promise<void> {\n debug(`Connected to ${this.address}:${this.port}`);\n }\n\n async onData(buffer: Buffer): Promise<void> {\n // debug('Received data frame', buffer.toString('hex'));\n\n this.#buffer = Buffer.concat([this.#buffer, buffer]);\n\n while (this.#buffer.byteLength >= 4) {\n const header = this.#buffer.subarray(0, 4);\n const payloadLength = header.readUintBE(1, 3);\n\n if (this.#buffer.byteLength < payloadLength) {\n debug('Not enough data yet, waiting on the next frame..');\n break;\n }\n\n let data = this.#buffer.subarray(0, 4 + payloadLength);\n data = await this.#decrypt(data);\n\n this.#buffer = this.#buffer.subarray(data.byteLength);\n\n let payload = data.subarray(4);\n\n if (OPackFrameTypes.includes(header.readInt8())) {\n [payload] = decodeOPack(payload);\n }\n\n debug('Decoded OPACK', {header, payload});\n\n if ('_x' in payload) {\n const _x = (payload as any)._x;\n\n if (_x in this.#queue) {\n const resolve = this.#queue[_x] ?? null;\n resolve?.([header, payload]);\n\n delete this.#queue[_x];\n } else if ('_i' in payload) {\n this.dispatchEvent(new CustomEvent(payload['_i'] as string, {detail: payload['_c']}));\n } else {\n // probably an event\n const content = payload['_c'];\n const keys = Object.keys(content).map(k => k.substring(0, -3));\n\n for (const key of keys) {\n this.dispatchEvent(new CustomEvent(key, {detail: content[key]}));\n }\n }\n } else if (this.#queue[-1]) {\n const _x = -1;\n const resolve = this.#queue[_x] ?? null;\n resolve?.([header, payload]);\n\n delete this.#queue[_x];\n } else {\n debug('No handler for message', [header, payload]);\n }\n }\n }\n\n async onEnd(): Promise<void> {\n debug('Connection ended');\n }\n\n async onError(err: Error): Promise<void> {\n debug('Error received', err);\n }\n\n async #decrypt(data: Buffer): Promise<Buffer> {\n if (!this.isEncrypted) {\n return data;\n }\n\n const header = data.subarray(0, 4);\n const payloadLength = header.readUintBE(1, 3);\n\n const payload = data.subarray(4, payloadLength + 16);\n const authTag = payload.subarray(payload.byteLength - 16);\n const ciphertext = payload.subarray(0, payload.byteLength - 16);\n\n const nonce = Buffer.alloc(12);\n nonce.writeBigUint64LE(BigInt(this.#readCount++), 0);\n\n const decrypted = decryptChacha20(this.#readKey, nonce, header, ciphertext, authTag);\n\n return Buffer.concat([header, decrypted, authTag]);\n }\n}\n\nexport const FrameType = {\n Unknown: 0,\n Noop: 1,\n\n PS_Start: 3,\n PS_Next: 4,\n PV_Start: 5,\n PV_Next: 6,\n\n U_OPACK: 7,\n E_OPACK: 8,\n P_OPACK: 9,\n\n PA_Request: 10,\n PA_Response: 11,\n\n SessionStartRequest: 16,\n SessionStartResponse: 17,\n SessionData: 18,\n\n FamilyIdentityRequest: 32,\n FamilyIdentityResponse: 33,\n FamilyIdentityUpdate: 34\n} as const;\n\nexport const MessageType = {\n Event: 1,\n Request: 2,\n Response: 3\n} as const;\n\nexport const OPackFrameTypes: number[] = [\n FrameType.PS_Start,\n FrameType.PS_Next,\n FrameType.PV_Start,\n FrameType.PV_Next,\n\n FrameType.U_OPACK,\n FrameType.E_OPACK,\n FrameType.P_OPACK\n];\n\nconst PairFrameTypes: number[] = [\n FrameType.PS_Start,\n FrameType.PS_Next,\n FrameType.PV_Start,\n FrameType.PV_Next\n];\n",
|
|
12
12
|
"import { createCipher, createDecipher } from 'chacha';\n\nconst AUTH_TAG_LENGTH = 16;\nconst NONCE_LENGTH = 12;\n\nexport function decrypt(key: Buffer, nonce: Buffer, add: Buffer | null, ciphertext: Buffer, authTag: Buffer): Buffer {\n nonce = padNonce(nonce);\n\n const decipher = createDecipher(key, nonce);\n add && decipher.setAAD(add);\n decipher.setAuthTag(authTag);\n\n const plaintext = decipher._update(ciphertext);\n decipher._final();\n\n return plaintext;\n}\n\nexport function encrypt(key: Buffer, nonce: Buffer, aad: Buffer | null, plaintext: Buffer): EncryptedData {\n nonce = padNonce(nonce);\n\n const cipher = createCipher(key, nonce);\n aad && cipher.setAAD(aad);\n\n const ciphertext = cipher._update(plaintext);\n cipher._final();\n\n const authTag = cipher.getAuthTag();\n\n return {\n ciphertext: ciphertext,\n authTag: authTag\n };\n}\n\nexport function padNonce(nonce: Buffer): Buffer {\n if (nonce.length >= NONCE_LENGTH) {\n return nonce;\n }\n\n return Buffer.concat([\n Buffer.alloc(NONCE_LENGTH - nonce.length, 0),\n nonce\n ]);\n}\n\n// NOTE\n// Uncomment when Bun supports chacha20-poly1305 out of box.\n//\n// import { createCipheriv, createDecipheriv } from 'node:crypto';\n//\n// export function decrypt(key: Buffer, nonce: Buffer, aad: Buffer | null, ciphertext: Buffer, authTag: Buffer): Buffer {\n// if (nonce.length < NONCE_LENGTH) {\n// nonce = Buffer.concat([\n// Buffer.alloc(NONCE_LENGTH - nonce.length, 0),\n// nonce\n// ]);\n// }\n//\n// const decipher = createDecipheriv('chacha20-poly1305', key, nonce, {authTagLength: AUTH_TAG_LENGTH});\n// aad && decipher.setAAD(aad, {plaintextLength: ciphertext.length});\n// decipher.setAuthTag(authTag);\n//\n// const plaintext = decipher.update(ciphertext);\n// decipher.final();\n//\n// return plaintext;\n// }\n//\n// export function encrypt(key: Buffer, nonce: Buffer, aad: Buffer | null, plaintext: Buffer): EncryptedData {\n// if (nonce.length < NONCE_LENGTH) {\n// nonce = Buffer.concat([\n// Buffer.alloc(NONCE_LENGTH - nonce.length, 0),\n// nonce\n// ]);\n// }\n//\n// const cipher = createCipheriv('chacha20-poly1305', key, nonce, {authTagLength: AUTH_TAG_LENGTH});\n// aad && cipher.setAAD(aad, {plaintextLength: plaintext.length});\n//\n// const ciphertext = cipher.update(plaintext);\n// cipher.final();\n//\n// const authTag = cipher.getAuthTag();\n//\n// return {\n// ciphertext: ciphertext,\n// authTag: authTag\n// };\n// }\n\nexport type EncryptedData = {\n readonly ciphertext: Buffer;\n readonly authTag: Buffer;\n};\n",
|
|
13
13
|
"import { randomBytes } from 'node:crypto';\nimport { x25519 } from '@noble/curves/ed25519.js';\n\nexport function generateKeyPair(): KeyPair {\n const secretKey = randomBytes(32);\n const publicKey = x25519.getPublicKey(secretKey);\n\n return {\n publicKey,\n secretKey\n };\n}\n\nexport function generateSharedSecKey(priKey: Uint8Array, pubKey: Uint8Array): Uint8Array {\n return x25519.getSharedSecret(priKey, pubKey);\n}\n\ninterface KeyPair {\n readonly publicKey: Uint8Array;\n readonly secretKey: Uint8Array;\n}\n",
|
|
14
14
|
"import { hkdfSync } from 'node:crypto';\n\nexport default function (options: HKDFOptions): Buffer {\n return Buffer.from(hkdfSync(options.hash, options.key, options.salt, options.info, options.length));\n}\n\nexport type HKDFOptions = {\n readonly hash: string;\n readonly key: Buffer;\n readonly length: number;\n readonly salt: Buffer;\n readonly info: Buffer;\n};\n",
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
"import tweetnacl, { type BoxKeyPair } from 'tweetnacl';\nimport { debug } from '@/cli';\nimport { decryptChacha20, encryptChacha20, generateCurve25519KeyPair, generateCurve25519SharedSecKey, hkdf } from '@/crypto';\nimport { bailTlv, decodeTlv, encodeTlv, TlvState, TlvValue } from '@/encoding';\nimport { CompanionLinkFrameType, CompanionLinkSocket } from '@/socket';\nimport CompanionLink from '../companionLink';\n\nexport default class {\n readonly #protocol: CompanionLink;\n readonly #socket: CompanionLinkSocket;\n readonly #ephemeralKeyPair: BoxKeyPair;\n\n constructor(protocol: CompanionLink, socket: CompanionLinkSocket) {\n this.#protocol = protocol;\n this.#socket = socket;\n this.#ephemeralKeyPair = generateCurve25519KeyPair();\n }\n\n async start(credentials: Credentials): Promise<AccessoryKeys> {\n const m1 = await this.#m1();\n const m2 = await this.#m2(credentials.accessoryIdentifier, credentials.accessoryLongTermPublicKey, m1);\n\n await this.#m3(credentials.pairingId, credentials.secretKey, m2);\n\n return await this.#m4(m2);\n }\n\n async #m1(): Promise<M1> {\n const [, response] = await this.#socket.exchange(CompanionLinkFrameType.PV_Start, {\n _pd: encodeTlv([\n [TlvValue.State, TlvState.M1],\n [TlvValue.PublicKey, Buffer.from(this.#ephemeralKeyPair.publicKey)]\n ]),\n _auTy: 4\n });\n\n const data = this.#tlv(response);\n const serverPublicKey = data.get(TlvValue.PublicKey);\n const encryptedData = data.get(TlvValue.EncryptedData);\n\n return {\n encryptedData,\n serverPublicKey\n };\n }\n\n async #m2(localAccessoryIdentifier: string, longTermPublicKey: Buffer, m1: M1): Promise<M2> {\n const sharedSecret = Buffer.from(generateCurve25519SharedSecKey(\n this.#ephemeralKeyPair.secretKey,\n m1.serverPublicKey\n ));\n\n const sessionKey = hkdf({\n hash: 'sha512',\n key: sharedSecret,\n length: 32,\n salt: Buffer.from('Pair-Verify-Encrypt-Salt'),\n info: Buffer.from('Pair-Verify-Encrypt-Info')\n });\n\n const encryptedData = m1.encryptedData.subarray(0, -16);\n const encryptedTag = m1.encryptedData.subarray(-16);\n\n const data = decryptChacha20(sessionKey, Buffer.from('PV-Msg02'), null, encryptedData, encryptedTag);\n const tlv = decodeTlv(data);\n\n const accessoryIdentifier = tlv.get(TlvValue.Identifier);\n const accessorySignature = tlv.get(TlvValue.Signature);\n\n if (accessoryIdentifier.toString() !== localAccessoryIdentifier) {\n throw new Error(`Invalid accessory identifier. Expected ${accessoryIdentifier.toString()} to be ${localAccessoryIdentifier}.`);\n }\n\n const accessoryInfo = Buffer.concat([\n m1.serverPublicKey,\n accessoryIdentifier,\n this.#ephemeralKeyPair.publicKey\n ]);\n\n if (!tweetnacl.sign.detached.verify(accessoryInfo, accessorySignature, longTermPublicKey)) {\n throw new Error('Invalid accessory signature.');\n }\n\n return {\n serverEphemeralPublicKey: m1.serverPublicKey,\n sessionKey,\n sharedSecret\n };\n }\n\n async #m3(pairingId: Buffer, secretKey: Buffer, m2: M2): Promise<M3> {\n const iosDeviceInfo = Buffer.concat([\n this.#ephemeralKeyPair.publicKey,\n pairingId,\n m2.serverEphemeralPublicKey\n ]);\n\n const iosDeviceSignature = Buffer.from(tweetnacl.sign.detached(iosDeviceInfo, secretKey));\n\n const innerTlv = encodeTlv([\n [TlvValue.Identifier, pairingId],\n [TlvValue.Signature, iosDeviceSignature]\n ]);\n\n const {authTag, ciphertext} = encryptChacha20(m2.sessionKey, Buffer.from('PV-Msg03'), null, innerTlv);\n const encrypted = Buffer.concat([ciphertext, authTag]);\n\n const [, response] = await this.#socket.exchange(CompanionLinkFrameType.PV_Next, {\n _pd: encodeTlv([\n [TlvValue.State, TlvState.M3],\n [TlvValue.EncryptedData, encrypted]\n ]),\n _auTy: 4\n });\n\n console.log(this.#tlv(response));\n\n return {};\n }\n\n async #m4(m2: M2): Promise<AccessoryKeys> {\n const accessoryToControllerKey = hkdf({\n hash: 'sha512',\n key: m2.sharedSecret,\n length: 32,\n salt: Buffer.alloc(0),\n info: Buffer.from('ServerEncrypt-main')\n });\n\n const controllerToAccessoryKey = hkdf({\n hash: 'sha512',\n key: m2.sharedSecret,\n length: 32,\n salt: Buffer.alloc(0),\n info: Buffer.from('ClientEncrypt-main')\n });\n\n return {\n accessoryToControllerKey,\n controllerToAccessoryKey\n };\n }\n\n #tlv(response: unknown): Map<number, Buffer> {\n if (typeof response !== 'object' || response === null) {\n throw new Error('Invalid response from receiver.');\n }\n\n const data = decodeTlv(response['_pd']);\n\n if (data.has(TlvValue.Error)) {\n bailTlv(data);\n }\n\n debug('Decoded TLV', data);\n\n return data;\n }\n}\n\ntype Credentials = {\n readonly accessoryIdentifier: string;\n readonly accessoryLongTermPublicKey: Buffer;\n readonly pairingId: Buffer;\n readonly publicKey: Buffer;\n readonly secretKey: Buffer;\n};\n\ntype M1 = {\n readonly encryptedData: Buffer;\n readonly serverPublicKey: Buffer;\n};\n\ntype M2 = {\n readonly serverEphemeralPublicKey: Buffer;\n readonly sessionKey: Buffer;\n readonly sharedSecret: Buffer;\n};\n\ntype M3 = {};\n\ntype AccessoryKeys = {\n readonly accessoryToControllerKey: Buffer;\n readonly controllerToAccessoryKey: Buffer;\n};\n",
|
|
19
19
|
"import { Result } from 'node-dns-sd';\nimport { CompanionLinkSocket } from '@/socket';\nimport Api from './api/companionLink';\nimport Pairing from './pairing/companionLink';\nimport Verify from './verify/companionLink';\n\nexport default class CompanionLink {\n get api(): Api {\n return this.#api;\n }\n\n get socket(): CompanionLinkSocket {\n return this.#socket;\n }\n\n get pairing(): Pairing {\n return this.#pairing;\n }\n\n get verify(): Verify {\n return this.#verify;\n }\n\n readonly #api: Api;\n readonly #device: Result;\n readonly #socket: CompanionLinkSocket;\n readonly #pairing: Pairing;\n readonly #verify: Verify;\n\n constructor(device: Result) {\n this.#device = device;\n this.#socket = new CompanionLinkSocket(device.address, device.service.port);\n this.#api = new Api(this, this.#socket);\n this.#pairing = new Pairing(this, this.#socket);\n this.#verify = new Verify(this, this.#socket);\n }\n\n async connect(): Promise<void> {\n await this.#socket.connect();\n }\n}\n"
|
|
20
20
|
],
|
|
21
|
-
"mappings": "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",
|
|
22
|
-
"debugId": "
|
|
21
|
+
"mappings": "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",
|
|
22
|
+
"debugId": "6CE534457516F25564756E2164756E21",
|
|
23
23
|
"names": []
|
|
24
24
|
}
|
|
@@ -4,6 +4,7 @@ export default class extends BaseSocket {
|
|
|
4
4
|
get isEncrypted(): boolean;
|
|
5
5
|
constructor(address: string, port: number);
|
|
6
6
|
connect(): Promise<void>;
|
|
7
|
+
disconnect(): Promise<void>;
|
|
7
8
|
enableEncryption(readKey: Buffer, writeKey: Buffer): Promise<void>;
|
|
8
9
|
exchange(type: number, obj: Record<string, unknown>): Promise<[number, unknown]>;
|
|
9
10
|
send(type: number, obj: Record<string, unknown>): Promise<void>;
|
package/package.json
CHANGED
|
@@ -50,6 +50,10 @@ export default class extends BaseSocket {
|
|
|
50
50
|
});
|
|
51
51
|
}
|
|
52
52
|
|
|
53
|
+
async disconnect(): Promise<void> {
|
|
54
|
+
this.#socket.destroy();
|
|
55
|
+
}
|
|
56
|
+
|
|
53
57
|
async enableEncryption(readKey: Buffer, writeKey: Buffer): Promise<void> {
|
|
54
58
|
this.#readKey = readKey;
|
|
55
59
|
this.#writeKey = writeKey;
|
|
@@ -149,6 +153,8 @@ export default class extends BaseSocket {
|
|
|
149
153
|
resolve?.([header, payload]);
|
|
150
154
|
|
|
151
155
|
delete this.#queue[_x];
|
|
156
|
+
} else if ('_i' in payload) {
|
|
157
|
+
this.dispatchEvent(new CustomEvent(payload['_i'] as string, {detail: payload['_c']}));
|
|
152
158
|
} else {
|
|
153
159
|
// probably an event
|
|
154
160
|
const content = payload['_c'];
|
package/src/test.ts
CHANGED
|
@@ -79,6 +79,9 @@ async function verify(): Promise<void> {
|
|
|
79
79
|
// await protocol.api.mediaControlCommand('Play');
|
|
80
80
|
|
|
81
81
|
// await protocol.api.pressButton('PageUp');
|
|
82
|
+
|
|
83
|
+
// await protocol.api.pressButton('Sleep');
|
|
84
|
+
// await protocol.api.pressButton('Wake');
|
|
82
85
|
}
|
|
83
86
|
|
|
84
87
|
async function handleNowPlayingInfo(evt: CustomEvent): Promise<void> {
|