@basmilius/apple-companion-link 0.0.1 → 0.0.2
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
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
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 d="3939";var z="_airplay._tcp.local",L="_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(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.#t(),o=await this.#f(n,await e()),s=await this.#l(o),r=await this.#y(s),i=await this.#h(r),t=await this.#u(r,i);if(!t)throw Error("Pairing failed, could not get accessory keys.");return t}async transient(){let e=await this.#t([[c.Flags,Y.TransientPairing]]),n=await this.#f(e),o=await this.#l(n),s=await this.#y(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#t(e=[]){let[,n]=await this.#s.exchange(f.PS_Start,{_pd:S([[c.Method,W.PairSetup],[c.State,_.M1],...e]),_pwTy:1}),o=this.#m(n),s=o.get(c.PublicKey),r=o.get(c.Salt);return{publicKey:s,salt:r}}async#f(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#l(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.#m(n).get(c.Proof)}}async#y(e){return this.#i.checkM2(e.serverProof),{sharedSecret:this.#i.computeK()}}async#h(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.#m(a).get(c.EncryptedData),ce=v.subarray(0,-16);return{authTag:v.subarray(-16),data:ce,sessionKey:o}}async#u(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}}#m(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};
|
|
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};
|
|
3
3
|
|
|
4
|
-
//# debugId=
|
|
4
|
+
//# debugId=2A4414637A5C907864756E2164756E21
|
|
5
5
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -14,11 +14,11 @@
|
|
|
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",
|
|
15
15
|
"export default class BaseSocket extends EventTarget {\n get address(): string {\n return this.#address;\n }\n\n get port(): number {\n return this.#port;\n }\n\n readonly #address: string;\n readonly #port: number;\n\n constructor(address: string, port: number) {\n super();\n this.#address = address;\n this.#port = port;\n }\n\n async connect(): Promise<void> {\n }\n}\n",
|
|
16
16
|
"import { randomInt } from 'node:crypto';\nimport { debug, waitFor } from '@/cli';\nimport { opackFloat, parseBinaryPlist } from '@/encoding';\nimport { CompanionLinkFrameType, CompanionLinkMessageType, type CompanionLinkSocket } from '@/socket';\nimport type CompanionLink from '../companionLink';\n\nexport default class Api {\n readonly #protocol: CompanionLink;\n readonly #socket: CompanionLinkSocket;\n\n constructor(protocol: CompanionLink, socket: CompanionLinkSocket) {\n this.#protocol = protocol;\n this.#socket = socket;\n }\n\n async fetchMediaControlStatus(): Promise<void> {\n const [, payload] = await this.#socket.exchange(CompanionLinkFrameType.E_OPACK, {\n _i: 'FetchMediaControlStatus',\n _t: CompanionLinkMessageType.Request,\n _c: {}\n });\n }\n\n async fetchNowPlayingInfo(): Promise<void> {\n const [, payload] = await this.#socket.exchange(CompanionLinkFrameType.E_OPACK, {\n _i: 'FetchCurrentNowPlayingInfoEvent',\n _t: CompanionLinkMessageType.Request,\n _c: {}\n });\n }\n\n async fetchSupportedActions(): Promise<void> {\n const [, payload] = await this.#socket.exchange(CompanionLinkFrameType.E_OPACK, {\n _i: 'FetchSupportedActionsEvent',\n _t: CompanionLinkMessageType.Request,\n _c: {}\n });\n }\n\n async getAttentionState(): Promise<AttentionState> {\n const [, payload] = await this.#socket.exchange(CompanionLinkFrameType.E_OPACK, {\n _i: 'FetchAttentionState',\n _t: CompanionLinkMessageType.Request,\n _c: {}\n });\n\n const {_c} = objectOrFail<AttentionStateResponse>(payload);\n\n switch (_c.state) {\n case 0x01:\n return 'asleep';\n\n case 0x02:\n return 'screensaver';\n\n case 0x03:\n return 'awake';\n\n case 0x04:\n return 'idle';\n\n default:\n return 'unknown';\n }\n }\n\n async getLaunchableApps(): Promise<LaunchableApp[]> {\n const [, payload] = await this.#socket.exchange(CompanionLinkFrameType.E_OPACK, {\n _i: 'FetchLaunchableApplicationssEvent',\n _t: CompanionLinkMessageType.Request,\n _c: {}\n });\n\n const {_c} = objectOrFail<LaunchableAppsResponse>(payload);\n\n return Object.entries(_c).map(([bundleId, name]) => ({\n bundleId,\n name\n }));\n }\n\n async getSiriRemoteInfo(): Promise<any> {\n const [, payload] = await this.#socket.exchange(CompanionLinkFrameType.E_OPACK, {\n _i: 'FetchSiriRemoteInfo',\n _t: CompanionLinkMessageType.Request,\n _c: {}\n });\n\n return parseBinaryPlist(Buffer.from(payload['_c']['SiriRemoteInfoKey']).buffer);\n }\n\n async getUserAccounts(): Promise<UserAccount[]> {\n const [, payload] = await this.#socket.exchange(CompanionLinkFrameType.E_OPACK, {\n _i: 'FetchUserAccountsEvent',\n _t: CompanionLinkMessageType.Request,\n _c: {}\n });\n\n const {_c} = objectOrFail<UserAccountsResponse>(payload);\n\n return Object.entries(_c).map(([accountId, name]) => ({\n accountId,\n name\n }));\n }\n\n async hidCommand(command: keyof typeof HidCommand, down = false): Promise<void> {\n await this.#socket.exchange(CompanionLinkFrameType.E_OPACK, {\n _i: '_hidC',\n _t: CompanionLinkMessageType.Request,\n _c: {\n _hBtS: down ? 1 : 2,\n _hidC: HidCommand[command]\n }\n });\n }\n\n async launchApp(bundleId: string): Promise<void> {\n await this.#socket.exchange(CompanionLinkFrameType.E_OPACK, {\n _i: '_launchApp',\n _t: CompanionLinkMessageType.Request,\n _c: {\n _bundleID: bundleId\n }\n });\n }\n\n async launchUrl(url: string): Promise<void> {\n await this.#socket.exchange(CompanionLinkFrameType.E_OPACK, {\n _i: '_launchApp',\n _t: CompanionLinkMessageType.Request,\n _c: {\n _urlS: url\n }\n });\n }\n\n async mediaControlCommand(command: keyof typeof MediaControlCommand, content?: object): Promise<object> {\n const [, payload] = await this.#socket.exchange(CompanionLinkFrameType.E_OPACK, {\n _i: '_mcc',\n _t: CompanionLinkMessageType.Request,\n _c: {\n _mcc: MediaControlCommand[command],\n ...(content || {})\n }\n });\n\n return objectOrFail(payload);\n }\n\n async pressButton(command: keyof typeof HidCommand, type: ButtonPressType = 'SingleTap', holdDelayMs = 500): Promise<void> {\n switch (type) {\n case 'DoubleTap':\n await this.hidCommand(command, true);\n await this.hidCommand(command, false);\n\n await this.hidCommand(command, true);\n await this.hidCommand(command, false);\n break;\n\n case 'Hold':\n await this.hidCommand(command, true);\n await waitFor(holdDelayMs);\n await this.hidCommand(command, false);\n break;\n\n case 'SingleTap':\n await this.hidCommand(command, true);\n await this.hidCommand(command, false);\n break;\n }\n }\n\n async switchUserAccount(accountId: string): Promise<void> {\n await this.#socket.exchange(CompanionLinkFrameType.E_OPACK, {\n _i: 'SwitchUserAccountEvent',\n _t: CompanionLinkMessageType.Request,\n _c: {\n SwitchAccountID: accountId\n }\n });\n }\n\n async _subscribe(event: string, fn: EventListener): Promise<void> {\n this.#socket.addEventListener(event, fn);\n\n await this.#socket.send(CompanionLinkFrameType.E_OPACK, {\n _i: '_interest',\n _t: CompanionLinkMessageType.Event,\n _c: {\n _regEvents: [event]\n }\n });\n }\n\n async _unsubscribe(event: string, fn?: EventListener): Promise<void> {\n if (fn) {\n this.#socket.removeEventListener(event, fn);\n }\n\n await this.#socket.send(CompanionLinkFrameType.E_OPACK, {\n _i: '_interest',\n _t: CompanionLinkMessageType.Event,\n _c: {\n _deregEvents: [event]\n }\n });\n }\n\n async _sessionStart(): Promise<object> {\n const [, payload] = await this.#socket.exchange(CompanionLinkFrameType.E_OPACK, {\n _i: '_sessionStart',\n _t: CompanionLinkMessageType.Request,\n _c: {\n _srvT: 'com.apple.tvremoteservices',\n _sid: randomInt(0, 2 ** 32 - 1)\n }\n });\n\n return objectOrFail(payload);\n }\n\n async _systemInfo(pairingId: Buffer): Promise<object> {\n const [, payload] = await this.#socket.exchange(CompanionLinkFrameType.E_OPACK, {\n _i: '_systemInfo',\n _t: CompanionLinkMessageType.Request,\n _c: {\n _bf: 0,\n _cf: 512,\n _clFl: 128,\n _i: 'cafecafecafe',\n _idsID: pairingId.toString(),\n _pubID: 'FF:70:79:61:74:76',\n _sf: 256,\n _sv: '170.18',\n model: 'iPhone10,6',\n name: 'Bas Companion Link'\n }\n });\n\n return objectOrFail(payload);\n }\n\n async _touchStart(): Promise<object> {\n const [, payload] = await this.#socket.exchange(CompanionLinkFrameType.E_OPACK, {\n _i: '_touchStart',\n _t: CompanionLinkMessageType.Request,\n _c: {\n _height: opackFloat(1000.0),\n _tFl: 0,\n _width: opackFloat(1000.0)\n }\n });\n\n return objectOrFail(payload);\n }\n\n async _tvrcSessionStart(): Promise<object> {\n const [, payload] = await this.#socket.exchange(CompanionLinkFrameType.E_OPACK, {\n _i: 'TVRCSessionStart',\n _t: CompanionLinkMessageType.Request,\n _btHP: false,\n _inUseProc: 'tvremoted',\n _c: {}\n });\n\n return objectOrFail(payload);\n }\n}\n\nconst HidCommand = {\n Up: 1,\n Down: 2,\n Left: 3,\n Right: 4,\n Menu: 5,\n Select: 6,\n Home: 7,\n VolumeUp: 8,\n VolumeDown: 9,\n Siri: 10,\n Screensaver: 11,\n Sleep: 12,\n Wake: 13,\n PlayPause: 14,\n ChannelIncrement: 15,\n ChannelDecrement: 16,\n Guide: 17,\n PageUp: 18,\n PageDown: 19\n} as const;\n\nconst MediaControlCommand = {\n Play: 1,\n Pause: 2,\n NextTrack: 3,\n PreviousTrack: 4,\n GetVolume: 5,\n SetVolume: 6,\n SkipBy: 7,\n FastForwardBegin: 8,\n FastForwardEnd: 9,\n RewindBegin: 10,\n RewindEnd: 11,\n GetCaptionSettings: 12,\n SetCaptionSettings: 13\n} as const;\n\ntype ButtonPressType =\n | 'DoubleTap'\n | 'Hold'\n | 'SingleTap';\n\nfunction objectOrFail<T = object>(obj: unknown): T {\n if (typeof obj === 'object') {\n return obj as T;\n }\n\n debug('Expected an object.', {obj});\n\n throw new Error('Expected an object.');\n}\n\ntype AttentionState =\n | 'unknown'\n | 'asleep'\n | 'screensaver'\n | 'awake'\n | 'idle';\n\ntype AttentionStateResponse = {\n readonly _c: {\n readonly state: number;\n };\n};\n\ntype LaunchableApp = {\n readonly bundleId: string;\n readonly name: string;\n};\n\ntype LaunchableAppsResponse = {\n readonly _c: Record<string, string>;\n};\n\ntype UserAccount = {\n readonly accountId: string;\n readonly name: string;\n};\n\ntype UserAccountsResponse = {\n readonly _c: Record<string, string>;\n};\n",
|
|
17
|
-
"import { CompanionLinkFrameType, type CompanionLinkSocket } from '@/socket';\nimport { SRP, SrpClient } from 'fast-srp-hap';\nimport { v4 as uuid } from 'uuid';\nimport tweetnacl from 'tweetnacl';\nimport { debug } from '@/cli';\nimport { AIRPLAY_TRANSIENT_PIN } from '@/const';\nimport { decryptChacha20, encryptChacha20, hkdf } from '@/crypto';\nimport { bailTlv, decodeTlv, encodeOPack, encodeTlv, TlvFlags, TlvMethod, TlvState, TlvValue } from '@/encoding';\nimport CompanionLink from '../companionLink';\n\nexport default class {\n get name(): string {\n return this.#name;\n }\n\n get pairingId(): Buffer {\n return this.#pairingId;\n }\n\n readonly #name: string;\n readonly #pairingId: Buffer;\n readonly #protocol: CompanionLink;\n readonly #socket: CompanionLinkSocket;\n #publicKey: Buffer;\n #secretKey: Buffer;\n #srp: SrpClient;\n\n constructor(protocol: CompanionLink, socket: CompanionLinkSocket) {\n this.#protocol = protocol;\n this.#socket = socket;\n\n this.#name = 'Bas Companion Link';\n this.#pairingId = Buffer.from(uuid().toUpperCase());\n }\n\n async start(): Promise<void> {\n const keyPair = tweetnacl.sign.keyPair();\n this.#publicKey = Buffer.from(keyPair.publicKey);\n this.#secretKey = Buffer.from(keyPair.secretKey);\n }\n\n async pin(askPin: () => Promise<string>): Promise<PairingCredentials> {\n const m1 = await this
|
|
17
|
+
"import { CompanionLinkFrameType, type CompanionLinkSocket } from '@/socket';\nimport { SRP, SrpClient } from 'fast-srp-hap';\nimport { v4 as uuid } from 'uuid';\nimport tweetnacl from 'tweetnacl';\nimport { debug } from '@/cli';\nimport { AIRPLAY_TRANSIENT_PIN } from '@/const';\nimport { decryptChacha20, encryptChacha20, hkdf } from '@/crypto';\nimport { bailTlv, decodeTlv, encodeOPack, encodeTlv, TlvFlags, TlvMethod, TlvState, TlvValue } from '@/encoding';\nimport CompanionLink from '../companionLink';\n\nexport default class {\n get name(): string {\n return this.#name;\n }\n\n get pairingId(): Buffer {\n return this.#pairingId;\n }\n\n readonly #name: string;\n readonly #pairingId: Buffer;\n readonly #protocol: CompanionLink;\n readonly #socket: CompanionLinkSocket;\n #publicKey: Buffer;\n #secretKey: Buffer;\n #srp: SrpClient;\n\n constructor(protocol: CompanionLink, socket: CompanionLinkSocket) {\n this.#protocol = protocol;\n this.#socket = socket;\n\n this.#name = 'Bas Companion Link';\n this.#pairingId = Buffer.from(uuid().toUpperCase());\n }\n\n async start(): Promise<void> {\n const keyPair = tweetnacl.sign.keyPair();\n this.#publicKey = Buffer.from(keyPair.publicKey);\n this.#secretKey = Buffer.from(keyPair.secretKey);\n }\n\n async pin(askPin: () => Promise<string>): Promise<PairingCredentials> {\n const m1 = await this.m1();\n const m2 = await this.m2(m1, await askPin());\n const m3 = await this.m3(m2);\n const m4 = await this.m4(m3);\n const m5 = await this.m5(m4);\n const m6 = await this.m6(m4, m5);\n\n if (!m6) {\n throw new Error('Pairing failed, could not get accessory keys.');\n }\n\n return m6;\n }\n\n async transient(): Promise<TransientPairingCredentials> {\n const m1 = await this.m1([[TlvValue.Flags, TlvFlags.TransientPairing]]);\n const m2 = await this.m2(m1);\n const m3 = await this.m3(m2);\n const m4 = await this.m4(m3);\n\n const accessoryToControllerKey = hkdf({\n hash: 'sha512',\n key: m4.sharedSecret,\n length: 32,\n salt: Buffer.from('Control-Salt'),\n info: Buffer.from('Control-Read-Encryption-Key')\n });\n\n const controllerToAccessoryKey = hkdf({\n hash: 'sha512',\n key: m4.sharedSecret,\n length: 32,\n salt: Buffer.from('Control-Salt'),\n info: Buffer.from('Control-Write-Encryption-Key')\n });\n\n return {\n pairingId: this.#pairingId,\n sharedSecret: m4.sharedSecret,\n accessoryToControllerKey,\n controllerToAccessoryKey\n };\n }\n\n async m1(additionalTlv: [number, number | Buffer][] = []): Promise<M1> {\n const [, response] = await this.#socket.exchange(CompanionLinkFrameType.PS_Start, {\n _pd: encodeTlv([\n [TlvValue.Method, TlvMethod.PairSetup],\n [TlvValue.State, TlvState.M1],\n ...additionalTlv\n ]),\n _pwTy: 1\n });\n\n const data = this.#tlv(response);\n const publicKey = data.get(TlvValue.PublicKey);\n const salt = data.get(TlvValue.Salt);\n\n return {publicKey, salt};\n }\n\n async m2(m1: M1, pin: string = AIRPLAY_TRANSIENT_PIN): Promise<M2> {\n const srpKey = await SRP.genKey(32);\n\n this.#srp = new SrpClient(SRP.params.hap, m1.salt, Buffer.from('Pair-Setup'), Buffer.from(pin), srpKey, true);\n this.#srp.setB(m1.publicKey);\n\n const publicKey = this.#srp.computeA();\n const proof = this.#srp.computeM1();\n\n return {publicKey, proof};\n }\n\n async m3(m2: M2): Promise<M3> {\n const [, response] = await this.#socket.exchange(CompanionLinkFrameType.PS_Next, {\n _pd: encodeTlv([\n [TlvValue.State, TlvState.M3],\n [TlvValue.PublicKey, m2.publicKey],\n [TlvValue.Proof, m2.proof]\n ]),\n _pwTy: 1\n });\n\n const data = this.#tlv(response);\n const serverProof = data.get(TlvValue.Proof);\n\n return {serverProof};\n }\n\n async m4(m3: M3): Promise<M4> {\n this.#srp.checkM2(m3.serverProof);\n\n const sharedSecret = this.#srp.computeK();\n\n return {sharedSecret};\n }\n\n async m5(m4: M4): Promise<M5> {\n const iosDeviceX = hkdf({\n hash: 'sha512',\n key: m4.sharedSecret,\n length: 32,\n salt: Buffer.from('Pair-Setup-Controller-Sign-Salt', 'utf8'),\n info: Buffer.from('Pair-Setup-Controller-Sign-Info', 'utf8')\n });\n\n const sessionKey = hkdf({\n hash: 'sha512',\n key: m4.sharedSecret,\n length: 32,\n salt: Buffer.from('Pair-Setup-Encrypt-Salt', 'utf8'),\n info: Buffer.from('Pair-Setup-Encrypt-Info', 'utf8')\n });\n\n const deviceInfo = Buffer.concat([\n iosDeviceX,\n this.#pairingId,\n this.#publicKey\n ]);\n\n const signature = tweetnacl.sign.detached(deviceInfo, this.#secretKey);\n\n const innerTlv = encodeTlv([\n [TlvValue.Identifier, this.#pairingId],\n [TlvValue.PublicKey, this.#publicKey],\n [TlvValue.Signature, Buffer.from(signature)],\n [TlvValue.Name, Buffer.from(encodeOPack({\n name: this.#name\n }))]\n ]);\n\n const {authTag, ciphertext} = encryptChacha20(sessionKey, Buffer.from('PS-Msg05'), null, innerTlv);\n const encrypted = Buffer.concat([ciphertext, authTag]);\n\n const [, response] = await this.#socket.exchange(CompanionLinkFrameType.PS_Next, {\n _pd: encodeTlv([\n [TlvValue.State, TlvState.M5],\n [TlvValue.EncryptedData, encrypted]\n ]),\n _pwTy: 1\n });\n\n const data = this.#tlv(response);\n const encryptedDataRaw = data.get(TlvValue.EncryptedData);\n const encryptedData = encryptedDataRaw.subarray(0, -16);\n const encryptedTag = encryptedDataRaw.subarray(-16);\n\n return {\n authTag: encryptedTag,\n data: encryptedData,\n sessionKey\n };\n }\n\n async m6(m4: M4, m5: M5): Promise<PairingCredentials> {\n const data = decryptChacha20(m5.sessionKey, Buffer.from('PS-Msg06'), null, m5.data, m5.authTag);\n const tlv = decodeTlv(data);\n\n const accessoryIdentifier = tlv.get(TlvValue.Identifier);\n const accessoryLongTermPublicKey = tlv.get(TlvValue.PublicKey);\n const accessorySignature = tlv.get(TlvValue.Signature);\n\n const accessoryX = hkdf({\n hash: 'sha512',\n key: m4.sharedSecret,\n length: 32,\n salt: Buffer.from('Pair-Setup-Accessory-Sign-Salt'),\n info: Buffer.from('Pair-Setup-Accessory-Sign-Info')\n });\n\n const accessoryInfo = Buffer.concat([\n accessoryX,\n accessoryIdentifier,\n accessoryLongTermPublicKey\n ]);\n\n if (!tweetnacl.sign.detached.verify(accessoryInfo, accessorySignature, accessoryLongTermPublicKey)) {\n throw new Error('Invalid accessory signature.');\n }\n\n return {\n accessoryIdentifier: accessoryIdentifier.toString(),\n accessoryLongTermPublicKey: accessoryLongTermPublicKey,\n pairingId: this.#pairingId,\n publicKey: this.#publicKey,\n secretKey: this.#secretKey\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 M1 = {\n readonly publicKey: Buffer;\n readonly salt: Buffer;\n}\n\ntype M2 = {\n readonly publicKey: Buffer;\n readonly proof: Buffer;\n};\n\ntype M3 = {\n readonly serverProof: Buffer;\n};\n\ntype M4 = {\n readonly sharedSecret: Buffer;\n};\n\ntype M5 = {\n readonly authTag: Buffer;\n readonly data: Buffer;\n readonly sessionKey: Buffer;\n};\n\ntype PairingCredentials = {\n readonly accessoryIdentifier: string;\n readonly accessoryLongTermPublicKey: Buffer;\n readonly pairingId: Buffer;\n readonly publicKey: Buffer;\n readonly secretKey: Buffer;\n};\n\ntype TransientPairingCredentials = {\n readonly pairingId: Buffer;\n readonly sharedSecret: Buffer;\n readonly accessoryToControllerKey: Buffer;\n readonly controllerToAccessoryKey: Buffer;\n};\n",
|
|
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": "2A4414637A5C907864756E2164756E21",
|
|
23
23
|
"names": []
|
|
24
24
|
}
|
|
@@ -8,7 +8,32 @@ export default class {
|
|
|
8
8
|
start(): Promise<void>;
|
|
9
9
|
pin(askPin: () => Promise<string>): Promise<PairingCredentials>;
|
|
10
10
|
transient(): Promise<TransientPairingCredentials>;
|
|
11
|
+
m1(additionalTlv?: [number, number | Buffer][]): Promise<M1>;
|
|
12
|
+
m2(m1: M1, pin?: string): Promise<M2>;
|
|
13
|
+
m3(m2: M2): Promise<M3>;
|
|
14
|
+
m4(m3: M3): Promise<M4>;
|
|
15
|
+
m5(m4: M4): Promise<M5>;
|
|
16
|
+
m6(m4: M4, m5: M5): Promise<PairingCredentials>;
|
|
11
17
|
}
|
|
18
|
+
type M1 = {
|
|
19
|
+
readonly publicKey: Buffer;
|
|
20
|
+
readonly salt: Buffer;
|
|
21
|
+
};
|
|
22
|
+
type M2 = {
|
|
23
|
+
readonly publicKey: Buffer;
|
|
24
|
+
readonly proof: Buffer;
|
|
25
|
+
};
|
|
26
|
+
type M3 = {
|
|
27
|
+
readonly serverProof: Buffer;
|
|
28
|
+
};
|
|
29
|
+
type M4 = {
|
|
30
|
+
readonly sharedSecret: Buffer;
|
|
31
|
+
};
|
|
32
|
+
type M5 = {
|
|
33
|
+
readonly authTag: Buffer;
|
|
34
|
+
readonly data: Buffer;
|
|
35
|
+
readonly sessionKey: Buffer;
|
|
36
|
+
};
|
|
12
37
|
type PairingCredentials = {
|
|
13
38
|
readonly accessoryIdentifier: string;
|
|
14
39
|
readonly accessoryLongTermPublicKey: Buffer;
|
package/package.json
CHANGED
|
@@ -40,12 +40,12 @@ export default class {
|
|
|
40
40
|
}
|
|
41
41
|
|
|
42
42
|
async pin(askPin: () => Promise<string>): Promise<PairingCredentials> {
|
|
43
|
-
const m1 = await this
|
|
44
|
-
const m2 = await this
|
|
45
|
-
const m3 = await this
|
|
46
|
-
const m4 = await this
|
|
47
|
-
const m5 = await this
|
|
48
|
-
const m6 = await this
|
|
43
|
+
const m1 = await this.m1();
|
|
44
|
+
const m2 = await this.m2(m1, await askPin());
|
|
45
|
+
const m3 = await this.m3(m2);
|
|
46
|
+
const m4 = await this.m4(m3);
|
|
47
|
+
const m5 = await this.m5(m4);
|
|
48
|
+
const m6 = await this.m6(m4, m5);
|
|
49
49
|
|
|
50
50
|
if (!m6) {
|
|
51
51
|
throw new Error('Pairing failed, could not get accessory keys.');
|
|
@@ -55,10 +55,10 @@ export default class {
|
|
|
55
55
|
}
|
|
56
56
|
|
|
57
57
|
async transient(): Promise<TransientPairingCredentials> {
|
|
58
|
-
const m1 = await this
|
|
59
|
-
const m2 = await this
|
|
60
|
-
const m3 = await this
|
|
61
|
-
const m4 = await this
|
|
58
|
+
const m1 = await this.m1([[TlvValue.Flags, TlvFlags.TransientPairing]]);
|
|
59
|
+
const m2 = await this.m2(m1);
|
|
60
|
+
const m3 = await this.m3(m2);
|
|
61
|
+
const m4 = await this.m4(m3);
|
|
62
62
|
|
|
63
63
|
const accessoryToControllerKey = hkdf({
|
|
64
64
|
hash: 'sha512',
|
|
@@ -84,7 +84,7 @@ export default class {
|
|
|
84
84
|
};
|
|
85
85
|
}
|
|
86
86
|
|
|
87
|
-
async
|
|
87
|
+
async m1(additionalTlv: [number, number | Buffer][] = []): Promise<M1> {
|
|
88
88
|
const [, response] = await this.#socket.exchange(CompanionLinkFrameType.PS_Start, {
|
|
89
89
|
_pd: encodeTlv([
|
|
90
90
|
[TlvValue.Method, TlvMethod.PairSetup],
|
|
@@ -101,7 +101,7 @@ export default class {
|
|
|
101
101
|
return {publicKey, salt};
|
|
102
102
|
}
|
|
103
103
|
|
|
104
|
-
async
|
|
104
|
+
async m2(m1: M1, pin: string = AIRPLAY_TRANSIENT_PIN): Promise<M2> {
|
|
105
105
|
const srpKey = await SRP.genKey(32);
|
|
106
106
|
|
|
107
107
|
this.#srp = new SrpClient(SRP.params.hap, m1.salt, Buffer.from('Pair-Setup'), Buffer.from(pin), srpKey, true);
|
|
@@ -113,7 +113,7 @@ export default class {
|
|
|
113
113
|
return {publicKey, proof};
|
|
114
114
|
}
|
|
115
115
|
|
|
116
|
-
async
|
|
116
|
+
async m3(m2: M2): Promise<M3> {
|
|
117
117
|
const [, response] = await this.#socket.exchange(CompanionLinkFrameType.PS_Next, {
|
|
118
118
|
_pd: encodeTlv([
|
|
119
119
|
[TlvValue.State, TlvState.M3],
|
|
@@ -129,7 +129,7 @@ export default class {
|
|
|
129
129
|
return {serverProof};
|
|
130
130
|
}
|
|
131
131
|
|
|
132
|
-
async
|
|
132
|
+
async m4(m3: M3): Promise<M4> {
|
|
133
133
|
this.#srp.checkM2(m3.serverProof);
|
|
134
134
|
|
|
135
135
|
const sharedSecret = this.#srp.computeK();
|
|
@@ -137,7 +137,7 @@ export default class {
|
|
|
137
137
|
return {sharedSecret};
|
|
138
138
|
}
|
|
139
139
|
|
|
140
|
-
async
|
|
140
|
+
async m5(m4: M4): Promise<M5> {
|
|
141
141
|
const iosDeviceX = hkdf({
|
|
142
142
|
hash: 'sha512',
|
|
143
143
|
key: m4.sharedSecret,
|
|
@@ -194,7 +194,7 @@ export default class {
|
|
|
194
194
|
};
|
|
195
195
|
}
|
|
196
196
|
|
|
197
|
-
async
|
|
197
|
+
async m6(m4: M4, m5: M5): Promise<PairingCredentials> {
|
|
198
198
|
const data = decryptChacha20(m5.sessionKey, Buffer.from('PS-Msg06'), null, m5.data, m5.authTag);
|
|
199
199
|
const tlv = decodeTlv(data);
|
|
200
200
|
|