Skip to content

Instantly share code, notes, and snippets.

@ezekg
Created March 13, 2023 15:34
Show Gist options
  • Save ezekg/ff9a11e47ddc6f67b9f1cb49f4b2e4bc to your computer and use it in GitHub Desktop.
Save ezekg/ff9a11e47ddc6f67b9f1cb49f4b2e4bc to your computer and use it in GitHub Desktop.
How to verify a signed and encrypted license file using Node.js (see https://keygen.sh)
import * as crypto from 'crypto'
const PUBLIC_KEY = 'MCowBQYDK2VwAyEA6GAeSLaTg7pSAkX9B5cemD0G0ixCV8/YIwRgFHnO54g='
const LICENSE_KEY = '988214-879010-F1185E-B37E91-E53AF5-V3'
const LICENSE_FILE = `-----BEGIN LICENSE FILE-----
eyJlbmMiOiJXV0tacURadUtaMlVHcFZ4WDdabnJWL2VwbnpsemxjWnU4WXo4
TlMzTEk2S25DL3RiUVhQRkQ3N2FOSWRCY1IvK2ZSYU5BZjdrZEVneGhidFA3
b1diTTBlZGI1dFhxVHNIaFZSKzBZcUhqUXpNT2UxOGVuT3ROb29reW9PWUFx
bGJHMFNpb0QzbFc2T2lvTUFjZEwxa1d3MGd5OXBrV09lR05xV3o5T0tHaXZT
UWhOcHZpT005MmorQW1nSjNjMGVDL0dyNmh1ZzJrbVJFSHF6UlVPNUN3aTM3
ekN0ZHRzZElPZGhQUUViMkVLSXV6NE5ucy82cmZZcThjRVJFb2RaMG15cHJM
ZUlPbWIvYjhQeXZybm93c0oydGt3OGJteVBqMzRNMytQQ0lFbThFUDkyb09r
RkhDRFhOTkNqVFVHTXdPck9VZWlRL1MzZVp3bWtzMUIxdjJxUGNyOUk1amVl
d1hSKzNGVVhOTk40aVpjMGFnWGJSNG8yTUNDRmgrcysyZktHN2dCL2g2dlRB
dWQ1ME84RzBqWUJrWXZrNmpicCtXUnh0dWtzbHp3ajNZWFBaUWtKbm5QdzhQ
QVRjM2VFN0FjYWpaZWEwNU54RVZQcnB5eCtTcnFaQW50NkpoaW9peFdEbDlJ
dlVWMVd1T0hJeFlRSmZWZUZOOWpKOExkbGxnWFBoem1JdGE2OGozT0MwckJl
ODZCSkxiNDRuOGd4Mnk5eU1TUFAyOTNCbVpXeU1lQ0FCRk8wQnpVN0RKWUlw
NlhFOGRnaElrQTY2T3pBcmdVMDREWE02cEtuejZ5eGFDOUtoU3o5bzdOY0dQ
U3ExM0dyVDJNMHhzbnFzcjNqY3JxV3l5Wk9oY1dEeUFZSjFQTUdOV1RJT0JX
QURQenhzZFJjVWZlOWdKVXh3dVNsdWlYRlk0dnpsR0gzb2t5c3ZweEVNSksw
WDVUNG9DMkh2OXhLaTJISTRxekNlR0gxSmt3UytBY29RQVdKamtjM01hSXRy
WkhrQVh0cDFFWmZKMFYwYXVsOVkwQXVrTnkzaFBveVRIbW1OVG4vWmowUnl2
aTQ5TFN4ZEwzL21Nc0FXU2hvSU91ZzhoMEg0UW44RDNYb0lydkN3N1JQTm1y
d2wyNXFsWVBrMWhCMStYKzVrS2FzUHMzQS9GazF6aFU0WStrZzdKOFRsZ3E0
UURUK09hd1BDb1BKV25UV2lBNlpLV0pJTmlvV2doT0dGbXFKMXRpWDIyUk9m
RzlhTUswTmFNclVCd0xuNjRJLzVkNHBnUWNmRXdUVi9tbHBWOWRkQ2h3MEw3
K0ppOFNaTG95TnhickFtVE9YMjNUeGp4R3hoMkRPS3Z6YUZ5VkdaSThqVEZJ
RDlHaEcraWQ1WnpjcGgzMlhrbHR2TnhoVVNmVHEvRUdJaGx0dkNobDYvcGRR
NWFtTTFTOTd1RU1XOWZVVE8vNTNURlpFY3hOWHFwZllxcFV1SUVoR05OQ3Zj
VkdCWHlrYm5XSkNDL3gyMFFnemdCSDZNUWJUZG9tMVZUQTdyZkNDTlIydENP
WkUxZkV1SHlTRHFQK3M1TFRPNzNhN082N0d6Mks2dnRmOWJVRXRvb0lldkhi
OTAzd3ViQytyclg4RmVvUEZBUXBHREU4dzFvUitNUm5mak5GNzV1YUxOamww
Lyt0OGJkWkxoUU9DOENzR21rRWFRNWZBOVVFcTdTQmU4Z3R4c2JrSGZ2ckNx
aG50Q2FHR1hmSUsxRms3cFFyZ1FaUG5Sc0RSRkE3aHJHNWQvdU9EbHM5U01m
cTV6eVE4ZE5JenVrV1pxZDBNWlVxeEtQWkpaempQRk1abHpRK1VtYkxZQWJs
MnpsYVFoYnVQY0hwMkFXTGZxeDM2SU83bzdnK0VwNittYWlPbVlTTmFwaWJn
RzNFRENIRTFnQjhBQ1VZWXAxRjkyNjUyVU9EUVhBQ2lzQThodEVHMURQbk9X
TjRkNzNiZXB5QVltT3I0TnhOSWtSSGIzbTVyaFdUNm1SbFRyWXlnUkJyWTVp
bmtxZGR5aEo5ck9RejJhMjdWQk5sS2dsUzJma2txZDRoSGxlTlV5NC9STW1N
WUU4WnliOHJJYkhmSlpSbFBvTldpMUg1MzJqSXQ4S2hOVGpPT1FHcGxaQVlD
Ymx2VWIyVlNRWG1rQ3NYWFRMclJGK2sxUW1LTnd4YjgzVEFiWXl4ZnhjV3Js
YmNWL3FpQVBNeTRzZ2VDM2NXWWg0S3d4NHhNcmhkTlJzVGMwTnJ2U01WSks5
TjhsRWxvdEVIUm9sc2hqaVlzQjJGVi9rZjRyeFpKRGJBKzhWL1JPSmFoV09n
Y3N3bTlnOHhCc1VWcmxrYm9CalFFRDRSK3pxV3o5OS9QK3dyazN6bjVNZWxm
RU5zVTByZldFL0dsa3dxNkdtektqS0g5N2U2dWcwOThZRUpTTlNnUVFxWFRS
M0RqSFRDaUtGNkk5M2ovYlNrMzBaSkNhN3g3WGJPMjhtNWNNNUF6d3hMTkE2
RjhWdDBOZjl2eWRjeFg0WGlzUHZGV2xzQ2N3NDIxR2JTaHF5eDRrYTV3c3ND
QU5TYk1oeEo1anc3OGZhdGpsYmNDbXpkTllwQzZwb2lPa1RXc2orL0syV1Zv
Q1AwZXVWNWZKOTBIK3UzTVZ1aFRweEpLYXF3Q0Ivck9obkNiMjVycC9OTnVr
VmFMZC8wVE9uQ2lPbHBhZUw1OFhLWmV0UldlK0JPblVnbjdBL3k3Nk1pRGJN
eWhSUHlBaUZFT2VLM1NmZlZ0TjB3RDhWTWN5c2JvV1lZZmNQUVJoTzBhQUly
S3YvT0JjckhVTXFRYXFOOXNyWjA0ZlI5Q2lKM2swdGxsenlWUHZ4eHViWk9a
RSsyVDY0M3RqSmlZVXhKSlA1U1RXUVp1alZMTjNpbGtWOGZEcjFFTzNjd2Nn
SVFZTmlwVGtrWGlxVmtkaE12SmZ0VmRReGdLajI2VWVDdENvVm9ZOFNDT0Vi
UllyTmxKd09veHBVL1NhMjBHeUlhMzJPdWMwaXZTQkNvdHoybzdjRkhwT3Yx
YktHeFE3QnU0TjAwVEd4Y2FHc3Y1ZVZnbDVMVjRobDRRMjNyOCt1ekZEU0Vn
L2I5aU1EYzd1UTNVNzRCM1NEcHJLU3lSTkFaYjhsMUVEbmlGOGpKWWd6MWQ5
UjlSY0d0Q0tnZ2UxV3BOZVJlM1JJb01mcGFQTDVtZ1BOd0JzcnNSUUVGd3NY
VXRhZE1PNjVqZWlqVVgxd2tMbUdUOGduVWZDcTlFRWw0dGNONVVqSnUvMVp5
UXpNUWFkNGZnNHFRMDFVdUQwVDZnNUhKM1NXNjc0MXBWUWllVXA0SVptbGRp
aUM5dHBDalFVV08zelZObXBRclVmdnhUbnFPVXpxYWc2b0wzKzNxZm1UL0s2
MjNYTzhVVnJ1dUVTaHlUdzJnNVpGNG9xNU11YVNXbVJmdjl4YkFQMTI2VEdk
N2pXRDk1U0dxdm5tNU9Gbit2d0pRdXV4SWcrRWhwUjdOZWpWbFpCckZLN0hF
ZzkyT2loRDRyRVQ3U0RuOVNJWGVwY2Z3eHVwN0JMclJMdXdXQSswS3pnZlRH
dWFGSUczcTFwMDU0VkdtOXZjVDI5MWl1Wi9EM0p2SGpNWUpxcHIxSWROU1Fo
OCs3MDRyd3FvUVRybXk3NXZjb2pFaGRwZ1dydVJmcGFHUm9yUlBnSS9RTnpD
a0VBczhkbm9VbG91OGZ0N2VzS0dRTjFQQkJxZ1ZFK3k2VXZYS0JnSDJrUVlF
QkRyZjRJajRSclFWaWFCMy9PdmIyOGpTTmg4QXJPUWdoVmNYWUtQQ1VCL2dF
TnFCSGp0K3RCY0VZb2ZReThIVTQxSTdNTHZjT0U3SEtYMCtiSXBUbHlSc0xm
cG83NTF2VnB2VEJnb2Fva0xNcUxhNndTSEM4MFpVUWJaQko0MC92TG5VVDBn
L0F6OTROZ21ScEZXUVJkbHkwNUVUdTN4VTN5SW1FWUlDUE1nVGFISUFsc2ho
c2FxcTR6eXp6bjFsdUw4eXpkb0NGKzZvYUpsNWJ0SXg2VnllMUV5Y2Y0eWps
VWwrM0VUakJ3aHNTQzdRMmEyajVEOWtrampkZEhvZE1KQ3R0Rit2YXJvQzRY
cmg2N1VnS1lNeFFOZ0ZMcXVBa0JrbHh4dDd1elB6TWtjMEVkcEdYQzRGVU9i
aytVL1dyTFFUaWNybUNwL1hjNkkvREtteXFlNWg1VHcraE9PNkdBZ1pzWHFa
b1Uvc2x2WFhiOW1pVHdKVW9KVDQ3YjdQaXlZbmtjUGhFcW94aExlemhTWUZB
ZjM1ZXNYYVZjZDRpU2hKMGZxaDc2bnB0aWc4WTZvVFI1N1Ewa1FGQnBzNUJU
eER0VjNkcHQzODI0eTVacE4rTTBpU2IvNTJQcnNsc3JCcTdyQTM5SXJJQ1Ir
RGxwcldNNHpDOU5ITHMvd3ZUNlRBdER5ZmtvY1Q4Q2M2dXRNVTd2U2NmTmta
YVdsbjVjaDNPcmV3K2k3dGl0WXlVMkNQWVFna202bkhVL3dtblIvNEZRSEVh
YmhybFFLZytxTmppRW9oaWEvNGFMWnlwTnlxV0pmQ0F6aTg1bHB5dnZBT2F3
dk81UDJGVXNkZlNUME56RDdMVkh6azJRT0lKdzVMMHBpRWRQRWNjcDVaRWtB
WjBJRWRzeWlnV1hYdys5ZnFmSkVZN1NWYkh2ZTZhbFB2M0tNdFlhK25lQ3ds
MkJVeWFrdXEvczRQSVYvTElNZVlRUk9aM004VlpVUXg1M3pxWWRaTm5sQkxT
TzAxRXAxOGpYelVLZml3N0hGME5iSCtvc2k2RlBHSTFmRGpNRTl5SmgyallB
RThQWFcrWG8zeE5DUUhFYUxqdXJ1dTIxMjR2dFNmNWN5bENyVk4va3VRUTFI
VXRyaGpTNG4rV2JLbkhHb1B6eUhlekEvcy90Y1FtR05aZDlBT2ZYYjk4STdS
SHdNL2dncWMrczIycjVLdTNxTFVBR3I0NzNucERJZkp3bWs3MnN6QWF1aVZU
aUJiRFdPYXdjc2h5MysvZFY3RXRHckJ3RDJtNGZZMWFsblhMRXd3M0RjSWlv
WnJrelE4THlnVW1ONUs3K2FzbnBabkYzY2I5M1ZkeTJ6Y1NqY09uUnZGUDcr
SGhsQzFMUE81azdwd3llajVxSkNHTlFrVlJRU25hMSswRU1NZXcyak9TNWJI
cDk2WVd5ZlZ0VkIrQW9LMDBmWUhiWVdWL2dQd1dwekpKeWxNc2ZiOWNEVmlQ
bWZxM3ZtK0lhRWJ1N0tTSDZGVG1idnlEdTkxaWdQZVpkeGhjbUdsT2tYQUtZ
aEw1QTZkMGVrV1ZaRnExT2FxYTllN2FxeXorcFhDSHBHUURiYzZoZFEwcy9T
QlNSZDRhUGhNSTQwdnZaUHJDZ0JkOTlCS0UzM2Naemg4NHJkWnM3dWJYVUpX
dk91RVkrVW1rb0F0bGdxL2Z5am8wNmhCb21maWN1dStNcmdXb3dkb2RHczVW
NjZGMzBoTWx5S1BIT3VWMDNLWHdGTDRCZys0aGhQbUU2RFkzSFVZYUlaVUtG
T1VySkloc2EvbWRTUVZURmhKRy8rMGY0MGZYVnlsdFppZWt2WXQySmdhMVN4
Mk0rUFdWWi9tVFVsRkxEWGJpTmZrUGkwUXYvQmEzcEkzaXhwVllsNDV0bUZP
Ukt2ZXV6K1lWWWpMSkt5Zms3VFdFdWF6NmhKL3hqRkZVeEcxTUw3WlI1U1g5
UEVqQXY2NS8vZVZ3RGxMUzdIL0toUE5FYldpUkpueFBtdkM2bnlLSWVXZ1c4
eDhudVllNUdNWkFkenFHaTFaVDA3LzhYa21NZjFwUEt0c1ZrVGJHSjl4TkJz
UUdGOE1HQnI5TEtSWXVpbENZSm1FeVJhMVg0MGhmM0lIU0hhOUcySE9wVCtv
OU1wSEJhdXdtN2tYeWdPc0ZtZm00dk10RVJia1RtWUFCU0Q2SXgwayswTDBS
QkdZcWxPVjcxdjBmWEN1b3U3dldVNVVhK09wa3hoUWhyTWhiclFsc0NNVEFM
aTVwOERiWHRuT1F0YXMxbHlkVHV3Qy9lK0tjMnVLazhueW9sL2RwUFV0U0Zj
UTFjdjJNRUNtckQ2NHprdW9yeGlJT3czNkYxSm9ucUFYWFdaTU9mbWtoMlk0
UEdZZ0NONWtreTZRcG15VjVwaStldTN4NjVrb01Jd0NhdGhPNGpieS8rODBQ
S1c2bXdLRkZGZm1NdGNWV2tQYUFqWm43clJpb3lFbU5Tak94S1djZ01YWkpx
dXNUZVdyKzZaMmF2R1hUVm50UWQvMWRmbmhqSEZFSkcrbnJPNkhGL0paRGs1
N2NHUmZLMEVhUEY0dllDeE5vQk1ZNWlGT0JiSEUzSFV3SnBxMnFITG9Ka3pS
cHF1MzBJeEhCa0ZMYkNGMjR2OVBBTGFhZEdTVHArcWxoT2o4TVJ0c3hETXFp
ODA1MGdIRUF4am1VSHJRNGJXbGw5UnRpU2dvMXI3RnNRM1ZuMVY5QkMrQnNR
SFBPcmF5L2Y4NFIyK0JaSW1QdzBqSmh5Rk1PQSt4ZjExUmhNamJqVktrRVJH
czI0TEFESTk5aHFNUzRxTGhwblVoZTE3cy9pTnVHWlcrQ0FrRUhTeVJKTjJI
MjFVY2tsK3J2cGVoTkg1c2ozc1dxNzRpWEJsTXBLeGs3NGF1bVNkb2ZDTzFI
cmljajFQQ2d3ekt5ZUk1TEJpOTRHbUdMc0dkNkdEVmc0ZE85NDNDeGJhRGxh
NGhKUkJiOEJJSGpZTEo4NCt3TG03MnMzcHNqVTgvV3hyaEFMNFFOUXZTMjgr
dTM1enlkRDE5YzBBRFl0Wno2OUF1UnJKUWFYM0ZiVVl3Ukw3YnhrV0xjVDMr
eHJKQ0pVUlNmam1iQlM2NGtoK3ZyVndtTUw0M1p3bVlRMDgzbVQxS1ZmYVZr
T1hVM1dqVW1qcFJXNERoMmFTSHlMd3hRMVQxa2RDN1E4cjhtM0pmOWRTLzBm
RXhOUWg4V1F6QTBKRFJDaU5GWmxNNmVIc01hcE53alIxWUkyWFVFa3hubWxt
cTF3OEVleUJBYys5Tm8yN21SNjMrbjh1dmxOdE1VT0JOWS9PUVBKaDBLdGdl
OHM5c2pzZ096bmFJb1ZsUmorTUdDVmo2eG5mL25HWHgrQjJyU0FXVy9oTTNH
RTVGNDNjclNRRlpnU1A1S2xTV2ozb001aEx5MUxsOEdYNHdyTjVtNEZKL1BP
Q1U5ZnE1cW10R0RablNrTXRPcnlGOTZrVjBVT3dLazljWGRNMzNEd0Jha2hE
Y2JLeW5xdW40UWlRRzJWNHM0RG9nampkbUZ0Rmh5TXRVcDBrMmtISU5PVkoz
OEdTMUpUZlNNOHUzZXlVdkxIZGJvbUNZN3RlMllzLzcyOVdxcldyTE4yVjBr
ZHcvVTVpcEI1Tzg2cG5MQ0VoUUw1OFJWTjVQNnJHZjIvZE9QYUJxYXNNRFB1
eWNpN1ZuVU5NTXhrRk9QODZCbnh0YlUzUHZydFZzdW5RYXhDcFlHcFI2Z1l1
Y2Uxd0g3Yk1la2dzMjk0TTdpc0VLQ2l1dk9ibFpCTklzTHVEZjNIUDk4TTBu
UmdRNEhBRGtFaWw4REgvY3hoc2hxN1FzMGQrTndoWEhuMmJuNk5mbWVoU29L
d1BUM1FXWmZRUE5ZR1VML3hKc0FyKzMrVDVXQjBZVnB2Qk5KSGp0aXlac28w
ZHYyZ1RwM2htMHlDODZvTXVyc3FLYWFpaVVkZzZMRGViZStrK2tzZlZvVXE2
dG9CVW44RVoyVTlVZWVlRGhTR3cwaTI2WlVtWlBCSlRzNk41bDhzT3Zhbzgw
L0pVcHpJS0RnY1BwYW9hT05TN1piRjRWSm5WK0NQd1VGbWZidHd1ZTVaSDlC
MUFZZ1NuTlNYUGdIM0taSHNPZHN1dXZkTDFTcDZlSU4wREVXNytDcFZSZXFF
Vk9vdUpBRDRraThuN0Ixc09TUFVHQW0zSEgyV1BPcGRBbnc3UHQycm9KdURj
MzRCM0FhSDVCWDdyeCs5Wi9vMFZDbGdQMDNsRUVKZW83ZmY1MlBxeWVCTEIy
b0NWOGJGNmh6b3FwUmRNMDR3R3NrTkhFQ002cklPaUVCZFV5Yjl0djhmTTZp
MWpqM3hqWVlzS0pTZUtrNDMvOFhrS0doUksxV0RmNkhYWjBHNElzRHRhUVpW
bm9sRjlyVUE4NitYSnFBcEp5U0ZaU3cwVGQ1NnVIRDUxNWR1MjJIOVptWlV1
U2lnVmdwQ1UzeUFiVzhzYlVwSjA0U3l5a1RNcml4Mi9PbXlIZ3VkVVR5TjVi
bFZtL2dwNTI0Y0lhOE0zQTkxOVh3VzhCRlIrYzR4bHY5NEo3UjRmaW1QZEV4
ZU5tV0pYUC96dGMrZm1zYnd0TmJFWmVVd3krM0FhdnNia2pnb3dobVMxYlBt
MENlMHhVYUhpSWRwZjJZcklrcXdWRGlYMk1ESzZLK01FWTZkYUZoTmZmUHRj
U2txbE0veHV2UWE3UnFtNHVCUjF1NEwwTmRCUEFnM0JrU0FSRmZEa2xINDNT
dnlPdjRVNm1WSDNRUnkxUmZvZFNqNGZlcGpYL1BsUDk0dzVDai92NVBzbks5
WG9XUzdoVVY4SVlQUFUvTjcybzNOck9rbmRjUGYrOXZUbWhjZG9GN2prRG5u
OGhLVTFKL2RoTVpVa0hlSHJJR09RbVZXdDhDQjcra3lqeDZ6eFRSMWdIeFV5
aEpJaFpzRXhJNytuR3ZoMzh3VW5LVnZjZERYSkxkVWQ3a09UYlRSYzNCa1ph
blhNL0lScFVlU1h5OHJ2bm1EcjFFdFdhOENwbFRxbHB6SW8vQ3NSV0Ywb0c1
S0hHdXptcE5Kd2ExeW1qZCtUSVpTYytTQk9sU1FTbTVRZ2pFUk1QMnlJb3dw
L3g4OERDWjVuSUs5SzFaNmk0UGtUR1EyVFdOanZIc3BHVXRTbmY5RklaSkR3
N2pEL2RCRDN0QjhIRTlRcnA4Yzd1WkFTeDhzVTFSNEorMmUvQnAybmM4YlQ1
V3k1d3I5NngyS29kQWRtUFI4TWFwUG9vRjRYbktISUo2dGhLcGtISFRWYklG
WDB0ZjlIa2t1VkR2VExLaUI3MzEydUFlMUo1dC9VclJ3NWt2VHVxdjZCcGRX
c2Y5Nk54bGRNNy91UWZnNFJyb1pnanlSOFNpL1RsZTFZd2xKeG1aMWVTeFFK
TUt4MmlnR1NySUxUeWZWbmR6MXp1SzBuYnBNY2pqYWRSTEk5TG10UFd4Rnoy
TUx6alRNRU9GZzd4N2c2aUE1dHY2WW1jQy9MYXhPZDlYM3NQWjdzWTdWYTdz
NWVMSWVvMXdRbVpGcmlQWnV6NUZjQ25jcWR5eU1CSGJreCtVVllkNVM1ejV3
MkVWOUpld0lIYU9POENBODNxelk4U0hnaExhOFZMR3FyQnFJNzFWaU1wUVh0
MXZpaW1KNnBWUElaZzVONVI4QVVaM3d5Yk1XMXY3T3hHcS83am5KYWtjMGlE
VVVHNUpKMEJqLzhoWUtxZGxwV1B0eEJGOStGQm43T2o0ZnNmTmVzRENFZmdE
QU5OVXdJTU9YWXMxc09pV1VZdmc4OG9TQ2lHU1ZTQWJiS0tpdEVFY3piSlAv
TlFONG1tRnZ4cmJma0lmOUxPYXlhSlN1TzZZT0JIYU9VdmM0TldYU1daRVV1
N1ZMbDl4R1R3aXQwV0J3Vmt1cEJnZVo2czZrU0hYM1AxcFQyWndld21TQmNN
ZGVoQUIzK3VPQUNHOHAwb0FoNlFSNENvTWdiakE2c1NqVDZzeTQwT3R4V2ZK
dmpvNXJaWlpYekVOdUJMY2ZENllxYzdXMnBmQVM3dlE4NjlZYnRqeE5yTVd1
UXZ2dUJWbjlFSStpb0dWdWdFRGlyVEd5Mmt6bHp3U2JidjVmS0xTVkY0amw1
d1Zzak1zTjUrRGVlM29pRWlOdlJRa2NYS0crZzVhWXhybTZCNUR0WG45MmpO
YmtzZFdvQUdNc0ZqQmRvY3B3STgxaVJaQkZDYW9wNXFGTEdGa1BLUThYdTky
aGF4M2ZHTzNaSk1HMVd2NVNmYXY1TkNGYWljZnRubldqT0dCbnAxUGxSK1FB
Wmh4VCtvRVVYU3FJUWNOa0t0UlBxVkp6bUN6bkxFc1lYZnp4OW0yVEYzM0lO
NDBzOEFlL3ZSU0c1NzhvN1ZLaUI0SlduejE5d09xaVlQRzRzVHQ4TlRpaTNn
UzlWdlphR09sdStBZmg5ZlRUWlZnRFlvWjNQSFZnNGU2ZnVzcmlBTllaMEVI
T1k4UWZTaGRRRkFCblZaU2xxejFOblk5dHRHMWhWcU85QXpZcDV6WnVPR05m
L29ESDNlbWpzaFI5SHhSTENQQ3hxL3RrOEVnSWlMNGdDNzdkYWprTS9iNlhv
ZVpiWG1VYnpLYmg3VmhFYmM1Zm1TYzlqc3RkaHRqb3ZsaktTSzBHeDZ5dWNH
aXVkZnRLQk1aOHFvRmxzdXdCVkhyWDFyK2RDMW9NRlpBVVJqWi81N2xFNUIr
Y2FmQXhaZGRvUStkdlU3VEFseDdNa1ZUZlFWbmIrdUlycGZuMHNVNDFwby9I
cml3SnExdFZuZE9pYkE0OXpzclMxSWtJd1RWVGNOZVlTcmdzcUpKMUZ6NXpn
Zi9qemVRZUNQVnpBUFJHb01DSDhZMkh4STYrWWVRVUFZUDRXajBlTU9Kejdh
MndxcVVTNGtNK3d1cmdGL1RocUE2SEhmMUNnc3BFTFVCYzFDTzJ0d0REUktM
QmZOTFdJb0tCWDd2bTlYOCtjNU5xYnMxOERBS1NQM0FNbThnZGVUTnRnVmhI
RUo5eGxXbHhRZmY4WXRsSVcwSUVOMzY1bHEzVGt2N081Y0lJSmtaQzIwYktq
aVRKVDJWbHFxYVFTOHY1OUFYbVMxWU8zMkJYYUo3OUc3SnVKV2xoR2YzWTV3
d1NRNzgxNEhhSUpTU0ovcFhLMTA4eDhWYzQyL01velpiaGlEbEUvYklMT050
eXhnZ1B1N2JhdE9Ec0llNlpNZmxjOHVtcStObTBJdEswTnREeFJxajlXeWxr
cENMcWw4L2FtbnQveTdqcHJGU29ReWV5eUdFU2NJdVdQcUhpcktweTRsanlG
aU96ZzFrTjE0NDMwblNKQXpFQ3ZoYnkrelpHKzcyQmpabk5aYjFaOG5lalVn
OUlxS0tydHpZRWREakJabXBBblhNZGpmamsybkJKZ3FvS3g4alFUU05mOWhq
Tis2VnVINnd2ekpCSUFBT0FjOWZEWDIrWlRPUlNXT2NhVUJqd3pXdHk5S1Qz
YmVwcGhkdFJBelhHbUIxR3hQTjZDNGgrZUZHbDE0TzcrVHlXNDJkWENXOG5p
UXMrci90MzdGWWJMNkJ5VDk1dTlGRnJLN1BURG1FZXNZNW5lVzJpRU43clkx
RHRQVVlVcU5TQkd4NG9XZUhrYm1pOGg5VUVjWTVEeVNOVFBYZEZHdGQvV0Na
MmU1RG0wd1NNY1FmbDI2N0QyaGFOZG5hQnZJQ1B3WHFDT3FNUjhjcnBjblNx
L29heE5PNkdBKzhVSmpTdThJOUt4d2lJN05OWWc5eWpRdEo4bU92ZWRZOWNE
VUtnTTZZZEo4amIrdVZxYTVFZHFOVm9maWYzcTcxZ1FBb2hxenNXTHRwZkFD
cEEzZDE5RFJ6c0VTNmZkMDRqN1FVWldodk4xdzRYeEhhNm9MTFpZRWJkYTU1
VEpnVVRvd0drU25YVWFKMDg3aklYcG4xMjVUZjh1ZnBzdVkyYVRwYmZDMEc2
OEtFWHV6RmNmZHFKa1NmYVVTckdkaHVoTVV4aXBmSDI0UUJjWExuMkltWHU4
YkdmM1ppMUdZZGRVQW9HWEtmNVpPWDBES2ZPSXFqaW5WRzU4QmI1b1NhQTFk
ZjRoOGRWSmJBL1lRcXJDaXdQRmQvcEdRMGVjbEx2cXdpTnJMWEdPUUtOcTQ1
UDZZR1JrNkVzdWdDcUxJeUR4Wi9sYUE1TWVjUjJiSUErSlNMb3doT1NPeWIx
RGtZMUxLZ2hEcVRMZml4M0ZiaGxXeVJxWjluSEtjSEpzSTFGcjZXN2dUL3V2
dEp1OCtnSENOd0RpN3dmdnlZNFlQaHNnN1JVUXJFRWZqSzJwajZkMkRyQUk2
SXRLa2RoY3grMmVic0dwd09jL0M3OU1STFg4UUI3VXlHb0JQS3NuWnAwUnpy
UmoyRW1Xek1zNWxja2NkZlRxWHozYlZuZy9SOXI5NW5sZ0VLaGdPQWlXVVpx
VjNpa3dZbEZ3V2l6KzY2Y2xXZGt6RFRzSEhvbmJRdUwwNEpQUy9UNHhaZTNm
dy9aZ3AvZ21pMGVYYy9Ic1VuRmhJSkhBUnUvOU1ubWgyYjBpVlc2WStJUGpl
d3hoZTRLV0picnNXQnVTYzVkTHU3YitXeU5vU1NVVmxFQTA0NFcva1psL0lX
dUdGVXRFWHAweVpST2FTa1c3cmwxWjkyM0RMQkdHQnNaMzBNODdWbTE2L2k0
dzZSVlUveVc5MlRwbnY5WGZIUkluQ0Q4N29HbzQreVgxZ2pLekVTUC93QU10
MmR5RnJEem11eGxyVEJMUENPb2w1dDJpeDFhbVZFL1Z3cURLU1lqKzZCaEw5
OGFhdExaZXJVd0YwMngwMFl1WGI0RFJnSUdZKy9xQm9PT1NmK3JWYzJOanFJ
cHMxL1EzM0Q3ZUxaMXhMRzhDNmlKeDgvMXJEWnRxNENOZnFFVUZic2xsY3hY
cVlOcXBFVXdtS2E5a0lMdzhBNEJ1SXlRSlBZVzlZd0Q1OEtaTmRZS2VGZEVh
RDBxN0Ivc2h4bno0d0RCMjZOc3Y0TVRUcWNTRmRxYmpjcXVjK3lTZHdHSHJJ
MU1JS0dVQmFvRlp5c0oyWERCSkhHK1Y4d2lVMGZjVTUydzNjbnkvSGhmZ0tQ
a3NCa0JzeUp0OTJnTWh2cnUrbGR2cWN4L2dJbzdpR0Q3ZkxzWmhXQnJPZERw
NDFQVHdXU2VUVzVicVM0Ukxha1NyWDgrYXhtWTk2RTFKOElBMU9BK1ozUHJ3
UUtVUjk1NGJRbWJtWHhtbUsyVDBKWVNrSmhWWmM4NE84b1pGZklZdFl4SFFm
bzJnTkRhTGpxV3lqS3dWWnh2N3BlaVB4ZFVvNGZLOEJ4QjN2UW1kbG5oODZi
bXlheWZjZ1A0MEh5RXVidWk1OGFSY21NRldCZEp1N0pFVGVJSEpWRUxkNzhF
TmV0eUpOZ1F1ZVc2ajdUc1JZR3pQUU5oQ0tCWXFMR3BhUGNyOHNvUWRLVkpW
NzUyd1BxdnJyZThVTlNXeVRvalNLL3R0YjBJYmcwOGdCbGVFMGNuck5rWmp5
T2dyMnNJYWhvalFRUG9keHBVamdpalpiQ0cyUGI3ZnVPRXF1V0E5SUh4d05j
OTZGcFpjS20xVlp3czZDVTlUZExsVkMxM05BeTA2UVQrZ3pKSGNIWllmemtw
ZGovV3hMZThyd25PNUo4dmZzU3BaUmFiL2RzSXlHOHA3dVFUZDYvTzR4Q3hE
bEZweHZFSTVFNVplOS9oSGJFZmZsWVdUdUl1dHNOL3Z5R3hhZkFNWW8xUXdZ
cklGZ3hNK2twcUdYMHNYUUtnK0VsREZ0SXdXd2I3Y2c3UUMrZWRoZVgvc3pQ
R24wSWJMa2J4NUkyalFiVUVxelh4NXVNT3VBeXhDYXM4cUo0SWtxa3RQMHF3
Zy9LZ0NWZVFWa1k1SXFUQUNOMHRyRVRHSDRzV0FjNTJiSDR0REw5S0NtV3U0
NE5IT1l0Ry90Z3R3N2JET0xGVTViaWZhdTcxSGpFdWhhYnBSN2w2V2dlV3R0
ZXIvTWtXeS95M1ZML0VoVXEwc0k3UVV3aU9tVTRvTlZwbHVJVWZnQ1JFUSs5
QWFvTFgwMlg0czhKZnlmK0JkUTNFdVpVeFNBdkpCR0pHNXdVV2RIUk8wZWpL
UjlIa3hlanVNaGdoVnlaK2NDYTBMK2ZHa0p2VTZYc1RON1FObi96bXpXWEk1
UnB5VDZ6ZXpWT1JXd0xVUUFrYVhnV3gzYnRkaFJRUlE5ckJCNElBUWtwRjRH
NUQzUEQwTGs1aW92UjU1ZmY3MExsVU10eit1bVU3Wk0rOVBISTg0THFMbHp0
WVZkYmtUdGRjZ09TMjFRWU5zdVlJSmlkdWFEUWpKM1ljT3QxczdaVnFFcWcw
Yk9udWRLZnRiWUJ0YWZNTjdJdjF1MVZDQUhRSXpyVzhHeTJCVUltVy9BWEJD
SVZQMmI0V0xaMXhiZHpmV3o2Z284eXlwUmVkSmViQ3huZ0hlb1FFN0ppMnJX
aEFvSUpUSXhCRmdhUUR2L0V3blZESE04NkNQWS9NeUxzY0FsVTVyWEJsc0Iv
Y1FHbGJVVEpJaTJNQ2RSLzBlVytmZ2xQNFdNdVB6Z0JUazdUWmQ3QUdKUDg5
TDZGUENrdGlMTHlNZ2MvdTRPL3ZxTGdMSnpqN0Zvekd1RTFydE8vZm5rMDBR
UkxJN245Zk9TYjR5ekVNNUV3eFBDQ1NKWjh6cGRPT0RTdDhrSWg0NXVKdVFH
ZThiQ2szcE5XOHlZcGtlOVlxenlkWjFIdlA0S09EM2srS084c0hJMG5HZzhu
dUthbm9GRllWaWdHbFZCeCtENlcwMWo3OFIwSGI5RmVob1B5SXRicHhWVHdt
NUlVUTJyTER4L2gzZ1lUUEZkTXBOMFkvanM4ZEFiQWFQUEEwUUhvZnViOEc0
QnQrZ3JEZ2FCa0MzZ3lLYi8zN3dBaGdld0ZCL3dWSmdwRWdLa01VcEhlTVIy
b2R0VTZXTzZ2TkZJWjM2enJ4eEp6N2ZQRWFydVJrWWxtS3NjWUh6MDJpM1p0
N2Q2NXNEdlRvRkFFRThRczZkRkhhWlkwRGFocGJ6WXEzNStuUU5zVjE2SzF4
L3AvWllySlZVNnFtb2dCTmVTS3E5d2RtU2srcklHOGZKWjMzWFh0MlJ3RG43
OGVRYWlNOVk1NCtGb2VGZk9RamEyaUNlRmI5Q2F3NDljTFdVSjk0aks2WWtq
YzlOUGIreTh2WGdqcm9NL3ZCQ3BDaDkxVmwxV1kwZGdpbEZidzRVUTliZHFT
c2xsckIxWWd4Y004amppU0RTckpyd3J1OHJkL21pUUpmRTQvWTBoWGtuZFU2
NHJUb2tFVllrb3FaVmFWYUs0ZFc1TGpKUXNTV0xHOWpQd1ZrS2grVGp6T1dM
TWxqTmhRd2ZhT0pzdzk4REZxVDFTMkNCaFNUUlVlNHRFMFJVRjlMSjlITGxk
YlJ1a3ppQ0dSRVJHcVRwcmloZkFxeng2N29xbzZkT1dZVit2b1pSZXFodERm
eVVBSTc0WHBkenhKRi9QOWNDaW93UjIvdDREY3oxUFZtWml0NzJiand4a3V4
MWRmTVFHNWRxeERoZjFaMXVnMlZOT1l5RHJ3aHllOGJuaExVaVh6QTFrK0NZ
OFd1ZVpJTGpCMnRwV3ZkckZZbG8yRVFMdjFLakpNN3NIZE9VdnVabnFlV0Uv
d2VRWXVhZFJZYVcxMmpsZlRqZXNlTmI3aUplN3dKNjlCMVpMQ3BSeXlNeDBr
UVJ1QStKMWtOMWthUzZFbXg5RE52cTFiWEtXMnhudWVEckR5dmJUZGZIbzgw
MVZoY3A2T2Fha3dTYjU0MW1vU05KQUNKMStQMHJHamNIT1JLOHZSV0gyQmgr
cnd2bmNPeVBNRDZhd0wrd2pPdzYyb2t1SVpHZERFT0FPWFN3SXBwMjNOZFJC
NmpaZXZ0RG9jcjNvWW9Ecmwxd0dxSDUzWVRBZ2Jld1cyaW0yYU1memFqQ0Rw
MHdMK1pwSE9WVkVxSVNMMmpkOHFaYXFlRklrdmgyZFNLR0ZNNDFlVTc1Tm9Z
Wisvd0FOSjdxcDBFeG5RV2NzNkFKWEZoYnhrY1JUTXh2MlJlVXRkM0R5eFNj
alFoMXQ4eGVPOGJZMG45dEEyYkl0cGRqZmJDZjlIWjBqaHNMY0x4cG1IWFdl
RVZNWmZEMmp3YXg0aVdGTVVBNkJyUDN6QzBmdnNpcXdXc3M2OENXWG5mNENK
NktMOWNCbjdqaVZmZGpvaVU1eFNKT0ZCMDlITm84SDZZMnMzZnpaTG1xUXlZ
NWIxaXpKQjUyOXppcXd3a3NPVGo2MmNKUTB3czk0UHFTUzFHTmtPZ2tEWWdy
QUNLY1NXa3FCVk1NY1hQcWJHYU4wOUhtUVFQdnZnYmpBeGFHTjNKWWlKdWRS
cjZpUko4T213MDFBUmt5VmtrdmN1M2c2a1dGQ0JXZHkvaG5DcUo1aDREUT09
Lm95SHZ2M0I5YklqMTBRamUuM2JZK1Q5V0l1MEFOeTBWYVIyZWxWQT09Iiwi
c2lnIjoiS1JSaWswSHRkM3NmYXNvc3grRUVTVVN0UnhKMGg0aFV0c3FidHU1
R2xGcFNncExDZDNGWjNMZVlzYVFibmRtNjJBdnhLV0VWcTNUS2hWamNTVVdr
REE9PSIsImFsZyI6ImFlcy0yNTYtZ2NtK2VkMjU1MTkifQ==
-----END LICENSE FILE-----
`
const decode = lic => {
const enc = lic.replace('-----BEGIN LICENSE FILE-----', '')
.replace('-----END LICENSE FILE-----', '')
.replace('\n', '')
const dec = Buffer.from(enc, 'base64')
return JSON.parse(dec.toString())
}
const verify = (der, enc, sig) => {
const key = crypto.createPublicKey({ key: Buffer.from(der, 'base64'), format: 'der', type: 'spki' })
return crypto.verify(null, Buffer.from(`license/${enc}`), key, Buffer.from(sig, 'base64'))
}
const decrypt = (secret, ciphertext, iv, tag) => {
const digest = crypto.createHash('sha256').update(secret).digest()
const aes = crypto.createDecipheriv('aes-256-gcm', digest, Buffer.from(iv, 'base64'))
aes.setAuthTag(Buffer.from(tag, 'base64'))
aes.setAAD(Buffer.from(''))
let plaintext = aes.update(Buffer.from(ciphertext, 'base64'), null, 'utf8')
plaintext += aes.final('utf8')
return plaintext
}
const { enc, sig, alg } = decode(LICENSE_FILE)
if (alg !== 'aes-256-gcm+ed25519') {
throw new Error('unsupported algorithm')
}
const ok = verify(PUBLIC_KEY, enc, sig)
if (!ok) {
throw new Error('verification failed')
}
const [ciphertext, iv, tag] = enc.split('.')
const dec = decrypt(LICENSE_KEY, ciphertext, iv, tag)
console.log({ dec })
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment