Skip to content

Instantly share code, notes, and snippets.

@lekevicius
Created May 23, 2021 16:53
Show Gist options
  • Star 13 You must be signed in to star a gist
  • Fork 3 You must be signed in to fork a gist
  • Save lekevicius/13c21b72e1d9c1bdf03234c7d9bcfd84 to your computer and use it in GitHub Desktop.
Save lekevicius/13c21b72e1d9c1bdf03234c7d9bcfd84 to your computer and use it in GitHub Desktop.
// Reikia base45 iš npm
const decode = require('base45').decode
const { subtle } = require('crypto').webcrypto
// Mano paso informacija kaip pavyzdys. Čia galima įrašyti savo.
const pass = '135$MPFW.CWE43F471ASB8IE4$F4O-DWF7+S99N9*+A6%O8C9.MA3Q59KCWE41A6FA73Q5*/EWE4/96PF6FL6XW6RF6U47X96YF4ZQEWE4/96OF64:6F46RF6U47X960G4WE4WF49G4IE0%*5/:E*Q6L24ZH6PI7GM62SC 0LRGEDHA5IED:J+3E5LMC7O:VB841L+3ZL0BG0Y6UZGLP9HTYP-$BL4T:.GWINR1EOAL7E0TVISUMYW3*GCCV5**K**0C5I2HBTZE M5YB7M22CO7QJF:+PCXGBUAG*K616-7EWICW58TI5YAVH+EDO9Y8KBVVBDGT%IM4U139J-PB.C6I4$/NMG6VVOB-INUMHLD5$9B$5:JS $AQJT9NPF3EHT0P:J2QRB.PL$7F2SRGG0.0*9VUY2-7G4Q65T9AEKN.9XHSG:8/3H LV0DQPAM7PVT1GBOQSUBR+M$Y82TGWB0O$FR54F*T2P3YYNJQ1QW9+XJ/.NHE3P5DWB2NDR0QFOXVZJPA5B'
// Kokio ilgio duomenų paketas? 135.
const len = parseInt(pass.substr(0, pass.indexOf("$")))
// Pačio duomenų paketo ištraukimas
const encodedPayload = pass.substr(pass.indexOf("$") + 1, len)
const ob = {
// Iškoduojam per base45 ir JSON
payload: JSON.parse(decode(encodedPayload)),
// Neiškoduotas variantas parašo tikrinimui
payloadInBase45: encodedPayload,
// Pats parašas: viskas, kas likę QR kode. Išsikoduoja į Buffer.
signature: decode(pass.substr(pass.indexOf("$") + 1 + len))
}
// Viešoji rakto dalis. Ištraukta iš Tikrinimo puslapio kodo.
const parsedKey = Uint8Array.from(atob('MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA8LnAER0q8iyuIG6yGNBE/8/hoDgrg0oq/ko0vLsmJWMzop31VTbT5uZe0oivYTFaa/g1DXHhWYzS3ld85d8BzCT46ySMI2WkDKEwGLLZg6Fe+bKzd+Zr6hg5+Oss+CNt9d3O4EdXgsDF2UcZeZd1o/waKyVAaXN9hhBimPqz00tMyGknSy1lhl5Moom6+DKqRg2eNb1bYoFTEiDXEcfuq8xxYEYNSAjdcl/DRJ7pPnM+FlAC4uPXnVYNzAXmCQD4l8zY7SccZvxfc0NAOBVuTBn2pA/yD/GsOli1a6Gi38dGCo7syjyvm/tT/anSHiIC4DClthvDlKGNB4VDcjPvXwIDAQAB'), (e => e.charCodeAt(0)));
// Patikrinim!
function verify(payloadInBase45, signature, key) {
return async function (payloadInBase45, signature, key) {
console.log(payloadInBase45, signature, key)
return subtle.verify({
name: "RSASSA-PKCS1-v1_5"
}, key, signature, function (payload) {
const len = new ArrayBuffer(payload.length)
, buffer = new Uint8Array(len);
for (let t = 0, r = payload.length; t < r; t++)
buffer[t] = payload.charCodeAt(t);
return len
}(payloadInBase45))
}(payloadInBase45, signature, key)
}
subtle.importKey("spki", parsedKey, {
name: "RSASSA-PKCS1-v1_5",
hash: {
name: "SHA-256"
}
}, !1, ["verify"])
.then((importedKey => verify(ob.payloadInBase45, ob.signature, importedKey)))
.then((isValid => (console.log({
isValid: isValid,
payload: ob.payload
}))))
.catch((e => Promise.reject(e)))
// Turėtumėte gauti mano duomenis ir faktą, jog parašas sutampa.
// Puslapis taip pat patikrina datas, tą kodo dalį išėmiau.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment