From 1141cd6d78be18971bced6158bec4a018b29386b Mon Sep 17 00:00:00 2001 From: Renaud Bidou <34469789+rbidou@users.noreply.github.com> Date: Tue, 9 Jul 2024 14:18:51 +0200 Subject: [PATCH] v1.0 --- README.md | 0 css/forms.css | 238 ++++++++++++++++++++ css/main.css | 62 +++++ css/variables.css | 133 +++++++++++ html/ztaa.html | 34 +++ img/icon128-inactive.png | Bin 0 -> 2399 bytes img/icon128.png | Bin 0 -> 2402 bytes img/icon16-inactive.png | Bin 0 -> 478 bytes img/icon16.png | Bin 0 -> 478 bytes img/icon48-inactive.png | Bin 0 -> 1177 bytes img/icon48.png | Bin 0 -> 1180 bytes js/background.js | 8 + js/functions.js | 473 +++++++++++++++++++++++++++++++++++++++ js/ztaa.js | 47 ++++ manifest.json | 31 +++ 15 files changed, 1026 insertions(+) create mode 100644 README.md create mode 100644 css/forms.css create mode 100644 css/main.css create mode 100644 css/variables.css create mode 100644 html/ztaa.html create mode 100644 img/icon128-inactive.png create mode 100644 img/icon128.png create mode 100644 img/icon16-inactive.png create mode 100644 img/icon16.png create mode 100644 img/icon48-inactive.png create mode 100644 img/icon48.png create mode 100644 js/background.js create mode 100644 js/functions.js create mode 100644 js/ztaa.js create mode 100644 manifest.json diff --git a/README.md b/README.md new file mode 100644 index 0000000..e69de29 diff --git a/css/forms.css b/css/forms.css new file mode 100644 index 0000000..e230ced --- /dev/null +++ b/css/forms.css @@ -0,0 +1,238 @@ +/******************************************* + FORMS +*******************************************/ + +/** INPUTS **/ + +input { + font-family: var(--default-fonts); + border: solid 2px var(--form-border-color); + border-radius: .25rem; + color: var(--form-text-color); + background-color: var(--form-bg-color); + padding-top: .5rem; + padding-bottom: .5rem; + padding-left: 10px; + width: 300px; + font-size: medium; + font-family: var(--default-fonts); +} + +input:disabled { + border: none; +} + +textarea { + font-family: var(--default-fonts); + border: solid 2px var(--form-border-color); + border-radius: .25rem; + color: var(--form-text-color); + background-color: var(--form-bg-color); + padding-top: .5rem; + padding-bottom: .5rem; + padding-left: 10px; + width: 300px; + font-size: medium; + font-family: var(--default-fonts); +} + +textarea:disabled { + border: none; +} + +input[type="select"], select { + background-color: none; + height: 41px; +} + +input[type="select"]:disabled, select:disabled { + border:none; +} + +/** BUTTONS **/ + +.buttons-row-container { + display: flex; + flex-direction: row; +} + +input[type="button"], +input[type="submit"] { + padding-left: 0px; + padding-right: 0px; + width: 315px; + cursor: pointer; + margin-top: .2rem; +} + +.span-button { + padding: var(--default-vertical-padding) var(--default-horizontal-padding); + width: auto; + cursor: pointer; + margin-top: .2rem; + border-radius: var(--default-border-radius); + border: solid 2px var(--main-border-color); +} + +input[type="button"]:hover:not([disabled]), +input[type="submit"]:hover:not([disabled]), +.span-button:hover:not([disabled]) { + background-color: var(--button-hover-color); + color: var(--alt-text-color); + font-weight: bold; +} + +input[type="button"]:disabled, +input[type="submit"]:disabled, +.span-button:disabled { + color: var(--inactive-color); + border: solid 2px var(--inactive-color); + cursor: initial; +} + +/** CHECKBOX **/ +input[type="checkbox"] { + /* Reset system appearance */ + -webkit-appearance: none; + appearance: none; + margin: 0; + padding: 0 .25em 0 .25em; + + /* Box appearance */ + font: inherit; + border: solid 1px currentColor; + border-radius: 0 !important; + color: var(--form-text-color); + background-color: var(--form-bg-color); + width: 1.15em; + height: 1.15em; + + /* Cursor */ + cursor: pointer; + + /* Set display */ + display: grid; + place-content: center; +} + +input[type="checkbox"]::before { + content: ""; + width: 0.65em; + height: 0.65em; + /*clip-path: polygon(14% 44%, 0 65%, 50% 100%, 100% 16%, 80% 0%, 43% 62%);*/ + transform: scale(0); + transition: 120ms transform ease-in-out; + box-shadow: inset 1em 1em var(--main-text-color); +} + +input[type="checkbox"]:checked::before { + transform: scale(1); +} + +input[type="checkbox"]:disabled, +input[type="checkbox"]:checked:disabled::before { + color: var(--inactive-color); + cursor: initial; + border-width: 1px; + box-shadow: inset 1em 1em var(--inactive-color); +} + +.checkbox-static { + cursor: initial; + pointer-events: none; +} + +.checkbox-form { + display: flex; + gap: var(--default-horizontal-padding); + align-items: baseline; +} + +.input-small { + width: 200px !important; +} + +.error-form { + border-color: red !important; +} + +/** SELECT LABEL **/ +.header-list-label { + font-size: large; + margin-right: var(--large-horizontal-margin); +} + +/** PLACEHOLDER **/ + +::placeholder /* Chrome, Firefox, Opera, Safari 10.1+ */ +{ + color: var(--light-grey); + font-style: italic; + opacity: 1; /* Firefox */ +} + +:-ms-input-placeholder /* Internet Explorer 10-11 */ +{ + color: var(--light-grey); + font-style: italic; + opacity: 1; /* Firefox */ +} + +::-ms-input-placeholder /* Microsoft Edge */ +{ + color: var(--light-grey); + font-style: italic; + opacity: 1; /* Firefox */ +} + +input:-webkit-autofill, +input:-webkit-autofill:hover, +input:-webkit-autofill:focus, +input:-webkit-autofill:active { + -webkit-box-shadow: 0 0 0 30px var(--main-bg-color) inset !important; + -webkit-text-fill-color: var(--form-text-color) !important; +} + +/** SELECT **/ +select { + font-family: var(--default-fonts); + border: solid 2px var(--form-border-color); + border-radius: .25rem; + color: var(--form-text-color); + background-color: var(--form-bg-color); + padding-top: .5rem; + padding-bottom: .5rem; + padding-left: 10px; + width: 316px; + font-size: medium; +} + + +option:hover { + background-color: var(--highlight-color); + color: var(--highlight-text-color); + font-weight: bold; +} + +/** DATE **/ +input[type='date'] { + color: var(--light-grey) !important; + font-style: italic; + background:var(--main-bg-color) url(/img/icons/calendar.svg) 97% 50% no-repeat ; + color: white; + padding-right: var(--default-horizontal-padding); + cursor: pointer !important; +} + +input[type='date']::-webkit-calendar-picker-indicator { + opacity: 0; +} + +input[type="date"]::before{ + content: attr(placeholder)": "; + white-space: pre; + } + + input[type="date"]:focus::before { + content:""!important; + } \ No newline at end of file diff --git a/css/main.css b/css/main.css new file mode 100644 index 0000000..63e2510 --- /dev/null +++ b/css/main.css @@ -0,0 +1,62 @@ +body { + width: 250px; +} + +.extension-main { + display: flex; + flex-direction: column; + width: 100%; +} + +.extension-title { + display: flex; + justify-content: center; + font-family: "Russo One"; + font-size: 1.1rem; + color: var(--pcb-blue); + width:100%; + margin-bottom: var(--default-vertical-margin); + margin-top: var(--default-vertical-margin); +} + +.extension-form { + display: flex; + flex-direction: column; + align-items: center; +} + +.extension-buttons { + display: flex; + flex-direction: column; + align-items: center; + width:100%; + margin-top: var(--default-vertical-margin); +} + +.extension-button { + padding: var(--default-padding); + color: var(--main-text-color); + background-color: var(--pcb-blue); + width: 200px; + text-align: center; + cursor: pointer; + font-size: medium; +} + +.extension-button:hover { + background-color: var(--highlight-color); +} + +input { + font-family: var(--default-fonts); + border: solid 2px var(--form-border-color); + border-radius: .25rem; + color: var(--form-text-color); + background-color: var(--form-bg-color); + padding-top: .5rem; + padding-bottom: .5rem; + padding-left: 10px; + width: 200px; + font-size: medium; + font-family: var(--default-fonts); +} \ No newline at end of file diff --git a/css/variables.css b/css/variables.css new file mode 100644 index 0000000..a5985bd --- /dev/null +++ b/css/variables.css @@ -0,0 +1,133 @@ +:root { + + /********************************** + * COLORS + **********************************/ + + /* Values */ + --pcb-blue: rgb(28, 65, 123); + --dark-blue: rgb(7, 16, 29); + --dark-red: rgb(179, 14, 14); + --green: rgb(14, 163, 14); + --dark-green: rgb(0, 94, 0); + --light-grey: rgb(170, 170, 170); + --light-grey-transparent: rgba(170,170,170, 0.4); + --dark-grey: #666; + --light-blue: #69ccfd; + --pink: #d8659f; + --light-green: #389277; + --light-yellow: #c4c082; + --light-red: rgb(255, 50, 50); + --orange: rgb(255, 136, 0); + + /* Low opacity */ + --pcb-blue-low: rgba(28, 65, 123, 0.4); + --dark-red-low: rgba(179, 14, 14, 0.6); + --green-low: rgba(14, 163, 14, 0.6); + --orange-low: rgba(255, 136, 0, 0.6); + + + /* Main Aliases */ + --main-bg-color: var(--dark-blue); + --main-text-color: white; + --main-border-color: white; + --highlight-color: var(--light-blue); + --highlight-text-color: var(--light-blue); + --highlight-icon-color: var(--light-blue); + --highlight-border-color: var(--light-blue); + --alt-bg-color: white; + --alt-text-color: var(--dark-blue); + --inactive-color: var(--dark-grey); + --shadow-color: var(--light-grey); + --active-color: var(--light-blue); + --success-color: var(--green); + --fail-color: var(--dark-red); + --warning-color: var(--orange); + --info-color: var(--pcb-blue); + + /** Terminal **/ + --terminal-bg: black; + --terminal-border: var(--light-grey); + --terminal-text: white; + --terminal-error: var(--light-red); + --terminal-success: var(--green); + --terminal-warning: var(--light-yellow); + --terminal-info: var(--light-blue); + + /* Status Aliases */ + --error-color: var(--dark-red); + --success-color: var(--green); + + /* Form Aliases */ + --form-bg-color: var(--main-bg-color); + --form-text-color: var(--main-text-color); + --form-border-color: var(--main-border-color); + --input-highlight-color: var(--pcb-blue); + --button-hover-color: var(--highlight-color); + + /********************************** + * SPACING + **********************************/ + --default-padding: .5rem; + --default-margin: .5rem; + --default-horizontal-margin: .5rem; + --default-horizontal-padding: .5rem; + --default-vertical-margin: 1rem; + --default-vertical-padding: .5rem; + --default-spacing: 1rem; + + --small-padding: .2rem; + --small-margin: .5rem; + --xsmall-margin: .2rem; + --large-padding: 1rem; + --xlarge-padding: 2rem; + --xxlarge-padding: 3rem; + --large-horizontal-margin: 1rem; + --xlarge-horizontal-margin: 2rem; + --large-vertical-margin: 2rem; + --xlarge-vertical-margin: 4rem; + --large-spacing: 2rem; + + --menu-padding: 1rem 2rem; + --inner-padding: 3rem 2rem 1rem 3rem; + + /********************************** + * SHAPES + **********************************/ + + --default-border-radius: .25rem; + --large-border-radius: .5rem; + --xlarge-border-radius: 1rem; + --default-box-shadow: rgba(0, 0, 0, 0.16) 0px 3px 6px, rgba(0, 0, 0, 0.23) 0px 3px 6px; + + /********************************** + * FONTS + **********************************/ + + --default-fonts: system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue","Noto Sans","Liberation Sans",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji"; + --pcb-font: "Russo One"; + --font-weight-light: 100; + --font-weight-bold: 500; + --terminal-font: "Source Code Pro", monospace; + --font-small: 0.9rem; + --fint-xsmall: 0.8rem; + --font-large: 1.1rem; + --font-xlarge: 1.2rem; + + + /********************************** + * JSON + **********************************/ + --json-key-color: var(--light-blue); + --json-string-color: var(--green); + --json-number-color: white; + --json-boolean-color: var(--orange); + --json-payload-color: red; + + /********************************** + * SIZES + **********************************/ + --navbar-height: 6vh; + --module-menu-height: 5rem; + +} \ No newline at end of file diff --git a/html/ztaa.html b/html/ztaa.html new file mode 100644 index 0000000..97ec5e6 --- /dev/null +++ b/html/ztaa.html @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + +
+
+ ParaCyberBellum ZTAA +
+
+ + + +
+
+ Update ZTAA Settings +
+
+ + \ No newline at end of file diff --git a/img/icon128-inactive.png b/img/icon128-inactive.png new file mode 100644 index 0000000000000000000000000000000000000000..4d4b23afb4ee58b60774bccb60cf71974cc3b47c GIT binary patch literal 2399 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 literal 0 HcmV?d00001 diff --git a/img/icon16-inactive.png b/img/icon16-inactive.png new file mode 100644 index 0000000000000000000000000000000000000000..e9d9bd04e97f72c1a828ad34480f96781ad6b53e GIT binary patch literal 478 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbMft^l79S0LTc&@gl6%(-*tPMS1n z+O%mv_PlxXrca*^WB|!IbLPyNH47*{W5x_111Jb2fovcHA_C+>0FVm=Kyio^gn>o^ z6#x~36@pX(*=P!gY4jZ+92l z3%P-jKu(vZi(`m{B}6Zizq;$`!}7Y<`Ou_ZbCS23l(y}4@Dfm~^^)mk(DNa}xx3f*v*+iw-u zI_pD!{6lZNsTT8Fo%C>XvO!^d>dUpeITQZvwEFQXlP}@ds#ir)47>aJcOS67^jvmQ UNsQ@hpfeaeUHx3vIVCg!01_GIJOBUy literal 0 HcmV?d00001 diff --git a/img/icon16.png b/img/icon16.png new file mode 100644 index 0000000000000000000000000000000000000000..e33b1ade129762ef3f3b8a03d5284c96b40f5025 GIT binary patch literal 478 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbMft^l79S0K&c&|qwwCSqNt;@Kc) zQz7NhAYof6?$#i0TP5REE$LJ(?OZA4SR?INE8|!x?OY}0P$TDDCF@ip<4_~xR3!}} zt7RQPBGO=njANCI14ys5W3`N9wJewfF&wIaf{ynKQpqGFQL@@ne(_Kq&DZXTXKfeDEj#iivHRTCF1TC-{M z)*XBI?LTnp^tlU{u3o=&``O!%pT7L~*TpE`2Q-H<$=lt<_Cju8B#_hP>Eak7A<24> z)rkqn-FWlvjaJzkYw!HO|CH^F%)WY=a|{uZ|HA&xUEg$Y#j3fp3wznt^snxE`mp@5 zsd}iWPi#rf{#8urZ*Q(zbs$$-Y_-;mKa%<%qCz*^<@Q^}wa)s`AOFxBZ>q)oRwq5& zoNQ1SpZap`Zq9^%JFR}a%H&JeQ)o=gtKR0=Yo(dGqE?pFVx|?Abs;APJO(aOcdK zGh@b#S+izMn>GzdLIi;#KwUs(5GkM_L<%Sf6oHEa1tAI`>e1Lh#c%+T0&;;`fFwjc zgbn8+3&Pc7ngBNhE`??SvN*D0Wb={5(bUs|yZNWud0?FNmjw9*GcYnSv#_$Ub8vET z^YHTV3y6w|OUcM8D5|KcscY-#=^GiFn3`Ex+t@idyZHDA28Bk(#>FS6rDta6<`3g|+xDHicJJA{Z~wt#Cr_U_ zd+y?;D_5`IynX-SqsLF4zj*!b!>7+*zJB}u+_Zs9apDBeyouS0XD`gko)WX{_JnAk#l7F- zx4nOp^ZfU@pKHI`2(&Kd=KdbF!Rz0;!l--SLKbdX``muxlh_8)pvb@)sV9W5`=aX);t|H_kNd_Ny>xTU>p+v={qVs2$8va>h9eIP?~W>|&Hz$f4K2vVNt3r6S&;q5Ra~U?QphDNB zpIIs2;Qd*McLR&imXxx?i>I?`Z1s;2XiS)4^~7{fvZIL5f9@=XlKS+6n@a_9D_q&j zY!>BiVoSZ^v*F1#quj?=HMAubAAeD`W{JMH^EV!?8;xk}cxLE51~%C1_$ zp+erSM#iB+#;!)%xl+opM$WNT)}czqxk}oxR?4Xg%&nGnu9b1BmI5NjN;!vWS*L1g zry6O;Dk+B=X@?qF$7-OgjAMC0_laY!FoY#ph~AI zBwZktKm(!5APOK_z|Mo11M>pJBT&QPRsg*QW<%`-S_+XOiTwZn|I0m53xHA9UlQaO z%)rRR%)-jX&cVsW&BM#bFCZ!=E+r$Yps1p%rmn4{r*C9zVrph(ZDZ%;?Be4e7!(>A z8yBCPmY$iNn_pN`R$ftARbA82*woz8*3mz4@|3C5XUv>4ciw_Ui)>ZQFP5 z+P!D*zWoP}ojiT!?754Vu3Wu-^Y;CRj~+jH{^Iq!51&4N`TFhqkDtGO|M~kboBfv) z&}ocG-tI0FD!BT1fb2h>E{-7*lD!AJoxKxf*dCPMm==_$xoHEJ;=~D_c@wi0&t907 zJtbz@?FrF7i+jJvZ+rhH=lSn*Ki7V>5ole^&HX)UgV(=xg;Dpug)H2(_PPDWC$G=4 ztyz<*;(WMh4|6K(?qwPt-$I;&>_7CT>hPH!I$BjQTr7G@+AAUYvf%lR8ZVhI_zBARHg|7% z%Pg>vW7n$3m$%Gey5KM9voBHWFGH1P)9GBT<&1L{aOf=#*~KWckVCJ3WeHQpVh+8} zA%_@VX*6k0NWHf|>PhWFmSt&L^B4LAF*$H$;`M5SJGF+I9zHhmsw~Zl2l-l`jYKWS%|WJeL9|J+#& zCH3hCH { + + if( stored['ztaa-rules'] && Array.isArray(stored['ztaa-rules']) ) { + const rules_params = stored['ztaa-rules']; + + if( rules_params.length > 0 ) { + + deleteDynamicRules() + .then( () => makeDynamicRules(rules_params) ) + + } + + } + + }) + +} + +function setIcon() { + + chrome.storage.local.get(['ztaa-rules']).then( (stored) => { + + if( stored['ztaa-rules'] && Array.isArray(stored['ztaa-rules']) ) { + const rules_params = stored['ztaa-rules']; + + if( rules_params.length > 0 ) { setActiveIcon() } + else { setInactiveIcon() } + } + }); + +} + + +// +// EXTENSION ICON +// + +function setActiveIcon() { + + chrome.action.setIcon({ path: { + "16": "/img/icon16.png", + "48": "/img/icon48.png", + "128": "/img/icon128.png" + }}) + +} + +function setInactiveIcon() { + + chrome.action.setIcon({ path: { + "16": "/img/icon16-inactive.png", + "48": "/img/icon48-inactive.png", + "128": "/img/icon128-inactive.png" + }}) + +} + + +// +// RULES PROCESS9ING +// + +function makeDynamicRules(rules_params) { + + let new_rules = []; + const browser = saysWho(); + + isLatestVersion(browser).then( (browser_latest) => { + + const jwt_payload = { + 'fp': makeBrowserFingerprint(), + 'browser': browser, + 'latest': browser_latest + } + + // Apply new rules + rules_params.forEach( (params, index) => { + const ztaa_server = params[0]; + const ztaa_header_name = params[1]; + const ztaa_key = params[2]; + + const ztaa_jwt = generateJWT(jwt_payload, 'HS512', ztaa_key); + + const new_rule= { + 'id': index + 1, + "priority": 1, + "action" : { + "type": "modifyHeaders", + "requestHeaders": [ + { + "header": ztaa_header_name, + "operation": "set", + "value": ztaa_jwt + } + ] + }, + "condition" : { + "urlFilter" : ztaa_server, + "resourceTypes" : ["main_frame", "sub_frame", "stylesheet", "script", "image", "font", "object", "xmlhttprequest" ] + } + + } + + new_rules.push(new_rule); + + }); + + chrome.declarativeNetRequest.updateDynamicRules({ addRules: new_rules }) + .then( () => setActiveIcon() ) + + }) + +} + +async function deleteDynamicRules() { + + setInactiveIcon() + + // Delete previous rules + const previous_rules = await chrome.declarativeNetRequest.getDynamicRules(); + const previous_rules_id = previous_rules.map(rule => rule.id); + await chrome.declarativeNetRequest.updateDynamicRules({ removeRuleIds: previous_rules_id }); +} + +// +// ZTAA COMPONENTS +// + +// BROWSER VERSION +function saysWho() { + const ua= navigator.userAgent; + let tem; + let M= ua.match(/(opera|chrome|safari|firefox|msie|trident(?=\/))\/?\s*(\d+)/i) || []; + if(/trident/i.test(M[1])){ + tem= /\brv[ :]+(\d+)/g.exec(ua) || []; + return 'IE '+(tem[1] || ''); + } + if(M[1]=== 'Chrome'){ + tem= ua.match(/\b(OPR|Edge)\/(\d+)/); + if(tem!= null) return tem.slice(1).join(' ').replace('OPR', 'Opera'); + } + M= M[2]? [M[1], M[2]]: [navigator.appName, navigator.appVersion, '-?']; + if((tem= ua.match(/version\/(\d+)/i))!= null) M.splice(1, 1, tem[1]); + return M.join(' '); +} + +async function isLatestVersion(browser_version) { + + const browser_parts = browser_version.split(/\s+/); + const browser = browser_parts[0].toLowerCase(); + const version = browser_parts[1]; + + return fetch('https://www.browsers.fyi/api/') + .then(response => response.json()) + .then(data => { + if( Object.keys(data).includes(browser) ) { + const current_version = data[browser]['version'] + return version == current_version + } else { + return false + } + }) + .catch( () => { + return false + } ); + +} + +// BROWSER FINGERPRINBT +function makeBrowserFingerprint() { + + /* + const raw_fp = [ + navigator.appCodeName, + navigator.appName, + navigator.deviceMemory, + JSON.stringify(navigator.gpu), + navigator.hardwareConcurrency, + navigator.language, + JSON.stringify(navigator.mimeTypes), + navigator.pdfViewerEnabled, + navigator.platform, + JSON.stringify(navigator.plugins), + navigator.product, + navigator.productSub, + JSON.stringify(navigator.userActivation), + navigator.vendor, + navigator.vendorSub, + JSON.stringify(navigator.virtualKeyboard), + navigator.webdriver, + JSON.stringify(navigator.windowsControlsOverlay) + ].join('::') + */ + + const raw_fp = JSON.stringify(navigator) + + const browser_fingerprint = md5(raw_fp); + + return browser_fingerprint + +} + +// ZTAA JWT +function generateJWT(payload, algorithm = 'HS512', secret = '') { + + const header = { 'alg': algorithm.toUpperCase(), 'typ': 'JWT'}; + const word_header = CryptoJS.enc.Utf8.parse(JSON.stringify(header)); + const word_payload = CryptoJS.enc.Utf8.parse(JSON.stringify(payload)); + + const b64_header = encodeBase64URLConvert(CryptoJS.enc.Base64.stringify(word_header)); + const b64_payload = encodeBase64URLConvert(CryptoJS.enc.Base64.stringify(word_payload)); + const b64_signed_content = b64_header + '.' + b64_payload; + const signature = makeJWTSignature(b64_signed_content, algorithm, secret); + + let jwt = ''; + + if(signature.length) { + jwt = b64_signed_content + '.' + signature; + } + + return jwt; + +} + +function makeJWTSignature(to_sign, algorithm, secret) { + + let signature = ''; + + if( algorithm.toUpperCase() == 'HS256' ) { + signature = CryptoJS.HmacSHA256(to_sign, secret); + } else if( algorithm.toUpperCase() == 'HS512' ) { + signature = CryptoJS.HmacSHA512(to_sign, secret); + } + + const b64_signature = encodeBase64URLConvert(CryptoJS.enc.Base64.stringify(signature)); + + return b64_signature; + +} + +export { makeDynamicRules, deleteDynamicRules, loadAgent, setIcon } + +// +// JWT ENCIDING & ENCRYPTION +// + +function encodeBase64URLConvert(b64_string) { + var b64_url_string = b64_string.replace(/=+$/, '').replace(/\+/g,'-').replace(/\//g,'_'); + return b64_url_string; +} + +/* MD5 */ + +function md5cycle(x, k) { + var a = x[0], b = x[1], c = x[2], d = x[3]; + + a = ff(a, b, c, d, k[0], 7, -680876936); + d = ff(d, a, b, c, k[1], 12, -389564586); + c = ff(c, d, a, b, k[2], 17, 606105819); + b = ff(b, c, d, a, k[3], 22, -1044525330); + a = ff(a, b, c, d, k[4], 7, -176418897); + d = ff(d, a, b, c, k[5], 12, 1200080426); + c = ff(c, d, a, b, k[6], 17, -1473231341); + b = ff(b, c, d, a, k[7], 22, -45705983); + a = ff(a, b, c, d, k[8], 7, 1770035416); + d = ff(d, a, b, c, k[9], 12, -1958414417); + c = ff(c, d, a, b, k[10], 17, -42063); + b = ff(b, c, d, a, k[11], 22, -1990404162); + a = ff(a, b, c, d, k[12], 7, 1804603682); + d = ff(d, a, b, c, k[13], 12, -40341101); + c = ff(c, d, a, b, k[14], 17, -1502002290); + b = ff(b, c, d, a, k[15], 22, 1236535329); + + a = gg(a, b, c, d, k[1], 5, -165796510); + d = gg(d, a, b, c, k[6], 9, -1069501632); + c = gg(c, d, a, b, k[11], 14, 643717713); + b = gg(b, c, d, a, k[0], 20, -373897302); + a = gg(a, b, c, d, k[5], 5, -701558691); + d = gg(d, a, b, c, k[10], 9, 38016083); + c = gg(c, d, a, b, k[15], 14, -660478335); + b = gg(b, c, d, a, k[4], 20, -405537848); + a = gg(a, b, c, d, k[9], 5, 568446438); + d = gg(d, a, b, c, k[14], 9, -1019803690); + c = gg(c, d, a, b, k[3], 14, -187363961); + b = gg(b, c, d, a, k[8], 20, 1163531501); + a = gg(a, b, c, d, k[13], 5, -1444681467); + d = gg(d, a, b, c, k[2], 9, -51403784); + c = gg(c, d, a, b, k[7], 14, 1735328473); + b = gg(b, c, d, a, k[12], 20, -1926607734); + + a = hh(a, b, c, d, k[5], 4, -378558); + d = hh(d, a, b, c, k[8], 11, -2022574463); + c = hh(c, d, a, b, k[11], 16, 1839030562); + b = hh(b, c, d, a, k[14], 23, -35309556); + a = hh(a, b, c, d, k[1], 4, -1530992060); + d = hh(d, a, b, c, k[4], 11, 1272893353); + c = hh(c, d, a, b, k[7], 16, -155497632); + b = hh(b, c, d, a, k[10], 23, -1094730640); + a = hh(a, b, c, d, k[13], 4, 681279174); + d = hh(d, a, b, c, k[0], 11, -358537222); + c = hh(c, d, a, b, k[3], 16, -722521979); + b = hh(b, c, d, a, k[6], 23, 76029189); + a = hh(a, b, c, d, k[9], 4, -640364487); + d = hh(d, a, b, c, k[12], 11, -421815835); + c = hh(c, d, a, b, k[15], 16, 530742520); + b = hh(b, c, d, a, k[2], 23, -995338651); + + a = ii(a, b, c, d, k[0], 6, -198630844); + d = ii(d, a, b, c, k[7], 10, 1126891415); + c = ii(c, d, a, b, k[14], 15, -1416354905); + b = ii(b, c, d, a, k[5], 21, -57434055); + a = ii(a, b, c, d, k[12], 6, 1700485571); + d = ii(d, a, b, c, k[3], 10, -1894986606); + c = ii(c, d, a, b, k[10], 15, -1051523); + b = ii(b, c, d, a, k[1], 21, -2054922799); + a = ii(a, b, c, d, k[8], 6, 1873313359); + d = ii(d, a, b, c, k[15], 10, -30611744); + c = ii(c, d, a, b, k[6], 15, -1560198380); + b = ii(b, c, d, a, k[13], 21, 1309151649); + a = ii(a, b, c, d, k[4], 6, -145523070); + d = ii(d, a, b, c, k[11], 10, -1120210379); + c = ii(c, d, a, b, k[2], 15, 718787259); + b = ii(b, c, d, a, k[9], 21, -343485551); + + x[0] = add32(a, x[0]); + x[1] = add32(b, x[1]); + x[2] = add32(c, x[2]); + x[3] = add32(d, x[3]); + + } + + function cmn(q, a, b, x, s, t) { + a = add32(add32(a, q), add32(x, t)); + return add32((a << s) | (a >>> (32 - s)), b); + } + + function ff(a, b, c, d, x, s, t) { + return cmn((b & c) | ((~b) & d), a, b, x, s, t); + } + + function gg(a, b, c, d, x, s, t) { + return cmn((b & d) | (c & (~d)), a, b, x, s, t); + } + + function hh(a, b, c, d, x, s, t) { + return cmn(b ^ c ^ d, a, b, x, s, t); + } + + function ii(a, b, c, d, x, s, t) { + return cmn(c ^ (b | (~d)), a, b, x, s, t); + } + + function md51(s) { + var txt = ''; + var n = s.length, + state = [1732584193, -271733879, -1732584194, 271733878], i; + for (i=64; i<=s.length; i+=64) { + md5cycle(state, md5blk(s.substring(i-64, i))); + } + s = s.substring(i-64); + var tail = [0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0]; + for (i=0; i>2] |= s.charCodeAt(i) << ((i%4) << 3); + tail[i>>2] |= 0x80 << ((i%4) << 3); + if (i > 55) { + md5cycle(state, tail); + for (i=0; i<16; i++) tail[i] = 0; + } + tail[14] = n*8; + md5cycle(state, tail); + return state; + } + + /* there needs to be support for Unicode here, + * unless we pretend that we can redefine the MD-5 + * algorithm for multi-byte characters (perhaps + * by adding every four 16-bit characters and + * shortening the sum to 32 bits). Otherwise + * I suggest performing MD-5 as if every character + * was two bytes--e.g., 0040 0025 = @%--but then + * how will an ordinary MD-5 sum be matched? + * There is no way to standardize text to something + * like UTF-8 before transformation; speed cost is + * utterly prohibitive. The JavaScript standard + * itself needs to look at this: it should start + * providing access to strings as preformed UTF-8 + * 8-bit unsigned value arrays. + */ + function md5blk(s) { /* I figured global was faster. */ + var md5blks = [], i; /* Andy King said do it this way. */ + for (i=0; i<64; i+=4) { + md5blks[i>>2] = s.charCodeAt(i) + + (s.charCodeAt(i+1) << 8) + + (s.charCodeAt(i+2) << 16) + + (s.charCodeAt(i+3) << 24); + } + return md5blks; + } + + var hex_chr = '0123456789abcdef'.split(''); + + function rhex(n) + { + var s='', j=0; + for(; j<4; j++) + s += hex_chr[(n >> (j * 8 + 4)) & 0x0F] + + hex_chr[(n >> (j * 8)) & 0x0F]; + return s; + } + + function hex(x) { + for (var i=0; i> 16) + (y >> 16) + (lsw >> 16); + return (msw << 16) | (lsw & 0xFFFF); + } + } + +/* +CryptoJS v3.1.2 +code.google.com/p/crypto-js +(c) 2009-2013 by Jeff Mott. All rights reserved. +code.google.com/p/crypto-js/wiki/License +*/ +/* SHA512 */ +var CryptoJS=CryptoJS||function(a,j){var c={},b=c.lib={},f=function(){},l=b.Base={extend:function(a){f.prototype=this;var d=new f;a&&d.mixIn(a);d.hasOwnProperty("init")||(d.init=function(){d.$super.init.apply(this,arguments)});d.init.prototype=d;d.$super=this;return d},create:function(){var a=this.extend();a.init.apply(a,arguments);return a},init:function(){},mixIn:function(a){for(var d in a)a.hasOwnProperty(d)&&(this[d]=a[d]);a.hasOwnProperty("toString")&&(this.toString=a.toString)},clone:function(){return this.init.prototype.extend(this)}}, +u=b.WordArray=l.extend({init:function(a,d){a=this.words=a||[];this.sigBytes=d!=j?d:4*a.length},toString:function(a){return(a||m).stringify(this)},concat:function(a){var d=this.words,M=a.words,e=this.sigBytes;a=a.sigBytes;this.clamp();if(e%4)for(var b=0;b>>2]|=(M[b>>>2]>>>24-8*(b%4)&255)<<24-8*((e+b)%4);else if(65535>>2]=M[b>>>2];else d.push.apply(d,M);this.sigBytes+=a;return this},clamp:function(){var D=this.words,d=this.sigBytes;D[d>>>2]&=4294967295<< +32-8*(d%4);D.length=a.ceil(d/4)},clone:function(){var a=l.clone.call(this);a.words=this.words.slice(0);return a},random:function(D){for(var d=[],b=0;b>>2]>>>24-8*(e%4)&255;b.push((c>>>4).toString(16));b.push((c&15).toString(16))}return b.join("")},parse:function(a){for(var d=a.length,b=[],e=0;e>>3]|=parseInt(a.substr(e, +2),16)<<24-4*(e%8);return new u.init(b,d/2)}},y=k.Latin1={stringify:function(a){var b=a.words;a=a.sigBytes;for(var c=[],e=0;e>>2]>>>24-8*(e%4)&255));return c.join("")},parse:function(a){for(var b=a.length,c=[],e=0;e>>2]|=(a.charCodeAt(e)&255)<<24-8*(e%4);return new u.init(c,b)}},z=k.Utf8={stringify:function(a){try{return decodeURIComponent(escape(y.stringify(a)))}catch(b){throw Error("Malformed UTF-8 data");}},parse:function(a){return y.parse(unescape(encodeURIComponent(a)))}}, +x=b.BufferedBlockAlgorithm=l.extend({reset:function(){this._data=new u.init;this._nDataBytes=0},_append:function(a){"string"==typeof a&&(a=z.parse(a));this._data.concat(a);this._nDataBytes+=a.sigBytes},_process:function(b){var d=this._data,c=d.words,e=d.sigBytes,l=this.blockSize,k=e/(4*l),k=b?a.ceil(k):a.max((k|0)-this._minBufferSize,0);b=k*l;e=a.min(4*b,e);if(b){for(var x=0;xm;m++)k[m]=a();b=b.SHA512=c.extend({_doReset:function(){this._hash=new l.init([new f.init(1779033703,4089235720),new f.init(3144134277,2227873595),new f.init(1013904242,4271175723),new f.init(2773480762,1595750129),new f.init(1359893119,2917565137),new f.init(2600822924,725511199),new f.init(528734635,4215389547),new f.init(1541459225,327033209)])},_doProcessBlock:function(a,b){for(var c=this._hash.words, +f=c[0],j=c[1],d=c[2],l=c[3],e=c[4],m=c[5],N=c[6],c=c[7],aa=f.high,O=f.low,ba=j.high,P=j.low,ca=d.high,Q=d.low,da=l.high,R=l.low,ea=e.high,S=e.low,fa=m.high,T=m.low,ga=N.high,U=N.low,ha=c.high,V=c.low,r=aa,n=O,G=ba,E=P,H=ca,F=Q,Y=da,I=R,s=ea,p=S,W=fa,J=T,X=ga,K=U,Z=ha,L=V,t=0;80>t;t++){var A=k[t];if(16>t)var q=A.high=a[b+2*t]|0,g=A.low=a[b+2*t+1]|0;else{var q=k[t-15],g=q.high,v=q.low,q=(g>>>1|v<<31)^(g>>>8|v<<24)^g>>>7,v=(v>>>1|g<<31)^(v>>>8|g<<24)^(v>>>7|g<<25),C=k[t-2],g=C.high,h=C.low,C=(g>>>19| +h<<13)^(g<<3|h>>>29)^g>>>6,h=(h>>>19|g<<13)^(h<<3|g>>>29)^(h>>>6|g<<26),g=k[t-7],$=g.high,B=k[t-16],w=B.high,B=B.low,g=v+g.low,q=q+$+(g>>>0>>0?1:0),g=g+h,q=q+C+(g>>>0>>0?1:0),g=g+B,q=q+w+(g>>>0>>0?1:0);A.high=q;A.low=g}var $=s&W^~s&X,B=p&J^~p&K,A=r&G^r&H^G&H,ka=n&E^n&F^E&F,v=(r>>>28|n<<4)^(r<<30|n>>>2)^(r<<25|n>>>7),C=(n>>>28|r<<4)^(n<<30|r>>>2)^(n<<25|r>>>7),h=u[t],la=h.high,ia=h.low,h=L+((p>>>14|s<<18)^(p>>>18|s<<14)^(p<<23|s>>>9)),w=Z+((s>>>14|p<<18)^(s>>>18|p<<14)^(s<<23|p>>>9))+(h>>> +0>>0?1:0),h=h+B,w=w+$+(h>>>0>>0?1:0),h=h+ia,w=w+la+(h>>>0>>0?1:0),h=h+g,w=w+q+(h>>>0>>0?1:0),g=C+ka,A=v+A+(g>>>0>>0?1:0),Z=X,L=K,X=W,K=J,W=s,J=p,p=I+h|0,s=Y+w+(p>>>0>>0?1:0)|0,Y=H,I=F,H=G,F=E,G=r,E=n,n=h+g|0,r=w+A+(n>>>0>>0?1:0)|0}O=f.low=O+n;f.high=aa+r+(O>>>0>>0?1:0);P=j.low=P+E;j.high=ba+G+(P>>>0>>0?1:0);Q=d.low=Q+F;d.high=ca+H+(Q>>>0>>0?1:0);R=l.low=R+I;l.high=da+Y+(R>>>0>>0?1:0);S=e.low=S+p;e.high=ea+s+(S>>>0

>>0?1:0);T=m.low=T+J;m.high=fa+W+(T>>>0>>0?1: +0);U=N.low=U+K;N.high=ga+X+(U>>>0>>0?1:0);V=c.low=V+L;c.high=ha+Z+(V>>>0>>0?1:0)},_doFinalize:function(){var a=this._data,b=a.words,c=8*this._nDataBytes,f=8*a.sigBytes;b[f>>>5]|=128<<24-f%32;b[(f+128>>>10<<5)+30]=Math.floor(c/4294967296);b[(f+128>>>10<<5)+31]=c;a.sigBytes=4*b.length;this._process();return this._hash.toX32()},clone:function(){var a=c.clone.call(this);a._hash=this._hash.clone();return a},blockSize:32});j.SHA512=c._createHelper(b);j.HmacSHA512=c._createHmacHelper(b)})(); +(function(){var a=CryptoJS,j=a.enc.Utf8;a.algo.HMAC=a.lib.Base.extend({init:function(a,b){a=this._hasher=new a.init;"string"==typeof b&&(b=j.parse(b));var f=a.blockSize,l=4*f;b.sigBytes>l&&(b=a.finalize(b));b.clamp();for(var u=this._oKey=b.clone(),k=this._iKey=b.clone(),m=u.words,y=k.words,z=0;z>>2]>>>24-8*(a%4)&255)<<16|(e[a+1>>>2]>>>24-8*((a+1)%4)&255)<<8|e[a+2>>>2]>>>24-8*((a+2)%4)&255,g=0;4>g&&a+0.75*g>>6*(3-g)&63));if(e=c.charAt(64))for(;b.length%4;)b.push(e);return b.join("")},parse:function(b){var e=b.length,f=this._map,c=f.charAt(64);c&&(c=b.indexOf(c),-1!=c&&(e=c));for(var c=[],a=0,d=0;d>>6-2*(d%4);c[a>>>2]|=(g|h)<<24-8*(a%4);a++}return j.create(c,a)},_map:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="}})(); + \ No newline at end of file diff --git a/js/ztaa.js b/js/ztaa.js new file mode 100644 index 0000000..9b2314c --- /dev/null +++ b/js/ztaa.js @@ -0,0 +1,47 @@ + +import { makeDynamicRules, deleteDynamicRules } from "./functions.js"; + +document.addEventListener('DOMContentLoaded', function() { + + const header_name = document.getElementById('ztaa-header-name'); + const key = document.getElementById('ztaa-key'); + const server = document.getElementById('ztaa-server'); + + // ZTAA Params + chrome.storage.local.get(['ztaa-rules']).then( (rules) => { + if(rules['ztaa-rules'] && Array.isArray(rules['ztaa-rules']) && rules['ztaa-rules'].length > 0) { + const rule = rules['ztaa-rules'][0]; + server.value = rule[0]; + header_name.value = rule[1]; + key.value = rule[2]; + } + }); + + // Button + const update_button = document.getElementById('ztaa-update-button'); + update_button.addEventListener('click', updateSettings); +}); + +function updateSettings() { + + // Get rules from UI + const header_name = document.getElementById('ztaa-header-name').value; + const key = document.getElementById('ztaa-key').value; + const server = document.getElementById('ztaa-server').value; + + const rules_params = []; + + if( server && header_name && key ) { + rules_params.push([server, header_name, key]) + } + + // Save rules in storage + chrome.storage.local.set({ 'ztaa-rules': rules_params}) + .then( () => deleteDynamicRules()) + .then( () => { + if( rules_params.length > 0 ) { makeDynamicRules(rules_params) } + }) + +} + + diff --git a/manifest.json b/manifest.json new file mode 100644 index 0000000..029a057 --- /dev/null +++ b/manifest.json @@ -0,0 +1,31 @@ +{ + "manifest_version": 3, + "name": "PyRASP ZTAA Agent", + "version": "1.0", + "description": "ParaCyberBellum Zero-Trust Application Access agent", + "permissions": [ + "declarativeNetRequest", + "declarativeNetRequestFeedback", + "storage" + ], + "background": { + "service_worker": "js/background.js", + "type": "module" + }, + "host_permissions": [ + "" + ], + "action": { + "default_popup": "html/ztaa.html", + "default_icon": { + "16": "/img/icon16-inactive.png", + "48": "/img/icon48-inactive.png", + "128": "/img/icon128-inactive.png" + } + }, + "icons": { + "16": "/img/icon16.png", + "48": "/img/icon48.png", + "128": "/img/icon128.png" + } + } \ No newline at end of file