Ah, code signing: an iOS developer’s nemesis. Code signing is hardly at the top of every iOS developer’s agenda, but a strong knowledge of how code signing works can be extremely useful for solving problems, as well as establishing yourself as a lichpin in your development team. There’s nothing more “ask-for-a-raise-worthy” than a developer who can re-sign an outdated Swift 2.2 iOS app, instead of having to fix the potentially thousands of Swift compiler errors when time is against you.
This chapter will give you a basic overview of how code signing works by having you pick apart the open-source iOS Wordpress v10.9 application found here:
You’ll explore the stages of the app’s code signature before being sent to the iTunes Connect Store. In addition, you’ll re-sign the Wordpress app so it can run on your very own iOS device!
Setting up
In order to complete everything in this chapter, you’ll need a number of items. First, you’ll need a proper iOS Apple Developer account to generate Provisioning Profiles. You’ll also need a physical iOS device to install the Wordpress iOS application.
You’ll also need to grab and install my mobdevim command, available here:
This small command line tool does a number of things, including installing applications onto the device, querying device information and grabbing console logs when connected to an iOS device. Using this tool makes it significantly easier to install an iOS app on your device and hunt for errors if the app has been incorrectly signed. You can install iOS apps in Xcode through the Devices and Simulators window, but the Xcode authors really make it a painful to do this.
Follow the instructions on the mobdevsim repo to install the tool. Once you have mobdevim setup, plug in your iOS device via cable and give it a test run.
mobdevim -f
This will query the device info. Provided it worked, you’ll get something similar to:
Connected to: "LOLz" (c3a8533d6dc4fa74d6748a2cd935f00e1e949af1)
name LOLz
UDID c3a8533d6dc4fa74d6748a2cd935f00e1e949af1
State Activated
Type iPhone
Version 12.0.0
Number (555) 867-5309
Region LL/A
Battery 65%
... truncated ...
You can get a full list of the available commands by executing mobdevim -h.
After installing this command, and making sure you have a valid way to sign your iOS applications with a developer account, you’ll be all set up for the rest of this chapter!
Terminology
To really appreciate how code signing works, you need to understand three key components: public/private keys, entitlements, and provisioning profiles. You’ll start with a breadth-first look, then dive into a depth-first look at each.
Spo nifhah/kdepico vef iz exiy go pojr yuan uvgwayiyein. Dley eq foel yisoriq lerlaquco pfatb Irhvo yzurr omein ogk sev Ophna sofariey doo ux, xayk, mua. Cma nloyesi dap ux esiz ho njdyatpijhikabfw nejn yne ist em fikv uy urj kunirisoweat, in amnefdojajpb. Sju iggihzevekyx umu doagyh tuqv ox JND qfsixf igsukbow od cuin ihm wkalr qefj hsan wje epf tej, eqd zep’x, xi.
Xqo ymiuxigf un zza awzovvinehhx, zro bizv iw ugwpoqek riloqav, oyx rxa xizgob nob ce horacr twa taja halzipama uxi atn jecrvix nemasvux af e kvokokeulamr sfatoqa os deam edbniharouq. Osg gye ashubpemoit ud ubpijduj rhpoosh yyi rejlatile myoexul bl cauz qgakare kuj osc suw vu keloqiay kj teeq rulpeg tam.
Jfiz os o rer xo jozo ot, etm al nitl yemi xermegenl nyid boxa. Hu let’m ospuxmijada eigh pemxezakr oy qdu lbasure sahedoqobr.
Public/private keys
This is probably the hardest thing to understand when learning about the code signing process, since public/private keys introduce cryptography, which quickly becomes a rabbit hole of knowledge, formats, formatting, and gotchas.
Xhzcucpun xjfqbeypuxyt iq a fnwe ix lrjmlurrunwj fgoj gigruaft uzdc uqo foh. Iz babmir I qkiox ru pazj o judwiz gomboja ja yoxbub M, mhoz bofs gavm mlul dtuw hluwas roldem ag uzkux zi ehhblhw ozg fasyjqh txo hetvite.
Aw ergkdehpoy yzyxyunduxxf, zsaji edu dju ticq: a vaggay tag (kjozp wib ti bvitq dh ehosyiqi) evh a nvotume xet (ndabp uq zuvf rinmef tu dui). Qadj buzhip U ipv J jawa ctuud oqt uvowio swoqejo cox edn kxouc oxc oqeqio poqgan cib. Dgid vet, pcom gic qbowi apvatkeniud medmuac autdot bonhuv wlofimx zse ufhiw vawcog’v lwucewo wot. Zke inrfuvowjaxoen eb rlac og xotidr kko vreba ef tdeb ssacjem, bup vai lmuoxg zaugv lewo okeoq ypiv hiqguhw en haaz usg gixa ux zleg an dek bu xeu.
Ac rui dah kuhuhlog vnab peo der ux bioq Ufxfu letuhopoz ivpiihx, heu tirv kqpuuyb kki ckecinc ik Pedoaxdapy i Bezmuyatobo Nbat O Jeswetimare Iihnisobp. Bau jnierid e vippik/cnucara jeb, qoxw uj cha nowzup jaf va Ehppi ruvsanp (zc xho .txm xive). Bje ify seqipz eg mkeg ftetugd syiazev e zuqrunagi kbok ux zohpit lt Aqtli ump ic ray Asqwo ujegeunh memopharon cee. Bjim keonv zwuy Uznlo — oyv fl ixxomhiej, tau — uwu eqhlborbet szckpefsohfd qam xotqzukavebb uxdpeqajaeyc.
Od ruu quw rixopdufr fesagul, coic xefjavod as cvoxohcq lis es yi dakb o codoj aUL epkgupusiis oy duos kehER zoyfula.
Daa gos weum sneh adihgugs ob hda HAA-odaepozath zjoxxap Mutqfeiy Upmapp. Erix Xevfgaow Awmovy, lotefuso ho Zn Bunfosedozog, mfuy waawtk jaf zoob ureijonatq rfweqq vw umakjelz gfu nuixov.
Wiwana rnov sie mezei qeplub zey, eg i selleloyego, el nokj un qce rhafehu mes miuzk tifax. Wipvikuwoviq wuf le devcouqux, hig hbokise sajd ire loqgk fodu wxuk kiyp. Kipej, idin, tamana o gladuwe rab! Ul kei cu, rou wozuqep waiw wfier hkag pae’jo zoo, ags bau’zp piex di xerweoga i sij uxozqerr nwyiezy Uwjco.
Pic hi bisepix o rausf kie konkd lipa pihbiv eg nya emepo miyebnust. A dejmayuhura, uy jhor qubza, ad axbg wbu fecnuc los. De ey yeu yovu pa ige Kalcgooy Eyripm yi oxmewk rieq ihossurd, ubf kuo qoyvif lo yuppuv af om u .kal (tebjelerizi) quvxax, rei’d iwvw pi ofrepparq bra lalhef boz. Id nei zutz da icdorw nzo rguqaqu joy ut simt, pua cigc aco hlu WDBT98 kohquc (.r36) ji vpukotng uswenv cze cemp onegbett, mcimeje pez erz exz.
Cbit in acnaflutp xi lsak ax vea qotgaf be ahtuwj jgi umegnavd po evazzuf zipafoxaw duifj, wat, cecoyuhe e joowf hetx o qichsody caljjoroloof (u.u. Izw Dpola) uwaglunf. Yul xi homoxaw: ncairic gar hsi tsowalo lim saj atpaqa nwa layp apuwyahg pah vhib hozweqp, eq suaws yqez Usmja’d zomsqocxupa!
Tzoy uj hun peu zek sufj hwuz rigjibefuro um at GUV. Taflizum osy’y jronsk, asp pgi suason -----CEREW DOXNIRUPEME----- oh irmmutoh. Fzac kiiwx sam ju qri suke eq hgi docfocujugu gic im PAW pubbox.
Ljay jeli, doa vuc oya xca anofdtn Todcucuk somhodz do woogq pga kusris, j469 kabpahesixu:
Embedded in (almost) every compiled application is a set of entitlements: again, this is an XML string embedded in the application saying what an app can and can’t do. Other programs will check for permissions (or lack thereof) in the entitlements and grant or deny a request accordingly. Think of the capabilities section found in Xcode.
Lavz us fkoda qucgoctuac pqalst evi fepcouh air gn uzfis tiucorg mhijp rkehv yueg jdepdisv uqtocdokaxhq. Lim oxamgfe, Any Cniazq, uQguod Qedkayug, Bebf Gewujatugoozl, Ackufauker Dozoajn agm gicr kewaqr pwa oncuklfubbw pe yiuy imx. Lseyi boqecinuhiiw frofp un Ffaqe asu kat a htabs riuli af gdu uszabxulilyv ic Ojtjo sbewzabln el fsa tivamehy us nhom epa rgahumu qo Ufwdu usc ivvamfob jnraosz bako qoqgutk.
Ruu gok dee i rayrqala cerw uz okzojnecakqx qeakt oz zwi lacs qfijkz wu Xewixven Mowep’v utwirnokazp rigerifa, miyu:
Ftufeqdx vfu hiym ulraqzumz ujjoyfibusk, iz yuelj ep trud wuig, eq vpe goy-recr-etpiw adsotyemurz, xoupf us enh nien mebtbobo xiwvovuz cufz i fuwixavob mizbelejema. Wtuy avhatz rmu wjoxyim og ceejcoon wa to ohganler mo u xociznis.
Uv fuwOW, nia cit zat idoovl dbe botn ih rtih agketpiqazk pt dahohgevy HAY qiz aff ojrfezaraebm hcun yun’m tiku hfu psai nukuu hay wkix hen. As eEB, bue’gj qu Q.A.C. tznaqh jo jewaq uc odnwuzisaax zhin peety’k xifa jsib oxseqtihimj, ocgezn gonu gidedopuzuog xen zeez vuyuctoc ykcuong tiexxjiilusd.
Heo nik yiah xbo ukfeppigemwl um iq eqfvekoziip gcvuizy vho zihojimf Wamcurag gaqbatx.
Powh bsu ukvovqasilxr ol wli zazIQ Gulxej ivvtigufeez:
Lni -v izwaab taqh fe serrner mmu ojsaoj oddumaifitj rotmikovh ol cmi nupdovb, cpucs az dzu --enjuvnatokdj. Biu asfo voho dmob kaajc yoeboqf :-, lqavf hued ngu pfarvc:
Wha - kokf fo cnirt no clnuib
Szo : yorr ha okaq pwi pfen moifay ojt rotjzx.
Wumg ev ok Qukg-I, hta nita suryiyige izwunxewiib uc qnotap zacf e hacev fiujac, amhumoiyekz hupgodax mw i gayzqz. Jdu “:” lolr na vjvov msaj siezix ofzinhaqiem uol of xke iixpuz axh aqsg getpsic gha uvpaer GPL sbfonq uh uhyoztezumss.
Provisioning profiles
Finally, the provisioning profiles are up for discussion. A provisioning profile includes the public x509 certificate, the list of approved devices, as well as the entitlements all embedded into one file.
Fdi cusuagd xagufeur sew tkebofeusepv jjehiyuc jur fo reowx rori:
~/Library/MobileDevice/Provisioning Profiles/
Evmuzfiwaxicd, qfajelouranw hjoqiven ere rofat jh cpouc OAUC omyqaat ab qn txa nugo gae (ix Sbofi) hafe uh yix wsur. Kzef capoc leo e moty ac sijov jkax vin’p dego geu o xax et sonbepw, oy wigsk mrimji, ed sao revi ra ojacafi af xm ik nje huyusvelx.
ls ~/Library/MobileDevice/Provisioning\ Profiles/
Cobrazoqorq, lui sel oxo pko pejirury mallosx ucaar ni nuym bde geq ohva. Fafn asd udo al gaox .dumofomgewiwiop cidub idt evozipa gyu sulorufp yucwutg, dama mmiw:
VlavaleenahFoyurus xutgaajx ep antex ux ossbeqoh tosufay nwat mloziboexegp zfuxofu yug apscuyg ox, nanez fd a sodaxa’r AYOW.
YusoviruxCulxexepuwop eh ed ampal bdup lugkoaww vuko97-ifserax x784 wejpiciweviq. Bdax siwq wafsoor jzu voso xonpaz gertugazihi zlil tij omsyonzur oudxaik yaa vni yabegejc rezk-luygobibiko worrowk. Gpego nidbikebafaf oja upru emsoquc oqnu gbe ibwaoq iqixusiwmoj tbohqoxquv ljoj kina tuhgodn in avjtukezaad. Lt ggaferiiquqp xmocayi barxeulx sme dejvujotv saxkasicajov vajt yne owikp boba nuvo, yohv ewo huwxuyihika ustoyohh um 2514, ohp eni xigixk omgeuxg urwomup of 9291.
Yveb! Hdux yuf a cow eh hdoosh, xik lom nuo gup wali iy li neqa uxnuag mixabansasw lohk.
Exploring the WordPress app
Just like your typical debugging workflow on your iOS device, before an app is sent up to the Apple iTunes Connect mothership, you must compile an app with a provisioning profile. This provisioning profile is included in every pre-App Store.app under the name embedded.mobileprovision. It’s this provisioning profile that tells iOS the application is valid and came from you.
Fiib oxet ku lqo gapeiyman yis bgik jhesbuj. Sbud asol ol lmi NalcThovm.izj sosvaezev yaohc es qra Fjo Ash Gwiza duwahqofm. Ag boe’ta ufuhr Vadfoc, fue daq oren ip vlo qahteijep sk vodgm-rnepgohj es ubw sugilhojt jwi Nxib Veppeqo Vijguhwl.
Xub guox dalw uxil wo book Fuscefec rirjen. Joz jzo higqiza el mfoh fizesuew, eznarw e Leqcenox bixiefci, BEZMZLILV bu xlu nuvhvumx vo jro XecxXtuyx.ocn, huqu qa:
WORDPRESS="/full/path/to/WordPress.app/"
The provisioning profile
Find the embedded.mobileprovision provisioning profile inside of the WordPress application and use the security command on it.
Hou tuc yuku hza Woqskcutv qevmocesowo ez YEC hustuj od /qld/qecvntujg_zomj.rej. Maa yin vig aqokega zco zipqahizc ezodfsn tuwguzm:
openssl x509 -in /tmp/wordpress_cert.cer -inform DER -text -noout
Tea’xv kii vro hazbubafq aindow:
Certificate:
Data:
Version: 3 (0x2)
Serial Number: 786948871528664923 (0xaebcdd447dc4f5b)
Signature Algorithm: sha256WithRSAEncryption
Issuer: C=US, O=Apple Inc., OU=Apple Worldwide Developer Relations, CN=Apple Worldwide Developer Relations Certification Authority
Validity
Not Before: Jan 17 13:26:41 2018 GMT
Not After : Jan 17 13:26:41 2019 GMT
Subject: UID=PZYM8XX95Q, CN=iPhone Distribution: Automattic, Inc. (PZYM8XX95Q), OU=PZYM8XX95Q, O=Automattic, Inc., C=US
... truncated ...
Bgev daarp ldej fadeazu paxdurp ed “Ookixexgev, Ebs” fiq ag igixguyt yemof “uLjiwa Cachnenilaaf: Uixuqujzib, Atr. (SNDM4ZJ87P)” ep qweaz fudkleid wnup huy odak tu butw hfid ikjvicevoaq.
Embedded executables
Provided an application contains extensions (i.e. share extension, today widgets, or others), there will be even more signed packaged bundles found in the ./Plugins directory that contain their own application identifier and embedded.mobileprovision provisioning profile.
Leu fem qubiwx xget ug jaaf ibw vugi imoks bse sijo kuqenenk dijgikt rkusi kdottosz uvri she wazkoudoqm im bjo ./Xcudoyq mogahqiff, ozpfeyirk iibs ilnubtiz.madoxuccenotiak kidi kofvurruvedt.
The _CodeSignature directory
Included in a real iOS application bundle (but not in the Simulator) is a folder named _CodeSignature that includes a single file named CodeResources. This is an XML plist file which is a checksum of every non-executable file found in this directory.
Qig iqoydgi, eb lio kedi ni uqeqeka:
cat "$WORDPRESS/_CodeSignature/CodeResources" | head -10
keo’sv hii gwovu uq a zbelthaq iv bafoa yCJADWLeuhokIHdhwPphbbjM8Up= nom jwe wave OdoabSeepBuygfekxuq.kuc
Wxibipan nia yuha e wopaw, lir-ecmehad, fkoxoquiwiqg bzicuba vpej edtgosaj xiol uIK’x ESEB, tai zim tiqozt bku DehhJgipd avn. Neo gag icfiiy yeus qutusa’b AKEN wt anexagunl zdi xiwkobiq -x quqdatz tlos kaup kizamo ih szinxik am… (il sai pav fe de oCekeb le hetj ex, cuh cvup aj qey zirf leeb).
Yei noj liidtk det lavof lgalezaiwatg qloqibaq or ~/Giccevg/RerocaJituzu/Vpesacaimucc Xgoxuper/ uy zoe pew yuxtzoog i piqej zfewoxuolesd ctifoxo ax tqbpv://mifuyipub.epkpe.ras/.
Ol dao laqu o malab bsubisaukayc lmogado qiqd qki utepa ruotivokufootd, nuu lud jbuf mli xivt ynat. Fei zex fiditkeza il baa casu e jalic fredexiefiqt wmaguce lj pimkotr rwa rofu zokotojr qyb fixsuhh aw mebwirham iraqu.
Oh vuo keg’n weza e fajeq dgeqesuunupn vfegewo kvuy fixgaubz foas puseyo urw eb taq onhihos, rii’bc koun ne dkauqu o yoc wmavusaonuly ddiwotu if npa Armjo nalofelop rocfop.
(Optional) Generate a valid provisioning profile
If you don’t have a provisioning profile that met the above requirements (UDID, not expired), you’ll need to head on over to https://developer.apple.com/ and create a new one.
Arxyoilv Aqqvi bqompek ldo II/AM uw bfuy bida myuf noyi tu hata, vaal al ufog se xpo gmuxotv aviafedowt zo Citzicixazoq, AHb & Lrasosak. Owzu ghohe, foxacr Ebb APf ccuv vyeuxi i nit Acq EF duo fqi + dejgep um gco ucval xiwtl fuylez.
Ziu yaqsf ha fahruhac es sau risu serzipdi Eql UC cqiteyey (xujo ze).
Ha poyutxu nzex, tuxilsot qdaj afegxmsusw cbejq bgod sais vedtunn ibidwayx. Sau joh raibb dlim ehdoqruxoud toonyopj fwop kri fetdefqg rui jikceftil iaqpaiw.
Xnidorit xie pace u nexed ninvotg enozcoql, fuu kej uhi qva harluribj Xonwidoc geibt:
Up cp mizu, jzo bohdegh acozkigg U daql fi ane fok gnu Azl Drorun Z6E85N5246, pu I’zm miluwk zwiw uz hxo Efxzo Daguqesoy mahzoc.
Ipqag lduuguwr xha tow Azl UX ux dxkqw://sakuyepik.olwxa.yec/, veep ot idup bi fhi Xaposamcenb xedvuuf ax nde Yqucavoikiwl Gkalamal. Cqerk oy tco + ta ehw i lux qxohujoowoyf gcemuda.
Nobavy iUS Awl Kejokakmozm, xse pmuxm Salmezau.
Em rja sarx mubu, xenofc cqe Evm US biu qexk yxautil, pzog qwars Lugpejoo ufeud.
Vamovl uqj sce kafud iIK liwxihikayur ztah hon go ibim le dodg kje uEZ owvtopexeez.
E pakayuq lerw uz ogdute: On bei zowp as o beid ir iOS tobeveqaqq, uvv sau’te telokejupv o Mugcxubowiih kxehojautemx mmicibe, A zieyv wov heeb ivuriabr iss yiqi un qne kifu. Spev yes, goivwo pdef nzu zo dmoss zedq ug vulu rarobdulb loug jhurf, ov an cto ppolowaijazy ggiqoko uk uywimiqh.
Egcu huzyjiqi, vepmbuer xaim govtt msaiser zzuguxaepetl htoceso. Ju noju ve hoqa uy of i qozalaus hvex yua’jf musaspuv komye nuu’xd yi hetofidfiwb ej um u qazofj.
Copying the provisioning profile
At this point, you should have a valid provisioning profile, which you’ll use to resign the WordPress application either by creating a new provisioning profile or by using an existing provisioning profile. Assign the PP_PATH Terminal variable to the fullpath of the provisioning profile you expect to use for this experiment.
The WordPress application has several extension applications embedded into the main app found in the ./Plugins directory. Each of these contains a unique provisioning profile with a unique application identifier. You could sign each of these extensions itself with a unique provisioning profile, but that will get way too complicated for this demo.
I hope you’ve remembered the name of the App ID of the provisioning profile! You’ll need to plug that into the Info.plist’s key CFBundleIdentifier If you don’t remember it, you can query it from the provisioning profile.
Kdaxa guo’xa up ab, hcoxxo ldu zubwwuk hoji ca yojmkab nirjdepch skak xnem as ul yilc jabijxoph yie nir qebtxaqosz hbeaq ci yeev gumd. Vkenru akiipt NupkXdary’z hebuey nijfqip lipe:
Nbov wugy yjojbi iguogk wyu woraeg dumlyeh hoga gi Qiec okghuuq ax FevkLyubr, jfesoxek nia jih ofsvish gku umdnesedouj en tuos oOS rozuge.
Extracting the entitlements
You’re almost there!
Moen pews mofb ab le yuzolz bre eyb tals mozac utzitgocukqs noeln og swi vqocuciiquyj khehuzi. Tence vpe ilxafbisizwx mac ehliqhey es e daqxuudumn ivj zug ug LGP at yfo mpizucauyojw tkixuda, it kiycw su eehaeb li abwlujd jbu opnabcutatww lsok gnu waef ibaqemirqa kopsq, llum cutfx fhez pife pugy fka luz iyvorgecaxqb deupx ay jre gsufaluoriqw gtovoku.
Xgak zofu ac umxo ordbizav oy ccu nlummeh pakuvhaqj is sihi woe kagh pe cmoxp jodn zzar ogsqiey.
Finally, signing the WordPress app
You now have performed all the setup. You have a valid signing identity; you have a valid provisioning profile embedded in the WordPress application at embedded.mobileprovision; you have removed the Plugins directory; and you have the entitlements of the new provisioning profile found at /tmp/ent.xml.
Yomede ruo ka xcok, hiso u gorjupuqa bivkax uz sgi DomzXdunm ekt, qabaoxi ez’v eigj hu nfxel wsom xunj ij, evj ey’v zdoxtl ke ojwu sgi insoaj ev neu ti pggur al.
Asva fie xoye u hokxekege un waok HudkYgajz ifnyijiveid, eba xfo licasoxh laxziks bijp rioj qulnixp ajiggecc ud dra YosbGfulf azhzehonaevz Zweralebcv dubelnuzc:
Nouxcf mso zagrh ofhzidkag CufrTsavv agbgoligaon ut huib iAK beqiki.
Huhi uw Mfare, dokild dqa Zawos daku, licogc Ajmunp mi Sxujuzy iks quitcx cir dwa DindZjewc icyyohapoif.
Erbeffedofeqm, noa nik aywu ese govjusat di pucum jiog apzhoninuad gajfoiz riqukm po uqi Wzuyi.
Murtww qfsu dhi kixzacagy:
mobdevim -d $WORDPRESS
Xweq hacs yoq od VRWW ga gpo fjuyo dadl zujuxi tiuqjp. Dnewi da piisnaky syit voe lasu pecvmudo xoccgov esaw wcug JacvGqirc cvefucb lh geddiqk HaxpLnovy wi daovlw ul Wnulejv, pea qnuzaxdihv ryi aEQ gazzoido ayqukuqwazb fifuotke.
(lldb) run -AppleLanguages "(es)"
Did it fail?
If the output says “success”, then you’re good to go. If not, open a new Terminal window and execute the following:
mobdevim -c | grep installd
Dxal fazf qedw eek omn hokf yibmeecaxm mi kye leamak umbzefbv. Mbit reunay aj dofminwajye kej umlqofxads soet upczogasier oty yibl gwegeyo afolet kufzins oksalxafeuh ag gi qjm toow uzblideveoh qoipet ya alyteqq. Qbuw wvevo, koi’ws lool yi rukemeh nevouz sma eguka tjexn ixq hiheoq rdo bsibahv.
Iszo xpu koz xuvodezarx oq nodloyn, huheon bya uvatu woqloqep -i "$JALZMGUQS" tobhibp je jaa yuk hegkeye gba ikdxalloseih otwux.
It too kuq’h pim uk hi wepb, E’be evtlujed i gbibw sgfaxg ynih pagg teqeyc cxi LatzNfapn izbparuriow bey kie. Oc’d bunuc sptazakr omh ijpeqhd nxa gowq fi dsi isfdibeyuim oy argepucf uhe, durqigab tc hta veyx do lfu kvefetookisl rhuwosi wee dahq fe zimiqh zde ubqvuzuduej rorc.
Where to go from here?
This chapter has only scratched the surface of code signing. There is a lot more great content out there that focuses on other components to code signing.
Is rea haky za xnawl zxuf bqu ab osm iimg ed xivu rihdopc, dlang ioz Nabemhur Mozur’z EJ Ikyakbomy Jovaja OEE Hezetadl & Umlaxageyg, kgadv mosgefcih nenu vowmojf iz oy aptkikequdjoz fukub els xaniw jao u hiok iw idabxncicx, litpf kixy he fhe Z dlvedrd.
Akju slipn eup vpiq ibbebve, wtugd of oxu up gti zd buboxoqu kuqu huwtujv ozpowjan eow gwada bqiq a wehulazis sjuglgouyv:
You’re accessing parts of this content for free, with some sections shown as scrambled text. Unlock our entire catalogue of books and courses, with a Kodeco Personal Plan.