@open-charging-cloud/chargy-core 0.1.0

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../node_modules/elliptic/package.json","../node_modules/bn.js/lib/bn.js","../node_modules/minimalistic-assert/index.js","../node_modules/minimalistic-crypto-utils/lib/utils.js","../node_modules/elliptic/lib/elliptic/utils.js","../node_modules/brorand/index.js","../node_modules/elliptic/lib/elliptic/curve/base.js","../node_modules/inherits/inherits_browser.js","../node_modules/elliptic/lib/elliptic/curve/short.js","../node_modules/elliptic/lib/elliptic/curve/mont.js","../node_modules/elliptic/lib/elliptic/curve/edwards.js","../node_modules/elliptic/lib/elliptic/curve/index.js","../node_modules/hash.js/lib/hash/utils.js","../node_modules/hash.js/lib/hash/common.js","../node_modules/hash.js/lib/hash/sha/common.js","../node_modules/hash.js/lib/hash/sha/1.js","../node_modules/hash.js/lib/hash/sha/256.js","../node_modules/hash.js/lib/hash/sha/224.js","../node_modules/hash.js/lib/hash/sha/512.js","../node_modules/hash.js/lib/hash/sha/384.js","../node_modules/hash.js/lib/hash/sha.js","../node_modules/hash.js/lib/hash/ripemd.js","../node_modules/hash.js/lib/hash/hmac.js","../node_modules/hash.js/lib/hash.js","../node_modules/elliptic/lib/elliptic/precomputed/secp256k1.js","../node_modules/elliptic/lib/elliptic/curves.js","../node_modules/hmac-drbg/lib/hmac-drbg.js","../node_modules/elliptic/lib/elliptic/ec/key.js","../node_modules/elliptic/lib/elliptic/ec/signature.js","../node_modules/elliptic/lib/elliptic/ec/index.js","../node_modules/elliptic/lib/elliptic/eddsa/key.js","../node_modules/elliptic/lib/elliptic/eddsa/signature.js","../node_modules/elliptic/lib/elliptic/eddsa/index.js","../node_modules/elliptic/lib/elliptic.js","../src/secp224k1.ts","../src/interfaces/chargyInterfaces.ts","../src/chargyLib.ts","../src/ACrypt.ts","../src/Alfen.ts","../src/BSMCrypt01.ts","../src/CanonicalJSON.ts","../src/CryptoUtils.ts","../src/EMHCrypt01.ts","../src/GDFCrypt01.ts","../src/Mennekes.ts","../src/OCMF.ts","../src/OCPI.ts","../src/PCDF.ts","../src/SAFE_XML.ts","../src/XMLContainer.ts","../src/chargeIT.ts","../src/chargePoint.ts","../src/interfaces/IChargeTransparencyRecord.ts","../src/interfaces/IChargeTransparencyLiveLink.ts","../src/interfaces/IPublicKeyInfo.ts","../src/qrCodeReader.ts","../src/chargy.ts","../src/verificationResults.ts"],"names":["module","exports","Buffer","self","comb10MulTo","prime","require_utils","cachedProperty","crypto","obj","pad","require_common","require__","curve","EC","e","require_key","require_signature","hash","IECCurves","IEncoding","PublicKeyFormats","SignatureFormats","CryptoAlgorithms","CryptoHashAlgorithms","DisplayPrefixes","InformationRelevance","SessionVerificationResult","VerificationResult","DayOfWeek","child","Decimal","verificationResult","valueObj","measuredValueObj","displayedFormatObj","meterInfoObj","contractObj","measurandObj","JSONSignatureVerificationStatus","sha256","bytesToHex","OCMFTransactionTypes","TimeStatusTypes","hexToBytes","document","moment"],"mappings":"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AAAA,MAAY,UAAA;AAAA,MACpC,UAAA;AAAA,MAAY,UAAA;AAAA,MAAY,UAAA;AAAA,MAAY,UAAA;AAAA,MACpC,UAAA;AAAA,MAAY,UAAA;AAAA,MAAY,UAAA;AAAA,MAAY,SAAA;AAAA,MACpC,UAAA;AAAA,MAAY,UAAA;AAAA,MAAY,UAAA;AAAA,MAAY,UAAA;AAAA,MACpC,UAAA;AAAA,MAAY,UAAA;AAAA,MAAY,UAAA;AAAA,MAAY,UAAA;AAAA,MACpC,SAAA;AAAA,MAAY,UAAA;AAAA,MAAY,SAAA;AAAA,MAAY,SAAA;AAAA,MACpC,SAAA;AAAA,MAAY,UAAA;AAAA,MAAY,SAAA;AAAA,MAAY,UAAA;AAAA,MACpC,UAAA;AAAA,MAAY,UAAA;AAAA,MAAY,UAAA;AAAA,MAAY,UAAA;AAAA,MACpC,UAAA;AAAA,MAAY,UAAA;AAAA,MAAY,UAAA;AAAA,MAAY,UAAA;AAAA,MACpC,UAAA;AAAA,MAAY,UAAA;AAAA,MAAY,UAAA;AAAA,MAAY,SAAA;AAAA,MACpC,UAAA;AAAA,MAAY,UAAA;AAAA,MAAY,UAAA;AAAA,MAAY,UAAA;AAAA,MACpC,UAAA;AAAA,MAAY,UAAA;AAAA,MAAY,UAAA;AAAA,MAAY,SAAA;AAAA,MACpC,UAAA;AAAA,MAAY,UAAA;AAAA,MAAY,UAAA;AAAA,MAAY,UAAA;AAAA,MACpC,UAAA;AAAA,MAAY,UAAA;AAAA,MAAY,SAAA;AAAA,MAAY,SAAA;AAAA,MACpC,SAAA;AAAA,MAAY,UAAA;AAAA,MAAY,SAAA;AAAA,MAAY,UAAA;AAAA,MACpC,SAAA;AAAA,MAAY,UAAA;AAAA,MAAY,SAAA;AAAA,MAAY,UAAA;AAAA,MACpC,SAAA;AAAA,MAAY,UAAA;AAAA,MAAY,UAAA;AAAA,MAAY,UAAA;AAAA,MACpC,UAAA;AAAA,MAAY,UAAA;AAAA,MAAY,UAAA;AAAA,MAAY,UAAA;AAAA,MACpC,UAAA;AAAA,MAAY,UAAA;AAAA,MAAY,UAAA;AAAA,MAAY,UAAA;AAAA,MACpC,UAAA;AAAA,MAAY,UAAA;AAAA,MAAY,UAAA;AAAA,MAAY,SAAA;AAAA,MACpC,UAAA;AAAA,MAAY,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,YACA;AAAA,WACF;AAAA,UACA;AAAA,YACE,iEAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA;AAAA,YACE,kEAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA;AAAA,YACE,kEAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA;AAAA,YACE,iEAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA;AAAA,YACE,kEAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA;AAAA,YACE,kEAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA;AAAA,YACE,kEAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA;AAAA,YACE,kEAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA;AAAA,YACE,kEAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA;AAAA,YACE,kEAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA;AAAA,YACE,kEAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA;AAAA,YACE,kEAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA;AAAA,YACE,kEAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA;AAAA,YACE,kEAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA;AAAA,YACE,kEAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA;AAAA,YACE,kEAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA;AAAA,YACE,kEAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA;AAAA,YACE,kEAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA;AAAA,YACE,kEAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA;AAAA,YACE,kEAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA;AAAA,YACE,kEAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA;AAAA,YACE,kEAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA;AAAA,YACE,kEAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA;AAAA,YACE,kEAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA;AAAA,YACE,kEAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA;AAAA,YACE,kEAAA;AAAA,YAC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A,YACE,kEAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA;AAAA,YACE,kEAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA;AAAA,YACE,kEAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA;AAAA,YACE,kEAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA;AAAA,YACE,kEAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA;AAAA,YACE,kEAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA;AAAA,YACE,kEAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA;AAAA,YACE,kEAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA;AAAA,YACE,kEAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA;AAAA,YACE,kEAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA;AAAA,YACE,kEAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA;AAAA,YACE,kEAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA;AAAA,YACE,kEAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA;AAAA,YACE,kEAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA;AAAA,YACE,kEAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA;AAAA,YACE,kEAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA;AAAA,YACE,kEAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA;AAAA,YACE,kEAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA;AAAA,YACE,kEAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA;AAAA,YACE,kEAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA;AAAA,YACE,kEAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA;AAAA,YACE,kEAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA;AAAA,YACE,kEAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA;AAAA,YACE,kEAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA;AAAA,YACE,kEAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA;AAAA,YACE,kEAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA;AAAA,YACE,kEAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA;AAAA,YACE,kEAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA;AAAA,YACE,kEAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA;AAAA,YACE,kEAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA;AAAA,YACE,kEAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA;AAAA,YACE,kEAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA;AAAA,YACE,kEAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA;AAAA,YACE,iEAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA;AAAA,YACE,kEAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA;AAAA,YACE,kEAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA;AAAA,YACE,kEAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA;AAAA,YACE,kEAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA;AAAA,YACE,kEAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA;AAAA,YACE,kEAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA;AAAA,YACE,iEAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA;AAAA,YACE,kEAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA;AAAA,YACE,kEAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA;AAAA,YACE,kEAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA;AAAA,YACE,kEAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA;AAAA,YACE,kEAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA;AAAA,YACE,iEAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA;AAAA,YACE,kEAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA;AAAA,YACE,kEAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA;AAAA,YACE,kEAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA;AAAA,YACE,gEAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA;AAAA,YACE,kEAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA;AAAA,YACE,kEAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA;AAAA,YACE,kEAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA;AAAA,YACE,kEAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA;AAAA,YACE,kEAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA;AAAA,YACE,iEAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA;AAAA,YACE,kEAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA;AAAA,YACE,kEAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA;AAAA,YACE,kEAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA;AAAA,YACE,kEAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA;AAAA,YACE,kEAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA;AAAA,YACE,kEAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA;AAAA,YACE,kEAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA;AAAA,YACE,kEAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA;AAAA,YACE,kEAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA;AAAA,YACE,kEAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA;AAAA,YACE,kEAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA;AAAA,YACE,kEAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA;AAAA,YACE,kEAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA;AAAA,YACE,kEAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA;AAAA,YACE,kEAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA;AAAA,YACE,kEAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA;AAAA,YACE,kEAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA;AAAA,YACE,kEAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA;AAAA,YACE,kEAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA;AAAA,YACE,kEAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA;AAAA,YACE,kEAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA;AAAA,YACE,kEAAA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","file":"index.js","sourcesContent":["{\n \"name\": \"elliptic\",\n \"version\": \"6.6.1\",\n \"description\": \"EC cryptography\",\n \"main\": \"lib/elliptic.js\",\n \"files\": [\n \"lib\"\n ],\n \"scripts\": {\n \"lint\": \"eslint lib test\",\n \"lint:fix\": \"npm run lint -- --fix\",\n \"unit\": \"istanbul test _mocha --reporter=spec test/index.js\",\n \"test\": \"npm run lint && npm run unit\",\n \"version\": \"grunt dist && git add dist/\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git@github.com:indutny/elliptic\"\n },\n \"keywords\": [\n \"EC\",\n \"Elliptic\",\n \"curve\",\n \"Cryptography\"\n ],\n \"author\": \"Fedor Indutny <fedor@indutny.com>\",\n \"license\": \"MIT\",\n \"bugs\": {\n \"url\": \"https://github.com/indutny/elliptic/issues\"\n },\n \"homepage\": \"https://github.com/indutny/elliptic\",\n \"devDependencies\": {\n \"brfs\": \"^2.0.2\",\n \"coveralls\": \"^3.1.0\",\n \"eslint\": \"^7.6.0\",\n \"grunt\": \"^1.2.1\",\n \"grunt-browserify\": \"^5.3.0\",\n \"grunt-cli\": \"^1.3.2\",\n \"grunt-contrib-connect\": \"^3.0.0\",\n \"grunt-contrib-copy\": \"^1.0.0\",\n \"grunt-contrib-uglify\": \"^5.0.0\",\n \"grunt-mocha-istanbul\": \"^5.0.2\",\n \"grunt-saucelabs\": \"^9.0.1\",\n \"istanbul\": \"^0.4.5\",\n \"mocha\": \"^8.0.1\"\n },\n \"dependencies\": {\n \"bn.js\": \"^4.11.9\",\n \"brorand\": \"^1.1.0\",\n \"hash.js\": \"^1.0.0\",\n \"hmac-drbg\": \"^1.0.1\",\n \"inherits\": \"^2.0.4\",\n \"minimalistic-assert\": \"^1.0.1\",\n \"minimalistic-crypto-utils\": \"^1.0.1\"\n }\n}\n","(function (module, exports) {\n 'use strict';\n\n // Utils\n function assert (val, msg) {\n if (!val) throw new Error(msg || 'Assertion failed');\n }\n\n // Could use `inherits` module, but don't want to move from single file\n // architecture yet.\n function inherits (ctor, superCtor) {\n ctor.super_ = superCtor;\n var TempCtor = function () {};\n TempCtor.prototype = superCtor.prototype;\n ctor.prototype = new TempCtor();\n ctor.prototype.constructor = ctor;\n }\n\n // BN\n\n function BN (number, base, endian) {\n if (BN.isBN(number)) {\n return number;\n }\n\n this.negative = 0;\n this.words = null;\n this.length = 0;\n\n // Reduction context\n this.red = null;\n\n if (number !== null) {\n if (base === 'le' || base === 'be') {\n endian = base;\n base = 10;\n }\n\n this._init(number || 0, base || 10, endian || 'be');\n }\n }\n if (typeof module === 'object') {\n module.exports = BN;\n } else {\n exports.BN = BN;\n }\n\n BN.BN = BN;\n BN.wordSize = 26;\n\n var Buffer;\n try {\n if (typeof window !== 'undefined' && typeof window.Buffer !== 'undefined') {\n Buffer = window.Buffer;\n } else {\n Buffer = require('buffer').Buffer;\n }\n } catch (e) {\n }\n\n BN.isBN = function isBN (num) {\n if (num instanceof BN) {\n return true;\n }\n\n return num !== null && typeof num === 'object' &&\n num.constructor.wordSize === BN.wordSize && Array.isArray(num.words);\n };\n\n BN.max = function max (left, right) {\n if (left.cmp(right) > 0) return left;\n return right;\n };\n\n BN.min = function min (left, right) {\n if (left.cmp(right) < 0) return left;\n return right;\n };\n\n BN.prototype._init = function init (number, base, endian) {\n if (typeof number === 'number') {\n return this._initNumber(number, base, endian);\n }\n\n if (typeof number === 'object') {\n return this._initArray(number, base, endian);\n }\n\n if (base === 'hex') {\n base = 16;\n }\n assert(base === (base | 0) && base >= 2 && base <= 36);\n\n number = number.toString().replace(/\\s+/g, '');\n var start = 0;\n if (number[0] === '-') {\n start++;\n this.negative = 1;\n }\n\n if (start < number.length) {\n if (base === 16) {\n this._parseHex(number, start, endian);\n } else {\n this._parseBase(number, base, start);\n if (endian === 'le') {\n this._initArray(this.toArray(), base, endian);\n }\n }\n }\n };\n\n BN.prototype._initNumber = function _initNumber (number, base, endian) {\n if (number < 0) {\n this.negative = 1;\n number = -number;\n }\n if (number < 0x4000000) {\n this.words = [ number & 0x3ffffff ];\n this.length = 1;\n } else if (number < 0x10000000000000) {\n this.words = [\n number & 0x3ffffff,\n (number / 0x4000000) & 0x3ffffff\n ];\n this.length = 2;\n } else {\n assert(number < 0x20000000000000); // 2 ^ 53 (unsafe)\n this.words = [\n number & 0x3ffffff,\n (number / 0x4000000) & 0x3ffffff,\n 1\n ];\n this.length = 3;\n }\n\n if (endian !== 'le') return;\n\n // Reverse the bytes\n this._initArray(this.toArray(), base, endian);\n };\n\n BN.prototype._initArray = function _initArray (number, base, endian) {\n // Perhaps a Uint8Array\n assert(typeof number.length === 'number');\n if (number.length <= 0) {\n this.words = [ 0 ];\n this.length = 1;\n return this;\n }\n\n this.length = Math.ceil(number.length / 3);\n this.words = new Array(this.length);\n for (var i = 0; i < this.length; i++) {\n this.words[i] = 0;\n }\n\n var j, w;\n var off = 0;\n if (endian === 'be') {\n for (i = number.length - 1, j = 0; i >= 0; i -= 3) {\n w = number[i] | (number[i - 1] << 8) | (number[i - 2] << 16);\n this.words[j] |= (w << off) & 0x3ffffff;\n this.words[j + 1] = (w >>> (26 - off)) & 0x3ffffff;\n off += 24;\n if (off >= 26) {\n off -= 26;\n j++;\n }\n }\n } else if (endian === 'le') {\n for (i = 0, j = 0; i < number.length; i += 3) {\n w = number[i] | (number[i + 1] << 8) | (number[i + 2] << 16);\n this.words[j] |= (w << off) & 0x3ffffff;\n this.words[j + 1] = (w >>> (26 - off)) & 0x3ffffff;\n off += 24;\n if (off >= 26) {\n off -= 26;\n j++;\n }\n }\n }\n return this.strip();\n };\n\n function parseHex4Bits (string, index) {\n var c = string.charCodeAt(index);\n // 'A' - 'F'\n if (c >= 65 && c <= 70) {\n return c - 55;\n // 'a' - 'f'\n } else if (c >= 97 && c <= 102) {\n return c - 87;\n // '0' - '9'\n } else {\n return (c - 48) & 0xf;\n }\n }\n\n function parseHexByte (string, lowerBound, index) {\n var r = parseHex4Bits(string, index);\n if (index - 1 >= lowerBound) {\n r |= parseHex4Bits(string, index - 1) << 4;\n }\n return r;\n }\n\n BN.prototype._parseHex = function _parseHex (number, start, endian) {\n // Create possibly bigger array to ensure that it fits the number\n this.length = Math.ceil((number.length - start) / 6);\n this.words = new Array(this.length);\n for (var i = 0; i < this.length; i++) {\n this.words[i] = 0;\n }\n\n // 24-bits chunks\n var off = 0;\n var j = 0;\n\n var w;\n if (endian === 'be') {\n for (i = number.length - 1; i >= start; i -= 2) {\n w = parseHexByte(number, start, i) << off;\n this.words[j] |= w & 0x3ffffff;\n if (off >= 18) {\n off -= 18;\n j += 1;\n this.words[j] |= w >>> 26;\n } else {\n off += 8;\n }\n }\n } else {\n var parseLength = number.length - start;\n for (i = parseLength % 2 === 0 ? start + 1 : start; i < number.length; i += 2) {\n w = parseHexByte(number, start, i) << off;\n this.words[j] |= w & 0x3ffffff;\n if (off >= 18) {\n off -= 18;\n j += 1;\n this.words[j] |= w >>> 26;\n } else {\n off += 8;\n }\n }\n }\n\n this.strip();\n };\n\n function parseBase (str, start, end, mul) {\n var r = 0;\n var len = Math.min(str.length, end);\n for (var i = start; i < len; i++) {\n var c = str.charCodeAt(i) - 48;\n\n r *= mul;\n\n // 'a'\n if (c >= 49) {\n r += c - 49 + 0xa;\n\n // 'A'\n } else if (c >= 17) {\n r += c - 17 + 0xa;\n\n // '0' - '9'\n } else {\n r += c;\n }\n }\n return r;\n }\n\n BN.prototype._parseBase = function _parseBase (number, base, start) {\n // Initialize as zero\n this.words = [ 0 ];\n this.length = 1;\n\n // Find length of limb in base\n for (var limbLen = 0, limbPow = 1; limbPow <= 0x3ffffff; limbPow *= base) {\n limbLen++;\n }\n limbLen--;\n limbPow = (limbPow / base) | 0;\n\n var total = number.length - start;\n var mod = total % limbLen;\n var end = Math.min(total, total - mod) + start;\n\n var word = 0;\n for (var i = start; i < end; i += limbLen) {\n word = parseBase(number, i, i + limbLen, base);\n\n this.imuln(limbPow);\n if (this.words[0] + word < 0x4000000) {\n this.words[0] += word;\n } else {\n this._iaddn(word);\n }\n }\n\n if (mod !== 0) {\n var pow = 1;\n word = parseBase(number, i, number.length, base);\n\n for (i = 0; i < mod; i++) {\n pow *= base;\n }\n\n this.imuln(pow);\n if (this.words[0] + word < 0x4000000) {\n this.words[0] += word;\n } else {\n this._iaddn(word);\n }\n }\n\n this.strip();\n };\n\n BN.prototype.copy = function copy (dest) {\n dest.words = new Array(this.length);\n for (var i = 0; i < this.length; i++) {\n dest.words[i] = this.words[i];\n }\n dest.length = this.length;\n dest.negative = this.negative;\n dest.red = this.red;\n };\n\n BN.prototype.clone = function clone () {\n var r = new BN(null);\n this.copy(r);\n return r;\n };\n\n BN.prototype._expand = function _expand (size) {\n while (this.length < size) {\n this.words[this.length++] = 0;\n }\n return this;\n };\n\n // Remove leading `0` from `this`\n BN.prototype.strip = function strip () {\n while (this.length > 1 && this.words[this.length - 1] === 0) {\n this.length--;\n }\n return this._normSign();\n };\n\n BN.prototype._normSign = function _normSign () {\n // -0 = 0\n if (this.length === 1 && this.words[0] === 0) {\n this.negative = 0;\n }\n return this;\n };\n\n BN.prototype.inspect = function inspect () {\n return (this.red ? '<BN-R: ' : '<BN: ') + this.toString(16) + '>';\n };\n\n /*\n\n var zeros = [];\n var groupSizes = [];\n var groupBases = [];\n\n var s = '';\n var i = -1;\n while (++i < BN.wordSize) {\n zeros[i] = s;\n s += '0';\n }\n groupSizes[0] = 0;\n groupSizes[1] = 0;\n groupBases[0] = 0;\n groupBases[1] = 0;\n var base = 2 - 1;\n while (++base < 36 + 1) {\n var groupSize = 0;\n var groupBase = 1;\n while (groupBase < (1 << BN.wordSize) / base) {\n groupBase *= base;\n groupSize += 1;\n }\n groupSizes[base] = groupSize;\n groupBases[base] = groupBase;\n }\n\n */\n\n var zeros = [\n '',\n '0',\n '00',\n '000',\n '0000',\n '00000',\n '000000',\n '0000000',\n '00000000',\n '000000000',\n '0000000000',\n '00000000000',\n '000000000000',\n '0000000000000',\n '00000000000000',\n '000000000000000',\n '0000000000000000',\n '00000000000000000',\n '000000000000000000',\n '0000000000000000000',\n '00000000000000000000',\n '000000000000000000000',\n '0000000000000000000000',\n '00000000000000000000000',\n '000000000000000000000000',\n '0000000000000000000000000'\n ];\n\n var groupSizes = [\n 0, 0,\n 25, 16, 12, 11, 10, 9, 8,\n 8, 7, 7, 7, 7, 6, 6,\n 6, 6, 6, 6, 6, 5, 5,\n 5, 5, 5, 5, 5, 5, 5,\n 5, 5, 5, 5, 5, 5, 5\n ];\n\n var groupBases = [\n 0, 0,\n 33554432, 43046721, 16777216, 48828125, 60466176, 40353607, 16777216,\n 43046721, 10000000, 19487171, 35831808, 62748517, 7529536, 11390625,\n 16777216, 24137569, 34012224, 47045881, 64000000, 4084101, 5153632,\n 6436343, 7962624, 9765625, 11881376, 14348907, 17210368, 20511149,\n 24300000, 28629151, 33554432, 39135393, 45435424, 52521875, 60466176\n ];\n\n BN.prototype.toString = function toString (base, padding) {\n base = base || 10;\n padding = padding | 0 || 1;\n\n var out;\n if (base === 16 || base === 'hex') {\n out = '';\n var off = 0;\n var carry = 0;\n for (var i = 0; i < this.length; i++) {\n var w = this.words[i];\n var word = (((w << off) | carry) & 0xffffff).toString(16);\n carry = (w >>> (24 - off)) & 0xffffff;\n off += 2;\n if (off >= 26) {\n off -= 26;\n i--;\n }\n if (carry !== 0 || i !== this.length - 1) {\n out = zeros[6 - word.length] + word + out;\n } else {\n out = word + out;\n }\n }\n if (carry !== 0) {\n out = carry.toString(16) + out;\n }\n while (out.length % padding !== 0) {\n out = '0' + out;\n }\n if (this.negative !== 0) {\n out = '-' + out;\n }\n return out;\n }\n\n if (base === (base | 0) && base >= 2 && base <= 36) {\n // var groupSize = Math.floor(BN.wordSize * Math.LN2 / Math.log(base));\n var groupSize = groupSizes[base];\n // var groupBase = Math.pow(base, groupSize);\n var groupBase = groupBases[base];\n out = '';\n var c = this.clone();\n c.negative = 0;\n while (!c.isZero()) {\n var r = c.modn(groupBase).toString(base);\n c = c.idivn(groupBase);\n\n if (!c.isZero()) {\n out = zeros[groupSize - r.length] + r + out;\n } else {\n out = r + out;\n }\n }\n if (this.isZero()) {\n out = '0' + out;\n }\n while (out.length % padding !== 0) {\n out = '0' + out;\n }\n if (this.negative !== 0) {\n out = '-' + out;\n }\n return out;\n }\n\n assert(false, 'Base should be between 2 and 36');\n };\n\n BN.prototype.toNumber = function toNumber () {\n var ret = this.words[0];\n if (this.length === 2) {\n ret += this.words[1] * 0x4000000;\n } else if (this.length === 3 && this.words[2] === 0x01) {\n // NOTE: at this stage it is known that the top bit is set\n ret += 0x10000000000000 + (this.words[1] * 0x4000000);\n } else if (this.length > 2) {\n assert(false, 'Number can only safely store up to 53 bits');\n }\n return (this.negative !== 0) ? -ret : ret;\n };\n\n BN.prototype.toJSON = function toJSON () {\n return this.toString(16);\n };\n\n BN.prototype.toBuffer = function toBuffer (endian, length) {\n assert(typeof Buffer !== 'undefined');\n return this.toArrayLike(Buffer, endian, length);\n };\n\n BN.prototype.toArray = function toArray (endian, length) {\n return this.toArrayLike(Array, endian, length);\n };\n\n BN.prototype.toArrayLike = function toArrayLike (ArrayType, endian, length) {\n var byteLength = this.byteLength();\n var reqLength = length || Math.max(1, byteLength);\n assert(byteLength <= reqLength, 'byte array longer than desired length');\n assert(reqLength > 0, 'Requested array length <= 0');\n\n this.strip();\n var littleEndian = endian === 'le';\n var res = new ArrayType(reqLength);\n\n var b, i;\n var q = this.clone();\n if (!littleEndian) {\n // Assume big-endian\n for (i = 0; i < reqLength - byteLength; i++) {\n res[i] = 0;\n }\n\n for (i = 0; !q.isZero(); i++) {\n b = q.andln(0xff);\n q.iushrn(8);\n\n res[reqLength - i - 1] = b;\n }\n } else {\n for (i = 0; !q.isZero(); i++) {\n b = q.andln(0xff);\n q.iushrn(8);\n\n res[i] = b;\n }\n\n for (; i < reqLength; i++) {\n res[i] = 0;\n }\n }\n\n return res;\n };\n\n if (Math.clz32) {\n BN.prototype._countBits = function _countBits (w) {\n return 32 - Math.clz32(w);\n };\n } else {\n BN.prototype._countBits = function _countBits (w) {\n var t = w;\n var r = 0;\n if (t >= 0x1000) {\n r += 13;\n t >>>= 13;\n }\n if (t >= 0x40) {\n r += 7;\n t >>>= 7;\n }\n if (t >= 0x8) {\n r += 4;\n t >>>= 4;\n }\n if (t >= 0x02) {\n r += 2;\n t >>>= 2;\n }\n return r + t;\n };\n }\n\n BN.prototype._zeroBits = function _zeroBits (w) {\n // Short-cut\n if (w === 0) return 26;\n\n var t = w;\n var r = 0;\n if ((t & 0x1fff) === 0) {\n r += 13;\n t >>>= 13;\n }\n if ((t & 0x7f) === 0) {\n r += 7;\n t >>>= 7;\n }\n if ((t & 0xf) === 0) {\n r += 4;\n t >>>= 4;\n }\n if ((t & 0x3) === 0) {\n r += 2;\n t >>>= 2;\n }\n if ((t & 0x1) === 0) {\n r++;\n }\n return r;\n };\n\n // Return number of used bits in a BN\n BN.prototype.bitLength = function bitLength () {\n var w = this.words[this.length - 1];\n var hi = this._countBits(w);\n return (this.length - 1) * 26 + hi;\n };\n\n function toBitArray (num) {\n var w = new Array(num.bitLength());\n\n for (var bit = 0; bit < w.length; bit++) {\n var off = (bit / 26) | 0;\n var wbit = bit % 26;\n\n w[bit] = (num.words[off] & (1 << wbit)) >>> wbit;\n }\n\n return w;\n }\n\n // Number of trailing zero bits\n BN.prototype.zeroBits = function zeroBits () {\n if (this.isZero()) return 0;\n\n var r = 0;\n for (var i = 0; i < this.length; i++) {\n var b = this._zeroBits(this.words[i]);\n r += b;\n if (b !== 26) break;\n }\n return r;\n };\n\n BN.prototype.byteLength = function byteLength () {\n return Math.ceil(this.bitLength() / 8);\n };\n\n BN.prototype.toTwos = function toTwos (width) {\n if (this.negative !== 0) {\n return this.abs().inotn(width).iaddn(1);\n }\n return this.clone();\n };\n\n BN.prototype.fromTwos = function fromTwos (width) {\n if (this.testn(width - 1)) {\n return this.notn(width).iaddn(1).ineg();\n }\n return this.clone();\n };\n\n BN.prototype.isNeg = function isNeg () {\n return this.negative !== 0;\n };\n\n // Return negative clone of `this`\n BN.prototype.neg = function neg () {\n return this.clone().ineg();\n };\n\n BN.prototype.ineg = function ineg () {\n if (!this.isZero()) {\n this.negative ^= 1;\n }\n\n return this;\n };\n\n // Or `num` with `this` in-place\n BN.prototype.iuor = function iuor (num) {\n while (this.length < num.length) {\n this.words[this.length++] = 0;\n }\n\n for (var i = 0; i < num.length; i++) {\n this.words[i] = this.words[i] | num.words[i];\n }\n\n return this.strip();\n };\n\n BN.prototype.ior = function ior (num) {\n assert((this.negative | num.negative) === 0);\n return this.iuor(num);\n };\n\n // Or `num` with `this`\n BN.prototype.or = function or (num) {\n if (this.length > num.length) return this.clone().ior(num);\n return num.clone().ior(this);\n };\n\n BN.prototype.uor = function uor (num) {\n if (this.length > num.length) return this.clone().iuor(num);\n return num.clone().iuor(this);\n };\n\n // And `num` with `this` in-place\n BN.prototype.iuand = function iuand (num) {\n // b = min-length(num, this)\n var b;\n if (this.length > num.length) {\n b = num;\n } else {\n b = this;\n }\n\n for (var i = 0; i < b.length; i++) {\n this.words[i] = this.words[i] & num.words[i];\n }\n\n this.length = b.length;\n\n return this.strip();\n };\n\n BN.prototype.iand = function iand (num) {\n assert((this.negative | num.negative) === 0);\n return this.iuand(num);\n };\n\n // And `num` with `this`\n BN.prototype.and = function and (num) {\n if (this.length > num.length) return this.clone().iand(num);\n return num.clone().iand(this);\n };\n\n BN.prototype.uand = function uand (num) {\n if (this.length > num.length) return this.clone().iuand(num);\n return num.clone().iuand(this);\n };\n\n // Xor `num` with `this` in-place\n BN.prototype.iuxor = function iuxor (num) {\n // a.length > b.length\n var a;\n var b;\n if (this.length > num.length) {\n a = this;\n b = num;\n } else {\n a = num;\n b = this;\n }\n\n for (var i = 0; i < b.length; i++) {\n this.words[i] = a.words[i] ^ b.words[i];\n }\n\n if (this !== a) {\n for (; i < a.length; i++) {\n this.words[i] = a.words[i];\n }\n }\n\n this.length = a.length;\n\n return this.strip();\n };\n\n BN.prototype.ixor = function ixor (num) {\n assert((this.negative | num.negative) === 0);\n return this.iuxor(num);\n };\n\n // Xor `num` with `this`\n BN.prototype.xor = function xor (num) {\n if (this.length > num.length) return this.clone().ixor(num);\n return num.clone().ixor(this);\n };\n\n BN.prototype.uxor = function uxor (num) {\n if (this.length > num.length) return this.clone().iuxor(num);\n return num.clone().iuxor(this);\n };\n\n // Not ``this`` with ``width`` bitwidth\n BN.prototype.inotn = function inotn (width) {\n assert(typeof width === 'number' && width >= 0);\n\n var bytesNeeded = Math.ceil(width / 26) | 0;\n var bitsLeft = width % 26;\n\n // Extend the buffer with leading zeroes\n this._expand(bytesNeeded);\n\n if (bitsLeft > 0) {\n bytesNeeded--;\n }\n\n // Handle complete words\n for (var i = 0; i < bytesNeeded; i++) {\n this.words[i] = ~this.words[i] & 0x3ffffff;\n }\n\n // Handle the residue\n if (bitsLeft > 0) {\n this.words[i] = ~this.words[i] & (0x3ffffff >> (26 - bitsLeft));\n }\n\n // And remove leading zeroes\n return this.strip();\n };\n\n BN.prototype.notn = function notn (width) {\n return this.clone().inotn(width);\n };\n\n // Set `bit` of `this`\n BN.prototype.setn = function setn (bit, val) {\n assert(typeof bit === 'number' && bit >= 0);\n\n var off = (bit / 26) | 0;\n var wbit = bit % 26;\n\n this._expand(off + 1);\n\n if (val) {\n this.words[off] = this.words[off] | (1 << wbit);\n } else {\n this.words[off] = this.words[off] & ~(1 << wbit);\n }\n\n return this.strip();\n };\n\n // Add `num` to `this` in-place\n BN.prototype.iadd = function iadd (num) {\n var r;\n\n // negative + positive\n if (this.negative !== 0 && num.negative === 0) {\n this.negative = 0;\n r = this.isub(num);\n this.negative ^= 1;\n return this._normSign();\n\n // positive + negative\n } else if (this.negative === 0 && num.negative !== 0) {\n num.negative = 0;\n r = this.isub(num);\n num.negative = 1;\n return r._normSign();\n }\n\n // a.length > b.length\n var a, b;\n if (this.length > num.length) {\n a = this;\n b = num;\n } else {\n a = num;\n b = this;\n }\n\n var carry = 0;\n for (var i = 0; i < b.length; i++) {\n r = (a.words[i] | 0) + (b.words[i] | 0) + carry;\n this.words[i] = r & 0x3ffffff;\n carry = r >>> 26;\n }\n for (; carry !== 0 && i < a.length; i++) {\n r = (a.words[i] | 0) + carry;\n this.words[i] = r & 0x3ffffff;\n carry = r >>> 26;\n }\n\n this.length = a.length;\n if (carry !== 0) {\n this.words[this.length] = carry;\n this.length++;\n // Copy the rest of the words\n } else if (a !== this) {\n for (; i < a.length; i++) {\n this.words[i] = a.words[i];\n }\n }\n\n return this;\n };\n\n // Add `num` to `this`\n BN.prototype.add = function add (num) {\n var res;\n if (num.negative !== 0 && this.negative === 0) {\n num.negative = 0;\n res = this.sub(num);\n num.negative ^= 1;\n return res;\n } else if (num.negative === 0 && this.negative !== 0) {\n this.negative = 0;\n res = num.sub(this);\n this.negative = 1;\n return res;\n }\n\n if (this.length > num.length) return this.clone().iadd(num);\n\n return num.clone().iadd(this);\n };\n\n // Subtract `num` from `this` in-place\n BN.prototype.isub = function isub (num) {\n // this - (-num) = this + num\n if (num.negative !== 0) {\n num.negative = 0;\n var r = this.iadd(num);\n num.negative = 1;\n return r._normSign();\n\n // -this - num = -(this + num)\n } else if (this.negative !== 0) {\n this.negative = 0;\n this.iadd(num);\n this.negative = 1;\n return this._normSign();\n }\n\n // At this point both numbers are positive\n var cmp = this.cmp(num);\n\n // Optimization - zeroify\n if (cmp === 0) {\n this.negative = 0;\n this.length = 1;\n this.words[0] = 0;\n return this;\n }\n\n // a > b\n var a, b;\n if (cmp > 0) {\n a = this;\n b = num;\n } else {\n a = num;\n b = this;\n }\n\n var carry = 0;\n for (var i = 0; i < b.length; i++) {\n r = (a.words[i] | 0) - (b.words[i] | 0) + carry;\n carry = r >> 26;\n this.words[i] = r & 0x3ffffff;\n }\n for (; carry !== 0 && i < a.length; i++) {\n r = (a.words[i] | 0) + carry;\n carry = r >> 26;\n this.words[i] = r & 0x3ffffff;\n }\n\n // Copy rest of the words\n if (carry === 0 && i < a.length && a !== this) {\n for (; i < a.length; i++) {\n this.words[i] = a.words[i];\n }\n }\n\n this.length = Math.max(this.length, i);\n\n if (a !== this) {\n this.negative = 1;\n }\n\n return this.strip();\n };\n\n // Subtract `num` from `this`\n BN.prototype.sub = function sub (num) {\n return this.clone().isub(num);\n };\n\n function smallMulTo (self, num, out) {\n out.negative = num.negative ^ self.negative;\n var len = (self.length + num.length) | 0;\n out.length = len;\n len = (len - 1) | 0;\n\n // Peel one iteration (compiler can't do it, because of code complexity)\n var a = self.words[0] | 0;\n var b = num.words[0] | 0;\n var r = a * b;\n\n var lo = r & 0x3ffffff;\n var carry = (r / 0x4000000) | 0;\n out.words[0] = lo;\n\n for (var k = 1; k < len; k++) {\n // Sum all words with the same `i + j = k` and accumulate `ncarry`,\n // note that ncarry could be >= 0x3ffffff\n var ncarry = carry >>> 26;\n var rword = carry & 0x3ffffff;\n var maxJ = Math.min(k, num.length - 1);\n for (var j = Math.max(0, k - self.length + 1); j <= maxJ; j++) {\n var i = (k - j) | 0;\n a = self.words[i] | 0;\n b = num.words[j] | 0;\n r = a * b + rword;\n ncarry += (r / 0x4000000) | 0;\n rword = r & 0x3ffffff;\n }\n out.words[k] = rword | 0;\n carry = ncarry | 0;\n }\n if (carry !== 0) {\n out.words[k] = carry | 0;\n } else {\n out.length--;\n }\n\n return out.strip();\n }\n\n // TODO(indutny): it may be reasonable to omit it for users who don't need\n // to work with 256-bit numbers, otherwise it gives 20% improvement for 256-bit\n // multiplication (like elliptic secp256k1).\n var comb10MulTo = function comb10MulTo (self, num, out) {\n var a = self.words;\n var b = num.words;\n var o = out.words;\n var c = 0;\n var lo;\n var mid;\n var hi;\n var a0 = a[0] | 0;\n var al0 = a0 & 0x1fff;\n var ah0 = a0 >>> 13;\n var a1 = a[1] | 0;\n var al1 = a1 & 0x1fff;\n var ah1 = a1 >>> 13;\n var a2 = a[2] | 0;\n var al2 = a2 & 0x1fff;\n var ah2 = a2 >>> 13;\n var a3 = a[3] | 0;\n var al3 = a3 & 0x1fff;\n var ah3 = a3 >>> 13;\n var a4 = a[4] | 0;\n var al4 = a4 & 0x1fff;\n var ah4 = a4 >>> 13;\n var a5 = a[5] | 0;\n var al5 = a5 & 0x1fff;\n var ah5 = a5 >>> 13;\n var a6 = a[6] | 0;\n var al6 = a6 & 0x1fff;\n var ah6 = a6 >>> 13;\n var a7 = a[7] | 0;\n var al7 = a7 & 0x1fff;\n var ah7 = a7 >>> 13;\n var a8 = a[8] | 0;\n var al8 = a8 & 0x1fff;\n var ah8 = a8 >>> 13;\n var a9 = a[9] | 0;\n var al9 = a9 & 0x1fff;\n var ah9 = a9 >>> 13;\n var b0 = b[0] | 0;\n var bl0 = b0 & 0x1fff;\n var bh0 = b0 >>> 13;\n var b1 = b[1] | 0;\n var bl1 = b1 & 0x1fff;\n var bh1 = b1 >>> 13;\n var b2 = b[2] | 0;\n var bl2 = b2 & 0x1fff;\n var bh2 = b2 >>> 13;\n var b3 = b[3] | 0;\n var bl3 = b3 & 0x1fff;\n var bh3 = b3 >>> 13;\n var b4 = b[4] | 0;\n var bl4 = b4 & 0x1fff;\n var bh4 = b4 >>> 13;\n var b5 = b[5] | 0;\n var bl5 = b5 & 0x1fff;\n var bh5 = b5 >>> 13;\n var b6 = b[6] | 0;\n var bl6 = b6 & 0x1fff;\n var bh6 = b6 >>> 13;\n var b7 = b[7] | 0;\n var bl7 = b7 & 0x1fff;\n var bh7 = b7 >>> 13;\n var b8 = b[8] | 0;\n var bl8 = b8 & 0x1fff;\n var bh8 = b8 >>> 13;\n var b9 = b[9] | 0;\n var bl9 = b9 & 0x1fff;\n var bh9 = b9 >>> 13;\n\n out.negative = self.negative ^ num.negative;\n out.length = 19;\n /* k = 0 */\n lo = Math.imul(al0, bl0);\n mid = Math.imul(al0, bh0);\n mid = (mid + Math.imul(ah0, bl0)) | 0;\n hi = Math.imul(ah0, bh0);\n var w0 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w0 >>> 26)) | 0;\n w0 &= 0x3ffffff;\n /* k = 1 */\n lo = Math.imul(al1, bl0);\n mid = Math.imul(al1, bh0);\n mid = (mid + Math.imul(ah1, bl0)) | 0;\n hi = Math.imul(ah1, bh0);\n lo = (lo + Math.imul(al0, bl1)) | 0;\n mid = (mid + Math.imul(al0, bh1)) | 0;\n mid = (mid + Math.imul(ah0, bl1)) | 0;\n hi = (hi + Math.imul(ah0, bh1)) | 0;\n var w1 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w1 >>> 26)) | 0;\n w1 &= 0x3ffffff;\n /* k = 2 */\n lo = Math.imul(al2, bl0);\n mid = Math.imul(al2, bh0);\n mid = (mid + Math.imul(ah2, bl0)) | 0;\n hi = Math.imul(ah2, bh0);\n lo = (lo + Math.imul(al1, bl1)) | 0;\n mid = (mid + Math.imul(al1, bh1)) | 0;\n mid = (mid + Math.imul(ah1, bl1)) | 0;\n hi = (hi + Math.imul(ah1, bh1)) | 0;\n lo = (lo + Math.imul(al0, bl2)) | 0;\n mid = (mid + Math.imul(al0, bh2)) | 0;\n mid = (mid + Math.imul(ah0, bl2)) | 0;\n hi = (hi + Math.imul(ah0, bh2)) | 0;\n var w2 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w2 >>> 26)) | 0;\n w2 &= 0x3ffffff;\n /* k = 3 */\n lo = Math.imul(al3, bl0);\n mid = Math.imul(al3, bh0);\n mid = (mid + Math.imul(ah3, bl0)) | 0;\n hi = Math.imul(ah3, bh0);\n lo = (lo + Math.imul(al2, bl1)) | 0;\n mid = (mid + Math.imul(al2, bh1)) | 0;\n mid = (mid + Math.imul(ah2, bl1)) | 0;\n hi = (hi + Math.imul(ah2, bh1)) | 0;\n lo = (lo + Math.imul(al1, bl2)) | 0;\n mid = (mid + Math.imul(al1, bh2)) | 0;\n mid = (mid + Math.imul(ah1, bl2)) | 0;\n hi = (hi + Math.imul(ah1, bh2)) | 0;\n lo = (lo + Math.imul(al0, bl3)) | 0;\n mid = (mid + Math.imul(al0, bh3)) | 0;\n mid = (mid + Math.imul(ah0, bl3)) | 0;\n hi = (hi + Math.imul(ah0, bh3)) | 0;\n var w3 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w3 >>> 26)) | 0;\n w3 &= 0x3ffffff;\n /* k = 4 */\n lo = Math.imul(al4, bl0);\n mid = Math.imul(al4, bh0);\n mid = (mid + Math.imul(ah4, bl0)) | 0;\n hi = Math.imul(ah4, bh0);\n lo = (lo + Math.imul(al3, bl1)) | 0;\n mid = (mid + Math.imul(al3, bh1)) | 0;\n mid = (mid + Math.imul(ah3, bl1)) | 0;\n hi = (hi + Math.imul(ah3, bh1)) | 0;\n lo = (lo + Math.imul(al2, bl2)) | 0;\n mid = (mid + Math.imul(al2, bh2)) | 0;\n mid = (mid + Math.imul(ah2, bl2)) | 0;\n hi = (hi + Math.imul(ah2, bh2)) | 0;\n lo = (lo + Math.imul(al1, bl3)) | 0;\n mid = (mid + Math.imul(al1, bh3)) | 0;\n mid = (mid + Math.imul(ah1, bl3)) | 0;\n hi = (hi + Math.imul(ah1, bh3)) | 0;\n lo = (lo + Math.imul(al0, bl4)) | 0;\n mid = (mid + Math.imul(al0, bh4)) | 0;\n mid = (mid + Math.imul(ah0, bl4)) | 0;\n hi = (hi + Math.imul(ah0, bh4)) | 0;\n var w4 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w4 >>> 26)) | 0;\n w4 &= 0x3ffffff;\n /* k = 5 */\n lo = Math.imul(al5, bl0);\n mid = Math.imul(al5, bh0);\n mid = (mid + Math.imul(ah5, bl0)) | 0;\n hi = Math.imul(ah5, bh0);\n lo = (lo + Math.imul(al4, bl1)) | 0;\n mid = (mid + Math.imul(al4, bh1)) | 0;\n mid = (mid + Math.imul(ah4, bl1)) | 0;\n hi = (hi + Math.imul(ah4, bh1)) | 0;\n lo = (lo + Math.imul(al3, bl2)) | 0;\n mid = (mid + Math.imul(al3, bh2)) | 0;\n mid = (mid + Math.imul(ah3, bl2)) | 0;\n hi = (hi + Math.imul(ah3, bh2)) | 0;\n lo = (lo + Math.imul(al2, bl3)) | 0;\n mid = (mid + Math.imul(al2, bh3)) | 0;\n mid = (mid + Math.imul(ah2, bl3)) | 0;\n hi = (hi + Math.imul(ah2, bh3)) | 0;\n lo = (lo + Math.imul(al1, bl4)) | 0;\n mid = (mid + Math.imul(al1, bh4)) | 0;\n mid = (mid + Math.imul(ah1, bl4)) | 0;\n hi = (hi + Math.imul(ah1, bh4)) | 0;\n lo = (lo + Math.imul(al0, bl5)) | 0;\n mid = (mid + Math.imul(al0, bh5)) | 0;\n mid = (mid + Math.imul(ah0, bl5)) | 0;\n hi = (hi + Math.imul(ah0, bh5)) | 0;\n var w5 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w5 >>> 26)) | 0;\n w5 &= 0x3ffffff;\n /* k = 6 */\n lo = Math.imul(al6, bl0);\n mid = Math.imul(al6, bh0);\n mid = (mid + Math.imul(ah6, bl0)) | 0;\n hi = Math.imul(ah6, bh0);\n lo = (lo + Math.imul(al5, bl1)) | 0;\n mid = (mid + Math.imul(al5, bh1)) | 0;\n mid = (mid + Math.imul(ah5, bl1)) | 0;\n hi = (hi + Math.imul(ah5, bh1)) | 0;\n lo = (lo + Math.imul(al4, bl2)) | 0;\n mid = (mid + Math.imul(al4, bh2)) | 0;\n mid = (mid + Math.imul(ah4, bl2)) | 0;\n hi = (hi + Math.imul(ah4, bh2)) | 0;\n lo = (lo + Math.imul(al3, bl3)) | 0;\n mid = (mid + Math.imul(al3, bh3)) | 0;\n mid = (mid + Math.imul(ah3, bl3)) | 0;\n hi = (hi + Math.imul(ah3, bh3)) | 0;\n lo = (lo + Math.imul(al2, bl4)) | 0;\n mid = (mid + Math.imul(al2, bh4)) | 0;\n mid = (mid + Math.imul(ah2, bl4)) | 0;\n hi = (hi + Math.imul(ah2, bh4)) | 0;\n lo = (lo + Math.imul(al1, bl5)) | 0;\n mid = (mid + Math.imul(al1, bh5)) | 0;\n mid = (mid + Math.imul(ah1, bl5)) | 0;\n hi = (hi + Math.imul(ah1, bh5)) | 0;\n lo = (lo + Math.imul(al0, bl6)) | 0;\n mid = (mid + Math.imul(al0, bh6)) | 0;\n mid = (mid + Math.imul(ah0, bl6)) | 0;\n hi = (hi + Math.imul(ah0, bh6)) | 0;\n var w6 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w6 >>> 26)) | 0;\n w6 &= 0x3ffffff;\n /* k = 7 */\n lo = Math.imul(al7, bl0);\n mid = Math.imul(al7, bh0);\n mid = (mid + Math.imul(ah7, bl0)) | 0;\n hi = Math.imul(ah7, bh0);\n lo = (lo + Math.imul(al6, bl1)) | 0;\n mid = (mid + Math.imul(al6, bh1)) | 0;\n mid = (mid + Math.imul(ah6, bl1)) | 0;\n hi = (hi + Math.imul(ah6, bh1)) | 0;\n lo = (lo + Math.imul(al5, bl2)) | 0;\n mid = (mid + Math.imul(al5, bh2)) | 0;\n mid = (mid + Math.imul(ah5, bl2)) | 0;\n hi = (hi + Math.imul(ah5, bh2)) | 0;\n lo = (lo + Math.imul(al4, bl3)) | 0;\n mid = (mid + Math.imul(al4, bh3)) | 0;\n mid = (mid + Math.imul(ah4, bl3)) | 0;\n hi = (hi + Math.imul(ah4, bh3)) | 0;\n lo = (lo + Math.imul(al3, bl4)) | 0;\n mid = (mid + Math.imul(al3, bh4)) | 0;\n mid = (mid + Math.imul(ah3, bl4)) | 0;\n hi = (hi + Math.imul(ah3, bh4)) | 0;\n lo = (lo + Math.imul(al2, bl5)) | 0;\n mid = (mid + Math.imul(al2, bh5)) | 0;\n mid = (mid + Math.imul(ah2, bl5)) | 0;\n hi = (hi + Math.imul(ah2, bh5)) | 0;\n lo = (lo + Math.imul(al1, bl6)) | 0;\n mid = (mid + Math.imul(al1, bh6)) | 0;\n mid = (mid + Math.imul(ah1, bl6)) | 0;\n hi = (hi + Math.imul(ah1, bh6)) | 0;\n lo = (lo + Math.imul(al0, bl7)) | 0;\n mid = (mid + Math.imul(al0, bh7)) | 0;\n mid = (mid + Math.imul(ah0, bl7)) | 0;\n hi = (hi + Math.imul(ah0, bh7)) | 0;\n var w7 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w7 >>> 26)) | 0;\n w7 &= 0x3ffffff;\n /* k = 8 */\n lo = Math.imul(al8, bl0);\n mid = Math.imul(al8, bh0);\n mid = (mid + Math.imul(ah8, bl0)) | 0;\n hi = Math.imul(ah8, bh0);\n lo = (lo + Math.imul(al7, bl1)) | 0;\n mid = (mid + Math.imul(al7, bh1)) | 0;\n mid = (mid + Math.imul(ah7, bl1)) | 0;\n hi = (hi + Math.imul(ah7, bh1)) | 0;\n lo = (lo + Math.imul(al6, bl2)) | 0;\n mid = (mid + Math.imul(al6, bh2)) | 0;\n mid = (mid + Math.imul(ah6, bl2)) | 0;\n hi = (hi + Math.imul(ah6, bh2)) | 0;\n lo = (lo + Math.imul(al5, bl3)) | 0;\n mid = (mid + Math.imul(al5, bh3)) | 0;\n mid = (mid + Math.imul(ah5, bl3)) | 0;\n hi = (hi + Math.imul(ah5, bh3)) | 0;\n lo = (lo + Math.imul(al4, bl4)) | 0;\n mid = (mid + Math.imul(al4, bh4)) | 0;\n mid = (mid + Math.imul(ah4, bl4)) | 0;\n hi = (hi + Math.imul(ah4, bh4)) | 0;\n lo = (lo + Math.imul(al3, bl5)) | 0;\n mid = (mid + Math.imul(al3, bh5)) | 0;\n mid = (mid + Math.imul(ah3, bl5)) | 0;\n hi = (hi + Math.imul(ah3, bh5)) | 0;\n lo = (lo + Math.imul(al2, bl6)) | 0;\n mid = (mid + Math.imul(al2, bh6)) | 0;\n mid = (mid + Math.imul(ah2, bl6)) | 0;\n hi = (hi + Math.imul(ah2, bh6)) | 0;\n lo = (lo + Math.imul(al1, bl7)) | 0;\n mid = (mid + Math.imul(al1, bh7)) | 0;\n mid = (mid + Math.imul(ah1, bl7)) | 0;\n hi = (hi + Math.imul(ah1, bh7)) | 0;\n lo = (lo + Math.imul(al0, bl8)) | 0;\n mid = (mid + Math.imul(al0, bh8)) | 0;\n mid = (mid + Math.imul(ah0, bl8)) | 0;\n hi = (hi + Math.imul(ah0, bh8)) | 0;\n var w8 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w8 >>> 26)) | 0;\n w8 &= 0x3ffffff;\n /* k = 9 */\n lo = Math.imul(al9, bl0);\n mid = Math.imul(al9, bh0);\n mid = (mid + Math.imul(ah9, bl0)) | 0;\n hi = Math.imul(ah9, bh0);\n lo = (lo + Math.imul(al8, bl1)) | 0;\n mid = (mid + Math.imul(al8, bh1)) | 0;\n mid = (mid + Math.imul(ah8, bl1)) | 0;\n hi = (hi + Math.imul(ah8, bh1)) | 0;\n lo = (lo + Math.imul(al7, bl2)) | 0;\n mid = (mid + Math.imul(al7, bh2)) | 0;\n mid = (mid + Math.imul(ah7, bl2)) | 0;\n hi = (hi + Math.imul(ah7, bh2)) | 0;\n lo = (lo + Math.imul(al6, bl3)) | 0;\n mid = (mid + Math.imul(al6, bh3)) | 0;\n mid = (mid + Math.imul(ah6, bl3)) | 0;\n hi = (hi + Math.imul(ah6, bh3)) | 0;\n lo = (lo + Math.imul(al5, bl4)) | 0;\n mid = (mid + Math.imul(al5, bh4)) | 0;\n mid = (mid + Math.imul(ah5, bl4)) | 0;\n hi = (hi + Math.imul(ah5, bh4)) | 0;\n lo = (lo + Math.imul(al4, bl5)) | 0;\n mid = (mid + Math.imul(al4, bh5)) | 0;\n mid = (mid + Math.imul(ah4, bl5)) | 0;\n hi = (hi + Math.imul(ah4, bh5)) | 0;\n lo = (lo + Math.imul(al3, bl6)) | 0;\n mid = (mid + Math.imul(al3, bh6)) | 0;\n mid = (mid + Math.imul(ah3, bl6)) | 0;\n hi = (hi + Math.imul(ah3, bh6)) | 0;\n lo = (lo + Math.imul(al2, bl7)) | 0;\n mid = (mid + Math.imul(al2, bh7)) | 0;\n mid = (mid + Math.imul(ah2, bl7)) | 0;\n hi = (hi + Math.imul(ah2, bh7)) | 0;\n lo = (lo + Math.imul(al1, bl8)) | 0;\n mid = (mid + Math.imul(al1, bh8)) | 0;\n mid = (mid + Math.imul(ah1, bl8)) | 0;\n hi = (hi + Math.imul(ah1, bh8)) | 0;\n lo = (lo + Math.imul(al0, bl9)) | 0;\n mid = (mid + Math.imul(al0, bh9)) | 0;\n mid = (mid + Math.imul(ah0, bl9)) | 0;\n hi = (hi + Math.imul(ah0, bh9)) | 0;\n var w9 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w9 >>> 26)) | 0;\n w9 &= 0x3ffffff;\n /* k = 10 */\n lo = Math.imul(al9, bl1);\n mid = Math.imul(al9, bh1);\n mid = (mid + Math.imul(ah9, bl1)) | 0;\n hi = Math.imul(ah9, bh1);\n lo = (lo + Math.imul(al8, bl2)) | 0;\n mid = (mid + Math.imul(al8, bh2)) | 0;\n mid = (mid + Math.imul(ah8, bl2)) | 0;\n hi = (hi + Math.imul(ah8, bh2)) | 0;\n lo = (lo + Math.imul(al7, bl3)) | 0;\n mid = (mid + Math.imul(al7, bh3)) | 0;\n mid = (mid + Math.imul(ah7, bl3)) | 0;\n hi = (hi + Math.imul(ah7, bh3)) | 0;\n lo = (lo + Math.imul(al6, bl4)) | 0;\n mid = (mid + Math.imul(al6, bh4)) | 0;\n mid = (mid + Math.imul(ah6, bl4)) | 0;\n hi = (hi + Math.imul(ah6, bh4)) | 0;\n lo = (lo + Math.imul(al5, bl5)) | 0;\n mid = (mid + Math.imul(al5, bh5)) | 0;\n mid = (mid + Math.imul(ah5, bl5)) | 0;\n hi = (hi + Math.imul(ah5, bh5)) | 0;\n lo = (lo + Math.imul(al4, bl6)) | 0;\n mid = (mid + Math.imul(al4, bh6)) | 0;\n mid = (mid + Math.imul(ah4, bl6)) | 0;\n hi = (hi + Math.imul(ah4, bh6)) | 0;\n lo = (lo + Math.imul(al3, bl7)) | 0;\n mid = (mid + Math.imul(al3, bh7)) | 0;\n mid = (mid + Math.imul(ah3, bl7)) | 0;\n hi = (hi + Math.imul(ah3, bh7)) | 0;\n lo = (lo + Math.imul(al2, bl8)) | 0;\n mid = (mid + Math.imul(al2, bh8)) | 0;\n mid = (mid + Math.imul(ah2, bl8)) | 0;\n hi = (hi + Math.imul(ah2, bh8)) | 0;\n lo = (lo + Math.imul(al1, bl9)) | 0;\n mid = (mid + Math.imul(al1, bh9)) | 0;\n mid = (mid + Math.imul(ah1, bl9)) | 0;\n hi = (hi + Math.imul(ah1, bh9)) | 0;\n var w10 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w10 >>> 26)) | 0;\n w10 &= 0x3ffffff;\n /* k = 11 */\n lo = Math.imul(al9, bl2);\n mid = Math.imul(al9, bh2);\n mid = (mid + Math.imul(ah9, bl2)) | 0;\n hi = Math.imul(ah9, bh2);\n lo = (lo + Math.imul(al8, bl3)) | 0;\n mid = (mid + Math.imul(al8, bh3)) | 0;\n mid = (mid + Math.imul(ah8, bl3)) | 0;\n hi = (hi + Math.imul(ah8, bh3)) | 0;\n lo = (lo + Math.imul(al7, bl4)) | 0;\n mid = (mid + Math.imul(al7, bh4)) | 0;\n mid = (mid + Math.imul(ah7, bl4)) | 0;\n hi = (hi + Math.imul(ah7, bh4)) | 0;\n lo = (lo + Math.imul(al6, bl5)) | 0;\n mid = (mid + Math.imul(al6, bh5)) | 0;\n mid = (mid + Math.imul(ah6, bl5)) | 0;\n hi = (hi + Math.imul(ah6, bh5)) | 0;\n lo = (lo + Math.imul(al5, bl6)) | 0;\n mid = (mid + Math.imul(al5, bh6)) | 0;\n mid = (mid + Math.imul(ah5, bl6)) | 0;\n hi = (hi + Math.imul(ah5, bh6)) | 0;\n lo = (lo + Math.imul(al4, bl7)) | 0;\n mid = (mid + Math.imul(al4, bh7)) | 0;\n mid = (mid + Math.imul(ah4, bl7)) | 0;\n hi = (hi + Math.imul(ah4, bh7)) | 0;\n lo = (lo + Math.imul(al3, bl8)) | 0;\n mid = (mid + Math.imul(al3, bh8)) | 0;\n mid = (mid + Math.imul(ah3, bl8)) | 0;\n hi = (hi + Math.imul(ah3, bh8)) | 0;\n lo = (lo + Math.imul(al2, bl9)) | 0;\n mid = (mid + Math.imul(al2, bh9)) | 0;\n mid = (mid + Math.imul(ah2, bl9)) | 0;\n hi = (hi + Math.imul(ah2, bh9)) | 0;\n var w11 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w11 >>> 26)) | 0;\n w11 &= 0x3ffffff;\n /* k = 12 */\n lo = Math.imul(al9, bl3);\n mid = Math.imul(al9, bh3);\n mid = (mid + Math.imul(ah9, bl3)) | 0;\n hi = Math.imul(ah9, bh3);\n lo = (lo + Math.imul(al8, bl4)) | 0;\n mid = (mid + Math.imul(al8, bh4)) | 0;\n mid = (mid + Math.imul(ah8, bl4)) | 0;\n hi = (hi + Math.imul(ah8, bh4)) | 0;\n lo = (lo + Math.imul(al7, bl5)) | 0;\n mid = (mid + Math.imul(al7, bh5)) | 0;\n mid = (mid + Math.imul(ah7, bl5)) | 0;\n hi = (hi + Math.imul(ah7, bh5)) | 0;\n lo = (lo + Math.imul(al6, bl6)) | 0;\n mid = (mid + Math.imul(al6, bh6)) | 0;\n mid = (mid + Math.imul(ah6, bl6)) | 0;\n hi = (hi + Math.imul(ah6, bh6)) | 0;\n lo = (lo + Math.imul(al5, bl7)) | 0;\n mid = (mid + Math.imul(al5, bh7)) | 0;\n mid = (mid + Math.imul(ah5, bl7)) | 0;\n hi = (hi + Math.imul(ah5, bh7)) | 0;\n lo = (lo + Math.imul(al4, bl8)) | 0;\n mid = (mid + Math.imul(al4, bh8)) | 0;\n mid = (mid + Math.imul(ah4, bl8)) | 0;\n hi = (hi + Math.imul(ah4, bh8)) | 0;\n lo = (lo + Math.imul(al3, bl9)) | 0;\n mid = (mid + Math.imul(al3, bh9)) | 0;\n mid = (mid + Math.imul(ah3, bl9)) | 0;\n hi = (hi + Math.imul(ah3, bh9)) | 0;\n var w12 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w12 >>> 26)) | 0;\n w12 &= 0x3ffffff;\n /* k = 13 */\n lo = Math.imul(al9, bl4);\n mid = Math.imul(al9, bh4);\n mid = (mid + Math.imul(ah9, bl4)) | 0;\n hi = Math.imul(ah9, bh4);\n lo = (lo + Math.imul(al8, bl5)) | 0;\n mid = (mid + Math.imul(al8, bh5)) | 0;\n mid = (mid + Math.imul(ah8, bl5)) | 0;\n hi = (hi + Math.imul(ah8, bh5)) | 0;\n lo = (lo + Math.imul(al7, bl6)) | 0;\n mid = (mid + Math.imul(al7, bh6)) | 0;\n mid = (mid + Math.imul(ah7, bl6)) | 0;\n hi = (hi + Math.imul(ah7, bh6)) | 0;\n lo = (lo + Math.imul(al6, bl7)) | 0;\n mid = (mid + Math.imul(al6, bh7)) | 0;\n mid = (mid + Math.imul(ah6, bl7)) | 0;\n hi = (hi + Math.imul(ah6, bh7)) | 0;\n lo = (lo + Math.imul(al5, bl8)) | 0;\n mid = (mid + Math.imul(al5, bh8)) | 0;\n mid = (mid + Math.imul(ah5, bl8)) | 0;\n hi = (hi + Math.imul(ah5, bh8)) | 0;\n lo = (lo + Math.imul(al4, bl9)) | 0;\n mid = (mid + Math.imul(al4, bh9)) | 0;\n mid = (mid + Math.imul(ah4, bl9)) | 0;\n hi = (hi + Math.imul(ah4, bh9)) | 0;\n var w13 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w13 >>> 26)) | 0;\n w13 &= 0x3ffffff;\n /* k = 14 */\n lo = Math.imul(al9, bl5);\n mid = Math.imul(al9, bh5);\n mid = (mid + Math.imul(ah9, bl5)) | 0;\n hi = Math.imul(ah9, bh5);\n lo = (lo + Math.imul(al8, bl6)) | 0;\n mid = (mid + Math.imul(al8, bh6)) | 0;\n mid = (mid + Math.imul(ah8, bl6)) | 0;\n hi = (hi + Math.imul(ah8, bh6)) | 0;\n lo = (lo + Math.imul(al7, bl7)) | 0;\n mid = (mid + Math.imul(al7, bh7)) | 0;\n mid = (mid + Math.imul(ah7, bl7)) | 0;\n hi = (hi + Math.imul(ah7, bh7)) | 0;\n lo = (lo + Math.imul(al6, bl8)) | 0;\n mid = (mid + Math.imul(al6, bh8)) | 0;\n mid = (mid + Math.imul(ah6, bl8)) | 0;\n hi = (hi + Math.imul(ah6, bh8)) | 0;\n lo = (lo + Math.imul(al5, bl9)) | 0;\n mid = (mid + Math.imul(al5, bh9)) | 0;\n mid = (mid + Math.imul(ah5, bl9)) | 0;\n hi = (hi + Math.imul(ah5, bh9)) | 0;\n var w14 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w14 >>> 26)) | 0;\n w14 &= 0x3ffffff;\n /* k = 15 */\n lo = Math.imul(al9, bl6);\n mid = Math.imul(al9, bh6);\n mid = (mid + Math.imul(ah9, bl6)) | 0;\n hi = Math.imul(ah9, bh6);\n lo = (lo + Math.imul(al8, bl7)) | 0;\n mid = (mid + Math.imul(al8, bh7)) | 0;\n mid = (mid + Math.imul(ah8, bl7)) | 0;\n hi = (hi + Math.imul(ah8, bh7)) | 0;\n lo = (lo + Math.imul(al7, bl8)) | 0;\n mid = (mid + Math.imul(al7, bh8)) | 0;\n mid = (mid + Math.imul(ah7, bl8)) | 0;\n hi = (hi + Math.imul(ah7, bh8)) | 0;\n lo = (lo + Math.imul(al6, bl9)) | 0;\n mid = (mid + Math.imul(al6, bh9)) | 0;\n mid = (mid + Math.imul(ah6, bl9)) | 0;\n hi = (hi + Math.imul(ah6, bh9)) | 0;\n var w15 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w15 >>> 26)) | 0;\n w15 &= 0x3ffffff;\n /* k = 16 */\n lo = Math.imul(al9, bl7);\n mid = Math.imul(al9, bh7);\n mid = (mid + Math.imul(ah9, bl7)) | 0;\n hi = Math.imul(ah9, bh7);\n lo = (lo + Math.imul(al8, bl8)) | 0;\n mid = (mid + Math.imul(al8, bh8)) | 0;\n mid = (mid + Math.imul(ah8, bl8)) | 0;\n hi = (hi + Math.imul(ah8, bh8)) | 0;\n lo = (lo + Math.imul(al7, bl9)) | 0;\n mid = (mid + Math.imul(al7, bh9)) | 0;\n mid = (mid + Math.imul(ah7, bl9)) | 0;\n hi = (hi + Math.imul(ah7, bh9)) | 0;\n var w16 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w16 >>> 26)) | 0;\n w16 &= 0x3ffffff;\n /* k = 17 */\n lo = Math.imul(al9, bl8);\n mid = Math.imul(al9, bh8);\n mid = (mid + Math.imul(ah9, bl8)) | 0;\n hi = Math.imul(ah9, bh8);\n lo = (lo + Math.imul(al8, bl9)) | 0;\n mid = (mid + Math.imul(al8, bh9)) | 0;\n mid = (mid + Math.imul(ah8, bl9)) | 0;\n hi = (hi + Math.imul(ah8, bh9)) | 0;\n var w17 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w17 >>> 26)) | 0;\n w17 &= 0x3ffffff;\n /* k = 18 */\n lo = Math.imul(al9, bl9);\n mid = Math.imul(al9, bh9);\n mid = (mid + Math.imul(ah9, bl9)) | 0;\n hi = Math.imul(ah9, bh9);\n var w18 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w18 >>> 26)) | 0;\n w18 &= 0x3ffffff;\n o[0] = w0;\n o[1] = w1;\n o[2] = w2;\n o[3] = w3;\n o[4] = w4;\n o[5] = w5;\n o[6] = w6;\n o[7] = w7;\n o[8] = w8;\n o[9] = w9;\n o[10] = w10;\n o[11] = w11;\n o[12] = w12;\n o[13] = w13;\n o[14] = w14;\n o[15] = w15;\n o[16] = w16;\n o[17] = w17;\n o[18] = w18;\n if (c !== 0) {\n o[19] = c;\n out.length++;\n }\n return out;\n };\n\n // Polyfill comb\n if (!Math.imul) {\n comb10MulTo = smallMulTo;\n }\n\n function bigMulTo (self, num, out) {\n out.negative = num.negative ^ self.negative;\n out.length = self.length + num.length;\n\n var carry = 0;\n var hncarry = 0;\n for (var k = 0; k < out.length - 1; k++) {\n // Sum all words with the same `i + j = k` and accumulate `ncarry`,\n // note that ncarry could be >= 0x3ffffff\n var ncarry = hncarry;\n hncarry = 0;\n var rword = carry & 0x3ffffff;\n var maxJ = Math.min(k, num.length - 1);\n for (var j = Math.max(0, k - self.length + 1); j <= maxJ; j++) {\n var i = k - j;\n var a = self.words[i] | 0;\n var b = num.words[j] | 0;\n var r = a * b;\n\n var lo = r & 0x3ffffff;\n ncarry = (ncarry + ((r / 0x4000000) | 0)) | 0;\n lo = (lo + rword) | 0;\n rword = lo & 0x3ffffff;\n ncarry = (ncarry + (lo >>> 26)) | 0;\n\n hncarry += ncarry >>> 26;\n ncarry &= 0x3ffffff;\n }\n out.words[k] = rword;\n carry = ncarry;\n ncarry = hncarry;\n }\n if (carry !== 0) {\n out.words[k] = carry;\n } else {\n out.length--;\n }\n\n return out.strip();\n }\n\n function jumboMulTo (self, num, out) {\n var fftm = new FFTM();\n return fftm.mulp(self, num, out);\n }\n\n BN.prototype.mulTo = function mulTo (num, out) {\n var res;\n var len = this.length + num.length;\n if (this.length === 10 && num.length === 10) {\n res = comb10MulTo(this, num, out);\n } else if (len < 63) {\n res = smallMulTo(this, num, out);\n } else if (len < 1024) {\n res = bigMulTo(this, num, out);\n } else {\n res = jumboMulTo(this, num, out);\n }\n\n return res;\n };\n\n // Cooley-Tukey algorithm for FFT\n // slightly revisited to rely on looping instead of recursion\n\n function FFTM (x, y) {\n this.x = x;\n this.y = y;\n }\n\n FFTM.prototype.makeRBT = function makeRBT (N) {\n var t = new Array(N);\n var l = BN.prototype._countBits(N) - 1;\n for (var i = 0; i < N; i++) {\n t[i] = this.revBin(i, l, N);\n }\n\n return t;\n };\n\n // Returns binary-reversed representation of `x`\n FFTM.prototype.revBin = function revBin (x, l, N) {\n if (x === 0 || x === N - 1) return x;\n\n var rb = 0;\n for (var i = 0; i < l; i++) {\n rb |= (x & 1) << (l - i - 1);\n x >>= 1;\n }\n\n return rb;\n };\n\n // Performs \"tweedling\" phase, therefore 'emulating'\n // behaviour of the recursive algorithm\n FFTM.prototype.permute = function permute (rbt, rws, iws, rtws, itws, N) {\n for (var i = 0; i < N; i++) {\n rtws[i] = rws[rbt[i]];\n itws[i] = iws[rbt[i]];\n }\n };\n\n FFTM.prototype.transform = function transform (rws, iws, rtws, itws, N, rbt) {\n this.permute(rbt, rws, iws, rtws, itws, N);\n\n for (var s = 1; s < N; s <<= 1) {\n var l = s << 1;\n\n var rtwdf = Math.cos(2 * Math.PI / l);\n var itwdf = Math.sin(2 * Math.PI / l);\n\n for (var p = 0; p < N; p += l) {\n var rtwdf_ = rtwdf;\n var itwdf_ = itwdf;\n\n for (var j = 0; j < s; j++) {\n var re = rtws[p + j];\n var ie = itws[p + j];\n\n var ro = rtws[p + j + s];\n var io = itws[p + j + s];\n\n var rx = rtwdf_ * ro - itwdf_ * io;\n\n io = rtwdf_ * io + itwdf_ * ro;\n ro = rx;\n\n rtws[p + j] = re + ro;\n itws[p + j] = ie + io;\n\n rtws[p + j + s] = re - ro;\n itws[p + j + s] = ie - io;\n\n /* jshint maxdepth : false */\n if (j !== l) {\n rx = rtwdf * rtwdf_ - itwdf * itwdf_;\n\n itwdf_ = rtwdf * itwdf_ + itwdf * rtwdf_;\n rtwdf_ = rx;\n }\n }\n }\n }\n };\n\n FFTM.prototype.guessLen13b = function guessLen13b (n, m) {\n var N = Math.max(m, n) | 1;\n var odd = N & 1;\n var i = 0;\n for (N = N / 2 | 0; N; N = N >>> 1) {\n i++;\n }\n\n return 1 << i + 1 + odd;\n };\n\n FFTM.prototype.conjugate = function conjugate (rws, iws, N) {\n if (N <= 1) return;\n\n for (var i = 0; i < N / 2; i++) {\n var t = rws[i];\n\n rws[i] = rws[N - i - 1];\n rws[N - i - 1] = t;\n\n t = iws[i];\n\n iws[i] = -iws[N - i - 1];\n iws[N - i - 1] = -t;\n }\n };\n\n FFTM.prototype.normalize13b = function normalize13b (ws, N) {\n var carry = 0;\n for (var i = 0; i < N / 2; i++) {\n var w = Math.round(ws[2 * i + 1] / N) * 0x2000 +\n Math.round(ws[2 * i] / N) +\n carry;\n\n ws[i] = w & 0x3ffffff;\n\n if (w < 0x4000000) {\n carry = 0;\n } else {\n carry = w / 0x4000000 | 0;\n }\n }\n\n return ws;\n };\n\n FFTM.prototype.convert13b = function convert13b (ws, len, rws, N) {\n var carry = 0;\n for (var i = 0; i < len; i++) {\n carry = carry + (ws[i] | 0);\n\n rws[2 * i] = carry & 0x1fff; carry = carry >>> 13;\n rws[2 * i + 1] = carry & 0x1fff; carry = carry >>> 13;\n }\n\n // Pad with zeroes\n for (i = 2 * len; i < N; ++i) {\n rws[i] = 0;\n }\n\n assert(carry === 0);\n assert((carry & ~0x1fff) === 0);\n };\n\n FFTM.prototype.stub = function stub (N) {\n var ph = new Array(N);\n for (var i = 0; i < N; i++) {\n ph[i] = 0;\n }\n\n return ph;\n };\n\n FFTM.prototype.mulp = function mulp (x, y, out) {\n var N = 2 * this.guessLen13b(x.length, y.length);\n\n var rbt = this.makeRBT(N);\n\n var _ = this.stub(N);\n\n var rws = new Array(N);\n var rwst = new Array(N);\n var iwst = new Array(N);\n\n var nrws = new Array(N);\n var nrwst = new Array(N);\n var niwst = new Array(N);\n\n var rmws = out.words;\n rmws.length = N;\n\n this.convert13b(x.words, x.length, rws, N);\n this.convert13b(y.words, y.length, nrws, N);\n\n this.transform(rws, _, rwst, iwst, N, rbt);\n this.transform(nrws, _, nrwst, niwst, N, rbt);\n\n for (var i = 0; i < N; i++) {\n var rx = rwst[i] * nrwst[i] - iwst[i] * niwst[i];\n iwst[i] = rwst[i] * niwst[i] + iwst[i] * nrwst[i];\n rwst[i] = rx;\n }\n\n this.conjugate(rwst, iwst, N);\n this.transform(rwst, iwst, rmws, _, N, rbt);\n this.conjugate(rmws, _, N);\n this.normalize13b(rmws, N);\n\n out.negative = x.negative ^ y.negative;\n out.length = x.length + y.length;\n return out.strip();\n };\n\n // Multiply `this` by `num`\n BN.prototype.mul = function mul (num) {\n var out = new BN(null);\n out.words = new Array(this.length + num.length);\n return this.mulTo(num, out);\n };\n\n // Multiply employing FFT\n BN.prototype.mulf = function mulf (num) {\n var out = new BN(null);\n out.words = new Array(this.length + num.length);\n return jumboMulTo(this, num, out);\n };\n\n // In-place Multiplication\n BN.prototype.imul = function imul (num) {\n return this.clone().mulTo(num, this);\n };\n\n BN.prototype.imuln = function imuln (num) {\n assert(typeof num === 'number');\n assert(num < 0x4000000);\n\n // Carry\n var carry = 0;\n for (var i = 0; i < this.length; i++) {\n var w = (this.words[i] | 0) * num;\n var lo = (w & 0x3ffffff) + (carry & 0x3ffffff);\n carry >>= 26;\n carry += (w / 0x4000000) | 0;\n // NOTE: lo is 27bit maximum\n carry += lo >>> 26;\n this.words[i] = lo & 0x3ffffff;\n }\n\n if (carry !== 0) {\n this.words[i] = carry;\n this.length++;\n }\n this.length = num === 0 ? 1 : this.length;\n\n return this;\n };\n\n BN.prototype.muln = function muln (num) {\n return this.clone().imuln(num);\n };\n\n // `this` * `this`\n BN.prototype.sqr = function sqr () {\n return this.mul(this);\n };\n\n // `this` * `this` in-place\n BN.prototype.isqr = function isqr () {\n return this.imul(this.clone());\n };\n\n // Math.pow(`this`, `num`)\n BN.prototype.pow = function pow (num) {\n var w = toBitArray(num);\n if (w.length === 0) return new BN(1);\n\n // Skip leading zeroes\n var res = this;\n for (var i = 0; i < w.length; i++, res = res.sqr()) {\n if (w[i] !== 0) break;\n }\n\n if (++i < w.length) {\n for (var q = res.sqr(); i < w.length; i++, q = q.sqr()) {\n if (w[i] === 0) continue;\n\n res = res.mul(q);\n }\n }\n\n return res;\n };\n\n // Shift-left in-place\n BN.prototype.iushln = function iushln (bits) {\n assert(typeof bits === 'number' && bits >= 0);\n var r = bits % 26;\n var s = (bits - r) / 26;\n var carryMask = (0x3ffffff >>> (26 - r)) << (26 - r);\n var i;\n\n if (r !== 0) {\n var carry = 0;\n\n for (i = 0; i < this.length; i++) {\n var newCarry = this.words[i] & carryMask;\n var c = ((this.words[i] | 0) - newCarry) << r;\n this.words[i] = c | carry;\n carry = newCarry >>> (26 - r);\n }\n\n if (carry) {\n this.words[i] = carry;\n this.length++;\n }\n }\n\n if (s !== 0) {\n for (i = this.length - 1; i >= 0; i--) {\n this.words[i + s] = this.words[i];\n }\n\n for (i = 0; i < s; i++) {\n this.words[i] = 0;\n }\n\n this.length += s;\n }\n\n return this.strip();\n };\n\n BN.prototype.ishln = function ishln (bits) {\n // TODO(indutny): implement me\n assert(this.negative === 0);\n return this.iushln(bits);\n };\n\n // Shift-right in-place\n // NOTE: `hint` is a lowest bit before trailing zeroes\n // NOTE: if `extended` is present - it will be filled with destroyed bits\n BN.prototype.iushrn = function iushrn (bits, hint, extended) {\n assert(typeof bits === 'number' && bits >= 0);\n var h;\n if (hint) {\n h = (hint - (hint % 26)) / 26;\n } else {\n h = 0;\n }\n\n var r = bits % 26;\n var s = Math.min((bits - r) / 26, this.length);\n var mask = 0x3ffffff ^ ((0x3ffffff >>> r) << r);\n var maskedWords = extended;\n\n h -= s;\n h = Math.max(0, h);\n\n // Extended mode, copy masked part\n if (maskedWords) {\n for (var i = 0; i < s; i++) {\n maskedWords.words[i] = this.words[i];\n }\n maskedWords.length = s;\n }\n\n if (s === 0) {\n // No-op, we should not move anything at all\n } else if (this.length > s) {\n this.length -= s;\n for (i = 0; i < this.length; i++) {\n this.words[i] = this.words[i + s];\n }\n } else {\n this.words[0] = 0;\n this.length = 1;\n }\n\n var carry = 0;\n for (i = this.length - 1; i >= 0 && (carry !== 0 || i >= h); i--) {\n var word = this.words[i] | 0;\n this.words[i] = (carry << (26 - r)) | (word >>> r);\n carry = word & mask;\n }\n\n // Push carried bits as a mask\n if (maskedWords && carry !== 0) {\n maskedWords.words[maskedWords.length++] = carry;\n }\n\n if (this.length === 0) {\n this.words[0] = 0;\n this.length = 1;\n }\n\n return this.strip();\n };\n\n BN.prototype.ishrn = function ishrn (bits, hint, extended) {\n // TODO(indutny): implement me\n assert(this.negative === 0);\n return this.iushrn(bits, hint, extended);\n };\n\n // Shift-left\n BN.prototype.shln = function shln (bits) {\n return this.clone().ishln(bits);\n };\n\n BN.prototype.ushln = function ushln (bits) {\n return this.clone().iushln(bits);\n };\n\n // Shift-right\n BN.prototype.shrn = function shrn (bits) {\n return this.clone().ishrn(bits);\n };\n\n BN.prototype.ushrn = function ushrn (bits) {\n return this.clone().iushrn(bits);\n };\n\n // Test if n bit is set\n BN.prototype.testn = function testn (bit) {\n assert(typeof bit === 'number' && bit >= 0);\n var r = bit % 26;\n var s = (bit - r) / 26;\n var q = 1 << r;\n\n // Fast case: bit is much higher than all existing words\n if (this.length <= s) return false;\n\n // Check bit and return\n var w = this.words[s];\n\n return !!(w & q);\n };\n\n // Return only lowers bits of number (in-place)\n BN.prototype.imaskn = function imaskn (bits) {\n assert(typeof bits === 'number' && bits >= 0);\n var r = bits % 26;\n var s = (bits - r) / 26;\n\n assert(this.negative === 0, 'imaskn works only with positive numbers');\n\n if (this.length <= s) {\n return this;\n }\n\n if (r !== 0) {\n s++;\n }\n this.length = Math.min(s, this.length);\n\n if (r !== 0) {\n var mask = 0x3ffffff ^ ((0x3ffffff >>> r) << r);\n this.words[this.length - 1] &= mask;\n }\n\n if (this.length === 0) {\n this.words[0] = 0;\n this.length = 1;\n }\n\n return this.strip();\n };\n\n // Return only lowers bits of number\n BN.prototype.maskn = function maskn (bits) {\n return this.clone().imaskn(bits);\n };\n\n // Add plain number `num` to `this`\n BN.prototype.iaddn = function iaddn (num) {\n assert(typeof num === 'number');\n assert(num < 0x4000000);\n if (num < 0) return this.isubn(-num);\n\n // Possible sign change\n if (this.negative !== 0) {\n if (this.length === 1 && (this.words[0] | 0) < num) {\n this.words[0] = num - (this.words[0] | 0);\n this.negative = 0;\n return this;\n }\n\n this.negative = 0;\n this.isubn(num);\n this.negative = 1;\n return this;\n }\n\n // Add without checks\n return this._iaddn(num);\n };\n\n BN.prototype._iaddn = function _iaddn (num) {\n this.words[0] += num;\n\n // Carry\n for (var i = 0; i < this.length && this.words[i] >= 0x4000000; i++) {\n this.words[i] -= 0x4000000;\n if (i === this.length - 1) {\n this.words[i + 1] = 1;\n } else {\n this.words[i + 1]++;\n }\n }\n this.length = Math.max(this.length, i + 1);\n\n return this;\n };\n\n // Subtract plain number `num` from `this`\n BN.prototype.isubn = function isubn (num) {\n assert(typeof num === 'number');\n assert(num < 0x4000000);\n if (num < 0) return this.iaddn(-num);\n\n if (this.negative !== 0) {\n this.negative = 0;\n this.iaddn(num);\n this.negative = 1;\n return this;\n }\n\n this.words[0] -= num;\n\n if (this.length === 1 && this.words[0] < 0) {\n this.words[0] = -this.words[0];\n this.negative = 1;\n } else {\n // Carry\n for (var i = 0; i < this.length && this.words[i] < 0; i++) {\n this.words[i] += 0x4000000;\n this.words[i + 1] -= 1;\n }\n }\n\n return this.strip();\n };\n\n BN.prototype.addn = function addn (num) {\n return this.clone().iaddn(num);\n };\n\n BN.prototype.subn = function subn (num) {\n return this.clone().isubn(num);\n };\n\n BN.prototype.iabs = function iabs () {\n this.negative = 0;\n\n return this;\n };\n\n BN.prototype.abs = function abs () {\n return this.clone().iabs();\n };\n\n BN.prototype._ishlnsubmul = function _ishlnsubmul (num, mul, shift) {\n var len = num.length + shift;\n var i;\n\n this._expand(len);\n\n var w;\n var carry = 0;\n for (i = 0; i < num.length; i++) {\n w = (this.words[i + shift] | 0) + carry;\n var right = (num.words[i] | 0) * mul;\n w -= right & 0x3ffffff;\n carry = (w >> 26) - ((right / 0x4000000) | 0);\n this.words[i + shift] = w & 0x3ffffff;\n }\n for (; i < this.length - shift; i++) {\n w = (this.words[i + shift] | 0) + carry;\n carry = w >> 26;\n this.words[i + shift] = w & 0x3ffffff;\n }\n\n if (carry === 0) return this.strip();\n\n // Subtraction overflow\n assert(carry === -1);\n carry = 0;\n for (i = 0; i < this.length; i++) {\n w = -(this.words[i] | 0) + carry;\n carry = w >> 26;\n this.words[i] = w & 0x3ffffff;\n }\n this.negative = 1;\n\n return this.strip();\n };\n\n BN.prototype._wordDiv = function _wordDiv (num, mode) {\n var shift = this.length - num.length;\n\n var a = this.clone();\n var b = num;\n\n // Normalize\n var bhi = b.words[b.length - 1] | 0;\n var bhiBits = this._countBits(bhi);\n shift = 26 - bhiBits;\n if (shift !== 0) {\n b = b.ushln(shift);\n a.iushln(shift);\n bhi = b.words[b.length - 1] | 0;\n }\n\n // Initialize quotient\n var m = a.length - b.length;\n var q;\n\n if (mode !== 'mod') {\n q = new BN(null);\n q.length = m + 1;\n q.words = new Array(q.length);\n for (var i = 0; i < q.length; i++) {\n q.words[i] = 0;\n }\n }\n\n var diff = a.clone()._ishlnsubmul(b, 1, m);\n if (diff.negative === 0) {\n a = diff;\n if (q) {\n q.words[m] = 1;\n }\n }\n\n for (var j = m - 1; j >= 0; j--) {\n var qj = (a.words[b.length + j] | 0) * 0x4000000 +\n (a.words[b.length + j - 1] | 0);\n\n // NOTE: (qj / bhi) is (0x3ffffff * 0x4000000 + 0x3ffffff) / 0x2000000 max\n // (0x7ffffff)\n qj = Math.min((qj / bhi) | 0, 0x3ffffff);\n\n a._ishlnsubmul(b, qj, j);\n while (a.negative !== 0) {\n qj--;\n a.negative = 0;\n a._ishlnsubmul(b, 1, j);\n if (!a.isZero()) {\n a.negative ^= 1;\n }\n }\n if (q) {\n q.words[j] = qj;\n }\n }\n if (q) {\n q.strip();\n }\n a.strip();\n\n // Denormalize\n if (mode !== 'div' && shift !== 0) {\n a.iushrn(shift);\n }\n\n return {\n div: q || null,\n mod: a\n };\n };\n\n // NOTE: 1) `mode` can be set to `mod` to request mod only,\n // to `div` to request div only, or be absent to\n // request both div & mod\n // 2) `positive` is true if unsigned mod is requested\n BN.prototype.divmod = function divmod (num, mode, positive) {\n assert(!num.isZero());\n\n if (this.isZero()) {\n return {\n div: new BN(0),\n mod: new BN(0)\n };\n }\n\n var div, mod, res;\n if (this.negative !== 0 && num.negative === 0) {\n res = this.neg().divmod(num, mode);\n\n if (mode !== 'mod') {\n div = res.div.neg();\n }\n\n if (mode !== 'div') {\n mod = res.mod.neg();\n if (positive && mod.negative !== 0) {\n mod.iadd(num);\n }\n }\n\n return {\n div: div,\n mod: mod\n };\n }\n\n if (this.negative === 0 && num.negative !== 0) {\n res = this.divmod(num.neg(), mode);\n\n if (mode !== 'mod') {\n div = res.div.neg();\n }\n\n return {\n div: div,\n mod: res.mod\n };\n }\n\n if ((this.negative & num.negative) !== 0) {\n res = this.neg().divmod(num.neg(), mode);\n\n if (mode !== 'div') {\n mod = res.mod.neg();\n if (positive && mod.negative !== 0) {\n mod.isub(num);\n }\n }\n\n return {\n div: res.div,\n mod: mod\n };\n }\n\n // Both numbers are positive at this point\n\n // Strip both numbers to approximate shift value\n if (num.length > this.length || this.cmp(num) < 0) {\n return {\n div: new BN(0),\n mod: this\n };\n }\n\n // Very short reduction\n if (num.length === 1) {\n if (mode === 'div') {\n return {\n div: this.divn(num.words[0]),\n mod: null\n };\n }\n\n if (mode === 'mod') {\n return {\n div: null,\n mod: new BN(this.modn(num.words[0]))\n };\n }\n\n return {\n div: this.divn(num.words[0]),\n mod: new BN(this.modn(num.words[0]))\n };\n }\n\n return this._wordDiv(num, mode);\n };\n\n // Find `this` / `num`\n BN.prototype.div = function div (num) {\n return this.divmod(num, 'div', false).div;\n };\n\n // Find `this` % `num`\n BN.prototype.mod = function mod (num) {\n return this.divmod(num, 'mod', false).mod;\n };\n\n BN.prototype.umod = function umod (num) {\n return this.divmod(num, 'mod', true).mod;\n };\n\n // Find Round(`this` / `num`)\n BN.prototype.divRound = function divRound (num) {\n var dm = this.divmod(num);\n\n // Fast case - exact division\n if (dm.mod.isZero()) return dm.div;\n\n var mod = dm.div.negative !== 0 ? dm.mod.isub(num) : dm.mod;\n\n var half = num.ushrn(1);\n var r2 = num.andln(1);\n var cmp = mod.cmp(half);\n\n // Round down\n if (cmp < 0 || r2 === 1 && cmp === 0) return dm.div;\n\n // Round up\n return dm.div.negative !== 0 ? dm.div.isubn(1) : dm.div.iaddn(1);\n };\n\n BN.prototype.modn = function modn (num) {\n assert(num <= 0x3ffffff);\n var p = (1 << 26) % num;\n\n var acc = 0;\n for (var i = this.length - 1; i >= 0; i--) {\n acc = (p * acc + (this.words[i] | 0)) % num;\n }\n\n return acc;\n };\n\n // In-place division by number\n BN.prototype.idivn = function idivn (num) {\n assert(num <= 0x3ffffff);\n\n var carry = 0;\n for (var i = this.length - 1; i >= 0; i--) {\n var w = (this.words[i] | 0) + carry * 0x4000000;\n this.words[i] = (w / num) | 0;\n carry = w % num;\n }\n\n return this.strip();\n };\n\n BN.prototype.divn = function divn (num) {\n return this.clone().idivn(num);\n };\n\n BN.prototype.egcd = function egcd (p) {\n assert(p.negative === 0);\n assert(!p.isZero());\n\n var x = this;\n var y = p.clone();\n\n if (x.negative !== 0) {\n x = x.umod(p);\n } else {\n x = x.clone();\n }\n\n // A * x + B * y = x\n var A = new BN(1);\n var B = new BN(0);\n\n // C * x + D * y = y\n var C = new BN(0);\n var D = new BN(1);\n\n var g = 0;\n\n while (x.isEven() && y.isEven()) {\n x.iushrn(1);\n y.iushrn(1);\n ++g;\n }\n\n var yp = y.clone();\n var xp = x.clone();\n\n while (!x.isZero()) {\n for (var i = 0, im = 1; (x.words[0] & im) === 0 && i < 26; ++i, im <<= 1);\n if (i > 0) {\n x.iushrn(i);\n while (i-- > 0) {\n if (A.isOdd() || B.isOdd()) {\n A.iadd(yp);\n B.isub(xp);\n }\n\n A.iushrn(1);\n B.iushrn(1);\n }\n }\n\n for (var j = 0, jm = 1; (y.words[0] & jm) === 0 && j < 26; ++j, jm <<= 1);\n if (j > 0) {\n y.iushrn(j);\n while (j-- > 0) {\n if (C.isOdd() || D.isOdd()) {\n C.iadd(yp);\n D.isub(xp);\n }\n\n C.iushrn(1);\n D.iushrn(1);\n }\n }\n\n if (x.cmp(y) >= 0) {\n x.isub(y);\n A.isub(C);\n B.isub(D);\n } else {\n y.isub(x);\n C.isub(A);\n D.isub(B);\n }\n }\n\n return {\n a: C,\n b: D,\n gcd: y.iushln(g)\n };\n };\n\n // This is reduced incarnation of the binary EEA\n // above, designated to invert members of the\n // _prime_ fields F(p) at a maximal speed\n BN.prototype._invmp = function _invmp (p) {\n assert(p.negative === 0);\n assert(!p.isZero());\n\n var a = this;\n var b = p.clone();\n\n if (a.negative !== 0) {\n a = a.umod(p);\n } else {\n a = a.clone();\n }\n\n var x1 = new BN(1);\n var x2 = new BN(0);\n\n var delta = b.clone();\n\n while (a.cmpn(1) > 0 && b.cmpn(1) > 0) {\n for (var i = 0, im = 1; (a.words[0] & im) === 0 && i < 26; ++i, im <<= 1);\n if (i > 0) {\n a.iushrn(i);\n while (i-- > 0) {\n if (x1.isOdd()) {\n x1.iadd(delta);\n }\n\n x1.iushrn(1);\n }\n }\n\n for (var j = 0, jm = 1; (b.words[0] & jm) === 0 && j < 26; ++j, jm <<= 1);\n if (j > 0) {\n b.iushrn(j);\n while (j-- > 0) {\n if (x2.isOdd()) {\n x2.iadd(delta);\n }\n\n x2.iushrn(1);\n }\n }\n\n if (a.cmp(b) >= 0) {\n a.isub(b);\n x1.isub(x2);\n } else {\n b.isub(a);\n x2.isub(x1);\n }\n }\n\n var res;\n if (a.cmpn(1) === 0) {\n res = x1;\n } else {\n res = x2;\n }\n\n if (res.cmpn(0) < 0) {\n res.iadd(p);\n }\n\n return res;\n };\n\n BN.prototype.gcd = function gcd (num) {\n if (this.isZero()) return num.abs();\n if (num.isZero()) return this.abs();\n\n var a = this.clone();\n var b = num.clone();\n a.negative = 0;\n b.negative = 0;\n\n // Remove common factor of two\n for (var shift = 0; a.isEven() && b.isEven(); shift++) {\n a.iushrn(1);\n b.iushrn(1);\n }\n\n do {\n while (a.isEven()) {\n a.iushrn(1);\n }\n while (b.isEven()) {\n b.iushrn(1);\n }\n\n var r = a.cmp(b);\n if (r < 0) {\n // Swap `a` and `b` to make `a` always bigger than `b`\n var t = a;\n a = b;\n b = t;\n } else if (r === 0 || b.cmpn(1) === 0) {\n break;\n }\n\n a.isub(b);\n } while (true);\n\n return b.iushln(shift);\n };\n\n // Invert number in the field F(num)\n BN.prototype.invm = function invm (num) {\n return this.egcd(num).a.umod(num);\n };\n\n BN.prototype.isEven = function isEven () {\n return (this.words[0] & 1) === 0;\n };\n\n BN.prototype.isOdd = function isOdd () {\n return (this.words[0] & 1) === 1;\n };\n\n // And first word and num\n BN.prototype.andln = function andln (num) {\n return this.words[0] & num;\n };\n\n // Increment at the bit position in-line\n BN.prototype.bincn = function bincn (bit) {\n assert(typeof bit === 'number');\n var r = bit % 26;\n var s = (bit - r) / 26;\n var q = 1 << r;\n\n // Fast case: bit is much higher than all existing words\n if (this.length <= s) {\n this._expand(s + 1);\n this.words[s] |= q;\n return this;\n }\n\n // Add bit and propagate, if needed\n var carry = q;\n for (var i = s; carry !== 0 && i < this.length; i++) {\n var w = this.words[i] | 0;\n w += carry;\n carry = w >>> 26;\n w &= 0x3ffffff;\n this.words[i] = w;\n }\n if (carry !== 0) {\n this.words[i] = carry;\n this.length++;\n }\n return this;\n };\n\n BN.prototype.isZero = function isZero () {\n return this.length === 1 && this.words[0] === 0;\n };\n\n BN.prototype.cmpn = function cmpn (num) {\n var negative = num < 0;\n\n if (this.negative !== 0 && !negative) return -1;\n if (this.negative === 0 && negative) return 1;\n\n this.strip();\n\n var res;\n if (this.length > 1) {\n res = 1;\n } else {\n if (negative) {\n num = -num;\n }\n\n assert(num <= 0x3ffffff, 'Number is too big');\n\n var w = this.words[0] | 0;\n res = w === num ? 0 : w < num ? -1 : 1;\n }\n if (this.negative !== 0) return -res | 0;\n return res;\n };\n\n // Compare two numbers and return:\n // 1 - if `this` > `num`\n // 0 - if `this` == `num`\n // -1 - if `this` < `num`\n BN.prototype.cmp = function cmp (num) {\n if (this.negative !== 0 && num.negative === 0) return -1;\n if (this.negative === 0 && num.negative !== 0) return 1;\n\n var res = this.ucmp(num);\n if (this.negative !== 0) return -res | 0;\n return res;\n };\n\n // Unsigned comparison\n BN.prototype.ucmp = function ucmp (num) {\n // At this point both numbers have the same sign\n if (this.length > num.length) return 1;\n if (this.length < num.length) return -1;\n\n var res = 0;\n for (var i = this.length - 1; i >= 0; i--) {\n var a = this.words[i] | 0;\n var b = num.words[i] | 0;\n\n if (a === b) continue;\n if (a < b) {\n res = -1;\n } else if (a > b) {\n res = 1;\n }\n break;\n }\n return res;\n };\n\n BN.prototype.gtn = function gtn (num) {\n return this.cmpn(num) === 1;\n };\n\n BN.prototype.gt = function gt (num) {\n return this.cmp(num) === 1;\n };\n\n BN.prototype.gten = function gten (num) {\n return this.cmpn(num) >= 0;\n };\n\n BN.prototype.gte = function gte (num) {\n return this.cmp(num) >= 0;\n };\n\n BN.prototype.ltn = function ltn (num) {\n return this.cmpn(num) === -1;\n };\n\n BN.prototype.lt = function lt (num) {\n return this.cmp(num) === -1;\n };\n\n BN.prototype.lten = function lten (num) {\n return this.cmpn(num) <= 0;\n };\n\n BN.prototype.lte = function lte (num) {\n return this.cmp(num) <= 0;\n };\n\n BN.prototype.eqn = function eqn (num) {\n return this.cmpn(num) === 0;\n };\n\n BN.prototype.eq = function eq (num) {\n return this.cmp(num) === 0;\n };\n\n //\n // A reduce context, could be using montgomery or something better, depending\n // on the `m` itself.\n //\n BN.red = function red (num) {\n return new Red(num);\n };\n\n BN.prototype.toRed = function toRed (ctx) {\n assert(!this.red, 'Already a number in reduction context');\n assert(this.negative === 0, 'red works only with positives');\n return ctx.convertTo(this)._forceRed(ctx);\n };\n\n BN.prototype.fromRed = function fromRed () {\n assert(this.red, 'fromRed works only with numbers in reduction context');\n return this.red.convertFrom(this);\n };\n\n BN.prototype._forceRed = function _forceRed (ctx) {\n this.red = ctx;\n return this;\n };\n\n BN.prototype.forceRed = function forceRed (ctx) {\n assert(!this.red, 'Already a number in reduction context');\n return this._forceRed(ctx);\n };\n\n BN.prototype.redAdd = function redAdd (num) {\n assert(this.red, 'redAdd works only with red numbers');\n return this.red.add(this, num);\n };\n\n BN.prototype.redIAdd = function redIAdd (num) {\n assert(this.red, 'redIAdd works only with red numbers');\n return this.red.iadd(this, num);\n };\n\n BN.prototype.redSub = function redSub (num) {\n assert(this.red, 'redSub works only with red numbers');\n return this.red.sub(this, num);\n };\n\n BN.prototype.redISub = function redISub (num) {\n assert(this.red, 'redISub works only with red numbers');\n return this.red.isub(this, num);\n };\n\n BN.prototype.redShl = function redShl (num) {\n assert(this.red, 'redShl works only with red numbers');\n return this.red.shl(this, num);\n };\n\n BN.prototype.redMul = function redMul (num) {\n assert(this.red, 'redMul works only with red numbers');\n this.red._verify2(this, num);\n return this.red.mul(this, num);\n };\n\n BN.prototype.redIMul = function redIMul (num) {\n assert(this.red, 'redMul works only with red numbers');\n this.red._verify2(this, num);\n return this.red.imul(this, num);\n };\n\n BN.prototype.redSqr = function redSqr () {\n assert(this.red, 'redSqr works only with red numbers');\n this.red._verify1(this);\n return this.red.sqr(this);\n };\n\n BN.prototype.redISqr = function redISqr () {\n assert(this.red, 'redISqr works only with red numbers');\n this.red._verify1(this);\n return this.red.isqr(this);\n };\n\n // Square root over p\n BN.prototype.redSqrt = function redSqrt () {\n assert(this.red, 'redSqrt works only with red numbers');\n this.red._verify1(this);\n return this.red.sqrt(this);\n };\n\n BN.prototype.redInvm = function redInvm () {\n assert(this.red, 'redInvm works only with red numbers');\n this.red._verify1(this);\n return this.red.invm(this);\n };\n\n // Return negative clone of `this` % `red modulo`\n BN.prototype.redNeg = function redNeg () {\n assert(this.red, 'redNeg works only with red numbers');\n this.red._verify1(this);\n return this.red.neg(this);\n };\n\n BN.prototype.redPow = function redPow (num) {\n assert(this.red && !num.red, 'redPow(normalNum)');\n this.red._verify1(this);\n return this.red.pow(this, num);\n };\n\n // Prime numbers with efficient reduction\n var primes = {\n k256: null,\n p224: null,\n p192: null,\n p25519: null\n };\n\n // Pseudo-Mersenne prime\n function MPrime (name, p) {\n // P = 2 ^ N - K\n this.name = name;\n this.p = new BN(p, 16);\n this.n = this.p.bitLength();\n this.k = new BN(1).iushln(this.n).isub(this.p);\n\n this.tmp = this._tmp();\n }\n\n MPrime.prototype._tmp = function _tmp () {\n var tmp = new BN(null);\n tmp.words = new Array(Math.ceil(this.n / 13));\n return tmp;\n };\n\n MPrime.prototype.ireduce = function ireduce (num) {\n // Assumes that `num` is less than `P^2`\n // num = HI * (2 ^ N - K) + HI * K + LO = HI * K + LO (mod P)\n var r = num;\n var rlen;\n\n do {\n this.split(r, this.tmp);\n r = this.imulK(r);\n r = r.iadd(this.tmp);\n rlen = r.bitLength();\n } while (rlen > this.n);\n\n var cmp = rlen < this.n ? -1 : r.ucmp(this.p);\n if (cmp === 0) {\n r.words[0] = 0;\n r.length = 1;\n } else if (cmp > 0) {\n r.isub(this.p);\n } else {\n if (r.strip !== undefined) {\n // r is BN v4 instance\n r.strip();\n } else {\n // r is BN v5 instance\n r._strip();\n }\n }\n\n return r;\n };\n\n MPrime.prototype.split = function split (input, out) {\n input.iushrn(this.n, 0, out);\n };\n\n MPrime.prototype.imulK = function imulK (num) {\n return num.imul(this.k);\n };\n\n function K256 () {\n MPrime.call(\n this,\n 'k256',\n 'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f');\n }\n inherits(K256, MPrime);\n\n K256.prototype.split = function split (input, output) {\n // 256 = 9 * 26 + 22\n var mask = 0x3fffff;\n\n var outLen = Math.min(input.length, 9);\n for (var i = 0; i < outLen; i++) {\n output.words[i] = input.words[i];\n }\n output.length = outLen;\n\n if (input.length <= 9) {\n input.words[0] = 0;\n input.length = 1;\n return;\n }\n\n // Shift by 9 limbs\n var prev = input.words[9];\n output.words[output.length++] = prev & mask;\n\n for (i = 10; i < input.length; i++) {\n var next = input.words[i] | 0;\n input.words[i - 10] = ((next & mask) << 4) | (prev >>> 22);\n prev = next;\n }\n prev >>>= 22;\n input.words[i - 10] = prev;\n if (prev === 0 && input.length > 10) {\n input.length -= 10;\n } else {\n input.length -= 9;\n }\n };\n\n K256.prototype.imulK = function imulK (num) {\n // K = 0x1000003d1 = [ 0x40, 0x3d1 ]\n num.words[num.length] = 0;\n num.words[num.length + 1] = 0;\n num.length += 2;\n\n // bounded at: 0x40 * 0x3ffffff + 0x3d0 = 0x100000390\n var lo = 0;\n for (var i = 0; i < num.length; i++) {\n var w = num.words[i] | 0;\n lo += w * 0x3d1;\n num.words[i] = lo & 0x3ffffff;\n lo = w * 0x40 + ((lo / 0x4000000) | 0);\n }\n\n // Fast length reduction\n if (num.words[num.length - 1] === 0) {\n num.length--;\n if (num.words[num.length - 1] === 0) {\n num.length--;\n }\n }\n return num;\n };\n\n function P224 () {\n MPrime.call(\n this,\n 'p224',\n 'ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001');\n }\n inherits(P224, MPrime);\n\n function P192 () {\n MPrime.call(\n this,\n 'p192',\n 'ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff');\n }\n inherits(P192, MPrime);\n\n function P25519 () {\n // 2 ^ 255 - 19\n MPrime.call(\n this,\n '25519',\n '7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed');\n }\n inherits(P25519, MPrime);\n\n P25519.prototype.imulK = function imulK (num) {\n // K = 0x13\n var carry = 0;\n for (var i = 0; i < num.length; i++) {\n var hi = (num.words[i] | 0) * 0x13 + carry;\n var lo = hi & 0x3ffffff;\n hi >>>= 26;\n\n num.words[i] = lo;\n carry = hi;\n }\n if (carry !== 0) {\n num.words[num.length++] = carry;\n }\n return num;\n };\n\n // Exported mostly for testing purposes, use plain name instead\n BN._prime = function prime (name) {\n // Cached version of prime\n if (primes[name]) return primes[name];\n\n var prime;\n if (name === 'k256') {\n prime = new K256();\n } else if (name === 'p224') {\n prime = new P224();\n } else if (name === 'p192') {\n prime = new P192();\n } else if (name === 'p25519') {\n prime = new P25519();\n } else {\n throw new Error('Unknown prime ' + name);\n }\n primes[name] = prime;\n\n return prime;\n };\n\n //\n // Base reduction engine\n //\n function Red (m) {\n if (typeof m === 'string') {\n var prime = BN._prime(m);\n this.m = prime.p;\n this.prime = prime;\n } else {\n assert(m.gtn(1), 'modulus must be greater than 1');\n this.m = m;\n this.prime = null;\n }\n }\n\n Red.prototype._verify1 = function _verify1 (a) {\n assert(a.negative === 0, 'red works only with positives');\n assert(a.red, 'red works only with red numbers');\n };\n\n Red.prototype._verify2 = function _verify2 (a, b) {\n assert((a.negative | b.negative) === 0, 'red works only with positives');\n assert(a.red && a.red === b.red,\n 'red works only with red numbers');\n };\n\n Red.prototype.imod = function imod (a) {\n if (this.prime) return this.prime.ireduce(a)._forceRed(this);\n return a.umod(this.m)._forceRed(this);\n };\n\n Red.prototype.neg = function neg (a) {\n if (a.isZero()) {\n return a.clone();\n }\n\n return this.m.sub(a)._forceRed(this);\n };\n\n Red.prototype.add = function add (a, b) {\n this._verify2(a, b);\n\n var res = a.add(b);\n if (res.cmp(this.m) >= 0) {\n res.isub(this.m);\n }\n return res._forceRed(this);\n };\n\n Red.prototype.iadd = function iadd (a, b) {\n this._verify2(a, b);\n\n var res = a.iadd(b);\n if (res.cmp(this.m) >= 0) {\n res.isub(this.m);\n }\n return res;\n };\n\n Red.prototype.sub = function sub (a, b) {\n this._verify2(a, b);\n\n var res = a.sub(b);\n if (res.cmpn(0) < 0) {\n res.iadd(this.m);\n }\n return res._forceRed(this);\n };\n\n Red.prototype.isub = function isub (a, b) {\n this._verify2(a, b);\n\n var res = a.isub(b);\n if (res.cmpn(0) < 0) {\n res.iadd(this.m);\n }\n return res;\n };\n\n Red.prototype.shl = function shl (a, num) {\n this._verify1(a);\n return this.imod(a.ushln(num));\n };\n\n Red.prototype.imul = function imul (a, b) {\n this._verify2(a, b);\n return this.imod(a.imul(b));\n };\n\n Red.prototype.mul = function mul (a, b) {\n this._verify2(a, b);\n return this.imod(a.mul(b));\n };\n\n Red.prototype.isqr = function isqr (a) {\n return this.imul(a, a.clone());\n };\n\n Red.prototype.sqr = function sqr (a) {\n return this.mul(a, a);\n };\n\n Red.prototype.sqrt = function sqrt (a) {\n if (a.isZero()) return a.clone();\n\n var mod3 = this.m.andln(3);\n assert(mod3 % 2 === 1);\n\n // Fast case\n if (mod3 === 3) {\n var pow = this.m.add(new BN(1)).iushrn(2);\n return this.pow(a, pow);\n }\n\n // Tonelli-Shanks algorithm (Totally unoptimized and slow)\n //\n // Find Q and S, that Q * 2 ^ S = (P - 1)\n var q = this.m.subn(1);\n var s = 0;\n while (!q.isZero() && q.andln(1) === 0) {\n s++;\n q.iushrn(1);\n }\n assert(!q.isZero());\n\n var one = new BN(1).toRed(this);\n var nOne = one.redNeg();\n\n // Find quadratic non-residue\n // NOTE: Max is such because of generalized Riemann hypothesis.\n var lpow = this.m.subn(1).iushrn(1);\n var z = this.m.bitLength();\n z = new BN(2 * z * z).toRed(this);\n\n while (this.pow(z, lpow).cmp(nOne) !== 0) {\n z.redIAdd(nOne);\n }\n\n var c = this.pow(z, q);\n var r = this.pow(a, q.addn(1).iushrn(1));\n var t = this.pow(a, q);\n var m = s;\n while (t.cmp(one) !== 0) {\n var tmp = t;\n for (var i = 0; tmp.cmp(one) !== 0; i++) {\n tmp = tmp.redSqr();\n }\n assert(i < m);\n var b = this.pow(c, new BN(1).iushln(m - i - 1));\n\n r = r.redMul(b);\n c = b.redSqr();\n t = t.redMul(c);\n m = i;\n }\n\n return r;\n };\n\n Red.prototype.invm = function invm (a) {\n var inv = a._invmp(this.m);\n if (inv.negative !== 0) {\n inv.negative = 0;\n return this.imod(inv).redNeg();\n } else {\n return this.imod(inv);\n }\n };\n\n Red.prototype.pow = function pow (a, num) {\n if (num.isZero()) return new BN(1).toRed(this);\n if (num.cmpn(1) === 0) return a.clone();\n\n var windowSize = 4;\n var wnd = new Array(1 << windowSize);\n wnd[0] = new BN(1).toRed(this);\n wnd[1] = a;\n for (var i = 2; i < wnd.length; i++) {\n wnd[i] = this.mul(wnd[i - 1], a);\n }\n\n var res = wnd[0];\n var current = 0;\n var currentLen = 0;\n var start = num.bitLength() % 26;\n if (start === 0) {\n start = 26;\n }\n\n for (i = num.length - 1; i >= 0; i--) {\n var word = num.words[i];\n for (var j = start - 1; j >= 0; j--) {\n var bit = (word >> j) & 1;\n if (res !== wnd[0]) {\n res = this.sqr(res);\n }\n\n if (bit === 0 && current === 0) {\n currentLen = 0;\n continue;\n }\n\n current <<= 1;\n current |= bit;\n currentLen++;\n if (currentLen !== windowSize && (i !== 0 || j !== 0)) continue;\n\n res = this.mul(res, wnd[current]);\n currentLen = 0;\n current = 0;\n }\n start = 26;\n }\n\n return res;\n };\n\n Red.prototype.convertTo = function convertTo (num) {\n var r = num.umod(this.m);\n\n return r === num ? r.clone() : r;\n };\n\n Red.prototype.convertFrom = function convertFrom (num) {\n var res = num.clone();\n res.red = null;\n return res;\n };\n\n //\n // Montgomery method engine\n //\n\n BN.mont = function mont (num) {\n return new Mont(num);\n };\n\n function Mont (m) {\n Red.call(this, m);\n\n this.shift = this.m.bitLength();\n if (this.shift % 26 !== 0) {\n this.shift += 26 - (this.shift % 26);\n }\n\n this.r = new BN(1).iushln(this.shift);\n this.r2 = this.imod(this.r.sqr());\n this.rinv = this.r._invmp(this.m);\n\n this.minv = this.rinv.mul(this.r).isubn(1).div(this.m);\n this.minv = this.minv.umod(this.r);\n this.minv = this.r.sub(this.minv);\n }\n inherits(Mont, Red);\n\n Mont.prototype.convertTo = function convertTo (num) {\n return this.imod(num.ushln(this.shift));\n };\n\n Mont.prototype.convertFrom = function convertFrom (num) {\n var r = this.imod(num.mul(this.rinv));\n r.red = null;\n return r;\n };\n\n Mont.prototype.imul = function imul (a, b) {\n if (a.isZero() || b.isZero()) {\n a.words[0] = 0;\n a.length = 1;\n return a;\n }\n\n var t = a.imul(b);\n var c = t.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m);\n var u = t.isub(c).iushrn(this.shift);\n var res = u;\n\n if (u.cmp(this.m) >= 0) {\n res = u.isub(this.m);\n } else if (u.cmpn(0) < 0) {\n res = u.iadd(this.m);\n }\n\n return res._forceRed(this);\n };\n\n Mont.prototype.mul = function mul (a, b) {\n if (a.isZero() || b.isZero()) return new BN(0)._forceRed(this);\n\n var t = a.mul(b);\n var c = t.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m);\n var u = t.isub(c).iushrn(this.shift);\n var res = u;\n if (u.cmp(this.m) >= 0) {\n res = u.isub(this.m);\n } else if (u.cmpn(0) < 0) {\n res = u.iadd(this.m);\n }\n\n return res._forceRed(this);\n };\n\n Mont.prototype.invm = function invm (a) {\n // (AR)^-1 * R^2 = (A^-1 * R^-1) * R^2 = A^-1 * R\n var res = this.imod(a._invmp(this.m).mul(this.r2));\n return res._forceRed(this);\n };\n})(typeof module === 'undefined' || module, this);\n","module.exports = assert;\n\nfunction assert(val, msg) {\n if (!val)\n throw new Error(msg || 'Assertion failed');\n}\n\nassert.equal = function assertEqual(l, r, msg) {\n if (l != r)\n throw new Error(msg || ('Assertion failed: ' + l + ' != ' + r));\n};\n","'use strict';\n\nvar utils = exports;\n\nfunction toArray(msg, enc) {\n if (Array.isArray(msg))\n return msg.slice();\n if (!msg)\n return [];\n var res = [];\n if (typeof msg !== 'string') {\n for (var i = 0; i < msg.length; i++)\n res[i] = msg[i] | 0;\n return res;\n }\n if (enc === 'hex') {\n msg = msg.replace(/[^a-z0-9]+/ig, '');\n if (msg.length % 2 !== 0)\n msg = '0' + msg;\n for (var i = 0; i < msg.length; i += 2)\n res.push(parseInt(msg[i] + msg[i + 1], 16));\n } else {\n for (var i = 0; i < msg.length; i++) {\n var c = msg.charCodeAt(i);\n var hi = c >> 8;\n var lo = c & 0xff;\n if (hi)\n res.push(hi, lo);\n else\n res.push(lo);\n }\n }\n return res;\n}\nutils.toArray = toArray;\n\nfunction zero2(word) {\n if (word.length === 1)\n return '0' + word;\n else\n return word;\n}\nutils.zero2 = zero2;\n\nfunction toHex(msg) {\n var res = '';\n for (var i = 0; i < msg.length; i++)\n res += zero2(msg[i].toString(16));\n return res;\n}\nutils.toHex = toHex;\n\nutils.encode = function encode(arr, enc) {\n if (enc === 'hex')\n return toHex(arr);\n else\n return arr;\n};\n","'use strict';\n\nvar utils = exports;\nvar BN = require('bn.js');\nvar minAssert = require('minimalistic-assert');\nvar minUtils = require('minimalistic-crypto-utils');\n\nutils.assert = minAssert;\nutils.toArray = minUtils.toArray;\nutils.zero2 = minUtils.zero2;\nutils.toHex = minUtils.toHex;\nutils.encode = minUtils.encode;\n\n// Represent num in a w-NAF form\nfunction getNAF(num, w, bits) {\n var naf = new Array(Math.max(num.bitLength(), bits) + 1);\n var i;\n for (i = 0; i < naf.length; i += 1) {\n naf[i] = 0;\n }\n\n var ws = 1 << (w + 1);\n var k = num.clone();\n\n for (i = 0; i < naf.length; i++) {\n var z;\n var mod = k.andln(ws - 1);\n if (k.isOdd()) {\n if (mod > (ws >> 1) - 1)\n z = (ws >> 1) - mod;\n else\n z = mod;\n k.isubn(z);\n } else {\n z = 0;\n }\n\n naf[i] = z;\n k.iushrn(1);\n }\n\n return naf;\n}\nutils.getNAF = getNAF;\n\n// Represent k1, k2 in a Joint Sparse Form\nfunction getJSF(k1, k2) {\n var jsf = [\n [],\n [],\n ];\n\n k1 = k1.clone();\n k2 = k2.clone();\n var d1 = 0;\n var d2 = 0;\n var m8;\n while (k1.cmpn(-d1) > 0 || k2.cmpn(-d2) > 0) {\n // First phase\n var m14 = (k1.andln(3) + d1) & 3;\n var m24 = (k2.andln(3) + d2) & 3;\n if (m14 === 3)\n m14 = -1;\n if (m24 === 3)\n m24 = -1;\n var u1;\n if ((m14 & 1) === 0) {\n u1 = 0;\n } else {\n m8 = (k1.andln(7) + d1) & 7;\n if ((m8 === 3 || m8 === 5) && m24 === 2)\n u1 = -m14;\n else\n u1 = m14;\n }\n jsf[0].push(u1);\n\n var u2;\n if ((m24 & 1) === 0) {\n u2 = 0;\n } else {\n m8 = (k2.andln(7) + d2) & 7;\n if ((m8 === 3 || m8 === 5) && m14 === 2)\n u2 = -m24;\n else\n u2 = m24;\n }\n jsf[1].push(u2);\n\n // Second phase\n if (2 * d1 === u1 + 1)\n d1 = 1 - d1;\n if (2 * d2 === u2 + 1)\n d2 = 1 - d2;\n k1.iushrn(1);\n k2.iushrn(1);\n }\n\n return jsf;\n}\nutils.getJSF = getJSF;\n\nfunction cachedProperty(obj, name, computer) {\n var key = '_' + name;\n obj.prototype[name] = function cachedProperty() {\n return this[key] !== undefined ? this[key] :\n this[key] = computer.call(this);\n };\n}\nutils.cachedProperty = cachedProperty;\n\nfunction parseBytes(bytes) {\n return typeof bytes === 'string' ? utils.toArray(bytes, 'hex') :\n bytes;\n}\nutils.parseBytes = parseBytes;\n\nfunction intFromLE(bytes) {\n return new BN(bytes, 'hex', 'le');\n}\nutils.intFromLE = intFromLE;\n\n","var r;\n\nmodule.exports = function rand(len) {\n if (!r)\n r = new Rand(null);\n\n return r.generate(len);\n};\n\nfunction Rand(rand) {\n this.rand = rand;\n}\nmodule.exports.Rand = Rand;\n\nRand.prototype.generate = function generate(len) {\n return this._rand(len);\n};\n\n// Emulate crypto API using randy\nRand.prototype._rand = function _rand(n) {\n if (this.rand.getBytes)\n return this.rand.getBytes(n);\n\n var res = new Uint8Array(n);\n for (var i = 0; i < res.length; i++)\n res[i] = this.rand.getByte();\n return res;\n};\n\nif (typeof self === 'object') {\n if (self.crypto && self.crypto.getRandomValues) {\n // Modern browsers\n Rand.prototype._rand = function _rand(n) {\n var arr = new Uint8Array(n);\n self.crypto.getRandomValues(arr);\n return arr;\n };\n } else if (self.msCrypto && self.msCrypto.getRandomValues) {\n // IE\n Rand.prototype._rand = function _rand(n) {\n var arr = new Uint8Array(n);\n self.msCrypto.getRandomValues(arr);\n return arr;\n };\n\n // Safari's WebWorkers do not have `crypto`\n } else if (typeof window === 'object') {\n // Old junk\n Rand.prototype._rand = function() {\n throw new Error('Not implemented yet');\n };\n }\n} else {\n // Node.js or Web worker with no crypto support\n try {\n var crypto = require('crypto');\n if (typeof crypto.randomBytes !== 'function')\n throw new Error('Not supported');\n\n Rand.prototype._rand = function _rand(n) {\n return crypto.randomBytes(n);\n };\n } catch (e) {\n }\n}\n","'use strict';\n\nvar BN = require('bn.js');\nvar utils = require('../utils');\nvar getNAF = utils.getNAF;\nvar getJSF = utils.getJSF;\nvar assert = utils.assert;\n\nfunction BaseCurve(type, conf) {\n this.type = type;\n this.p = new BN(conf.p, 16);\n\n // Use Montgomery, when there is no fast reduction for the prime\n this.red = conf.prime ? BN.red(conf.prime) : BN.mont(this.p);\n\n // Useful for many curves\n this.zero = new BN(0).toRed(this.red);\n this.one = new BN(1).toRed(this.red);\n this.two = new BN(2).toRed(this.red);\n\n // Curve configuration, optional\n this.n = conf.n && new BN(conf.n, 16);\n this.g = conf.g && this.pointFromJSON(conf.g, conf.gRed);\n\n // Temporary arrays\n this._wnafT1 = new Array(4);\n this._wnafT2 = new Array(4);\n this._wnafT3 = new Array(4);\n this._wnafT4 = new Array(4);\n\n this._bitLength = this.n ? this.n.bitLength() : 0;\n\n // Generalized Greg Maxwell's trick\n var adjustCount = this.n && this.p.div(this.n);\n if (!adjustCount || adjustCount.cmpn(100) > 0) {\n this.redN = null;\n } else {\n this._maxwellTrick = true;\n this.redN = this.n.toRed(this.red);\n }\n}\nmodule.exports = BaseCurve;\n\nBaseCurve.prototype.point = function point() {\n throw new Error('Not implemented');\n};\n\nBaseCurve.prototype.validate = function validate() {\n throw new Error('Not implemented');\n};\n\nBaseCurve.prototype._fixedNafMul = function _fixedNafMul(p, k) {\n assert(p.precomputed);\n var doubles = p._getDoubles();\n\n var naf = getNAF(k, 1, this._bitLength);\n var I = (1 << (doubles.step + 1)) - (doubles.step % 2 === 0 ? 2 : 1);\n I /= 3;\n\n // Translate into more windowed form\n var repr = [];\n var j;\n var nafW;\n for (j = 0; j < naf.length; j += doubles.step) {\n nafW = 0;\n for (var l = j + doubles.step - 1; l >= j; l--)\n nafW = (nafW << 1) + naf[l];\n repr.push(nafW);\n }\n\n var a = this.jpoint(null, null, null);\n var b = this.jpoint(null, null, null);\n for (var i = I; i > 0; i--) {\n for (j = 0; j < repr.length; j++) {\n nafW = repr[j];\n if (nafW === i)\n b = b.mixedAdd(doubles.points[j]);\n else if (nafW === -i)\n b = b.mixedAdd(doubles.points[j].neg());\n }\n a = a.add(b);\n }\n return a.toP();\n};\n\nBaseCurve.prototype._wnafMul = function _wnafMul(p, k) {\n var w = 4;\n\n // Precompute window\n var nafPoints = p._getNAFPoints(w);\n w = nafPoints.wnd;\n var wnd = nafPoints.points;\n\n // Get NAF form\n var naf = getNAF(k, w, this._bitLength);\n\n // Add `this`*(N+1) for every w-NAF index\n var acc = this.jpoint(null, null, null);\n for (var i = naf.length - 1; i >= 0; i--) {\n // Count zeroes\n for (var l = 0; i >= 0 && naf[i] === 0; i--)\n l++;\n if (i >= 0)\n l++;\n acc = acc.dblp(l);\n\n if (i < 0)\n break;\n var z = naf[i];\n assert(z !== 0);\n if (p.type === 'affine') {\n // J +- P\n if (z > 0)\n acc = acc.mixedAdd(wnd[(z - 1) >> 1]);\n else\n acc = acc.mixedAdd(wnd[(-z - 1) >> 1].neg());\n } else {\n // J +- J\n if (z > 0)\n acc = acc.add(wnd[(z - 1) >> 1]);\n else\n acc = acc.add(wnd[(-z - 1) >> 1].neg());\n }\n }\n return p.type === 'affine' ? acc.toP() : acc;\n};\n\nBaseCurve.prototype._wnafMulAdd = function _wnafMulAdd(defW,\n points,\n coeffs,\n len,\n jacobianResult) {\n var wndWidth = this._wnafT1;\n var wnd = this._wnafT2;\n var naf = this._wnafT3;\n\n // Fill all arrays\n var max = 0;\n var i;\n var j;\n var p;\n for (i = 0; i < len; i++) {\n p = points[i];\n var nafPoints = p._getNAFPoints(defW);\n wndWidth[i] = nafPoints.wnd;\n wnd[i] = nafPoints.points;\n }\n\n // Comb small window NAFs\n for (i = len - 1; i >= 1; i -= 2) {\n var a = i - 1;\n var b = i;\n if (wndWidth[a] !== 1 || wndWidth[b] !== 1) {\n naf[a] = getNAF(coeffs[a], wndWidth[a], this._bitLength);\n naf[b] = getNAF(coeffs[b], wndWidth[b], this._bitLength);\n max = Math.max(naf[a].length, max);\n max = Math.max(naf[b].length, max);\n continue;\n }\n\n var comb = [\n points[a], /* 1 */\n null, /* 3 */\n null, /* 5 */\n points[b], /* 7 */\n ];\n\n // Try to avoid Projective points, if possible\n if (points[a].y.cmp(points[b].y) === 0) {\n comb[1] = points[a].add(points[b]);\n comb[2] = points[a].toJ().mixedAdd(points[b].neg());\n } else if (points[a].y.cmp(points[b].y.redNeg()) === 0) {\n comb[1] = points[a].toJ().mixedAdd(points[b]);\n comb[2] = points[a].add(points[b].neg());\n } else {\n comb[1] = points[a].toJ().mixedAdd(points[b]);\n comb[2] = points[a].toJ().mixedAdd(points[b].neg());\n }\n\n var index = [\n -3, /* -1 -1 */\n -1, /* -1 0 */\n -5, /* -1 1 */\n -7, /* 0 -1 */\n 0, /* 0 0 */\n 7, /* 0 1 */\n 5, /* 1 -1 */\n 1, /* 1 0 */\n 3, /* 1 1 */\n ];\n\n var jsf = getJSF(coeffs[a], coeffs[b]);\n max = Math.max(jsf[0].length, max);\n naf[a] = new Array(max);\n naf[b] = new Array(max);\n for (j = 0; j < max; j++) {\n var ja = jsf[0][j] | 0;\n var jb = jsf[1][j] | 0;\n\n naf[a][j] = index[(ja + 1) * 3 + (jb + 1)];\n naf[b][j] = 0;\n wnd[a] = comb;\n }\n }\n\n var acc = this.jpoint(null, null, null);\n var tmp = this._wnafT4;\n for (i = max; i >= 0; i--) {\n var k = 0;\n\n while (i >= 0) {\n var zero = true;\n for (j = 0; j < len; j++) {\n tmp[j] = naf[j][i] | 0;\n if (tmp[j] !== 0)\n zero = false;\n }\n if (!zero)\n break;\n k++;\n i--;\n }\n if (i >= 0)\n k++;\n acc = acc.dblp(k);\n if (i < 0)\n break;\n\n for (j = 0; j < len; j++) {\n var z = tmp[j];\n p;\n if (z === 0)\n continue;\n else if (z > 0)\n p = wnd[j][(z - 1) >> 1];\n else if (z < 0)\n p = wnd[j][(-z - 1) >> 1].neg();\n\n if (p.type === 'affine')\n acc = acc.mixedAdd(p);\n else\n acc = acc.add(p);\n }\n }\n // Zeroify references\n for (i = 0; i < len; i++)\n wnd[i] = null;\n\n if (jacobianResult)\n return acc;\n else\n return acc.toP();\n};\n\nfunction BasePoint(curve, type) {\n this.curve = curve;\n this.type = type;\n this.precomputed = null;\n}\nBaseCurve.BasePoint = BasePoint;\n\nBasePoint.prototype.eq = function eq(/*other*/) {\n throw new Error('Not implemented');\n};\n\nBasePoint.prototype.validate = function validate() {\n return this.curve.validate(this);\n};\n\nBaseCurve.prototype.decodePoint = function decodePoint(bytes, enc) {\n bytes = utils.toArray(bytes, enc);\n\n var len = this.p.byteLength();\n\n // uncompressed, hybrid-odd, hybrid-even\n if ((bytes[0] === 0x04 || bytes[0] === 0x06 || bytes[0] === 0x07) &&\n bytes.length - 1 === 2 * len) {\n if (bytes[0] === 0x06)\n assert(bytes[bytes.length - 1] % 2 === 0);\n else if (bytes[0] === 0x07)\n assert(bytes[bytes.length - 1] % 2 === 1);\n\n var res = this.point(bytes.slice(1, 1 + len),\n bytes.slice(1 + len, 1 + 2 * len));\n\n return res;\n } else if ((bytes[0] === 0x02 || bytes[0] === 0x03) &&\n bytes.length - 1 === len) {\n return this.pointFromX(bytes.slice(1, 1 + len), bytes[0] === 0x03);\n }\n throw new Error('Unknown point format');\n};\n\nBasePoint.prototype.encodeCompressed = function encodeCompressed(enc) {\n return this.encode(enc, true);\n};\n\nBasePoint.prototype._encode = function _encode(compact) {\n var len = this.curve.p.byteLength();\n var x = this.getX().toArray('be', len);\n\n if (compact)\n return [ this.getY().isEven() ? 0x02 : 0x03 ].concat(x);\n\n return [ 0x04 ].concat(x, this.getY().toArray('be', len));\n};\n\nBasePoint.prototype.encode = function encode(enc, compact) {\n return utils.encode(this._encode(compact), enc);\n};\n\nBasePoint.prototype.precompute = function precompute(power) {\n if (this.precomputed)\n return this;\n\n var precomputed = {\n doubles: null,\n naf: null,\n beta: null,\n };\n precomputed.naf = this._getNAFPoints(8);\n precomputed.doubles = this._getDoubles(4, power);\n precomputed.beta = this._getBeta();\n this.precomputed = precomputed;\n\n return this;\n};\n\nBasePoint.prototype._hasDoubles = function _hasDoubles(k) {\n if (!this.precomputed)\n return false;\n\n var doubles = this.precomputed.doubles;\n if (!doubles)\n return false;\n\n return doubles.points.length >= Math.ceil((k.bitLength() + 1) / doubles.step);\n};\n\nBasePoint.prototype._getDoubles = function _getDoubles(step, power) {\n if (this.precomputed && this.precomputed.doubles)\n return this.precomputed.doubles;\n\n var doubles = [ this ];\n var acc = this;\n for (var i = 0; i < power; i += step) {\n for (var j = 0; j < step; j++)\n acc = acc.dbl();\n doubles.push(acc);\n }\n return {\n step: step,\n points: doubles,\n };\n};\n\nBasePoint.prototype._getNAFPoints = function _getNAFPoints(wnd) {\n if (this.precomputed && this.precomputed.naf)\n return this.precomputed.naf;\n\n var res = [ this ];\n var max = (1 << wnd) - 1;\n var dbl = max === 1 ? null : this.dbl();\n for (var i = 1; i < max; i++)\n res[i] = res[i - 1].add(dbl);\n return {\n wnd: wnd,\n points: res,\n };\n};\n\nBasePoint.prototype._getBeta = function _getBeta() {\n return null;\n};\n\nBasePoint.prototype.dblp = function dblp(k) {\n var r = this;\n for (var i = 0; i < k; i++)\n r = r.dbl();\n return r;\n};\n","if (typeof Object.create === 'function') {\n // implementation from standard node.js 'util' module\n module.exports = function inherits(ctor, superCtor) {\n if (superCtor) {\n ctor.super_ = superCtor\n ctor.prototype = Object.create(superCtor.prototype, {\n constructor: {\n value: ctor,\n enumerable: false,\n writable: true,\n configurable: true\n }\n })\n }\n };\n} else {\n // old school shim for old browsers\n module.exports = function inherits(ctor, superCtor) {\n if (superCtor) {\n ctor.super_ = superCtor\n var TempCtor = function () {}\n TempCtor.prototype = superCtor.prototype\n ctor.prototype = new TempCtor()\n ctor.prototype.constructor = ctor\n }\n }\n}\n","'use strict';\n\nvar utils = require('../utils');\nvar BN = require('bn.js');\nvar inherits = require('inherits');\nvar Base = require('./base');\n\nvar assert = utils.assert;\n\nfunction ShortCurve(conf) {\n Base.call(this, 'short', conf);\n\n this.a = new BN(conf.a, 16).toRed(this.red);\n this.b = new BN(conf.b, 16).toRed(this.red);\n this.tinv = this.two.redInvm();\n\n this.zeroA = this.a.fromRed().cmpn(0) === 0;\n this.threeA = this.a.fromRed().sub(this.p).cmpn(-3) === 0;\n\n // If the curve is endomorphic, precalculate beta and lambda\n this.endo = this._getEndomorphism(conf);\n this._endoWnafT1 = new Array(4);\n this._endoWnafT2 = new Array(4);\n}\ninherits(ShortCurve, Base);\nmodule.exports = ShortCurve;\n\nShortCurve.prototype._getEndomorphism = function _getEndomorphism(conf) {\n // No efficient endomorphism\n if (!this.zeroA || !this.g || !this.n || this.p.modn(3) !== 1)\n return;\n\n // Compute beta and lambda, that lambda * P = (beta * Px; Py)\n var beta;\n var lambda;\n if (conf.beta) {\n beta = new BN(conf.beta, 16).toRed(this.red);\n } else {\n var betas = this._getEndoRoots(this.p);\n // Choose the smallest beta\n beta = betas[0].cmp(betas[1]) < 0 ? betas[0] : betas[1];\n beta = beta.toRed(this.red);\n }\n if (conf.lambda) {\n lambda = new BN(conf.lambda, 16);\n } else {\n // Choose the lambda that is matching selected beta\n var lambdas = this._getEndoRoots(this.n);\n if (this.g.mul(lambdas[0]).x.cmp(this.g.x.redMul(beta)) === 0) {\n lambda = lambdas[0];\n } else {\n lambda = lambdas[1];\n assert(this.g.mul(lambda).x.cmp(this.g.x.redMul(beta)) === 0);\n }\n }\n\n // Get basis vectors, used for balanced length-two representation\n var basis;\n if (conf.basis) {\n basis = conf.basis.map(function(vec) {\n return {\n a: new BN(vec.a, 16),\n b: new BN(vec.b, 16),\n };\n });\n } else {\n basis = this._getEndoBasis(lambda);\n }\n\n return {\n beta: beta,\n lambda: lambda,\n basis: basis,\n };\n};\n\nShortCurve.prototype._getEndoRoots = function _getEndoRoots(num) {\n // Find roots of for x^2 + x + 1 in F\n // Root = (-1 +- Sqrt(-3)) / 2\n //\n var red = num === this.p ? this.red : BN.mont(num);\n var tinv = new BN(2).toRed(red).redInvm();\n var ntinv = tinv.redNeg();\n\n var s = new BN(3).toRed(red).redNeg().redSqrt().redMul(tinv);\n\n var l1 = ntinv.redAdd(s).fromRed();\n var l2 = ntinv.redSub(s).fromRed();\n return [ l1, l2 ];\n};\n\nShortCurve.prototype._getEndoBasis = function _getEndoBasis(lambda) {\n // aprxSqrt >= sqrt(this.n)\n var aprxSqrt = this.n.ushrn(Math.floor(this.n.bitLength() / 2));\n\n // 3.74\n // Run EGCD, until r(L + 1) < aprxSqrt\n var u = lambda;\n var v = this.n.clone();\n var x1 = new BN(1);\n var y1 = new BN(0);\n var x2 = new BN(0);\n var y2 = new BN(1);\n\n // NOTE: all vectors are roots of: a + b * lambda = 0 (mod n)\n var a0;\n var b0;\n // First vector\n var a1;\n var b1;\n // Second vector\n var a2;\n var b2;\n\n var prevR;\n var i = 0;\n var r;\n var x;\n while (u.cmpn(0) !== 0) {\n var q = v.div(u);\n r = v.sub(q.mul(u));\n x = x2.sub(q.mul(x1));\n var y = y2.sub(q.mul(y1));\n\n if (!a1 && r.cmp(aprxSqrt) < 0) {\n a0 = prevR.neg();\n b0 = x1;\n a1 = r.neg();\n b1 = x;\n } else if (a1 && ++i === 2) {\n break;\n }\n prevR = r;\n\n v = u;\n u = r;\n x2 = x1;\n x1 = x;\n y2 = y1;\n y1 = y;\n }\n a2 = r.neg();\n b2 = x;\n\n var len1 = a1.sqr().add(b1.sqr());\n var len2 = a2.sqr().add(b2.sqr());\n if (len2.cmp(len1) >= 0) {\n a2 = a0;\n b2 = b0;\n }\n\n // Normalize signs\n if (a1.negative) {\n a1 = a1.neg();\n b1 = b1.neg();\n }\n if (a2.negative) {\n a2 = a2.neg();\n b2 = b2.neg();\n }\n\n return [\n { a: a1, b: b1 },\n { a: a2, b: b2 },\n ];\n};\n\nShortCurve.prototype._endoSplit = function _endoSplit(k) {\n var basis = this.endo.basis;\n var v1 = basis[0];\n var v2 = basis[1];\n\n var c1 = v2.b.mul(k).divRound(this.n);\n var c2 = v1.b.neg().mul(k).divRound(this.n);\n\n var p1 = c1.mul(v1.a);\n var p2 = c2.mul(v2.a);\n var q1 = c1.mul(v1.b);\n var q2 = c2.mul(v2.b);\n\n // Calculate answer\n var k1 = k.sub(p1).sub(p2);\n var k2 = q1.add(q2).neg();\n return { k1: k1, k2: k2 };\n};\n\nShortCurve.prototype.pointFromX = function pointFromX(x, odd) {\n x = new BN(x, 16);\n if (!x.red)\n x = x.toRed(this.red);\n\n var y2 = x.redSqr().redMul(x).redIAdd(x.redMul(this.a)).redIAdd(this.b);\n var y = y2.redSqrt();\n if (y.redSqr().redSub(y2).cmp(this.zero) !== 0)\n throw new Error('invalid point');\n\n // XXX Is there any way to tell if the number is odd without converting it\n // to non-red form?\n var isOdd = y.fromRed().isOdd();\n if (odd && !isOdd || !odd && isOdd)\n y = y.redNeg();\n\n return this.point(x, y);\n};\n\nShortCurve.prototype.validate = function validate(point) {\n if (point.inf)\n return true;\n\n var x = point.x;\n var y = point.y;\n\n var ax = this.a.redMul(x);\n var rhs = x.redSqr().redMul(x).redIAdd(ax).redIAdd(this.b);\n return y.redSqr().redISub(rhs).cmpn(0) === 0;\n};\n\nShortCurve.prototype._endoWnafMulAdd =\n function _endoWnafMulAdd(points, coeffs, jacobianResult) {\n var npoints = this._endoWnafT1;\n var ncoeffs = this._endoWnafT2;\n for (var i = 0; i < points.length; i++) {\n var split = this._endoSplit(coeffs[i]);\n var p = points[i];\n var beta = p._getBeta();\n\n if (split.k1.negative) {\n split.k1.ineg();\n p = p.neg(true);\n }\n if (split.k2.negative) {\n split.k2.ineg();\n beta = beta.neg(true);\n }\n\n npoints[i * 2] = p;\n npoints[i * 2 + 1] = beta;\n ncoeffs[i * 2] = split.k1;\n ncoeffs[i * 2 + 1] = split.k2;\n }\n var res = this._wnafMulAdd(1, npoints, ncoeffs, i * 2, jacobianResult);\n\n // Clean-up references to points and coefficients\n for (var j = 0; j < i * 2; j++) {\n npoints[j] = null;\n ncoeffs[j] = null;\n }\n return res;\n };\n\nfunction Point(curve, x, y, isRed) {\n Base.BasePoint.call(this, curve, 'affine');\n if (x === null && y === null) {\n this.x = null;\n this.y = null;\n this.inf = true;\n } else {\n this.x = new BN(x, 16);\n this.y = new BN(y, 16);\n // Force redgomery representation when loading from JSON\n if (isRed) {\n this.x.forceRed(this.curve.red);\n this.y.forceRed(this.curve.red);\n }\n if (!this.x.red)\n this.x = this.x.toRed(this.curve.red);\n if (!this.y.red)\n this.y = this.y.toRed(this.curve.red);\n this.inf = false;\n }\n}\ninherits(Point, Base.BasePoint);\n\nShortCurve.prototype.point = function point(x, y, isRed) {\n return new Point(this, x, y, isRed);\n};\n\nShortCurve.prototype.pointFromJSON = function pointFromJSON(obj, red) {\n return Point.fromJSON(this, obj, red);\n};\n\nPoint.prototype._getBeta = function _getBeta() {\n if (!this.curve.endo)\n return;\n\n var pre = this.precomputed;\n if (pre && pre.beta)\n return pre.beta;\n\n var beta = this.curve.point(this.x.redMul(this.curve.endo.beta), this.y);\n if (pre) {\n var curve = this.curve;\n var endoMul = function(p) {\n return curve.point(p.x.redMul(curve.endo.beta), p.y);\n };\n pre.beta = beta;\n beta.precomputed = {\n beta: null,\n naf: pre.naf && {\n wnd: pre.naf.wnd,\n points: pre.naf.points.map(endoMul),\n },\n doubles: pre.doubles && {\n step: pre.doubles.step,\n points: pre.doubles.points.map(endoMul),\n },\n };\n }\n return beta;\n};\n\nPoint.prototype.toJSON = function toJSON() {\n if (!this.precomputed)\n return [ this.x, this.y ];\n\n return [ this.x, this.y, this.precomputed && {\n doubles: this.precomputed.doubles && {\n step: this.precomputed.doubles.step,\n points: this.precomputed.doubles.points.slice(1),\n },\n naf: this.precomputed.naf && {\n wnd: this.precomputed.naf.wnd,\n points: this.precomputed.naf.points.slice(1),\n },\n } ];\n};\n\nPoint.fromJSON = function fromJSON(curve, obj, red) {\n if (typeof obj === 'string')\n obj = JSON.parse(obj);\n var res = curve.point(obj[0], obj[1], red);\n if (!obj[2])\n return res;\n\n function obj2point(obj) {\n return curve.point(obj[0], obj[1], red);\n }\n\n var pre = obj[2];\n res.precomputed = {\n beta: null,\n doubles: pre.doubles && {\n step: pre.doubles.step,\n points: [ res ].concat(pre.doubles.points.map(obj2point)),\n },\n naf: pre.naf && {\n wnd: pre.naf.wnd,\n points: [ res ].concat(pre.naf.points.map(obj2point)),\n },\n };\n return res;\n};\n\nPoint.prototype.inspect = function inspect() {\n if (this.isInfinity())\n return '<EC Point Infinity>';\n return '<EC Point x: ' + this.x.fromRed().toString(16, 2) +\n ' y: ' + this.y.fromRed().toString(16, 2) + '>';\n};\n\nPoint.prototype.isInfinity = function isInfinity() {\n return this.inf;\n};\n\nPoint.prototype.add = function add(p) {\n // O + P = P\n if (this.inf)\n return p;\n\n // P + O = P\n if (p.inf)\n return this;\n\n // P + P = 2P\n if (this.eq(p))\n return this.dbl();\n\n // P + (-P) = O\n if (this.neg().eq(p))\n return this.curve.point(null, null);\n\n // P + Q = O\n if (this.x.cmp(p.x) === 0)\n return this.curve.point(null, null);\n\n var c = this.y.redSub(p.y);\n if (c.cmpn(0) !== 0)\n c = c.redMul(this.x.redSub(p.x).redInvm());\n var nx = c.redSqr().redISub(this.x).redISub(p.x);\n var ny = c.redMul(this.x.redSub(nx)).redISub(this.y);\n return this.curve.point(nx, ny);\n};\n\nPoint.prototype.dbl = function dbl() {\n if (this.inf)\n return this;\n\n // 2P = O\n var ys1 = this.y.redAdd(this.y);\n if (ys1.cmpn(0) === 0)\n return this.curve.point(null, null);\n\n var a = this.curve.a;\n\n var x2 = this.x.redSqr();\n var dyinv = ys1.redInvm();\n var c = x2.redAdd(x2).redIAdd(x2).redIAdd(a).redMul(dyinv);\n\n var nx = c.redSqr().redISub(this.x.redAdd(this.x));\n var ny = c.redMul(this.x.redSub(nx)).redISub(this.y);\n return this.curve.point(nx, ny);\n};\n\nPoint.prototype.getX = function getX() {\n return this.x.fromRed();\n};\n\nPoint.prototype.getY = function getY() {\n return this.y.fromRed();\n};\n\nPoint.prototype.mul = function mul(k) {\n k = new BN(k, 16);\n if (this.isInfinity())\n return this;\n else if (this._hasDoubles(k))\n return this.curve._fixedNafMul(this, k);\n else if (this.curve.endo)\n return this.curve._endoWnafMulAdd([ this ], [ k ]);\n else\n return this.curve._wnafMul(this, k);\n};\n\nPoint.prototype.mulAdd = function mulAdd(k1, p2, k2) {\n var points = [ this, p2 ];\n var coeffs = [ k1, k2 ];\n if (this.curve.endo)\n return this.curve._endoWnafMulAdd(points, coeffs);\n else\n return this.curve._wnafMulAdd(1, points, coeffs, 2);\n};\n\nPoint.prototype.jmulAdd = function jmulAdd(k1, p2, k2) {\n var points = [ this, p2 ];\n var coeffs = [ k1, k2 ];\n if (this.curve.endo)\n return this.curve._endoWnafMulAdd(points, coeffs, true);\n else\n return this.curve._wnafMulAdd(1, points, coeffs, 2, true);\n};\n\nPoint.prototype.eq = function eq(p) {\n return this === p ||\n this.inf === p.inf &&\n (this.inf || this.x.cmp(p.x) === 0 && this.y.cmp(p.y) === 0);\n};\n\nPoint.prototype.neg = function neg(_precompute) {\n if (this.inf)\n return this;\n\n var res = this.curve.point(this.x, this.y.redNeg());\n if (_precompute && this.precomputed) {\n var pre = this.precomputed;\n var negate = function(p) {\n return p.neg();\n };\n res.precomputed = {\n naf: pre.naf && {\n wnd: pre.naf.wnd,\n points: pre.naf.points.map(negate),\n },\n doubles: pre.doubles && {\n step: pre.doubles.step,\n points: pre.doubles.points.map(negate),\n },\n };\n }\n return res;\n};\n\nPoint.prototype.toJ = function toJ() {\n if (this.inf)\n return this.curve.jpoint(null, null, null);\n\n var res = this.curve.jpoint(this.x, this.y, this.curve.one);\n return res;\n};\n\nfunction JPoint(curve, x, y, z) {\n Base.BasePoint.call(this, curve, 'jacobian');\n if (x === null && y === null && z === null) {\n this.x = this.curve.one;\n this.y = this.curve.one;\n this.z = new BN(0);\n } else {\n this.x = new BN(x, 16);\n this.y = new BN(y, 16);\n this.z = new BN(z, 16);\n }\n if (!this.x.red)\n this.x = this.x.toRed(this.curve.red);\n if (!this.y.red)\n this.y = this.y.toRed(this.curve.red);\n if (!this.z.red)\n this.z = this.z.toRed(this.curve.red);\n\n this.zOne = this.z === this.curve.one;\n}\ninherits(JPoint, Base.BasePoint);\n\nShortCurve.prototype.jpoint = function jpoint(x, y, z) {\n return new JPoint(this, x, y, z);\n};\n\nJPoint.prototype.toP = function toP() {\n if (this.isInfinity())\n return this.curve.point(null, null);\n\n var zinv = this.z.redInvm();\n var zinv2 = zinv.redSqr();\n var ax = this.x.redMul(zinv2);\n var ay = this.y.redMul(zinv2).redMul(zinv);\n\n return this.curve.point(ax, ay);\n};\n\nJPoint.prototype.neg = function neg() {\n return this.curve.jpoint(this.x, this.y.redNeg(), this.z);\n};\n\nJPoint.prototype.add = function add(p) {\n // O + P = P\n if (this.isInfinity())\n return p;\n\n // P + O = P\n if (p.isInfinity())\n return this;\n\n // 12M + 4S + 7A\n var pz2 = p.z.redSqr();\n var z2 = this.z.redSqr();\n var u1 = this.x.redMul(pz2);\n var u2 = p.x.redMul(z2);\n var s1 = this.y.redMul(pz2.redMul(p.z));\n var s2 = p.y.redMul(z2.redMul(this.z));\n\n var h = u1.redSub(u2);\n var r = s1.redSub(s2);\n if (h.cmpn(0) === 0) {\n if (r.cmpn(0) !== 0)\n return this.curve.jpoint(null, null, null);\n else\n return this.dbl();\n }\n\n var h2 = h.redSqr();\n var h3 = h2.redMul(h);\n var v = u1.redMul(h2);\n\n var nx = r.redSqr().redIAdd(h3).redISub(v).redISub(v);\n var ny = r.redMul(v.redISub(nx)).redISub(s1.redMul(h3));\n var nz = this.z.redMul(p.z).redMul(h);\n\n return this.curve.jpoint(nx, ny, nz);\n};\n\nJPoint.prototype.mixedAdd = function mixedAdd(p) {\n // O + P = P\n if (this.isInfinity())\n return p.toJ();\n\n // P + O = P\n if (p.isInfinity())\n return this;\n\n // 8M + 3S + 7A\n var z2 = this.z.redSqr();\n var u1 = this.x;\n var u2 = p.x.redMul(z2);\n var s1 = this.y;\n var s2 = p.y.redMul(z2).redMul(this.z);\n\n var h = u1.redSub(u2);\n var r = s1.redSub(s2);\n if (h.cmpn(0) === 0) {\n if (r.cmpn(0) !== 0)\n return this.curve.jpoint(null, null, null);\n else\n return this.dbl();\n }\n\n var h2 = h.redSqr();\n var h3 = h2.redMul(h);\n var v = u1.redMul(h2);\n\n var nx = r.redSqr().redIAdd(h3).redISub(v).redISub(v);\n var ny = r.redMul(v.redISub(nx)).redISub(s1.redMul(h3));\n var nz = this.z.redMul(h);\n\n return this.curve.jpoint(nx, ny, nz);\n};\n\nJPoint.prototype.dblp = function dblp(pow) {\n if (pow === 0)\n return this;\n if (this.isInfinity())\n return this;\n if (!pow)\n return this.dbl();\n\n var i;\n if (this.curve.zeroA || this.curve.threeA) {\n var r = this;\n for (i = 0; i < pow; i++)\n r = r.dbl();\n return r;\n }\n\n // 1M + 2S + 1A + N * (4S + 5M + 8A)\n // N = 1 => 6M + 6S + 9A\n var a = this.curve.a;\n var tinv = this.curve.tinv;\n\n var jx = this.x;\n var jy = this.y;\n var jz = this.z;\n var jz4 = jz.redSqr().redSqr();\n\n // Reuse results\n var jyd = jy.redAdd(jy);\n for (i = 0; i < pow; i++) {\n var jx2 = jx.redSqr();\n var jyd2 = jyd.redSqr();\n var jyd4 = jyd2.redSqr();\n var c = jx2.redAdd(jx2).redIAdd(jx2).redIAdd(a.redMul(jz4));\n\n var t1 = jx.redMul(jyd2);\n var nx = c.redSqr().redISub(t1.redAdd(t1));\n var t2 = t1.redISub(nx);\n var dny = c.redMul(t2);\n dny = dny.redIAdd(dny).redISub(jyd4);\n var nz = jyd.redMul(jz);\n if (i + 1 < pow)\n jz4 = jz4.redMul(jyd4);\n\n jx = nx;\n jz = nz;\n jyd = dny;\n }\n\n return this.curve.jpoint(jx, jyd.redMul(tinv), jz);\n};\n\nJPoint.prototype.dbl = function dbl() {\n if (this.isInfinity())\n return this;\n\n if (this.curve.zeroA)\n return this._zeroDbl();\n else if (this.curve.threeA)\n return this._threeDbl();\n else\n return this._dbl();\n};\n\nJPoint.prototype._zeroDbl = function _zeroDbl() {\n var nx;\n var ny;\n var nz;\n // Z = 1\n if (this.zOne) {\n // hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-0.html\n // #doubling-mdbl-2007-bl\n // 1M + 5S + 14A\n\n // XX = X1^2\n var xx = this.x.redSqr();\n // YY = Y1^2\n var yy = this.y.redSqr();\n // YYYY = YY^2\n var yyyy = yy.redSqr();\n // S = 2 * ((X1 + YY)^2 - XX - YYYY)\n var s = this.x.redAdd(yy).redSqr().redISub(xx).redISub(yyyy);\n s = s.redIAdd(s);\n // M = 3 * XX + a; a = 0\n var m = xx.redAdd(xx).redIAdd(xx);\n // T = M ^ 2 - 2*S\n var t = m.redSqr().redISub(s).redISub(s);\n\n // 8 * YYYY\n var yyyy8 = yyyy.redIAdd(yyyy);\n yyyy8 = yyyy8.redIAdd(yyyy8);\n yyyy8 = yyyy8.redIAdd(yyyy8);\n\n // X3 = T\n nx = t;\n // Y3 = M * (S - T) - 8 * YYYY\n ny = m.redMul(s.redISub(t)).redISub(yyyy8);\n // Z3 = 2*Y1\n nz = this.y.redAdd(this.y);\n } else {\n // hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-0.html\n // #doubling-dbl-2009-l\n // 2M + 5S + 13A\n\n // A = X1^2\n var a = this.x.redSqr();\n // B = Y1^2\n var b = this.y.redSqr();\n // C = B^2\n var c = b.redSqr();\n // D = 2 * ((X1 + B)^2 - A - C)\n var d = this.x.redAdd(b).redSqr().redISub(a).redISub(c);\n d = d.redIAdd(d);\n // E = 3 * A\n var e = a.redAdd(a).redIAdd(a);\n // F = E^2\n var f = e.redSqr();\n\n // 8 * C\n var c8 = c.redIAdd(c);\n c8 = c8.redIAdd(c8);\n c8 = c8.redIAdd(c8);\n\n // X3 = F - 2 * D\n nx = f.redISub(d).redISub(d);\n // Y3 = E * (D - X3) - 8 * C\n ny = e.redMul(d.redISub(nx)).redISub(c8);\n // Z3 = 2 * Y1 * Z1\n nz = this.y.redMul(this.z);\n nz = nz.redIAdd(nz);\n }\n\n return this.curve.jpoint(nx, ny, nz);\n};\n\nJPoint.prototype._threeDbl = function _threeDbl() {\n var nx;\n var ny;\n var nz;\n // Z = 1\n if (this.zOne) {\n // hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-3.html\n // #doubling-mdbl-2007-bl\n // 1M + 5S + 15A\n\n // XX = X1^2\n var xx = this.x.redSqr();\n // YY = Y1^2\n var yy = this.y.redSqr();\n // YYYY = YY^2\n var yyyy = yy.redSqr();\n // S = 2 * ((X1 + YY)^2 - XX - YYYY)\n var s = this.x.redAdd(yy).redSqr().redISub(xx).redISub(yyyy);\n s = s.redIAdd(s);\n // M = 3 * XX + a\n var m = xx.redAdd(xx).redIAdd(xx).redIAdd(this.curve.a);\n // T = M^2 - 2 * S\n var t = m.redSqr().redISub(s).redISub(s);\n // X3 = T\n nx = t;\n // Y3 = M * (S - T) - 8 * YYYY\n var yyyy8 = yyyy.redIAdd(yyyy);\n yyyy8 = yyyy8.redIAdd(yyyy8);\n yyyy8 = yyyy8.redIAdd(yyyy8);\n ny = m.redMul(s.redISub(t)).redISub(yyyy8);\n // Z3 = 2 * Y1\n nz = this.y.redAdd(this.y);\n } else {\n // hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-3.html#doubling-dbl-2001-b\n // 3M + 5S\n\n // delta = Z1^2\n var delta = this.z.redSqr();\n // gamma = Y1^2\n var gamma = this.y.redSqr();\n // beta = X1 * gamma\n var beta = this.x.redMul(gamma);\n // alpha = 3 * (X1 - delta) * (X1 + delta)\n var alpha = this.x.redSub(delta).redMul(this.x.redAdd(delta));\n alpha = alpha.redAdd(alpha).redIAdd(alpha);\n // X3 = alpha^2 - 8 * beta\n var beta4 = beta.redIAdd(beta);\n beta4 = beta4.redIAdd(beta4);\n var beta8 = beta4.redAdd(beta4);\n nx = alpha.redSqr().redISub(beta8);\n // Z3 = (Y1 + Z1)^2 - gamma - delta\n nz = this.y.redAdd(this.z).redSqr().redISub(gamma).redISub(delta);\n // Y3 = alpha * (4 * beta - X3) - 8 * gamma^2\n var ggamma8 = gamma.redSqr();\n ggamma8 = ggamma8.redIAdd(ggamma8);\n ggamma8 = ggamma8.redIAdd(ggamma8);\n ggamma8 = ggamma8.redIAdd(ggamma8);\n ny = alpha.redMul(beta4.redISub(nx)).redISub(ggamma8);\n }\n\n return this.curve.jpoint(nx, ny, nz);\n};\n\nJPoint.prototype._dbl = function _dbl() {\n var a = this.curve.a;\n\n // 4M + 6S + 10A\n var jx = this.x;\n var jy = this.y;\n var jz = this.z;\n var jz4 = jz.redSqr().redSqr();\n\n var jx2 = jx.redSqr();\n var jy2 = jy.redSqr();\n\n var c = jx2.redAdd(jx2).redIAdd(jx2).redIAdd(a.redMul(jz4));\n\n var jxd4 = jx.redAdd(jx);\n jxd4 = jxd4.redIAdd(jxd4);\n var t1 = jxd4.redMul(jy2);\n var nx = c.redSqr().redISub(t1.redAdd(t1));\n var t2 = t1.redISub(nx);\n\n var jyd8 = jy2.redSqr();\n jyd8 = jyd8.redIAdd(jyd8);\n jyd8 = jyd8.redIAdd(jyd8);\n jyd8 = jyd8.redIAdd(jyd8);\n var ny = c.redMul(t2).redISub(jyd8);\n var nz = jy.redAdd(jy).redMul(jz);\n\n return this.curve.jpoint(nx, ny, nz);\n};\n\nJPoint.prototype.trpl = function trpl() {\n if (!this.curve.zeroA)\n return this.dbl().add(this);\n\n // hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-0.html#tripling-tpl-2007-bl\n // 5M + 10S + ...\n\n // XX = X1^2\n var xx = this.x.redSqr();\n // YY = Y1^2\n var yy = this.y.redSqr();\n // ZZ = Z1^2\n var zz = this.z.redSqr();\n // YYYY = YY^2\n var yyyy = yy.redSqr();\n // M = 3 * XX + a * ZZ2; a = 0\n var m = xx.redAdd(xx).redIAdd(xx);\n // MM = M^2\n var mm = m.redSqr();\n // E = 6 * ((X1 + YY)^2 - XX - YYYY) - MM\n var e = this.x.redAdd(yy).redSqr().redISub(xx).redISub(yyyy);\n e = e.redIAdd(e);\n e = e.redAdd(e).redIAdd(e);\n e = e.redISub(mm);\n // EE = E^2\n var ee = e.redSqr();\n // T = 16*YYYY\n var t = yyyy.redIAdd(yyyy);\n t = t.redIAdd(t);\n t = t.redIAdd(t);\n t = t.redIAdd(t);\n // U = (M + E)^2 - MM - EE - T\n var u = m.redIAdd(e).redSqr().redISub(mm).redISub(ee).redISub(t);\n // X3 = 4 * (X1 * EE - 4 * YY * U)\n var yyu4 = yy.redMul(u);\n yyu4 = yyu4.redIAdd(yyu4);\n yyu4 = yyu4.redIAdd(yyu4);\n var nx = this.x.redMul(ee).redISub(yyu4);\n nx = nx.redIAdd(nx);\n nx = nx.redIAdd(nx);\n // Y3 = 8 * Y1 * (U * (T - U) - E * EE)\n var ny = this.y.redMul(u.redMul(t.redISub(u)).redISub(e.redMul(ee)));\n ny = ny.redIAdd(ny);\n ny = ny.redIAdd(ny);\n ny = ny.redIAdd(ny);\n // Z3 = (Z1 + E)^2 - ZZ - EE\n var nz = this.z.redAdd(e).redSqr().redISub(zz).redISub(ee);\n\n return this.curve.jpoint(nx, ny, nz);\n};\n\nJPoint.prototype.mul = function mul(k, kbase) {\n k = new BN(k, kbase);\n\n return this.curve._wnafMul(this, k);\n};\n\nJPoint.prototype.eq = function eq(p) {\n if (p.type === 'affine')\n return this.eq(p.toJ());\n\n if (this === p)\n return true;\n\n // x1 * z2^2 == x2 * z1^2\n var z2 = this.z.redSqr();\n var pz2 = p.z.redSqr();\n if (this.x.redMul(pz2).redISub(p.x.redMul(z2)).cmpn(0) !== 0)\n return false;\n\n // y1 * z2^3 == y2 * z1^3\n var z3 = z2.redMul(this.z);\n var pz3 = pz2.redMul(p.z);\n return this.y.redMul(pz3).redISub(p.y.redMul(z3)).cmpn(0) === 0;\n};\n\nJPoint.prototype.eqXToP = function eqXToP(x) {\n var zs = this.z.redSqr();\n var rx = x.toRed(this.curve.red).redMul(zs);\n if (this.x.cmp(rx) === 0)\n return true;\n\n var xc = x.clone();\n var t = this.curve.redN.redMul(zs);\n for (;;) {\n xc.iadd(this.curve.n);\n if (xc.cmp(this.curve.p) >= 0)\n return false;\n\n rx.redIAdd(t);\n if (this.x.cmp(rx) === 0)\n return true;\n }\n};\n\nJPoint.prototype.inspect = function inspect() {\n if (this.isInfinity())\n return '<EC JPoint Infinity>';\n return '<EC JPoint x: ' + this.x.toString(16, 2) +\n ' y: ' + this.y.toString(16, 2) +\n ' z: ' + this.z.toString(16, 2) + '>';\n};\n\nJPoint.prototype.isInfinity = function isInfinity() {\n // XXX This code assumes that zero is always zero in red\n return this.z.cmpn(0) === 0;\n};\n","'use strict';\n\nvar BN = require('bn.js');\nvar inherits = require('inherits');\nvar Base = require('./base');\n\nvar utils = require('../utils');\n\nfunction MontCurve(conf) {\n Base.call(this, 'mont', conf);\n\n this.a = new BN(conf.a, 16).toRed(this.red);\n this.b = new BN(conf.b, 16).toRed(this.red);\n this.i4 = new BN(4).toRed(this.red).redInvm();\n this.two = new BN(2).toRed(this.red);\n this.a24 = this.i4.redMul(this.a.redAdd(this.two));\n}\ninherits(MontCurve, Base);\nmodule.exports = MontCurve;\n\nMontCurve.prototype.validate = function validate(point) {\n var x = point.normalize().x;\n var x2 = x.redSqr();\n var rhs = x2.redMul(x).redAdd(x2.redMul(this.a)).redAdd(x);\n var y = rhs.redSqrt();\n\n return y.redSqr().cmp(rhs) === 0;\n};\n\nfunction Point(curve, x, z) {\n Base.BasePoint.call(this, curve, 'projective');\n if (x === null && z === null) {\n this.x = this.curve.one;\n this.z = this.curve.zero;\n } else {\n this.x = new BN(x, 16);\n this.z = new BN(z, 16);\n if (!this.x.red)\n this.x = this.x.toRed(this.curve.red);\n if (!this.z.red)\n this.z = this.z.toRed(this.curve.red);\n }\n}\ninherits(Point, Base.BasePoint);\n\nMontCurve.prototype.decodePoint = function decodePoint(bytes, enc) {\n return this.point(utils.toArray(bytes, enc), 1);\n};\n\nMontCurve.prototype.point = function point(x, z) {\n return new Point(this, x, z);\n};\n\nMontCurve.prototype.pointFromJSON = function pointFromJSON(obj) {\n return Point.fromJSON(this, obj);\n};\n\nPoint.prototype.precompute = function precompute() {\n // No-op\n};\n\nPoint.prototype._encode = function _encode() {\n return this.getX().toArray('be', this.curve.p.byteLength());\n};\n\nPoint.fromJSON = function fromJSON(curve, obj) {\n return new Point(curve, obj[0], obj[1] || curve.one);\n};\n\nPoint.prototype.inspect = function inspect() {\n if (this.isInfinity())\n return '<EC Point Infinity>';\n return '<EC Point x: ' + this.x.fromRed().toString(16, 2) +\n ' z: ' + this.z.fromRed().toString(16, 2) + '>';\n};\n\nPoint.prototype.isInfinity = function isInfinity() {\n // XXX This code assumes that zero is always zero in red\n return this.z.cmpn(0) === 0;\n};\n\nPoint.prototype.dbl = function dbl() {\n // http://hyperelliptic.org/EFD/g1p/auto-montgom-xz.html#doubling-dbl-1987-m-3\n // 2M + 2S + 4A\n\n // A = X1 + Z1\n var a = this.x.redAdd(this.z);\n // AA = A^2\n var aa = a.redSqr();\n // B = X1 - Z1\n var b = this.x.redSub(this.z);\n // BB = B^2\n var bb = b.redSqr();\n // C = AA - BB\n var c = aa.redSub(bb);\n // X3 = AA * BB\n var nx = aa.redMul(bb);\n // Z3 = C * (BB + A24 * C)\n var nz = c.redMul(bb.redAdd(this.curve.a24.redMul(c)));\n return this.curve.point(nx, nz);\n};\n\nPoint.prototype.add = function add() {\n throw new Error('Not supported on Montgomery curve');\n};\n\nPoint.prototype.diffAdd = function diffAdd(p, diff) {\n // http://hyperelliptic.org/EFD/g1p/auto-montgom-xz.html#diffadd-dadd-1987-m-3\n // 4M + 2S + 6A\n\n // A = X2 + Z2\n var a = this.x.redAdd(this.z);\n // B = X2 - Z2\n var b = this.x.redSub(this.z);\n // C = X3 + Z3\n var c = p.x.redAdd(p.z);\n // D = X3 - Z3\n var d = p.x.redSub(p.z);\n // DA = D * A\n var da = d.redMul(a);\n // CB = C * B\n var cb = c.redMul(b);\n // X5 = Z1 * (DA + CB)^2\n var nx = diff.z.redMul(da.redAdd(cb).redSqr());\n // Z5 = X1 * (DA - CB)^2\n var nz = diff.x.redMul(da.redISub(cb).redSqr());\n return this.curve.point(nx, nz);\n};\n\nPoint.prototype.mul = function mul(k) {\n var t = k.clone();\n var a = this; // (N / 2) * Q + Q\n var b = this.curve.point(null, null); // (N / 2) * Q\n var c = this; // Q\n\n for (var bits = []; t.cmpn(0) !== 0; t.iushrn(1))\n bits.push(t.andln(1));\n\n for (var i = bits.length - 1; i >= 0; i--) {\n if (bits[i] === 0) {\n // N * Q + Q = ((N / 2) * Q + Q)) + (N / 2) * Q\n a = a.diffAdd(b, c);\n // N * Q = 2 * ((N / 2) * Q + Q))\n b = b.dbl();\n } else {\n // N * Q = ((N / 2) * Q + Q) + ((N / 2) * Q)\n b = a.diffAdd(b, c);\n // N * Q + Q = 2 * ((N / 2) * Q + Q)\n a = a.dbl();\n }\n }\n return b;\n};\n\nPoint.prototype.mulAdd = function mulAdd() {\n throw new Error('Not supported on Montgomery curve');\n};\n\nPoint.prototype.jumlAdd = function jumlAdd() {\n throw new Error('Not supported on Montgomery curve');\n};\n\nPoint.prototype.eq = function eq(other) {\n return this.getX().cmp(other.getX()) === 0;\n};\n\nPoint.prototype.normalize = function normalize() {\n this.x = this.x.redMul(this.z.redInvm());\n this.z = this.curve.one;\n return this;\n};\n\nPoint.prototype.getX = function getX() {\n // Normalize coordinates\n this.normalize();\n\n return this.x.fromRed();\n};\n","'use strict';\n\nvar utils = require('../utils');\nvar BN = require('bn.js');\nvar inherits = require('inherits');\nvar Base = require('./base');\n\nvar assert = utils.assert;\n\nfunction EdwardsCurve(conf) {\n // NOTE: Important as we are creating point in Base.call()\n this.twisted = (conf.a | 0) !== 1;\n this.mOneA = this.twisted && (conf.a | 0) === -1;\n this.extended = this.mOneA;\n\n Base.call(this, 'edwards', conf);\n\n this.a = new BN(conf.a, 16).umod(this.red.m);\n this.a = this.a.toRed(this.red);\n this.c = new BN(conf.c, 16).toRed(this.red);\n this.c2 = this.c.redSqr();\n this.d = new BN(conf.d, 16).toRed(this.red);\n this.dd = this.d.redAdd(this.d);\n\n assert(!this.twisted || this.c.fromRed().cmpn(1) === 0);\n this.oneC = (conf.c | 0) === 1;\n}\ninherits(EdwardsCurve, Base);\nmodule.exports = EdwardsCurve;\n\nEdwardsCurve.prototype._mulA = function _mulA(num) {\n if (this.mOneA)\n return num.redNeg();\n else\n return this.a.redMul(num);\n};\n\nEdwardsCurve.prototype._mulC = function _mulC(num) {\n if (this.oneC)\n return num;\n else\n return this.c.redMul(num);\n};\n\n// Just for compatibility with Short curve\nEdwardsCurve.prototype.jpoint = function jpoint(x, y, z, t) {\n return this.point(x, y, z, t);\n};\n\nEdwardsCurve.prototype.pointFromX = function pointFromX(x, odd) {\n x = new BN(x, 16);\n if (!x.red)\n x = x.toRed(this.red);\n\n var x2 = x.redSqr();\n var rhs = this.c2.redSub(this.a.redMul(x2));\n var lhs = this.one.redSub(this.c2.redMul(this.d).redMul(x2));\n\n var y2 = rhs.redMul(lhs.redInvm());\n var y = y2.redSqrt();\n if (y.redSqr().redSub(y2).cmp(this.zero) !== 0)\n throw new Error('invalid point');\n\n var isOdd = y.fromRed().isOdd();\n if (odd && !isOdd || !odd && isOdd)\n y = y.redNeg();\n\n return this.point(x, y);\n};\n\nEdwardsCurve.prototype.pointFromY = function pointFromY(y, odd) {\n y = new BN(y, 16);\n if (!y.red)\n y = y.toRed(this.red);\n\n // x^2 = (y^2 - c^2) / (c^2 d y^2 - a)\n var y2 = y.redSqr();\n var lhs = y2.redSub(this.c2);\n var rhs = y2.redMul(this.d).redMul(this.c2).redSub(this.a);\n var x2 = lhs.redMul(rhs.redInvm());\n\n if (x2.cmp(this.zero) === 0) {\n if (odd)\n throw new Error('invalid point');\n else\n return this.point(this.zero, y);\n }\n\n var x = x2.redSqrt();\n if (x.redSqr().redSub(x2).cmp(this.zero) !== 0)\n throw new Error('invalid point');\n\n if (x.fromRed().isOdd() !== odd)\n x = x.redNeg();\n\n return this.point(x, y);\n};\n\nEdwardsCurve.prototype.validate = function validate(point) {\n if (point.isInfinity())\n return true;\n\n // Curve: A * X^2 + Y^2 = C^2 * (1 + D * X^2 * Y^2)\n point.normalize();\n\n var x2 = point.x.redSqr();\n var y2 = point.y.redSqr();\n var lhs = x2.redMul(this.a).redAdd(y2);\n var rhs = this.c2.redMul(this.one.redAdd(this.d.redMul(x2).redMul(y2)));\n\n return lhs.cmp(rhs) === 0;\n};\n\nfunction Point(curve, x, y, z, t) {\n Base.BasePoint.call(this, curve, 'projective');\n if (x === null && y === null && z === null) {\n this.x = this.curve.zero;\n this.y = this.curve.one;\n this.z = this.curve.one;\n this.t = this.curve.zero;\n this.zOne = true;\n } else {\n this.x = new BN(x, 16);\n this.y = new BN(y, 16);\n this.z = z ? new BN(z, 16) : this.curve.one;\n this.t = t && new BN(t, 16);\n if (!this.x.red)\n this.x = this.x.toRed(this.curve.red);\n if (!this.y.red)\n this.y = this.y.toRed(this.curve.red);\n if (!this.z.red)\n this.z = this.z.toRed(this.curve.red);\n if (this.t && !this.t.red)\n this.t = this.t.toRed(this.curve.red);\n this.zOne = this.z === this.curve.one;\n\n // Use extended coordinates\n if (this.curve.extended && !this.t) {\n this.t = this.x.redMul(this.y);\n if (!this.zOne)\n this.t = this.t.redMul(this.z.redInvm());\n }\n }\n}\ninherits(Point, Base.BasePoint);\n\nEdwardsCurve.prototype.pointFromJSON = function pointFromJSON(obj) {\n return Point.fromJSON(this, obj);\n};\n\nEdwardsCurve.prototype.point = function point(x, y, z, t) {\n return new Point(this, x, y, z, t);\n};\n\nPoint.fromJSON = function fromJSON(curve, obj) {\n return new Point(curve, obj[0], obj[1], obj[2]);\n};\n\nPoint.prototype.inspect = function inspect() {\n if (this.isInfinity())\n return '<EC Point Infinity>';\n return '<EC Point x: ' + this.x.fromRed().toString(16, 2) +\n ' y: ' + this.y.fromRed().toString(16, 2) +\n ' z: ' + this.z.fromRed().toString(16, 2) + '>';\n};\n\nPoint.prototype.isInfinity = function isInfinity() {\n // XXX This code assumes that zero is always zero in red\n return this.x.cmpn(0) === 0 &&\n (this.y.cmp(this.z) === 0 ||\n (this.zOne && this.y.cmp(this.curve.c) === 0));\n};\n\nPoint.prototype._extDbl = function _extDbl() {\n // hyperelliptic.org/EFD/g1p/auto-twisted-extended-1.html\n // #doubling-dbl-2008-hwcd\n // 4M + 4S\n\n // A = X1^2\n var a = this.x.redSqr();\n // B = Y1^2\n var b = this.y.redSqr();\n // C = 2 * Z1^2\n var c = this.z.redSqr();\n c = c.redIAdd(c);\n // D = a * A\n var d = this.curve._mulA(a);\n // E = (X1 + Y1)^2 - A - B\n var e = this.x.redAdd(this.y).redSqr().redISub(a).redISub(b);\n // G = D + B\n var g = d.redAdd(b);\n // F = G - C\n var f = g.redSub(c);\n // H = D - B\n var h = d.redSub(b);\n // X3 = E * F\n var nx = e.redMul(f);\n // Y3 = G * H\n var ny = g.redMul(h);\n // T3 = E * H\n var nt = e.redMul(h);\n // Z3 = F * G\n var nz = f.redMul(g);\n return this.curve.point(nx, ny, nz, nt);\n};\n\nPoint.prototype._projDbl = function _projDbl() {\n // hyperelliptic.org/EFD/g1p/auto-twisted-projective.html\n // #doubling-dbl-2008-bbjlp\n // #doubling-dbl-2007-bl\n // and others\n // Generally 3M + 4S or 2M + 4S\n\n // B = (X1 + Y1)^2\n var b = this.x.redAdd(this.y).redSqr();\n // C = X1^2\n var c = this.x.redSqr();\n // D = Y1^2\n var d = this.y.redSqr();\n\n var nx;\n var ny;\n var nz;\n var e;\n var h;\n var j;\n if (this.curve.twisted) {\n // E = a * C\n e = this.curve._mulA(c);\n // F = E + D\n var f = e.redAdd(d);\n if (this.zOne) {\n // X3 = (B - C - D) * (F - 2)\n nx = b.redSub(c).redSub(d).redMul(f.redSub(this.curve.two));\n // Y3 = F * (E - D)\n ny = f.redMul(e.redSub(d));\n // Z3 = F^2 - 2 * F\n nz = f.redSqr().redSub(f).redSub(f);\n } else {\n // H = Z1^2\n h = this.z.redSqr();\n // J = F - 2 * H\n j = f.redSub(h).redISub(h);\n // X3 = (B-C-D)*J\n nx = b.redSub(c).redISub(d).redMul(j);\n // Y3 = F * (E - D)\n ny = f.redMul(e.redSub(d));\n // Z3 = F * J\n nz = f.redMul(j);\n }\n } else {\n // E = C + D\n e = c.redAdd(d);\n // H = (c * Z1)^2\n h = this.curve._mulC(this.z).redSqr();\n // J = E - 2 * H\n j = e.redSub(h).redSub(h);\n // X3 = c * (B - E) * J\n nx = this.curve._mulC(b.redISub(e)).redMul(j);\n // Y3 = c * E * (C - D)\n ny = this.curve._mulC(e).redMul(c.redISub(d));\n // Z3 = E * J\n nz = e.redMul(j);\n }\n return this.curve.point(nx, ny, nz);\n};\n\nPoint.prototype.dbl = function dbl() {\n if (this.isInfinity())\n return this;\n\n // Double in extended coordinates\n if (this.curve.extended)\n return this._extDbl();\n else\n return this._projDbl();\n};\n\nPoint.prototype._extAdd = function _extAdd(p) {\n // hyperelliptic.org/EFD/g1p/auto-twisted-extended-1.html\n // #addition-add-2008-hwcd-3\n // 8M\n\n // A = (Y1 - X1) * (Y2 - X2)\n var a = this.y.redSub(this.x).redMul(p.y.redSub(p.x));\n // B = (Y1 + X1) * (Y2 + X2)\n var b = this.y.redAdd(this.x).redMul(p.y.redAdd(p.x));\n // C = T1 * k * T2\n var c = this.t.redMul(this.curve.dd).redMul(p.t);\n // D = Z1 * 2 * Z2\n var d = this.z.redMul(p.z.redAdd(p.z));\n // E = B - A\n var e = b.redSub(a);\n // F = D - C\n var f = d.redSub(c);\n // G = D + C\n var g = d.redAdd(c);\n // H = B + A\n var h = b.redAdd(a);\n // X3 = E * F\n var nx = e.redMul(f);\n // Y3 = G * H\n var ny = g.redMul(h);\n // T3 = E * H\n var nt = e.redMul(h);\n // Z3 = F * G\n var nz = f.redMul(g);\n return this.curve.point(nx, ny, nz, nt);\n};\n\nPoint.prototype._projAdd = function _projAdd(p) {\n // hyperelliptic.org/EFD/g1p/auto-twisted-projective.html\n // #addition-add-2008-bbjlp\n // #addition-add-2007-bl\n // 10M + 1S\n\n // A = Z1 * Z2\n var a = this.z.redMul(p.z);\n // B = A^2\n var b = a.redSqr();\n // C = X1 * X2\n var c = this.x.redMul(p.x);\n // D = Y1 * Y2\n var d = this.y.redMul(p.y);\n // E = d * C * D\n var e = this.curve.d.redMul(c).redMul(d);\n // F = B - E\n var f = b.redSub(e);\n // G = B + E\n var g = b.redAdd(e);\n // X3 = A * F * ((X1 + Y1) * (X2 + Y2) - C - D)\n var tmp = this.x.redAdd(this.y).redMul(p.x.redAdd(p.y)).redISub(c).redISub(d);\n var nx = a.redMul(f).redMul(tmp);\n var ny;\n var nz;\n if (this.curve.twisted) {\n // Y3 = A * G * (D - a * C)\n ny = a.redMul(g).redMul(d.redSub(this.curve._mulA(c)));\n // Z3 = F * G\n nz = f.redMul(g);\n } else {\n // Y3 = A * G * (D - C)\n ny = a.redMul(g).redMul(d.redSub(c));\n // Z3 = c * F * G\n nz = this.curve._mulC(f).redMul(g);\n }\n return this.curve.point(nx, ny, nz);\n};\n\nPoint.prototype.add = function add(p) {\n if (this.isInfinity())\n return p;\n if (p.isInfinity())\n return this;\n\n if (this.curve.extended)\n return this._extAdd(p);\n else\n return this._projAdd(p);\n};\n\nPoint.prototype.mul = function mul(k) {\n if (this._hasDoubles(k))\n return this.curve._fixedNafMul(this, k);\n else\n return this.curve._wnafMul(this, k);\n};\n\nPoint.prototype.mulAdd = function mulAdd(k1, p, k2) {\n return this.curve._wnafMulAdd(1, [ this, p ], [ k1, k2 ], 2, false);\n};\n\nPoint.prototype.jmulAdd = function jmulAdd(k1, p, k2) {\n return this.curve._wnafMulAdd(1, [ this, p ], [ k1, k2 ], 2, true);\n};\n\nPoint.prototype.normalize = function normalize() {\n if (this.zOne)\n return this;\n\n // Normalize coordinates\n var zi = this.z.redInvm();\n this.x = this.x.redMul(zi);\n this.y = this.y.redMul(zi);\n if (this.t)\n this.t = this.t.redMul(zi);\n this.z = this.curve.one;\n this.zOne = true;\n return this;\n};\n\nPoint.prototype.neg = function neg() {\n return this.curve.point(this.x.redNeg(),\n this.y,\n this.z,\n this.t && this.t.redNeg());\n};\n\nPoint.prototype.getX = function getX() {\n this.normalize();\n return this.x.fromRed();\n};\n\nPoint.prototype.getY = function getY() {\n this.normalize();\n return this.y.fromRed();\n};\n\nPoint.prototype.eq = function eq(other) {\n return this === other ||\n this.getX().cmp(other.getX()) === 0 &&\n this.getY().cmp(other.getY()) === 0;\n};\n\nPoint.prototype.eqXToP = function eqXToP(x) {\n var rx = x.toRed(this.curve.red).redMul(this.z);\n if (this.x.cmp(rx) === 0)\n return true;\n\n var xc = x.clone();\n var t = this.curve.redN.redMul(this.z);\n for (;;) {\n xc.iadd(this.curve.n);\n if (xc.cmp(this.curve.p) >= 0)\n return false;\n\n rx.redIAdd(t);\n if (this.x.cmp(rx) === 0)\n return true;\n }\n};\n\n// Compatibility with BaseCurve\nPoint.prototype.toP = Point.prototype.normalize;\nPoint.prototype.mixedAdd = Point.prototype.add;\n","'use strict';\n\nvar curve = exports;\n\ncurve.base = require('./base');\ncurve.short = require('./short');\ncurve.mont = require('./mont');\ncurve.edwards = require('./edwards');\n","'use strict';\n\nvar assert = require('minimalistic-assert');\nvar inherits = require('inherits');\n\nexports.inherits = inherits;\n\nfunction isSurrogatePair(msg, i) {\n if ((msg.charCodeAt(i) & 0xFC00) !== 0xD800) {\n return false;\n }\n if (i < 0 || i + 1 >= msg.length) {\n return false;\n }\n return (msg.charCodeAt(i + 1) & 0xFC00) === 0xDC00;\n}\n\nfunction toArray(msg, enc) {\n if (Array.isArray(msg))\n return msg.slice();\n if (!msg)\n return [];\n var res = [];\n if (typeof msg === 'string') {\n if (!enc) {\n // Inspired by stringToUtf8ByteArray() in closure-library by Google\n // https://github.com/google/closure-library/blob/8598d87242af59aac233270742c8984e2b2bdbe0/closure/goog/crypt/crypt.js#L117-L143\n // Apache License 2.0\n // https://github.com/google/closure-library/blob/master/LICENSE\n var p = 0;\n for (var i = 0; i < msg.length; i++) {\n var c = msg.charCodeAt(i);\n if (c < 128) {\n res[p++] = c;\n } else if (c < 2048) {\n res[p++] = (c >> 6) | 192;\n res[p++] = (c & 63) | 128;\n } else if (isSurrogatePair(msg, i)) {\n c = 0x10000 + ((c & 0x03FF) << 10) + (msg.charCodeAt(++i) & 0x03FF);\n res[p++] = (c >> 18) | 240;\n res[p++] = ((c >> 12) & 63) | 128;\n res[p++] = ((c >> 6) & 63) | 128;\n res[p++] = (c & 63) | 128;\n } else {\n res[p++] = (c >> 12) | 224;\n res[p++] = ((c >> 6) & 63) | 128;\n res[p++] = (c & 63) | 128;\n }\n }\n } else if (enc === 'hex') {\n msg = msg.replace(/[^a-z0-9]+/ig, '');\n if (msg.length % 2 !== 0)\n msg = '0' + msg;\n for (i = 0; i < msg.length; i += 2)\n res.push(parseInt(msg[i] + msg[i + 1], 16));\n }\n } else {\n for (i = 0; i < msg.length; i++)\n res[i] = msg[i] | 0;\n }\n return res;\n}\nexports.toArray = toArray;\n\nfunction toHex(msg) {\n var res = '';\n for (var i = 0; i < msg.length; i++)\n res += zero2(msg[i].toString(16));\n return res;\n}\nexports.toHex = toHex;\n\nfunction htonl(w) {\n var res = (w >>> 24) |\n ((w >>> 8) & 0xff00) |\n ((w << 8) & 0xff0000) |\n ((w & 0xff) << 24);\n return res >>> 0;\n}\nexports.htonl = htonl;\n\nfunction toHex32(msg, endian) {\n var res = '';\n for (var i = 0; i < msg.length; i++) {\n var w = msg[i];\n if (endian === 'little')\n w = htonl(w);\n res += zero8(w.toString(16));\n }\n return res;\n}\nexports.toHex32 = toHex32;\n\nfunction zero2(word) {\n if (word.length === 1)\n return '0' + word;\n else\n return word;\n}\nexports.zero2 = zero2;\n\nfunction zero8(word) {\n if (word.length === 7)\n return '0' + word;\n else if (word.length === 6)\n return '00' + word;\n else if (word.length === 5)\n return '000' + word;\n else if (word.length === 4)\n return '0000' + word;\n else if (word.length === 3)\n return '00000' + word;\n else if (word.length === 2)\n return '000000' + word;\n else if (word.length === 1)\n return '0000000' + word;\n else\n return word;\n}\nexports.zero8 = zero8;\n\nfunction join32(msg, start, end, endian) {\n var len = end - start;\n assert(len % 4 === 0);\n var res = new Array(len / 4);\n for (var i = 0, k = start; i < res.length; i++, k += 4) {\n var w;\n if (endian === 'big')\n w = (msg[k] << 24) | (msg[k + 1] << 16) | (msg[k + 2] << 8) | msg[k + 3];\n else\n w = (msg[k + 3] << 24) | (msg[k + 2] << 16) | (msg[k + 1] << 8) | msg[k];\n res[i] = w >>> 0;\n }\n return res;\n}\nexports.join32 = join32;\n\nfunction split32(msg, endian) {\n var res = new Array(msg.length * 4);\n for (var i = 0, k = 0; i < msg.length; i++, k += 4) {\n var m = msg[i];\n if (endian === 'big') {\n res[k] = m >>> 24;\n res[k + 1] = (m >>> 16) & 0xff;\n res[k + 2] = (m >>> 8) & 0xff;\n res[k + 3] = m & 0xff;\n } else {\n res[k + 3] = m >>> 24;\n res[k + 2] = (m >>> 16) & 0xff;\n res[k + 1] = (m >>> 8) & 0xff;\n res[k] = m & 0xff;\n }\n }\n return res;\n}\nexports.split32 = split32;\n\nfunction rotr32(w, b) {\n return (w >>> b) | (w << (32 - b));\n}\nexports.rotr32 = rotr32;\n\nfunction rotl32(w, b) {\n return (w << b) | (w >>> (32 - b));\n}\nexports.rotl32 = rotl32;\n\nfunction sum32(a, b) {\n return (a + b) >>> 0;\n}\nexports.sum32 = sum32;\n\nfunction sum32_3(a, b, c) {\n return (a + b + c) >>> 0;\n}\nexports.sum32_3 = sum32_3;\n\nfunction sum32_4(a, b, c, d) {\n return (a + b + c + d) >>> 0;\n}\nexports.sum32_4 = sum32_4;\n\nfunction sum32_5(a, b, c, d, e) {\n return (a + b + c + d + e) >>> 0;\n}\nexports.sum32_5 = sum32_5;\n\nfunction sum64(buf, pos, ah, al) {\n var bh = buf[pos];\n var bl = buf[pos + 1];\n\n var lo = (al + bl) >>> 0;\n var hi = (lo < al ? 1 : 0) + ah + bh;\n buf[pos] = hi >>> 0;\n buf[pos + 1] = lo;\n}\nexports.sum64 = sum64;\n\nfunction sum64_hi(ah, al, bh, bl) {\n var lo = (al + bl) >>> 0;\n var hi = (lo < al ? 1 : 0) + ah + bh;\n return hi >>> 0;\n}\nexports.sum64_hi = sum64_hi;\n\nfunction sum64_lo(ah, al, bh, bl) {\n var lo = al + bl;\n return lo >>> 0;\n}\nexports.sum64_lo = sum64_lo;\n\nfunction sum64_4_hi(ah, al, bh, bl, ch, cl, dh, dl) {\n var carry = 0;\n var lo = al;\n lo = (lo + bl) >>> 0;\n carry += lo < al ? 1 : 0;\n lo = (lo + cl) >>> 0;\n carry += lo < cl ? 1 : 0;\n lo = (lo + dl) >>> 0;\n carry += lo < dl ? 1 : 0;\n\n var hi = ah + bh + ch + dh + carry;\n return hi >>> 0;\n}\nexports.sum64_4_hi = sum64_4_hi;\n\nfunction sum64_4_lo(ah, al, bh, bl, ch, cl, dh, dl) {\n var lo = al + bl + cl + dl;\n return lo >>> 0;\n}\nexports.sum64_4_lo = sum64_4_lo;\n\nfunction sum64_5_hi(ah, al, bh, bl, ch, cl, dh, dl, eh, el) {\n var carry = 0;\n var lo = al;\n lo = (lo + bl) >>> 0;\n carry += lo < al ? 1 : 0;\n lo = (lo + cl) >>> 0;\n carry += lo < cl ? 1 : 0;\n lo = (lo + dl) >>> 0;\n carry += lo < dl ? 1 : 0;\n lo = (lo + el) >>> 0;\n carry += lo < el ? 1 : 0;\n\n var hi = ah + bh + ch + dh + eh + carry;\n return hi >>> 0;\n}\nexports.sum64_5_hi = sum64_5_hi;\n\nfunction sum64_5_lo(ah, al, bh, bl, ch, cl, dh, dl, eh, el) {\n var lo = al + bl + cl + dl + el;\n\n return lo >>> 0;\n}\nexports.sum64_5_lo = sum64_5_lo;\n\nfunction rotr64_hi(ah, al, num) {\n var r = (al << (32 - num)) | (ah >>> num);\n return r >>> 0;\n}\nexports.rotr64_hi = rotr64_hi;\n\nfunction rotr64_lo(ah, al, num) {\n var r = (ah << (32 - num)) | (al >>> num);\n return r >>> 0;\n}\nexports.rotr64_lo = rotr64_lo;\n\nfunction shr64_hi(ah, al, num) {\n return ah >>> num;\n}\nexports.shr64_hi = shr64_hi;\n\nfunction shr64_lo(ah, al, num) {\n var r = (ah << (32 - num)) | (al >>> num);\n return r >>> 0;\n}\nexports.shr64_lo = shr64_lo;\n","'use strict';\n\nvar utils = require('./utils');\nvar assert = require('minimalistic-assert');\n\nfunction BlockHash() {\n this.pending = null;\n this.pendingTotal = 0;\n this.blockSize = this.constructor.blockSize;\n this.outSize = this.constructor.outSize;\n this.hmacStrength = this.constructor.hmacStrength;\n this.padLength = this.constructor.padLength / 8;\n this.endian = 'big';\n\n this._delta8 = this.blockSize / 8;\n this._delta32 = this.blockSize / 32;\n}\nexports.BlockHash = BlockHash;\n\nBlockHash.prototype.update = function update(msg, enc) {\n // Convert message to array, pad it, and join into 32bit blocks\n msg = utils.toArray(msg, enc);\n if (!this.pending)\n this.pending = msg;\n else\n this.pending = this.pending.concat(msg);\n this.pendingTotal += msg.length;\n\n // Enough data, try updating\n if (this.pending.length >= this._delta8) {\n msg = this.pending;\n\n // Process pending data in blocks\n var r = msg.length % this._delta8;\n this.pending = msg.slice(msg.length - r, msg.length);\n if (this.pending.length === 0)\n this.pending = null;\n\n msg = utils.join32(msg, 0, msg.length - r, this.endian);\n for (var i = 0; i < msg.length; i += this._delta32)\n this._update(msg, i, i + this._delta32);\n }\n\n return this;\n};\n\nBlockHash.prototype.digest = function digest(enc) {\n this.update(this._pad());\n assert(this.pending === null);\n\n return this._digest(enc);\n};\n\nBlockHash.prototype._pad = function pad() {\n var len = this.pendingTotal;\n var bytes = this._delta8;\n var k = bytes - ((len + this.padLength) % bytes);\n var res = new Array(k + this.padLength);\n res[0] = 0x80;\n for (var i = 1; i < k; i++)\n res[i] = 0;\n\n // Append length\n len <<= 3;\n if (this.endian === 'big') {\n for (var t = 8; t < this.padLength; t++)\n res[i++] = 0;\n\n res[i++] = 0;\n res[i++] = 0;\n res[i++] = 0;\n res[i++] = 0;\n res[i++] = (len >>> 24) & 0xff;\n res[i++] = (len >>> 16) & 0xff;\n res[i++] = (len >>> 8) & 0xff;\n res[i++] = len & 0xff;\n } else {\n res[i++] = len & 0xff;\n res[i++] = (len >>> 8) & 0xff;\n res[i++] = (len >>> 16) & 0xff;\n res[i++] = (len >>> 24) & 0xff;\n res[i++] = 0;\n res[i++] = 0;\n res[i++] = 0;\n res[i++] = 0;\n\n for (t = 8; t < this.padLength; t++)\n res[i++] = 0;\n }\n\n return res;\n};\n","'use strict';\n\nvar utils = require('../utils');\nvar rotr32 = utils.rotr32;\n\nfunction ft_1(s, x, y, z) {\n if (s === 0)\n return ch32(x, y, z);\n if (s === 1 || s === 3)\n return p32(x, y, z);\n if (s === 2)\n return maj32(x, y, z);\n}\nexports.ft_1 = ft_1;\n\nfunction ch32(x, y, z) {\n return (x & y) ^ ((~x) & z);\n}\nexports.ch32 = ch32;\n\nfunction maj32(x, y, z) {\n return (x & y) ^ (x & z) ^ (y & z);\n}\nexports.maj32 = maj32;\n\nfunction p32(x, y, z) {\n return x ^ y ^ z;\n}\nexports.p32 = p32;\n\nfunction s0_256(x) {\n return rotr32(x, 2) ^ rotr32(x, 13) ^ rotr32(x, 22);\n}\nexports.s0_256 = s0_256;\n\nfunction s1_256(x) {\n return rotr32(x, 6) ^ rotr32(x, 11) ^ rotr32(x, 25);\n}\nexports.s1_256 = s1_256;\n\nfunction g0_256(x) {\n return rotr32(x, 7) ^ rotr32(x, 18) ^ (x >>> 3);\n}\nexports.g0_256 = g0_256;\n\nfunction g1_256(x) {\n return rotr32(x, 17) ^ rotr32(x, 19) ^ (x >>> 10);\n}\nexports.g1_256 = g1_256;\n","'use strict';\n\nvar utils = require('../utils');\nvar common = require('../common');\nvar shaCommon = require('./common');\n\nvar rotl32 = utils.rotl32;\nvar sum32 = utils.sum32;\nvar sum32_5 = utils.sum32_5;\nvar ft_1 = shaCommon.ft_1;\nvar BlockHash = common.BlockHash;\n\nvar sha1_K = [\n 0x5A827999, 0x6ED9EBA1,\n 0x8F1BBCDC, 0xCA62C1D6\n];\n\nfunction SHA1() {\n if (!(this instanceof SHA1))\n return new SHA1();\n\n BlockHash.call(this);\n this.h = [\n 0x67452301, 0xefcdab89, 0x98badcfe,\n 0x10325476, 0xc3d2e1f0 ];\n this.W = new Array(80);\n}\n\nutils.inherits(SHA1, BlockHash);\nmodule.exports = SHA1;\n\nSHA1.blockSize = 512;\nSHA1.outSize = 160;\nSHA1.hmacStrength = 80;\nSHA1.padLength = 64;\n\nSHA1.prototype._update = function _update(msg, start) {\n var W = this.W;\n\n for (var i = 0; i < 16; i++)\n W[i] = msg[start + i];\n\n for(; i < W.length; i++)\n W[i] = rotl32(W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16], 1);\n\n var a = this.h[0];\n var b = this.h[1];\n var c = this.h[2];\n var d = this.h[3];\n var e = this.h[4];\n\n for (i = 0; i < W.length; i++) {\n var s = ~~(i / 20);\n var t = sum32_5(rotl32(a, 5), ft_1(s, b, c, d), e, W[i], sha1_K[s]);\n e = d;\n d = c;\n c = rotl32(b, 30);\n b = a;\n a = t;\n }\n\n this.h[0] = sum32(this.h[0], a);\n this.h[1] = sum32(this.h[1], b);\n this.h[2] = sum32(this.h[2], c);\n this.h[3] = sum32(this.h[3], d);\n this.h[4] = sum32(this.h[4], e);\n};\n\nSHA1.prototype._digest = function digest(enc) {\n if (enc === 'hex')\n return utils.toHex32(this.h, 'big');\n else\n return utils.split32(this.h, 'big');\n};\n","'use strict';\n\nvar utils = require('../utils');\nvar common = require('../common');\nvar shaCommon = require('./common');\nvar assert = require('minimalistic-assert');\n\nvar sum32 = utils.sum32;\nvar sum32_4 = utils.sum32_4;\nvar sum32_5 = utils.sum32_5;\nvar ch32 = shaCommon.ch32;\nvar maj32 = shaCommon.maj32;\nvar s0_256 = shaCommon.s0_256;\nvar s1_256 = shaCommon.s1_256;\nvar g0_256 = shaCommon.g0_256;\nvar g1_256 = shaCommon.g1_256;\n\nvar BlockHash = common.BlockHash;\n\nvar sha256_K = [\n 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5,\n 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,\n 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,\n 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,\n 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc,\n 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,\n 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7,\n 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,\n 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,\n 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,\n 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3,\n 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,\n 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5,\n 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,\n 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,\n 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2\n];\n\nfunction SHA256() {\n if (!(this instanceof SHA256))\n return new SHA256();\n\n BlockHash.call(this);\n this.h = [\n 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a,\n 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19\n ];\n this.k = sha256_K;\n this.W = new Array(64);\n}\nutils.inherits(SHA256, BlockHash);\nmodule.exports = SHA256;\n\nSHA256.blockSize = 512;\nSHA256.outSize = 256;\nSHA256.hmacStrength = 192;\nSHA256.padLength = 64;\n\nSHA256.prototype._update = function _update(msg, start) {\n var W = this.W;\n\n for (var i = 0; i < 16; i++)\n W[i] = msg[start + i];\n for (; i < W.length; i++)\n W[i] = sum32_4(g1_256(W[i - 2]), W[i - 7], g0_256(W[i - 15]), W[i - 16]);\n\n var a = this.h[0];\n var b = this.h[1];\n var c = this.h[2];\n var d = this.h[3];\n var e = this.h[4];\n var f = this.h[5];\n var g = this.h[6];\n var h = this.h[7];\n\n assert(this.k.length === W.length);\n for (i = 0; i < W.length; i++) {\n var T1 = sum32_5(h, s1_256(e), ch32(e, f, g), this.k[i], W[i]);\n var T2 = sum32(s0_256(a), maj32(a, b, c));\n h = g;\n g = f;\n f = e;\n e = sum32(d, T1);\n d = c;\n c = b;\n b = a;\n a = sum32(T1, T2);\n }\n\n this.h[0] = sum32(this.h[0], a);\n this.h[1] = sum32(this.h[1], b);\n this.h[2] = sum32(this.h[2], c);\n this.h[3] = sum32(this.h[3], d);\n this.h[4] = sum32(this.h[4], e);\n this.h[5] = sum32(this.h[5], f);\n this.h[6] = sum32(this.h[6], g);\n this.h[7] = sum32(this.h[7], h);\n};\n\nSHA256.prototype._digest = function digest(enc) {\n if (enc === 'hex')\n return utils.toHex32(this.h, 'big');\n else\n return utils.split32(this.h, 'big');\n};\n","'use strict';\n\nvar utils = require('../utils');\nvar SHA256 = require('./256');\n\nfunction SHA224() {\n if (!(this instanceof SHA224))\n return new SHA224();\n\n SHA256.call(this);\n this.h = [\n 0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939,\n 0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4 ];\n}\nutils.inherits(SHA224, SHA256);\nmodule.exports = SHA224;\n\nSHA224.blockSize = 512;\nSHA224.outSize = 224;\nSHA224.hmacStrength = 192;\nSHA224.padLength = 64;\n\nSHA224.prototype._digest = function digest(enc) {\n // Just truncate output\n if (enc === 'hex')\n return utils.toHex32(this.h.slice(0, 7), 'big');\n else\n return utils.split32(this.h.slice(0, 7), 'big');\n};\n\n","'use strict';\n\nvar utils = require('../utils');\nvar common = require('../common');\nvar assert = require('minimalistic-assert');\n\nvar rotr64_hi = utils.rotr64_hi;\nvar rotr64_lo = utils.rotr64_lo;\nvar shr64_hi = utils.shr64_hi;\nvar shr64_lo = utils.shr64_lo;\nvar sum64 = utils.sum64;\nvar sum64_hi = utils.sum64_hi;\nvar sum64_lo = utils.sum64_lo;\nvar sum64_4_hi = utils.sum64_4_hi;\nvar sum64_4_lo = utils.sum64_4_lo;\nvar sum64_5_hi = utils.sum64_5_hi;\nvar sum64_5_lo = utils.sum64_5_lo;\n\nvar BlockHash = common.BlockHash;\n\nvar sha512_K = [\n 0x428a2f98, 0xd728ae22, 0x71374491, 0x23ef65cd,\n 0xb5c0fbcf, 0xec4d3b2f, 0xe9b5dba5, 0x8189dbbc,\n 0x3956c25b, 0xf348b538, 0x59f111f1, 0xb605d019,\n 0x923f82a4, 0xaf194f9b, 0xab1c5ed5, 0xda6d8118,\n 0xd807aa98, 0xa3030242, 0x12835b01, 0x45706fbe,\n 0x243185be, 0x4ee4b28c, 0x550c7dc3, 0xd5ffb4e2,\n 0x72be5d74, 0xf27b896f, 0x80deb1fe, 0x3b1696b1,\n 0x9bdc06a7, 0x25c71235, 0xc19bf174, 0xcf692694,\n 0xe49b69c1, 0x9ef14ad2, 0xefbe4786, 0x384f25e3,\n 0x0fc19dc6, 0x8b8cd5b5, 0x240ca1cc, 0x77ac9c65,\n 0x2de92c6f, 0x592b0275, 0x4a7484aa, 0x6ea6e483,\n 0x5cb0a9dc, 0xbd41fbd4, 0x76f988da, 0x831153b5,\n 0x983e5152, 0xee66dfab, 0xa831c66d, 0x2db43210,\n 0xb00327c8, 0x98fb213f, 0xbf597fc7, 0xbeef0ee4,\n 0xc6e00bf3, 0x3da88fc2, 0xd5a79147, 0x930aa725,\n 0x06ca6351, 0xe003826f, 0x14292967, 0x0a0e6e70,\n 0x27b70a85, 0x46d22ffc, 0x2e1b2138, 0x5c26c926,\n 0x4d2c6dfc, 0x5ac42aed, 0x53380d13, 0x9d95b3df,\n 0x650a7354, 0x8baf63de, 0x766a0abb, 0x3c77b2a8,\n 0x81c2c92e, 0x47edaee6, 0x92722c85, 0x1482353b,\n 0xa2bfe8a1, 0x4cf10364, 0xa81a664b, 0xbc423001,\n 0xc24b8b70, 0xd0f89791, 0xc76c51a3, 0x0654be30,\n 0xd192e819, 0xd6ef5218, 0xd6990624, 0x5565a910,\n 0xf40e3585, 0x5771202a, 0x106aa070, 0x32bbd1b8,\n 0x19a4c116, 0xb8d2d0c8, 0x1e376c08, 0x5141ab53,\n 0x2748774c, 0xdf8eeb99, 0x34b0bcb5, 0xe19b48a8,\n 0x391c0cb3, 0xc5c95a63, 0x4ed8aa4a, 0xe3418acb,\n 0x5b9cca4f, 0x7763e373, 0x682e6ff3, 0xd6b2b8a3,\n 0x748f82ee, 0x5defb2fc, 0x78a5636f, 0x43172f60,\n 0x84c87814, 0xa1f0ab72, 0x8cc70208, 0x1a6439ec,\n 0x90befffa, 0x23631e28, 0xa4506ceb, 0xde82bde9,\n 0xbef9a3f7, 0xb2c67915, 0xc67178f2, 0xe372532b,\n 0xca273ece, 0xea26619c, 0xd186b8c7, 0x21c0c207,\n 0xeada7dd6, 0xcde0eb1e, 0xf57d4f7f, 0xee6ed178,\n 0x06f067aa, 0x72176fba, 0x0a637dc5, 0xa2c898a6,\n 0x113f9804, 0xbef90dae, 0x1b710b35, 0x131c471b,\n 0x28db77f5, 0x23047d84, 0x32caab7b, 0x40c72493,\n 0x3c9ebe0a, 0x15c9bebc, 0x431d67c4, 0x9c100d4c,\n 0x4cc5d4be, 0xcb3e42b6, 0x597f299c, 0xfc657e2a,\n 0x5fcb6fab, 0x3ad6faec, 0x6c44198c, 0x4a475817\n];\n\nfunction SHA512() {\n if (!(this instanceof SHA512))\n return new SHA512();\n\n BlockHash.call(this);\n this.h = [\n 0x6a09e667, 0xf3bcc908,\n 0xbb67ae85, 0x84caa73b,\n 0x3c6ef372, 0xfe94f82b,\n 0xa54ff53a, 0x5f1d36f1,\n 0x510e527f, 0xade682d1,\n 0x9b05688c, 0x2b3e6c1f,\n 0x1f83d9ab, 0xfb41bd6b,\n 0x5be0cd19, 0x137e2179 ];\n this.k = sha512_K;\n this.W = new Array(160);\n}\nutils.inherits(SHA512, BlockHash);\nmodule.exports = SHA512;\n\nSHA512.blockSize = 1024;\nSHA512.outSize = 512;\nSHA512.hmacStrength = 192;\nSHA512.padLength = 128;\n\nSHA512.prototype._prepareBlock = function _prepareBlock(msg, start) {\n var W = this.W;\n\n // 32 x 32bit words\n for (var i = 0; i < 32; i++)\n W[i] = msg[start + i];\n for (; i < W.length; i += 2) {\n var c0_hi = g1_512_hi(W[i - 4], W[i - 3]); // i - 2\n var c0_lo = g1_512_lo(W[i - 4], W[i - 3]);\n var c1_hi = W[i - 14]; // i - 7\n var c1_lo = W[i - 13];\n var c2_hi = g0_512_hi(W[i - 30], W[i - 29]); // i - 15\n var c2_lo = g0_512_lo(W[i - 30], W[i - 29]);\n var c3_hi = W[i - 32]; // i - 16\n var c3_lo = W[i - 31];\n\n W[i] = sum64_4_hi(\n c0_hi, c0_lo,\n c1_hi, c1_lo,\n c2_hi, c2_lo,\n c3_hi, c3_lo);\n W[i + 1] = sum64_4_lo(\n c0_hi, c0_lo,\n c1_hi, c1_lo,\n c2_hi, c2_lo,\n c3_hi, c3_lo);\n }\n};\n\nSHA512.prototype._update = function _update(msg, start) {\n this._prepareBlock(msg, start);\n\n var W = this.W;\n\n var ah = this.h[0];\n var al = this.h[1];\n var bh = this.h[2];\n var bl = this.h[3];\n var ch = this.h[4];\n var cl = this.h[5];\n var dh = this.h[6];\n var dl = this.h[7];\n var eh = this.h[8];\n var el = this.h[9];\n var fh = this.h[10];\n var fl = this.h[11];\n var gh = this.h[12];\n var gl = this.h[13];\n var hh = this.h[14];\n var hl = this.h[15];\n\n assert(this.k.length === W.length);\n for (var i = 0; i < W.length; i += 2) {\n var c0_hi = hh;\n var c0_lo = hl;\n var c1_hi = s1_512_hi(eh, el);\n var c1_lo = s1_512_lo(eh, el);\n var c2_hi = ch64_hi(eh, el, fh, fl, gh, gl);\n var c2_lo = ch64_lo(eh, el, fh, fl, gh, gl);\n var c3_hi = this.k[i];\n var c3_lo = this.k[i + 1];\n var c4_hi = W[i];\n var c4_lo = W[i + 1];\n\n var T1_hi = sum64_5_hi(\n c0_hi, c0_lo,\n c1_hi, c1_lo,\n c2_hi, c2_lo,\n c3_hi, c3_lo,\n c4_hi, c4_lo);\n var T1_lo = sum64_5_lo(\n c0_hi, c0_lo,\n c1_hi, c1_lo,\n c2_hi, c2_lo,\n c3_hi, c3_lo,\n c4_hi, c4_lo);\n\n c0_hi = s0_512_hi(ah, al);\n c0_lo = s0_512_lo(ah, al);\n c1_hi = maj64_hi(ah, al, bh, bl, ch, cl);\n c1_lo = maj64_lo(ah, al, bh, bl, ch, cl);\n\n var T2_hi = sum64_hi(c0_hi, c0_lo, c1_hi, c1_lo);\n var T2_lo = sum64_lo(c0_hi, c0_lo, c1_hi, c1_lo);\n\n hh = gh;\n hl = gl;\n\n gh = fh;\n gl = fl;\n\n fh = eh;\n fl = el;\n\n eh = sum64_hi(dh, dl, T1_hi, T1_lo);\n el = sum64_lo(dl, dl, T1_hi, T1_lo);\n\n dh = ch;\n dl = cl;\n\n ch = bh;\n cl = bl;\n\n bh = ah;\n bl = al;\n\n ah = sum64_hi(T1_hi, T1_lo, T2_hi, T2_lo);\n al = sum64_lo(T1_hi, T1_lo, T2_hi, T2_lo);\n }\n\n sum64(this.h, 0, ah, al);\n sum64(this.h, 2, bh, bl);\n sum64(this.h, 4, ch, cl);\n sum64(this.h, 6, dh, dl);\n sum64(this.h, 8, eh, el);\n sum64(this.h, 10, fh, fl);\n sum64(this.h, 12, gh, gl);\n sum64(this.h, 14, hh, hl);\n};\n\nSHA512.prototype._digest = function digest(enc) {\n if (enc === 'hex')\n return utils.toHex32(this.h, 'big');\n else\n return utils.split32(this.h, 'big');\n};\n\nfunction ch64_hi(xh, xl, yh, yl, zh) {\n var r = (xh & yh) ^ ((~xh) & zh);\n if (r < 0)\n r += 0x100000000;\n return r;\n}\n\nfunction ch64_lo(xh, xl, yh, yl, zh, zl) {\n var r = (xl & yl) ^ ((~xl) & zl);\n if (r < 0)\n r += 0x100000000;\n return r;\n}\n\nfunction maj64_hi(xh, xl, yh, yl, zh) {\n var r = (xh & yh) ^ (xh & zh) ^ (yh & zh);\n if (r < 0)\n r += 0x100000000;\n return r;\n}\n\nfunction maj64_lo(xh, xl, yh, yl, zh, zl) {\n var r = (xl & yl) ^ (xl & zl) ^ (yl & zl);\n if (r < 0)\n r += 0x100000000;\n return r;\n}\n\nfunction s0_512_hi(xh, xl) {\n var c0_hi = rotr64_hi(xh, xl, 28);\n var c1_hi = rotr64_hi(xl, xh, 2); // 34\n var c2_hi = rotr64_hi(xl, xh, 7); // 39\n\n var r = c0_hi ^ c1_hi ^ c2_hi;\n if (r < 0)\n r += 0x100000000;\n return r;\n}\n\nfunction s0_512_lo(xh, xl) {\n var c0_lo = rotr64_lo(xh, xl, 28);\n var c1_lo = rotr64_lo(xl, xh, 2); // 34\n var c2_lo = rotr64_lo(xl, xh, 7); // 39\n\n var r = c0_lo ^ c1_lo ^ c2_lo;\n if (r < 0)\n r += 0x100000000;\n return r;\n}\n\nfunction s1_512_hi(xh, xl) {\n var c0_hi = rotr64_hi(xh, xl, 14);\n var c1_hi = rotr64_hi(xh, xl, 18);\n var c2_hi = rotr64_hi(xl, xh, 9); // 41\n\n var r = c0_hi ^ c1_hi ^ c2_hi;\n if (r < 0)\n r += 0x100000000;\n return r;\n}\n\nfunction s1_512_lo(xh, xl) {\n var c0_lo = rotr64_lo(xh, xl, 14);\n var c1_lo = rotr64_lo(xh, xl, 18);\n var c2_lo = rotr64_lo(xl, xh, 9); // 41\n\n var r = c0_lo ^ c1_lo ^ c2_lo;\n if (r < 0)\n r += 0x100000000;\n return r;\n}\n\nfunction g0_512_hi(xh, xl) {\n var c0_hi = rotr64_hi(xh, xl, 1);\n var c1_hi = rotr64_hi(xh, xl, 8);\n var c2_hi = shr64_hi(xh, xl, 7);\n\n var r = c0_hi ^ c1_hi ^ c2_hi;\n if (r < 0)\n r += 0x100000000;\n return r;\n}\n\nfunction g0_512_lo(xh, xl) {\n var c0_lo = rotr64_lo(xh, xl, 1);\n var c1_lo = rotr64_lo(xh, xl, 8);\n var c2_lo = shr64_lo(xh, xl, 7);\n\n var r = c0_lo ^ c1_lo ^ c2_lo;\n if (r < 0)\n r += 0x100000000;\n return r;\n}\n\nfunction g1_512_hi(xh, xl) {\n var c0_hi = rotr64_hi(xh, xl, 19);\n var c1_hi = rotr64_hi(xl, xh, 29); // 61\n var c2_hi = shr64_hi(xh, xl, 6);\n\n var r = c0_hi ^ c1_hi ^ c2_hi;\n if (r < 0)\n r += 0x100000000;\n return r;\n}\n\nfunction g1_512_lo(xh, xl) {\n var c0_lo = rotr64_lo(xh, xl, 19);\n var c1_lo = rotr64_lo(xl, xh, 29); // 61\n var c2_lo = shr64_lo(xh, xl, 6);\n\n var r = c0_lo ^ c1_lo ^ c2_lo;\n if (r < 0)\n r += 0x100000000;\n return r;\n}\n","'use strict';\n\nvar utils = require('../utils');\n\nvar SHA512 = require('./512');\n\nfunction SHA384() {\n if (!(this instanceof SHA384))\n return new SHA384();\n\n SHA512.call(this);\n this.h = [\n 0xcbbb9d5d, 0xc1059ed8,\n 0x629a292a, 0x367cd507,\n 0x9159015a, 0x3070dd17,\n 0x152fecd8, 0xf70e5939,\n 0x67332667, 0xffc00b31,\n 0x8eb44a87, 0x68581511,\n 0xdb0c2e0d, 0x64f98fa7,\n 0x47b5481d, 0xbefa4fa4 ];\n}\nutils.inherits(SHA384, SHA512);\nmodule.exports = SHA384;\n\nSHA384.blockSize = 1024;\nSHA384.outSize = 384;\nSHA384.hmacStrength = 192;\nSHA384.padLength = 128;\n\nSHA384.prototype._digest = function digest(enc) {\n if (enc === 'hex')\n return utils.toHex32(this.h.slice(0, 12), 'big');\n else\n return utils.split32(this.h.slice(0, 12), 'big');\n};\n","'use strict';\n\nexports.sha1 = require('./sha/1');\nexports.sha224 = require('./sha/224');\nexports.sha256 = require('./sha/256');\nexports.sha384 = require('./sha/384');\nexports.sha512 = require('./sha/512');\n","'use strict';\n\nvar utils = require('./utils');\nvar common = require('./common');\n\nvar rotl32 = utils.rotl32;\nvar sum32 = utils.sum32;\nvar sum32_3 = utils.sum32_3;\nvar sum32_4 = utils.sum32_4;\nvar BlockHash = common.BlockHash;\n\nfunction RIPEMD160() {\n if (!(this instanceof RIPEMD160))\n return new RIPEMD160();\n\n BlockHash.call(this);\n\n this.h = [ 0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0 ];\n this.endian = 'little';\n}\nutils.inherits(RIPEMD160, BlockHash);\nexports.ripemd160 = RIPEMD160;\n\nRIPEMD160.blockSize = 512;\nRIPEMD160.outSize = 160;\nRIPEMD160.hmacStrength = 192;\nRIPEMD160.padLength = 64;\n\nRIPEMD160.prototype._update = function update(msg, start) {\n var A = this.h[0];\n var B = this.h[1];\n var C = this.h[2];\n var D = this.h[3];\n var E = this.h[4];\n var Ah = A;\n var Bh = B;\n var Ch = C;\n var Dh = D;\n var Eh = E;\n for (var j = 0; j < 80; j++) {\n var T = sum32(\n rotl32(\n sum32_4(A, f(j, B, C, D), msg[r[j] + start], K(j)),\n s[j]),\n E);\n A = E;\n E = D;\n D = rotl32(C, 10);\n C = B;\n B = T;\n T = sum32(\n rotl32(\n sum32_4(Ah, f(79 - j, Bh, Ch, Dh), msg[rh[j] + start], Kh(j)),\n sh[j]),\n Eh);\n Ah = Eh;\n Eh = Dh;\n Dh = rotl32(Ch, 10);\n Ch = Bh;\n Bh = T;\n }\n T = sum32_3(this.h[1], C, Dh);\n this.h[1] = sum32_3(this.h[2], D, Eh);\n this.h[2] = sum32_3(this.h[3], E, Ah);\n this.h[3] = sum32_3(this.h[4], A, Bh);\n this.h[4] = sum32_3(this.h[0], B, Ch);\n this.h[0] = T;\n};\n\nRIPEMD160.prototype._digest = function digest(enc) {\n if (enc === 'hex')\n return utils.toHex32(this.h, 'little');\n else\n return utils.split32(this.h, 'little');\n};\n\nfunction f(j, x, y, z) {\n if (j <= 15)\n return x ^ y ^ z;\n else if (j <= 31)\n return (x & y) | ((~x) & z);\n else if (j <= 47)\n return (x | (~y)) ^ z;\n else if (j <= 63)\n return (x & z) | (y & (~z));\n else\n return x ^ (y | (~z));\n}\n\nfunction K(j) {\n if (j <= 15)\n return 0x00000000;\n else if (j <= 31)\n return 0x5a827999;\n else if (j <= 47)\n return 0x6ed9eba1;\n else if (j <= 63)\n return 0x8f1bbcdc;\n else\n return 0xa953fd4e;\n}\n\nfunction Kh(j) {\n if (j <= 15)\n return 0x50a28be6;\n else if (j <= 31)\n return 0x5c4dd124;\n else if (j <= 47)\n return 0x6d703ef3;\n else if (j <= 63)\n return 0x7a6d76e9;\n else\n return 0x00000000;\n}\n\nvar r = [\n 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,\n 7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8,\n 3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12,\n 1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2,\n 4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13\n];\n\nvar rh = [\n 5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12,\n 6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2,\n 15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13,\n 8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14,\n 12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11\n];\n\nvar s = [\n 11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8,\n 7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12,\n 11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5,\n 11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12,\n 9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6\n];\n\nvar sh = [\n 8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6,\n 9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11,\n 9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5,\n 15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8,\n 8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11\n];\n","'use strict';\n\nvar utils = require('./utils');\nvar assert = require('minimalistic-assert');\n\nfunction Hmac(hash, key, enc) {\n if (!(this instanceof Hmac))\n return new Hmac(hash, key, enc);\n this.Hash = hash;\n this.blockSize = hash.blockSize / 8;\n this.outSize = hash.outSize / 8;\n this.inner = null;\n this.outer = null;\n\n this._init(utils.toArray(key, enc));\n}\nmodule.exports = Hmac;\n\nHmac.prototype._init = function init(key) {\n // Shorten key, if needed\n if (key.length > this.blockSize)\n key = new this.Hash().update(key).digest();\n assert(key.length <= this.blockSize);\n\n // Add padding to key\n for (var i = key.length; i < this.blockSize; i++)\n key.push(0);\n\n for (i = 0; i < key.length; i++)\n key[i] ^= 0x36;\n this.inner = new this.Hash().update(key);\n\n // 0x36 ^ 0x5c = 0x6a\n for (i = 0; i < key.length; i++)\n key[i] ^= 0x6a;\n this.outer = new this.Hash().update(key);\n};\n\nHmac.prototype.update = function update(msg, enc) {\n this.inner.update(msg, enc);\n return this;\n};\n\nHmac.prototype.digest = function digest(enc) {\n this.outer.update(this.inner.digest());\n return this.outer.digest(enc);\n};\n","var hash = exports;\n\nhash.utils = require('./hash/utils');\nhash.common = require('./hash/common');\nhash.sha = require('./hash/sha');\nhash.ripemd = require('./hash/ripemd');\nhash.hmac = require('./hash/hmac');\n\n// Proxy hash functions to the main object\nhash.sha1 = hash.sha.sha1;\nhash.sha256 = hash.sha.sha256;\nhash.sha224 = hash.sha.sha224;\nhash.sha384 = hash.sha.sha384;\nhash.sha512 = hash.sha.sha512;\nhash.ripemd160 = hash.ripemd.ripemd160;\n","module.exports = {\n doubles: {\n step: 4,\n points: [\n [\n 'e60fce93b59e9ec53011aabc21c23e97b2a31369b87a5ae9c44ee89e2a6dec0a',\n 'f7e3507399e595929db99f34f57937101296891e44d23f0be1f32cce69616821',\n ],\n [\n '8282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508',\n '11f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf',\n ],\n [\n '175e159f728b865a72f99cc6c6fc846de0b93833fd2222ed73fce5b551e5b739',\n 'd3506e0d9e3c79eba4ef97a51ff71f5eacb5955add24345c6efa6ffee9fed695',\n ],\n [\n '363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640',\n '4e273adfc732221953b445397f3363145b9a89008199ecb62003c7f3bee9de9',\n ],\n [\n '8b4b5f165df3c2be8c6244b5b745638843e4a781a15bcd1b69f79a55dffdf80c',\n '4aad0a6f68d308b4b3fbd7813ab0da04f9e336546162ee56b3eff0c65fd4fd36',\n ],\n [\n '723cbaa6e5db996d6bf771c00bd548c7b700dbffa6c0e77bcb6115925232fcda',\n '96e867b5595cc498a921137488824d6e2660a0653779494801dc069d9eb39f5f',\n ],\n [\n 'eebfa4d493bebf98ba5feec812c2d3b50947961237a919839a533eca0e7dd7fa',\n '5d9a8ca3970ef0f269ee7edaf178089d9ae4cdc3a711f712ddfd4fdae1de8999',\n ],\n [\n '100f44da696e71672791d0a09b7bde459f1215a29b3c03bfefd7835b39a48db0',\n 'cdd9e13192a00b772ec8f3300c090666b7ff4a18ff5195ac0fbd5cd62bc65a09',\n ],\n [\n 'e1031be262c7ed1b1dc9227a4a04c017a77f8d4464f3b3852c8acde6e534fd2d',\n '9d7061928940405e6bb6a4176597535af292dd419e1ced79a44f18f29456a00d',\n ],\n [\n 'feea6cae46d55b530ac2839f143bd7ec5cf8b266a41d6af52d5e688d9094696d',\n 'e57c6b6c97dce1bab06e4e12bf3ecd5c981c8957cc41442d3155debf18090088',\n ],\n [\n 'da67a91d91049cdcb367be4be6ffca3cfeed657d808583de33fa978bc1ec6cb1',\n '9bacaa35481642bc41f463f7ec9780e5dec7adc508f740a17e9ea8e27a68be1d',\n ],\n [\n '53904faa0b334cdda6e000935ef22151ec08d0f7bb11069f57545ccc1a37b7c0',\n '5bc087d0bc80106d88c9eccac20d3c1c13999981e14434699dcb096b022771c8',\n ],\n [\n '8e7bcd0bd35983a7719cca7764ca906779b53a043a9b8bcaeff959f43ad86047',\n '10b7770b2a3da4b3940310420ca9514579e88e2e47fd68b3ea10047e8460372a',\n ],\n [\n '385eed34c1cdff21e6d0818689b81bde71a7f4f18397e6690a841e1599c43862',\n '283bebc3e8ea23f56701de19e9ebf4576b304eec2086dc8cc0458fe5542e5453',\n ],\n [\n '6f9d9b803ecf191637c73a4413dfa180fddf84a5947fbc9c606ed86c3fac3a7',\n '7c80c68e603059ba69b8e2a30e45c4d47ea4dd2f5c281002d86890603a842160',\n ],\n [\n '3322d401243c4e2582a2147c104d6ecbf774d163db0f5e5313b7e0e742d0e6bd',\n '56e70797e9664ef5bfb019bc4ddaf9b72805f63ea2873af624f3a2e96c28b2a0',\n ],\n [\n '85672c7d2de0b7da2bd1770d89665868741b3f9af7643397721d74d28134ab83',\n '7c481b9b5b43b2eb6374049bfa62c2e5e77f17fcc5298f44c8e3094f790313a6',\n ],\n [\n '948bf809b1988a46b06c9f1919413b10f9226c60f668832ffd959af60c82a0a',\n '53a562856dcb6646dc6b74c5d1c3418c6d4dff08c97cd2bed4cb7f88d8c8e589',\n ],\n [\n '6260ce7f461801c34f067ce0f02873a8f1b0e44dfc69752accecd819f38fd8e8',\n 'bc2da82b6fa5b571a7f09049776a1ef7ecd292238051c198c1a84e95b2b4ae17',\n ],\n [\n 'e5037de0afc1d8d43d8348414bbf4103043ec8f575bfdc432953cc8d2037fa2d',\n '4571534baa94d3b5f9f98d09fb990bddbd5f5b03ec481f10e0e5dc841d755bda',\n ],\n [\n 'e06372b0f4a207adf5ea905e8f1771b4e7e8dbd1c6a6c5b725866a0ae4fce725',\n '7a908974bce18cfe12a27bb2ad5a488cd7484a7787104870b27034f94eee31dd',\n ],\n [\n '213c7a715cd5d45358d0bbf9dc0ce02204b10bdde2a3f58540ad6908d0559754',\n '4b6dad0b5ae462507013ad06245ba190bb4850f5f36a7eeddff2c27534b458f2',\n ],\n [\n '4e7c272a7af4b34e8dbb9352a5419a87e2838c70adc62cddf0cc3a3b08fbd53c',\n '17749c766c9d0b18e16fd09f6def681b530b9614bff7dd33e0b3941817dcaae6',\n ],\n [\n 'fea74e3dbe778b1b10f238ad61686aa5c76e3db2be43057632427e2840fb27b6',\n '6e0568db9b0b13297cf674deccb6af93126b596b973f7b77701d3db7f23cb96f',\n ],\n [\n '76e64113f677cf0e10a2570d599968d31544e179b760432952c02a4417bdde39',\n 'c90ddf8dee4e95cf577066d70681f0d35e2a33d2b56d2032b4b1752d1901ac01',\n ],\n [\n 'c738c56b03b2abe1e8281baa743f8f9a8f7cc643df26cbee3ab150242bcbb891',\n '893fb578951ad2537f718f2eacbfbbbb82314eef7880cfe917e735d9699a84c3',\n ],\n [\n 'd895626548b65b81e264c7637c972877d1d72e5f3a925014372e9f6588f6c14b',\n 'febfaa38f2bc7eae728ec60818c340eb03428d632bb067e179363ed75d7d991f',\n ],\n [\n 'b8da94032a957518eb0f6433571e8761ceffc73693e84edd49150a564f676e03',\n '2804dfa44805a1e4d7c99cc9762808b092cc584d95ff3b511488e4e74efdf6e7',\n ],\n [\n 'e80fea14441fb33a7d8adab9475d7fab2019effb5156a792f1a11778e3c0df5d',\n 'eed1de7f638e00771e89768ca3ca94472d155e80af322ea9fcb4291b6ac9ec78',\n ],\n [\n 'a301697bdfcd704313ba48e51d567543f2a182031efd6915ddc07bbcc4e16070',\n '7370f91cfb67e4f5081809fa25d40f9b1735dbf7c0a11a130c0d1a041e177ea1',\n ],\n [\n '90ad85b389d6b936463f9d0512678de208cc330b11307fffab7ac63e3fb04ed4',\n 'e507a3620a38261affdcbd9427222b839aefabe1582894d991d4d48cb6ef150',\n ],\n [\n '8f68b9d2f63b5f339239c1ad981f162ee88c5678723ea3351b7b444c9ec4c0da',\n '662a9f2dba063986de1d90c2b6be215dbbea2cfe95510bfdf23cbf79501fff82',\n ],\n [\n 'e4f3fb0176af85d65ff99ff9198c36091f48e86503681e3e6686fd5053231e11',\n '1e63633ad0ef4f1c1661a6d0ea02b7286cc7e74ec951d1c9822c38576feb73bc',\n ],\n [\n '8c00fa9b18ebf331eb961537a45a4266c7034f2f0d4e1d0716fb6eae20eae29e',\n 'efa47267fea521a1a9dc343a3736c974c2fadafa81e36c54e7d2a4c66702414b',\n ],\n [\n 'e7a26ce69dd4829f3e10cec0a9e98ed3143d084f308b92c0997fddfc60cb3e41',\n '2a758e300fa7984b471b006a1aafbb18d0a6b2c0420e83e20e8a9421cf2cfd51',\n ],\n [\n 'b6459e0ee3662ec8d23540c223bcbdc571cbcb967d79424f3cf29eb3de6b80ef',\n '67c876d06f3e06de1dadf16e5661db3c4b3ae6d48e35b2ff30bf0b61a71ba45',\n ],\n [\n 'd68a80c8280bb840793234aa118f06231d6f1fc67e73c5a5deda0f5b496943e8',\n 'db8ba9fff4b586d00c4b1f9177b0e28b5b0e7b8f7845295a294c84266b133120',\n ],\n [\n '324aed7df65c804252dc0270907a30b09612aeb973449cea4095980fc28d3d5d',\n '648a365774b61f2ff130c0c35aec1f4f19213b0c7e332843967224af96ab7c84',\n ],\n [\n '4df9c14919cde61f6d51dfdbe5fee5dceec4143ba8d1ca888e8bd373fd054c96',\n '35ec51092d8728050974c23a1d85d4b5d506cdc288490192ebac06cad10d5d',\n ],\n [\n '9c3919a84a474870faed8a9c1cc66021523489054d7f0308cbfc99c8ac1f98cd',\n 'ddb84f0f4a4ddd57584f044bf260e641905326f76c64c8e6be7e5e03d4fc599d',\n ],\n [\n '6057170b1dd12fdf8de05f281d8e06bb91e1493a8b91d4cc5a21382120a959e5',\n '9a1af0b26a6a4807add9a2daf71df262465152bc3ee24c65e899be932385a2a8',\n ],\n [\n 'a576df8e23a08411421439a4518da31880cef0fba7d4df12b1a6973eecb94266',\n '40a6bf20e76640b2c92b97afe58cd82c432e10a7f514d9f3ee8be11ae1b28ec8',\n ],\n [\n '7778a78c28dec3e30a05fe9629de8c38bb30d1f5cf9a3a208f763889be58ad71',\n '34626d9ab5a5b22ff7098e12f2ff580087b38411ff24ac563b513fc1fd9f43ac',\n ],\n [\n '928955ee637a84463729fd30e7afd2ed5f96274e5ad7e5cb09eda9c06d903ac',\n 'c25621003d3f42a827b78a13093a95eeac3d26efa8a8d83fc5180e935bcd091f',\n ],\n [\n '85d0fef3ec6db109399064f3a0e3b2855645b4a907ad354527aae75163d82751',\n '1f03648413a38c0be29d496e582cf5663e8751e96877331582c237a24eb1f962',\n ],\n [\n 'ff2b0dce97eece97c1c9b6041798b85dfdfb6d8882da20308f5404824526087e',\n '493d13fef524ba188af4c4dc54d07936c7b7ed6fb90e2ceb2c951e01f0c29907',\n ],\n [\n '827fbbe4b1e880ea9ed2b2e6301b212b57f1ee148cd6dd28780e5e2cf856e241',\n 'c60f9c923c727b0b71bef2c67d1d12687ff7a63186903166d605b68baec293ec',\n ],\n [\n 'eaa649f21f51bdbae7be4ae34ce6e5217a58fdce7f47f9aa7f3b58fa2120e2b3',\n 'be3279ed5bbbb03ac69a80f89879aa5a01a6b965f13f7e59d47a5305ba5ad93d',\n ],\n [\n 'e4a42d43c5cf169d9391df6decf42ee541b6d8f0c9a137401e23632dda34d24f',\n '4d9f92e716d1c73526fc99ccfb8ad34ce886eedfa8d8e4f13a7f7131deba9414',\n ],\n [\n '1ec80fef360cbdd954160fadab352b6b92b53576a88fea4947173b9d4300bf19',\n 'aeefe93756b5340d2f3a4958a7abbf5e0146e77f6295a07b671cdc1cc107cefd',\n ],\n [\n '146a778c04670c2f91b00af4680dfa8bce3490717d58ba889ddb5928366642be',\n 'b318e0ec3354028add669827f9d4b2870aaa971d2f7e5ed1d0b297483d83efd0',\n ],\n [\n 'fa50c0f61d22e5f07e3acebb1aa07b128d0012209a28b9776d76a8793180eef9',\n '6b84c6922397eba9b72cd2872281a68a5e683293a57a213b38cd8d7d3f4f2811',\n ],\n [\n 'da1d61d0ca721a11b1a5bf6b7d88e8421a288ab5d5bba5220e53d32b5f067ec2',\n '8157f55a7c99306c79c0766161c91e2966a73899d279b48a655fba0f1ad836f1',\n ],\n [\n 'a8e282ff0c9706907215ff98e8fd416615311de0446f1e062a73b0610d064e13',\n '7f97355b8db81c09abfb7f3c5b2515888b679a3e50dd6bd6cef7c73111f4cc0c',\n ],\n [\n '174a53b9c9a285872d39e56e6913cab15d59b1fa512508c022f382de8319497c',\n 'ccc9dc37abfc9c1657b4155f2c47f9e6646b3a1d8cb9854383da13ac079afa73',\n ],\n [\n '959396981943785c3d3e57edf5018cdbe039e730e4918b3d884fdff09475b7ba',\n '2e7e552888c331dd8ba0386a4b9cd6849c653f64c8709385e9b8abf87524f2fd',\n ],\n [\n 'd2a63a50ae401e56d645a1153b109a8fcca0a43d561fba2dbb51340c9d82b151',\n 'e82d86fb6443fcb7565aee58b2948220a70f750af484ca52d4142174dcf89405',\n ],\n [\n '64587e2335471eb890ee7896d7cfdc866bacbdbd3839317b3436f9b45617e073',\n 'd99fcdd5bf6902e2ae96dd6447c299a185b90a39133aeab358299e5e9faf6589',\n ],\n [\n '8481bde0e4e4d885b3a546d3e549de042f0aa6cea250e7fd358d6c86dd45e458',\n '38ee7b8cba5404dd84a25bf39cecb2ca900a79c42b262e556d64b1b59779057e',\n ],\n [\n '13464a57a78102aa62b6979ae817f4637ffcfed3c4b1ce30bcd6303f6caf666b',\n '69be159004614580ef7e433453ccb0ca48f300a81d0942e13f495a907f6ecc27',\n ],\n [\n 'bc4a9df5b713fe2e9aef430bcc1dc97a0cd9ccede2f28588cada3a0d2d83f366',\n 'd3a81ca6e785c06383937adf4b798caa6e8a9fbfa547b16d758d666581f33c1',\n ],\n [\n '8c28a97bf8298bc0d23d8c749452a32e694b65e30a9472a3954ab30fe5324caa',\n '40a30463a3305193378fedf31f7cc0eb7ae784f0451cb9459e71dc73cbef9482',\n ],\n [\n '8ea9666139527a8c1dd94ce4f071fd23c8b350c5a4bb33748c4ba111faccae0',\n '620efabbc8ee2782e24e7c0cfb95c5d735b783be9cf0f8e955af34a30e62b945',\n ],\n [\n 'dd3625faef5ba06074669716bbd3788d89bdde815959968092f76cc4eb9a9787',\n '7a188fa3520e30d461da2501045731ca941461982883395937f68d00c644a573',\n ],\n [\n 'f710d79d9eb962297e4f6232b40e8f7feb2bc63814614d692c12de752408221e',\n 'ea98e67232d3b3295d3b535532115ccac8612c721851617526ae47a9c77bfc82',\n ],\n ],\n },\n naf: {\n wnd: 7,\n points: [\n [\n 'f9308a019258c31049344f85f89d5229b531c845836f99b08601f113bce036f9',\n '388f7b0f632de8140fe337e62a37f3566500a99934c2231b6cb9fd7584b8e672',\n ],\n [\n '2f8bde4d1a07209355b4a7250a5c5128e88b84bddc619ab7cba8d569b240efe4',\n 'd8ac222636e5e3d6d4dba9dda6c9c426f788271bab0d6840dca87d3aa6ac62d6',\n ],\n [\n '5cbdf0646e5db4eaa398f365f2ea7a0e3d419b7e0330e39ce92bddedcac4f9bc',\n '6aebca40ba255960a3178d6d861a54dba813d0b813fde7b5a5082628087264da',\n ],\n [\n 'acd484e2f0c7f65309ad178a9f559abde09796974c57e714c35f110dfc27ccbe',\n 'cc338921b0a7d9fd64380971763b61e9add888a4375f8e0f05cc262ac64f9c37',\n ],\n [\n '774ae7f858a9411e5ef4246b70c65aac5649980be5c17891bbec17895da008cb',\n 'd984a032eb6b5e190243dd56d7b7b365372db1e2dff9d6a8301d74c9c953c61b',\n ],\n [\n 'f28773c2d975288bc7d1d205c3748651b075fbc6610e58cddeeddf8f19405aa8',\n 'ab0902e8d880a89758212eb65cdaf473a1a06da521fa91f29b5cb52db03ed81',\n ],\n [\n 'd7924d4f7d43ea965a465ae3095ff41131e5946f3c85f79e44adbcf8e27e080e',\n '581e2872a86c72a683842ec228cc6defea40af2bd896d3a5c504dc9ff6a26b58',\n ],\n [\n 'defdea4cdb677750a420fee807eacf21eb9898ae79b9768766e4faa04a2d4a34',\n '4211ab0694635168e997b0ead2a93daeced1f4a04a95c0f6cfb199f69e56eb77',\n ],\n [\n '2b4ea0a797a443d293ef5cff444f4979f06acfebd7e86d277475656138385b6c',\n '85e89bc037945d93b343083b5a1c86131a01f60c50269763b570c854e5c09b7a',\n ],\n [\n '352bbf4a4cdd12564f93fa332ce333301d9ad40271f8107181340aef25be59d5',\n '321eb4075348f534d59c18259dda3e1f4a1b3b2e71b1039c67bd3d8bcf81998c',\n ],\n [\n '2fa2104d6b38d11b0230010559879124e42ab8dfeff5ff29dc9cdadd4ecacc3f',\n '2de1068295dd865b64569335bd5dd80181d70ecfc882648423ba76b532b7d67',\n ],\n [\n '9248279b09b4d68dab21a9b066edda83263c3d84e09572e269ca0cd7f5453714',\n '73016f7bf234aade5d1aa71bdea2b1ff3fc0de2a887912ffe54a32ce97cb3402',\n ],\n [\n 'daed4f2be3a8bf278e70132fb0beb7522f570e144bf615c07e996d443dee8729',\n 'a69dce4a7d6c98e8d4a1aca87ef8d7003f83c230f3afa726ab40e52290be1c55',\n ],\n [\n 'c44d12c7065d812e8acf28d7cbb19f9011ecd9e9fdf281b0e6a3b5e87d22e7db',\n '2119a460ce326cdc76c45926c982fdac0e106e861edf61c5a039063f0e0e6482',\n ],\n [\n '6a245bf6dc698504c89a20cfded60853152b695336c28063b61c65cbd269e6b4',\n 'e022cf42c2bd4a708b3f5126f16a24ad8b33ba48d0423b6efd5e6348100d8a82',\n ],\n [\n '1697ffa6fd9de627c077e3d2fe541084ce13300b0bec1146f95ae57f0d0bd6a5',\n 'b9c398f186806f5d27561506e4557433a2cf15009e498ae7adee9d63d01b2396',\n ],\n [\n '605bdb019981718b986d0f07e834cb0d9deb8360ffb7f61df982345ef27a7479',\n '2972d2de4f8d20681a78d93ec96fe23c26bfae84fb14db43b01e1e9056b8c49',\n ],\n [\n '62d14dab4150bf497402fdc45a215e10dcb01c354959b10cfe31c7e9d87ff33d',\n '80fc06bd8cc5b01098088a1950eed0db01aa132967ab472235f5642483b25eaf',\n ],\n [\n '80c60ad0040f27dade5b4b06c408e56b2c50e9f56b9b8b425e555c2f86308b6f',\n '1c38303f1cc5c30f26e66bad7fe72f70a65eed4cbe7024eb1aa01f56430bd57a',\n ],\n [\n '7a9375ad6167ad54aa74c6348cc54d344cc5dc9487d847049d5eabb0fa03c8fb',\n 'd0e3fa9eca8726909559e0d79269046bdc59ea10c70ce2b02d499ec224dc7f7',\n ],\n [\n 'd528ecd9b696b54c907a9ed045447a79bb408ec39b68df504bb51f459bc3ffc9',\n 'eecf41253136e5f99966f21881fd656ebc4345405c520dbc063465b521409933',\n ],\n [\n '49370a4b5f43412ea25f514e8ecdad05266115e4a7ecb1387231808f8b45963',\n '758f3f41afd6ed428b3081b0512fd62a54c3f3afbb5b6764b653052a12949c9a',\n ],\n [\n '77f230936ee88cbbd73df930d64702ef881d811e0e1498e2f1c13eb1fc345d74',\n '958ef42a7886b6400a08266e9ba1b37896c95330d97077cbbe8eb3c7671c60d6',\n ],\n [\n 'f2dac991cc4ce4b9ea44887e5c7c0bce58c80074ab9d4dbaeb28531b7739f530',\n 'e0dedc9b3b2f8dad4da1f32dec2531df9eb5fbeb0598e4fd1a117dba703a3c37',\n ],\n [\n '463b3d9f662621fb1b4be8fbbe2520125a216cdfc9dae3debcba4850c690d45b',\n '5ed430d78c296c3543114306dd8622d7c622e27c970a1de31cb377b01af7307e',\n ],\n [\n 'f16f804244e46e2a09232d4aff3b59976b98fac14328a2d1a32496b49998f247',\n 'cedabd9b82203f7e13d206fcdf4e33d92a6c53c26e5cce26d6579962c4e31df6',\n ],\n [\n 'caf754272dc84563b0352b7a14311af55d245315ace27c65369e15f7151d41d1',\n 'cb474660ef35f5f2a41b643fa5e460575f4fa9b7962232a5c32f908318a04476',\n ],\n [\n '2600ca4b282cb986f85d0f1709979d8b44a09c07cb86d7c124497bc86f082120',\n '4119b88753c15bd6a693b03fcddbb45d5ac6be74ab5f0ef44b0be9475a7e4b40',\n ],\n [\n '7635ca72d7e8432c338ec53cd12220bc01c48685e24f7dc8c602a7746998e435',\n '91b649609489d613d1d5e590f78e6d74ecfc061d57048bad9e76f302c5b9c61',\n ],\n [\n '754e3239f325570cdbbf4a87deee8a66b7f2b33479d468fbc1a50743bf56cc18',\n '673fb86e5bda30fb3cd0ed304ea49a023ee33d0197a695d0c5d98093c536683',\n ],\n [\n 'e3e6bd1071a1e96aff57859c82d570f0330800661d1c952f9fe2694691d9b9e8',\n '59c9e0bba394e76f40c0aa58379a3cb6a5a2283993e90c4167002af4920e37f5',\n ],\n [\n '186b483d056a033826ae73d88f732985c4ccb1f32ba35f4b4cc47fdcf04aa6eb',\n '3b952d32c67cf77e2e17446e204180ab21fb8090895138b4a4a797f86e80888b',\n ],\n [\n 'df9d70a6b9876ce544c98561f4be4f725442e6d2b737d9c91a8321724ce0963f',\n '55eb2dafd84d6ccd5f862b785dc39d4ab157222720ef9da217b8c45cf2ba2417',\n ],\n [\n '5edd5cc23c51e87a497ca815d5dce0f8ab52554f849ed8995de64c5f34ce7143',\n 'efae9c8dbc14130661e8cec030c89ad0c13c66c0d17a2905cdc706ab7399a868',\n ],\n [\n '290798c2b6476830da12fe02287e9e777aa3fba1c355b17a722d362f84614fba',\n 'e38da76dcd440621988d00bcf79af25d5b29c094db2a23146d003afd41943e7a',\n ],\n [\n 'af3c423a95d9f5b3054754efa150ac39cd29552fe360257362dfdecef4053b45',\n 'f98a3fd831eb2b749a93b0e6f35cfb40c8cd5aa667a15581bc2feded498fd9c6',\n ],\n [\n '766dbb24d134e745cccaa28c99bf274906bb66b26dcf98df8d2fed50d884249a',\n '744b1152eacbe5e38dcc887980da38b897584a65fa06cedd2c924f97cbac5996',\n ],\n [\n '59dbf46f8c94759ba21277c33784f41645f7b44f6c596a58ce92e666191abe3e',\n 'c534ad44175fbc300f4ea6ce648309a042ce739a7919798cd85e216c4a307f6e',\n ],\n [\n 'f13ada95103c4537305e691e74e9a4a8dd647e711a95e73cb62dc6018cfd87b8',\n 'e13817b44ee14de663bf4bc808341f326949e21a6a75c2570778419bdaf5733d',\n ],\n [\n '7754b4fa0e8aced06d4167a2c59cca4cda1869c06ebadfb6488550015a88522c',\n '30e93e864e669d82224b967c3020b8fa8d1e4e350b6cbcc537a48b57841163a2',\n ],\n [\n '948dcadf5990e048aa3874d46abef9d701858f95de8041d2a6828c99e2262519',\n 'e491a42537f6e597d5d28a3224b1bc25df9154efbd2ef1d2cbba2cae5347d57e',\n ],\n [\n '7962414450c76c1689c7b48f8202ec37fb224cf5ac0bfa1570328a8a3d7c77ab',\n '100b610ec4ffb4760d5c1fc133ef6f6b12507a051f04ac5760afa5b29db83437',\n ],\n [\n '3514087834964b54b15b160644d915485a16977225b8847bb0dd085137ec47ca',\n 'ef0afbb2056205448e1652c48e8127fc6039e77c15c2378b7e7d15a0de293311',\n ],\n [\n 'd3cc30ad6b483e4bc79ce2c9dd8bc54993e947eb8df787b442943d3f7b527eaf',\n '8b378a22d827278d89c5e9be8f9508ae3c2ad46290358630afb34db04eede0a4',\n ],\n [\n '1624d84780732860ce1c78fcbfefe08b2b29823db913f6493975ba0ff4847610',\n '68651cf9b6da903e0914448c6cd9d4ca896878f5282be4c8cc06e2a404078575',\n ],\n [\n '733ce80da955a8a26902c95633e62a985192474b5af207da6df7b4fd5fc61cd4',\n 'f5435a2bd2badf7d485a4d8b8db9fcce3e1ef8e0201e4578c54673bc1dc5ea1d',\n ],\n [\n '15d9441254945064cf1a1c33bbd3b49f8966c5092171e699ef258dfab81c045c',\n 'd56eb30b69463e7234f5137b73b84177434800bacebfc685fc37bbe9efe4070d',\n ],\n [\n 'a1d0fcf2ec9de675b612136e5ce70d271c21417c9d2b8aaaac138599d0717940',\n 'edd77f50bcb5a3cab2e90737309667f2641462a54070f3d519212d39c197a629',\n ],\n [\n 'e22fbe15c0af8ccc5780c0735f84dbe9a790badee8245c06c7ca37331cb36980',\n 'a855babad5cd60c88b430a69f53a1a7a38289154964799be43d06d77d31da06',\n ],\n [\n '311091dd9860e8e20ee13473c1155f5f69635e394704eaa74009452246cfa9b3',\n '66db656f87d1f04fffd1f04788c06830871ec5a64feee685bd80f0b1286d8374',\n ],\n [\n '34c1fd04d301be89b31c0442d3e6ac24883928b45a9340781867d4232ec2dbdf',\n '9414685e97b1b5954bd46f730174136d57f1ceeb487443dc5321857ba73abee',\n ],\n [\n 'f219ea5d6b54701c1c14de5b557eb42a8d13f3abbcd08affcc2a5e6b049b8d63',\n '4cb95957e83d40b0f73af4544cccf6b1f4b08d3c07b27fb8d8c2962a400766d1',\n ],\n [\n 'd7b8740f74a8fbaab1f683db8f45de26543a5490bca627087236912469a0b448',\n 'fa77968128d9c92ee1010f337ad4717eff15db5ed3c049b3411e0315eaa4593b',\n ],\n [\n '32d31c222f8f6f0ef86f7c98d3a3335ead5bcd32abdd94289fe4d3091aa824bf',\n '5f3032f5892156e39ccd3d7915b9e1da2e6dac9e6f26e961118d14b8462e1661',\n ],\n [\n '7461f371914ab32671045a155d9831ea8793d77cd59592c4340f86cbc18347b5',\n '8ec0ba238b96bec0cbdddcae0aa442542eee1ff50c986ea6b39847b3cc092ff6',\n ],\n [\n 'ee079adb1df1860074356a25aa38206a6d716b2c3e67453d287698bad7b2b2d6',\n '8dc2412aafe3be5c4c5f37e0ecc5f9f6a446989af04c4e25ebaac479ec1c8c1e',\n ],\n [\n '16ec93e447ec83f0467b18302ee620f7e65de331874c9dc72bfd8616ba9da6b5',\n '5e4631150e62fb40d0e8c2a7ca5804a39d58186a50e497139626778e25b0674d',\n ],\n [\n 'eaa5f980c245f6f038978290afa70b6bd8855897f98b6aa485b96065d537bd99',\n 'f65f5d3e292c2e0819a528391c994624d784869d7e6ea67fb18041024edc07dc',\n ],\n [\n '78c9407544ac132692ee1910a02439958ae04877151342ea96c4b6b35a49f51',\n 'f3e0319169eb9b85d5404795539a5e68fa1fbd583c064d2462b675f194a3ddb4',\n ],\n [\n '494f4be219a1a77016dcd838431aea0001cdc8ae7a6fc688726578d9702857a5',\n '42242a969283a5f339ba7f075e36ba2af925ce30d767ed6e55f4b031880d562c',\n ],\n [\n 'a598a8030da6d86c6bc7f2f5144ea549d28211ea58faa70ebf4c1e665c1fe9b5',\n '204b5d6f84822c307e4b4a7140737aec23fc63b65b35f86a10026dbd2d864e6b',\n ],\n [\n 'c41916365abb2b5d09192f5f2dbeafec208f020f12570a184dbadc3e58595997',\n '4f14351d0087efa49d245b328984989d5caf9450f34bfc0ed16e96b58fa9913',\n ],\n [\n '841d6063a586fa475a724604da03bc5b92a2e0d2e0a36acfe4c73a5514742881',\n '73867f59c0659e81904f9a1c7543698e62562d6744c169ce7a36de01a8d6154',\n ],\n [\n '5e95bb399a6971d376026947f89bde2f282b33810928be4ded112ac4d70e20d5',\n '39f23f366809085beebfc71181313775a99c9aed7d8ba38b161384c746012865',\n ],\n [\n '36e4641a53948fd476c39f8a99fd974e5ec07564b5315d8bf99471bca0ef2f66',\n 'd2424b1b1abe4eb8164227b085c9aa9456ea13493fd563e06fd51cf5694c78fc',\n ],\n [\n '336581ea7bfbbb290c191a2f507a41cf5643842170e914faeab27c2c579f726',\n 'ead12168595fe1be99252129b6e56b3391f7ab1410cd1e0ef3dcdcabd2fda224',\n ],\n [\n '8ab89816dadfd6b6a1f2634fcf00ec8403781025ed6890c4849742706bd43ede',\n '6fdcef09f2f6d0a044e654aef624136f503d459c3e89845858a47a9129cdd24e',\n ],\n [\n '1e33f1a746c9c5778133344d9299fcaa20b0938e8acff2544bb40284b8c5fb94',\n '60660257dd11b3aa9c8ed618d24edff2306d320f1d03010e33a7d2057f3b3b6',\n ],\n [\n '85b7c1dcb3cec1b7ee7f30ded79dd20a0ed1f4cc18cbcfcfa410361fd8f08f31',\n '3d98a9cdd026dd43f39048f25a8847f4fcafad1895d7a633c6fed3c35e999511',\n ],\n [\n '29df9fbd8d9e46509275f4b125d6d45d7fbe9a3b878a7af872a2800661ac5f51',\n 'b4c4fe99c775a606e2d8862179139ffda61dc861c019e55cd2876eb2a27d84b',\n ],\n [\n 'a0b1cae06b0a847a3fea6e671aaf8adfdfe58ca2f768105c8082b2e449fce252',\n 'ae434102edde0958ec4b19d917a6a28e6b72da1834aff0e650f049503a296cf2',\n ],\n [\n '4e8ceafb9b3e9a136dc7ff67e840295b499dfb3b2133e4ba113f2e4c0e121e5',\n 'cf2174118c8b6d7a4b48f6d534ce5c79422c086a63460502b827ce62a326683c',\n ],\n [\n 'd24a44e047e19b6f5afb81c7ca2f69080a5076689a010919f42725c2b789a33b',\n '6fb8d5591b466f8fc63db50f1c0f1c69013f996887b8244d2cdec417afea8fa3',\n ],\n [\n 'ea01606a7a6c9cdd249fdfcfacb99584001edd28abbab77b5104e98e8e3b35d4',\n '322af4908c7312b0cfbfe369f7a7b3cdb7d4494bc2823700cfd652188a3ea98d',\n ],\n [\n 'af8addbf2b661c8a6c6328655eb96651252007d8c5ea31be4ad196de8ce2131f',\n '6749e67c029b85f52a034eafd096836b2520818680e26ac8f3dfbcdb71749700',\n ],\n [\n 'e3ae1974566ca06cc516d47e0fb165a674a3dabcfca15e722f0e3450f45889',\n '2aeabe7e4531510116217f07bf4d07300de97e4874f81f533420a72eeb0bd6a4',\n ],\n [\n '591ee355313d99721cf6993ffed1e3e301993ff3ed258802075ea8ced397e246',\n 'b0ea558a113c30bea60fc4775460c7901ff0b053d25ca2bdeee98f1a4be5d196',\n ],\n [\n '11396d55fda54c49f19aa97318d8da61fa8584e47b084945077cf03255b52984',\n '998c74a8cd45ac01289d5833a7beb4744ff536b01b257be4c5767bea93ea57a4',\n ],\n [\n '3c5d2a1ba39c5a1790000738c9e0c40b8dcdfd5468754b6405540157e017aa7a',\n 'b2284279995a34e2f9d4de7396fc18b80f9b8b9fdd270f6661f79ca4c81bd257',\n ],\n [\n 'cc8704b8a60a0defa3a99a7299f2e9c3fbc395afb04ac078425ef8a1793cc030',\n 'bdd46039feed17881d1e0862db347f8cf395b74fc4bcdc4e940b74e3ac1f1b13',\n ],\n [\n 'c533e4f7ea8555aacd9777ac5cad29b97dd4defccc53ee7ea204119b2889b197',\n '6f0a256bc5efdf429a2fb6242f1a43a2d9b925bb4a4b3a26bb8e0f45eb596096',\n ],\n [\n 'c14f8f2ccb27d6f109f6d08d03cc96a69ba8c34eec07bbcf566d48e33da6593',\n 'c359d6923bb398f7fd4473e16fe1c28475b740dd098075e6c0e8649113dc3a38',\n ],\n [\n 'a6cbc3046bc6a450bac24789fa17115a4c9739ed75f8f21ce441f72e0b90e6ef',\n '21ae7f4680e889bb130619e2c0f95a360ceb573c70603139862afd617fa9b9f',\n ],\n [\n '347d6d9a02c48927ebfb86c1359b1caf130a3c0267d11ce6344b39f99d43cc38',\n '60ea7f61a353524d1c987f6ecec92f086d565ab687870cb12689ff1e31c74448',\n ],\n [\n 'da6545d2181db8d983f7dcb375ef5866d47c67b1bf31c8cf855ef7437b72656a',\n '49b96715ab6878a79e78f07ce5680c5d6673051b4935bd897fea824b77dc208a',\n ],\n [\n 'c40747cc9d012cb1a13b8148309c6de7ec25d6945d657146b9d5994b8feb1111',\n '5ca560753be2a12fc6de6caf2cb489565db936156b9514e1bb5e83037e0fa2d4',\n ],\n [\n '4e42c8ec82c99798ccf3a610be870e78338c7f713348bd34c8203ef4037f3502',\n '7571d74ee5e0fb92a7a8b33a07783341a5492144cc54bcc40a94473693606437',\n ],\n [\n '3775ab7089bc6af823aba2e1af70b236d251cadb0c86743287522a1b3b0dedea',\n 'be52d107bcfa09d8bcb9736a828cfa7fac8db17bf7a76a2c42ad961409018cf7',\n ],\n [\n 'cee31cbf7e34ec379d94fb814d3d775ad954595d1314ba8846959e3e82f74e26',\n '8fd64a14c06b589c26b947ae2bcf6bfa0149ef0be14ed4d80f448a01c43b1c6d',\n ],\n [\n 'b4f9eaea09b6917619f6ea6a4eb5464efddb58fd45b1ebefcdc1a01d08b47986',\n '39e5c9925b5a54b07433a4f18c61726f8bb131c012ca542eb24a8ac07200682a',\n ],\n [\n 'd4263dfc3d2df923a0179a48966d30ce84e2515afc3dccc1b77907792ebcc60e',\n '62dfaf07a0f78feb30e30d6295853ce189e127760ad6cf7fae164e122a208d54',\n ],\n [\n '48457524820fa65a4f8d35eb6930857c0032acc0a4a2de422233eeda897612c4',\n '25a748ab367979d98733c38a1fa1c2e7dc6cc07db2d60a9ae7a76aaa49bd0f77',\n ],\n [\n 'dfeeef1881101f2cb11644f3a2afdfc2045e19919152923f367a1767c11cceda',\n 'ecfb7056cf1de042f9420bab396793c0c390bde74b4bbdff16a83ae09a9a7517',\n ],\n [\n '6d7ef6b17543f8373c573f44e1f389835d89bcbc6062ced36c82df83b8fae859',\n 'cd450ec335438986dfefa10c57fea9bcc521a0959b2d80bbf74b190dca712d10',\n ],\n [\n 'e75605d59102a5a2684500d3b991f2e3f3c88b93225547035af25af66e04541f',\n 'f5c54754a8f71ee540b9b48728473e314f729ac5308b06938360990e2bfad125',\n ],\n [\n 'eb98660f4c4dfaa06a2be453d5020bc99a0c2e60abe388457dd43fefb1ed620c',\n '6cb9a8876d9cb8520609af3add26cd20a0a7cd8a9411131ce85f44100099223e',\n ],\n [\n '13e87b027d8514d35939f2e6892b19922154596941888336dc3563e3b8dba942',\n 'fef5a3c68059a6dec5d624114bf1e91aac2b9da568d6abeb2570d55646b8adf1',\n ],\n [\n 'ee163026e9fd6fe017c38f06a5be6fc125424b371ce2708e7bf4491691e5764a',\n '1acb250f255dd61c43d94ccc670d0f58f49ae3fa15b96623e5430da0ad6c62b2',\n ],\n [\n 'b268f5ef9ad51e4d78de3a750c2dc89b1e626d43505867999932e5db33af3d80',\n '5f310d4b3c99b9ebb19f77d41c1dee018cf0d34fd4191614003e945a1216e423',\n ],\n [\n 'ff07f3118a9df035e9fad85eb6c7bfe42b02f01ca99ceea3bf7ffdba93c4750d',\n '438136d603e858a3a5c440c38eccbaddc1d2942114e2eddd4740d098ced1f0d8',\n ],\n [\n '8d8b9855c7c052a34146fd20ffb658bea4b9f69e0d825ebec16e8c3ce2b526a1',\n 'cdb559eedc2d79f926baf44fb84ea4d44bcf50fee51d7ceb30e2e7f463036758',\n ],\n [\n '52db0b5384dfbf05bfa9d472d7ae26dfe4b851ceca91b1eba54263180da32b63',\n 'c3b997d050ee5d423ebaf66a6db9f57b3180c902875679de924b69d84a7b375',\n ],\n [\n 'e62f9490d3d51da6395efd24e80919cc7d0f29c3f3fa48c6fff543becbd43352',\n '6d89ad7ba4876b0b22c2ca280c682862f342c8591f1daf5170e07bfd9ccafa7d',\n ],\n [\n '7f30ea2476b399b4957509c88f77d0191afa2ff5cb7b14fd6d8e7d65aaab1193',\n 'ca5ef7d4b231c94c3b15389a5f6311e9daff7bb67b103e9880ef4bff637acaec',\n ],\n [\n '5098ff1e1d9f14fb46a210fada6c903fef0fb7b4a1dd1d9ac60a0361800b7a00',\n '9731141d81fc8f8084d37c6e7542006b3ee1b40d60dfe5362a5b132fd17ddc0',\n ],\n [\n '32b78c7de9ee512a72895be6b9cbefa6e2f3c4ccce445c96b9f2c81e2778ad58',\n 'ee1849f513df71e32efc3896ee28260c73bb80547ae2275ba497237794c8753c',\n ],\n [\n 'e2cb74fddc8e9fbcd076eef2a7c72b0ce37d50f08269dfc074b581550547a4f7',\n 'd3aa2ed71c9dd2247a62df062736eb0baddea9e36122d2be8641abcb005cc4a4',\n ],\n [\n '8438447566d4d7bedadc299496ab357426009a35f235cb141be0d99cd10ae3a8',\n 'c4e1020916980a4da5d01ac5e6ad330734ef0d7906631c4f2390426b2edd791f',\n ],\n [\n '4162d488b89402039b584c6fc6c308870587d9c46f660b878ab65c82c711d67e',\n '67163e903236289f776f22c25fb8a3afc1732f2b84b4e95dbda47ae5a0852649',\n ],\n [\n '3fad3fa84caf0f34f0f89bfd2dcf54fc175d767aec3e50684f3ba4a4bf5f683d',\n 'cd1bc7cb6cc407bb2f0ca647c718a730cf71872e7d0d2a53fa20efcdfe61826',\n ],\n [\n '674f2600a3007a00568c1a7ce05d0816c1fb84bf1370798f1c69532faeb1a86b',\n '299d21f9413f33b3edf43b257004580b70db57da0b182259e09eecc69e0d38a5',\n ],\n [\n 'd32f4da54ade74abb81b815ad1fb3b263d82d6c692714bcff87d29bd5ee9f08f',\n 'f9429e738b8e53b968e99016c059707782e14f4535359d582fc416910b3eea87',\n ],\n [\n '30e4e670435385556e593657135845d36fbb6931f72b08cb1ed954f1e3ce3ff6',\n '462f9bce619898638499350113bbc9b10a878d35da70740dc695a559eb88db7b',\n ],\n [\n 'be2062003c51cc3004682904330e4dee7f3dcd10b01e580bf1971b04d4cad297',\n '62188bc49d61e5428573d48a74e1c655b1c61090905682a0d5558ed72dccb9bc',\n ],\n [\n '93144423ace3451ed29e0fb9ac2af211cb6e84a601df5993c419859fff5df04a',\n '7c10dfb164c3425f5c71a3f9d7992038f1065224f72bb9d1d902a6d13037b47c',\n ],\n [\n 'b015f8044f5fcbdcf21ca26d6c34fb8197829205c7b7d2a7cb66418c157b112c',\n 'ab8c1e086d04e813744a655b2df8d5f83b3cdc6faa3088c1d3aea1454e3a1d5f',\n ],\n [\n 'd5e9e1da649d97d89e4868117a465a3a4f8a18de57a140d36b3f2af341a21b52',\n '4cb04437f391ed73111a13cc1d4dd0db1693465c2240480d8955e8592f27447a',\n ],\n [\n 'd3ae41047dd7ca065dbf8ed77b992439983005cd72e16d6f996a5316d36966bb',\n 'bd1aeb21ad22ebb22a10f0303417c6d964f8cdd7df0aca614b10dc14d125ac46',\n ],\n [\n '463e2763d885f958fc66cdd22800f0a487197d0a82e377b49f80af87c897b065',\n 'bfefacdb0e5d0fd7df3a311a94de062b26b80c61fbc97508b79992671ef7ca7f',\n ],\n [\n '7985fdfd127c0567c6f53ec1bb63ec3158e597c40bfe747c83cddfc910641917',\n '603c12daf3d9862ef2b25fe1de289aed24ed291e0ec6708703a5bd567f32ed03',\n ],\n [\n '74a1ad6b5f76e39db2dd249410eac7f99e74c59cb83d2d0ed5ff1543da7703e9',\n 'cc6157ef18c9c63cd6193d83631bbea0093e0968942e8c33d5737fd790e0db08',\n ],\n [\n '30682a50703375f602d416664ba19b7fc9bab42c72747463a71d0896b22f6da3',\n '553e04f6b018b4fa6c8f39e7f311d3176290d0e0f19ca73f17714d9977a22ff8',\n ],\n [\n '9e2158f0d7c0d5f26c3791efefa79597654e7a2b2464f52b1ee6c1347769ef57',\n '712fcdd1b9053f09003a3481fa7762e9ffd7c8ef35a38509e2fbf2629008373',\n ],\n [\n '176e26989a43c9cfeba4029c202538c28172e566e3c4fce7322857f3be327d66',\n 'ed8cc9d04b29eb877d270b4878dc43c19aefd31f4eee09ee7b47834c1fa4b1c3',\n ],\n [\n '75d46efea3771e6e68abb89a13ad747ecf1892393dfc4f1b7004788c50374da8',\n '9852390a99507679fd0b86fd2b39a868d7efc22151346e1a3ca4726586a6bed8',\n ],\n [\n '809a20c67d64900ffb698c4c825f6d5f2310fb0451c869345b7319f645605721',\n '9e994980d9917e22b76b061927fa04143d096ccc54963e6a5ebfa5f3f8e286c1',\n ],\n [\n '1b38903a43f7f114ed4500b4eac7083fdefece1cf29c63528d563446f972c180',\n '4036edc931a60ae889353f77fd53de4a2708b26b6f5da72ad3394119daf408f9',\n ],\n ],\n },\n};\n","'use strict';\n\nvar curves = exports;\n\nvar hash = require('hash.js');\nvar curve = require('./curve');\nvar utils = require('./utils');\n\nvar assert = utils.assert;\n\nfunction PresetCurve(options) {\n if (options.type === 'short')\n this.curve = new curve.short(options);\n else if (options.type === 'edwards')\n this.curve = new curve.edwards(options);\n else\n this.curve = new curve.mont(options);\n this.g = this.curve.g;\n this.n = this.curve.n;\n this.hash = options.hash;\n\n assert(this.g.validate(), 'Invalid curve');\n assert(this.g.mul(this.n).isInfinity(), 'Invalid curve, G*N != O');\n}\ncurves.PresetCurve = PresetCurve;\n\nfunction defineCurve(name, options) {\n Object.defineProperty(curves, name, {\n configurable: true,\n enumerable: true,\n get: function() {\n var curve = new PresetCurve(options);\n Object.defineProperty(curves, name, {\n configurable: true,\n enumerable: true,\n value: curve,\n });\n return curve;\n },\n });\n}\n\ndefineCurve('p192', {\n type: 'short',\n prime: 'p192',\n p: 'ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff',\n a: 'ffffffff ffffffff ffffffff fffffffe ffffffff fffffffc',\n b: '64210519 e59c80e7 0fa7e9ab 72243049 feb8deec c146b9b1',\n n: 'ffffffff ffffffff ffffffff 99def836 146bc9b1 b4d22831',\n hash: hash.sha256,\n gRed: false,\n g: [\n '188da80e b03090f6 7cbf20eb 43a18800 f4ff0afd 82ff1012',\n '07192b95 ffc8da78 631011ed 6b24cdd5 73f977a1 1e794811',\n ],\n});\n\ndefineCurve('p224', {\n type: 'short',\n prime: 'p224',\n p: 'ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001',\n a: 'ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff fffffffe',\n b: 'b4050a85 0c04b3ab f5413256 5044b0b7 d7bfd8ba 270b3943 2355ffb4',\n n: 'ffffffff ffffffff ffffffff ffff16a2 e0b8f03e 13dd2945 5c5c2a3d',\n hash: hash.sha256,\n gRed: false,\n g: [\n 'b70e0cbd 6bb4bf7f 321390b9 4a03c1d3 56c21122 343280d6 115c1d21',\n 'bd376388 b5f723fb 4c22dfe6 cd4375a0 5a074764 44d58199 85007e34',\n ],\n});\n\ndefineCurve('p256', {\n type: 'short',\n prime: null,\n p: 'ffffffff 00000001 00000000 00000000 00000000 ffffffff ffffffff ffffffff',\n a: 'ffffffff 00000001 00000000 00000000 00000000 ffffffff ffffffff fffffffc',\n b: '5ac635d8 aa3a93e7 b3ebbd55 769886bc 651d06b0 cc53b0f6 3bce3c3e 27d2604b',\n n: 'ffffffff 00000000 ffffffff ffffffff bce6faad a7179e84 f3b9cac2 fc632551',\n hash: hash.sha256,\n gRed: false,\n g: [\n '6b17d1f2 e12c4247 f8bce6e5 63a440f2 77037d81 2deb33a0 f4a13945 d898c296',\n '4fe342e2 fe1a7f9b 8ee7eb4a 7c0f9e16 2bce3357 6b315ece cbb64068 37bf51f5',\n ],\n});\n\ndefineCurve('p384', {\n type: 'short',\n prime: null,\n p: 'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ' +\n 'fffffffe ffffffff 00000000 00000000 ffffffff',\n a: 'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ' +\n 'fffffffe ffffffff 00000000 00000000 fffffffc',\n b: 'b3312fa7 e23ee7e4 988e056b e3f82d19 181d9c6e fe814112 0314088f ' +\n '5013875a c656398d 8a2ed19d 2a85c8ed d3ec2aef',\n n: 'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff c7634d81 ' +\n 'f4372ddf 581a0db2 48b0a77a ecec196a ccc52973',\n hash: hash.sha384,\n gRed: false,\n g: [\n 'aa87ca22 be8b0537 8eb1c71e f320ad74 6e1d3b62 8ba79b98 59f741e0 82542a38 ' +\n '5502f25d bf55296c 3a545e38 72760ab7',\n '3617de4a 96262c6f 5d9e98bf 9292dc29 f8f41dbd 289a147c e9da3113 b5f0b8c0 ' +\n '0a60b1ce 1d7e819d 7a431d7c 90ea0e5f',\n ],\n});\n\ndefineCurve('p521', {\n type: 'short',\n prime: null,\n p: '000001ff ffffffff ffffffff ffffffff ffffffff ffffffff ' +\n 'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ' +\n 'ffffffff ffffffff ffffffff ffffffff ffffffff',\n a: '000001ff ffffffff ffffffff ffffffff ffffffff ffffffff ' +\n 'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ' +\n 'ffffffff ffffffff ffffffff ffffffff fffffffc',\n b: '00000051 953eb961 8e1c9a1f 929a21a0 b68540ee a2da725b ' +\n '99b315f3 b8b48991 8ef109e1 56193951 ec7e937b 1652c0bd ' +\n '3bb1bf07 3573df88 3d2c34f1 ef451fd4 6b503f00',\n n: '000001ff ffffffff ffffffff ffffffff ffffffff ffffffff ' +\n 'ffffffff ffffffff fffffffa 51868783 bf2f966b 7fcc0148 ' +\n 'f709a5d0 3bb5c9b8 899c47ae bb6fb71e 91386409',\n hash: hash.sha512,\n gRed: false,\n g: [\n '000000c6 858e06b7 0404e9cd 9e3ecb66 2395b442 9c648139 ' +\n '053fb521 f828af60 6b4d3dba a14b5e77 efe75928 fe1dc127 ' +\n 'a2ffa8de 3348b3c1 856a429b f97e7e31 c2e5bd66',\n '00000118 39296a78 9a3bc004 5c8a5fb4 2c7d1bd9 98f54449 ' +\n '579b4468 17afbd17 273e662c 97ee7299 5ef42640 c550b901 ' +\n '3fad0761 353c7086 a272c240 88be9476 9fd16650',\n ],\n});\n\ndefineCurve('curve25519', {\n type: 'mont',\n prime: 'p25519',\n p: '7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed',\n a: '76d06',\n b: '1',\n n: '1000000000000000 0000000000000000 14def9dea2f79cd6 5812631a5cf5d3ed',\n hash: hash.sha256,\n gRed: false,\n g: [\n '9',\n ],\n});\n\ndefineCurve('ed25519', {\n type: 'edwards',\n prime: 'p25519',\n p: '7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed',\n a: '-1',\n c: '1',\n // -121665 * (121666^(-1)) (mod P)\n d: '52036cee2b6ffe73 8cc740797779e898 00700a4d4141d8ab 75eb4dca135978a3',\n n: '1000000000000000 0000000000000000 14def9dea2f79cd6 5812631a5cf5d3ed',\n hash: hash.sha256,\n gRed: false,\n g: [\n '216936d3cd6e53fec0a4e231fdd6dc5c692cc7609525a7b2c9562d608f25d51a',\n\n // 4/5\n '6666666666666666666666666666666666666666666666666666666666666658',\n ],\n});\n\nvar pre;\ntry {\n pre = require('./precomputed/secp256k1');\n} catch (e) {\n pre = undefined;\n}\n\ndefineCurve('secp256k1', {\n type: 'short',\n prime: 'k256',\n p: 'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f',\n a: '0',\n b: '7',\n n: 'ffffffff ffffffff ffffffff fffffffe baaedce6 af48a03b bfd25e8c d0364141',\n h: '1',\n hash: hash.sha256,\n\n // Precomputed endomorphism\n beta: '7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee',\n lambda: '5363ad4cc05c30e0a5261c028812645a122e22ea20816678df02967c1b23bd72',\n basis: [\n {\n a: '3086d221a7d46bcde86c90e49284eb15',\n b: '-e4437ed6010e88286f547fa90abfe4c3',\n },\n {\n a: '114ca50f7a8e2f3f657c1108d9d44cfd8',\n b: '3086d221a7d46bcde86c90e49284eb15',\n },\n ],\n\n gRed: false,\n g: [\n '79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798',\n '483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8',\n pre,\n ],\n});\n","'use strict';\n\nvar hash = require('hash.js');\nvar utils = require('minimalistic-crypto-utils');\nvar assert = require('minimalistic-assert');\n\nfunction HmacDRBG(options) {\n if (!(this instanceof HmacDRBG))\n return new HmacDRBG(options);\n this.hash = options.hash;\n this.predResist = !!options.predResist;\n\n this.outLen = this.hash.outSize;\n this.minEntropy = options.minEntropy || this.hash.hmacStrength;\n\n this._reseed = null;\n this.reseedInterval = null;\n this.K = null;\n this.V = null;\n\n var entropy = utils.toArray(options.entropy, options.entropyEnc || 'hex');\n var nonce = utils.toArray(options.nonce, options.nonceEnc || 'hex');\n var pers = utils.toArray(options.pers, options.persEnc || 'hex');\n assert(entropy.length >= (this.minEntropy / 8),\n 'Not enough entropy. Minimum is: ' + this.minEntropy + ' bits');\n this._init(entropy, nonce, pers);\n}\nmodule.exports = HmacDRBG;\n\nHmacDRBG.prototype._init = function init(entropy, nonce, pers) {\n var seed = entropy.concat(nonce).concat(pers);\n\n this.K = new Array(this.outLen / 8);\n this.V = new Array(this.outLen / 8);\n for (var i = 0; i < this.V.length; i++) {\n this.K[i] = 0x00;\n this.V[i] = 0x01;\n }\n\n this._update(seed);\n this._reseed = 1;\n this.reseedInterval = 0x1000000000000; // 2^48\n};\n\nHmacDRBG.prototype._hmac = function hmac() {\n return new hash.hmac(this.hash, this.K);\n};\n\nHmacDRBG.prototype._update = function update(seed) {\n var kmac = this._hmac()\n .update(this.V)\n .update([ 0x00 ]);\n if (seed)\n kmac = kmac.update(seed);\n this.K = kmac.digest();\n this.V = this._hmac().update(this.V).digest();\n if (!seed)\n return;\n\n this.K = this._hmac()\n .update(this.V)\n .update([ 0x01 ])\n .update(seed)\n .digest();\n this.V = this._hmac().update(this.V).digest();\n};\n\nHmacDRBG.prototype.reseed = function reseed(entropy, entropyEnc, add, addEnc) {\n // Optional entropy enc\n if (typeof entropyEnc !== 'string') {\n addEnc = add;\n add = entropyEnc;\n entropyEnc = null;\n }\n\n entropy = utils.toArray(entropy, entropyEnc);\n add = utils.toArray(add, addEnc);\n\n assert(entropy.length >= (this.minEntropy / 8),\n 'Not enough entropy. Minimum is: ' + this.minEntropy + ' bits');\n\n this._update(entropy.concat(add || []));\n this._reseed = 1;\n};\n\nHmacDRBG.prototype.generate = function generate(len, enc, add, addEnc) {\n if (this._reseed > this.reseedInterval)\n throw new Error('Reseed is required');\n\n // Optional encoding\n if (typeof enc !== 'string') {\n addEnc = add;\n add = enc;\n enc = null;\n }\n\n // Optional additional data\n if (add) {\n add = utils.toArray(add, addEnc || 'hex');\n this._update(add);\n }\n\n var temp = [];\n while (temp.length < len) {\n this.V = this._hmac().update(this.V).digest();\n temp = temp.concat(this.V);\n }\n\n var res = temp.slice(0, len);\n this._update(add);\n this._reseed++;\n return utils.encode(res, enc);\n};\n","'use strict';\n\nvar BN = require('bn.js');\nvar utils = require('../utils');\nvar assert = utils.assert;\n\nfunction KeyPair(ec, options) {\n this.ec = ec;\n this.priv = null;\n this.pub = null;\n\n // KeyPair(ec, { priv: ..., pub: ... })\n if (options.priv)\n this._importPrivate(options.priv, options.privEnc);\n if (options.pub)\n this._importPublic(options.pub, options.pubEnc);\n}\nmodule.exports = KeyPair;\n\nKeyPair.fromPublic = function fromPublic(ec, pub, enc) {\n if (pub instanceof KeyPair)\n return pub;\n\n return new KeyPair(ec, {\n pub: pub,\n pubEnc: enc,\n });\n};\n\nKeyPair.fromPrivate = function fromPrivate(ec, priv, enc) {\n if (priv instanceof KeyPair)\n return priv;\n\n return new KeyPair(ec, {\n priv: priv,\n privEnc: enc,\n });\n};\n\nKeyPair.prototype.validate = function validate() {\n var pub = this.getPublic();\n\n if (pub.isInfinity())\n return { result: false, reason: 'Invalid public key' };\n if (!pub.validate())\n return { result: false, reason: 'Public key is not a point' };\n if (!pub.mul(this.ec.curve.n).isInfinity())\n return { result: false, reason: 'Public key * N != O' };\n\n return { result: true, reason: null };\n};\n\nKeyPair.prototype.getPublic = function getPublic(compact, enc) {\n // compact is optional argument\n if (typeof compact === 'string') {\n enc = compact;\n compact = null;\n }\n\n if (!this.pub)\n this.pub = this.ec.g.mul(this.priv);\n\n if (!enc)\n return this.pub;\n\n return this.pub.encode(enc, compact);\n};\n\nKeyPair.prototype.getPrivate = function getPrivate(enc) {\n if (enc === 'hex')\n return this.priv.toString(16, 2);\n else\n return this.priv;\n};\n\nKeyPair.prototype._importPrivate = function _importPrivate(key, enc) {\n this.priv = new BN(key, enc || 16);\n\n // Ensure that the priv won't be bigger than n, otherwise we may fail\n // in fixed multiplication method\n this.priv = this.priv.umod(this.ec.curve.n);\n};\n\nKeyPair.prototype._importPublic = function _importPublic(key, enc) {\n if (key.x || key.y) {\n // Montgomery points only have an `x` coordinate.\n // Weierstrass/Edwards points on the other hand have both `x` and\n // `y` coordinates.\n if (this.ec.curve.type === 'mont') {\n assert(key.x, 'Need x coordinate');\n } else if (this.ec.curve.type === 'short' ||\n this.ec.curve.type === 'edwards') {\n assert(key.x && key.y, 'Need both x and y coordinate');\n }\n this.pub = this.ec.curve.point(key.x, key.y);\n return;\n }\n this.pub = this.ec.curve.decodePoint(key, enc);\n};\n\n// ECDH\nKeyPair.prototype.derive = function derive(pub) {\n if(!pub.validate()) {\n assert(pub.validate(), 'public point not validated');\n }\n return pub.mul(this.priv).getX();\n};\n\n// ECDSA\nKeyPair.prototype.sign = function sign(msg, enc, options) {\n return this.ec.sign(msg, this, enc, options);\n};\n\nKeyPair.prototype.verify = function verify(msg, signature, options) {\n return this.ec.verify(msg, signature, this, undefined, options);\n};\n\nKeyPair.prototype.inspect = function inspect() {\n return '<Key priv: ' + (this.priv && this.priv.toString(16, 2)) +\n ' pub: ' + (this.pub && this.pub.inspect()) + ' >';\n};\n","'use strict';\n\nvar BN = require('bn.js');\n\nvar utils = require('../utils');\nvar assert = utils.assert;\n\nfunction Signature(options, enc) {\n if (options instanceof Signature)\n return options;\n\n if (this._importDER(options, enc))\n return;\n\n assert(options.r && options.s, 'Signature without r or s');\n this.r = new BN(options.r, 16);\n this.s = new BN(options.s, 16);\n if (options.recoveryParam === undefined)\n this.recoveryParam = null;\n else\n this.recoveryParam = options.recoveryParam;\n}\nmodule.exports = Signature;\n\nfunction Position() {\n this.place = 0;\n}\n\nfunction getLength(buf, p) {\n var initial = buf[p.place++];\n if (!(initial & 0x80)) {\n return initial;\n }\n var octetLen = initial & 0xf;\n\n // Indefinite length or overflow\n if (octetLen === 0 || octetLen > 4) {\n return false;\n }\n\n if(buf[p.place] === 0x00) {\n return false;\n }\n\n var val = 0;\n for (var i = 0, off = p.place; i < octetLen; i++, off++) {\n val <<= 8;\n val |= buf[off];\n val >>>= 0;\n }\n\n // Leading zeroes\n if (val <= 0x7f) {\n return false;\n }\n\n p.place = off;\n return val;\n}\n\nfunction rmPadding(buf) {\n var i = 0;\n var len = buf.length - 1;\n while (!buf[i] && !(buf[i + 1] & 0x80) && i < len) {\n i++;\n }\n if (i === 0) {\n return buf;\n }\n return buf.slice(i);\n}\n\nSignature.prototype._importDER = function _importDER(data, enc) {\n data = utils.toArray(data, enc);\n var p = new Position();\n if (data[p.place++] !== 0x30) {\n return false;\n }\n var len = getLength(data, p);\n if (len === false) {\n return false;\n }\n if ((len + p.place) !== data.length) {\n return false;\n }\n if (data[p.place++] !== 0x02) {\n return false;\n }\n var rlen = getLength(data, p);\n if (rlen === false) {\n return false;\n }\n if ((data[p.place] & 128) !== 0) {\n return false;\n }\n var r = data.slice(p.place, rlen + p.place);\n p.place += rlen;\n if (data[p.place++] !== 0x02) {\n return false;\n }\n var slen = getLength(data, p);\n if (slen === false) {\n return false;\n }\n if (data.length !== slen + p.place) {\n return false;\n }\n if ((data[p.place] & 128) !== 0) {\n return false;\n }\n var s = data.slice(p.place, slen + p.place);\n if (r[0] === 0) {\n if (r[1] & 0x80) {\n r = r.slice(1);\n } else {\n // Leading zeroes\n return false;\n }\n }\n if (s[0] === 0) {\n if (s[1] & 0x80) {\n s = s.slice(1);\n } else {\n // Leading zeroes\n return false;\n }\n }\n\n this.r = new BN(r);\n this.s = new BN(s);\n this.recoveryParam = null;\n\n return true;\n};\n\nfunction constructLength(arr, len) {\n if (len < 0x80) {\n arr.push(len);\n return;\n }\n var octets = 1 + (Math.log(len) / Math.LN2 >>> 3);\n arr.push(octets | 0x80);\n while (--octets) {\n arr.push((len >>> (octets << 3)) & 0xff);\n }\n arr.push(len);\n}\n\nSignature.prototype.toDER = function toDER(enc) {\n var r = this.r.toArray();\n var s = this.s.toArray();\n\n // Pad values\n if (r[0] & 0x80)\n r = [ 0 ].concat(r);\n // Pad values\n if (s[0] & 0x80)\n s = [ 0 ].concat(s);\n\n r = rmPadding(r);\n s = rmPadding(s);\n\n while (!s[0] && !(s[1] & 0x80)) {\n s = s.slice(1);\n }\n var arr = [ 0x02 ];\n constructLength(arr, r.length);\n arr = arr.concat(r);\n arr.push(0x02);\n constructLength(arr, s.length);\n var backHalf = arr.concat(s);\n var res = [ 0x30 ];\n constructLength(res, backHalf.length);\n res = res.concat(backHalf);\n return utils.encode(res, enc);\n};\n","'use strict';\n\nvar BN = require('bn.js');\nvar HmacDRBG = require('hmac-drbg');\nvar utils = require('../utils');\nvar curves = require('../curves');\nvar rand = require('brorand');\nvar assert = utils.assert;\n\nvar KeyPair = require('./key');\nvar Signature = require('./signature');\n\nfunction EC(options) {\n if (!(this instanceof EC))\n return new EC(options);\n\n // Shortcut `elliptic.ec(curve-name)`\n if (typeof options === 'string') {\n assert(Object.prototype.hasOwnProperty.call(curves, options),\n 'Unknown curve ' + options);\n\n options = curves[options];\n }\n\n // Shortcut for `elliptic.ec(elliptic.curves.curveName)`\n if (options instanceof curves.PresetCurve)\n options = { curve: options };\n\n this.curve = options.curve.curve;\n this.n = this.curve.n;\n this.nh = this.n.ushrn(1);\n this.g = this.curve.g;\n\n // Point on curve\n this.g = options.curve.g;\n this.g.precompute(options.curve.n.bitLength() + 1);\n\n // Hash for function for DRBG\n this.hash = options.hash || options.curve.hash;\n}\nmodule.exports = EC;\n\nEC.prototype.keyPair = function keyPair(options) {\n return new KeyPair(this, options);\n};\n\nEC.prototype.keyFromPrivate = function keyFromPrivate(priv, enc) {\n return KeyPair.fromPrivate(this, priv, enc);\n};\n\nEC.prototype.keyFromPublic = function keyFromPublic(pub, enc) {\n return KeyPair.fromPublic(this, pub, enc);\n};\n\nEC.prototype.genKeyPair = function genKeyPair(options) {\n if (!options)\n options = {};\n\n // Instantiate Hmac_DRBG\n var drbg = new HmacDRBG({\n hash: this.hash,\n pers: options.pers,\n persEnc: options.persEnc || 'utf8',\n entropy: options.entropy || rand(this.hash.hmacStrength),\n entropyEnc: options.entropy && options.entropyEnc || 'utf8',\n nonce: this.n.toArray(),\n });\n\n var bytes = this.n.byteLength();\n var ns2 = this.n.sub(new BN(2));\n for (;;) {\n var priv = new BN(drbg.generate(bytes));\n if (priv.cmp(ns2) > 0)\n continue;\n\n priv.iaddn(1);\n return this.keyFromPrivate(priv);\n }\n};\n\nEC.prototype._truncateToN = function _truncateToN(msg, truncOnly, bitLength) {\n var byteLength;\n if (BN.isBN(msg) || typeof msg === 'number') {\n msg = new BN(msg, 16);\n byteLength = msg.byteLength();\n } else if (typeof msg === 'object') {\n // BN assumes an array-like input and asserts length\n byteLength = msg.length;\n msg = new BN(msg, 16);\n } else {\n // BN converts the value to string\n var str = msg.toString();\n // HEX encoding\n byteLength = (str.length + 1) >>> 1;\n msg = new BN(str, 16);\n }\n // Allow overriding\n if (typeof bitLength !== 'number') {\n bitLength = byteLength * 8;\n }\n var delta = bitLength - this.n.bitLength();\n if (delta > 0)\n msg = msg.ushrn(delta);\n if (!truncOnly && msg.cmp(this.n) >= 0)\n return msg.sub(this.n);\n else\n return msg;\n};\n\nEC.prototype.sign = function sign(msg, key, enc, options) {\n if (typeof enc === 'object') {\n options = enc;\n enc = null;\n }\n if (!options)\n options = {};\n\n if (typeof msg !== 'string' && typeof msg !== 'number' && !BN.isBN(msg)) {\n assert(typeof msg === 'object' && msg && typeof msg.length === 'number',\n 'Expected message to be an array-like, a hex string, or a BN instance');\n assert((msg.length >>> 0) === msg.length); // non-negative 32-bit integer\n for (var i = 0; i < msg.length; i++) assert((msg[i] & 255) === msg[i]);\n }\n\n key = this.keyFromPrivate(key, enc);\n msg = this._truncateToN(msg, false, options.msgBitLength);\n\n // Would fail further checks, but let's make the error message clear\n assert(!msg.isNeg(), 'Can not sign a negative message');\n\n // Zero-extend key to provide enough entropy\n var bytes = this.n.byteLength();\n var bkey = key.getPrivate().toArray('be', bytes);\n\n // Zero-extend nonce to have the same byte size as N\n var nonce = msg.toArray('be', bytes);\n\n // Recheck nonce to be bijective to msg\n assert((new BN(nonce)).eq(msg), 'Can not sign message');\n\n // Instantiate Hmac_DRBG\n var drbg = new HmacDRBG({\n hash: this.hash,\n entropy: bkey,\n nonce: nonce,\n pers: options.pers,\n persEnc: options.persEnc || 'utf8',\n });\n\n // Number of bytes to generate\n var ns1 = this.n.sub(new BN(1));\n\n for (var iter = 0; ; iter++) {\n var k = options.k ?\n options.k(iter) :\n new BN(drbg.generate(this.n.byteLength()));\n k = this._truncateToN(k, true);\n if (k.cmpn(1) <= 0 || k.cmp(ns1) >= 0)\n continue;\n\n var kp = this.g.mul(k);\n if (kp.isInfinity())\n continue;\n\n var kpX = kp.getX();\n var r = kpX.umod(this.n);\n if (r.cmpn(0) === 0)\n continue;\n\n var s = k.invm(this.n).mul(r.mul(key.getPrivate()).iadd(msg));\n s = s.umod(this.n);\n if (s.cmpn(0) === 0)\n continue;\n\n var recoveryParam = (kp.getY().isOdd() ? 1 : 0) |\n (kpX.cmp(r) !== 0 ? 2 : 0);\n\n // Use complement of `s`, if it is > `n / 2`\n if (options.canonical && s.cmp(this.nh) > 0) {\n s = this.n.sub(s);\n recoveryParam ^= 1;\n }\n\n return new Signature({ r: r, s: s, recoveryParam: recoveryParam });\n }\n};\n\nEC.prototype.verify = function verify(msg, signature, key, enc, options) {\n if (!options)\n options = {};\n\n msg = this._truncateToN(msg, false, options.msgBitLength);\n key = this.keyFromPublic(key, enc);\n signature = new Signature(signature, 'hex');\n\n // Perform primitive values validation\n var r = signature.r;\n var s = signature.s;\n if (r.cmpn(1) < 0 || r.cmp(this.n) >= 0)\n return false;\n if (s.cmpn(1) < 0 || s.cmp(this.n) >= 0)\n return false;\n\n // Validate signature\n var sinv = s.invm(this.n);\n var u1 = sinv.mul(msg).umod(this.n);\n var u2 = sinv.mul(r).umod(this.n);\n var p;\n\n if (!this.curve._maxwellTrick) {\n p = this.g.mulAdd(u1, key.getPublic(), u2);\n if (p.isInfinity())\n return false;\n\n return p.getX().umod(this.n).cmp(r) === 0;\n }\n\n // NOTE: Greg Maxwell's trick, inspired by:\n // https://git.io/vad3K\n\n p = this.g.jmulAdd(u1, key.getPublic(), u2);\n if (p.isInfinity())\n return false;\n\n // Compare `p.x` of Jacobian point with `r`,\n // this will do `p.x == r * p.z^2` instead of multiplying `p.x` by the\n // inverse of `p.z^2`\n return p.eqXToP(r);\n};\n\nEC.prototype.recoverPubKey = function(msg, signature, j, enc) {\n assert((3 & j) === j, 'The recovery param is more than two bits');\n signature = new Signature(signature, enc);\n\n var n = this.n;\n var e = new BN(msg);\n var r = signature.r;\n var s = signature.s;\n\n // A set LSB signifies that the y-coordinate is odd\n var isYOdd = j & 1;\n var isSecondKey = j >> 1;\n if (r.cmp(this.curve.p.umod(this.curve.n)) >= 0 && isSecondKey)\n throw new Error('Unable to find sencond key candinate');\n\n // 1.1. Let x = r + jn.\n if (isSecondKey)\n r = this.curve.pointFromX(r.add(this.curve.n), isYOdd);\n else\n r = this.curve.pointFromX(r, isYOdd);\n\n var rInv = signature.r.invm(n);\n var s1 = n.sub(e).mul(rInv).umod(n);\n var s2 = s.mul(rInv).umod(n);\n\n // 1.6.1 Compute Q = r^-1 (sR - eG)\n // Q = r^-1 (sR + -eG)\n return this.g.mulAdd(s1, r, s2);\n};\n\nEC.prototype.getKeyRecoveryParam = function(e, signature, Q, enc) {\n signature = new Signature(signature, enc);\n if (signature.recoveryParam !== null)\n return signature.recoveryParam;\n\n for (var i = 0; i < 4; i++) {\n var Qprime;\n try {\n Qprime = this.recoverPubKey(e, signature, i);\n } catch (e) {\n continue;\n }\n\n if (Qprime.eq(Q))\n return i;\n }\n throw new Error('Unable to find valid recovery factor');\n};\n","'use strict';\n\nvar utils = require('../utils');\nvar assert = utils.assert;\nvar parseBytes = utils.parseBytes;\nvar cachedProperty = utils.cachedProperty;\n\n/**\n* @param {EDDSA} eddsa - instance\n* @param {Object} params - public/private key parameters\n*\n* @param {Array<Byte>} [params.secret] - secret seed bytes\n* @param {Point} [params.pub] - public key point (aka `A` in eddsa terms)\n* @param {Array<Byte>} [params.pub] - public key point encoded as bytes\n*\n*/\nfunction KeyPair(eddsa, params) {\n this.eddsa = eddsa;\n this._secret = parseBytes(params.secret);\n if (eddsa.isPoint(params.pub))\n this._pub = params.pub;\n else\n this._pubBytes = parseBytes(params.pub);\n}\n\nKeyPair.fromPublic = function fromPublic(eddsa, pub) {\n if (pub instanceof KeyPair)\n return pub;\n return new KeyPair(eddsa, { pub: pub });\n};\n\nKeyPair.fromSecret = function fromSecret(eddsa, secret) {\n if (secret instanceof KeyPair)\n return secret;\n return new KeyPair(eddsa, { secret: secret });\n};\n\nKeyPair.prototype.secret = function secret() {\n return this._secret;\n};\n\ncachedProperty(KeyPair, 'pubBytes', function pubBytes() {\n return this.eddsa.encodePoint(this.pub());\n});\n\ncachedProperty(KeyPair, 'pub', function pub() {\n if (this._pubBytes)\n return this.eddsa.decodePoint(this._pubBytes);\n return this.eddsa.g.mul(this.priv());\n});\n\ncachedProperty(KeyPair, 'privBytes', function privBytes() {\n var eddsa = this.eddsa;\n var hash = this.hash();\n var lastIx = eddsa.encodingLength - 1;\n\n var a = hash.slice(0, eddsa.encodingLength);\n a[0] &= 248;\n a[lastIx] &= 127;\n a[lastIx] |= 64;\n\n return a;\n});\n\ncachedProperty(KeyPair, 'priv', function priv() {\n return this.eddsa.decodeInt(this.privBytes());\n});\n\ncachedProperty(KeyPair, 'hash', function hash() {\n return this.eddsa.hash().update(this.secret()).digest();\n});\n\ncachedProperty(KeyPair, 'messagePrefix', function messagePrefix() {\n return this.hash().slice(this.eddsa.encodingLength);\n});\n\nKeyPair.prototype.sign = function sign(message) {\n assert(this._secret, 'KeyPair can only verify');\n return this.eddsa.sign(message, this);\n};\n\nKeyPair.prototype.verify = function verify(message, sig) {\n return this.eddsa.verify(message, sig, this);\n};\n\nKeyPair.prototype.getSecret = function getSecret(enc) {\n assert(this._secret, 'KeyPair is public only');\n return utils.encode(this.secret(), enc);\n};\n\nKeyPair.prototype.getPublic = function getPublic(enc) {\n return utils.encode(this.pubBytes(), enc);\n};\n\nmodule.exports = KeyPair;\n","'use strict';\n\nvar BN = require('bn.js');\nvar utils = require('../utils');\nvar assert = utils.assert;\nvar cachedProperty = utils.cachedProperty;\nvar parseBytes = utils.parseBytes;\n\n/**\n* @param {EDDSA} eddsa - eddsa instance\n* @param {Array<Bytes>|Object} sig -\n* @param {Array<Bytes>|Point} [sig.R] - R point as Point or bytes\n* @param {Array<Bytes>|bn} [sig.S] - S scalar as bn or bytes\n* @param {Array<Bytes>} [sig.Rencoded] - R point encoded\n* @param {Array<Bytes>} [sig.Sencoded] - S scalar encoded\n*/\nfunction Signature(eddsa, sig) {\n this.eddsa = eddsa;\n\n if (typeof sig !== 'object')\n sig = parseBytes(sig);\n\n if (Array.isArray(sig)) {\n assert(sig.length === eddsa.encodingLength * 2, 'Signature has invalid size');\n sig = {\n R: sig.slice(0, eddsa.encodingLength),\n S: sig.slice(eddsa.encodingLength),\n };\n }\n\n assert(sig.R && sig.S, 'Signature without R or S');\n\n if (eddsa.isPoint(sig.R))\n this._R = sig.R;\n if (sig.S instanceof BN)\n this._S = sig.S;\n\n this._Rencoded = Array.isArray(sig.R) ? sig.R : sig.Rencoded;\n this._Sencoded = Array.isArray(sig.S) ? sig.S : sig.Sencoded;\n}\n\ncachedProperty(Signature, 'S', function S() {\n return this.eddsa.decodeInt(this.Sencoded());\n});\n\ncachedProperty(Signature, 'R', function R() {\n return this.eddsa.decodePoint(this.Rencoded());\n});\n\ncachedProperty(Signature, 'Rencoded', function Rencoded() {\n return this.eddsa.encodePoint(this.R());\n});\n\ncachedProperty(Signature, 'Sencoded', function Sencoded() {\n return this.eddsa.encodeInt(this.S());\n});\n\nSignature.prototype.toBytes = function toBytes() {\n return this.Rencoded().concat(this.Sencoded());\n};\n\nSignature.prototype.toHex = function toHex() {\n return utils.encode(this.toBytes(), 'hex').toUpperCase();\n};\n\nmodule.exports = Signature;\n","'use strict';\n\nvar hash = require('hash.js');\nvar curves = require('../curves');\nvar utils = require('../utils');\nvar assert = utils.assert;\nvar parseBytes = utils.parseBytes;\nvar KeyPair = require('./key');\nvar Signature = require('./signature');\n\nfunction EDDSA(curve) {\n assert(curve === 'ed25519', 'only tested with ed25519 so far');\n\n if (!(this instanceof EDDSA))\n return new EDDSA(curve);\n\n curve = curves[curve].curve;\n this.curve = curve;\n this.g = curve.g;\n this.g.precompute(curve.n.bitLength() + 1);\n\n this.pointClass = curve.point().constructor;\n this.encodingLength = Math.ceil(curve.n.bitLength() / 8);\n this.hash = hash.sha512;\n}\n\nmodule.exports = EDDSA;\n\n/**\n* @param {Array|String} message - message bytes\n* @param {Array|String|KeyPair} secret - secret bytes or a keypair\n* @returns {Signature} - signature\n*/\nEDDSA.prototype.sign = function sign(message, secret) {\n message = parseBytes(message);\n var key = this.keyFromSecret(secret);\n var r = this.hashInt(key.messagePrefix(), message);\n var R = this.g.mul(r);\n var Rencoded = this.encodePoint(R);\n var s_ = this.hashInt(Rencoded, key.pubBytes(), message)\n .mul(key.priv());\n var S = r.add(s_).umod(this.curve.n);\n return this.makeSignature({ R: R, S: S, Rencoded: Rencoded });\n};\n\n/**\n* @param {Array} message - message bytes\n* @param {Array|String|Signature} sig - sig bytes\n* @param {Array|String|Point|KeyPair} pub - public key\n* @returns {Boolean} - true if public key matches sig of message\n*/\nEDDSA.prototype.verify = function verify(message, sig, pub) {\n message = parseBytes(message);\n sig = this.makeSignature(sig);\n if (sig.S().gte(sig.eddsa.curve.n) || sig.S().isNeg()) {\n return false;\n }\n var key = this.keyFromPublic(pub);\n var h = this.hashInt(sig.Rencoded(), key.pubBytes(), message);\n var SG = this.g.mul(sig.S());\n var RplusAh = sig.R().add(key.pub().mul(h));\n return RplusAh.eq(SG);\n};\n\nEDDSA.prototype.hashInt = function hashInt() {\n var hash = this.hash();\n for (var i = 0; i < arguments.length; i++)\n hash.update(arguments[i]);\n return utils.intFromLE(hash.digest()).umod(this.curve.n);\n};\n\nEDDSA.prototype.keyFromPublic = function keyFromPublic(pub) {\n return KeyPair.fromPublic(this, pub);\n};\n\nEDDSA.prototype.keyFromSecret = function keyFromSecret(secret) {\n return KeyPair.fromSecret(this, secret);\n};\n\nEDDSA.prototype.makeSignature = function makeSignature(sig) {\n if (sig instanceof Signature)\n return sig;\n return new Signature(this, sig);\n};\n\n/**\n* * https://tools.ietf.org/html/draft-josefsson-eddsa-ed25519-03#section-5.2\n*\n* EDDSA defines methods for encoding and decoding points and integers. These are\n* helper convenience methods, that pass along to utility functions implied\n* parameters.\n*\n*/\nEDDSA.prototype.encodePoint = function encodePoint(point) {\n var enc = point.getY().toArray('le', this.encodingLength);\n enc[this.encodingLength - 1] |= point.getX().isOdd() ? 0x80 : 0;\n return enc;\n};\n\nEDDSA.prototype.decodePoint = function decodePoint(bytes) {\n bytes = utils.parseBytes(bytes);\n\n var lastIx = bytes.length - 1;\n var normed = bytes.slice(0, lastIx).concat(bytes[lastIx] & ~0x80);\n var xIsOdd = (bytes[lastIx] & 0x80) !== 0;\n\n var y = utils.intFromLE(normed);\n return this.curve.pointFromY(y, xIsOdd);\n};\n\nEDDSA.prototype.encodeInt = function encodeInt(num) {\n return num.toArray('le', this.encodingLength);\n};\n\nEDDSA.prototype.decodeInt = function decodeInt(bytes) {\n return utils.intFromLE(bytes);\n};\n\nEDDSA.prototype.isPoint = function isPoint(val) {\n return val instanceof this.pointClass;\n};\n","'use strict';\n\nvar elliptic = exports;\n\nelliptic.version = require('../package.json').version;\nelliptic.utils = require('./elliptic/utils');\nelliptic.rand = require('brorand');\nelliptic.curve = require('./elliptic/curve');\nelliptic.curves = require('./elliptic/curves');\n\n// Protocols\nelliptic.ec = require('./elliptic/ec');\nelliptic.eddsa = require('./elliptic/eddsa');\n","/*\r\n * Copyright (c) 2018-2026 GraphDefined GmbH <achim.friedland@graphdefined.com>\r\n * This file is part of Chargy Desktop App <https://github.com/OpenChargingCloud/ChargyDesktopApp>\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n\r\n/*\r\n * Based on: https://github.com/CraigglesO/elliptic-curve-signature-algo\r\n * \r\n * This implementation is for educaitonal purposes only\r\n * and should not be used in production for obvious reasons.\r\n * If you would like to contribute, you are more than welcome to.\r\n *\r\n * const GcompressedLE = BigInt(\"0xA1455B334DF099DF30FC28A169A467E9E47075A90F7E650EB6B7A45C\");\r\n * const GunCompressedLE = BigInt(\"0xA1455B334DF099DF30FC28A169A467E9E47075A90F7E650EB6B7A45C7E089FED7FBA344282CAFBD6F7E319F7C0B0BD59E2CA4BDB556D61A5\");\r\n *\r\n * Actual curve: y^2 = x^3 + Acurve * x + Bcurve\r\n */\r\n\r\nexport class secp224k1 {\r\n\r\n // Pcurve = 2**224 - 2**32 - 2**12 - 2**11 - 2**9 - 2**7 - 2**4 - 2**1 - 1 or\r\n // FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFE FFFFE56D\r\n private Zero = BigInt(\"0\");\r\n private One = BigInt(\"1\");\r\n private Two = BigInt(\"2\");\r\n private Three = BigInt(\"3\");\r\n private Pcurve = BigInt(\"26959946667150639794667015087019630673637144422540572481099315275117\"); // The proven prime\r\n private N = BigInt(\"0x010000000000000000000000000001DCE8D2EC6184CAF0A971769FB1F7\"); // Number of points in the field\r\n private Acurve = BigInt(0); // These two are defined on the elliptic curve. y^2 = x^3 + Acurve * x + Bcurve\r\n private Bcurve = BigInt(5); // These two are defined on the elliptic curve. y^2 = x^3 + Acurve * x + Bcurve\r\n private Gx = BigInt(\"0xA1455B334DF099DF30FC28A169A467E9E47075A90F7E650EB6B7A45C\");\r\n private Gy = BigInt(\"0x7E089FED7FBA344282CAFBD6F7E319F7C0B0BD59E2CA4BDB556D61A5\");\r\n private GPoint = [this.Gx, this.Gy]; // This is our generator point. Trillions of dif ones possible\r\n\r\n public Sign(hash: bigint,\r\n RandomNumber: bigint,\r\n privateKey: bigint) : Array<bigint> | null\r\n {\r\n\r\n const RandSignPoint = this.ECmultiply(this.GPoint, RandomNumber);\r\n\r\n if (RandSignPoint.length >= 1 && RandSignPoint[0] != null)\r\n {\r\n\r\n const r = this.modulo(RandSignPoint[0], this.N);\r\n const s = this.modulo((hash + r*privateKey) * (this.modInv(RandomNumber, this.N)), this.N);\r\n\r\n return [ r, s ];\r\n\r\n }\r\n\r\n return null;\r\n\r\n }\r\n\r\n public validate(hash: bigint,\r\n signatureR: bigint,\r\n signatureS: bigint,\r\n PublicKey: Array<bigint>) : boolean\r\n {\r\n\r\n if (signatureR == this.Zero || signatureR >= this.N)\r\n throw new Error(\"Invalid R\");\r\n\r\n if (signatureS == this.Zero || signatureS >= this.N)\r\n throw new Error(\"Invalid S\");\r\n\r\n const w = this.modInv(signatureS, this.N);\r\n const u1 = this.ECmultiply(this.GPoint, this.modulo(w * hash, this.N));\r\n const u2 = this.ECmultiply(PublicKey, this.modulo(w * signatureR, this.N));\r\n const validation = this.ECadd(u1, u2);\r\n\r\n return validation[0] == signatureR;\r\n\r\n }\r\n\r\n\r\n public modulo(n: bigint, m: bigint) {\r\n return (((n % m) + m) % m);\r\n }\r\n\r\n public zfill(s: string): string {\r\n\r\n while (s.length < 56) {\r\n s = \"0\" + s;\r\n }\r\n\r\n return s;\r\n\r\n }\r\n\r\n public modInv(a: bigint, n: bigint = this.Pcurve) {\r\n\r\n let lm = BigInt(1),\r\n hm = BigInt(0),\r\n high = n,\r\n low = this.modulo(a, n);\r\n\r\n while (low > 1) {\r\n\r\n const ratio = high / low,\r\n nm = hm - (ratio*lm),\r\n newm = high - (ratio*low);\r\n\r\n hm = lm;\r\n lm = nm;\r\n high = low;\r\n low = newm;\r\n\r\n }\r\n\r\n return this.modulo(lm, n);\r\n\r\n }\r\n\r\n public ECadd(a: Array<bigint>,\r\n b: Array<bigint>) : Array<bigint>\r\n {\r\n\r\n if (a[0] != undefined && b[0] != undefined &&\r\n a[1] != undefined && b[1] != undefined)\r\n {\r\n\r\n const LamAdd = this.modulo((b[1]-a[1])*( this.modInv( b[0]-a[0] ) ), this.Pcurve);\r\n const x = this.modulo((LamAdd*LamAdd)-a[0]-b[0], this.Pcurve);\r\n const y = this.modulo((LamAdd*( a[0]-x )-a[1]), this.Pcurve);\r\n\r\n return [x, y];\r\n\r\n }\r\n\r\n throw new Error(\"Invalid EC Point Addition!\");\r\n\r\n }\r\n\r\n public ECdouble(a: Array<bigint>) : Array<bigint>\r\n {\r\n\r\n if (a[0] != undefined &&\r\n a[1] != undefined)\r\n {\r\n\r\n const Lam = this.modulo((((a[0]*a[0])*this.Three) + this.Acurve)*( this.modInv( a[1]*this.Two )), this.Pcurve);\r\n const x = this.modulo((Lam*Lam)-(a[0]*this.Two), this.Pcurve);\r\n const y = this.modulo( Lam*( a[0]-x )-a[1], this.Pcurve);\r\n\r\n return [x, y];\r\n\r\n }\r\n\r\n throw new Error(\"Invalid EC Point Doubling!\");\r\n\r\n }\r\n\r\n public ECmultiply(GenPoint: Array<bigint>,\r\n ScalarHex: bigint) : Array<bigint>\r\n {\r\n\r\n if (ScalarHex == this.Zero || ScalarHex >= this.N)\r\n throw new Error(\"Invalid Scalar/Private Key\");\r\n\r\n const ScalarBinary = ScalarHex.toString(2);\r\n let Q = GenPoint;\r\n\r\n for (let i = 1; i < ScalarBinary.length; i++) {\r\n\r\n Q = this.ECdouble(Q);\r\n\r\n if (ScalarBinary[i] === \"1\") {\r\n Q = this.ECadd(Q, GenPoint);\r\n }\r\n\r\n }\r\n\r\n return Q;\r\n\r\n }\r\n\r\n // uncompressed is the accumulation of both the x and y points\r\n // compressed is the public key to share in transactions\r\n // address is the public address tho whom someone can send coin\r\n public PublicKeyGenerate(PrivateKey: string | number | bigint)\r\n : {\r\n x: bigint,\r\n y: bigint,\r\n xy: Array<string>,\r\n uncompressed: string,\r\n compressed: string,\r\n address: string\r\n } |\r\n undefined\r\n {\r\n\r\n if (typeof PrivateKey === 'number')\r\n PrivateKey = BigInt(PrivateKey);\r\n\r\n if (typeof PrivateKey === 'string')\r\n PrivateKey = BigInt(PrivateKey);\r\n\r\n const publicKey = this.ECmultiply(this.GPoint, PrivateKey);\r\n\r\n if (publicKey[0] !== undefined &&\r\n publicKey[1] !== undefined)\r\n {\r\n\r\n const Px = this.zfill(publicKey[0].toString(16));\r\n const Py = this.zfill(publicKey[1].toString(16));\r\n\r\n return {\r\n x: publicKey[0],\r\n y: publicKey[1],\r\n xy: [Px, Py],\r\n uncompressed: publicKey[0].toString(16) + publicKey[1].toString(16),\r\n compressed: \"04\" + Px + Py,\r\n address: (this.modulo(publicKey[1], this.Two) == this.One)\r\n ? \"03\" + Px\r\n : \"02\" + Px\r\n };\r\n\r\n }\r\n\r\n }\r\n\r\n}\r\n","/*\n * Copyright (c) 2018-2026 GraphDefined GmbH <achim.friedland@graphdefined.com>\n * This file is part of Chargy WebApp <https://github.com/OpenChargingCloud/ChargyWebApp>\n *\n * Licensed under the Affero GPL license, Version 3.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.gnu.org/licenses/agpl.html\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Decimal from 'decimal.js';\nimport * as chargyLib from '../chargyLib'\n\n\nexport function isObject(data: unknown): data is Record<string, unknown> {\n return typeof data === \"object\" && data !== null;\n}\n\nexport function isMultilanguageText(data: unknown): data is IMultilanguageText {\n return isObject(data) &&\n Object.values(data).every(value => typeof value === \"string\");\n}\n\nexport function isGeoLocation(data: unknown): data is IGeoLocation {\n if (!isObject(data))\n return false;\n\n const latitude = data[\"lat\"];\n const longitude = data[\"lng\"];\n\n return (latitude === undefined || typeof latitude === \"number\") &&\n (longitude === undefined || typeof longitude === \"number\");\n}\n\nexport interface GetChargingPoolFunc {\n (Id: string): IChargingPool|null;\n}\n\nexport interface GetChargingStationFunc {\n (Id: string): IChargingStation|null;\n}\n\nexport interface GetEVSEFunc {\n (Id: string): IEVSE|null;\n}\n\nexport interface GetMeterFunc {\n (Id: string): IMeter|null;\n}\n\nexport interface CheckMeterPublicKeySignatureFunc {\n (chargingStation: IChargingStation | null | undefined,\n evse: IEVSE | null | undefined,\n meter: IMeter | null | undefined,\n publicKey: IPublicKey | null | undefined,\n signature: unknown): Promise<string>;\n}\n\n\n\nexport interface IContract\n{\n \"@id\": string;\n \"@context\"?: string;\n description?: IMultilanguageText;\n type?: string;\n username?: string;\n email?: string;\n}\n\nexport function isString(value: unknown): value is string {\n return typeof value === \"string\";\n}\n\nexport function isStringArray(value: unknown): value is string[] {\n return Array.isArray(value) &&\n value.every(item => typeof item === \"string\");\n}\n\nexport function isStringOrStringArray(value: unknown): value is string | string[] {\n return typeof value === \"string\" ||\n isStringArray(value);\n}\n\nexport interface IOIDInfo\n{\n oid: string;\n name: string;\n}\n\nexport function isOIDInfo(data: unknown): data is IOIDInfo\n{\n\n if (!isObject(data))\n return false;\n\n return typeof data[\"oid\"] === \"string\" &&\n typeof data[\"name\"] === \"string\";\n\n}\n\nexport function isStringOrOIDInfo(value: unknown): value is string | IOIDInfo {\n return typeof value === \"string\" ||\n isOIDInfo(value);\n}\n\n\nexport interface IKeyInfo\n{\n keyId: string;\n keyType: string;\n curve: string;\n value: string;\n}\n\nexport interface IChargingStationOperator\n{\n \"@id\": string;\n \"@context\"?: string;\n subCSOIds?: Array<string>;\n description?: IMultilanguageText;\n contact: IContact;\n support: ISupport;\n privacy: IPrivacy;\n geoLocation?: IGeoLocation;\n chargingPools?: Array<IChargingPool>;\n chargingStations?: Array<IChargingStation>;\n EVSEs?: Array<IEVSE>;\n publicKeys?: Array<IPublicKey>;\n\n chargingTariffs?: Array<IChargingTariff>;\n parkingTariffs?: Array<IParkingTariff>;\n\n}\n\nexport interface IContact {\n email: string;\n web: string;\n logoUrl?: string;\n address?: IAddress;\n publicKeys?: Array<IPublicKey>\n}\n\nexport interface ISupport {\n hotline: string;\n email: string;\n web?: string;\n mediationServices?: Array<string>;\n publicKeys?: Array<IPublicKey>\n}\n\nexport interface IPrivacy {\n contact: string;\n email: string;\n web: string;\n publicKeys?: Array<IPublicKey>\n}\n\nexport interface IPublicKey\n{\n algorithm: string;\n format: string; // e.g. \"DER\" | \"rs\"\n encoding: IEncoding|string; // e.g. \"hex\" | \"base64\"\n value?: string;\n previousValue?: string;\n signatures?: Array<unknown>;\n}\n\nexport function isIPublicKeyXY(obj: unknown): obj is IPublicKeyXY {\n return typeof obj === 'object' && obj !== null &&\n typeof (obj as IPublicKeyXY).x === \"string\" &&\n typeof (obj as IPublicKeyXY).y === \"string\";\n}\n\nexport interface IPublicKeyXY extends IPublicKey\n{\n x: string;\n y: string;\n}\n\nexport interface ISignature\n{\n algorithm?: CryptoAlgorithms|string;\n format?: SignatureFormats|string;\n previousValue?: string;\n value?: string;\n}\n\n// export interface IECCSignature extends ISignature\n// {\n// //algorithm: CryptoAlgorithms|string;\n// //format: SignatureFormats|string;\n// //previousValue?: string;\n// //value?: string;\n// r?: string;\n// s?: string;\n// }\n\n\nexport interface ISignatureRS extends ISignature\n{\n r?: string;\n s?: string;\n}\n\nexport interface IChargingPool\n{\n \"@id\": string;\n \"@context\"?: string;\n description?: IMultilanguageText;\n address?: IAddress;\n geoLocation?: IGeoLocation;\n chargingStationOperator?: IChargingStationOperator;\n chargingStations?: Array<IChargingStation>;\n chargingTariffs?: Array<IChargingTariff>;\n publicKeys?: Array<IPublicKey>;\n}\n\nexport interface IChargingStation\n{\n \"@id\": string;\n \"@context\"?: string;\n description?: IMultilanguageText;\n manufacturer?: string;\n manufacturerURL?: string;\n model?: string;\n modelURL?: string;\n firmwareVersion?: string;\n firmwareChecksum?: string;\n hardwareVersion?: string;\n serialNumber?: string;\n legalCompliance?: ILegalCompliance;\n address?: IAddress;\n geoLocation?: IGeoLocation;\n chargingStationOperator?: IChargingStationOperator;\n chargingPoolId?: string;\n chargingPool?: IChargingPool;\n EVSEs: Array<IEVSE>;\n EVSEIds?: Array<string>;\n meters?: Array<IMeter>;\n chargingTariffs?: Array<IChargingTariff>;\n publicKeys?: Array<IPublicKey>;\n}\n\nexport interface IEVSE\n{\n \"@id\": string;\n \"@context\"?: string;\n description?: IMultilanguageText;\n chargingStation?: IChargingStation;\n chargingStationId?: string;\n meters: Array<IMeter>;\n chargingTariffs?: Array<IChargingTariff>;\n publicKeys?: Array<IPublicKey>;\n connectors?: Array<IConnector>;\n}\n\nexport interface IMeter\n{\n \"@id\": string;\n \"@context\"?: string;\n description?: IMultilanguageText;\n manufacturer?: string;\n manufacturerURL?: string;\n model?: string;\n modelURL?: string;\n firmwareVersion?: string;\n firmwareChecksum?: string;\n hardwareVersion?: string;\n legalCompliance?: ILegalCompliance;\n chargingStation?: IChargingStation;\n chargingStationId?: string;\n EVSE?: IEVSE;\n EVSEId?: string;\n signatureInfos?: ISignatureInfos;\n signatureFormat?: string;\n publicKeys?: Array<IPublicKey>;\n}\n\nexport interface IConnector {\n type: string;\n looses: number;\n}\n\nexport interface IConformity {\n certificateId: string;\n url?: string;\n notBefore: string;\n notAfter: string;\n officialSoftware?: Array<ITransparencySoftware>; // The transparency software that is officially part of the charging station.\n compatibleSoftware?: Array<ITransparencySoftware>; // Other transparency softwares, that can verify the transparency record, but are not officially part of the charging station.\n freeText: string;\n}\n\nexport interface ICalibration {\n certificateId: string;\n url?: string;\n notBefore: string;\n notAfter: string;\n freeText: string;\n}\n\nexport interface ILegalCompliance {\n conformity?: Array<IConformity>;\n calibration?: Array<ICalibration>;\n url?: string;\n freeText: string;\n}\n\nexport interface IEMobilityProvider\n{\n \"@id\": string;\n \"@context\"?: string;\n description: IMultilanguageText;\n chargingTariffs: Array<IChargingTariff>;\n publicKeys?: Array<IPublicKey>;\n}\n\nexport interface ITaxes\n{\n \"@id\": string;\n \"@context\"?: string;\n description?: IMultilanguageText;\n percentage: number;\n}\n\nexport interface IMediationService\n{\n \"@id\": string;\n \"@context\"?: string;\n description: IMultilanguageText;\n publicKeys?: Array<IPublicKey>;\n}\n\n\n\nexport interface IChargingProduct\n{\n \"@id\": string;\n \"@context\"?: string;\n}\n\nexport interface IChargingCosts {\n total: number;\n currency: string;\n reservation?: ICost;\n energy?: ICost;\n time?: ICost;\n idle?: ICost;\n flat?: IFlatCost;\n}\n\nexport interface ICost {\n amount: number; // Note: The billed amount might be different from the measured amount!\n unit: string;\n cost: number;\n}\n\nexport interface IFlatCost {\n cost: number;\n}\n\nexport interface IParking\n{\n \"@id\": string;\n \"@context\"?: string;\n begin: string;\n end?: string;\n overstay?: boolean;\n}\n\nexport interface ITransparencySoftware {\n name: string;\n version?: string;\n manufacturer?: string;\n downloadURLs?: Array<string>;\n}\n\nexport interface ITransparencyInfos {\n chargingSessionURL?: string; // e.g. https://chargeportal.de.mer.eco/transactions/transparency/$sessionId\n officialSoftware?: Array<ITransparencySoftware>; // The transparency software that is officially part of the charging station.\n compatibleSoftware?: Array<ITransparencySoftware>; // Other transparency softwares, that can verify the transparency record, but are not officially part of the charging station.\n freeText?: string;\n}\n\nexport interface IAuthorization\n{\n \"@id\": string;\n \"@context\"?: string;\n type?: string;\n timestamp?: string;\n chargingStationOperator?: string;\n roamingNetwork?: string;\n eMobilityProvider?: string;\n}\n\nexport interface ISignatureInfos {\n hash: CryptoHashAlgorithms|string;\n hashTruncation?: number;\n algorithm: CryptoAlgorithms |string;\n curve: IECCurves |string;\n format: SignatureFormats |string;\n encoding?: IEncoding |string;\n}\n\nexport enum IECCurves {\n secp192r1 = \"secp192r1\",\n secp224k1 = \"secp224k1\",\n secp256k1 = \"secp256k1\",\n secp256r1 = \"secp256r1\",\n secp384r1 = \"secp384r1\",\n secp512r1 = \"secp512r1\"\n}\n\nexport enum IEncoding {\n hex = \"hex\",\n base64 = \"base64\"\n}\n\nexport enum PublicKeyFormats {\n DER = \"DER\",\n XY = \"XY\"\n}\n\nexport enum SignatureFormats {\n DER = \"DER\",\n RS = \"RS\"\n}\n\nexport enum CryptoAlgorithms {\n RSA = \"RSA\",\n ECC = \"ECC\"\n}\n\nexport enum CryptoHashAlgorithms {\n SHA256 = \"SHA256\",\n SHA384 = \"SHA384\",\n SHA512 = \"SHA512\"\n}\n\nexport enum DisplayPrefixes {\n NULL,\n KILO,\n MEGA,\n GIGA\n}\n\n\nexport interface ISessionCryptoResult extends chargyLib.JSONObject\n{\n\n status: SessionVerificationResult;\n message?: string;\n exception?: unknown;\n\n // How sure we are that this result is correct!\n // (JSON) transparency records might not always include an unambiguously\n // format identifier. So multiple chargy parsers might be candidates, but\n // hopefully one will be the best matching parser.\n certainty: number;\n\n warnings?: Array<string>;\n errors?: Array<string>;\n\n}\n\nexport function isISessionCryptoResult1(obj: unknown): obj is ISessionCryptoResult {\n return typeof obj === 'object' && obj !== null &&\n (obj as ISessionCryptoResult).status !== undefined\n}\n\nexport function isISessionCryptoResult2(obj: unknown): obj is ISessionCryptoResult {\n return typeof obj === 'object' && obj !== null &&\n (obj as ISessionCryptoResult).status !== undefined &&\n (obj as ISessionCryptoResult).status !== SessionVerificationResult.InvalidSessionFormat\n}\n\nexport interface ICryptoResult\n{\n status: VerificationResult;\n errors?: Array<string>;\n warnings?: Array<string>;\n}\n\nexport function isICryptoResult(obj: unknown): obj is ICryptoResult {\n return typeof obj === 'object' && obj !== null &&\n (obj as ICryptoResult).status !== undefined\n}\n\nexport interface IAddress {\n \"@context\"?: string;\n city: string;\n street?: string;\n houseNumber?: string;\n floorLevel?: string;\n postalCode: string;\n country: string;\n comment?: string | IMultilanguageText;\n}\n\nexport interface IGeoLocation {\n lat: number;\n lng: number;\n}\n\nexport interface IChargingProductRelevance\n{\n time?: InformationRelevance|string;\n energy?: InformationRelevance|string;\n parking?: InformationRelevance|string;\n sessionFee?: InformationRelevance|string;\n}\n\nexport enum InformationRelevance {\n Unknown = \"Unknown\",\n Ignored = \"Ignored\",\n Informative = \"Informative\",\n Important = \"Important\"\n}\n\n// Remember to update main.cjs \"setVerificationResult\" when you edit this enum!\nexport enum SessionVerificationResult {\n\n Unvalidated = \"Unvalidated\",\n\n UnknownCTRFormat = \"UnknownCTRFormat\",\n NoChargeTransparencyRecordsFound = \"NoChargeTransparencyRecordsFound\",\n\n UnknownSessionFormat = \"UnknownSessionFormat\",\n InvalidSessionFormat = \"InvalidSessionFormat\",\n AtLeastTwoMeasurementsRequired = \"AtLeastTwoMeasurementsRequired\",\n InconsistentTimestamps = \"InconsistentTimestamps\",\n MissingStartValue = \"MissingStartValue\",\n InvalidStartValue = \"InvalidStartValue\",\n InvalidIntermediateValue = \"InvalidIntermediateValue\",\n MissingStopValue = \"MissingStopValue\",\n InvalidStopValue = \"InvalidStopValue\",\n\n EnergyMeterNotFound = \"EnergyMeterNotFound\",\n InvalidMeasurement = \"InvalidMeasurement\",\n\n PublicKeyNotFound = \"PublicKeyNotFound\",\n UnknownPublicKeyFormat = \"UnknownPublicKeyFormat\",\n InvalidPublicKey = \"InvalidPublicKey\",\n\n UnknownSignatureFormat = \"UnknownSignatureFormat\",\n InvalidSignature = \"InvalidSignature\",\n ValidSignature = \"ValidSignature\"\n\n}\n\nexport enum VerificationResult {\n\n Unvalidated = \"Unvalidated\",\n NoOperation = \"NoOperation\",\n\n UnknownCTRFormat = \"UnknownCTRFormat\",\n\n EnergyMeterNotFound = \"EnergyMeterNotFound\",\n InvalidMeasurement = \"InvalidMeasurement\",\n\n InvalidStartValue = \"InvalidStartValue\",\n StartValue = \"StartValue\",\n ValidStartValue = \"ValidStartValue\",\n\n InvalidIntermediateValue = \"InvalidIntermediateValue\",\n IntermediateValue = \"IntermediateValue\",\n ValidIntermediateValue = \"ValidIntermediateValue\",\n\n InvalidStopValue = \"InvalidStopValue\",\n StopValue = \"StopValue\",\n ValidStopValue = \"ValidStopValue\",\n\n PublicKeyNotFound = \"PublicKeyNotFound\",\n UnknownPublicKeyFormat = \"UnknownPublicKeyFormat\",\n InvalidPublicKey = \"InvalidPublicKey\",\n\n UnknownSignatureFormat = \"UnknownSignatureFormat\",\n InvalidSignature = \"InvalidSignature\",\n ValidSignature = \"ValidSignature\",\n\n ValidationError = \"ValidationError\"\n\n}\n\nexport interface IVersions {\n name: string,\n description: IMultilanguageText,\n versions: Array<IVersion>\n}\n\nexport interface IVersion {\n version: string,\n releaseDate: string,\n description: IMultilanguageText,\n tags: Array<string>,\n packages: Array<IVersionPackage>\n}\n\nexport interface IVersionPackage {\n name: string,\n description: IMultilanguageText,\n additionalInfo: unknown,\n cryptoHashes: ICryptoHashes,\n signatures: Array<IVersionSignature>,\n downloadURLs: Record<string, string>\n}\n\nexport interface ICryptoHashes {\n sha256?: string,\n sha512?: string\n}\n\nexport interface IVersionSignature {\n signer: string,\n timestamp: string,\n publicKey: string,\n algorithm: string,\n format: string,\n signature: string\n}\n\nexport interface IMultilanguageText {\n [key: string]: string;\n}\n\n// The i18n.json dictionary: message key => language => localized text\nexport interface I18NDictionary {\n [key: string]: IMultilanguageText;\n}\n\nexport interface IResult {\n status: SessionVerificationResult,\n message: string\n}\n\nexport interface TarInfo {\n data: ArrayBuffer|Uint8Array,\n mode: number,\n mtime: string,\n path: string\n type: string\n}\n\nexport function isIFileInfo(obj: unknown): obj is IFileInfo {\n\n if (!chargyLib.isMandatoryJSONObject(obj))\n return false;\n\n const fileInfo = obj as Record<string, unknown>;\n\n return typeof fileInfo[\"name\"] === 'string' &&\n (fileInfo[\"data\"] instanceof ArrayBuffer || ArrayBuffer.isView(fileInfo[\"data\"]));\n\n}\n\nexport interface IFileInfo {\n name: string,\n path?: string,\n type?: string,\n data?: ArrayBuffer|Uint8Array,\n info?: string,\n error?: string,\n exception?: unknown\n}\n\nexport interface IChargingPeriod\n{\n startTimestamp: string,\n stopTimestamp?: string,\n endTimestamp?: string,\n chargingTariffId: string,\n activeChargingTariffElement?: IChargingTariffElement,\n costs: IChargingCosts\n}\n\nexport enum DayOfWeek\n{\n Sunday = 0,\n Monday = 1,\n Tuesday = 2,\n Wednesday = 3,\n Thursday = 4,\n Friday = 5,\n Saturday = 6\n}\n\nexport interface ITariffRestriction {\n start_time: string,\n end_time: string,\n start_date: string,\n end_date: string,\n min_kwh: Decimal,\n max_kwh: Decimal,\n min_power: Decimal,\n max_power: Decimal,\n min_duration: number,\n max_duration: number,\n day_of_week: Array<DayOfWeek>\n}\n\nexport interface IPriceComponent {\n type: string,\n price: Decimal,\n step_size: number\n}\n\nexport interface IChargingTariffElement {\n price_components: Array<IPriceComponent>,\n restrictions: ITariffRestriction\n}\n\nexport interface IDisplayText {\n language: string,\n text: string\n}\n\n// OCPI v2.1.1 + extensions\nexport interface IChargingTariff {\n\n \"@id\": string;\n \"@context\"?: string|Array<string>,\n country_code?: string,\n party_id?: string,\n shortName?: IMultilanguageText;\n summary?: IMultilanguageText;\n tariff_alt_url?: string,\n currency?: string,\n taxes?: Array<ITaxes>;\n elements?: Array<IChargingTariffElement>\n\n //energy_mix?: IEnergyMix,\n\n not_before?: string,\n not_after?: string,\n created?: string,\n last_updated?: string,\n\n signatures?: Array<ISignatureRS>\n\n}\n\nexport interface IParkingTariff {\n\n \"@id\": string;\n \"@context\"?: string|Array<string>,\n country_code?: string,\n party_id?: string,\n description?: IMultilanguageText;\n tariff_alt_text?: Array<IDisplayText>,\n tariff_alt_url?: string,\n currency?: string,\n taxes?: Array<ITaxes>;\n elements?: Array<IChargingTariffElement>\n\n not_before?: string,\n not_after?: string,\n created?: string,\n last_updated?: string,\n\n signatures?: Array<ISignatureRS>\n\n}\n\nexport type ShowPKIDetailsFunction = (pkiData: unknown) => void;\n\nexport type IssueReportPayload = {\n timestamp: string;\n chargyVersion: string;\n platform: string;\n invalidCTR: boolean;\n InvalidStationData: boolean;\n invalidSignatures: boolean;\n invalidCertificates: boolean;\n transparencenySoftwareBug: boolean;\n DSGVO: boolean;\n BITV: boolean;\n description: string;\n chargeTransparencyRecord?: string;\n name: string;\n phone: string;\n eMail: string;\n};\n","/*\r\n * Copyright (c) 2018-2026 GraphDefined GmbH <achim.friedland@graphdefined.com>\r\n * This file is part of Chargy Desktop App <https://github.com/OpenChargingCloud/ChargyDesktopApp>\r\n *\r\n * Licensed under the Affero GPL license, Version 3.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.gnu.org/licenses/agpl.html\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n\r\nimport * as chargyInterfaces from './interfaces/chargyInterfaces'\nimport Decimal from 'decimal.js';\nimport moment from 'moment';\nimport type { Moment } from 'moment';\n\r\n\r\nexport type JSONLDObject = {\r\n \"@context\": number;\r\n};\r\n\r\nexport function isJSONLDObject(value: unknown): value is JSONLDObject {\r\n\r\n if (typeof value !== \"object\" || value === null) {\r\n return false;\r\n }\r\n\r\n const obj = value as Record<string, unknown>;\r\n\r\n return typeof obj[\"@context\"] === \"string\";\r\n\r\n}\r\n\r\nexport function toArrayBuffer(data: ArrayBuffer | Uint8Array): ArrayBuffer {\r\n\r\n if (data instanceof ArrayBuffer)\r\n return data;\r\n\r\n return data.buffer.slice(data.byteOffset, data.byteOffset + data.byteLength) as ArrayBuffer;\r\n\r\n}\r\n\r\nexport function toUint8Array(data: ArrayBuffer | Uint8Array): Uint8Array {\r\n\r\n return data instanceof Uint8Array\r\n ? data\r\n : new Uint8Array(data);\r\n\r\n}\r\n\r\nexport function normalizeXMLText(xmlText: string | undefined): string {\r\n\r\n return (xmlText ?? \"\").\r\n replace(/^\\uFEFF/, \"\").\r\n replace(/\\r\\n?/g, \"\\n\").\r\n replace(/>\\s+</g, \"><\").\r\n trim();\r\n\r\n}\r\n\r\nexport function getDirectChildrenByLocalName(parent: Document | Element, localName: string): Element[] {\r\n return Array.from(parent.childNodes).\r\n filter((child): child is Element => child.nodeType === 1).\r\n filter(child => child.localName === localName || child.nodeName === localName);\r\n}\r\n\r\nexport function getDirectChildByLocalName(parent: Document | Element, localName: string): Element | undefined {\r\n return getDirectChildrenByLocalName(parent, localName)[0];\r\n}\r\n\r\nexport function getTrimmedTextContent(element?: Element): string | undefined {\r\n const text = element?.textContent.trim();\r\n return text && text.length > 0 ? text : undefined;\r\n}\r\n\r\nexport function parseDescription(parent: Element): chargyInterfaces.IMultilanguageText | undefined {\r\n\r\n const descriptions = getDirectChildrenByLocalName(parent, \"description\");\r\n\r\n const textMap: chargyInterfaces.IMultilanguageText = {};\r\n\r\n for (const description of descriptions)\r\n {\r\n const language = description.getAttribute(\"language\")?.trim() || \"und\";\r\n const text = description.textContent.trim();\r\n\r\n if (text)\r\n textMap[language] = text;\r\n }\r\n\r\n return Object.keys(textMap).length > 0\r\n ? textMap\r\n : undefined;\r\n\r\n}\r\n\r\nexport function getElementsByLocalName(parent: Document | Element,\r\n localName: string)\r\n\r\n : Element[]\r\n\r\n{\r\n\r\n const elements = new Set<Element>();\r\n\r\n try\r\n {\r\n for (const element of Array.from(parent.getElementsByTagName(localName)))\r\n elements.add(element);\r\n }\r\n catch (exception)\r\n {\r\n console.error(\"Error while getting elements by tag name: \" + (exception instanceof Error ? exception.message : String(exception)));\r\n }\r\n\r\n try\r\n {\r\n for (const element of Array.from(parent.getElementsByTagNameNS(\"*\", localName)))\r\n elements.add(element);\r\n }\r\n catch (exception)\r\n {\r\n console.error(\"Error while getting elements by tag name with namespace: \" + (exception instanceof Error ? exception.message : String(exception)));\r\n }\r\n\r\n try\r\n {\r\n for (const element of Array.from(parent.getElementsByTagName(\"*\")))\r\n if (element.localName === localName)\r\n elements.add(element);\r\n }\r\n catch (exception)\r\n {\r\n console.error(\"Error while getting elements from parent and filtering by local name: \" + (exception instanceof Error ? exception.message : String(exception)));\r\n }\r\n\r\n return Array.from(elements);\r\n\r\n}\r\n\r\nexport function ParseJSON_LD(Text: string,\r\n _Context: string = \"\"): Record<string, unknown> {\r\n\r\n void _Context;\r\n\r\n const JObject = JSON.parse(Text) as Record<string, unknown>;\r\n\r\n JObject[\"id\"] = JObject[\"@id\"];\r\n\r\n return JObject;\r\n\r\n}\r\n\r\nexport function firstKey<T extends Record<string, unknown>>(obj: T): keyof T | undefined {\r\n for (const a in obj)\r\n return a;\r\n}\r\n\r\nexport function firstValue<T>(obj: Record<string, T> | undefined): T | undefined {\r\n if (obj == undefined)\r\n return undefined;\r\n\r\n for (const a in obj)\r\n return obj[a];\r\n}\r\n\r\nlet uiLocale = typeof window !== \"undefined\"\r\n ? window.navigator.language\r\n : \"de\";\r\n\r\nexport function setUILocale(locale: string): void {\r\n\r\n uiLocale = locale;\r\n moment.locale(locale);\r\n\r\n}\r\n\r\nexport function parseUTC(UTCTime: string|number): Moment {\n\r\n moment.locale(uiLocale);\r\n\r\n return typeof UTCTime === 'string'\r\n ? moment.utc(UTCTime).local()\r\n : moment.unix(UTCTime).local()\r\n\r\n}\r\n\r\nexport function time2human(Time: string|number): string {\r\n\r\n moment.locale(uiLocale);\r\n\r\n return (typeof Time === 'string'\r\n ? moment(Time)\r\n : moment.unix(Time)).\r\n format('dddd, D; MMM YYYY HH:mm:ss').\r\n replace(\".\", \"\"). // Nov. -> Nov\r\n replace(\";\", \".\") + // 14; -> 14.\r\n (uiLocale.toLowerCase().startsWith(\"de\") ? \" Uhr\" : \"\");\r\n\r\n}\r\n\r\nexport function UTC2human(UTCTime: string|number): string {\r\n\r\n moment.locale(uiLocale);\r\n\r\n return (typeof UTCTime === 'string'\r\n ? moment.utc(UTCTime)\r\n : moment.unix(UTCTime)).\r\n format('dddd, D; MMM YYYY HH:mm:ss').\r\n replace(\".\", \"\"). // Nov. -> Nov\r\n replace(\";\", \".\") + // 14; -> 14.\r\n (uiLocale.toLowerCase().startsWith(\"de\") ? \" Uhr\" : \"\");\r\n\r\n}\r\n\r\nexport function parseOBIS(OBIS: string): string\r\n{\r\n\r\n if (OBIS.length != 12)\r\n throw new Error(`Invalid OBIS number '${OBIS}'!`);\r\n\r\n // DIN EN 62056-61:2002\r\n // https://wiki.volkszaehler.org/software/obis\r\n // https://github.com/volkszaehler/vzlogger/blob/master/src/Obis.cpp\r\n // https://www.promotic.eu/en/pmdoc/Subsystems/Comm/PmDrivers/IEC62056_OBIS.htm\r\n // https://www.bundesnetzagentur.de/DE/Service-Funktionen/Beschlusskammern/BK06/BK6_81_GPKE_GeLi/Mitteilung_nr_62/Anlagen/Codeliste_OBIS_Kennzahlen_2.2g.pdf?__blob=publicationFile&v=2\r\n // https://www.bundesnetzagentur.de/DE/Beschlusskammern/BK06/BK6_81_GPKE_GeLi/Mitteilung_Nr_20/Anlagen/Obis-Kennzahlen-System_2.0.pdf?__blob=publicationFile&v=2\r\n // https://www.edi-energy.de/index.php?id=38&tx_bdew_bdew%5Buid%5D=2084&tx_bdew_bdew%5Baction%5D=download&tx_bdew_bdew%5Bcontroller%5D=Dokument&cHash=0db4ac05eb3e647669c5e9ac7bca093b\r\n // http://www.nzr.de/download.php?id=612: 1.17.0 => Signierter Zählerstand (nur im EDL40-Modus)\r\n\r\n // format: \"A-B:C.D.E[*&]F\"\r\n // A, B, E, F are optional\r\n // C & D are mandatory\r\n const media = parseInt(OBIS.substring( 0, 2), 16); // A => 1: Energie\r\n const channel = parseInt(OBIS.substring( 2, 4), 16); // B => 0: No channels available\r\n const indicator = parseInt(OBIS.substring( 4, 6), 16); // C => 1: Wirkenergie Bezug P+, kWh\r\n const mode = parseInt(OBIS.substring( 6, 8), 16); // D => 17: Signierter Momentanwert (vgl. 7)\r\n const quantities = parseInt(OBIS.substring( 8, 10), 16); // E => 0: Total\r\n const storage = parseInt(OBIS.substring(10, 12), 16); // F\r\n\r\n return `${String(media)}-${String(channel)}:${String(indicator)}.${String(mode)}.${String(quantities)}*${String(storage)}`;\r\n\r\n}\r\n\r\nexport const OBIS_RegExpr = new RegExp(\"((\\\\d+)\\\\-)?((\\\\d+):)?((\\\\d+)\\\\.)(\\\\d+)(\\\\.(\\\\d+))?(\\\\*(\\\\d+))?\");\r\n\r\nexport function OBIS2Hex(OBIS: string): string\r\n{\r\n\r\n // 1-0:1.8.0*255 => 0100010800ff\r\n\r\n const OBISElements = OBIS.match(OBIS_RegExpr);\r\n\r\n return OBISElements == null\r\n ? \"000000000000\"\r\n : parseInt(OBISElements[ 2] ?? \"00\").toString(16).padStart(2, \"0\") + // optional A\r\n parseInt(OBISElements[ 4] ?? \"00\").toString(16).padStart(2, \"0\") + // optional B\r\n parseInt(OBISElements[ 6] ?? \"00\").toString(16).padStart(2, \"0\") + // mandatory C\r\n parseInt(OBISElements[ 7] ?? \"00\").toString(16).padStart(2, \"0\") + // mandatory D\r\n parseInt(OBISElements[ 9] ?? \"00\").toString(16).padStart(2, \"0\") + // optional E\r\n parseInt(OBISElements[11] ?? \"00\").toString(16).padStart(2, \"0\"); // optional F\r\n\r\n}\r\n\r\nexport function OBIS2MeasurementName(OBISString: string) : string\r\n{\r\n switch (OBISString)\r\n {\r\n\r\n case \"1-0:1.7.0*255\":\r\n return \"Total Real Power\";\r\n\r\n case \"1-0:1.8.0*198\":\r\n return \"ENERGY_TOTAL\";\r\n\r\n case \"1-0:1.8.0*255\":\r\n return \"ENERGY_TOTAL\";\r\n\r\n case \"1-0:1.17.0*255\":\r\n return \"ENERGY_TOTAL\";\r\n\r\n // https://www.dzg.de/fileadmin/dzg/content/downloads/produkte-zaehler/gsh/DZG_GSH01_product_manual_2022_12_08.pdf\r\n // Obis Code Description Data Type Unit Scaler Displayed Accuracy OCMF Accuracy\r\n // --------------- -------------------------------------------------------------------------------- ----------- ------ -------- -------------------- ---------------\r\n // 1-0:1.8.0*255 Total Import Mains Energy Upper Line Content (Billing Relevant) int64_t kWh -4 2 3\r\n // 1-0:140.7.0*255 Line Loss Impedance Upper Line Content (Billing Relevant) uint16_t Ohm -4\r\n // 1-0:152.8.0*255 Total Transaction Import Device Energy Upper Line Content (Billing Relevant)\r\n //--------------------------------------------------------------------------------------------------------------------------------------------------------------------\r\n // 1-0:31.7.0*255 Phase L1 Current - int32_t A -2 1 -\r\n // 1-0:32.7.0*255 Phase L1 Voltage - int32_t V -2 1 -\r\n // 1-0:1.7.0*255 Total Import Mains Power - int32_t W -2 1 -\r\n // 1.0:156.7.0*255 Import Device Power - int32_t W -2 1 -\r\n // 1.0:154.7.0*255 Import Line Loss Power - int32_t W -2 1 -\r\n // 1-0:16.7.0*255 Total Device Power - int64_t W -2 1 -\r\n // 1-0:154.8.0*255 Total Import Line Loss Energy - int64_t kWh -4 2 3\r\n // 1-0:156.8.0*255 Total Import Device Energy - int64_t kWh -4 2 3\r\n\r\n case \"1-0:152.8.0*255\":\r\n case \"01-00:98.08.00.FF\":\r\n return \"ENERGY_TOTAL\";\r\n\r\n default:\r\n return OBISString;\r\n\r\n }\r\n}\r\n\r\nexport function measurementName2human(In: string) : string\r\n{\r\n switch (In)\r\n {\r\n\r\n case \"ENERGY_TOTAL\":\r\n return \"Bezogene Energiemenge\";\r\n\r\n default:\r\n return In;\r\n\r\n }\r\n}\r\n\r\nexport function IsNullOrEmpty(value: string|undefined): boolean {\r\n return !value;\r\n}\r\n\r\nexport function WhenNullOrEmpty(value: string|undefined, replacement: string): string {\r\n\r\n if (!value)\r\n return replacement;\r\n\r\n return value;\r\n\r\n}\r\n\r\nexport function hex2bin(hex: string, Reverse?: boolean) : string {\r\n\r\n if (Reverse)\r\n {\r\n\r\n const reversed: string[] = [];\r\n\r\n for (let i = 0; i < hex.length; i += 2)\r\n reversed.push(hex.substring(i, i + 2));\r\n\r\n return (\"00000000\" + (parseInt(reversed.reverse().join(\"\"), 16)).toString(2)).slice(-8);\r\n\r\n }\r\n\r\n return (\"00000000\" + (parseInt(hex, 16)).toString(2)).slice(-8);\r\n\r\n}\r\n\r\nexport function hex32(val: number) {\r\n val &= 0xFFFFFFFF;\r\n const hex = val.toString(16).toUpperCase();\r\n return (\"00000000\" + hex).slice(-8);\r\n}\r\n\r\nexport function parseHexString(str: string): number[] {\r\n\r\n const result:number[] = [];\r\n\r\n while (str.length >= 2) {\r\n result.push(parseInt(str.substring(0, 2), 16));\r\n str = str.substring(2, str.length);\r\n }\r\n\r\n return result;\r\n\r\n}\r\n\r\nexport function createHexString(arr: Iterable<number>) {\r\n\r\n let result = \"\";\r\n\r\n for (const value of arr) {\r\n let str = value.toString(16);\r\n str = str.length == 0 ? \"00\" :\r\n str.length == 1 ? \"0\" + str : \r\n str.length == 2 ? str :\r\n str.substring(str.length-2, str.length);\r\n result += str;\r\n }\r\n\r\n return result;\r\n\r\n}\r\n\r\nexport function buf2hex(buffer: ArrayBuffer|Uint8Array) {\r\n return Array.prototype.map.call(new Uint8Array(buffer), (x:number) => ('00' + x.toString(16)).slice(-2)).join('');\r\n}\r\n\r\nexport function hexToArrayBuffer(hex: string): ArrayBuffer {\r\n\r\n if ((hex.length % 2) !== 0) {\r\n throw new RangeError('Expected string to be an even number of characters')\r\n }\r\n\r\n const view = new Uint8Array(hex.length / 2)\r\n\r\n for (let i = 0; i < hex.length; i += 2) {\r\n view[i / 2] = parseInt(hex.substring(i, i + 2), 16)\r\n }\r\n\r\n return view.buffer\r\n\r\n}\r\n\r\nexport async function hashFile(url: string): Promise<ArrayBuffer>\r\n{\r\n try\r\n {\r\n\r\n const response = await fetch(url);\r\n\r\n if (!response.ok)\r\n throw new Error(`Failed to fetch ${url}: ${response.statusText}`);\r\n\r\n return await crypto.subtle.digest('SHA-512', await response.arrayBuffer());\r\n\r\n } catch (error) {\r\n console.error(`Error fetching or hashing ${url}: ${String(error)}`);\r\n return new ArrayBuffer(0);\r\n }\r\n}\r\n\r\nexport function ConcatenateBuffers(buffers: ArrayBuffer[]): ArrayBuffer {\r\n\r\n const totalLength = buffers.reduce((acc, value) => acc + value.byteLength, 0);\r\n const result = new Uint8Array(totalLength);\r\n let length = 0;\r\n\r\n for (const buffer of buffers) {\r\n result.set(new Uint8Array(buffer), length);\r\n length += buffer.byteLength;\r\n }\r\n\r\n return result.buffer;\r\n\r\n}\r\n\r\nexport function intFromBytes(x: number[]){\r\n\r\n let val = 0;\r\n\r\n for (let i = 0; i < x.length; ++i) {\r\n val += x[i] ?? 0;\r\n if (i < x.length-1) {\r\n val = val << 8;\r\n }\r\n }\r\n\r\n return val;\r\n\r\n}\r\n\r\nexport function getInt8Bytes(x: number) : number[] {\r\n\r\n const bytes:number[] = [];\r\n let i = 1;\r\n\r\n do {\r\n bytes[--i] = x & (255);\r\n x = x>>8;\r\n } while (i)\r\n\r\n return bytes;\r\n\r\n}\r\n\r\nexport function getInt16Bytes(x: number) : number[] {\r\n\r\n const bytes:number[] = [];\r\n let i = 2;\r\n\r\n do {\r\n bytes[--i] = x & (255);\r\n x = x>>8;\r\n } while (i)\r\n\r\n return bytes;\r\n\r\n}\r\n\r\nexport function getInt32Bytes(x: number) : number[] {\r\n\r\n const bytes:number[] = [];\r\n let i = 4;\r\n\r\n do {\r\n bytes[--i] = x & (255);\r\n x = x>>8;\r\n } while (i)\r\n\r\n return bytes;\r\n\r\n}\r\n\r\nexport function getInt64Bytes(x: number) : number[] {\r\n\r\n const bytes:number[] = [];\r\n let i = 8;\r\n\r\n do {\r\n bytes[--i] = x & (255);\r\n x = x>>8;\r\n } while (i)\r\n\r\n return bytes;\r\n\r\n}\r\n\r\nexport function SetHex(dv: DataView, hex: string, offset: number, reverse?: boolean): string\r\n{\r\n\r\n const bytes = parseHexString(hex);\r\n const buffer = new ArrayBuffer(bytes.length);\r\n const tv = new DataView(buffer);\r\n\r\n if (reverse)\r\n bytes.reverse();\r\n\r\n for (let i = 0; i < bytes.length; i++) {\r\n dv.setUint8(offset + i, bytes[i] ?? 0);\r\n tv.setUint8(i, bytes[i] ?? 0);\r\n }\r\n\r\n return buf2hex(buffer);\r\n\r\n}\r\n\r\nexport function SetTimestamp(dv: DataView, timestamp: string | Moment | undefined, offset: number, addLocalOffset: boolean = true): string\n{\r\n\r\n if (timestamp == undefined)\r\n throw new Error(\"Timestamp is missing!\");\r\n\r\n if (typeof timestamp === 'string')\r\n timestamp = parseUTC(timestamp);\r\n\r\n const unixtime = timestamp.unix() + (addLocalOffset ? 60 * timestamp.utcOffset() : 0); // Usage of utcOffset() is afaik EMH specific!\r\n const bytes = getInt64Bytes(unixtime);\r\n const buffer = new ArrayBuffer(8);\r\n const tv = new DataView(buffer);\r\n\r\n for (let i = 4; i < bytes.length; i++) {\r\n dv.setUint8(offset + (bytes.length - i - 1), bytes[i] ?? 0);\r\n tv.setUint8(bytes.length - i - 1, bytes[i] ?? 0);\r\n }\r\n\r\n return buf2hex(buffer);\r\n\r\n}\r\n\r\nexport function SetTimestamp32(dv: DataView, timestamp: string | Moment | undefined, offset: number, addLocalOffset: boolean = true): string\n{\r\n\r\n if (timestamp == undefined)\r\n throw new Error(\"Timestamp is missing!\");\r\n\r\n if (typeof timestamp === 'string')\r\n timestamp = parseUTC(timestamp);\r\n\r\n const unixtime = timestamp.unix() + (addLocalOffset ? 60 * timestamp.utcOffset() : 0); // Usage of utcOffset() is afaik EMH specific!\r\n const bytes = getInt64Bytes(unixtime);\r\n const buffer = new ArrayBuffer(4);\r\n const tv = new DataView(buffer);\r\n\r\n for (let i = 4; i < bytes.length; i++) {\r\n dv.setUint8(offset + (bytes.length - i - 1), bytes[i] ?? 0);\r\n tv.setUint8(bytes.length - i - 1, bytes[i] ?? 0);\r\n }\r\n\r\n return buf2hex(buffer);\r\n\r\n}\r\n\r\nexport function SetInt8(dv: DataView, value: number, offset: number): string\r\n{\r\n\r\n const buffer = new ArrayBuffer(1);\r\n const tv = new DataView(buffer);\r\n\r\n dv.setInt8(offset, value);\r\n tv.setInt8(0, value);\r\n\r\n return buf2hex(buffer);\r\n\r\n}\r\n\r\nexport function SetUInt32(dv: DataView, value: number, offset: number, reverse?: boolean): string\r\n{\r\n\r\n const bytes = getInt32Bytes(value);\r\n const buffer = new ArrayBuffer(bytes.length);\r\n const tv = new DataView(buffer);\r\n\r\n if (reverse)\r\n bytes.reverse();\r\n\r\n for (let i = 0; i < bytes.length; i++) {\r\n dv.setUint8(offset + i, bytes[i] ?? 0);\r\n tv.setUint8(i, bytes[i] ?? 0);\r\n }\r\n\r\n return buf2hex(buffer);\r\n\r\n}\r\n\r\nexport function SetUInt64(dv: DataView, value: number, offset: number, reverse?: boolean): string\r\n{\r\n\r\n const bytes = getInt64Bytes(value);\r\n const buffer = new ArrayBuffer(bytes.length);\r\n const tv = new DataView(buffer);\r\n\r\n if (reverse)\r\n bytes.reverse();\r\n\r\n for (let i = 0; i < bytes.length; i++) {\r\n dv.setUint8(offset + i, bytes[i] ?? 0);\r\n tv.setUint8(i, bytes[i] ?? 0);\r\n }\r\n\r\n return buf2hex(buffer);\r\n\r\n}\r\n\r\nexport function SetUInt64D(dv: DataView, value: Decimal, offset: number, reverse?: boolean): string\r\n{\r\n return SetUInt64(dv,\r\n value.toNumber(),\r\n offset,\r\n reverse);\r\n}\r\n\r\nexport function SetText(dv: DataView, text: string, offset: number): string\r\n{\r\n\r\n //var bytes = new TextEncoder(\"utf-8\").encode(text);\r\n const bytes = new TextEncoder().encode(text);\r\n const buffer = new ArrayBuffer(bytes.length);\r\n const tv = new DataView(buffer);\r\n\r\n for (let i = 0; i < bytes.length; i++) {\r\n dv.setUint8(offset + i, bytes[i] ?? 0);\r\n tv.setUint8(i, bytes[i] ?? 0);\r\n }\r\n\r\n return buf2hex(buffer);\r\n\r\n}\r\n\r\n\r\nexport function SetUInt32_withCode(dv: DataView, value: number, scale: number, obis: number, offset: number, reverse?: boolean): string\r\n{\r\n\r\n const valueBytes = getInt32Bytes(value);\r\n const scaleBytes = getInt8Bytes(scale);\r\n const obisBytes = getInt8Bytes(obis);\r\n const buffer = new ArrayBuffer(valueBytes.length + 2);\r\n const tv = new DataView(buffer);\r\n\r\n if (reverse)\r\n valueBytes.reverse();\r\n\r\n for (let i = 0; i < valueBytes.length; i++) {\r\n dv.setUint8(offset + i, valueBytes[i] ?? 0);\r\n tv.setUint8(i, valueBytes[i] ?? 0);\r\n }\r\n\r\n dv.setUint8(offset + valueBytes.length, scaleBytes[0] ?? 0);\r\n tv.setInt8 ( valueBytes.length, scaleBytes[0] ?? 0);\r\n dv.setUint8(offset + valueBytes.length + 1, obisBytes[0] ?? 0);\r\n tv.setInt8 ( valueBytes.length + 1, obisBytes[0] ?? 0);\r\n\r\n const result = buf2hex(buffer);\r\n\r\n return result.slice(0, 8) + \"·\" + result.slice(8, 10) + \"·\" + result.slice(10, 12);\r\n\r\n}\r\n\r\nexport function SetText_withLength(dv: DataView, text: string, offset: number): string\r\n{\r\n\r\n //var bytes = new TextEncoder(\"utf-8\").encode(text);\r\n const bytes = new TextEncoder().encode(text);\r\n const buffer = new ArrayBuffer(4 + bytes.length);\r\n const tv = new DataView(buffer);\r\n\r\n dv.setInt32(offset, bytes.length);\r\n tv.setInt32(0, bytes.length);\r\n\r\n for (let i = 0; i < bytes.length; i++) {\r\n dv.setUint8(offset + 4 + i, bytes[i] ?? 0);\r\n tv.setUint8( 4 + i, bytes[i] ?? 0);\r\n }\r\n\r\n const result = buf2hex(buffer);\r\n\r\n return bytes.length > 0\r\n ? result.slice(0, 8) + \"·\" + result.slice(8)\r\n : result;\r\n\r\n}\r\n\r\n\r\nexport function Clone<T>(obj: T): T {\r\n\r\n if (obj == null || typeof(obj) != 'object')\r\n return obj;\r\n\r\n const source = obj as Record<string, unknown>;\r\n const temp = new ((obj as { constructor: new () => Record<string, unknown> }).constructor)();\r\n\r\n for(const key in source)\r\n temp[key] = Clone(source[key]);\r\n\r\n return temp as T;\r\n\r\n}\r\n\r\n\r\nexport function openFullscreen() {\r\n\r\n if (document.fullscreenEnabled && !document.fullscreenElement)\r\n void document.documentElement.requestFullscreen();\r\n\r\n}\r\n\r\nexport function closeFullscreen() {\r\n\r\n if (document.fullscreenElement)\r\n void document.exitFullscreen();\r\n\r\n}\r\n\r\n\r\nexport function CreateDiv(ParentDiv: HTMLDivElement,\r\n ClassName?: string,\r\n InnerHTML?: string) : HTMLDivElement\r\n{\r\n\r\n const childDiv = ParentDiv.appendChild(document.createElement('div'));\r\n\r\n if (ClassName != null)\r\n childDiv.className = ClassName;\r\n\r\n if (InnerHTML != null)\r\n childDiv.innerHTML = InnerHTML;\r\n\r\n return childDiv;\r\n\r\n}\r\n\r\nexport function CreateDiv2(ParentDiv: HTMLDivElement,\r\n ChildClassName: string,\r\n // ChildAClassName: string,\r\n ChildAInnerHTML: string,\r\n // ChildBClassName: string,\r\n ChildBInnerHTML: string) : HTMLDivElement\r\n{\r\n\r\n const childDiv = ParentDiv.appendChild(document.createElement('div'));\r\n childDiv.className = ChildClassName;\r\n\r\n const childADiv = childDiv.appendChild(document.createElement('div'));\r\n childADiv.className = ChildClassName + \"Id\";\r\n childADiv.innerHTML = ChildAInnerHTML;\r\n\r\n const childBDiv = childDiv.appendChild(document.createElement('div'));\r\n childBDiv.className = ChildClassName + \"Value\";\r\n childBDiv.innerHTML = ChildBInnerHTML;\r\n\r\n return childDiv;\r\n\r\n}\r\n\r\n\r\n\r\n\r\nexport interface String {\r\n isNullOrEmpty(): boolean;\r\n isNotNullOrEmpty(): boolean;\r\n}\r\n\r\n// String.prototype.isNullOrEmpty = function() {\r\n// return !(typeof this === \"string\" && this.length > 0);\r\n// }\r\n\r\n// String.prototype.isNotNullOrEmpty = function() {\r\n// return typeof this === \"string\" && this.length > 0;\r\n// }\r\n\r\nexport function pad(text: string|undefined, paddingValue: number) {\r\n\r\n if (text == undefined)\r\n text = \"\";\r\n\r\n return (text + Array(2*paddingValue).join('0')).substring(0, 2*paddingValue);\r\n\r\n};\r\n\r\n// export async function sha224(message: string|DataView) {\r\n\r\n// let hashBuffer = null;\r\n// const SHA224 = require(\"sha224\");\r\n\r\n// if (typeof message === 'string')\r\n// hashBuffer = SHA224(Buffer.from(message, 'utf8'));\r\n// else\r\n// hashBuffer = SHA224(message);\r\n\r\n// // const hashArray = Array.from(hashBuffer); // convert hash to byte array\r\n// const hashHex = hashBuffer.toString(\"hex\");\r\n\r\n// return hashHex;\r\n\r\n// }\r\n\r\n\r\n/**\r\n * Calculate the SHA256 hash\r\n * @param message a text of data view\r\n * @returns true, when the given text exists and is a valid string\r\n */\r\nexport async function sha256(message: string|DataView): Promise<string> {\r\n\r\n let hashBuffer: ArrayBuffer | null;\r\n\r\n if (typeof message === 'string')\r\n hashBuffer = await crypto.subtle.digest('SHA-256', Buffer.from(message, 'utf8'));\r\n else\r\n hashBuffer = await crypto.subtle.digest('SHA-256', message as BufferSource);\r\n\r\n const hashArray = Array.from(new Uint8Array(hashBuffer)); // convert hash to byte array\r\n const hashHex = hashArray.map(b => ('00' + b.toString(16)).slice(-2)).join('').toLowerCase(); // convert bytes to hex string\r\n\r\n return hashHex;\r\n\r\n}\r\n\r\n/**\r\n * Calculate the SHA384 hash\r\n * @param message a text of data view\r\n * @returns true, when the given text exists and is a valid string\r\n */\r\nexport async function sha384(message: string|DataView): Promise<string> {\r\n\r\n let hashBuffer: ArrayBuffer | null;\r\n\r\n if (typeof message === 'string')\r\n hashBuffer = await crypto.subtle.digest('SHA-384', Buffer.from(message, 'utf8'));\r\n else\r\n hashBuffer = await crypto.subtle.digest('SHA-384', message as BufferSource);\r\n\r\n const hashArray = Array.from(new Uint8Array(hashBuffer)); // convert hash to byte array\r\n const hashHex = hashArray.map(b => ('00' + b.toString(16)).slice(-2)).join('').toLowerCase(); // convert bytes to hex string\r\n\r\n return hashHex;\r\n\r\n}\r\n\r\n/**\r\n * Calculate the SHA512 hash\r\n * @param message a text of data view\r\n * @returns true, when the given text exists and is a valid string\r\n */\r\nexport async function sha512(message: string|DataView): Promise<string> {\r\n\r\n let hashBuffer: ArrayBuffer | null;\r\n\r\n if (typeof message === 'string')\r\n hashBuffer = await crypto.subtle.digest('SHA-512', Buffer.from(message, 'utf8'));\r\n else\r\n hashBuffer = await crypto.subtle.digest('SHA-512', message as BufferSource);\r\n\r\n const hashArray = Array.from(new Uint8Array(hashBuffer)); // convert hash to byte array\r\n const hashHex = hashArray.map(b => ('00' + b.toString(16)).slice(-2)).join('').toLowerCase(); // convert bytes to hex string\r\n\r\n return hashHex;\r\n\r\n}\r\n\r\n\r\n/**\r\n * A JSON object after runtime validation. Property values stay `unknown`\r\n * and have to be narrowed individually (e.g. via isMandatoryString).\r\n */\r\nexport type JSONObject = Record<string, unknown>;\r\n\r\n/**\r\n * Returns the given value as a json object, or undefined when it is not a json object.\r\n */\r\nexport function asJSONObject(value: unknown): JSONObject | undefined {\r\n return isMandatoryJSONObject(value) ? value : undefined;\r\n}\r\n\r\n/**\r\n * Returns the given value as a json array, or undefined when it is not a json array.\r\n */\r\nexport function asJSONArray(value: unknown): unknown[] | undefined {\r\n return Array.isArray(value) ? value : undefined;\r\n}\r\n\r\n/**\r\n * Returns the given value as a string, or undefined when it is not a string.\r\n */\r\nexport function asString(value: unknown): string | undefined {\r\n return typeof value === \"string\" ? value : undefined;\r\n}\r\n\r\n/**\r\n * Returns the given value as a number, or undefined when it is not a number.\r\n */\r\nexport function asNumber(value: unknown): number | undefined {\r\n return typeof value === \"number\" ? value : undefined;\r\n}\r\n\r\n/**\r\n * Ensures, that the given json object exists and is a valid json object\r\n * @param value a json object\r\n * @returns true, when the given json object exists and is a valid json object\r\n */\r\nexport function isMandatoryJSONObject(value: unknown): value is JSONObject {\r\n\r\n return typeof value === \"object\" && \r\n value !== null &&\r\n !Array.isArray(value);\r\n\r\n}\r\n\r\n/**\r\n * Checks, whether the given json object exists and if yes wether it is a valid json object\r\n * @param jsonObject a json object\r\n * @returns true, when the given json object does not exist or when it exists, that it is a valid json object\r\n */\r\nexport function isOptionalJSONObject(value: unknown): value is JSONObject | undefined | null {\r\n\r\n return value === null ||\r\n value === undefined ||\r\n (typeof value === \"object\" && !Array.isArray(value));\r\n\r\n}\r\n\r\n/**\r\n * Ensures, that the given json array exists and is a valid json array\r\n * @param value a json array\r\n * @returns true, when the given json array exists and is a valid json array\r\n */\r\nexport function isMandatoryJSONArray(value: unknown): value is unknown[] {\r\n return Array.isArray(value);\r\n}\r\n\r\n/**\r\n * Ensures, that the given json array of strings exists and is a valid json array of strings\r\n * @param value a json array of strings\r\n * @returns true, when the given json array exists of strings and is a valid json array of strings\r\n */\r\nexport function isMandatoryArrayOfStrings(value: unknown): value is string[] {\r\n return Array.isArray(value) && value.every(element => typeof element === \"string\");\r\n}\r\n\r\n/**\r\n * Checks, whether the given json array exists and if yes wether it is a valid json array\r\n * @param value a json array\r\n * @returns true, when the given json array does not exist or when it exists and is a valid json array\r\n */\r\nexport function isOptionalJSONArray(value: unknown): value is unknown[] | undefined | null {\r\n\r\n return value === undefined ||\r\n value === null ||\r\n Array.isArray(value);\r\n\r\n}\r\n\r\n/**\r\n * Checks, whether the given json array of strings exists and if yes wether it is a valid json array of strings\r\n * @param value a json array of strings\r\n * @returns true, when the given json array of strings does not exist or when it exists and is a valid json array of strings\r\n */\r\nexport function isOptionalArrayOfStrings(value: unknown): value is string[] | undefined | null {\r\n\r\n return value === undefined ||\r\n value === null ||\r\n (Array.isArray(value) && value.every(element => typeof element === \"string\"));\r\n\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n/**\r\n * Checks, whether the given json array exists and if yes wether it is a valid json object\r\n * @param jsonArray a json object\r\n * @returns true, when the given json array does not exist or when it exists, that it is a valid json array\r\n */\r\nexport function isOptionalJSONArrayError(jsonArray: unknown) {\r\n\r\n if (jsonArray !== undefined && jsonArray !== null)\r\n return typeof jsonArray !== \"object\" || !Array.isArray(jsonArray);\r\n\r\n return false;\r\n\r\n}\r\n\r\n/**\r\n * Checks, whether the given json array exists and if yes wether it is a valid json object\r\n * @param jsonArray a json object\r\n * @returns true, when the given json array does not exist or when it exists, that it is a valid json array\r\n */\r\n export function isOptionalJSONArrayOk(jsonArray: unknown) {\r\n\r\n if (jsonArray !== undefined && jsonArray !== null)\r\n return typeof jsonArray === \"object\" && Array.isArray(jsonArray);\r\n\r\n return true;\r\n\r\n}\r\n\r\n\r\n/**\r\n * Ensures, that the given boolean exists and is a valid boolean\r\n * @param value a boolean\r\n * @returns true, when the given boolean exists and is a valid boolean\r\n */\r\nexport function isMandatoryBoolean(value: unknown): value is boolean {\r\n return typeof value === \"boolean\";\r\n}\r\n\r\n/**\r\n * Ensures, that the given text exists and is a valid string\r\n * @param value a string\r\n * @returns true, when the given text exists and is a valid string\r\n */\r\nexport function isMandatoryString(value: unknown): value is string {\r\n return typeof value === \"string\";\r\n}\r\n\r\n/**\r\n * Ensures, that the given text is a valid string, if it exists\r\n * @param value a string\r\n * @returns true, when the given text is a valid string, if it exists\r\n */\r\nexport function isOptionalString(value: unknown): value is string | undefined | null {\r\n\r\n return typeof value === \"string\" ||\r\n value === undefined ||\r\n value === null;\r\n\r\n}\r\n\r\n/**\r\n * Ensures, that the given text exists and is a valid URL\r\n * @param value an URL\r\n * @returns true, when the given text exists and is a valid URL\r\n */\r\nexport function isMandatoryURL(value: unknown): value is string {\r\n return typeof value === \"string\" && value.startsWith(\"https://\");\r\n}\r\n\r\n/**\r\n * Ensures, that the given text is a valid URL, if it exists\r\n * @param value an URL\r\n * @returns true, when the given text is a valid URL, if it exists\r\n */\r\nexport function isOptionalURL(value: unknown): value is string | undefined | null {\r\n\r\n return (typeof value === \"string\" && value.startsWith(\"https://\") ||\r\n value === undefined ||\r\n value === null);\r\n\r\n}\r\n\r\n\r\n/**\r\n * Ensures, that the given number exists and is a valid number\r\n * @param value a number\r\n * @returns true, when the given number exists and is a valid number\r\n */\r\nexport function isMandatoryNumber(value: unknown): value is number {\r\n return typeof value === \"number\";\r\n}\r\n\r\n/**\r\n * Ensures, that the given number is a valid number, if it exists\r\n * @param value a number\r\n * @returns true, when the given number is a valid number, if it exists\r\n */\r\nexport function isOptionalNumber(value: unknown): value is number | undefined | null {\r\n\r\n return typeof value === \"number\" ||\r\n value === undefined ||\r\n value === null;\r\n\r\n}\r\n\r\n/**\r\n * Ensures, that the given decimal number exists and is a valid decimal number\r\n * @param value a decimal number\r\n * @returns true, when the given decimal number exists and is a valid decimal number\r\n */\r\nexport function isMandatoryDecimal(value: unknown): value is Decimal {\r\n\r\n if (value instanceof Decimal || typeof value === \"number\")\r\n return true;\r\n\r\n if (typeof value === \"string\") {\r\n try\r\n {\r\n new Decimal(value);\r\n return true;\r\n }\r\n catch {\r\n console.error(`Value \"${value}\" is not a valid decimal number!`);\r\n }\r\n }\r\n\r\n return false;\r\n\r\n}\r\n\r\n/**\r\n * Ensures, that the given decimal number is a valid decimal number, if it exists\r\n * @param value a decimal number\r\n * @returns true, when the given decimal number is a valid decimal number, if it exists\r\n */\r\nexport function isOptionalDecimal(value: unknown): value is Decimal | undefined | null {\r\n\r\n if (value instanceof Decimal ||\r\n typeof value === \"number\"||\r\n value === undefined ||\r\n value === null)\r\n {\r\n return true;\r\n }\r\n\r\n if (typeof value === \"string\") {\r\n try\r\n {\r\n new Decimal(value);\r\n return true;\r\n }\r\n catch {\r\n console.error(`Value \"${value}\" is not a valid decimal number!`);\r\n }\r\n }\r\n\r\n return false;\r\n\r\n}\r\n\r\n\r\n\r\n\r\nexport function parseNumber(value: string): number | null {\r\n\r\n if (value.trim().length > 0) {\r\n\r\n const parsedNumber = Number(value);\r\n\r\n if (!isNaN(parsedNumber) && isFinite(parsedNumber))\r\n return parsedNumber;\r\n\r\n }\r\n\r\n return null;\r\n\r\n}\r\n\r\n\r\n\r\nexport function InformationRelevanceToString(InfoRelevance: chargyInterfaces.InformationRelevance) : string\r\n{\r\n switch (InfoRelevance) {\r\n case chargyInterfaces.InformationRelevance.Ignored: return \"Ignored\";\r\n case chargyInterfaces.InformationRelevance.Informative: return \"Informative\";\r\n case chargyInterfaces.InformationRelevance.Important: return \"Important\";\r\n default: return \"Unknown\";\r\n }\r\n}\r\n\r\n\r\n//#region jsonPrettyPrinter(value, KeyLookup?)\r\n\r\nexport function jsonPrettyPrinter(value: unknown,\r\n KeyLookup?: (path: string, key: string) => string): string\r\n{\r\n\r\n return _jsonPrettyPrinter(\r\n value,\r\n 0,\r\n \"\",\r\n KeyLookup ?? ((path: string, key: string) => key)\r\n );\r\n\r\n}\r\n\r\nfunction _jsonPrettyPrinter(value: unknown,\r\n indentLevel: number,\r\n path: string,\r\n keyLookup: (path: string, key: string) => string): string\r\n{\r\n\r\n const indent = '&nbsp;'.repeat(indentLevel * 4);\r\n let html = '';\r\n\r\n //#region Arrays\r\n\r\n if (Array.isArray(value)) {\r\n\r\n html += '[<br />';\r\n\r\n value.forEach((item, index) => {\r\n\r\n html += `${indent}&nbsp;&nbsp;&nbsp;&nbsp;${_jsonPrettyPrinter(item, indentLevel + 1, path, keyLookup)}`;\r\n\r\n if (index < value.length - 1)\r\n html += ',';\r\n\r\n html += '<br />';\r\n\r\n });\r\n\r\n html += `${indent}]`;\r\n\r\n }\r\n\r\n //#endregion\r\n\r\n //#region Objects\r\n\r\n else if (typeof value === 'object' && value !== null)\r\n {\r\n\r\n const objectValue = value as Record<string, unknown>;\r\n\r\n html += '{<br />';\r\n const keys = Object.keys(objectValue);\r\n\r\n let maxKeyLength = 0;\r\n\r\n keys.forEach(key => {\r\n maxKeyLength = Math.max(keyLookup(path, key).length + 1, maxKeyLength);\r\n });\r\n\r\n keys.forEach((key, index) => {\r\n\r\n const newPath = path ? `${path}.${key}` : key;\r\n const keyName = keyLookup(path, key);\r\n const requiredSpaces = '&nbsp;'.repeat(maxKeyLength - keyName.length);\r\n html += `${indent}&nbsp;&nbsp;&nbsp;&nbsp;${'<span class=\"jsonKeyName\">' + keyName + '</span>' + requiredSpaces + '(<span class=\"jsonKey\">' + key + '</span>)'}: ${_jsonPrettyPrinter(objectValue[key], indentLevel + 1, newPath, keyLookup)}`;\r\n\r\n if (index < keys.length - 1)\r\n html += ',';\r\n\r\n html += '<br />';\r\n\r\n });\r\n\r\n html += `${indent}}`;\r\n\r\n }\r\n\r\n //#endregion\r\n\r\n //#region Primitive types\r\n\r\n else if (typeof value === 'string')\r\n html += `<span class=\"jsonString\">\"${value}\"</span>`;\r\n\r\n else if (typeof value === 'number')\r\n html += `<span class=\"jsonNumber\">${String(value)}</span>`;\r\n\r\n else if (typeof value === 'boolean')\r\n html += `<span class=\"jsonBoolean\">${String(value)}</span>`;\r\n\r\n //#endregion\r\n\r\n else\r\n html += String(value);\r\n\r\n return html;\r\n\r\n}\r\n\r\n//#endregion\r\n","/*\r\n * Copyright (c) 2018-2026 GraphDefined GmbH <achim.friedland@graphdefined.com>\r\n * This file is part of Chargy Desktop App <https://github.com/OpenChargingCloud/ChargyDesktopApp>\r\n *\r\n * Licensed under the Affero GPL license, Version 3.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.gnu.org/licenses/agpl.html\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n\r\nimport type { Chargy, EllipticCurve } from './chargy'\r\nimport { secp224k1 } from './secp224k1'\r\nimport * as chargyInterfaces from './interfaces/chargyInterfaces'\r\nimport * as chargeTransparencyRecord from './interfaces/IChargeTransparencyRecord'\r\nimport * as chargyLib from './chargyLib'\r\n\r\nexport abstract class ACrypt {\r\n\r\n //#region Data\r\n\r\n readonly description: string;\r\n readonly chargy: Chargy;\r\n\r\n readonly curve192r1: EllipticCurve;\r\n readonly curve224k1: secp224k1;\r\n readonly curve256r1: EllipticCurve;\r\n readonly curve384r1: EllipticCurve;\r\n readonly curve521r1: EllipticCurve;\r\n\r\n //#endregion\r\n\r\n constructor(description: string,\r\n chargy: Chargy) {\r\n\r\n this.description = description;\r\n this.chargy = chargy;\r\n\r\n // NIST/ANSI X9.62 named 192-bit elliptic curve: secp192r1\r\n // https://www.secg.org/sec2-v2.pdf\r\n this.curve192r1 = new this.chargy.elliptic.ec('p192');\r\n\r\n // Koblitz 224-bit curve: secp224k1\r\n // https://www.secg.org/sec2-v2.pdf\r\n this.curve224k1 = new secp224k1();\r\n\r\n // NIST/ANSI X9.62 named 256-bit elliptic curve: secp256r1\r\n // https://www.secg.org/sec2-v2.pdf\r\n this.curve256r1 = new this.chargy.elliptic.ec('p256');\r\n\r\n // NIST/ANSI X9.62 named 384-bit elliptic curve: secp384r1\r\n // https://www.secg.org/sec2-v2.pdf\r\n this.curve384r1 = new this.chargy.elliptic.ec('p384');\r\n\r\n // NIST/ANSI X9.62 named 521-bit elliptic curve: secp521r1\r\n // https://www.secg.org/sec2-v2.pdf\r\n this.curve521r1 = new this.chargy.elliptic.ec('p521');\r\n\r\n }\r\n\r\n //#region Protected methods\r\n\r\n protected CreateLocalizedLine(id: string,\r\n value: string|number,\r\n valueHEX: string,\r\n infoDiv: HTMLDivElement,\r\n bufferDiv: HTMLDivElement)\r\n {\r\n\r\n const lineDiv = chargyLib.CreateDiv(infoDiv, \"row\");\r\n chargyLib.CreateDiv(lineDiv, \"id\", this.chargy.GetLocalizedMessage(id));\r\n chargyLib.CreateDiv(lineDiv, \"value\", (typeof value === \"string\" ? value : value.toString()));\r\n\r\n this.AddToVisualBuffer(valueHEX, bufferDiv, lineDiv);\r\n\r\n }\r\n\r\n protected CreateLine(id: string,\r\n value: string|number,\r\n valueHEX: string,\r\n infoDiv: HTMLDivElement,\r\n bufferDiv: HTMLDivElement)\r\n {\r\n\r\n const lineDiv = chargyLib.CreateDiv(infoDiv, \"row\");\r\n chargyLib.CreateDiv(lineDiv, \"id\", id);\r\n chargyLib.CreateDiv(lineDiv, \"value\", (typeof value === \"string\" ? value : value.toString()));\r\n\r\n this.AddToVisualBuffer(valueHEX, bufferDiv, lineDiv);\r\n\r\n }\r\n\r\n protected AddToVisualBuffer(valueHEX: string,\r\n bufferDiv: HTMLDivElement,\r\n lineDiv: HTMLDivElement)\r\n {\r\n\r\n const newText = chargyLib.CreateDiv(bufferDiv, \"entry\", valueHEX);\r\n\r\n newText.onmouseenter = function(this: GlobalEventHandlers) {\r\n lineDiv.children[0]?.classList.add(\"overEntry\");\r\n lineDiv.children[1]?.classList.add(\"overEntry\");\r\n }\r\n\r\n newText.onmouseleave = function(this: GlobalEventHandlers) {\r\n lineDiv.children[0]?.classList.remove(\"overEntry\");\r\n lineDiv.children[1]?.classList.remove(\"overEntry\");\r\n }\r\n\r\n lineDiv.onmouseenter = function(this: GlobalEventHandlers) {\r\n newText.classList.add(\"overEntry\");\r\n }\r\n\r\n lineDiv.onmouseleave = function(this: GlobalEventHandlers) {\r\n newText.classList.remove(\"overEntry\");\r\n }\r\n\r\n }\r\n\r\n //#endregion\r\n\r\n\r\n abstract VerifyChargingSession(chargingSession: chargeTransparencyRecord.IChargingSession): Promise<chargyInterfaces.ISessionCryptoResult>;\r\n\r\n abstract VerifyMeasurement (measurementValue: chargeTransparencyRecord.IMeasurementValue): Promise<chargyInterfaces.ICryptoResult>;\r\n\r\n // The caller (chargyApp) guarantees that the given DOM elements exist.\r\n // Returns an Error when the measurement itself could not be rendered,\r\n // so that the caller can display it; otherwise nothing.\r\n abstract ViewMeasurement (measurementValue: chargeTransparencyRecord.IMeasurementValue,\r\n errorDiv: HTMLDivElement,\r\n introDiv: HTMLDivElement,\r\n infoDiv: HTMLDivElement,\r\n bufferValue: HTMLDivElement,\r\n hashedBufferValue: HTMLDivElement,\r\n publicKeyValue: HTMLDivElement,\r\n signatureExpectedValue: HTMLDivElement,\r\n signatureCheckValue: HTMLDivElement) : Promise<Error | undefined>;\r\n\r\n}\r\n","/*\n * Copyright (c) 2018-2026 GraphDefined GmbH <achim.friedland@graphdefined.com>\n * This file is part of Chargy WebApp <https://github.com/OpenChargingCloud/ChargyWebApp>\n *\n * Licensed under the Affero GPL license, Version 3.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.gnu.org/licenses/agpl.html\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { Chargy } from './chargy'\nimport { ACrypt } from './ACrypt'\nimport * as chargyInterfaces from './interfaces/chargyInterfaces'\nimport * as chargeTransparencyRecord from './interfaces/IChargeTransparencyRecord'\nimport * as chargyLib from './chargyLib'\nimport Decimal from 'decimal.js';\n\n\n// A single decoded 82-byte Alfen adapter data set.\ninterface IAlfenDataSet\n{\n StatusMeter: string;\n StatusAdapter: string;\n SecondIndex: number;\n Timestamp: string;\n Value: Decimal;\n Paging: number;\n Signature: string;\n}\n\nexport class Alfen {\n\n private readonly chargy: Chargy;\n\n constructor(chargy: Chargy) {\n this.chargy = chargy;\n }\n\n private bufferToHex(buffer: ArrayBuffer, Reverse?: boolean) : string {\n return (Reverse\n ? Array.from(new Uint8Array(buffer)).reverse()\n : Array.from(new Uint8Array(buffer))\n ).map (b => b.toString(16).padStart(2, \"0\")).join(\"\");\n }\n\n private bufferToNumber(buffer: ArrayBuffer) : number {\n return parseInt(Array\n .from(new Uint8Array(buffer))\n .map (b => b.toString(16).padStart(2, \"0\"))\n .join(\"\"), 16);\n }\n\n //#region TryToParseALFENFormat(Content)\n\n public TryToParseALFENFormat(Content: string|string[],\n ContainerInfos: unknown)\n\n : chargeTransparencyRecord.IChargeTransparencyRecord |\n chargyInterfaces. ISessionCryptoResult\n\n {\n\n // AP;\n // 0;\n // 3;\n // AJ2J7LYMGCIWT4AHUJPPFIIVB3FGRV2JQ2HVZG2I;\n // BIHEIWSHAAA2WZUZOYYDCNWTWAFACRC2I4ADGAEDQ4AAAABASMBFSAHY2JWF2AIAAEEAB7Y6ABUVEAAAAAAAAABQGQ2EMNCFIVATANRVII4DAAAAAAAAAAADAAAAABIAAAAA====;\n // S27J5BHL22ZBNFYTHTK433G7VU7Z6NN4JKO5DNPE7FNMT3SM3ZJGVWJ6ZKUOKE2LK4W63JYP4E6CY===;\n\n // AP;\n // 1;\n // 3;\n // AJ2J7LYMGCIWT4AHUJPPFIIVB3FGRV2JQ2HVZG2I;\n // BIHEIWSHAAA2WZUZOYYDCNWTWAFACRC2I4ADGAEDQ4AAAAAQEMWVSAASAAAAAAIAAEEAB7Y6ABXFEAAAAAAAAABQGQ2EMNCFIVATANRVII4DAAAAAAAAAAADAAAAABQAAAAA====;\n // MVYFHY24SFHI35DSXBSXRFMQP4OLYVO77TIQ6REROGCPWHY36AXIU4FD4W4Q2AHBZSNJXWCIRXAGS===;\n\n try\n {\n // The container infos are optional and provided by the\n // surrounding container parsers (OCPI, chargeIT, ...).\n const containerInfos = chargyLib.asJSONObject(ContainerInfos) ?? {};\n const chargingSession = chargyLib.asJSONObject(containerInfos[\"chargingSession\"]);\n const chargingStation = chargyLib.asJSONObject(containerInfos[\"chargingStation\"]);\n const evse = chargyLib.asJSONObject(containerInfos[\"EVSE\"]);\n const connector = chargyLib.asJSONObject(containerInfos[\"connector\"]);\n const energyMeter = chargyLib.asJSONObject(containerInfos[\"energyMeter\"]);\n\n const common = {\n PublicKey: \"\",\n PublicKeyFormat: \"\",\n AdapterId: \"\",\n AdapterFWVersion: \"\",\n AdapterFWChecksum: \"\",\n MeterId: \"\",\n ObisId: \"\",\n UnitEncoded: 0,\n Scalar: \"\",\n UID: \"\",\n InternalSessionId: 0,\n dataSets: new Array<IAlfenDataSet>()\n };\n\n let signedValues:string[] = [];\n if (typeof (Content) === 'string')\n signedValues = Content.split(/\\r\\n|\\r|\\n/g);\n else\n signedValues = Content;\n\n let previousTimestamp = \"\";\n\n for (let i=0; i<signedValues.length; i++)\n {\n\n const elements = signedValues[i]?.split(';');\n\n if (elements?.length != 6 && elements?.length != 7)\n return {\n status: chargyInterfaces.SessionVerificationResult.InvalidSessionFormat,\n message: this.chargy.GetLocalizedMessage(\"Invalid number of signed meter values!\"),\n certainty: 0\n };\n\n const FormatId = elements[0]; // 2 bytes\n const Type = elements[1]; // 1 byte; \"0\": start meter value | \"1\": stop meter value | \"2\": intermediate value\n const BlobVersion = elements[2]; // 1 byte; \"3\" (current version)\n const PublicKey:ArrayBuffer = this.chargy.base32Decode(elements[3] ?? \"\", 'RFC4648'); // 25 bytes; base32 encoded; secp192r1\n const DataSet: ArrayBuffer = this.chargy.base32Decode(elements[4] ?? \"\", 'RFC4648'); // 82 bytes; base32 encoded\n const Signature:ArrayBuffer = this.chargy.base32Decode(elements[5] ?? \"\", 'RFC4648'); // 48 bytes; base32 encoded; secp192r1\n\n // Verify common public key\n if (common.PublicKey === \"\")\n common.PublicKey = elements[3] ?? \"\";\n else if (elements[3] !== common.PublicKey)\n return {\n status: chargyInterfaces.SessionVerificationResult.InvalidSessionFormat,\n message: this.chargy.GetLocalizedMessage(\"Inconsistent public keys!\"),\n certainty: 0\n };\n\n if (FormatId !== \"AP\" ||\n Type?.length !== 1 ||\n BlobVersion?.length !== 1 ||\n BlobVersion !== \"3\" ||\n PublicKey.byteLength !== 25 ||\n DataSet.byteLength !== 82 ||\n Signature.byteLength !== 48)\n {\n return {\n status: chargyInterfaces.SessionVerificationResult.InvalidSessionFormat,\n message: this.chargy.GetLocalizedMessage(\"Invalid charging session format!\"),\n certainty: 0\n };\n }\n\n // The public key byte length is guaranteed to be 25 by the check above.\n common.PublicKeyFormat = \"secp192r1\";\n\n // Everything is Little Endian\n const AdapterId = this.bufferToHex(DataSet.slice( 0, 10)); // 0a 54 65 73 74 44 65 76 00 09\n const AdapterFWVersion = String.fromCharCode(...new Uint8Array(DataSet.slice(10, 14))); // ASCII: 76 30 31 34 (v014)\n const AdapterFWChecksum = this.bufferToHex(DataSet.slice(14, 16)); // B9 79\n const MeterId = this.bufferToHex(DataSet.slice(16, 26)); // 0A 01 44 5A 47 00 33 00 25 02\n const MeterStatus = this.bufferToHex(DataSet.slice(26, 28), true); // 00 00\n const AdapterStatus = this.bufferToHex(DataSet.slice(28, 30), true); // 00 10\n const SecondIndex = new DataView(DataSet.slice(30, 34), 0).getInt32(0, true); // 28 71 9A 02 => 43675944 dec\n const Timestamp = new Date(new DataView(DataSet.slice(34, 38), 0).getInt32(0, true) * 1000).toISOString(); // UNIX timestamp: 91 91 3D 5C => 1547538833 => 2019-01-15T07:53:53Z\n const ObisId = this.bufferToHex(DataSet.slice(38, 44)); // 01 00 01 08 00 ff\n const UnitEncoded = this.bufferToNumber(DataSet.slice(44, 45)); // 1e => 30 => Wh\n const Scalar = this.bufferToHex(DataSet.slice(45, 46)); // 00\n const Value = new DataView(DataSet.slice(46, 54), 0).getBigInt64(0, true); // 73 29 00 00 00 00 00 00 => 10611 Wh so 10,611 KWh\n const UID = String.fromCharCode(...new Uint8Array(DataSet.slice(54, 74))).replace(/\\0.*$/g, ''); // ASCII: 30 35 38 39 38 41 42 42 00 00 00 00 00 00 00 00 00 00 00 00 => UID: 05 89 8A BB\n const InternalSessionId = new DataView(DataSet.slice(74, 78), 0).getInt32(0, true) // 81 01 00 00 => 385(dec)\n const Paging = new DataView(DataSet.slice(78, 82), 0).getInt32(0, true); // 47 02 00 00 => 583(dec)\n\n\n if (common.AdapterId === \"\")\n common.AdapterId = AdapterId;\n else if (AdapterId !== common.AdapterId)\n return {\n status: chargyInterfaces.SessionVerificationResult.InvalidSessionFormat,\n message: this.chargy.GetLocalizedMessage(\"Inconsistent Alfen adapter identification!\"),\n certainty: 0\n };\n\n if (common.AdapterFWVersion === \"\")\n common.AdapterFWVersion = AdapterFWVersion;\n else if (AdapterFWVersion !== common.AdapterFWVersion)\n return {\n status: chargyInterfaces.SessionVerificationResult.InvalidSessionFormat,\n message: this.chargy.GetLocalizedMessage(\"Inconsistent Alfen adapter firmware version!\"),\n certainty: 0\n };\n\n if (common.AdapterFWChecksum === \"\")\n common.AdapterFWChecksum = AdapterFWChecksum;\n else if (AdapterFWChecksum !== common.AdapterFWChecksum)\n return {\n status: chargyInterfaces.SessionVerificationResult.InvalidSessionFormat,\n message: this.chargy.GetLocalizedMessage(\"Inconsistent Alfen adapter firmware checksum!\"),\n certainty: 0\n };\n\n if (common.MeterId === \"\")\n common.MeterId = MeterId;\n else if (MeterId !== common.MeterId)\n return {\n status: chargyInterfaces.SessionVerificationResult.InvalidSessionFormat,\n message: this.chargy.GetLocalizedMessage(\"Inconsistent meter identification!\"),\n certainty: 0\n };\n\n if (common.ObisId === \"\")\n common.ObisId = ObisId;\n else if (ObisId !== common.ObisId)\n return {\n status: chargyInterfaces.SessionVerificationResult.InvalidSessionFormat,\n message: this.chargy.GetLocalizedMessage(\"Inconsistent OBIS code!\"),\n certainty: 0\n };\n\n if (common.UnitEncoded === 0)\n common.UnitEncoded = UnitEncoded;\n else if (UnitEncoded !== common.UnitEncoded)\n return {\n status: chargyInterfaces.SessionVerificationResult.InvalidSessionFormat,\n message: this.chargy.GetLocalizedMessage(\"Inconsistent unit (encoded) value!\"),\n certainty: 0\n };\n\n if (common.Scalar === \"\")\n common.Scalar = Scalar;\n else if (Scalar !== common.Scalar)\n return {\n status: chargyInterfaces.SessionVerificationResult.InvalidSessionFormat,\n message: this.chargy.GetLocalizedMessage(\"Inconsistent measurement scalar!\"),\n certainty: 0\n };\n\n if (common.UID === \"\")\n common.UID = UID;\n else if (UID !== common.UID)\n return {\n status: chargyInterfaces.SessionVerificationResult.InvalidSessionFormat,\n message: this.chargy.GetLocalizedMessage(\"Inconsistent user identification!\"),\n certainty: 0\n };\n\n if (common.InternalSessionId === 0)\n common.InternalSessionId = InternalSessionId;\n else if (InternalSessionId !== common.InternalSessionId)\n return {\n status: chargyInterfaces.SessionVerificationResult.InvalidSessionFormat,\n message: this.chargy.GetLocalizedMessage(\"Inconsistent internal charging session identification!\"),\n certainty: 0\n };\n\n if (previousTimestamp !== \"\" && previousTimestamp > Timestamp)\n return {\n status: chargyInterfaces.SessionVerificationResult.InconsistentTimestamps,\n message: this.chargy.GetLocalizedMessage(\"Inconsistent timestamps!\"),\n certainty: 0\n };\n else\n previousTimestamp = Timestamp;\n\n\n common.dataSets.push({\n \"StatusMeter\": MeterStatus,\n \"StatusAdapter\": AdapterStatus,\n \"SecondIndex\": SecondIndex,\n \"Timestamp\": Timestamp,\n \"Value\": new Decimal(Value.toString()), // Workaround for Decimal.js, as it does not support BigInt!\n \"Paging\": Paging,\n \"Signature\": this.bufferToHex(Signature)\n });\n\n }\n\n const evseId = chargyLib.asString(containerInfos[\"EVSEId\"]) ?? \"DE*GEF*EVSE*CHARGY*1\";\n const chargingStationId = chargyLib.asString(containerInfos[\"ChargingStationId\"]) ?? \"DE*GEF*STATION*CHARGY*1\";\n const chargingSessionId = chargyLib.asString(chargingSession?.[\"@id\"]);\n\n const firstDataSet = common.dataSets[0];\n const lastDataSet = common.dataSets[common.dataSets.length-1];\n\n if (firstDataSet === undefined || lastDataSet === undefined)\n return {\n status: chargyInterfaces.SessionVerificationResult.InvalidSessionFormat,\n message: this.chargy.GetLocalizedMessage(\"Invalid number of signed meter values!\"),\n certainty: 0\n };\n\n const _CTR: IAlfenChargeTransparencyRecord = {\n\n \"@id\": chargingSessionId ?? common.InternalSessionId.toString(),\n \"@context\": \"https://open.charging.cloud/contexts/CTR+json\",\n\n \"begin\": firstDataSet.Timestamp,\n \"end\": lastDataSet.Timestamp,\n\n \"description\": {\n \"de\": \"Alle Ladevorgänge\",\n \"en\": \"All charging sessions\"\n },\n\n \"contract\": {\n \"@id\": common.UID,\n },\n\n \"chargingPools\": [\n {\n \"@id\": \"DE*GEF*POOL*CHARGY*1\",\n \"description\": { \"en\": \"GraphDefined CHARGY Virtual Charging Pool 1\" },\n\n \"chargingStations\": [\n {\n \"@id\": chargingStationId,\n // ToDo: The container infos are not validated yet!\n \"description\": chargyLib.asJSONObject(chargingStation?.[\"description\"]) as chargyInterfaces.IMultilanguageText | undefined,\n \"manufacturer\": chargyLib.asString (chargingStation?.[\"manufacturer\"]),\n \"model\": chargyLib.asString (chargingStation?.[\"type\"]),\n \"serialNumber\": chargyLib.asString (chargingStation?.[\"serialNumber\"]),\n \"firmwareVersion\": chargyLib.asString (chargingStation?.[\"softwareVersion\"]),\n \"legalCompliance\": chargyLib.asJSONObject(chargingStation?.[\"legalCompliance\"]) as chargyInterfaces.ILegalCompliance | undefined,\n \"geoLocation\": chargyLib.asJSONObject(chargingStation?.[\"geoLocation\"]) as chargyInterfaces.IGeoLocation | undefined,\n \"address\": chargyLib.asJSONObject(chargingStation?.[\"address\"]) as chargyInterfaces.IAddress | undefined,\n \"EVSEs\": [\n {\n \"@id\": evseId,\n \"description\": chargyLib.asJSONObject(evse?.[\"description\"]) as chargyInterfaces.IMultilanguageText | undefined,\n \"connectors\": [ {\n \"type\": chargyLib.asString(connector?.[\"type\"]) ?? \"\",\n \"looses\": chargyLib.asNumber(connector?.[\"looses\"]) ?? 0\n } ],\n \"meters\": [\n {\n \"@id\": common.MeterId,\n \"manufacturer\": chargyLib.asString(energyMeter?.[\"manufacturer\"]),\n \"manufacturerURL\": chargyLib.asString(energyMeter?.[\"manufacturerURL\"]),\n \"model\": chargyLib.asString(energyMeter?.[\"model\"]),\n \"modelURL\": chargyLib.asString(energyMeter?.[\"modelURL\"]),\n \"hardwareVersion\": chargyLib.asString(energyMeter?.[\"hardwareVersion\"]),\n \"firmwareVersion\": common.AdapterFWVersion,\n \"firmwareChecksum\": common.AdapterFWChecksum,\n \"signatureFormat\": \"https://open.charging.cloud/contexts/EnergyMeterSignatureFormats/AlfenCrypt01\",\n \"publicKeys\": [\n {\n \"value\": common.PublicKey,\n \"algorithm\": common.PublicKeyFormat,\n \"format\": \"DER\",\n \"encoding\": \"base32\"\n }\n ]\n }\n ]\n }\n ]\n }\n ],\n }\n ],\n\n // ToDo: The charging tariffs are not validated yet!\n \"chargingTariffs\": chargyLib.asJSONArray(containerInfos[\"chargingTariffs\"]) as chargyInterfaces.IChargingTariff[] | undefined,\n\n \"chargingSessions\": [\n\n {\n\n \"@id\": chargingSessionId ?? common.InternalSessionId.toString(),\n \"@context\": \"https://open.charging.cloud/contexts/SessionSignatureFormats/AlfenCrypt01+json\",\n \"begin\": firstDataSet.Timestamp,\n \"end\": lastDataSet.Timestamp,\n \"internalSessionId\": common.InternalSessionId.toString(),\n \"EVSEId\": evseId,\n\n \"authorizationStart\": {\n \"@id\": common.UID,\n },\n\n // ToDo: The charging tariffs, periods and total costs are not validated yet!\n \"chargingTariffs\": chargyLib.asJSONArray (containerInfos[\"chargingTariffs\"]) as chargyInterfaces.IChargingTariff[] | undefined,\n \"chargingPeriods\": chargyLib.asJSONArray (containerInfos[\"chargingPeriods\"]) as chargyInterfaces.IChargingPeriod[] | undefined,\n \"totalCosts\": chargyLib.asJSONObject(containerInfos[\"totalCosts\"]) as chargyInterfaces.IChargingCosts | undefined,\n\n \"measurements\": [\n {\n\n \"energyMeterId\": common.MeterId,\n \"@context\": \"https://open.charging.cloud/contexts/EnergyMeterSignatureFormats/AlfenCrypt03+json\",\n \"name\": chargyLib.OBIS2MeasurementName(chargyLib.parseOBIS(common.ObisId)),\n \"obis\": chargyLib.parseOBIS(common.ObisId),\n \"unitEncoded\": common.UnitEncoded,\n \"scale\": parseFloat(common.Scalar),\n\n \"adapterId\": common.AdapterId, // ToDo: Add adapterId to the measurement?!!??\n \"adapterFWVersion\": common.AdapterFWVersion,\n \"adapterFWChecksum\": common.AdapterFWChecksum,\n\n \"signatureInfos\": {\n \"hash\": chargyInterfaces.CryptoHashAlgorithms.SHA256,\n \"algorithm\": chargyInterfaces.CryptoAlgorithms.ECC,\n \"curve\": common.PublicKeyFormat,\n \"format\": chargyInterfaces.SignatureFormats.RS,\n \"encoding\": \"base32\"\n },\n\n \"values\": [ ]\n\n }\n ]\n\n }\n\n ],\n\n \"certainty\": 1\n\n };\n\n for (const dataSet of common.dataSets)\n {\n _CTR.chargingSessions?.[0]?.measurements[0]?.values.push(\n {\n \"timestamp\": dataSet.Timestamp,\n \"value\": dataSet.Value,\n \"statusMeter\": dataSet.StatusMeter,\n \"statusAdapter\": dataSet.StatusAdapter,\n \"secondsIndex\": dataSet.SecondIndex,\n \"paginationId\": dataSet.Paging,\n \"signatures\": [\n {\n \"r\": dataSet.Signature.substring(0, 48),\n \"s\": dataSet.Signature.substring(48)\n }\n ]\n }\n );\n }\n\n\n _CTR[\"status\"] = chargyInterfaces.SessionVerificationResult.Unvalidated;\n\n //await this.processChargeTransparencyRecord(_CTR);\n return _CTR;\n\n }\n catch (exception)\n {\n return {\n status: chargyInterfaces.SessionVerificationResult.InvalidSessionFormat,\n message: this.chargy.GetLocalizedMessage(\"Exception occured: \") + (exception instanceof Error ? exception.message : String(exception)),\n certainty: 0\n }\n }\n\n }\n\n //#endregion\n\n\n}\n\nexport interface IAlfenMeasurement extends chargeTransparencyRecord.IMeasurement\n{\n adapterId: string,\n adapterFWVersion: string,\n adapterFWChecksum: string\n}\n\nexport interface IAlfenMeasurementValue extends chargeTransparencyRecord.IMeasurementValue\n{\n statusMeter: string,\n statusAdapter: string,\n secondsIndex: number,\n sessionId: string,\n paginationId: number,\n measurement: IAlfenMeasurement\n}\n\nexport interface IAlfenCrypt01Result extends chargyInterfaces.ICryptoResult\n{\n adapterId?: string\n adapterFWVersion?: string\n adapterFWChecksum?: string\n meterId?: string,\n meter?: chargyInterfaces.IMeter,\n statusMeter?: string,\n statusAdapter?: string,\n secondsIndex?: string,\n timestamp?: string,\n obisId?: string,\n unitEncoded?: string,\n scalar?: string,\n value?: string,\n uid?: string,\n sessionId?: string,\n paging?: string,\n\n hashValue?: string | bigint,\n publicKey?: string,\n publicKeyFormat?: string,\n publicKeySignatures?: Array<unknown>,\n signature?: chargyInterfaces.ISignatureRS\n}\n\n\nexport interface IAlfenChargingSession extends chargeTransparencyRecord.IChargingSession\n{\n internalSessionId?: string;\n meter?: chargyInterfaces.IMeter;\n measurements: Array<IAlfenMeasurement>;\n}\n\nexport interface IAlfenChargeTransparencyRecord extends chargeTransparencyRecord.IChargeTransparencyRecord\n{\n chargingSessions?: Array<IAlfenChargingSession>;\n}\n\n\n\n\nexport class AlfenCrypt01 extends ACrypt {\n\n constructor(chargy: Chargy) {\n super(\"Alfen\",\n chargy);\n }\n\n\n async VerifyChargingSession(chargingSession: chargeTransparencyRecord.IChargingSession): Promise<chargyInterfaces.ISessionCryptoResult>\n {\n\n let sessionResult = chargyInterfaces.SessionVerificationResult.UnknownSessionFormat;\n\n {\n for (const measurement of chargingSession.measurements)\n {\n\n measurement.chargingSession = chargingSession;\n\n // Must include at least two measurements (start & stop)\n if (measurement.values.length > 1)\n {\n\n // Validate...\n for (const measurementValue of measurement.values)\n {\n measurementValue.measurement = measurement;\n await this.VerifyMeasurement(measurementValue as IAlfenMeasurementValue);\n }\n\n\n // Find an overall result...\n sessionResult = chargyInterfaces.SessionVerificationResult.ValidSignature;\n\n for (const measurementValue of measurement.values)\n {\n if (sessionResult == chargyInterfaces.SessionVerificationResult.ValidSignature &&\n measurementValue.result?.status != chargyInterfaces.VerificationResult.ValidSignature)\n {\n sessionResult = chargyInterfaces.SessionVerificationResult.InvalidSignature;\n }\n }\n\n }\n\n else\n sessionResult = chargyInterfaces.SessionVerificationResult.AtLeastTwoMeasurementsRequired;\n\n }\n }\n\n return {\n status: sessionResult,\n certainty: .5\n }\n\n }\n\n async VerifyMeasurement(measurementValue: IAlfenMeasurementValue): Promise<IAlfenCrypt01Result>\n {\n\n function setResult(verificationResult: chargyInterfaces.VerificationResult)\n {\n cryptoResult.status = verificationResult;\n measurementValue.result = cryptoResult;\n return cryptoResult;\n }\n\n measurementValue.method = this;\n\n const buffer = new ArrayBuffer(82);\n const cryptoBuffer = new DataView(buffer);\n\n const cryptoResult:IAlfenCrypt01Result = {\n status: chargyInterfaces.VerificationResult.InvalidSignature,\n adapterId: chargyLib.SetHex (cryptoBuffer, measurementValue.measurement.adapterId, 0),\n adapterFWVersion: chargyLib.SetText (cryptoBuffer, measurementValue.measurement.adapterFWVersion, 10),\n adapterFWChecksum: chargyLib.SetHex (cryptoBuffer, measurementValue.measurement.adapterFWChecksum, 14),\n meterId: chargyLib.SetHex (cryptoBuffer, measurementValue.measurement.energyMeterId, 16),\n statusMeter: chargyLib.SetHex (cryptoBuffer, measurementValue.statusMeter, 26, true),\n statusAdapter: chargyLib.SetHex (cryptoBuffer, measurementValue.statusAdapter, 28, true),\n secondsIndex: chargyLib.SetUInt32 (cryptoBuffer, measurementValue.secondsIndex, 30, true),\n timestamp: chargyLib.SetTimestamp32 (cryptoBuffer, measurementValue.timestamp, 34, false),\n obisId: chargyLib.SetHex (cryptoBuffer, chargyLib.OBIS2Hex(measurementValue.measurement.obis), 38, false),\n unitEncoded: chargyLib.SetInt8 (cryptoBuffer, measurementValue.measurement.unitEncoded ?? 0, 44),\n scalar: chargyLib.SetInt8 (cryptoBuffer, measurementValue.measurement.scale, 45),\n value: chargyLib.SetUInt64D (cryptoBuffer, measurementValue.value, 46, true),\n uid: chargyLib.SetText (cryptoBuffer, (measurementValue.measurement.chargingSession?.authorizationStart[\"@id\"] ?? \"\"), 54),\n sessionId: chargyLib.SetUInt32 (cryptoBuffer, parseInt(measurementValue.measurement.chargingSession?.internalSessionId ?? \"\"), 74, true),\n paging: chargyLib.SetUInt32 (cryptoBuffer, measurementValue.paginationId, 78, true)\n };\n\n\n const firstSignature = measurementValue.signatures?.[0];\n if (firstSignature)\n {\n\n const signatureExpected = firstSignature as chargyInterfaces.ISignatureRS;\n\n try\n {\n\n cryptoResult.signature = {\n algorithm: measurementValue.measurement.signatureInfos?.algorithm,\n format: measurementValue.measurement.signatureInfos?.format,\n r: signatureExpected.r,\n s: signatureExpected.s\n };\n\n const meter = this.chargy.GetMeter(measurementValue.measurement.energyMeterId);\n if (meter)\n {\n\n cryptoResult.meter = meter;\n\n if (meter.publicKeys && meter.publicKeys.length > 0)\n {\n\n try\n {\n\n cryptoResult.publicKey = meter.publicKeys[0]?.value;\n cryptoResult.publicKeyFormat = meter.publicKeys[0]?.format;\n cryptoResult.publicKeySignatures = meter.publicKeys[0]?.signatures;\n\n try\n {\n\n const publicKey = chargyLib.buf2hex(this.chargy.base32Decode(cryptoResult.publicKey ?? \"\", 'RFC4648'));\n let result = false;\n\n switch (meter.publicKeys[0]?.algorithm ?? \"\")\n {\n\n case \"secp192r1\":\n cryptoResult.hashValue = (await chargyLib.sha256(cryptoBuffer));\n result = this.curve192r1.keyFromPublic(publicKey, 'hex').\n verify (cryptoResult.hashValue.toUpperCase(),\n cryptoResult.signature);\n break;\n\n case \"curve224k1\":\n {\n const hashValue224k1 = BigInt(\"0x\" + (await chargyLib.sha256(cryptoBuffer))) >> BigInt(31);\n cryptoResult.hashValue = hashValue224k1;\n result = this.curve224k1.validate(\n hashValue224k1,\n BigInt(signatureExpected.r !== undefined ? \"0x\" + signatureExpected.r : \"0x0\"),\n BigInt(signatureExpected.s !== undefined ? \"0x\" + signatureExpected.s : \"0x0\"),\n [ BigInt(\"0x\" + publicKey.substring(2, 58)),\n BigInt(\"0x\" + publicKey.substring(58)) ]\n )\n break;\n }\n\n case \"curve256r1\":\n cryptoResult.hashValue = (await chargyLib.sha256(cryptoBuffer));\n result = this.curve192r1.keyFromPublic(publicKey, 'hex').\n verify (cryptoResult.hashValue.toUpperCase(),\n cryptoResult.signature);\n break;\n\n case \"curve384r1\":\n cryptoResult.hashValue = (await chargyLib.sha384(cryptoBuffer));\n result = this.curve192r1.keyFromPublic(publicKey, 'hex').\n verify (cryptoResult.hashValue.toUpperCase(),\n cryptoResult.signature);\n break;\n\n case \"curve521r1\":\n cryptoResult.hashValue = (await chargyLib.sha512(cryptoBuffer));\n result = this.curve192r1.keyFromPublic(publicKey, 'hex').\n verify (cryptoResult.hashValue.toUpperCase(),\n cryptoResult.signature);\n break;\n\n }\n\n if (result)\n {\n return setResult(chargyInterfaces.VerificationResult.ValidSignature);\n }\n\n return setResult(chargyInterfaces.VerificationResult.InvalidSignature);\n\n }\n catch\n {\n return setResult(chargyInterfaces.VerificationResult.InvalidSignature);\n }\n\n }\n catch\n {\n return setResult(chargyInterfaces.VerificationResult.InvalidPublicKey);\n }\n\n }\n\n else\n return setResult(chargyInterfaces.VerificationResult.PublicKeyNotFound);\n\n }\n\n else\n return setResult(chargyInterfaces.VerificationResult.EnergyMeterNotFound);\n\n }\n catch\n {\n return setResult(chargyInterfaces.VerificationResult.InvalidSignature);\n }\n\n }\n\n return {} as IAlfenCrypt01Result;\n\n }\n\n async ViewMeasurement(measurementValue: IAlfenMeasurementValue,\n errorDiv: HTMLDivElement,\n introDiv: HTMLDivElement,\n infoDiv: HTMLDivElement,\n PlainTextDiv: HTMLDivElement,\n HashedPlainTextDiv: HTMLDivElement,\n PublicKeyDiv: HTMLDivElement,\n SignatureExpectedDiv: HTMLDivElement,\n SignatureCheckDiv: HTMLDivElement) : Promise<Error | undefined>\n {\n\n const result = measurementValue.result as IAlfenCrypt01Result;\n\n //#region Headline / Introduction\n\n {\n introDiv.innerHTML = this.chargy.GetLocalizedMessage(\"The following data of the charging session is relevant for metrological and legal metrological purposes and therefore part of the digital signature\").\n replace(\"{methodName}\", \"AlfenCrypt01\").\n replace(\"{cryptoAlgorithm}\", this.description);\n }\n\n //#endregion\n\n\n //#region Plain text\n\n {\n\n if (PlainTextDiv.parentElement &&\n PlainTextDiv.parentElement.children[0])\n {\n PlainTextDiv.parentElement.children[0].innerHTML = this.chargy.GetLocalizedMessage(\"Plain text\") + \" (320 Bytes, hex)\";\n }\n\n PlainTextDiv.style.fontFamily = \"\";\n PlainTextDiv.style.whiteSpace = \"\";\n PlainTextDiv.style.maxHeight = \"\";\n PlainTextDiv.style.overflowY = \"\";\n\n this.CreateLocalizedLine(\"Adapter Id\", measurementValue.measurement.adapterId, result.adapterId || \"\", infoDiv, PlainTextDiv);\n this.CreateLocalizedLine(\"Adapter Firmware Version\", measurementValue.measurement.adapterFWVersion, result.adapterFWVersion || \"\", infoDiv, PlainTextDiv);\n this.CreateLocalizedLine(\"Adapter Firmware Checksum\", measurementValue.measurement.adapterFWChecksum, result.adapterFWChecksum || \"\", infoDiv, PlainTextDiv);\n this.CreateLocalizedLine(\"Meter number\", measurementValue.measurement.energyMeterId, result.meterId || \"\", infoDiv, PlainTextDiv);\n this.CreateLocalizedLine(\"Meter status\", chargyLib.hex2bin(measurementValue.statusMeter, true) + \" (\" + measurementValue.statusMeter + \" hex)<br /><span class=\\\"statusInfos\\\">\" +\n this.DecodeMeterStatus(measurementValue.statusMeter).join(\"<br />\") + \"</span>\",\n result.statusMeter || \"\", infoDiv, PlainTextDiv);\n this.CreateLocalizedLine(\"Adapter status\", chargyLib.hex2bin(measurementValue.statusAdapter, true) + \" (\" + measurementValue.statusAdapter + \" hex)<br /><span class=\\\"statusInfos\\\">\" +\n this.DecodeAdapterStatus(measurementValue.statusAdapter).join(\"<br />\") + \"</span>\", \n result.statusAdapter || \"\", infoDiv, PlainTextDiv);\n this.CreateLocalizedLine(\"Seconds index\", measurementValue.secondsIndex, result.secondsIndex || \"\", infoDiv, PlainTextDiv);\n this.CreateLocalizedLine(\"Timestamp\", chargyLib.UTC2human(measurementValue.timestamp), result.timestamp || \"\", infoDiv, PlainTextDiv);\n this.CreateLocalizedLine(\"OBIS code\", measurementValue.measurement.obis, result.obisId || \"\", infoDiv, PlainTextDiv);\n this.CreateLocalizedLine(\"Unit (encoded)\", measurementValue.measurement.unitEncoded ?? 0, result.unitEncoded || \"\", infoDiv, PlainTextDiv);\n this.CreateLocalizedLine(\"Scaling\", measurementValue.measurement.scale, result.scalar || \"\", infoDiv, PlainTextDiv);\n this.CreateLocalizedLine(\"Measurement Value\", measurementValue.value.toString() + \" Wh\", result.value || \"\", infoDiv, PlainTextDiv);\n this.CreateLocalizedLine(\"Authorization\", (measurementValue.measurement.chargingSession?.authorizationStart[\"@id\"] ?? \"\") + \" hex\", chargyLib.pad(result.uid, 20) || \"\", infoDiv, PlainTextDiv);\n this.CreateLocalizedLine(\"SessionId\", (measurementValue.measurement.chargingSession?.[\"@id\"] ?? \"\"), result.sessionId || \"\", infoDiv, PlainTextDiv);\n this.CreateLocalizedLine(\"Pagination counter\", measurementValue.paginationId, result.paging || \"\", infoDiv, PlainTextDiv);\n\n }\n\n //#endregion\n\n //#region Hashed plain text\n\n {\n\n if (HashedPlainTextDiv.parentElement &&\n HashedPlainTextDiv.parentElement.children[0])\n {\n HashedPlainTextDiv.parentElement.children[0].innerHTML = this.chargy.GetLocalizedMessage(\"Hashed plain text\") + \" (SHA256, hex)\";\n }\n\n const hashValueText = typeof result.hashValue === 'string' ? result.hashValue : result.hashValue?.toString(16) ?? \"\";\n HashedPlainTextDiv.innerHTML = hashValueText.match(/.{1,8}/g)?.join(\" \") ?? \"\";\n\n }\n\n //#endregion\n\n //#region Public key\n\n if (result.publicKey &&\n result.publicKey != \"\")\n {\n\n if (PublicKeyDiv.parentElement &&\n PublicKeyDiv.parentElement.children[0])\n {\n PublicKeyDiv.parentElement.children[0].innerHTML = this.chargy.GetLocalizedMessage(\"Public Key\") + \" (\" +\n (result.publicKeyFormat\n ? result.publicKeyFormat + \", \"\n : \"\") +\n \"base32)\";\n }\n\n if (!chargyLib.IsNullOrEmpty(result.publicKey))\n PublicKeyDiv.innerHTML = result.publicKey.match(/.{1,4}/g)?.join(\" \") ?? \"\";\n\n }\n\n //#endregion\n\n //#region Public key signatures (optional)\n\n if (PublicKeyDiv.parentElement &&\n PublicKeyDiv.parentElement.children[3])\n {\n\n PublicKeyDiv.parentElement.children[3].innerHTML = \"\";\n\n if (result.publicKeySignatures)\n {\n for (const signature of result.publicKeySignatures)\n {\n\n try\n {\n\n const signatureDiv = PublicKeyDiv.parentElement.children[3].appendChild(document.createElement('div'));\n\n signatureDiv.innerHTML = await this.chargy.CheckMeterPublicKeySignature(\n measurementValue.measurement.chargingSession?.chargingStation,\n measurementValue.measurement.chargingSession?.EVSE,\n measurementValue.measurement.chargingSession?.EVSE?.meters[0],\n measurementValue.measurement.chargingSession?.EVSE?.meters[0]?.publicKeys?.[0],\n signature\n );\n\n }\n catch\n {\n // Optional public key signature metadata is displayed only when available.\n }\n\n }\n\n }\n\n }\n\n //#endregion\n\n //#region Signature expected\n\n if (result.signature != null)\n {\n\n if (SignatureExpectedDiv.parentElement &&\n SignatureExpectedDiv.parentElement.children[0])\n {\n SignatureExpectedDiv.parentElement.children[0].innerHTML = this.chargy.GetLocalizedMessage(\"Expected signature\") + \" (\" + (result.signature.format ?? \"\") + \", hex)\";\n }\n\n if (result.signature.r && result.signature.s)\n {\n const signatureR = result.signature.r.toLowerCase().match(/.{1,8}/g)?.join(\" \") ?? \"-\";\n const signatureS = result.signature.s.toLowerCase().match(/.{1,8}/g)?.join(\" \") ?? \"-\";\n\n SignatureExpectedDiv.innerHTML = \"r: \" + signatureR + \"<br />\" +\n \"s: \" + signatureS;\n }\n\n else if (result.signature.value)\n SignatureExpectedDiv.innerHTML = result.signature.value.toLowerCase().match(/.{1,8}/g)?.join(\" \") ?? \"-\";\n\n }\n\n //#endregion\n\n\n //#region Signature check\n\n {\n switch (result.status)\n {\n\n case chargyInterfaces.VerificationResult.UnknownCTRFormat:\n SignatureCheckDiv.innerHTML = '<i class=\"fas fa-times-circle\"></i><div id=\"description\">' + this.chargy.GetLocalizedMessage(\"Unknown charge transparency data format!\") + '</div>';\n break;\n\n case chargyInterfaces.VerificationResult.EnergyMeterNotFound:\n SignatureCheckDiv.innerHTML = '<i class=\"fas fa-times-circle\"></i><div id=\"description\">' + this.chargy.GetLocalizedMessage(\"Invalid energy meter\") + '</div>';\n break;\n\n case chargyInterfaces.VerificationResult.PublicKeyNotFound:\n SignatureCheckDiv.innerHTML = '<i class=\"fas fa-times-circle\"></i><div id=\"description\">' + this.chargy.GetLocalizedMessage(\"Public key not found\") + '</div>';\n break;\n\n case chargyInterfaces.VerificationResult.InvalidPublicKey:\n SignatureCheckDiv.innerHTML = '<i class=\"fas fa-times-circle\"></i><div id=\"description\">' + this.chargy.GetLocalizedMessage(\"Invalid public key\") + '</div>';\n break;\n\n case chargyInterfaces.VerificationResult.InvalidSignature:\n SignatureCheckDiv.innerHTML = '<i class=\"fas fa-times-circle\"></i><div id=\"description\">' + this.chargy.GetLocalizedMessage(\"Invalid signature\") + '</div>';\n break;\n\n case chargyInterfaces.VerificationResult.ValidSignature:\n SignatureCheckDiv.innerHTML = '<i class=\"fas fa-check-circle\"></i><div id=\"description\">' + this.chargy.GetLocalizedMessage(\"Valid signature\") + '</div>';\n break;\n\n\n default:\n SignatureCheckDiv.innerHTML = '<i class=\"fas fa-times-circle\"></i><div id=\"description\">' + this.chargy.GetLocalizedMessage(\"Invalid signature\") + '</div>';\n break;\n\n }\n }\n\n //#endregion\n\n return undefined;\n\n }\n\n\n // Helper methods\n\n //#region Status flags MID meter\n\n private DecodeMeterStatus(statusValueHex: string) : Array<string>\n {\n\n const statusArray:string[] = [];\n\n try\n {\n\n const status = parseInt(statusValueHex, 16);\n\n //#region Status flags MID meter (Bit 0-15)\n\n // see also: DZG DVH4013 paragraph 13.2.1\n\n if ((status & 1) == 1)\n statusArray.push(this.chargy.GetLocalizedMessage(\"RTC error\")); // Non-fatal error\n\n if ((status & 2) == 2)\n statusArray.push(this.chargy.GetLocalizedMessage(\"EEPROM error\")); // Fatal error!\n\n if ((status & 4) == 4)\n statusArray.push(this.chargy.GetLocalizedMessage(\"Dataflash error\")); // Fatal error!\n\n // reserved 8\n // reserved 16\n // reserved 32\n // reserved 64\n // reserved 128\n\n if ((status & 256) == 256)\n statusArray.push(this.chargy.GetLocalizedMessage(\"Phase L1 failure\"));\n\n if ((status & 512) == 512)\n statusArray.push(this.chargy.GetLocalizedMessage(\"Phase L2 failure\"));\n\n if ((status & 1024) == 1024)\n statusArray.push(this.chargy.GetLocalizedMessage(\"Phase L3 failure\"));\n\n if ((status & 2048) == 2048)\n statusArray.push(this.chargy.GetLocalizedMessage(\"Phase sequence wrong\"));\n\n // reserved 4096\n // reserved 8192\n // reserved 16384\n // reserved 32768\n\n //#endregion\n\n }\n catch\n {\n statusArray.push(this.chargy.GetLocalizedMessage(\"Invalid meter status!\"));\n }\n\n return statusArray;\n\n }\n\n //#endregion\n\n //#region Status flags LMN adapter\n\n private DecodeAdapterStatus(statusValueHex: string) : Array<string>\n {\n\n const statusArray:string[] = [];\n\n try\n {\n\n const status = parseInt(statusValueHex, 16);\n\n //#region Status flags LMN adapter (Bit 16-31)\n\n if ((status & 1) == 1)\n statusArray.push(this.chargy.GetLocalizedMessage(\"Adapter fatal error\"));\n\n // reserved 2\n // reserved 4\n // reserved 8\n // reserved 16\n // reserved 32\n // reserved 64\n // reserved 128\n // reserved 256\n // reserved 512\n\n // Ensures, that no energy has been consumed between charging sessions!\n if ((status & 1024) == 1024)\n statusArray.push(this.chargy.GetLocalizedMessage(\"Stop and Start Meter reading mismatch\"));\n\n if ((status & 2048) == 2048)\n statusArray.push(this.chargy.GetLocalizedMessage(\"Intermediate command\"));\n\n if ((status & 4096) == 4096)\n statusArray.push(this.chargy.GetLocalizedMessage(\"Stop charge command\"))\n\n if ((status & 8192) == 8192)\n statusArray.push(this.chargy.GetLocalizedMessage(\"Start charge command\"));\n\n if ((status & 16384) == 16384)\n statusArray.push(this.chargy.GetLocalizedMessage(\"Adapter memory error\"));\n\n if ((status & 32768) == 32768)\n statusArray.push(this.chargy.GetLocalizedMessage(\"Meter communication error\"));\n\n //#endregion\n\n }\n catch\n {\n statusArray.push(this.chargy.GetLocalizedMessage(\"Invalid status!\"));\n }\n\n return statusArray;\n\n }\n\n //#endregion\n\n}\n","/*\n * Copyright (c) 2018-2026 GraphDefined GmbH <achim.friedland@graphdefined.com>\n * This file is part of Chargy Desktop App <https://github.com/OpenChargingCloud/ChargyDesktopApp>\n *\n * Licensed under the Affero GPL license, Version 3.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.gnu.org/licenses/agpl.html\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Chargy } from './chargy'\nimport { ACrypt } from './ACrypt'\nimport * as chargyInterfaces from './interfaces/chargyInterfaces'\nimport * as chargeTransparencyRecord from './interfaces/IChargeTransparencyRecord'\nimport * as chargyLib from './chargyLib'\nimport Decimal from 'decimal.js'\n\n\ninterface IASN1Signature\n{\n r: { toString(base: number): string };\n s: { toString(base: number): string };\n}\n\nexport interface IBSMMeasurementValue extends chargeTransparencyRecord.IMeasurementValue\n{\n\n Typ: number,\n\n RCR: number,\n RCR_SF: number,\n RCR_Unit: string,\n RCR_Prefix: chargyInterfaces.DisplayPrefixes,\n RCR_Precision: number,\n\n TotWhImp: number,\n TotWhImp_SF: number,\n TotWhImp_Unit: string,\n TotWhImp_Prefix: chargyInterfaces.DisplayPrefixes,\n TotWhImp_Precision: number,\n\n W: number,\n W_SF: number,\n W_Unit: string,\n W_Prefix: chargyInterfaces.DisplayPrefixes,\n W_Precision: number,\n\n MA1: string,\n RCnt: number,\n OS: number,\n Epoch: number,\n TZO: number,\n EpochSetCnt: number,\n EpochSetOS: number,\n DI: number,\n DO: number,\n Meta1: string,\n Meta2: string,\n Meta3: string,\n Evt: number\n\n}\n\n// A single entry of the \"additionalValues\" array of a BSM-WS36A\n// snapshot, flattened and type-checked for easier consumption.\ninterface IBSMAdditionalValue\n{\n measurandId: string | undefined;\n measurandName: string | undefined;\n scale: number | undefined;\n unit: string | undefined;\n unitEncoded: number | undefined;\n value: unknown; // string or number, depending on the measurand\n valueType: string | undefined;\n prefix: string | undefined;\n precision: number | undefined;\n}\n\n// The intermediate per-snapshot data collected while validating\n// the consistency of all signed meter values.\ninterface IBSMDataSet\n{\n Typ: number;\n TypParsed: string;\n RCR: IBSMAdditionalValue | undefined;\n TotWhImp: IBSMAdditionalValue | undefined;\n W: IBSMAdditionalValue | undefined;\n MA1: string | null;\n RCnt: number;\n OS: number;\n Epoch: number;\n TZO: number;\n EpochSetCnt: number;\n EpochSetOS: number;\n DI: number;\n DO: number;\n Meta1: string | null;\n Meta2: string | null;\n Meta3: string | null;\n Evt: number;\n time: string;\n value: unknown;\n valuePrefix: chargyInterfaces.DisplayPrefixes;\n valuePrecision: number;\n measurementId: unknown;\n signature: string;\n errors: string[];\n warnings: string[];\n}\n\nexport interface IBSMCrypt01Result extends chargyInterfaces.ICryptoResult\n{\n sha256value?: string,\n meterId?: string,\n meter?: chargyInterfaces.IMeter,\n timestamp?: string,\n\n ArraySize: number,\n Typ: string,\n RCR: string,\n TotWhImp: string,\n W: string,\n MA1: string,\n RCnt: string,\n OS: string,\n Epoch: string,\n TZO: string,\n EpochSetCnt: string,\n EpochSetOS: string,\n DI: string,\n DO: string,\n Meta1: string,\n Meta2: string,\n Meta3: string,\n Evt: string,\n\n //infoStatus?: string,\n //secondsIndex?: string,\n //paginationId?: string,\n //obis?: string,\n //unitEncoded?: string,\n //scale?: string,\n //value?: string,\n //logBookIndex?: string,\n //authorizationStart?: string,\n //authorizationStop?: string,\n //authorizationStartTimestamp?: string,\n\n publicKey?: string,\n publicKeyFormat?: string,\n publicKeySignatures?: Array<unknown>,\n signature?: chargyInterfaces.ISignatureRS\n}\n\n\nexport class BSMCrypt01 extends ACrypt {\n\n readonly curve = new this.chargy.elliptic.ec('p256');\n\n constructor(chargy: Chargy) {\n super(\"ECC secp256r1\",\n chargy);\n }\n\n\n public tryToParseBSM_WS36aMeasurements(CTR: chargeTransparencyRecord.IChargeTransparencyRecord,\n ExpectedEVSEId: string,\n ExpectedCscSwVersion: string|null,\n Measurements: Array<unknown>)\n\n : chargeTransparencyRecord.IChargeTransparencyRecord |\n chargyInterfaces. ISessionCryptoResult\n\n {\n\n //#region Initial checks\n\n if (!Array.isArray(Measurements)) return {\n status: chargyInterfaces.SessionVerificationResult.InvalidSessionFormat,\n message: this.chargy.GetLocalizedMessage(\"MissingOrInvalidSignedMeterValues\"),\n certainty: 0\n }\n\n if (Measurements.length < 2) return {\n status: chargyInterfaces.SessionVerificationResult.InvalidSessionFormat,\n message: this.chargy.GetLocalizedMessage(\"AtLeastTwoSignedMeterValuesRequired\"),\n certainty: 0\n }\n\n const firstMeasurement = Measurements[0];\n\n if (!chargyLib.isMandatoryJSONObject(firstMeasurement)) return {\n status: chargyInterfaces.SessionVerificationResult.InvalidSessionFormat,\n message: this.chargy.GetLocalizedMessageWithParameter(\"MissingOrInvalidSignedMeterValueP\", 1),\n certainty: 0\n }\n\n const errors = new Array<string>();\n const warnings = new Array<string>();\n\n // How sure we are, that this is really a BSM meter value format\n const numberOfFormatChecks = 2*39; // At least two signed meter values!\n let secondaryErrors = 0;\n\n //#endregion\n\n try\n {\n\n //#region Validate values\n\n if (!chargyLib.isMandatoryString(firstMeasurement[\"@context\"]))\n errors.push(this.chargy.GetLocalizedMessageWithParameter(\"MissingOrInvalid_SignedMeterValue_JSONContextP\", 1));\n\n\n const meterInfo = firstMeasurement[\"meterInfo\"];\n if (!chargyLib.isMandatoryJSONObject(meterInfo))\n {\n errors.push(this.chargy.GetLocalizedMessageWithParameter(\"MissingOrInvalid_SignedMeterValue_MeterInfoP\", 1));\n secondaryErrors += 5;\n }\n else\n {\n\n if (!chargyLib.isMandatoryString(meterInfo[\"firmwareVersion\"]))\n errors.push(this.chargy.GetLocalizedMessageWithParameter(\"MissingOrInvalid_SignedMeterValue_MeterInfo_FirmwareVersionP\", 1));\n\n if (!chargyLib.isMandatoryString(meterInfo[\"publicKey\"]))\n errors.push(this.chargy.GetLocalizedMessageWithParameter(\"MissingOrInvalid_SignedMeterValue_MeterInfo_PublicKeyP\", 1));\n\n if (!chargyLib.isMandatoryString(meterInfo[\"meterId\"]))\n errors.push(this.chargy.GetLocalizedMessageWithParameter(\"MissingOrInvalid_SignedMeterValue_MeterInfo_MeterIdP\", 1));\n\n if (!chargyLib.isMandatoryString(meterInfo[\"manufacturer\"]))\n errors.push(this.chargy.GetLocalizedMessageWithParameter(\"MissingOrInvalid_SignedMeterValue_MeterInfo_ManufacturerP\", 1));\n\n if (!chargyLib.isMandatoryString(meterInfo[\"type\"]))\n errors.push(this.chargy.GetLocalizedMessageWithParameter(\"MissingOrInvalid_SignedMeterValue_MeterInfo_TypeP\", 1));\n\n }\n\n const contract = firstMeasurement[\"contract\"];\n if (!chargyLib.isMandatoryJSONObject(contract))\n {\n errors.push(this.chargy.GetLocalizedMessageWithParameter(\"MissingOrInvalid_SignedMeterValue_ContractP\", 1));\n secondaryErrors += 2;\n }\n else\n {\n\n if (!chargyLib.isMandatoryString(contract[\"id\"]))\n errors.push(this.chargy.GetLocalizedMessageWithParameter(\"MissingOrInvalid_SignedMeterValue_Contract_IdP\", 1));\n\n if (!chargyLib.isOptionalString(contract[\"type\"]))\n errors.push(this.chargy.GetLocalizedMessageWithParameter(\"MissingOrInvalid_SignedMeterValue_Contract_TypeP\", 1));\n\n }\n\n const value = firstMeasurement[\"value\"];\n if (!chargyLib.isMandatoryJSONObject(value))\n {\n errors.push(this.chargy.GetLocalizedMessageWithParameter(\"MissingOrInvalid_SignedMeterValue_ValueP\", 1));\n secondaryErrors += 8;\n }\n else\n {\n\n const measurand = value[\"measurand\"];\n if (!chargyLib.isMandatoryJSONObject(measurand))\n {\n errors.push(this.chargy.GetLocalizedMessageWithParameter(\"MissingOrInvalid_SignedMeterValue_MeasurandP\", 1));\n secondaryErrors += 2;\n }\n else\n {\n\n if (!chargyLib.isMandatoryString(measurand[\"id\"]))\n errors.push(this.chargy.GetLocalizedMessageWithParameter(\"MissingOrInvalid_Measurand_IdentificationP\", 1));\n\n if (!chargyLib.isMandatoryString(measurand[\"name\"]))\n errors.push(this.chargy.GetLocalizedMessageWithParameter(\"MissingOrInvalid_Measurand_NameP\", 1));\n\n }\n\n const measuredValue = value[\"measuredValue\"];\n if (!chargyLib.isMandatoryJSONObject(measuredValue))\n {\n errors.push(this.chargy.GetLocalizedMessageWithParameter(\"MissingOrInvalid_SignedMeterValue_MeasuredValueP\", 1));\n secondaryErrors += 4;\n }\n else\n {\n\n // MeasuredValueScale: Content.value?.measuredValue?.scale ?? Content.signedMeterValues[0].value?.measuredValue?.scale,\n // MeasuredValueUnit: Content.value?.measuredValue?.unit ?? Content.signedMeterValues[0].value?.measuredValue?.unit,\n // MeasuredValueUnitEncoded: Content.value?.measuredValue?.unitEncoded ?? Content.signedMeterValues[0].value?.measuredValue?.unitEncoded,\n // MeasuredValueValueType: Content.value?.measuredValue?.valueType ?? Content.signedMeterValues[0].value?.measuredValue?.valueType,\n\n }\n\n //ToDo: Verify optional displayedFormat\n\n // const displayedFormat = value.displayedFormat;\n // if (!chargyLib.isMandatoryJSONObject(displayedFormat))\n // {\n // errors.push(this.chargy.GetLocalizedMessageWithParameter(\"MissingOrInvalid_SignedMeterValue_MeasurandP\", 1));\n // secondaryErrors += 2;\n // }\n // else\n // {\n\n // if (!chargyLib.isMandatoryString(measurand.id))\n // errors.push(this.chargy.GetLocalizedMessageWithParameter(\"MissingOrInvalid_Measurand_IdentificationP\", 1));\n\n // if (!chargyLib.isMandatoryString(measurand.name))\n // errors.push(this.chargy.GetLocalizedMessageWithParameter(\"MissingOrInvalid_Measurand_NameP\", 1));\n\n // }\n\n }\n\n // MA1: null as string|null,\n // EpochSetCnt: -1,\n // EpochSetOS: -1,\n // dataSets: [] as any[]\n\n if (errors.length > 0) return {\n status: chargyInterfaces.SessionVerificationResult.InvalidSessionFormat,\n errors: errors,\n warnings: warnings,\n certainty: (numberOfFormatChecks - errors.length - secondaryErrors)/numberOfFormatChecks\n }\n\n\n // The early return above guarantees, that all mandatory values\n // have been validated. The optional values stay undefined when\n // they are missing or have an unexpected type.\n const meterInfoObj = chargyLib.asJSONObject(firstMeasurement[\"meterInfo\"]);\n const contractObj = chargyLib.asJSONObject(firstMeasurement[\"contract\"]);\n const valueObj = chargyLib.asJSONObject(firstMeasurement[\"value\"]);\n const measurandObj = chargyLib.asJSONObject(valueObj?.[\"measurand\"]);\n const measuredValueObj = chargyLib.asJSONObject(valueObj?.[\"measuredValue\"]);\n const displayedFormatObj = chargyLib.asJSONObject(valueObj?.[\"displayedFormat\"]);\n const chargePointObj = chargyLib.asJSONObject(firstMeasurement[\"chargePoint\"]);\n\n const common = {\n\n context: chargyLib.asString(firstMeasurement[\"@context\"]) ?? \"\",\n\n meterInfo_firmwareVersion: chargyLib.asString(meterInfoObj?.[\"firmwareVersion\"]) ?? \"\",\n meterInfo_publicKey: chargyLib.asString(meterInfoObj?.[\"publicKey\"]) ?? \"\",\n meterInfo_meterId: chargyLib.asString(meterInfoObj?.[\"meterId\"]) ?? \"\",\n meterInfo_manufacturer: chargyLib.asString(meterInfoObj?.[\"manufacturer\"]) ?? \"\",\n meterInfo_type: chargyLib.asString(meterInfoObj?.[\"type\"]) ?? \"\",\n\n contract_id: chargyLib.asString(contractObj?.[\"id\"]) ?? \"\",\n contract_type: chargyLib.asString(contractObj?.[\"type\"]),\n\n value_measurand_id: chargyLib.asString(measurandObj?.[\"id\"]) ?? \"\", // OBIS Id\n value_measurand_name: chargyLib.asString(measurandObj?.[\"name\"]) ?? \"\",\n\n value_measuredValue_scale: chargyLib.asNumber(measuredValueObj?.[\"scale\"]),\n value_measuredValue_unit: chargyLib.asString(measuredValueObj?.[\"unit\"]) ?? \"\",\n value_measuredValue_unitEncoded: chargyLib.asNumber(measuredValueObj?.[\"unitEncoded\"]),\n value_measuredValue_valueType: chargyLib.asString(measuredValueObj?.[\"valueType\"]),\n\n value_displayedFormat_prefix: chargyLib.asString(displayedFormatObj?.[\"prefix\"]) ?? \"\", // \"kilo\"\n value_displayedFormat_precision: chargyLib.asNumber(displayedFormatObj?.[\"precision\"]), // 2\n\n chargePoint_softwareVersion: chargyLib.asString(chargePointObj?.[\"softwareVersion\"]),\n MA1: null as string|null,\n epochSetCnt: -1,\n epochSetOS: -1,\n dataSets: new Array<IBSMDataSet>()\n\n };\n\n //#endregion\n\n //#region Data\n\n let Typ = 0; // Snapshot Type\n let RCR: IBSMAdditionalValue | undefined; // !!! Real energy imported since the last execution of the turn-on sequence\n let TotWhImp: IBSMAdditionalValue | undefined; // !!! Total Real Energy Imported\n let W: IBSMAdditionalValue | undefined; // !!! Total Real Power\n let MA1: string|null = null; // Meter Address 1\n let RCnt = 0; // A counter incremented with each snapshot\n let OS = 0; // Operation-Seconds Counter\n let Epoch = 0; // Current local time in seconds since 1970\n let TZO = 0; // Timezone offset of local epoch time time to UTC (minutes)\n let EpochSetCnt = 0; // How many time epoch time and timezone offset have been set\n let EpochSetOS = 0; // Operation-seconds when the time has been set the last time\n let DI = 0; // Status of the digital inputs\n let DO = 0; // Status of the digital outputs\n let Meta1: string|null = null; // User metadata 1 => Check text encoding: https://www.npmjs.com/package/iconv\n let Meta2: string|null = null; // User metadata 2 => Check text encoding: https://www.npmjs.com/package/iconv\n let Meta3: string|null = null; // User metadata 3 => Check text encoding: https://www.npmjs.com/package/iconv\n let Evt = 0; // Meter Event Flags\n\n\n let previousId: unknown = \"\";\n let previousTime = \"\";\n //const previousMeasurementId = \"\";\n let previousValue: number | undefined;\n\n let previousRCR = -1;\n let previousRCnt = -1;\n let previousOS = -1;\n let previousEpoch = -1;\n\n let previousCscSwVersion: string|null = null;\n\n let measurementCounter = 0;\n\n //#endregion\n\n for (const measurementRaw of Measurements)\n {\n\n const currentErrors: Array<string> = [];\n const currentWarnings: Array<string> = [];\n\n measurementCounter++;\n\n const currentMeasurement = chargyLib.asJSONObject(measurementRaw);\n if (currentMeasurement === undefined)\n throw new Error(`Invalid signed meter value #${String(measurementCounter)}!`);\n\n //#region Validate common values\n\n if (currentMeasurement[\"@context\"] !== common.context)\n currentErrors.push(this.chargy.GetLocalizedMessageWithParameter(\"Inconsistent_SignedMeterValue_JSONContextP\", measurementCounter));\n\n const currentId = currentMeasurement[\"@id\"];\n if (previousId !== \"\" && typeof currentId === 'string')\n {\n\n if (typeof previousId !== 'string')\n throw new Error(`Invalid identification of signed meter value #${String(measurementCounter - 1)}!`);\n\n // IDs from the BSM-WS36A are in the form of \"PREFIX-COUNTER\". Check that prefixes\n // match match and the counters are stricly increasing.\n\n const previousParts = previousId.split(\"-\");\n const currentParts = currentId. split(\"-\");\n\n if (previousParts.length !== 2 ||\n currentParts. length !== 2 ||\n previousParts[0] !== currentParts[0] ||\n previousParts[1] === undefined ||\n currentParts[1] === undefined ||\n // parseInt returns NaN in case parsing fails which in turn does not match\n // anything (not even NaN). This way we are checking that both counter values\n // are numeric too.\n parseInt(previousParts[1], 10) >= parseInt(currentParts[1], 10))\n {\n currentErrors.push(this.chargy.GetLocalizedMessageWithParameter(\"Inconsistent_SignedMeterValue_MeasurementIdP\", measurementCounter));\n }\n\n }\n previousId = currentId;\n\n\n const valueObj = chargyLib.asJSONObject(currentMeasurement[\"value\"]);\n const measuredValueObj = chargyLib.asJSONObject(valueObj?.[\"measuredValue\"]);\n const displayedFormatObj = chargyLib.asJSONObject(valueObj?.[\"displayedFormat\"]);\n const currentTime = chargyLib.asString (currentMeasurement[\"time\"]) ?? \"\";\n\n if (previousTime !== \"\" && currentTime <= previousTime)\n currentErrors.push(this.chargy.GetLocalizedMessageWithParameter(\"Inconsistent_SignedMeterValue_TimestampP\", measurementCounter));\n previousTime = currentTime;\n\n const currentValue = chargyLib.asNumber(measuredValueObj?.[\"value\"]);\n if (previousValue !== undefined && currentValue !== undefined && currentValue < previousValue)\n currentErrors.push(this.chargy.GetLocalizedMessageWithParameter(\"Inconsistent_Measurement_ValueP\", measurementCounter));\n previousValue = currentValue;\n\n //#region Flatten and validate the additional values\n\n const additionalValuesRaw = currentMeasurement[\"additionalValues\"];\n if (!chargyLib.isMandatoryJSONArray(additionalValuesRaw))\n throw new Error(`Missing or invalid additional values within signed meter value #${String(measurementCounter)}!`);\n\n const additionalValues = additionalValuesRaw.map((element, index) => {\n\n const elementObj = chargyLib.asJSONObject(element);\n const measurand = chargyLib.asJSONObject(elementObj?.[\"measurand\"]);\n const measuredValue = chargyLib.asJSONObject(elementObj?.[\"measuredValue\"]);\n const displayedFormat = chargyLib.asJSONObject(elementObj?.[\"displayedFormat\"]);\n\n if (elementObj === undefined || measurand === undefined)\n throw new Error(`Invalid additional value #${String(index + 1)} within signed meter value #${String(measurementCounter)}!`);\n\n return {\n measurandId: chargyLib.asString(measurand[\"id\"]),\n measurandName: chargyLib.asString(measurand[\"name\"]),\n scale: chargyLib.asNumber(measuredValue?.[\"scale\"]),\n unit: chargyLib.asString(measuredValue?.[\"unit\"]),\n unitEncoded: chargyLib.asNumber(measuredValue?.[\"unitEncoded\"]),\n value: measuredValue?.[\"value\"],\n valueType: chargyLib.asString(measuredValue?.[\"valueType\"]),\n prefix: chargyLib.asString(displayedFormat?.[\"prefix\"]),\n precision: chargyLib.asNumber(displayedFormat?.[\"precision\"])\n } satisfies IBSMAdditionalValue;\n\n });\n\n //#endregion\n\n if (currentMeasurement[\"meterInfo\"])\n {\n\n const meterInfoObj = chargyLib.asJSONObject(currentMeasurement[\"meterInfo\"]);\n\n if (meterInfoObj?.[\"firmwareVersion\"] !== common.meterInfo_firmwareVersion)\n currentErrors.push(this.chargy.GetLocalizedMessageWithParameter(\"Inconsistent_SignedMeterValue_MeterInfo_FirmwareVersionP\", measurementCounter));\n\n if (meterInfoObj?.[\"publicKey\"] !== common.meterInfo_publicKey)\n currentErrors.push(this.chargy.GetLocalizedMessageWithParameter(\"Inconsistent_SignedMeterValue_MeterInfo_PublicKeyP\", measurementCounter));\n\n if (meterInfoObj?.[\"meterId\"] !== common.meterInfo_meterId)\n currentErrors.push(this.chargy.GetLocalizedMessageWithParameter(\"Inconsistent_SignedMeterValue_MeterInfo_MeterIdP\", measurementCounter));\n\n if (meterInfoObj?.[\"meterId\"] !== additionalValues.filter(element => element.measurandName === \"MA1\")[0]?.value)\n currentErrors.push(this.chargy.GetLocalizedMessageWithParameter(\"Inconsistent_SignedMeterValue_MeterInfo_MeterIdP\", measurementCounter));\n\n if (meterInfoObj?.[\"manufacturer\"] !== common.meterInfo_manufacturer)\n currentErrors.push(this.chargy.GetLocalizedMessageWithParameter(\"Inconsistent_SignedMeterValue_MeterInfo_ManufacturerP\", measurementCounter));\n\n if (meterInfoObj?.[\"type\"] !== common.meterInfo_type)\n currentErrors.push(this.chargy.GetLocalizedMessageWithParameter(\"Inconsistent_SignedMeterValue_MeterInfo_TypeP\", measurementCounter));\n\n }\n\n // if (currentMeasurement.operatorInfo)\n // {\n // if (currentMeasurement.operatorInfo !== common.operatorInfo)\n // return {\n // status: chargyInterfaces.SessionVerificationResult.InvalidSessionFormat,\n // message: \"Inconsistent operatorInfo!\",\n // certainty: 0\n // };\n // }\n\n if (currentMeasurement[\"contract\"])\n {\n\n const contractObj = chargyLib.asJSONObject(currentMeasurement[\"contract\"]);\n\n if (additionalValues.filter(element => element.measurandName?.startsWith('Meta') && chargyLib.asString(element.value)?.startsWith('contract-id:')).length == 0)\n currentErrors.push(this.chargy.GetLocalizedMessageWithParameter(\"Inconsistent_SignedMeterValue_Contract_IdP\", measurementCounter));\n\n if (contractObj?.[\"id\"] !== common.contract_id)\n currentErrors.push(this.chargy.GetLocalizedMessageWithParameter(\"Inconsistent_SignedMeterValue_Contract_IdP\", measurementCounter));\n\n if (contractObj?.[\"type\"] !== common.contract_type)\n currentErrors.push(this.chargy.GetLocalizedMessageWithParameter(\"Inconsistent_SignedMeterValue_Contract_TypeP\", measurementCounter));\n\n const contractInfo = additionalValues.filter(element => element.measurandName?.startsWith('Meta') && chargyLib.asString(element.value)?.startsWith('contract-id:'))[0]?.value;\n if (contractInfo != null)\n {\n\n if ( contractObj?.[\"type\"] && contractInfo !== \"contract-id: \" + (common.contract_type ?? \"-\") + \":\" + common.contract_id)\n currentErrors.push(this.chargy.GetLocalizedMessageWithParameter(\"Inconsistent_SignedMeterValue_Contract_IdP\", measurementCounter));\n\n if (!contractObj?.[\"type\"] && contractInfo !== \"contract-id: \" + common.contract_id)\n currentErrors.push(this.chargy.GetLocalizedMessageWithParameter(\"Inconsistent_SignedMeterValue_Contract_IdP\", measurementCounter));\n\n }\n\n }\n\n\n // Cross-check that value matches the common value (besides\n // measuredValue.value) and is identical to the signed RCR from\n // the additional values array.\n\n const rcrInAdditional = additionalValues.find(element => element.measurandName == 'RCR');\n\n if (currentMeasurement[\"value\"] == null)\n throw new Error(`Missing value within signed meter value #${String(measurementCounter)}!`);\n\n if ((valueObj?.[\"measurand\"] || valueObj?.[\"measuredValue\"]) && rcrInAdditional === undefined)\n throw new Error(`Missing 'RCR' within the additional values of signed meter value #${String(measurementCounter)}!`);\n\n if (valueObj?.[\"measurand\"])\n {\n\n const measurandObj = chargyLib.asJSONObject(valueObj[\"measurand\"]);\n\n if (measurandObj?.[\"id\"] !== common.value_measurand_id || measurandObj[\"id\"] !== rcrInAdditional?.measurandId)\n currentErrors.push(this.chargy.GetLocalizedMessageWithParameter(\"Inconsistent_Measurand_IdentificationP\", measurementCounter));\n\n if (measurandObj?.[\"name\"] !== common.value_measurand_name || measurandObj[\"name\"] !== rcrInAdditional?.measurandName)\n currentErrors.push(this.chargy.GetLocalizedMessageWithParameter(\"Inconsistent_Measurand_NameP\", measurementCounter));\n\n }\n\n if (valueObj?.[\"measuredValue\"])\n {\n\n if (measuredValueObj?.[\"value\"] !== rcrInAdditional?.value)\n currentErrors.push(this.chargy.GetLocalizedMessageWithParameter(\"Inconsistent_SignedMeterValueP\", measurementCounter));\n\n if (measuredValueObj?.[\"scale\"] !== common.value_measuredValue_scale || measuredValueObj?.[\"scale\"] !== rcrInAdditional?.scale)\n currentErrors.push(this.chargy.GetLocalizedMessageWithParameter(\"Inconsistent_SignedMeterValue_ScaleP\", measurementCounter));\n\n if (measuredValueObj?.[\"unit\"] !== common.value_measuredValue_unit || measuredValueObj [\"unit\"] !== rcrInAdditional?.unit)\n currentErrors.push(this.chargy.GetLocalizedMessageWithParameter(\"Inconsistent_SignedMeterValue_UnitP\", measurementCounter));\n\n if (measuredValueObj?.[\"unitEncoded\"] !== common.value_measuredValue_unitEncoded || measuredValueObj?.[\"unitEncoded\"] !== rcrInAdditional?.unitEncoded)\n currentErrors.push(this.chargy.GetLocalizedMessageWithParameter(\"Inconsistent_SignedMeterValue_UnitEncodedP\", measurementCounter));\n\n if (measuredValueObj?.[\"valueType\"] !== common.value_measuredValue_valueType || measuredValueObj?.[\"valueType\"] !== rcrInAdditional?.valueType)\n currentErrors.push(this.chargy.GetLocalizedMessageWithParameter(\"Inconsistent_SignedMeterValue_TypeP\", measurementCounter));\n\n }\n\n if (currentMeasurement[\"chargePoint\"] && chargyLib.asJSONObject(currentMeasurement[\"chargePoint\"])?.[\"softwareVersion\"] !== common.chargePoint_softwareVersion)\n currentErrors.push(this.chargy.GetLocalizedMessage(\"Inconsistent_ChargingStation_FirmwareVersion\"));\n\n //#region Find \"evse-id:\" within the \"Meta\" data blocks\n\n const signedEVSEId = additionalValues.filter(element => element.measurandName?.startsWith('Meta') && chargyLib.asString(element.value)?.startsWith('evse-id:'));\n if (signedEVSEId.length == 1)\n {\n\n const evse__id = (chargyLib.asString(signedEVSEId[0]?.value) ?? \"\").replace('evse-id:', '').trim();\n\n if (evse__id !== 'unknown' && ExpectedEVSEId !== evse__id)\n currentErrors.push(this.chargy.GetLocalizedMessage(\"Inconsistent_EVSE_Identification\"));\n\n }\n\n //#endregion\n\n //#region Find \"csc-sw-version:\" within the \"Meta\" data blocks\n\n const signedCSCSWVersion = additionalValues.filter(element => element.measurandName?.startsWith('Meta') && chargyLib.asString(element.value)?.startsWith('csc-sw-version:'));\n if (signedCSCSWVersion.length == 1)\n {\n\n const csc_sw_version = chargyLib.asString(signedCSCSWVersion[0]?.value)?.replace('csc-sw-version:', '').trim() ?? null;\n\n // Just check that all measurements are done with the same\n // charging controller software version.\n if (previousCscSwVersion !== null && previousCscSwVersion !== csc_sw_version)\n currentErrors.push(this.chargy.GetLocalizedMessage(\"Inconsistent_ChargingStation_FirmwareVersion\"));\n\n // The document header also contains this information but\n // in a combined form of the actual version and a build\n // timestamp. As this information is not signed and just\n // informative, we are ignoring it as a sound comparison of\n // software versions is hard to do when it comes to suffixs\n // for release candidates, betas, ...\n if (ExpectedCscSwVersion !== null && ExpectedCscSwVersion !== csc_sw_version)\n currentWarnings.push(this.chargy.GetLocalizedMessage(\"Inconsistent_ChargingStation_FirmwareVersion\"));\n\n previousCscSwVersion = csc_sw_version;\n\n }\n\n //#endregion\n\n //#endregion\n\n //#region Check additional values\n\n for(const additionalValue of additionalValues)\n {\n switch (additionalValue.measurandName)\n {\n case \"Typ\": Typ = chargyLib.asNumber(additionalValue.value) ?? NaN; break;\n case \"RCR\": RCR = additionalValue; break;\n case \"TotWhImp\": TotWhImp = additionalValue; break;\n case \"W\": W = additionalValue; break;\n case \"MA1\": MA1 = chargyLib.asString(additionalValue.value) ?? null; break;\n case \"RCnt\": RCnt = chargyLib.asNumber(additionalValue.value) ?? NaN; break;\n case \"OS\": OS = chargyLib.asNumber(additionalValue.value) ?? NaN; break;\n case \"Epoch\": Epoch = chargyLib.asNumber(additionalValue.value) ?? NaN; break;\n case \"TZO\": TZO = chargyLib.asNumber(additionalValue.value) ?? NaN; break;\n case \"EpochSetCnt\": EpochSetCnt = chargyLib.asNumber(additionalValue.value) ?? NaN; break;\n case \"EpochSetOS\": EpochSetOS = chargyLib.asNumber(additionalValue.value) ?? NaN; break;\n case \"DI\": DI = chargyLib.asNumber(additionalValue.value) ?? NaN; break;\n case \"DO\": DO = chargyLib.asNumber(additionalValue.value) ?? NaN; break;\n case \"Meta1\": Meta1 = chargyLib.asString(additionalValue.value) ?? \"\"; break;\n case \"Meta2\": Meta2 = chargyLib.asString(additionalValue.value) ?? \"\"; break;\n case \"Meta3\": Meta3 = chargyLib.asString(additionalValue.value) ?? \"\"; break;\n case \"Evt\": Evt = chargyLib.asNumber(additionalValue.value) ?? NaN; break;\n }\n }\n\n\n const currentRCRValue = chargyLib.asNumber(RCR?.value) ?? NaN;\n\n if (previousRCR !== -1 && currentRCRValue < previousRCR)\n currentErrors.push(this.chargy.GetLocalizedMessageWithParameter(\"Inconsistent_Measurement_ValueP\", measurementCounter));\n previousRCR = currentRCRValue;\n\n if (RCnt !== currentMeasurement[\"measurementId\"])\n currentErrors.push(this.chargy.GetLocalizedMessageWithParameter(\"Inconsistent_SignedMeterValue_MeasurementIdP\", measurementCounter));\n\n // Snapshot counter\n if (previousRCnt !== -1 && RCnt != previousRCnt + 1)\n currentErrors.push(this.chargy.GetLocalizedMessageWithParameter(\"Inconsistent_SignedMeterValue_CounterP\", measurementCounter));\n previousRCnt = RCnt;\n\n // Uptime counter\n if (previousOS !== -1 && OS <= previousOS)\n currentErrors.push(this.chargy.GetLocalizedMessageWithParameter(\"Inconsistent_SignedMeterValue_OperationSecondsCounterP\", measurementCounter));\n previousOS = OS;\n\n if (previousEpoch !== -1 && Epoch <= previousEpoch)\n currentErrors.push(this.chargy.GetLocalizedMessageWithParameter(\"Inconsistent_SignedMeterValue_UNIXEpochP\", measurementCounter));\n previousEpoch = Epoch;\n\n\n const measurementTimestamp1 = new Date(Epoch * 1000 + TZO * 60000).toISOString();\n const measurementTimestamp2 = measurementTimestamp1.substring(0, measurementTimestamp1.indexOf('.'));\n const measurementTimestamp3 = measurementTimestamp2 + (TZO > 0 ? \"+\" : \"-\") + (Math.abs(TZO) / 60).toString().padStart(2, '0') + \":\" + (Math.abs(TZO) % 60).toString().padStart(2, '0');\n\n if (currentTime !== measurementTimestamp3)\n currentErrors.push(this.chargy.GetLocalizedMessageWithParameter(\"Inconsistent_SignedMeterValue_TimestampP\", measurementCounter));\n\n // Meter Address 1 == Meter Id\n if (common.MA1 !== null && MA1 !== common.MA1)\n currentErrors.push(this.chargy.GetLocalizedMessageWithParameter(\"Inconsistent_SignedMeterValue_MeterInfo_MeterIdP\", measurementCounter));\n common.MA1 = MA1;\n\n if (common.epochSetCnt !== -1 && EpochSetCnt !== common.epochSetCnt)\n currentErrors.push(this.chargy.GetLocalizedMessageWithParameter(\"Inconsistent_SignedMeterValue_EpochSet_CounterP\", measurementCounter));\n common.epochSetCnt = EpochSetCnt;\n\n if (common.epochSetOS !== -1 && EpochSetOS !== common.epochSetOS)\n currentErrors.push(this.chargy.GetLocalizedMessageWithParameter(\"Inconsistent_SignedMeterValue_EpochSet_OperationSecondsP\", measurementCounter));\n common.epochSetOS = EpochSetOS;\n\n //#endregion\n\n common.dataSets.push({\n Typ: Typ,\n TypParsed: this.ParseTyp(Typ),\n RCR: RCR,\n TotWhImp: TotWhImp,\n W: W,\n MA1: MA1,\n RCnt: RCnt,\n OS: OS,\n Epoch: Epoch,\n TZO: TZO, // Must be common? Or may it change e.g. during summer/winter time change?!\n EpochSetCnt: EpochSetCnt,\n EpochSetOS: EpochSetOS,\n DI: DI,\n DO: DO,\n Meta1: Meta1,\n Meta2: Meta2,\n Meta3: Meta3,\n Evt: Evt,\n time: currentTime,\n value: measuredValueObj?.[\"value\"],\n valuePrefix: this.PrefixConverter(chargyLib.asString(displayedFormatObj?.[\"prefix\"]) ?? \"kilo\"),\n valuePrecision: chargyLib.asNumber(displayedFormatObj?.[\"precision\"]) ?? 2,\n measurementId: currentMeasurement[\"measurementId\"],\n signature: chargyLib.asString(currentMeasurement[\"signature\"]) ?? \"\",\n errors: currentErrors,\n warnings: currentWarnings\n });\n\n }\n\n //#region Validate consistency of snapshot types\n\n const n = common.dataSets.length-1;\n\n // At least two signed meter values are validated above!\n const firstDataSet = common.dataSets[0];\n const lastDataSet = common.dataSets[n];\n\n if (firstDataSet === undefined || (firstDataSet.TypParsed !== \"START\" && firstDataSet.TypParsed !== \"TURN ON\"))\n throw new Error(this.chargy.GetLocalizedMessageWithParameter(\"Inconsistent_EnergyMeterValueP\", 1));\n\n for (let i=1; i<common.dataSets.length-1; i++) {\n if (common.dataSets[i]?.TypParsed !== \"CURRENT\")\n errors.push(this.chargy.GetLocalizedMessageWithParameter(\"Inconsistent_EnergyMeterValueP\", measurementCounter + 1));\n }\n\n if (lastDataSet === undefined || (lastDataSet.TypParsed !== \"END\" && lastDataSet.TypParsed !== \"TURN OFF\"))\n throw new Error(this.chargy.GetLocalizedMessageWithParameter(\"Inconsistent_EnergyMeterValueP\", n+1));\n\n //#endregion\n\n //#region Set charging session information\n\n if (CTR.chargingSessions == null)\n CTR.chargingSessions = [];\n\n const ASN1_SignatureSchema = this.chargy.asn1.define('Signature', function() {\n this.seq().obj(\n this.key('r').int(),\n this.key('s').int()\n );\n });\n\n const session = {\n\n \"@id\": common.meterInfo_meterId + \"-\" + String(firstDataSet.Epoch),\n \"@context\": \"https://open.charging.cloud/contexts/SessionSignatureFormats/bsm-ws36a-v0+json\",\n \"begin\": firstDataSet.time,\n \"end\": lastDataSet.time,\n \"EVSEId\": CTR.chargingStationOperators?.[0]?.[\"chargingStations\"]?.[0]?.[\"EVSEs\"][0]?.[\"@id\"],\n\n \"authorizationStart\": {\n \"@id\": common.contract_id,\n \"@context\": common.contract_type\n },\n\n \"measurements\": [\n {\n \"energyMeterId\": common.meterInfo_meterId,\n // //\"@context\": \"https://open.charging.cloud/contexts/energyMeter/signatureFormat/bsm-ws36a-v0+json\",\n \"phenomena\": [\n {\n \"name\": \"Real Energy Imported\",\n \"obis\": common.value_measurand_id,\n \"unit\": this.UnitConverter (common.value_measuredValue_unit),\n \"unitEncoded\": common.value_measuredValue_unitEncoded,\n \"valueType\": common.value_measuredValue_valueType,\n \"value\": \"value\",\n \"scale\": common.value_measuredValue_scale,\n \"formatPrefix\": this.PrefixConverter(common.value_displayedFormat_prefix),\n \"formatPrecision\": common.value_displayedFormat_precision\n },\n {\n \"name\": \"Total Watt-hours Imported\",\n \"obis\": TotWhImp?.measurandId,\n \"unit\": this.UnitConverter (TotWhImp?.unit ?? \"\"),\n \"unitEncoded\": TotWhImp?.unitEncoded,\n \"valueType\": TotWhImp?.valueType,\n \"value\": \"TotWhImp\",\n \"scale\": TotWhImp?.scale,\n \"formatPrefix\": this.PrefixConverter(TotWhImp?.prefix ?? \"\"),\n \"formatPrecision\": TotWhImp?.precision,\n },\n {\n \"name\": \"Total Real Power\",\n \"obis\": W?.measurandId,\n \"unit\": this.UnitConverter (W?.unit ?? \"\"),\n \"unitEncoded\": W?.unitEncoded,\n \"valueType\": W?.valueType,\n \"value\": \"W\",\n \"scale\": W?.scale,\n \"formatPrefix\": this.PrefixConverter(W?.prefix ?? \"\"),\n \"formatPrecision\": W?.precision\n }\n ],\n \"values\": new Array<IBSMMeasurementValue>()\n }\n ]\n\n };\n\n for (const dataSet of common.dataSets)\n {\n\n let ASN1Signature: IASN1Signature | undefined;\n\n try\n {\n\n ASN1Signature = ASN1_SignatureSchema.decode<IASN1Signature>(Buffer.from(dataSet.signature, 'hex'), 'der');\n\n }\n catch (exception)\n {\n // Note: Some manipulations will not result in an invalid signature and\n // may also not cause an invalid signature validation. This is caused\n // by the mathematical nature of these big numbers and not a bug!\n errors.push(this.chargy.GetLocalizedMessageWithParameter(\"MissingOrInvalid_SignedMeterValue_SignatureP\", 1) + \": \" + (exception instanceof Error ? exception.message : String(exception))); }\n\n const bsmMeasurementValue: IBSMMeasurementValue = {\n\n timestamp: dataSet.time,\n Typ: dataSet.Typ,\n value: new Decimal(chargyLib.asNumber(dataSet.value) ?? NaN),\n value_displayPrefix: dataSet.valuePrefix,\n value_displayPrecision: dataSet.valuePrecision,\n\n RCR: chargyLib.asNumber (dataSet.RCR?.value) ?? NaN,\n RCR_SF: dataSet.RCR?.scale ?? NaN,\n RCR_Unit: this.UnitConverter (dataSet.RCR?.unit ?? \"\"),\n RCR_Prefix: this.PrefixConverter(dataSet.RCR?.prefix ?? \"\"),\n RCR_Precision: dataSet.RCR?.precision ?? NaN,\n\n TotWhImp: chargyLib.asNumber (dataSet.TotWhImp?.value) ?? NaN,\n TotWhImp_SF: dataSet.TotWhImp?.scale ?? NaN,\n TotWhImp_Unit: this.UnitConverter (dataSet.TotWhImp?.unit ?? \"\"),\n TotWhImp_Prefix: this.PrefixConverter(dataSet.TotWhImp?.prefix ?? \"\"),\n TotWhImp_Precision: dataSet.TotWhImp?.precision ?? NaN,\n\n W: chargyLib.asNumber (dataSet.W?.value) ?? NaN,\n W_SF: dataSet.W?.scale ?? NaN,\n W_Unit: this.UnitConverter (dataSet.W?.unit ?? \"\"),\n W_Prefix: this.PrefixConverter(dataSet.W?.prefix ?? \"\"),\n W_Precision: dataSet.W?.precision ?? NaN,\n\n MA1: dataSet.MA1 ?? \"\",\n RCnt: dataSet.RCnt,\n OS: dataSet.OS,\n Epoch: dataSet.Epoch,\n TZO: dataSet.TZO,\n EpochSetCnt: dataSet.EpochSetCnt,\n EpochSetOS: dataSet.EpochSetOS,\n DI: dataSet.DI,\n DO: dataSet.DO,\n Meta1: dataSet.Meta1 ?? \"\",\n Meta2: dataSet.Meta2 ?? \"\",\n Meta3: dataSet.Meta3 ?? \"\",\n Evt: dataSet.Evt,\n\n errors: dataSet.errors,\n warnings: dataSet.warnings,\n\n signatures: [{\n r: ASN1Signature?.r.toString(16) ?? \"-\",\n s: ASN1Signature?.s.toString(16) ?? \"-\"\n }]\n\n };\n\n session.measurements[0]?.values.push(bsmMeasurementValue);\n\n }\n\n CTR.chargingSessions.push(session as unknown as chargeTransparencyRecord.IChargingSession);\n\n //#endregion\n\n //#region Set other CTR information\n\n CTR[\"@id\"] = common.meterInfo_meterId + \"-\" + String(firstDataSet.Epoch);\n\n {\n\n const firstChargingSession = CTR.chargingSessions[0];\n const lastChargingSession = CTR.chargingSessions[CTR.chargingSessions.length - 1];\n\n if (firstChargingSession !== undefined &&\n (CTR.begin == undefined || CTR.begin === \"\" || CTR.begin > firstChargingSession.begin))\n {\n CTR.begin = firstChargingSession.begin;\n }\n\n if (lastChargingSession?.end !== undefined)\n {\n if (CTR.end == undefined || CTR.end === \"\" || CTR.end < lastChargingSession.end)\n CTR.end = lastChargingSession.end;\n }\n\n }\n\n if (CTR.contract == null)\n CTR.contract = {\n \"@id\": common.contract_id,\n \"@context\": common.contract_type,\n };\n else\n {\n //ToDo: What to do when there are different values?!\n CTR.contract[\"@id\"] = common.contract_id;\n CTR.contract[\"@context\"] = common.contract_type;\n }\n\n (CTR.chargingStationOperators?.[0]?.chargingStations?.[0]?.EVSEs[0]?.meters)?.push({\n \"@id\": common.meterInfo_meterId,\n model: common.meterInfo_type,\n manufacturer: common.meterInfo_manufacturer,\n manufacturerURL: \"https://www.bzr-bauer.de\",\n firmwareVersion: common.meterInfo_firmwareVersion,\n //hardwareVersion?: string;\n signatureInfos: {\n hash: chargyInterfaces.CryptoHashAlgorithms.SHA256,\n hashTruncation: 0,\n algorithm: chargyInterfaces.CryptoAlgorithms.ECC,\n curve: \"secp256r1\",\n format: chargyInterfaces.SignatureFormats.RS\n },\n signatureFormat: \"BSMCrypt01\",\n publicKeys: [{\n algorithm: \"secp256r1\",\n format: \"DER\",\n encoding: \"hex\",\n value: common.meterInfo_publicKey\n }]\n });\n\n //#endregion\n\n CTR.status = errors.length == 0\n ? chargyInterfaces.SessionVerificationResult.Unvalidated\n : chargyInterfaces.SessionVerificationResult.InvalidSessionFormat;\n\n CTR.certainty = 1 - errors.length/numberOfFormatChecks;\n\n return CTR;\n\n }\n catch (exception)\n {\n errors.push(\"Exception occured: \" + (exception instanceof Error ? exception.message : String(exception)));\n }\n\n return {\n status: chargyInterfaces.SessionVerificationResult.InvalidSessionFormat,\n errors: errors,\n warnings: warnings,\n certainty: 0\n }\n\n }\n\n\n async VerifyChargingSession(chargingSession: chargeTransparencyRecord.IChargingSession): Promise<chargyInterfaces.ISessionCryptoResult>\n {\n\n let sessionResult = chargyInterfaces.SessionVerificationResult.UnknownSessionFormat;\n\n {\n for (const measurement of chargingSession.measurements)\n {\n\n measurement.chargingSession = chargingSession;\n\n // Must include at least two measurements (start & stop)\n if (measurement.values.length > 1)\n {\n\n // Validate...\n for (const measurementValue of measurement.values)\n {\n measurementValue.measurement = measurement;\n await this.VerifyMeasurement(measurementValue as IBSMMeasurementValue);\n }\n\n // Find an overall result...\n sessionResult = chargyInterfaces.SessionVerificationResult.ValidSignature;\n\n for (const measurementValue of measurement.values)\n {\n if (sessionResult == chargyInterfaces.SessionVerificationResult.ValidSignature &&\n measurementValue.result?.status != chargyInterfaces.VerificationResult.ValidSignature)\n {\n sessionResult = chargyInterfaces.SessionVerificationResult.InvalidSignature;\n }\n }\n\n }\n\n else\n sessionResult = chargyInterfaces.SessionVerificationResult.AtLeastTwoMeasurementsRequired;\n\n }\n }\n\n return {\n status: sessionResult,\n certainty: 0\n }\n\n }\n\n async VerifyMeasurement(measurementValue: IBSMMeasurementValue): Promise<IBSMCrypt01Result>\n {\n\n function setResult(verificationResult: chargyInterfaces.VerificationResult)\n {\n cryptoResult.status = verificationResult;\n measurementValue.result = cryptoResult;\n return cryptoResult;\n }\n\n // function setErrorResult(errorMessage: string)\n // {\n // cryptoResult.status = chargyInterfaces.VerificationResult.ValidationError;\n // cryptoResult.errors?.push(errorMessage);\n // measurementValue.result = cryptoResult;\n // return cryptoResult;\n // }\n\n\n // https://github.com/chargeITmobility/bsm-python-private/blob/30abc7ba958c936fdb952ed1f121e45d0818419c/doc/examples/snapshots.md#snapshot-creation\n\n // Typ (0) => 00000000 00 ff\n // RCR (150 Wh) => 00000096 00 1e\n // TotWhImp (88350 Wh) => 0001591e 00 1e\n // W (0.0 W) => 00000000 01 1b\n // MA1 (001BZR1521070003) => 00000010 303031425a5231353231303730303033\n // RCnt (22111) => 0000565f 00 ff\n // OS (1840464 s) => 001c1550 00 07\n // Epoch (1602156057 s) => 5f7ef619 00 07\n // TZO (120 min) => 00000078 00 06\n // EpochSetCnt (12174) => 00002f8e 00 ff\n // EpochSetOS (1829734 s) => 001beb66 00 07\n // DI (1) => 00000001 00 ff\n // DO (0) => 00000000 00 ff\n // Meta1 (demo data 1) => 0000000b 64656d6f20646174612031\n // Meta2 () => 00000000\n // Meta3 () => 00000000\n // Evt (0) => 00000000 00 ff\n\n // Byte array to be hashed: 0000000000ff00000096001e0001591e001e00000000011b00000010303031425a52313532313037303030330000565f00ff001c155000075f7ef619000700000078000600002f8e00ff001beb6600070000000100ff0000000000ff0000000b64656d6f2064617461203100000000000000000000000000ff\n // SHA256 value: cfbc3ac362fe24e1913ec5651f69dd4744ba256de990fa767a9c58279b47353b\n // Public Key: 3059301306072a8648ce3d020106082a8648ce3d030107034200044bfd02c1d85272ceea9977db26d72cc401d9e5602faeee7ec7b6b62f9c0cce34ad8d345d5ac0e8f65deb5ff0bb402b1b87926bd1b7fc2dbc3a9774e8e70c7254\n // Signature: 3045022100895b68a977654fc052988310dc92aad5f7191ec936acbb7bfa322130171ff06002205de10b55b48e2e08c59e03108d67e5f3e72ed62b10b77b705cae6d3e73ce73b9\n\n // measurementValue.Typ = 0;\n // measurementValue.RCR = 150;\n // measurementValue.TotWhImp = 88350;\n // measurementValue.W = 0;\n // measurementValue.MA1 = \"001BZR1521070003\";\n // measurementValue.RCnt = 22111;\n // measurementValue.OS = 1840464;\n // measurementValue.Epoch = 1602156057;\n // measurementValue.TZO = 120;\n // measurementValue.EpochSetCnt = 12174;\n // measurementValue.EpochSetOS = 1829734;\n // measurementValue.DI = 1;\n // measurementValue.DO = 0;\n // measurementValue.Meta1 = \"demo data 1\";\n // measurementValue.Meta2 = \"\";\n // measurementValue.Meta3 = \"\";\n // measurementValue.Evt = 0;\n\n // # Numerical Values\n // \n // `vvvvvvvv ss uu` means:\n // - A 32 bit representation of the numerical value `vvvvvvvv`\n // - A signed 8 bit scale factor exponent `ss`\n // - The unsigned 8 bit representation `uu` of the DLMS code for its unit (OBIS)\n // \n // For example...\n // - In its base unit Wh: 36.6 kWh = 36600 Wh = 0x8ef8 Wh\n // - This would require a scale factor of 1 = 10^0, thus the scale factor exponent 0\n // - The DLMS unit code for Wh 30 = 0x1e\n // - Which results in 00008ef8 00 1e\n\n // # String Values\n // \n // String values are represented by:\n // - Its length as an unsigned 32 bit value\n // - Catenated with its actual data bytes\n // \n // For example...\n // - The string `ABC` will be represented as `00000003 414243`\n\n measurementValue.method = this;\n\n const MA1_length = new TextEncoder().encode(measurementValue.MA1 ).length + 4;\n const Meta1_length = new TextEncoder().encode(measurementValue.Meta1).length + 4;\n const Meta2_length = new TextEncoder().encode(measurementValue.Meta2).length + 4;\n const Meta3_length = new TextEncoder().encode(measurementValue.Meta3).length + 4;\n const requiredSize = 13*6 + MA1_length + Meta1_length + Meta2_length + Meta3_length;\n const buffer = new ArrayBuffer(requiredSize);\n const cryptoBuffer = new DataView(buffer);\n\n // TODO: Use units and scale factors from input data instead of making\n // assumptions about them.\n const cryptoResult:IBSMCrypt01Result = {\n status: chargyInterfaces.VerificationResult.InvalidSignature,\n ArraySize: requiredSize,\n Typ: chargyLib.SetUInt32_withCode(cryptoBuffer, measurementValue.Typ, 0, 255, 0),\n RCR: chargyLib.SetUInt32_withCode(cryptoBuffer, measurementValue.RCR, measurementValue.RCR_SF, 30, 6),\n TotWhImp: chargyLib.SetUInt32_withCode(cryptoBuffer, measurementValue.TotWhImp, measurementValue.TotWhImp_SF, 30, 12),\n W: chargyLib.SetUInt32_withCode(cryptoBuffer, measurementValue.W, measurementValue.W_SF, 27, 18),\n MA1: chargyLib.SetText_withLength(cryptoBuffer, measurementValue.MA1, 24),\n RCnt: chargyLib.SetUInt32_withCode(cryptoBuffer, measurementValue.RCnt, 0, 255, 24 + MA1_length),\n OS: chargyLib.SetUInt32_withCode(cryptoBuffer, measurementValue.OS, 0, 7, 30 + MA1_length),\n Epoch: chargyLib.SetUInt32_withCode(cryptoBuffer, measurementValue.Epoch, 0, 7, 36 + MA1_length),\n TZO: chargyLib.SetUInt32_withCode(cryptoBuffer, measurementValue.TZO, 0, 6, 42 + MA1_length),\n EpochSetCnt: chargyLib.SetUInt32_withCode(cryptoBuffer, measurementValue.EpochSetCnt, 0, 255, 48 + MA1_length),\n EpochSetOS: chargyLib.SetUInt32_withCode(cryptoBuffer, measurementValue.EpochSetOS, 0, 7, 54 + MA1_length),\n DI: chargyLib.SetUInt32_withCode(cryptoBuffer, measurementValue.DI, 0, 255, 60 + MA1_length),\n DO: chargyLib.SetUInt32_withCode(cryptoBuffer, measurementValue.DO, 0, 255, 66 + MA1_length),\n Meta1: chargyLib.SetText_withLength(cryptoBuffer, measurementValue.Meta1, 72 + MA1_length),\n Meta2: chargyLib.SetText_withLength(cryptoBuffer, measurementValue.Meta2, 72 + MA1_length + Meta1_length),\n Meta3: chargyLib.SetText_withLength(cryptoBuffer, measurementValue.Meta3, 72 + MA1_length + Meta1_length + Meta2_length),\n Evt: chargyLib.SetUInt32_withCode(cryptoBuffer, measurementValue.Evt, 0, 255, 72 + MA1_length + Meta1_length + Meta2_length + Meta3_length),\n };\n\n const firstSignature = measurementValue.signatures?.[0];\n if (firstSignature != null)\n {\n\n const signatureExpected = firstSignature as chargyInterfaces.ISignatureRS;\n\n try\n {\n\n cryptoResult.sha256value = (await chargyLib.sha256(cryptoBuffer));\n\n const meter = measurementValue.measurement !== undefined\n ? this.chargy.GetMeter(measurementValue.measurement.energyMeterId)\n : undefined;\n\n cryptoResult.signature = {\n algorithm: (measurementValue.measurement?.signatureInfos ?? meter?.signatureInfos)?.algorithm,\n format: (measurementValue.measurement?.signatureInfos ?? meter?.signatureInfos)?.format,\n r: signatureExpected.r,\n s: signatureExpected.s\n };\n\n if (meter != null)\n {\n\n cryptoResult.meter = meter;\n\n if (meter.publicKeys != null && meter.publicKeys.length > 0)\n {\n\n try\n {\n\n cryptoResult.publicKey = meter.publicKeys[0]?.value;\n cryptoResult.publicKeyFormat = meter.publicKeys[0]?.format;\n cryptoResult.publicKeySignatures = meter.publicKeys[0]?.signatures;\n let publicKey = cryptoResult.publicKey ?? \"\";\n\n if (cryptoResult.publicKeyFormat == \"DER\")\n {\n\n // https://lapo.it/asn1js/ for a visual check...\n // https://github.com/indutny/asn1.js\n const ASN1_OIDs = this.chargy.asn1.define('OIDs', function() {\n this.key('oid').objid()\n });\n\n const ASN1_PublicKey = this.chargy.asn1.define('PublicKey', function() {\n this.seq().obj(\n this.key('oids').seqof(ASN1_OIDs),\n this.key('publicKey').bitstr()\n );\n });\n\n const publicKeyDER = ASN1_PublicKey.decode<{ publicKey: { data: ArrayBuffer | Uint8Array } }>(Buffer.from(meter.publicKeys[0]?.value ?? \"\", 'hex'), 'der');\n publicKey = chargyLib.buf2hex(publicKeyDER.publicKey.data).toLowerCase();\n\n }\n\n try\n {\n\n if (this.curve.keyFromPublic(publicKey, 'hex').\n verify (cryptoResult.sha256value,\n cryptoResult.signature))\n {\n\n if (measurementValue.errors && measurementValue.errors.length > 0)\n return setResult(chargyInterfaces.VerificationResult.ValidationError);\n\n return setResult(chargyInterfaces.VerificationResult.ValidSignature);\n\n }\n\n if (measurementValue.errors && measurementValue.errors.length > 0)\n return setResult(chargyInterfaces.VerificationResult.ValidationError);\n\n return setResult(chargyInterfaces.VerificationResult.InvalidSignature);\n\n }\n catch\n {\n return setResult(chargyInterfaces.VerificationResult.InvalidSignature);\n }\n\n }\n catch\n {\n return setResult(chargyInterfaces.VerificationResult.InvalidPublicKey);\n }\n\n }\n\n else\n return setResult(chargyInterfaces.VerificationResult.PublicKeyNotFound);\n\n }\n\n else\n return setResult(chargyInterfaces.VerificationResult.EnergyMeterNotFound);\n\n }\n catch\n {\n return setResult(chargyInterfaces.VerificationResult.InvalidSignature);\n }\n\n }\n\n return {} as IBSMCrypt01Result;\n\n }\n\n async ViewMeasurement(measurementValue: IBSMMeasurementValue,\n errorDiv: HTMLDivElement,\n introDiv: HTMLDivElement,\n infoDiv: HTMLDivElement,\n PlainTextDiv: HTMLDivElement,\n HashedPlainTextDiv: HTMLDivElement,\n PublicKeyDiv: HTMLDivElement,\n SignatureExpectedDiv: HTMLDivElement,\n SignatureCheckDiv: HTMLDivElement) : Promise<Error | undefined>\n {\n\n if (measurementValue.measurement === undefined)\n return new Error(\"Invalid measurement!\");\n\n const result = measurementValue.result as IBSMCrypt01Result;\n\n //#region Headline / Introduction\n\n introDiv.innerHTML = this.chargy.GetLocalizedMessage(\"The following data of the charging session is relevant for metrological and legal metrological purposes and therefore part of the digital signature\").\n replace(\"{methodName}\", \"BSMCrypt01\").\n replace(\"{cryptoAlgorithm}\", this.description);\n\n //#endregion\n\n\n //#region Plain text\n\n if (PlainTextDiv.parentElement != undefined &&\n PlainTextDiv.parentElement.children[0] != undefined)\n {\n PlainTextDiv.parentElement.children[0].innerHTML = \"Plain text (\" + (measurementValue.result as IBSMCrypt01Result).ArraySize.toString() + \" Bytes, hex)\";\n }\n\n PlainTextDiv.style.fontFamily = \"\";\n PlainTextDiv.style.whiteSpace = \"\";\n PlainTextDiv.style.maxHeight = \"\";\n PlainTextDiv.style.overflowY = \"\";\n\n // https://github.com/chargeITmobility/bsm-python-private/blob/30abc7ba958c936fdb952ed1f121e45d0818419c/doc/examples/snapshots.md#verifying-a-snapshot-with-the-bsm-tool\n\n this.CreateLine(\"Snapshot-Typ\", this.ParseTyp(measurementValue.Typ), result.Typ || \"\", infoDiv, PlainTextDiv);\n //this.CreateLine(\"RCR\", (measurementValue.RCR * 10).toFixed(measurementValue.RCR_Precision) + \" \" + measurementValue.RCR_Prefix + \"Wh\", result.RCR || \"\", infoDiv, PlainTextDiv);\n //this.CreateLine(\"TotWhImp\", (measurementValue.TotWhImp * 10).toFixed(measurementValue.TotWhImp_Precision) + \" \" + measurementValue.TotWhImp_Prefix + \"Wh\", result.TotWhImp || \"\", infoDiv, PlainTextDiv);\n //this.CreateLine(\"W\", measurementValue.W. toFixed(measurementValue.W_Precision) + \" \" + measurementValue.W_Prefix + \"Watt\", result.W || \"\", infoDiv, PlainTextDiv);\n this.CreateLine(\"RCR\", (measurementValue.RCR * (10 ** measurementValue.RCR_SF )).toString() + \" \" + measurementValue.RCR_Unit, result.RCR || \"\", infoDiv, PlainTextDiv);\n this.CreateLine(\"TotWhImp\", (measurementValue.TotWhImp * (10 ** measurementValue.TotWhImp_SF)).toString() + \" \" + measurementValue.TotWhImp_Unit, result.TotWhImp || \"\", infoDiv, PlainTextDiv);\n this.CreateLine(\"W\", (measurementValue.W * (10 ** measurementValue.W_SF )).toString() + \" \" + measurementValue.W_Unit, result.W || \"\", infoDiv, PlainTextDiv);\n this.CreateLine(\"MA1\", measurementValue.MA1, result.MA1 || \"\", infoDiv, PlainTextDiv);\n this.CreateLine(\"RCnt\", measurementValue.RCnt, result.RCnt || \"\", infoDiv, PlainTextDiv);\n this.CreateLine(\"OS\", measurementValue.OS, result.OS || \"\", infoDiv, PlainTextDiv);\n this.CreateLine(\"Zeitstempel\", chargyLib.UTC2human(measurementValue.Epoch), result.Epoch || \"\", infoDiv, PlainTextDiv);\n this.CreateLine(\"TZO\", measurementValue.TZO.toString() + \" Minuten\", result.TZO || \"\", infoDiv, PlainTextDiv);\n this.CreateLine(\"EpochSetCnt\", measurementValue.EpochSetCnt, result.EpochSetCnt || \"\", infoDiv, PlainTextDiv);\n this.CreateLine(\"EpochSetOS\", measurementValue.EpochSetOS, result.EpochSetOS || \"\", infoDiv, PlainTextDiv);\n this.CreateLine(\"DI\", measurementValue.DI, result.DI || \"\", infoDiv, PlainTextDiv);\n this.CreateLine(\"DO\", measurementValue.DO, result.DO || \"\", infoDiv, PlainTextDiv);\n this.CreateLine(\"Meta1\", measurementValue.Meta1, result.Meta1 || \"\", infoDiv, PlainTextDiv);\n this.CreateLine(\"Meta2\", measurementValue.Meta2, result.Meta2 || \"\", infoDiv, PlainTextDiv);\n this.CreateLine(\"Meta3\", measurementValue.Meta3, result.Meta3 || \"\", infoDiv, PlainTextDiv);\n this.CreateLine(\"Evt\", this.ParseEvents(measurementValue.Evt).join(\"<br>\"), result.Evt || \"\", infoDiv, PlainTextDiv);\n\n //#endregion\n\n //#region Hashed plain text\n\n if (HashedPlainTextDiv.parentElement != undefined &&\n HashedPlainTextDiv.parentElement.children[0] != undefined)\n {\n HashedPlainTextDiv.parentElement.children[0].innerHTML = \"Hashed plain text (SHA256, hex)\";\n }\n\n HashedPlainTextDiv.innerHTML = result.sha256value?.match(/.{1,8}/g)?.join(\" \") ?? \"\";\n\n //#endregion\n\n //#region Public Key\n\n if (result.publicKey != null &&\n result.publicKey != \"\")\n {\n\n if (PublicKeyDiv.parentElement != undefined &&\n PublicKeyDiv.parentElement.children[0] != undefined)\n {\n PublicKeyDiv.parentElement.children[0].innerHTML = \"Public Key (\" +\n (result.publicKeyFormat\n ? result.publicKeyFormat + \", \"\n : \"\") +\n \"hex)\";\n }\n\n if (!chargyLib.IsNullOrEmpty(result.publicKey))\n PublicKeyDiv.innerHTML = result.publicKey.startsWith(\"04\") // Add some space after '04' to avoid confused customers\n ? \"<span class=\\\"leadingFour\\\">04</span> \"\n + (result.publicKey.substring(2).match(/.{1,8}/g)?.join(\" \") ?? \"-\")\n : result.publicKey. match(/.{1,8}/g)?.join(\" \") ?? \"-\";\n\n\n //#region Public key signatures\n\n if (PublicKeyDiv.parentElement != undefined &&\n PublicKeyDiv.parentElement.children[3] != undefined)\n {\n PublicKeyDiv.parentElement.children[3].innerHTML = \"\";\n }\n\n if (result.publicKeySignatures) {\n\n for (const signature of result.publicKeySignatures)\n {\n\n try\n {\n\n const signatureDiv = PublicKeyDiv.parentElement?.children[3]?.appendChild(document.createElement('div'));\n\n if (signatureDiv != null &&\n measurementValue.measurement.chargingSession != null &&\n measurementValue.measurement.chargingSession.EVSE != null &&\n measurementValue.measurement.chargingSession.EVSE.meters.length > 0 &&\n measurementValue.measurement.chargingSession.EVSE.meters[0] != null &&\n measurementValue.measurement.chargingSession.EVSE.meters[0].publicKeys != null &&\n measurementValue.measurement.chargingSession.EVSE.meters[0].publicKeys.length > 0)\n {\n\n signatureDiv.innerHTML = await this.chargy.CheckMeterPublicKeySignature(\n measurementValue.measurement.chargingSession.chargingStation,\n measurementValue.measurement.chargingSession.EVSE,\n measurementValue.measurement.chargingSession.EVSE.meters[0],\n measurementValue.measurement.chargingSession.EVSE.meters[0].publicKeys[0],\n signature\n );\n\n }\n\n }\n catch (exception)\n {\n return new Error(\"Error while checking public key signature: \" + (exception instanceof Error ? exception.message : String(exception)));\n }\n\n }\n\n }\n\n //#endregion\n\n }\n\n //#endregion\n\n //#region Signature expected\n\n if (result.signature != null)\n {\n\n if (SignatureExpectedDiv.parentElement != undefined &&\n SignatureExpectedDiv.parentElement.children[0] != undefined)\n {\n SignatureExpectedDiv.parentElement.children[0].innerHTML = \"Erwartete Signatur (\" + (result.signature.format || \"\") + \", hex)\";\n }\n\n if (result.signature.r && result.signature.s)\n SignatureExpectedDiv.innerHTML = \"r: \" + (result.signature.r.toLowerCase().match(/.{1,8}/g)?.join(\" \") ?? \"-\") + \"<br />\" +\n \"s: \" + (result.signature.s.toLowerCase().match(/.{1,8}/g)?.join(\" \") ?? \"-\");\n\n else if (result.signature.value)\n SignatureExpectedDiv.innerHTML = result.signature.value.toLowerCase().match(/.{1,8}/g)?.join(\" \") ?? \"-\";\n\n }\n\n //#endregion\n\n\n //#region Signature check\n\n switch (result.status)\n {\n\n case chargyInterfaces.VerificationResult.UnknownCTRFormat:\n SignatureCheckDiv.innerHTML = '<i class=\"fas fa-times-circle\"></i><div id=\"description\">Unbekanntes Transparenzdatenformat</div>';\n break;\n\n case chargyInterfaces.VerificationResult.EnergyMeterNotFound:\n SignatureCheckDiv.innerHTML = '<i class=\"fas fa-times-circle\"></i><div id=\"description\">Ungültiger Energiezähler</div>';\n break;\n\n case chargyInterfaces.VerificationResult.PublicKeyNotFound:\n SignatureCheckDiv.innerHTML = '<i class=\"fas fa-times-circle\"></i><div id=\"description\">Ungültiger Public Key</div>';\n break;\n\n case chargyInterfaces.VerificationResult.InvalidPublicKey:\n SignatureCheckDiv.innerHTML = '<i class=\"fas fa-times-circle\"></i><div id=\"description\">Ungültiger Public Key</div>';\n break;\n\n case chargyInterfaces.VerificationResult.InvalidSignature:\n SignatureCheckDiv.innerHTML = '<i class=\"fas fa-times-circle\"></i><div id=\"description\">Ungültige Signatur</div>';\n break;\n\n case chargyInterfaces.VerificationResult.ValidSignature:\n SignatureCheckDiv.innerHTML = '<i class=\"fas fa-check-circle\"></i><div id=\"description\">Gültige Signatur</div>';\n break;\n\n\n default:\n SignatureCheckDiv.innerHTML = '<i class=\"fas fa-times-circle\"></i><div id=\"description\">Ungültige Signatur</div>';\n break;\n\n }\n\n //#endregion\n\n }\n\n\n //#region Helper methods\n\n private PrefixConverter(input: string): chargyInterfaces.DisplayPrefixes {\n switch(input.toLowerCase()) {\n case \"kilo\": return chargyInterfaces.DisplayPrefixes.KILO;\n case \"mega\": return chargyInterfaces.DisplayPrefixes.MEGA;\n case \"giga\": return chargyInterfaces.DisplayPrefixes.GIGA;\n default: return chargyInterfaces.DisplayPrefixes.NULL;\n }\n }\n\n private UnitConverter(input: string): string{\n switch(input.toUpperCase()) {\n case \"WATT_HOUR\": return \"Wh\";\n case \"WATT\": return \"W\";\n default: return \"\";\n }\n }\n\n public ParseTyp(value: number) : string\n {\n switch (value)\n {\n case 0: return \"CURRENT\"; // Signed snapshot of the current meter data at the time of its creation.\n case 1: return \"TURN ON\"; // Signed snapshot created during executing the turn-on sequence for an external contactor.\n case 2: return \"TURN OFF\"; // Signed snapshot created during the execution of the turn-off sequence for an external contactor.\n case 3: return \"START\"; // Signed snapshot marking the start of a charging process without executing the turn-on sequence for an external contactor.\n case 4: return \"END\"; // Signed snapshot marking the end of a charging process without executing the turn-off sequence for an external contactor.\n default: return \"<unknown>\";\n }\n }\n\n public ParseEvents(value: number) : string[]\n {\n\n const events: string[] = [];\n\n if ((value & (1 << 1)) != 0) events.push(\"Power Failure\");\n if ((value & (1 << 2)) != 0) events.push(\"Under Voltage\");\n if ((value & (1 << 3)) != 0) events.push(\"Low PF\");\n if ((value & (1 << 4)) != 0) events.push(\"Over Current\");\n if ((value & (1 << 5)) != 0) events.push(\"Over Voltage\");\n if ((value & (1 << 6)) != 0) events.push(\"Missing Sensor\");\n\n if ((value & (1 << 7)) != 0) events.push(\"Reserved 1\");\n if ((value & (1 << 8)) != 0) events.push(\"Reserved 2\");\n if ((value & (1 << 9)) != 0) events.push(\"Reserved 3\");\n if ((value & (1 << 10)) != 0) events.push(\"Reserved 4\");\n if ((value & (1 << 11)) != 0) events.push(\"Reserved 5\");\n if ((value & (1 << 12)) != 0) events.push(\"Reserved 6\");\n if ((value & (1 << 13)) != 0) events.push(\"Reserved 7\");\n if ((value & (1 << 14)) != 0) events.push(\"Reserved 8\");\n\n if ((value & (1 << 15)) != 0) events.push(\"Meter Fatal Error\");\n if ((value & (1 << 16)) != 0) events.push(\"CM Init Failed\");\n if ((value & (1 << 17)) != 0) events.push(\"CM Firmware Hash Mismatch\");\n if ((value & (1 << 18)) != 0) events.push(\"CM Development Mode\");\n\n if ((value & (1 << 19)) != 0) events.push(\"OEM 05\");\n if ((value & (1 << 20)) != 0) events.push(\"OEM 06\");\n if ((value & (1 << 21)) != 0) events.push(\"OEM 07\");\n if ((value & (1 << 22)) != 0) events.push(\"OEM 08\");\n if ((value & (1 << 23)) != 0) events.push(\"OEM 09\");\n if ((value & (1 << 24)) != 0) events.push(\"OEM 10\");\n if ((value & (1 << 25)) != 0) events.push(\"OEM 11\");\n if ((value & (1 << 26)) != 0) events.push(\"OEM 12\");\n if ((value & (1 << 27)) != 0) events.push(\"OEM 13\");\n if ((value & (1 << 28)) != 0) events.push(\"OEM 14\");\n if ((value & (1 << 29)) != 0) events.push(\"OEM 15\");\n\n return events;\n\n }\n\n private DecodeStatus(statusValue: string) : Array<string>\n {\n\n const statusArray:string[] = [];\n\n try\n {\n\n const status = parseInt(statusValue);\n\n if ((status & 1) == 1)\n statusArray.push(\"Fehler erkannt\");\n\n if ((status & 2) == 2)\n statusArray.push(\"Synchrone Messwertübermittlung\");\n\n // Bit 3 is reserved!\n\n if ((status & 8) == 8)\n statusArray.push(\"System-Uhr ist synchron\");\n else\n statusArray.push(\"System-Uhr ist nicht synchron\");\n\n if ((status & 16) == 16)\n statusArray.push(\"Rücklaufsperre aktiv\");\n\n if ((status & 32) == 32)\n statusArray.push(\"Energierichtung -A\");\n\n if ((status & 64) == 64)\n statusArray.push(\"Magnetfeld erkannt\");\n\n }\n catch\n {\n statusArray.push(\"Invalid status!\");\n }\n\n return statusArray;\n\n }\n\n //#endregion\n\n}\n","/*\n * Copyright (c) 2018-2026 GraphDefined GmbH <achim.friedland@graphdefined.com>\n * This file is part of Chargy Desktop App <https://github.com/OpenChargingCloud/ChargyDesktopApp>\n *\n * Licensed under the Affero GPL license, Version 3.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.gnu.org/licenses/agpl.html\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport class CanonicalJSONError extends TypeError {\n\n public constructor(message: string) {\n super(message);\n this.name = \"CanonicalJSONError\";\n }\n\n}\n\n/**\n * Deterministic RFC 8259 JSON serialization for signature input.\n *\n * Objects are emitted with ordinally sorted property names, arrays keep their\n * original order, and no insignificant whitespace is written. This is meant\n * as a stable JSON byte representation; it is intentionally strict about\n * values which are not representable as RFC 8259 JSON.\n */\nexport function canonicalJSONStringify(value: unknown): string {\n return serializeJSONValue(value, \"$\", new WeakSet());\n}\n\nexport function canonicalJSONBytes(value: unknown): Uint8Array {\n return new TextEncoder().encode(canonicalJSONStringify(value));\n}\n\nfunction serializeJSONValue(value: unknown,\n path: string,\n seen: WeakSet<object>): string {\n\n switch (typeof value)\n {\n\n case \"string\":\n return JSON.stringify(value);\n\n case \"number\":\n if (!Number.isFinite(value))\n throw new CanonicalJSONError(`Non-finite number at ${path} is not valid JSON.`);\n\n return JSON.stringify(value);\n\n case \"boolean\":\n return value ? \"true\" : \"false\";\n\n case \"object\":\n if (value === null)\n return \"null\";\n\n return Array.isArray(value)\n ? serializeJSONArray(value, path, seen)\n : serializeJSONObject(value, path, seen);\n\n case \"bigint\":\n throw new CanonicalJSONError(`BigInt at ${path} is not valid JSON.`);\n\n case \"undefined\":\n throw new CanonicalJSONError(`Undefined value at ${path} is not valid JSON.`);\n\n case \"function\":\n throw new CanonicalJSONError(`Function at ${path} is not valid JSON.`);\n\n case \"symbol\":\n throw new CanonicalJSONError(`Symbol at ${path} is not valid JSON.`);\n\n }\n\n}\n\nfunction serializeJSONArray(value: unknown[],\n path: string,\n seen: WeakSet<object>): string {\n\n if (seen.has(value))\n throw new CanonicalJSONError(`Circular reference at ${path} is not valid JSON.`);\n\n seen.add(value);\n\n const indexedKeys = new Set<string>();\n\n for (let i = 0; i < value.length; i++)\n {\n if (!Object.prototype.hasOwnProperty.call(value, i))\n throw new CanonicalJSONError(`Sparse array slot at ${path}[${String(i)}] is not valid JSON.`);\n\n indexedKeys.add(String(i));\n }\n\n for (const key of Object.keys(value))\n {\n if (!indexedKeys.has(key))\n throw new CanonicalJSONError(`Non-index array property ${formatPathProperty(key)} at ${path} is not valid JSON.`);\n }\n\n rejectEnumerableSymbolProperties(value, path);\n\n const serializedItems = value.map((item, index) =>\n serializeJSONValue(item, `${path}[${String(index)}]`, seen)\n );\n\n seen.delete(value);\n\n return `[${serializedItems.join(\",\")}]`;\n\n}\n\nfunction serializeJSONObject(value: object,\n path: string,\n seen: WeakSet<object>): string {\n\n if (Object.prototype.toString.call(value) !== \"[object Object]\")\n throw new CanonicalJSONError(`Unsupported object at ${path} is not valid JSON.`);\n\n if (seen.has(value))\n throw new CanonicalJSONError(`Circular reference at ${path} is not valid JSON.`);\n\n seen.add(value);\n rejectEnumerableSymbolProperties(value, path);\n\n const serializedProperties = Object.keys(value)\n .sort(compareOrdinal)\n .map(key => {\n const serializedKey = JSON.stringify(key);\n const serializedValue = serializeJSONValue(\n (value as Record<string, unknown>)[key],\n `${path}${formatPathProperty(key)}`,\n seen\n );\n\n return `${serializedKey}:${serializedValue}`;\n });\n\n seen.delete(value);\n\n return `{${serializedProperties.join(\",\")}}`;\n\n}\n\nfunction rejectEnumerableSymbolProperties(value: object,\n path: string): void {\n\n for (const symbol of Object.getOwnPropertySymbols(value))\n {\n if (Object.prototype.propertyIsEnumerable.call(value, symbol))\n throw new CanonicalJSONError(`Symbol property at ${path} is not valid JSON.`);\n }\n\n}\n\nfunction compareOrdinal(left: string,\n right: string): number {\n\n return left < right ? -1 : left > right ? 1 : 0;\n\n}\n\nfunction formatPathProperty(propertyName: string): string {\n\n return /^[A-Za-z_$][A-Za-z0-9_$]*$/.test(propertyName)\n ? `.${propertyName}`\n : `[${JSON.stringify(propertyName)}]`;\n\n}\n","/*\n * Copyright (c) 2018-2026 GraphDefined GmbH <achim.friedland@graphdefined.com>\n * This file is part of Chargy Desktop App <https://github.com/OpenChargingCloud/ChargyDesktopApp>\n *\n * Licensed under the Affero GPL license, Version 3.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.gnu.org/licenses/agpl.html\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ec as EC } from \"elliptic\";\n\nimport {\n canonicalJSONBytes\n} from \"./CanonicalJSON\";\n\nexport type JSONMessage = Record<string, unknown>;\n\nexport interface JSONSignature {\n publicKey: string;\n publicKeyHEX: string;\n signature: string;\n signatureHEX: string;\n}\n\nexport interface SignedJSONMessage extends JSONMessage {\n signatures?: JSONSignature[];\n}\n\nexport enum JSONSignatureVerificationStatus {\n True = \"True\",\n False = \"False\",\n InvalidJSON = \"InvalidJSON\",\n MissingSignatures = \"MissingSignatures\",\n InvalidSignaturesArray = \"InvalidSignaturesArray\",\n InvalidSignatureStructure = \"InvalidSignatureStructure\",\n InvalidSignatureEncoding = \"InvalidSignatureEncoding\",\n InvalidPublicKey = \"InvalidPublicKey\",\n InvalidSignature = \"InvalidSignature\",\n InvalidCanonicalJSON = \"InvalidCanonicalJSON\"\n}\n\nexport interface JSONSignatureVerificationResult {\n status: JSONSignatureVerificationStatus;\n description?: string;\n}\n\nexport interface JSONMessageSignaturesVerificationResult {\n status: JSONSignatureVerificationStatus;\n description?: string;\n signatures: Record<string, JSONSignatureVerificationResult>;\n}\n\nexport interface SignJSONMessageOptions {\n curve?: string;\n canonical?: boolean;\n signatureFormat?: \"DER\";\n}\n\nconst defaultSignOptions: Required<SignJSONMessageOptions> = {\n curve: \"p256\",\n canonical: true,\n signatureFormat: \"DER\"\n};\n\nexport async function signMessage(JSONMessage: SignedJSONMessage,\n ...KeyPairs: EC.KeyPair[]): Promise<boolean> {\n\n return signJSONMessage(JSONMessage, KeyPairs);\n\n}\n\nexport async function SignMessage(JSONMessage: SignedJSONMessage,\n ...KeyPairs: EC.KeyPair[]): Promise<boolean> {\n\n return signJSONMessage(JSONMessage, KeyPairs);\n\n}\n\nexport async function signJSONMessage(JSONMessage: SignedJSONMessage | null | undefined,\n KeyPairs: Array<EC.KeyPair | null | undefined> | null | undefined,\n options?: SignJSONMessageOptions): Promise<boolean> {\n\n if (JSONMessage == null || KeyPairs == null || KeyPairs.length === 0)\n return false;\n\n if (JSONMessage.signatures != null && !Array.isArray(JSONMessage.signatures))\n return false;\n\n const resolvedOptions = {\n ...defaultSignOptions,\n ...options\n };\n\n const curve = new EC(resolvedOptions.curve);\n\n for (const KeyPair of KeyPairs)\n {\n\n if (KeyPair == null || !hasPrivateAndPublicKey(KeyPair))\n continue;\n\n const messageJSON = cloneMessageWithoutSignatures(JSONMessage);\n const plainText = canonicalJSONBytes(messageJSON);\n const sha256Hash = await sha256(plainText);\n\n JSONMessage.signatures ??= [];\n\n const publicKeyBytes = Uint8Array.from(KeyPair.getPublic(false, \"array\"));\n const signature = KeyPair.sign(sha256Hash, {\n canonical: resolvedOptions.canonical\n });\n const signatureBytes = Uint8Array.from(signature.toDER());\n\n const signatureJSON: JSONSignature = {\n publicKey: bytesToBase64(publicKeyBytes),\n publicKeyHEX: bytesToHex(publicKeyBytes),\n signature: bytesToBase64(signatureBytes),\n signatureHEX: bytesToHex(signatureBytes)\n };\n\n JSONMessage.signatures.push(signatureJSON);\n\n if (!curve.keyFromPublic(signatureJSON.publicKeyHEX, \"hex\").verify(sha256Hash, signature))\n return false;\n\n }\n\n return true;\n\n}\n\nexport async function verifyJSONSignature(JSONMessage: SignedJSONMessage,\n signature: JSONSignature,\n options?: SignJSONMessageOptions): Promise<boolean> {\n\n return isVerificationTrue(await verifyJSONSignatureResult(JSONMessage, signature, options));\n\n}\n\nexport async function verifyJSONSignatureResult(JSONMessage: SignedJSONMessage | null | undefined,\n signature: unknown,\n options?: SignJSONMessageOptions): Promise<JSONSignatureVerificationResult> {\n\n if (JSONMessage == null)\n return verificationResult(JSONSignatureVerificationStatus.InvalidJSON,\n \"JSON message is missing.\");\n\n if (!isJSONSignature(signature))\n return verificationResult(JSONSignatureVerificationStatus.InvalidSignatureStructure,\n \"Signature object must contain publicKey, publicKeyHEX, signature, and signatureHEX strings.\");\n\n if (!signatureEncodingsMatch(signature))\n return verificationResult(JSONSignatureVerificationStatus.InvalidSignatureEncoding,\n \"Base64 and hexadecimal encodings of the public key or signature do not match.\");\n\n const resolvedOptions = {\n ...defaultSignOptions,\n ...options\n };\n\n const curve = new EC(resolvedOptions.curve);\n\n let sha256Hash: Uint8Array;\n\n try\n {\n const messageJSON = cloneMessageWithoutSignatures(JSONMessage);\n const plainText = canonicalJSONBytes(messageJSON);\n sha256Hash = await sha256(plainText);\n }\n catch (exception)\n {\n return verificationResult(JSONSignatureVerificationStatus.InvalidCanonicalJSON,\n exception instanceof Error ? exception.message : \"JSON message can not be canonicalized.\");\n }\n\n let publicKey: EC.KeyPair;\n\n try\n {\n publicKey = curve.keyFromPublic(signature.publicKeyHEX, \"hex\");\n\n if (!publicKey.validate().result)\n return verificationResult(JSONSignatureVerificationStatus.InvalidPublicKey,\n publicKey.validate().reason || \"Public key is not valid on the selected curve.\");\n }\n catch (exception)\n {\n return verificationResult(JSONSignatureVerificationStatus.InvalidPublicKey,\n exception instanceof Error ? exception.message : \"Public key can not be decoded.\");\n }\n\n try\n {\n return curve.verify(sha256Hash,\n signature.signatureHEX,\n publicKey)\n ? verificationResult(JSONSignatureVerificationStatus.True)\n : verificationResult(JSONSignatureVerificationStatus.False,\n \"Signature does not match the canonical JSON message.\");\n }\n catch (exception)\n {\n return verificationResult(JSONSignatureVerificationStatus.InvalidSignature,\n exception instanceof Error ? exception.message : \"Signature can not be decoded.\");\n }\n\n}\n\nexport async function verifyJSONMessageSignatures(JSONMessage: unknown,\n options?: SignJSONMessageOptions): Promise<boolean> {\n\n return isVerificationTrue((await verifyJSONMessageSignatureResults(JSONMessage, options)).status);\n\n}\n\nexport async function verifyJSONMessageSignatureResults(JSONMessage: unknown,\n options?: SignJSONMessageOptions): Promise<JSONMessageSignaturesVerificationResult> {\n\n const parsedMessage = parseSignedJSONMessage(JSONMessage);\n\n if (parsedMessage.result != null)\n return {\n ...parsedMessage.result,\n signatures: {}\n };\n\n const signedMessage = parsedMessage.message;\n\n if (signedMessage == null)\n return {\n ...verificationResult(JSONSignatureVerificationStatus.InvalidJSON,\n \"JSON message could not be parsed.\"),\n signatures: {}\n };\n\n if (signedMessage.signatures == null || signedMessage.signatures.length === 0)\n return {\n ...verificationResult(JSONSignatureVerificationStatus.MissingSignatures,\n \"JSON message does not contain any signatures.\"),\n signatures: {}\n };\n\n const signatureResults: Record<string, JSONSignatureVerificationResult> = {};\n\n for (let index = 0; index < signedMessage.signatures.length; index++)\n {\n signatureResults[String(index)] = await verifyJSONSignatureResult(\n signedMessage,\n signedMessage.signatures[index],\n options\n );\n }\n\n const allSignaturesValid = Object.values(signatureResults).every(isVerificationTrue);\n\n return {\n ...verificationResult(\n allSignaturesValid\n ? JSONSignatureVerificationStatus.True\n : JSONSignatureVerificationStatus.False,\n allSignaturesValid\n ? undefined\n : \"At least one signature is invalid.\"\n ),\n signatures: signatureResults\n };\n\n}\n\nexport async function VerifyJSONMessageSignatures(JSONMessage: unknown,\n options?: SignJSONMessageOptions): Promise<boolean> {\n\n return verifyJSONMessageSignatures(JSONMessage, options);\n\n}\n\nexport async function parseAndVerifyJSONSignatures(JSONMessage: string,\n options?: SignJSONMessageOptions): Promise<boolean> {\n\n return verifyJSONMessageSignatures(JSONMessage, options);\n\n}\n\nfunction cloneMessageWithoutSignatures(JSONMessage: SignedJSONMessage): JSONMessage {\n\n const messageJSON = {\n ...JSONMessage\n };\n\n delete messageJSON.signatures;\n\n return messageJSON;\n\n}\n\nfunction parseSignedJSONMessage(JSONMessage: unknown): {\n message?: SignedJSONMessage;\n result?: JSONSignatureVerificationResult;\n} {\n\n let parsedMessage: unknown = JSONMessage;\n\n if (typeof JSONMessage === \"string\")\n {\n try\n {\n parsedMessage = JSON.parse(JSONMessage);\n }\n catch\n {\n return {\n result: verificationResult(JSONSignatureVerificationStatus.InvalidJSON,\n \"JSON text can not be parsed.\")\n };\n }\n }\n\n if (!isJSONRecord(parsedMessage))\n return {\n result: verificationResult(JSONSignatureVerificationStatus.InvalidJSON,\n \"JSON message must be an object.\")\n };\n\n if (parsedMessage[\"signatures\"] != null && !Array.isArray(parsedMessage[\"signatures\"]))\n return {\n result: verificationResult(JSONSignatureVerificationStatus.InvalidSignaturesArray,\n \"The signatures property must be an array when present.\")\n };\n\n return {\n message: parsedMessage\n };\n\n}\n\nfunction isJSONSignature(value: unknown): value is JSONSignature {\n\n return isJSONRecord(value) &&\n typeof value[\"publicKey\"] === \"string\" &&\n typeof value[\"publicKeyHEX\"] === \"string\" &&\n typeof value[\"signature\"] === \"string\" &&\n typeof value[\"signatureHEX\"] === \"string\";\n\n}\n\nfunction signatureEncodingsMatch(signature: JSONSignature): boolean {\n\n try\n {\n return bytesToHex(base64ToBytes(signature.publicKey)).toLowerCase() === signature.publicKeyHEX.toLowerCase() &&\n bytesToHex(base64ToBytes(signature.signature)).toLowerCase() === signature.signatureHEX.toLowerCase();\n }\n catch\n {\n return false;\n }\n\n}\n\nfunction hasPrivateAndPublicKey(KeyPair: EC.KeyPair): boolean {\n\n try\n {\n KeyPair.getPrivate(\"hex\");\n KeyPair.getPublic(false, \"hex\");\n return KeyPair.validate().result;\n }\n catch\n {\n return false;\n }\n\n}\n\nfunction verificationResult(status: JSONSignatureVerificationStatus,\n description?: string): JSONSignatureVerificationResult {\n\n return description == null\n ? { status }\n : { status, description };\n\n}\n\nfunction isVerificationTrue(result: JSONSignatureVerificationResult | JSONSignatureVerificationStatus): boolean {\n\n return (typeof result === \"string\" ? result : result.status) === JSONSignatureVerificationStatus.True;\n\n}\n\nfunction isJSONRecord(value: unknown): value is Record<string, unknown> {\n\n return value != null &&\n typeof value === \"object\" &&\n !Array.isArray(value);\n\n}\n\nasync function sha256(data: Uint8Array): Promise<Uint8Array> {\n\n const digest = await crypto.subtle.digest(\"SHA-256\", data as BufferSource);\n return new Uint8Array(digest);\n\n}\n\nfunction bytesToHex(bytes: Uint8Array): string {\n\n return Array.from(bytes, byte => byte.toString(16).padStart(2, \"0\")).join(\"\");\n\n}\n\nfunction base64ToBytes(value: string): Uint8Array {\n\n if (typeof Buffer !== \"undefined\")\n return Uint8Array.from(Buffer.from(value, \"base64\"));\n\n const binary = atob(value);\n const bytes = new Uint8Array(binary.length);\n\n for (let i = 0; i < binary.length; i++)\n bytes[i] = binary.charCodeAt(i);\n\n return bytes;\n\n}\n\nfunction bytesToBase64(bytes: Uint8Array): string {\n\n if (typeof Buffer !== \"undefined\")\n return Buffer.from(bytes).toString(\"base64\");\n\n let binary = \"\";\n for (const byte of bytes)\n binary += String.fromCharCode(byte);\n\n return btoa(binary);\n\n}\n","/*\r\n * Copyright (c) 2018-2026 GraphDefined GmbH <achim.friedland@graphdefined.com>\r\n * This file is part of Chargy Desktop App <https://github.com/OpenChargingCloud/ChargyDesktopApp>\r\n *\r\n * Licensed under the Affero GPL license, Version 3.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.gnu.org/licenses/agpl.html\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n\r\nimport { Chargy } from './chargy'\r\nimport { ACrypt } from './ACrypt'\r\nimport * as chargyInterfaces from './interfaces/chargyInterfaces'\r\nimport * as chargeTransparencyRecord from './interfaces/IChargeTransparencyRecord'\r\nimport * as chargyLib from './chargyLib'\r\n\r\n\r\nexport interface IEMHMeasurementValue extends chargeTransparencyRecord.IMeasurementValue\r\n{\r\n infoStatus: string,\r\n secondsIndex: number,\r\n paginationId: string,\r\n logBookIndex: string\r\n}\r\n\r\nexport interface IEMHCrypt01Result extends chargyInterfaces.ICryptoResult\r\n{\r\n sha256value?: string,\r\n meterId?: string,\r\n meter?: chargyInterfaces.IMeter,\r\n timestamp?: string,\r\n infoStatus?: string,\r\n secondsIndex?: string,\r\n paginationId?: string,\r\n obis?: string,\r\n unitEncoded?: string,\r\n scale?: string,\r\n value?: string,\r\n logBookIndex?: string,\r\n authorizationStart?: string,\r\n authorizationStop?: string,\r\n authorizationStartTimestamp?: string,\r\n publicKey?: string,\r\n publicKeyFormat?: string,\r\n publicKeySignatures?: Array<unknown>,\r\n signature?: chargyInterfaces.ISignatureRS\r\n}\r\n\r\n\r\nexport class EMHCrypt01 extends ACrypt {\r\n\r\n readonly curve = new this.chargy.elliptic.ec('p192');\r\n\r\n constructor(chargy: Chargy) {\r\n super(\"ECC secp192r1\",\r\n chargy);\r\n }\r\n\r\n\r\n async VerifyChargingSession(chargingSession: chargeTransparencyRecord.IChargingSession): Promise<chargyInterfaces.ISessionCryptoResult>\r\n {\r\n\r\n let sessionResult = chargyInterfaces.SessionVerificationResult.UnknownSessionFormat;\r\n\r\n {\r\n for (const measurement of chargingSession.measurements)\r\n {\r\n\r\n measurement.chargingSession = chargingSession;\r\n\r\n // Must include at least two measurements (start & stop)\r\n if (measurement.values.length > 1)\r\n {\r\n\r\n // Validate...\r\n for (const measurementValue of measurement.values)\r\n {\r\n measurementValue.measurement = measurement;\r\n await this.VerifyMeasurement(measurementValue as IEMHMeasurementValue);\r\n }\r\n\r\n\r\n // Find an overall result...\r\n sessionResult = chargyInterfaces.SessionVerificationResult.ValidSignature;\r\n\r\n for (const measurementValue of measurement.values)\r\n {\r\n if (sessionResult === chargyInterfaces.SessionVerificationResult.ValidSignature &&\r\n measurementValue.result?.status !== chargyInterfaces.VerificationResult.ValidSignature)\r\n {\r\n sessionResult = chargyInterfaces.SessionVerificationResult.InvalidSignature;\r\n }\r\n }\r\n\r\n }\r\n\r\n else\r\n sessionResult = chargyInterfaces.SessionVerificationResult.AtLeastTwoMeasurementsRequired;\r\n\r\n }\r\n }\r\n\r\n return {\r\n status: sessionResult,\r\n certainty: 1\r\n }\r\n\r\n }\r\n\r\n async VerifyMeasurement(measurementValue: IEMHMeasurementValue): Promise<IEMHCrypt01Result>\r\n {\r\n\r\n function setResult(verificationResult: chargyInterfaces.VerificationResult)\r\n {\r\n cryptoResult.status = verificationResult;\r\n measurementValue.result = cryptoResult;\r\n return cryptoResult;\r\n }\r\n\r\n if (measurementValue.measurement === undefined ||\r\n measurementValue.measurement.chargingSession === undefined)\r\n {\r\n return {\r\n status: chargyInterfaces.VerificationResult.InvalidMeasurement\r\n }\r\n }\r\n\r\n measurementValue.method = this;\r\n\r\n const buffer = new ArrayBuffer(320);\r\n const cryptoBuffer = new DataView(buffer);\r\n\r\n const cryptoResult:IEMHCrypt01Result = {\r\n status: chargyInterfaces.VerificationResult.InvalidSignature,\r\n meterId: chargyLib.SetHex (cryptoBuffer, measurementValue.measurement.energyMeterId, 0),\r\n timestamp: chargyLib.SetTimestamp32(cryptoBuffer, measurementValue.timestamp, 10),\r\n infoStatus: chargyLib.SetHex (cryptoBuffer, measurementValue.infoStatus, 14, false),\r\n secondsIndex: chargyLib.SetUInt32 (cryptoBuffer, measurementValue.secondsIndex, 15, true),\r\n paginationId: chargyLib.SetHex (cryptoBuffer, measurementValue.paginationId, 19, true),\r\n obis: chargyLib.SetHex (cryptoBuffer, chargyLib.OBIS2Hex(measurementValue.measurement.obis), 23, false),\r\n unitEncoded: chargyLib.SetInt8 (cryptoBuffer, measurementValue.measurement.unitEncoded ?? 0, 29),\r\n scale: chargyLib.SetInt8 (cryptoBuffer, measurementValue.measurement.scale, 30),\r\n value: chargyLib.SetUInt64D (cryptoBuffer, measurementValue.value, 31, true),\r\n logBookIndex: chargyLib.SetHex (cryptoBuffer, measurementValue.logBookIndex, 39, false),\r\n authorizationStart: chargyLib.SetText (cryptoBuffer, measurementValue.measurement.chargingSession.authorizationStart[\"@id\"], 41),\r\n authorizationStartTimestamp: chargyLib.SetTimestamp32(cryptoBuffer, measurementValue.measurement.chargingSession.authorizationStart.timestamp, 169)\r\n };\r\n\r\n const firstSignature = measurementValue.signatures?.[0];\r\n if (firstSignature != null)\r\n {\r\n\r\n const signatureExpected = firstSignature as chargyInterfaces.ISignatureRS;\r\n\r\n try\r\n {\r\n\r\n cryptoResult.signature = {\r\n algorithm: measurementValue.measurement.signatureInfos?.algorithm,\r\n format: measurementValue.measurement.signatureInfos?.format,\r\n r: signatureExpected.r,\r\n s: signatureExpected.s\r\n };\r\n\r\n // Only the first 24 bytes/192 bits are used!\r\n cryptoResult.sha256value = (await chargyLib.sha256(cryptoBuffer)).substring(0, 48);\r\n\r\n\r\n const meter = this.chargy.GetMeter(measurementValue.measurement.energyMeterId);\r\n if (meter != null)\r\n {\r\n\r\n cryptoResult.meter = meter;\r\n\r\n if (meter.publicKeys != null && meter.publicKeys.length > 0)\r\n {\r\n\r\n try\r\n {\r\n\r\n cryptoResult.publicKey = meter.publicKeys[0]?.value?.toLowerCase();\r\n cryptoResult.publicKeyFormat = meter.publicKeys[0]?.format;\r\n cryptoResult.publicKeySignatures = meter.publicKeys[0]?.signatures;\r\n\r\n try\r\n {\r\n\r\n if (this.curve.keyFromPublic(cryptoResult.publicKey ?? \"\", 'hex').\r\n verify (cryptoResult.sha256value,\r\n cryptoResult.signature))\r\n {\r\n return setResult(chargyInterfaces.VerificationResult.ValidSignature);\r\n }\r\n\r\n return setResult(chargyInterfaces.VerificationResult.InvalidSignature);\r\n\r\n }\r\n catch\r\n {\r\n return setResult(chargyInterfaces.VerificationResult.InvalidSignature);\r\n }\r\n\r\n }\r\n catch\r\n {\r\n return setResult(chargyInterfaces.VerificationResult.InvalidPublicKey);\r\n }\r\n\r\n }\r\n\r\n else\r\n return setResult(chargyInterfaces.VerificationResult.PublicKeyNotFound);\r\n\r\n }\r\n\r\n else\r\n return setResult(chargyInterfaces.VerificationResult.EnergyMeterNotFound);\r\n\r\n }\r\n catch\r\n {\r\n return setResult(chargyInterfaces.VerificationResult.InvalidSignature);\r\n }\r\n\r\n }\r\n\r\n return {} as IEMHCrypt01Result;\r\n\r\n }\r\n\r\n async ViewMeasurement(measurementValue: IEMHMeasurementValue,\r\n errorDiv: HTMLDivElement,\r\n introDiv: HTMLDivElement,\r\n infoDiv: HTMLDivElement,\r\n PlainTextDiv: HTMLDivElement,\r\n HashedPlainTextDiv: HTMLDivElement,\r\n PublicKeyDiv: HTMLDivElement,\r\n SignatureExpectedDiv: HTMLDivElement,\r\n SignatureCheckDiv: HTMLDivElement) : Promise<Error | undefined>\r\n {\r\n\r\n if (measurementValue.measurement === undefined ||\r\n measurementValue.measurement.chargingSession === undefined ||\r\n measurementValue.measurement.chargingSession.authorizationStart.timestamp === undefined)\r\n {\r\n return new Error(\"Invalid measurement!\");\r\n }\r\n\r\n const result = measurementValue.result as IEMHCrypt01Result;\r\n\r\n //#region Headline / Introduction\r\n\r\n introDiv.innerHTML = this.chargy.GetLocalizedMessage(\"The following data of the charging session is relevant for metrological and legal metrological purposes and therefore part of the digital signature\").\r\n replace(\"{methodName}\", \"EMHCrypt01\").\r\n replace(\"{cryptoAlgorithm}\", this.description);\r\n\r\n //#endregion\r\n\r\n\r\n //#region Plain text\r\n\r\n {\r\n\r\n if (PlainTextDiv.parentElement != undefined &&\r\n PlainTextDiv.parentElement.children[0] != undefined)\r\n {\r\n PlainTextDiv.parentElement.children[0].innerHTML = \"Plain text (320 Bytes, hex)\";\r\n }\r\n\r\n PlainTextDiv.style.fontFamily = \"\";\r\n PlainTextDiv.style.whiteSpace = \"\";\r\n PlainTextDiv.style.maxHeight = \"\";\r\n PlainTextDiv.style.overflowY = \"\";\r\n\r\n this.CreateLine(\"Zählernummer\", measurementValue.measurement.energyMeterId, result.meterId || \"\", infoDiv, PlainTextDiv);\r\n this.CreateLine(\"Zeitstempel\", chargyLib.UTC2human(measurementValue.timestamp), result.timestamp || \"\", infoDiv, PlainTextDiv);\r\n this.CreateLine(\"Status\", chargyLib.hex2bin(measurementValue.infoStatus) + \" (\" + measurementValue.infoStatus + \" hex)<br /><span class=\\\"statusInfos\\\">\" +\r\n this.DecodeStatus(measurementValue.infoStatus).join(\"<br />\") + \"</span>\", result.infoStatus || \"\", infoDiv, PlainTextDiv);\r\n this.CreateLine(\"Sekundenindex\", measurementValue.secondsIndex, result.secondsIndex || \"\", infoDiv, PlainTextDiv);\r\n this.CreateLine(\"Paginierungszähler\", parseInt(measurementValue.paginationId, 16), result.paginationId || \"\", infoDiv, PlainTextDiv);\r\n this.CreateLine(\"OBIS-Kennzahl\", measurementValue.measurement.obis, result.obis || \"\", infoDiv, PlainTextDiv);\r\n this.CreateLine(\"Einheit (codiert)\", measurementValue.measurement.unitEncoded ?? 0, result.unitEncoded || \"\", infoDiv, PlainTextDiv);\r\n this.CreateLine(\"Skalierung\", measurementValue.measurement.scale, result.scale || \"\", infoDiv, PlainTextDiv);\r\n this.CreateLine(\"Messwert\", measurementValue.value.toString() + \" Wh\", result.value || \"\", infoDiv, PlainTextDiv);\r\n this.CreateLine(\"Logbuchindex\", measurementValue.logBookIndex + \" hex\", result.logBookIndex || \"\", infoDiv, PlainTextDiv);\r\n this.CreateLine(\"Autorisierung\", measurementValue.measurement.chargingSession.authorizationStart[\"@id\"] + \" hex\", chargyLib.pad(result.authorizationStart, 128) || \"\", infoDiv, PlainTextDiv);\r\n this.CreateLine(\"Autorisierungszeitpunkt\", chargyLib.UTC2human(measurementValue.measurement.chargingSession.authorizationStart.timestamp), chargyLib.pad(result.authorizationStartTimestamp, 151) || \"\", infoDiv, PlainTextDiv);\r\n\r\n }\r\n\r\n //#endregion\r\n\r\n //#region Hashed plain text\r\n\r\n {\r\n\r\n if (HashedPlainTextDiv.parentElement != undefined &&\r\n HashedPlainTextDiv.parentElement.children[0] != undefined)\r\n {\r\n HashedPlainTextDiv.parentElement.children[0].innerHTML = \"Hashed plain text (SHA256, 24 bytes, hex)\";\r\n }\r\n\r\n HashedPlainTextDiv.innerHTML = result.sha256value?.match(/.{1,8}/g)?.join(\" \") ?? \"\";\r\n\r\n }\r\n\r\n //#endregion\r\n\r\n //#region Public Key\r\n\r\n if (result.publicKey != null &&\r\n result.publicKey != \"\")\r\n {\r\n\r\n if (PublicKeyDiv.parentElement != undefined &&\r\n PublicKeyDiv.parentElement.children[0] != undefined)\r\n {\r\n PublicKeyDiv.parentElement.children[0].innerHTML = \"Public Key (\" +\r\n (result.publicKeyFormat\r\n ? result.publicKeyFormat + \", \"\r\n : \"\") +\r\n \"hex)\";\r\n }\r\n\r\n if (!chargyLib.IsNullOrEmpty(result.publicKey))\r\n PublicKeyDiv.innerHTML = result.publicKey.startsWith(\"04\") // Add some space after '04' to avoid confused customers\r\n ? \"<span class=\\\"leadingFour\\\">04</span> \"\r\n + (result.publicKey.substring(2).match(/.{1,8}/g)?.join(\" \") ?? \"\")\r\n : (result.publicKey.match(/.{1,8}/g)?.join(\" \") ?? \"\");\r\n\r\n\r\n //#region Public key signatures\r\n\r\n if (PublicKeyDiv.parentElement != undefined &&\r\n PublicKeyDiv.parentElement.children[3] != undefined)\r\n {\r\n PublicKeyDiv.parentElement.children[3].innerHTML = \"\";\r\n }\r\n\r\n if (result.publicKeySignatures) {\r\n\r\n for (const signature of result.publicKeySignatures)\r\n {\r\n\r\n try\r\n {\r\n\r\n const signatureDiv = PublicKeyDiv.parentElement?.children[3]?.appendChild(document.createElement('div'));\r\n\r\n if (signatureDiv)\r\n {\r\n\r\n signatureDiv.classList.add(\"signature\");\r\n\r\n signatureDiv.innerHTML = await this.chargy.CheckMeterPublicKeySignature(\r\n measurementValue.measurement.chargingSession.chargingStation,\r\n measurementValue.measurement.chargingSession.EVSE,\r\n measurementValue.measurement.chargingSession.EVSE?.meters[0],\r\n measurementValue.measurement.chargingSession.EVSE?.meters[0]?.publicKeys?.[0],\r\n signature\r\n );\r\n\r\n signatureDiv.onclick = () => {\r\n this.chargy.showPKIDetails({});\r\n }\r\n\r\n }\r\n\r\n }\r\n catch (exception)\r\n {\r\n console.error(\"Error while checking public key signature: \" + (exception instanceof Error ? exception.message : String(exception)));\r\n }\r\n\r\n }\r\n\r\n }\r\n\r\n //#endregion\r\n\r\n }\r\n\r\n //#endregion\r\n\r\n //#region Signature expected\r\n\r\n if (result.signature != null)\r\n {\r\n\r\n if (SignatureExpectedDiv.parentElement != undefined &&\r\n SignatureExpectedDiv.parentElement.children[0] != undefined)\r\n {\r\n SignatureExpectedDiv.parentElement.children[0].innerHTML = \"Erwartete Signatur (\" + (result.signature.format || \"\") + \", hex)\";\r\n }\r\n\r\n if (result.signature.r && result.signature.s)\r\n SignatureExpectedDiv.innerHTML = \"r: \" + (result.signature.r.toLowerCase().match(/.{1,8}/g)?.join(\" \") ?? \"\") + \"<br />\" +\r\n \"s: \" + (result.signature.s.toLowerCase().match(/.{1,8}/g)?.join(\" \") ?? \"\");\r\n\r\n else if (result.signature.value)\r\n SignatureExpectedDiv.innerHTML = result.signature.value.toLowerCase().match(/.{1,8}/g)?.join(\" \") ?? \"-\";\r\n\r\n }\r\n\r\n //#endregion\r\n\r\n\r\n //#region Signature check\r\n\r\n {\r\n switch (result.status)\r\n {\r\n\r\n case chargyInterfaces.VerificationResult.UnknownCTRFormat:\r\n SignatureCheckDiv.innerHTML = '<i class=\"fas fa-times-circle\"></i><div id=\"description\">Unbekanntes Transparenzdatenformat</div>';\r\n break;\r\n\r\n case chargyInterfaces.VerificationResult.EnergyMeterNotFound:\r\n SignatureCheckDiv.innerHTML = '<i class=\"fas fa-times-circle\"></i><div id=\"description\">Ungültiger Energiezähler</div>';\r\n break;\r\n\r\n case chargyInterfaces.VerificationResult.PublicKeyNotFound:\r\n SignatureCheckDiv.innerHTML = '<i class=\"fas fa-times-circle\"></i><div id=\"description\">Ungültiger Public Key</div>';\r\n break;\r\n\r\n case chargyInterfaces.VerificationResult.InvalidPublicKey:\r\n SignatureCheckDiv.innerHTML = '<i class=\"fas fa-times-circle\"></i><div id=\"description\">Ungültiger Public Key</div>';\r\n break;\r\n\r\n case chargyInterfaces.VerificationResult.InvalidSignature:\r\n SignatureCheckDiv.innerHTML = '<i class=\"fas fa-times-circle\"></i><div id=\"description\">Ungültige Signatur</div>';\r\n break;\r\n\r\n case chargyInterfaces.VerificationResult.ValidSignature:\r\n SignatureCheckDiv.innerHTML = '<i class=\"fas fa-check-circle\"></i><div id=\"description\">Gültige Signatur</div>';\r\n break;\r\n\r\n\r\n default:\r\n SignatureCheckDiv.innerHTML = '<i class=\"fas fa-times-circle\"></i><div id=\"description\">Ungültige Signatur</div>';\r\n break;\r\n\r\n }\r\n }\r\n\r\n //#endregion\r\n\r\n }\r\n\r\n\r\n //#region Helper methods\r\n\r\n private DecodeStatus(statusValue: string) : Array<string>\r\n {\r\n\r\n const statusArray:string[] = [];\r\n\r\n try\r\n {\r\n\r\n const status = parseInt(statusValue);\r\n\r\n if ((status & 1) == 1)\r\n statusArray.push(\"Fehler erkannt\");\r\n\r\n if ((status & 2) == 2)\r\n statusArray.push(\"Synchrone Messwertübermittlung\");\r\n\r\n // Bit 3 is reserved!\r\n\r\n if ((status & 8) == 8)\r\n statusArray.push(\"System-Uhr ist synchron\");\r\n else\r\n statusArray.push(\"System-Uhr ist nicht synchron\");\r\n\r\n if ((status & 16) == 16)\r\n statusArray.push(\"Rücklaufsperre aktiv\");\r\n\r\n if ((status & 32) == 32)\r\n statusArray.push(\"Energierichtung -A\");\r\n\r\n if ((status & 64) == 64)\r\n statusArray.push(\"Magnetfeld erkannt\");\r\n\r\n }\r\n catch\r\n {\r\n statusArray.push(\"Invalid status!\");\r\n }\r\n\r\n return statusArray;\r\n\r\n }\r\n\r\n //#endregion\r\n\r\n}\r\n","/*\r\n * Copyright (c) 2018-2026 GraphDefined GmbH <achim.friedland@graphdefined.com>\r\n * This file is part of Chargy Desktop App <https://github.com/OpenChargingCloud/ChargyDesktopApp>\r\n *\r\n * Licensed under the Affero GPL license, Version 3.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.gnu.org/licenses/agpl.html\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n\r\nimport { Chargy } from './chargy'\r\nimport { ACrypt } from './ACrypt'\r\nimport * as chargyInterfaces from './interfaces/chargyInterfaces'\r\nimport * as chargeTransparencyRecord from './interfaces/IChargeTransparencyRecord'\r\nimport * as chargyLib from './chargyLib'\r\n\r\n\r\nexport interface IGDFMeasurementValue extends chargeTransparencyRecord.IMeasurementValue\r\n{\r\n prevSignature: string,\r\n}\r\n\r\nexport interface IGDFCrypt01Result extends chargyInterfaces.ICryptoResult\r\n{\r\n sha256value?: string,\r\n meterId?: string,\r\n meter?: chargyInterfaces.IMeter,\r\n timestamp?: string,\r\n obis?: string,\r\n unitEncoded?: string,\r\n scale?: string,\r\n value?: string,\r\n authorizationStart?: string,\r\n authorizationStartTimestamp?: string,\r\n publicKey?: string,\r\n publicKeyFormat?: string,\r\n publicKeySignatures?: Array<unknown>,\r\n signature?: chargyInterfaces.ISignatureRS\r\n}\r\n\r\nexport class GDFCrypt01 extends ACrypt {\r\n\r\n readonly curve = new this.chargy.elliptic.ec('p256');\r\n\r\n constructor(chargy: Chargy) {\r\n super(\"ECC secp256r1\",\r\n chargy);\r\n }\r\n\r\n async VerifyChargingSession(chargingSession: chargeTransparencyRecord.IChargingSession): Promise<chargyInterfaces.ISessionCryptoResult>\r\n {\r\n\r\n let sessionResult = chargyInterfaces.SessionVerificationResult.UnknownSessionFormat;\r\n\r\n {\r\n for (const measurement of chargingSession.measurements)\r\n {\r\n\r\n measurement.chargingSession = chargingSession;\r\n\r\n // Must include at least two measurements (start & stop)\r\n if (measurement.values.length > 1)\r\n {\r\n\r\n // Validate...\r\n for (const measurementValue of measurement.values)\r\n {\r\n measurementValue.measurement = measurement;\r\n await this.VerifyMeasurement(measurementValue as IGDFMeasurementValue);\r\n }\r\n\r\n\r\n // Find an overall result...\r\n sessionResult = chargyInterfaces.SessionVerificationResult.ValidSignature;\r\n\r\n for (const measurementValue of measurement.values)\r\n {\r\n if (sessionResult === chargyInterfaces.SessionVerificationResult.ValidSignature &&\r\n measurementValue.result?.status !== chargyInterfaces.VerificationResult.ValidSignature)\r\n {\r\n sessionResult = chargyInterfaces.SessionVerificationResult.InvalidSignature;\r\n }\r\n }\r\n\r\n }\r\n\r\n else\r\n sessionResult = chargyInterfaces.SessionVerificationResult.AtLeastTwoMeasurementsRequired;\r\n\r\n }\r\n }\r\n\r\n return {\r\n status: sessionResult,\r\n certainty: .5\r\n } ;\r\n\r\n }\r\n\r\n async VerifyMeasurement(measurementValue: IGDFMeasurementValue): Promise<IGDFCrypt01Result>\r\n {\r\n\r\n function setResult(vr: chargyInterfaces.VerificationResult)\r\n {\r\n cryptoResult.status = vr;\r\n measurementValue.result = cryptoResult;\r\n return cryptoResult;\r\n }\r\n\r\n if (measurementValue.measurement === undefined ||\r\n measurementValue.measurement.chargingSession === undefined)\r\n {\r\n return {\r\n status: chargyInterfaces.VerificationResult.InvalidMeasurement\r\n }\r\n }\r\n\r\n measurementValue.method = this;\r\n\r\n const buffer = new ArrayBuffer(320);\r\n const cryptoBuffer = new DataView(buffer);\r\n\r\n const cryptoResult:IGDFCrypt01Result = {\r\n status: chargyInterfaces.VerificationResult.InvalidSignature,\r\n meterId: chargyLib.SetText (cryptoBuffer, measurementValue.measurement.energyMeterId, 0),\r\n timestamp: chargyLib.SetTimestamp(cryptoBuffer, measurementValue.timestamp, 10),\r\n obis: chargyLib.SetHex (cryptoBuffer, measurementValue.measurement.obis, 23, false),\r\n unitEncoded: chargyLib.SetInt8 (cryptoBuffer, measurementValue.measurement.unitEncoded ?? 0, 29),\r\n scale: chargyLib.SetInt8 (cryptoBuffer, measurementValue.measurement.scale, 30),\r\n value: chargyLib.SetUInt64D (cryptoBuffer, measurementValue.value, 31, true),\r\n authorizationStart: chargyLib.SetHex (cryptoBuffer, measurementValue.measurement.chargingSession.authorizationStart[\"@id\"], 41),\r\n authorizationStartTimestamp: chargyLib.SetTimestamp(cryptoBuffer, measurementValue.measurement.chargingSession.authorizationStart.timestamp, 169)\r\n };\r\n\r\n const firstSignature = measurementValue.signatures?.[0];\r\n if (firstSignature != null)\r\n {\r\n\r\n const signatureExpected = firstSignature as chargyInterfaces.ISignatureRS;\r\n\r\n try\r\n {\r\n\r\n cryptoResult.signature = {\r\n algorithm: measurementValue.measurement.signatureInfos?.algorithm,\r\n format: measurementValue.measurement.signatureInfos?.format,\r\n r: signatureExpected.r,\r\n s: signatureExpected.s\r\n };\r\n\r\n cryptoResult.sha256value = await chargyLib.sha256(cryptoBuffer);\r\n\r\n\r\n const meter = this.chargy.GetMeter(measurementValue.measurement.energyMeterId);\r\n if (meter != null)\r\n {\r\n\r\n cryptoResult.meter = meter;\r\n\r\n if (meter.publicKeys != null && meter.publicKeys.length > 0)\r\n {\r\n\r\n try\r\n {\r\n\r\n cryptoResult.publicKey = meter.publicKeys[0]?.value?.toLowerCase();\r\n cryptoResult.publicKeyFormat = meter.publicKeys[0]?.format;\r\n cryptoResult.publicKeySignatures = meter.publicKeys[0]?.signatures;\r\n\r\n try\r\n {\r\n\r\n if (this.curve.keyFromPublic(cryptoResult.publicKey ?? \"\", 'hex').\r\n verify (cryptoResult.sha256value,\r\n cryptoResult.signature))\r\n {\r\n return setResult(chargyInterfaces.VerificationResult.ValidSignature);\r\n }\r\n\r\n return setResult(chargyInterfaces.VerificationResult.InvalidSignature);\r\n\r\n }\r\n catch\r\n {\r\n return setResult(chargyInterfaces.VerificationResult.InvalidSignature);\r\n }\r\n\r\n }\r\n catch\r\n {\r\n return setResult(chargyInterfaces.VerificationResult.InvalidPublicKey);\r\n }\r\n\r\n }\r\n\r\n else\r\n return setResult(chargyInterfaces.VerificationResult.PublicKeyNotFound);\r\n\r\n }\r\n\r\n else\r\n return setResult(chargyInterfaces.VerificationResult.EnergyMeterNotFound);\r\n\r\n }\r\n catch\r\n {\r\n return setResult(chargyInterfaces.VerificationResult.InvalidSignature);\r\n }\r\n\r\n }\r\n\r\n return {} as IGDFCrypt01Result;\r\n\r\n }\r\n\r\n async ViewMeasurement(measurementValue: IGDFMeasurementValue,\r\n errorDiv: HTMLDivElement,\r\n introDiv: HTMLDivElement,\r\n infoDiv: HTMLDivElement,\r\n PlainTextDiv: HTMLDivElement,\r\n HashedPlainTextDiv: HTMLDivElement,\r\n PublicKeyDiv: HTMLDivElement,\r\n SignatureExpectedDiv: HTMLDivElement,\r\n SignatureCheckDiv: HTMLDivElement) : Promise<Error | undefined>\r\n {\r\n\r\n if (measurementValue.measurement === undefined ||\r\n measurementValue.measurement.chargingSession === undefined ||\r\n measurementValue.measurement.chargingSession.authorizationStart.timestamp === undefined)\r\n {\r\n return new Error(\"Invalid measurement!\");\r\n }\r\n\r\n const result = measurementValue.result as IGDFCrypt01Result;\r\n\r\n //#region Headline / Introduction\r\n\r\n introDiv.innerHTML = this.chargy.GetLocalizedMessage(\"The following data of the charging session is relevant for metrological and legal metrological purposes and therefore part of the digital signature\").\r\n replace(\"{methodName}\", \"GDFCrypt01\").\r\n replace(\"{cryptoAlgorithm}\", this.description);\r\n\r\n //#endregion\r\n\r\n\r\n //#region Plain text\r\n\r\n {\r\n\r\n if (PlainTextDiv.parentElement != undefined &&\r\n PlainTextDiv.parentElement.children[0] != undefined)\r\n {\r\n PlainTextDiv.parentElement.children[0].innerHTML = \"Plain text (320 Bytes, hex)\";\r\n }\r\n\r\n PlainTextDiv.style.fontFamily = \"\";\r\n PlainTextDiv.style.whiteSpace = \"\";\r\n PlainTextDiv.style.maxHeight = \"\";\r\n PlainTextDiv.style.overflowY = \"\";\r\n\r\n this.CreateLine(\"Zählernummer\", measurementValue.measurement.energyMeterId, result.meterId || \"\", infoDiv, PlainTextDiv);\r\n this.CreateLine(\"Zeitstempel\", chargyLib.UTC2human(measurementValue.timestamp), result.timestamp || \"\", infoDiv, PlainTextDiv);\r\n //this.CreateLine(\"Status\", chargyLib.hex2bin(measurementValue.infoStatus) + \" (\" + measurementValue.infoStatus + \" hex)<br /><span class=\\\"statusInfos\\\">\" +\r\n // this.DecodeStatus(measurementValue.infoStatus).join(\"<br />\") + \"</span>\", result.infoStatus || \"\", infoDiv, PlainTextDiv);\r\n //this.CreateLine(\"Sekundenindex\", measurementValue.secondsIndex, result.secondsIndex || \"\", infoDiv, PlainTextDiv);\r\n //this.CreateLine(\"Paginierungszähler\", parseInt(measurementValue.paginationId, 16), result.paginationId || \"\", infoDiv, PlainTextDiv);\r\n this.CreateLine(\"OBIS-Kennzahl\", measurementValue.measurement.obis, result.obis || \"\", infoDiv, PlainTextDiv);\r\n this.CreateLine(\"Einheit (codiert)\", measurementValue.measurement.unitEncoded ?? 0, result.unitEncoded || \"\", infoDiv, PlainTextDiv);\r\n this.CreateLine(\"Skalierung\", measurementValue.measurement.scale, result.scale || \"\", infoDiv, PlainTextDiv);\r\n this.CreateLine(\"Messwert\", measurementValue.value.toString() + \" Wh\", result.value || \"\", infoDiv, PlainTextDiv);\r\n //this.CreateLine(\"Logbuchindex\", measurementValue.logBookIndex + \" hex\", result.logBookIndex || \"\", infoDiv, PlainTextDiv);\r\n this.CreateLine(\"Autorisierung\", measurementValue.measurement.chargingSession.authorizationStart[\"@id\"] + \" hex\", chargyLib.pad(result.authorizationStart, 128) || \"\", infoDiv, PlainTextDiv);\r\n this.CreateLine(\"Autorisierungszeitpunkt\", chargyLib.UTC2human(measurementValue.measurement.chargingSession.authorizationStart.timestamp), chargyLib.pad(result.authorizationStartTimestamp, 151) || \"\", infoDiv, PlainTextDiv);\r\n\r\n }\r\n\r\n //#endregion\r\n\r\n //#region Hashed plain text\r\n\r\n {\r\n\r\n if (HashedPlainTextDiv.parentElement != undefined &&\r\n HashedPlainTextDiv.parentElement.children[0] != undefined)\r\n {\r\n HashedPlainTextDiv.parentElement.children[0].innerHTML = \"Hashed plain text (SHA256, 24 bytes, hex)\";\r\n }\r\n\r\n HashedPlainTextDiv.innerHTML = result.sha256value?.match(/.{1,8}/g)?.join(\" \") ?? \"\";\r\n\r\n }\r\n\r\n //#endregion\r\n\r\n //#region Public Key\r\n\r\n if (result.publicKey != null &&\r\n result.publicKey != \"\")\r\n {\r\n\r\n if (PublicKeyDiv.parentElement != undefined &&\r\n PublicKeyDiv.parentElement.children[0] != undefined)\r\n {\r\n PublicKeyDiv.parentElement.children[0].innerHTML = \"Public Key (\" +\r\n (result.publicKeyFormat\r\n ? result.publicKeyFormat + \", \"\r\n : \"\") +\r\n \"hex)\";\r\n }\r\n\r\n if (!chargyLib.IsNullOrEmpty(result.publicKey))\r\n PublicKeyDiv.innerHTML = result.publicKey.startsWith(\"04\") // Add some space after '04' to avoid confused customers\r\n ? \"<span class=\\\"leadingFour\\\">04</span> \"\r\n + (result.publicKey.substring(2).match(/.{1,8}/g)?.join(\" \") ?? \"\")\r\n : (result.publicKey.match(/.{1,8}/g)?.join(\" \") ?? \"\");\r\n\r\n\r\n //#region Public key signatures\r\n\r\n if (PublicKeyDiv.parentElement != undefined &&\r\n PublicKeyDiv.parentElement.children[3] != undefined)\r\n {\r\n PublicKeyDiv.parentElement.children[3].innerHTML = \"\";\r\n }\r\n\r\n if (result.publicKeySignatures) {\r\n\r\n for (const signature of result.publicKeySignatures)\r\n {\r\n\r\n try\r\n {\r\n\r\n const signatureDiv = PublicKeyDiv.parentElement?.children[3]?.appendChild(document.createElement('div'));\r\n\r\n if (signatureDiv != null)\r\n signatureDiv.innerHTML = await this.chargy.CheckMeterPublicKeySignature(measurementValue.measurement.chargingSession.chargingStation,\r\n measurementValue.measurement.chargingSession.EVSE,\r\n measurementValue.measurement.chargingSession.EVSE?.meters[0],\r\n measurementValue.measurement.chargingSession.EVSE?.meters[0]?.publicKeys?.[0],\r\n signature);\r\n\r\n }\r\n catch (exception)\r\n {\r\n console.error(\"Error while checking public key signature: \" + (exception instanceof Error ? exception.message : String(exception)));\r\n }\r\n\r\n }\r\n\r\n }\r\n\r\n //#endregion\r\n\r\n }\r\n\r\n //#endregion\r\n\r\n //#region Signature expected\r\n\r\n if (result.signature != null)\r\n {\r\n\r\n if (SignatureExpectedDiv.parentElement != undefined &&\r\n SignatureExpectedDiv.parentElement.children[0] != undefined)\r\n {\r\n SignatureExpectedDiv.parentElement.children[0].innerHTML = \"Erwartete Signatur (\" + (result.signature.format || \"\") + \", hex)\";\r\n }\r\n\r\n if (result.signature.r && result.signature.s)\r\n SignatureExpectedDiv.innerHTML = \"r: \" + (result.signature.r.toLowerCase().match(/.{1,8}/g)?.join(\" \") ?? \"\") + \"<br />\" +\r\n \"s: \" + (result.signature.s.toLowerCase().match(/.{1,8}/g)?.join(\" \") ?? \"\");\r\n\r\n else if (result.signature.value)\r\n SignatureExpectedDiv.innerHTML = result.signature.value.toLowerCase().match(/.{1,8}/g)?.join(\" \") ?? \"-\";\r\n\r\n }\r\n\r\n //#endregion\r\n\r\n\r\n //#region Signature check\r\n\r\n {\r\n switch (result.status)\r\n {\r\n\r\n case chargyInterfaces.VerificationResult.UnknownCTRFormat:\r\n SignatureCheckDiv.innerHTML = '<i class=\"fas fa-times-circle\"></i><div id=\"description\">Unbekanntes Transparenzdatenformat</div>';\r\n break;\r\n\r\n case chargyInterfaces.VerificationResult.EnergyMeterNotFound:\r\n SignatureCheckDiv.innerHTML = '<i class=\"fas fa-times-circle\"></i><div id=\"description\">Ungültiger Energiezähler</div>';\r\n break;\r\n\r\n case chargyInterfaces.VerificationResult.PublicKeyNotFound:\r\n SignatureCheckDiv.innerHTML = '<i class=\"fas fa-times-circle\"></i><div id=\"description\">Ungültiger Public Key</div>';\r\n break;\r\n\r\n case chargyInterfaces.VerificationResult.InvalidPublicKey:\r\n SignatureCheckDiv.innerHTML = '<i class=\"fas fa-times-circle\"></i><div id=\"description\">Ungültiger Public Key</div>';\r\n break;\r\n\r\n case chargyInterfaces.VerificationResult.InvalidSignature:\r\n SignatureCheckDiv.innerHTML = '<i class=\"fas fa-times-circle\"></i><div id=\"description\">Ungültige Signatur</div>';\r\n break;\r\n\r\n case chargyInterfaces.VerificationResult.ValidSignature:\r\n SignatureCheckDiv.innerHTML = '<i class=\"fas fa-check-circle\"></i><div id=\"description\">Gültige Signatur</div>';\r\n break;\r\n\r\n\r\n default:\r\n SignatureCheckDiv.innerHTML = '<i class=\"fas fa-times-circle\"></i><div id=\"description\">Ungültige Signatur</div>';\r\n break;\r\n\r\n }\r\n }\r\n\r\n //#endregion\r\n\r\n }\r\n\r\n}\r\n","/*\n * Copyright (c) 2018-2026 GraphDefined GmbH <achim.friedland@graphdefined.com>\n * This file is part of Chargy WebApp <https://github.com/OpenChargingCloud/ChargyWebApp>\n *\n * Licensed under the Affero GPL license, Version 3.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.gnu.org/licenses/agpl.html\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { Chargy } from './chargy'\nimport { ACrypt } from './ACrypt'\nimport * as chargyInterfaces from './interfaces/chargyInterfaces'\nimport * as chargeTransparencyRecord from './interfaces/IChargeTransparencyRecord'\nimport * as chargyLib from './chargyLib'\nimport Decimal from 'decimal.js';\n\n\nexport const MENNEKES_EDL40_XMLNS = \"http://www.mennekes.de/Mennekes.EdlVerification.xsd\";\nexport const MENNEKES_EDL40_OBIS = \"1-0:1.17.0*255\";\n\nexport interface IMennekesMeasurement {\n timestampCustomerIdent?: string;\n timestamp: string;\n signature: string;\n eventCounter: number;\n meterStatus: number;\n value: number;\n scaler: number;\n pagination: number;\n secondIndex: number;\n}\n\nexport interface IMennekesChargingProcess {\n serverId: string;\n publicKey: string;\n meteringPoint?: string;\n siteAddress?: chargyInterfaces.IAddress;\n customerIdent: string;\n timestampCustomerIdent: string;\n measurementStart: IMennekesMeasurement;\n measurementEnd: IMennekesMeasurement;\n}\n\nexport interface IMennekesBilling {\n chargingProcesses: IMennekesChargingProcess[];\n}\n\nexport interface IMennekesMeasurementValue extends chargeTransparencyRecord.IMeasurementValue {\n eventCounter: number;\n meterStatusNumber: number;\n originalSignature: string;\n timestampCustomerIdent?: string;\n measurement: IMennekesChargyMeasurement;\n}\n\nexport interface IMennekesChargyMeasurement extends chargeTransparencyRecord.IMeasurement {\n serverId: string;\n publicKey: string;\n customerIdent: string;\n timestampCustomerIdent: string;\n values: IMennekesMeasurementValue[];\n}\n\nexport interface IMennekesCrypt01Result extends chargyInterfaces.ICryptoResult {\n hashValue?: string;\n signedData?: string;\n publicKey?: string;\n publicKeyFormat?: string;\n signature?: chargyInterfaces.ISignatureRS;\n serverId?: string;\n timestamp?: string;\n meterStatus?: string;\n secondsIndex?: string;\n pagination?: string;\n obis?: string;\n unitEncoded?: string;\n scaler?: string;\n value?: string;\n logBytes?: string;\n customerIdent?: string;\n timestampCustomerIdent?: string;\n}\n\nexport class Mennekes {\n\n private readonly chargy: Chargy;\n\n constructor(chargy: Chargy) {\n this.chargy = chargy;\n }\n\n //#region tryToParseMennekesXML(XMLDocument)\n\n public async tryToParseMennekesXML(XMLDocument: Document) : Promise<chargeTransparencyRecord.IChargeTransparencyRecord|chargyInterfaces.ISessionCryptoResult>\n {\n\n try\n {\n\n const chargingProcesses = extractMennekesChargingProcesses(XMLDocument);\n\n if (chargingProcesses.length === 0)\n return {\n status: chargyInterfaces.SessionVerificationResult.InvalidSessionFormat,\n message: this.chargy.GetLocalizedMessage(\"UnknownOrInvalidChargingSessionFormat\"),\n certainty: 0\n };\n\n return await Promise.resolve(this.toChargeTransparencyRecord(chargingProcesses));\n\n }\n catch (exception)\n {\n return {\n status: chargyInterfaces.SessionVerificationResult.InvalidSessionFormat,\n message: \"Exception occured: \" + (exception instanceof Error ? exception.message : String(exception)),\n certainty: 0\n }\n }\n\n }\n\n //#endregion\n\n private toChargeTransparencyRecord(chargingProcesses: IMennekesChargingProcess[]): chargeTransparencyRecord.IChargeTransparencyRecord {\n\n const sessions = chargingProcesses.map((chargingProcess, index) => this.toChargingSession(chargingProcess, index));\n\n const ctr: chargeTransparencyRecord.IChargeTransparencyRecord = {\n \"@id\": sessions[0]?.[\"@id\"] ?? \"\",\n \"@context\": \"https://open.charging.cloud/contexts/CTR+json\",\n \"begin\": sessions[0]?.begin,\n \"end\": sessions[sessions.length - 1]?.end,\n \"description\": {\n \"de\": \"Alle Ladevorgaenge\",\n \"en\": \"All charging sessions\"\n },\n \"contract\": {\n \"@id\": chargingProcesses[0]?.customerIdent ?? \"\"\n },\n \"chargingPools\": [\n {\n \"@id\": \"DE*GEF*POOL*MENNEKES*1\",\n \"description\": { \"en\": \"Mennekes EDL40 charging pool\" },\n \"chargingStations\": chargingProcesses.map((chargingProcess, index) => this.toChargingStation(chargingProcess, index))\n }\n ],\n \"chargingSessions\": sessions,\n \"certainty\": 1,\n \"status\": chargyInterfaces.SessionVerificationResult.Unvalidated\n };\n\n return ctr;\n\n }\n\n private toChargingStation(chargingProcess: IMennekesChargingProcess,\n index: number): chargyInterfaces.IChargingStation {\n\n const chargingStationId = \"DE*GEF*STATION*MENNEKES*\" + String(index + 1);\n const evseId = this.evseId(chargingProcess, index);\n const meterId = this.meterId(chargingProcess);\n\n return {\n \"@id\": chargingStationId,\n \"description\": { \"en\": \"Mennekes EDL40 charging station\" },\n \"manufacturer\": \"MENNEKES\",\n \"address\": chargingProcess.siteAddress,\n \"EVSEs\": [\n {\n \"@id\": evseId,\n \"meters\": [\n {\n \"@id\": meterId,\n \"manufacturer\": \"MENNEKES\",\n \"signatureFormat\": \"https://open.charging.cloud/contexts/EnergyMeterSignatureFormats/MennekesCrypt01\",\n \"publicKeys\": [\n {\n \"value\": chargingProcess.publicKey,\n \"algorithm\": chargyInterfaces.IECCurves.secp192r1,\n \"format\": chargyInterfaces.PublicKeyFormats.XY,\n \"encoding\": chargyInterfaces.IEncoding.hex\n }\n ]\n }\n ]\n }\n ]\n };\n\n }\n\n private toChargingSession(chargingProcess: IMennekesChargingProcess,\n index: number): chargeTransparencyRecord.IChargingSession {\n\n const startMeasurement = chargingProcess.measurementStart;\n const endMeasurement = chargingProcess.measurementEnd;\n const meterId = this.meterId(chargingProcess);\n const sessionId = chargingProcess.serverId + \"-\" + String(startMeasurement.pagination) + \"-\" + String(endMeasurement.pagination);\n\n return {\n \"@id\": sessionId,\n \"@context\": \"https://open.charging.cloud/contexts/SessionSignatureFormats/MennekesCrypt01+json\",\n \"begin\": startMeasurement.timestamp,\n \"end\": endMeasurement.timestamp,\n \"internalSessionId\": sessionId,\n \"EVSEId\": this.evseId(chargingProcess, index),\n \"meterId\": meterId,\n\n \"authorizationStart\": {\n \"@id\": chargingProcess.customerIdent,\n \"timestamp\": chargingProcess.timestampCustomerIdent\n },\n\n \"measurements\": [\n {\n \"energyMeterId\": meterId,\n \"@context\": \"https://open.charging.cloud/contexts/EnergyMeterSignatureFormats/MennekesCrypt01+json\",\n \"name\": chargyLib.OBIS2MeasurementName(MENNEKES_EDL40_OBIS),\n \"obis\": MENNEKES_EDL40_OBIS,\n \"unit\": \"Wh\",\n \"unitEncoded\": 30,\n \"scale\": startMeasurement.scaler,\n \"serverId\": chargingProcess.serverId,\n \"publicKey\": chargingProcess.publicKey,\n \"customerIdent\": chargingProcess.customerIdent,\n \"timestampCustomerIdent\": chargingProcess.timestampCustomerIdent,\n \"signatureInfos\": {\n \"hash\": chargyInterfaces.CryptoHashAlgorithms.SHA256,\n \"hashTruncation\": 24,\n \"algorithm\": chargyInterfaces.CryptoAlgorithms.ECC,\n \"curve\": chargyInterfaces.IECCurves.secp192r1,\n \"format\": chargyInterfaces.SignatureFormats.RS,\n \"encoding\": chargyInterfaces.IEncoding.hex\n },\n \"values\": [\n toMennekesMeasurementValue(startMeasurement),\n toMennekesMeasurementValue(endMeasurement)\n ]\n } as IMennekesChargyMeasurement\n ]\n };\n\n }\n\n private evseId(chargingProcess: IMennekesChargingProcess,\n index: number): string {\n\n return chargingProcess.meteringPoint ?? \"DE*GEF*EVSE*MENNEKES*\" + String(index + 1);\n\n }\n\n private meterId(chargingProcess: IMennekesChargingProcess): string {\n return chargingProcess.serverId;\n }\n\n}\n\nexport class MennekesCrypt01 extends ACrypt {\n\n constructor(chargy: Chargy) {\n super(\"Mennekes EDL40\",\n chargy);\n }\n\n async VerifyChargingSession(chargingSession: chargeTransparencyRecord.IChargingSession): Promise<chargyInterfaces.ISessionCryptoResult>\n {\n\n let sessionResult = chargyInterfaces.SessionVerificationResult.UnknownSessionFormat;\n\n for (const measurement of chargingSession.measurements)\n {\n\n measurement.chargingSession = chargingSession;\n\n if (measurement.values.length >= 2)\n {\n\n sessionResult = chargyInterfaces.SessionVerificationResult.ValidSignature;\n\n for (const measurementValue of measurement.values)\n {\n measurementValue.measurement = measurement;\n await this.VerifyMeasurement(measurementValue as IMennekesMeasurementValue);\n\n if (measurementValue.result?.status !== chargyInterfaces.VerificationResult.ValidSignature)\n sessionResult = chargyInterfaces.SessionVerificationResult.InvalidSignature;\n }\n\n if (sessionResult === chargyInterfaces.SessionVerificationResult.ValidSignature)\n {\n const lawErrors = validateMennekesLawConformity(measurement.values as IMennekesMeasurementValue[]);\n\n if (lawErrors.length > 0)\n {\n measurement.verificationResult = {\n status: chargyInterfaces.VerificationResult.InvalidMeasurement,\n errors: lawErrors\n };\n\n sessionResult = chargyInterfaces.SessionVerificationResult.InvalidMeasurement;\n }\n else\n {\n measurement.verificationResult = {\n status: chargyInterfaces.VerificationResult.ValidSignature\n };\n }\n }\n\n }\n else\n sessionResult = chargyInterfaces.SessionVerificationResult.AtLeastTwoMeasurementsRequired;\n\n }\n\n return {\n status: sessionResult,\n certainty: .5\n }\n\n }\n\n async VerifyMeasurement(measurementValue: IMennekesMeasurementValue): Promise<IMennekesCrypt01Result>\n {\n\n function setResult(verificationResult: chargyInterfaces.VerificationResult)\n {\n cryptoResult.status = verificationResult;\n measurementValue.result = cryptoResult;\n return cryptoResult;\n }\n\n measurementValue.method = this;\n\n const measurement = measurementValue.measurement;\n\n const cryptoResult: IMennekesCrypt01Result = {\n status: chargyInterfaces.VerificationResult.InvalidSignature,\n serverId: measurement.serverId,\n publicKey: measurement.publicKey,\n publicKeyFormat: chargyInterfaces.PublicKeyFormats.XY,\n signature: measurementValue.signatures?.[0],\n timestamp: measurementValue.timestamp,\n meterStatus: String(measurementValue.meterStatusNumber),\n secondsIndex: String(measurementValue.secondsIndex ?? \"\"),\n pagination: String(measurementValue.paginationId ?? \"\"),\n obis: MENNEKES_EDL40_OBIS,\n unitEncoded: \"30\",\n scaler: String(measurement.scale),\n value: measurementValue.value.toString(),\n customerIdent: measurement.customerIdent,\n timestampCustomerIdent: measurementValue.timestampCustomerIdent ?? measurement.timestampCustomerIdent\n };\n\n try\n {\n\n const meter = this.chargy.GetMeter(measurement.energyMeterId);\n if (meter == null)\n return setResult(chargyInterfaces.VerificationResult.EnergyMeterNotFound);\n\n if (meter.publicKeys == null || meter.publicKeys.length === 0)\n return setResult(chargyInterfaces.VerificationResult.PublicKeyNotFound);\n\n const signatureExpected = measurementValue.signatures?.[0] as chargyInterfaces.ISignatureRS;\n if (signatureExpected.r == null || signatureExpected.s == null)\n return setResult(chargyInterfaces.VerificationResult.InvalidSignature);\n\n const signedData = buildMennekesSignatureData(\n {\n serverId: measurement.serverId,\n publicKey: measurement.publicKey,\n customerIdent: measurement.customerIdent,\n timestampCustomerIdent: measurement.timestampCustomerIdent,\n measurementStart: {} as IMennekesMeasurement,\n measurementEnd: {} as IMennekesMeasurement\n },\n {\n timestampCustomerIdent: measurementValue.timestampCustomerIdent,\n timestamp: measurementValue.timestamp,\n signature: measurementValue.originalSignature,\n eventCounter: measurementValue.eventCounter,\n meterStatus: measurementValue.meterStatusNumber,\n value: measurementValue.value.toNumber(),\n scaler: measurement.scale,\n pagination: Number(measurementValue.paginationId),\n secondIndex: measurementValue.secondsIndex ?? 0\n }\n );\n\n cryptoResult.signedData = bytesToHex(signedData);\n cryptoResult.logBytes = cryptoResult.signedData.substring(78, 82);\n\n const signedDataBuffer = signedData.buffer.slice(\n signedData.byteOffset,\n signedData.byteOffset + signedData.byteLength\n );\n\n cryptoResult.hashValue = (await chargyLib.sha256(new DataView(signedDataBuffer))).substring(0, 48);\n\n const publicKey = cleanHex(meter.publicKeys[0]?.value ?? measurement.publicKey);\n\n if (publicKey.length !== 96)\n return setResult(chargyInterfaces.VerificationResult.InvalidPublicKey);\n\n const result = this.curve192r1.\n keyFromPublic(\"04\" + publicKey, \"hex\").\n verify(cryptoResult.hashValue.toUpperCase(), {\n r: signatureExpected.r,\n s: signatureExpected.s\n }\n );\n\n return setResult(\n result\n ? chargyInterfaces.VerificationResult.ValidSignature\n : chargyInterfaces.VerificationResult.InvalidSignature\n );\n\n }\n catch\n {\n return setResult(chargyInterfaces.VerificationResult.InvalidSignature);\n }\n\n }\n\n async ViewMeasurement(measurementValue: IMennekesMeasurementValue,\n errorDiv: HTMLDivElement,\n introDiv: HTMLDivElement,\n infoDiv: HTMLDivElement,\n PlainTextDiv: HTMLDivElement,\n HashedPlainTextDiv: HTMLDivElement,\n PublicKeyDiv: HTMLDivElement,\n SignatureExpectedDiv: HTMLDivElement,\n SignatureCheckDiv: HTMLDivElement) : Promise<Error | undefined>\n {\n\n void errorDiv;\n void infoDiv;\n\n const result = measurementValue.result as IMennekesCrypt01Result;\n\n introDiv.innerHTML = this.chargy.GetLocalizedMessage(\"The following data of the charging session is relevant for metrological and legal metrological purposes and therefore part of the digital signature\").\n replace(\"{methodName}\", \"MennekesCrypt01\").\n replace(\"{cryptoAlgorithm}\", this.description);\n\n if (PlainTextDiv.parentElement?.children[0])\n PlainTextDiv.parentElement.children[0].innerHTML = this.chargy.GetLocalizedMessage(\"Plain text\") + \" (320 Bytes, hex)\";\n\n PlainTextDiv.innerHTML = result.signedData?.match(/.{1,8}/g)?.join(\" \") ?? \"\";\n\n if (HashedPlainTextDiv.parentElement?.children[0])\n HashedPlainTextDiv.parentElement.children[0].innerHTML = this.chargy.GetLocalizedMessage(\"Hashed plain text\") + \" (SHA256 cropped to 24 Bytes, hex)\";\n\n HashedPlainTextDiv.innerHTML = result.hashValue?.match(/.{1,8}/g)?.join(\" \") ?? \"\";\n\n if (PublicKeyDiv.parentElement?.children[0])\n PublicKeyDiv.parentElement.children[0].innerHTML = this.chargy.GetLocalizedMessage(\"Public Key\") + \" (secp192r1, xy, hex)\";\n\n PublicKeyDiv.innerHTML = result.publicKey?.match(/.{1,8}/g)?.join(\" \") ?? \"\";\n\n if (SignatureExpectedDiv.parentElement?.children[0])\n SignatureExpectedDiv.parentElement.children[0].innerHTML = this.chargy.GetLocalizedMessage(\"Expected signature\") + \" (rs, hex)\";\n\n SignatureExpectedDiv.innerHTML = result.signature?.r && result.signature.s\n ? \"r: \" + (result.signature.r.toLowerCase().match(/.{1,8}/g)?.join(\" \") ?? \"\") + \"<br />\" +\n \"s: \" + (result.signature.s.toLowerCase().match(/.{1,8}/g)?.join(\" \") ?? \"\")\n : \"\";\n\n SignatureCheckDiv.innerHTML = result.status === chargyInterfaces.VerificationResult.ValidSignature\n ? '<i class=\"fas fa-check-circle\"></i><div id=\"description\">' + this.chargy.GetLocalizedMessage(\"Valid signature\") + '</div>'\n : '<i class=\"fas fa-times-circle\"></i><div id=\"description\">' + this.chargy.GetLocalizedMessage(\"Invalid signature\") + '</div>';\n\n return Promise.resolve(undefined);\n\n }\n\n}\n\nexport function extractMennekesChargingProcesses(XMLDocument: Document): IMennekesChargingProcess[] {\n\n const root = XMLDocument.documentElement;\n\n if (isLocalName(root, \"ChargingProcess\"))\n return [ parseChargingProcessElement(root) ];\n\n if (isLocalName(root, \"Billing\"))\n return chargyLib.getElementsByLocalName(root, \"ChargingProcess\").\n map(chargingProcessElement => parseChargingProcessElement(chargingProcessElement));\n\n return [];\n\n}\n\nexport function parseMennekesXMLDocument(XMLDocument: Document): IMennekesBilling | IMennekesChargingProcess {\n\n const chargingProcesses = extractMennekesChargingProcesses(XMLDocument);\n\n if (chargingProcesses.length === 0)\n throw new Error(\"No Mennekes ChargingProcess element found!\");\n\n if (isLocalName(XMLDocument.documentElement, \"ChargingProcess\"))\n {\n if (chargingProcesses.length > 1)\n {\n\n const chargingProcess = chargingProcesses[0];\n\n if (chargingProcess != undefined)\n return chargingProcess;\n\n throw new Error(\"No Mennekes ChargingProcess found!\");\n\n }\n }\n\n return {\n chargingProcesses\n };\n\n}\n\nexport function buildMennekesSignatureData(chargingProcess: IMennekesChargingProcess,\n measurement: IMennekesMeasurement): Uint8Array {\n\n const signatureBytes = hexToBytes(measurement.signature);\n\n if (signatureBytes.length !== 48 && signatureBytes.length !== 50)\n throw new Error(\"Mennekes signatures must contain 48 or 50 bytes!\");\n\n const signedData = new Uint8Array(320);\n\n setBytes(signedData, 0, hexToBytes(chargingProcess.serverId), 10);\n setBytes(signedData, 10, timestampToMennekesBytes(measurement.timestamp), 4);\n signedData[14] = measurement.meterStatus & 0xFF;\n setBytes(signedData, 15, numberToReversedBytes(measurement.secondIndex, 4), 4);\n setBytes(signedData, 19, numberToReversedBytes(measurement.pagination, 4), 4);\n setBytes(signedData, 23, new Uint8Array([ 0x01, 0x00, 0x01, 0x11, 0x00, 0xFF ]), 6);\n signedData[29] = 30;\n signedData[30] = measurement.scaler & 0xFF;\n setBytes(signedData, 31, numberToReversedBytes(measurement.value, 8), 8);\n\n if (signatureBytes.length > 48)\n setBytes(signedData, 39, signatureBytes.subarray(48, 50), 2);\n else\n setBytes(signedData, 39, numberToBytesBE(measurement.eventCounter, 2), 2);\n\n const customerIdentBytes = hexToBytes(chargingProcess.customerIdent);\n if (customerIdentBytes.length > 128)\n throw new Error(\"Mennekes CustomerIdent must not exceed 128 bytes!\");\n\n setBytes(signedData, 41, customerIdentBytes, customerIdentBytes.length);\n setBytes(signedData, 169, timestampToMennekesBytes(measurement.timestampCustomerIdent ?? chargingProcess.timestampCustomerIdent), 4);\n\n return signedData;\n\n}\n\nexport function dateToMennekesLocalEpochSeconds(isoTimestamp: string): number {\n\n const date = new Date(isoTimestamp);\n\n if (!Number.isFinite(date.getTime()))\n throw new Error(\"Invalid Mennekes timestamp: \" + isoTimestamp);\n\n const offsetMatch = isoTimestamp.trim().match(/([+-])(\\d{2}):(\\d{2})$/);\n\n if (offsetMatch == null)\n return Math.floor(date.getTime() / 1000);\n\n const sign = offsetMatch[1] === \"+\" ? 1 : -1;\n const offsetSeconds = sign * (Number(offsetMatch[2]) * 3600 + Number(offsetMatch[3]) * 60);\n\n return Math.floor(date.getTime() / 1000) + offsetSeconds;\n\n}\n\nexport function cleanHex(hex: string): string {\n return hex.replace(/\\s+/g, \"\");\n}\n\nexport function hexToBytes(hex: string): Uint8Array {\n\n const cleanedHex = cleanHex(hex);\n\n if (cleanedHex.length % 2 !== 0)\n throw new Error(\"Hex strings must have even length!\");\n\n if (!/^[0-9a-fA-F]*$/.test(cleanedHex))\n throw new Error(\"Invalid hexadecimal string!\");\n\n const bytes = new Uint8Array(cleanedHex.length / 2);\n\n for (let index = 0; index < cleanedHex.length; index += 2)\n bytes[index / 2] = Number.parseInt(cleanedHex.substring(index, index + 2), 16);\n\n return bytes;\n\n}\n\nexport function bytesToHex(bytes: Uint8Array): string {\n return Array.from(bytes, byte => byte.toString(16).padStart(2, \"0\")).join(\"\");\n}\n\nfunction parseChargingProcessElement(chargingProcessElement: Element): IMennekesChargingProcess {\n\n const siteAddressElement = child(chargingProcessElement, \"SiteAddress\");\n\n return {\n serverId: cleanHex(requiredText(chargingProcessElement, \"ServerId\")),\n publicKey: cleanHex(requiredText(chargingProcessElement, \"PublicKey\")),\n meteringPoint: optionalText(chargingProcessElement, \"MeteringPoint\"),\n siteAddress: siteAddressElement != null\n ? {\n \"@context\": \"https://open.charging.cloud/contexts/address+json\",\n \"country\": \"DE\",\n \"postalCode\": optionalText(siteAddressElement, \"ZipCode\") ?? \"\",\n \"street\": optionalText(siteAddressElement, \"Street\"),\n \"city\": optionalText(siteAddressElement, \"Town\") ?? \"\"\n }\n : undefined,\n customerIdent: cleanHex(requiredText(chargingProcessElement, \"CustomerIdent\")),\n timestampCustomerIdent: requiredText(chargingProcessElement, \"TimestampCustomerIdent\"),\n measurementStart: parseMeasurementElement(requiredChild(chargingProcessElement, \"MeasurementStart\")),\n measurementEnd: parseMeasurementElement(requiredChild(chargingProcessElement, \"MeasurementEnd\"))\n };\n\n}\n\nfunction parseMeasurementElement(measurementElement: Element): IMennekesMeasurement {\n\n return {\n timestampCustomerIdent: optionalText(measurementElement, \"TimestampCustomerIdent\"),\n timestamp: requiredText(measurementElement, \"Timestamp\"),\n signature: cleanHex(requiredText(measurementElement, \"Signature\")),\n eventCounter: requiredNumber(measurementElement, \"EventCounter\"),\n meterStatus: requiredNumber(measurementElement, \"MeterStatus\"),\n value: requiredNumber(measurementElement, \"Value\"),\n scaler: requiredNumber(measurementElement, \"Scaler\"),\n pagination: requiredNumber(measurementElement, \"Pagination\"),\n secondIndex: requiredNumber(measurementElement, \"SecondIndex\")\n };\n\n}\n\nfunction toMennekesMeasurementValue(measurement: IMennekesMeasurement): IMennekesMeasurementValue {\n\n const signature = cleanHex(measurement.signature);\n const signatureForVerification = signature.length === 100\n ? signature.substring(0, 96)\n : signature;\n\n return {\n \"timestamp\": measurement.timestamp,\n \"value\": new Decimal(measurement.value),\n \"statusMeter\": String(measurement.meterStatus),\n \"secondsIndex\": measurement.secondIndex,\n \"paginationId\": measurement.pagination,\n \"logBookIndex\": String(measurement.eventCounter),\n \"eventCounter\": measurement.eventCounter,\n \"meterStatusNumber\": measurement.meterStatus,\n \"originalSignature\": signature,\n \"timestampCustomerIdent\": measurement.timestampCustomerIdent,\n \"signatures\": [\n {\n \"algorithm\": chargyInterfaces.CryptoAlgorithms.ECC,\n \"format\": chargyInterfaces.SignatureFormats.RS,\n \"value\": signatureForVerification,\n \"r\": signatureForVerification.substring(0, 48),\n \"s\": signatureForVerification.substring(48, 96)\n }\n ],\n \"errors\": [],\n \"warnings\": [],\n \"method\": undefined,\n \"measurement\": undefined as unknown as IMennekesChargyMeasurement\n };\n\n}\n\nfunction validateMennekesLawConformity(measurementValues: IMennekesMeasurementValue[]): string[] {\n\n const errors = new Array<string>();\n const start = measurementValues[0];\n const end = measurementValues[measurementValues.length - 1];\n\n if (start == null || end == null)\n return [ \"Mennekes EDL40 requires at least two measurement values.\" ];\n\n if (start.eventCounter !== end.eventCounter)\n errors.push(\"Event counter mismatch.\");\n\n if (Number(start.paginationId) >= Number(end.paginationId))\n errors.push(\"Pagination must increase from start to end.\");\n\n if (start.value.gt(end.value))\n errors.push(\"Meter value must not decrease.\");\n\n return errors;\n\n}\n\nfunction child(parent: Element, localName: string): Element | undefined {\n return chargyLib.getDirectChildByLocalName(parent, localName);\n}\n\nfunction requiredChild(parent: Element, localName: string): Element {\n\n const element = child(parent, localName);\n\n if (element == null)\n throw new Error(\"Missing Mennekes XML element: \" + localName);\n\n return element;\n\n}\n\nfunction optionalText(parent: Element, localName: string): string | undefined {\n return chargyLib.getTrimmedTextContent(child(parent, localName));\n}\n\nfunction requiredText(parent: Element, localName: string): string {\n\n const text = optionalText(parent, localName);\n\n if (text == null)\n throw new Error(\"Missing Mennekes XML text: \" + localName);\n\n return text;\n\n}\n\nfunction requiredNumber(parent: Element, localName: string): number {\n\n const value = Number(requiredText(parent, localName));\n\n if (!Number.isFinite(value))\n throw new Error(\"Invalid Mennekes numeric XML text: \" + localName);\n\n return value;\n\n}\n\nfunction isLocalName(element: Element | undefined | null, localName: string): boolean {\n return element?.localName === localName || element?.nodeName === localName;\n}\n\nfunction setBytes(target: Uint8Array,\n offset: number,\n source: Uint8Array,\n length: number): void {\n\n if (source.length < length)\n throw new Error(\"Not enough bytes for Mennekes signature field!\");\n\n target.set(source.subarray(0, length), offset);\n\n}\n\nfunction timestampToMennekesBytes(isoTimestamp: string): Uint8Array {\n return numberToReversedBytes(dateToMennekesLocalEpochSeconds(isoTimestamp), 4);\n}\n\nfunction numberToReversedBytes(value: number,\n length: number): Uint8Array {\n\n return numberToBytesBE(value, length).reverse();\n\n}\n\nfunction numberToBytesBE(value: number,\n length: number): Uint8Array {\n\n let remaining = BigInt(value);\n\n if (remaining < 0)\n remaining = BigInt.asUintN(length * 8, remaining);\n\n const bytes = new Uint8Array(length);\n\n for (let index = length - 1; index >= 0; index--)\n {\n bytes[index] = Number(remaining & BigInt(255));\n remaining >>= BigInt(8);\n }\n\n return bytes;\n\n}\n","/*\r\n * Copyright (c) 2018-2026 GraphDefined GmbH <achim.friedland@graphdefined.com>\r\n * This file is part of Chargy Desktop App <https://github.com/OpenChargingCloud/ChargyDesktopApp>\r\n *\r\n * Licensed under the Affero GPL license, Version 3.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.gnu.org/licenses/agpl.html\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n\r\n// Note: More information about implementation details and limitations\r\n// can be found within ~/documentation/OCMF/README.md!\r\n\r\nimport type { Chargy,\r\n EllipticCurve,\r\n EllipticKeyPair } from './chargy'\r\nimport { ACrypt } from './ACrypt'\r\nimport * as chargyInterfaces from './interfaces/chargyInterfaces'\r\nimport * as chargeTransparencyRecord from './interfaces/IChargeTransparencyRecord'\r\nimport * as chargyLib from './chargyLib'\r\nimport Decimal from 'decimal.js';\r\n\r\n\r\nexport interface IOCMFv1_0MeasurementValue extends IOCMFMeasurementValue\r\n{\r\n statusMeter: string,\r\n secondsIndex: number,\r\n paginationId: string,\r\n logBookIndex: string\r\n}\r\n\r\nexport interface IOCMFv1_0Result extends chargyInterfaces.ICryptoResult\r\n{\r\n sha256value?: string,\r\n meterId?: string,\r\n meter?: chargyInterfaces.IMeter,\r\n timestamp?: string,\r\n infoStatus?: string,\r\n secondsIndex?: string,\r\n paginationId?: string,\r\n obis?: string,\r\n unitEncoded?: string,\r\n scale?: string,\r\n value?: string,\r\n logBookIndex?: string,\r\n authorizationStart?: string,\r\n authorizationStop?: string,\r\n authorizationStartTimestamp?: string,\r\n publicKey?: string,\r\n publicKeyFormat?: string,\r\n publicKeySignatures?: Array<unknown>,\r\n signature?: chargyInterfaces.ISignatureRS\r\n}\r\n\r\nexport class OCMFv1_x extends ACrypt {\r\n\r\n readonly curve = new this.chargy.elliptic.ec('p256');\r\n\r\n constructor(chargy: Chargy) {\r\n super(\"OCMF\",\r\n chargy);\r\n }\r\n\r\n\r\n async VerifyChargingSession(chargingSession: chargeTransparencyRecord.IChargingSession): Promise<chargyInterfaces.ISessionCryptoResult>\r\n {\r\n\r\n let sessionResult:chargyInterfaces.SessionVerificationResult = chargyInterfaces.SessionVerificationResult.Unvalidated;\r\n\r\n {\r\n for (const measurement of chargingSession.measurements)\r\n {\r\n\r\n measurement.chargingSession = chargingSession;\r\n\r\n // Must include at least two measurements (start & stop)\r\n if (measurement.values.length > 1)\r\n {\r\n\r\n //#region Verify measurements...\r\n\r\n for (const measurementValue of measurement.values)\r\n {\r\n measurementValue.measurement = measurement;\r\n await this.VerifyMeasurement(measurementValue as IOCMFv1_0MeasurementValue);\r\n }\r\n\r\n //#endregion\r\n\r\n //#region Find an overall result...\r\n\r\n for (const measurementValue of measurement.values)\r\n {\r\n if (measurementValue.result)\r\n {\r\n switch (measurementValue.result.status)\r\n {\r\n\r\n // Unvalidated\r\n // UnknownCTRFormat\r\n\r\n case chargyInterfaces.VerificationResult.EnergyMeterNotFound:\r\n sessionResult = chargyInterfaces.SessionVerificationResult.EnergyMeterNotFound;\r\n break;\r\n\r\n case chargyInterfaces.VerificationResult.UnknownSignatureFormat:\r\n sessionResult = chargyInterfaces.SessionVerificationResult.UnknownSignatureFormat;\r\n break;\r\n \r\n case chargyInterfaces.VerificationResult.PublicKeyNotFound:\r\n sessionResult = chargyInterfaces.SessionVerificationResult.PublicKeyNotFound;\r\n break;\r\n\r\n case chargyInterfaces.VerificationResult.UnknownPublicKeyFormat:\r\n sessionResult = chargyInterfaces.SessionVerificationResult.UnknownPublicKeyFormat;\r\n break;\r\n\r\n case chargyInterfaces.VerificationResult.InvalidPublicKey:\r\n sessionResult = chargyInterfaces.SessionVerificationResult.InvalidPublicKey;\r\n break;\r\n\r\n // InvalidMeasurement\r\n // InvalidStartValue\r\n // InvalidIntermediateValue\r\n // InvalidStopValue\r\n\r\n case chargyInterfaces.VerificationResult.InvalidSignature:\r\n sessionResult = chargyInterfaces.SessionVerificationResult.InvalidSignature;\r\n break;\r\n\r\n // NoOperation\r\n // StartValue\r\n // IntermediateValue\r\n // StopValue\r\n\r\n case chargyInterfaces.VerificationResult.ValidSignature:\r\n sessionResult = chargyInterfaces.SessionVerificationResult.ValidSignature;\r\n break;\r\n\r\n // ValidStartValue\r\n // ValidIntermediateValue\r\n // ValidStopValue\r\n // ValidationError\r\n\r\n }\r\n }\r\n\r\n if (sessionResult !== chargyInterfaces.SessionVerificationResult.ValidSignature)\r\n break;\r\n\r\n }\r\n\r\n //#endregion\r\n\r\n }\r\n\r\n else\r\n sessionResult = chargyInterfaces.SessionVerificationResult.AtLeastTwoMeasurementsRequired;\r\n\r\n }\r\n }\r\n\r\n return {\r\n status: sessionResult,\r\n certainty: .5\r\n } ;\r\n\r\n }\r\n\r\n async VerifyMeasurement(measurementValue: IOCMFv1_0MeasurementValue): Promise<IOCMFv1_0Result>\r\n {\r\n\r\n measurementValue.method = this;\r\n\r\n // The measurement was already verified by the outer OCMF signature!\r\n\r\n return {\r\n status: measurementValue.result?.status ?? chargyInterfaces.VerificationResult.Unvalidated\r\n }\r\n\r\n }\r\n\r\n\r\n private PayloadDictionary(Path: string, Key: string): string\r\n {\r\n\r\n if (Path === \"RD\")\r\n {\r\n switch (Key)\r\n {\r\n\r\n case \"TM\":\r\n return \"Time\";\r\n\r\n case \"TX\":\r\n return \"Transaction\";\r\n\r\n case \"RV\":\r\n return \"Reading Value\";\r\n\r\n case \"RI\":\r\n return \"Reading Identification\";\r\n\r\n case \"RU\":\r\n return \"Reading Unit\";\r\n\r\n case \"RT\":\r\n return \"Reading Current Type\";\r\n\r\n case \"CL\":\r\n return \"Cumulated Loss\";\r\n\r\n case \"EF\":\r\n return \"Error Flags\";\r\n\r\n case \"ST\":\r\n return \"Status\";\r\n\r\n\r\n default:\r\n return Key;\r\n\r\n }\r\n }\r\n\r\n switch (Key)\r\n {\r\n\r\n case \"FV\":\r\n return \"Format Version\";\r\n\r\n case \"GI\":\r\n return \"Gateway Identification\";\r\n\r\n case \"GS\":\r\n return \"Gateway Serial\";\r\n\r\n case \"GV\":\r\n return \"Gateway Version\";\r\n\r\n\r\n case \"PG\":\r\n return \"Pagination\";\r\n\r\n\r\n case \"MV\":\r\n return \"Meter Vendor\";\r\n\r\n case \"MM\":\r\n return \"Meter Model\";\r\n\r\n case \"MS\":\r\n return \"Meter Serial\";\r\n\r\n case \"MF\":\r\n return \"Meter Firmware\";\r\n\r\n\r\n case \"IS\":\r\n return \"Identification Status\";\r\n\r\n case \"IL\":\r\n return \"Identification Level\";\r\n\r\n case \"IF\":\r\n return \"Identification Flags\";\r\n\r\n case \"IT\":\r\n return \"Identification Type\";\r\n\r\n case \"ID\":\r\n return \"Identification Data\";\r\n\r\n case \"TT\":\r\n return \"Tariff Text\";\r\n\r\n\r\n case \"LC\":\r\n return \"Loss Compensation\";\r\n\r\n\r\n case \"CT\":\r\n return \"Charge Point Identification Type\";\r\n\r\n case \"CI\":\r\n return \"Charge Point Identification\";\r\n\r\n\r\n case \"RD\":\r\n return \"Reading\";\r\n\r\n\r\n default:\r\n return Key;\r\n\r\n }\r\n }\r\n\r\n private SignatureDictionary(Path: string, Key: string): string\r\n {\r\n switch (Key)\r\n {\r\n\r\n case \"SA\":\r\n return \"Signature Algorithm\";\r\n\r\n case \"SE\":\r\n return \"Signature Encoding\";\r\n\r\n case \"SM\":\r\n return \"Signature Mime Type\";\r\n\r\n case \"SD\":\r\n return \"Signature Data\";\r\n\r\n\r\n default:\r\n return Key;\r\n\r\n }\r\n }\r\n\r\n async ViewMeasurement(measurementValue: IOCMFv1_0MeasurementValue,\r\n errorDiv: HTMLDivElement,\r\n introDiv: HTMLDivElement,\r\n infoDiv: HTMLDivElement,\r\n PlainTextDiv: HTMLDivElement,\r\n HashedPlainTextDiv: HTMLDivElement,\r\n PublicKeyDiv: HTMLDivElement,\r\n SignatureExpectedDiv: HTMLDivElement,\r\n SignatureCheckDiv: HTMLDivElement) : Promise<Error | undefined>\r\n {\r\n\r\n if (!measurementValue.measurement ||\r\n !measurementValue.ocmfDocument ||\r\n !measurementValue.measurement.chargingSession)\r\n {\r\n return new Error(\"Invalid measurement!\");\r\n }\r\n\r\n //#region Headline / Introduction\r\n\r\n {\r\n introDiv.innerHTML = this.chargy.GetLocalizedMessage(\"The following data of the charging session is relevant for metrological and legal metrological purposes and therefore part of the digital signature\").\r\n replace(\"{methodName}\", \"OCMFCrypt01\").\r\n replace(\"{cryptoAlgorithm}\", measurementValue.ocmfDocument.publicKey && typeof(measurementValue.ocmfDocument.publicKey) !== 'string'\r\n ? \"(\" + measurementValue.ocmfDocument.publicKey.algorithm + \") \"\r\n : \"\");\r\n }\r\n\r\n //#endregion\r\n\r\n //#region Plain text\r\n\r\n {\r\n\r\n if (PlainTextDiv.parentElement &&\r\n PlainTextDiv.parentElement.children[0])\r\n {\r\n PlainTextDiv.parentElement.children[0].innerHTML = this.chargy.GetLocalizedMessage(\"Plain text\") + \" (OCMF|&lt;\" + this.chargy.GetLocalizedMessage(\"payload\") + \"&gt;|&lt;\" + this.chargy.GetLocalizedMessage(\"signature\") + \"&gt;)\";\r\n }\r\n\r\n PlainTextDiv.innerText = '';\r\n\r\n //#region Compact OCMF document\r\n\r\n const compactValueDiv = document.createElement('div');\r\n compactValueDiv.className = \"compactValue\";\r\n PlainTextDiv.appendChild(compactValueDiv);\r\n\r\n compactValueDiv.innerHTML = '<span class=\"ocmfHighlight\">OCMF</span>' + (measurementValue.ocmfDocument.raw?.substring(4) ?? \"\");\r\n\r\n const firstIndex = compactValueDiv.innerHTML.indexOf('|');\r\n if (firstIndex !== -1) {\r\n compactValueDiv.innerHTML = compactValueDiv.innerHTML.substring(0, firstIndex) + '<span class=\"ocmfSeparator\">|</span>' + compactValueDiv.innerHTML.substring(firstIndex + 1);\r\n }\r\n\r\n const lastIndex = compactValueDiv.innerHTML.lastIndexOf('|');\r\n if (lastIndex !== -1 && lastIndex !== firstIndex) { // Überprüfen, dass es nicht das gleiche Vorkommen ist\r\n compactValueDiv.innerHTML = compactValueDiv.innerHTML.substring(0, lastIndex) + '<span class=\"ocmfSeparator\">|</span><span class=\"ocmfHighlight\">' + compactValueDiv.innerHTML.substring(lastIndex + 1) + '</span>';\r\n }\r\n\r\n compactValueDiv.style.fontFamily = \"monospace\";\r\n compactValueDiv.style.maxHeight = \"25vh\";\r\n compactValueDiv.style.overflowY = \"scroll\";\r\n\r\n compactValueDiv.onclick = () => {\r\n compactValueDiv.style.display = 'none';\r\n prettyValueDiv.style.display = 'block';\r\n };\r\n\r\n //#endregion\r\n\r\n //#region Pretty printed OCMF document\r\n\r\n const prettyValueDiv = document.createElement('div');\r\n prettyValueDiv.className = \"prettyValue\";\r\n PlainTextDiv.appendChild(prettyValueDiv);\r\n\r\n //prettyValueDiv.style.whiteSpace = \"pre\";\r\n\r\n prettyValueDiv.innerHTML = '<span class=\"ocmfHighlight\">OCMF</span><span class=\"ocmfSeparator\">|</span><br />' + chargyLib.jsonPrettyPrinter(measurementValue.ocmfDocument.payload, (path, key) => this.PayloadDictionary (path, key)) + '<span class=\"ocmfSeparator\">|</span><br />' + chargyLib.jsonPrettyPrinter(measurementValue.ocmfDocument.signature, (path, key) => this.SignatureDictionary(path, key));\r\n\r\n prettyValueDiv.onclick = () => {\r\n compactValueDiv.style.display = 'block';\r\n prettyValueDiv.style.display = 'none';\r\n };\r\n\r\n //#endregion\r\n\r\n }\r\n\r\n //#endregion\r\n\r\n //#region Hashed plain text\r\n\r\n {\r\n\r\n if (HashedPlainTextDiv.parentElement &&\r\n HashedPlainTextDiv.parentElement.children[0])\r\n {\r\n HashedPlainTextDiv.parentElement.children[0].innerHTML = this.chargy.GetLocalizedMessage(\"Hashed payload\") + \" (\" + measurementValue.ocmfDocument.hashAlgorithm + \")\";\r\n }\r\n\r\n HashedPlainTextDiv.innerHTML = measurementValue.ocmfDocument.hashValue.match(/.{1,8}/g)?.join(\" \")\r\n ?? \"0x00000000000000000000000000000000000\";\r\n\r\n }\r\n\r\n //#endregion\r\n\r\n //#region Public key\r\n\r\n if (measurementValue.ocmfDocument.publicKey)\r\n {\r\n\r\n if (PublicKeyDiv.parentElement &&\r\n PublicKeyDiv.parentElement.children[0])\r\n {\r\n\r\n PublicKeyDiv.parentElement.children[0].innerHTML = typeof measurementValue.ocmfDocument.publicKey === 'string'\r\n ? this.chargy.GetLocalizedMessage(\"Public Key\")\r\n : this.chargy.GetLocalizedMessage(\"Public Key\") + \" (\" + measurementValue.ocmfDocument.publicKey.algorithm + \", \" +\r\n measurementValue.ocmfDocument.publicKey.encoding + \")\";\r\n\r\n }\r\n\r\n PublicKeyDiv.innerHTML = typeof measurementValue.ocmfDocument.publicKey === 'string'\r\n ? measurementValue.ocmfDocument.publicKey\r\n : \"der: \" + (measurementValue.ocmfDocument.publicKey.value?.match(/.{1,8}/g)?.join(\" \") ?? \"-\") + \"<br /><br />\" +\r\n \"x:&nbsp;&nbsp; \" + (measurementValue.ocmfDocument.publicKey.x. match(/.{1,8}/g)?.join(\" \") ?? \"-\") + \"<br />\" +\r\n \"y:&nbsp;&nbsp; \" + (measurementValue.ocmfDocument.publicKey.y. match(/.{1,8}/g)?.join(\" \") ?? \"-\");\r\n\r\n }\r\n\r\n //#endregion\r\n\r\n //#region Public key signatures (optional)\r\n\r\n if (PublicKeyDiv.parentElement &&\r\n PublicKeyDiv.parentElement.children[3])\r\n {\r\n\r\n PublicKeyDiv.parentElement.children[3].innerHTML = \"\";\r\n\r\n const result = measurementValue.result as IOCMFv1_0Result;\r\n\r\n if (result.publicKeySignatures) {\r\n\r\n for (const signature of result.publicKeySignatures)\r\n {\r\n\r\n try\r\n {\r\n\r\n const signatureDiv = PublicKeyDiv.parentElement.children[3].appendChild(document.createElement('div'));\r\n\r\n signatureDiv.innerHTML = await this.chargy.CheckMeterPublicKeySignature(\r\n measurementValue.measurement.chargingSession.chargingStation,\r\n measurementValue.measurement.chargingSession.EVSE,\r\n measurementValue.measurement.chargingSession.EVSE?.meters[0],\r\n measurementValue.measurement.chargingSession.EVSE?.meters[0]?.publicKeys?.[0],\r\n signature\r\n );\r\n\r\n }\r\n catch\r\n {\r\n console.error(\"Error while checking public key signature!\");\r\n }\r\n\r\n }\r\n\r\n }\r\n\r\n }\r\n\r\n //#endregion\r\n\r\n //#region Signature expected\r\n\r\n if (measurementValue.ocmfDocument.signature.SD)\r\n {\r\n\r\n if (SignatureExpectedDiv.parentElement &&\r\n SignatureExpectedDiv.parentElement.children[0])\r\n {\r\n SignatureExpectedDiv.parentElement.children[0].innerHTML = this.chargy.GetLocalizedMessage(\"Expected signature\") + \" (rs, hex)\";\r\n }\r\n\r\n SignatureExpectedDiv.innerHTML = \"der: \" + (measurementValue.ocmfDocument.signature.SD. match(/.{1,8}/g)?.join(\" \") ?? \"-\") + \"<br /><br />\" +\r\n \"r:&nbsp;&nbsp; \" + (measurementValue.ocmfDocument.signatureRS?.r?.toLowerCase().padStart(56, '0').match(/.{1,8}/g)?.join(\" \") ?? \"-\") + \"<br />\" +\r\n \"s:&nbsp;&nbsp; \" + (measurementValue.ocmfDocument.signatureRS?.s?.toLowerCase().padStart(56, '0').match(/.{1,8}/g)?.join(\" \") ?? \"-\");\r\n\r\n }\r\n\r\n //#endregion\r\n\r\n //#region Signature check\r\n\r\n if (measurementValue.measurement.chargingSession.verificationResult)\r\n {\r\n switch (measurementValue.measurement.chargingSession.verificationResult.status)\r\n {\r\n\r\n case chargyInterfaces.SessionVerificationResult.PublicKeyNotFound:\r\n SignatureCheckDiv.innerHTML = '<i class=\"fas fa-times-circle\"></i><div id=\"description\">' + this.chargy.GetLocalizedMessage(\"Public key not found\") + '</div>';\r\n break;\r\n\r\n case chargyInterfaces.SessionVerificationResult.InvalidPublicKey:\r\n SignatureCheckDiv.innerHTML = '<i class=\"fas fa-times-circle\"></i><div id=\"description\">' + this.chargy.GetLocalizedMessage(\"Invalid public key\") + '</div>';\r\n break;\r\n\r\n case chargyInterfaces.SessionVerificationResult.InvalidSignature:\r\n SignatureCheckDiv.innerHTML = '<i class=\"fas fa-times-circle\"></i><div id=\"description\">' + this.chargy.GetLocalizedMessage(\"Invalid signature\") + '</div>';\r\n break;\r\n\r\n case chargyInterfaces.SessionVerificationResult.ValidSignature:\r\n SignatureCheckDiv.innerHTML = '<i class=\"fas fa-check-circle\"></i><div id=\"description\">' + this.chargy.GetLocalizedMessage(\"Valid signature\") + '</div>';\r\n break;\r\n\r\n\r\n default:\r\n SignatureCheckDiv.innerHTML = '<i class=\"fas fa-times-circle\"></i><div id=\"description\">' + this.chargy.GetLocalizedMessage(\"Invalid signature\") + '</div>';\r\n break;\r\n\r\n }\r\n }\r\n\r\n //#endregion\r\n\r\n }\r\n\r\n}\r\n\r\n\r\n\r\n//#region OCMF as a well-defined JSON document\r\n\r\nexport const enum OCMFTransactionTypes\r\n{\r\n undefined = \"undefined\",\r\n fiscal = \"fiscal\",\r\n transaction = \"transaction\"\r\n}\r\n\r\nexport const enum TimeStatusTypes {\r\n unknown = \"unknown\",\r\n informative = \"informative\",\r\n syncronized = \"syncronized\",\r\n relative = \"relative\"\r\n}\r\n\r\nexport interface IOCMFLossCompensation {\r\n LN?: string,\r\n LI?: string,\r\n LR: string,\r\n LU: string\r\n}\r\n\r\nexport interface IOCMFReading {\r\n\r\n // \"RD\": [{\r\n // \"TM\": \"2019-06-26T08:57:44,337+0000 U\",\r\n // \"TX\": \"B\",\r\n // \"RV\": 268.978,\r\n // \"RI\": \"1-b:1.8.0\",\r\n // \"RU\": \"kWh\",\r\n // \"RT\": \"AC\",\r\n // \"EF\": \"\",\r\n // \"ST\": \"G\"\r\n // }]\r\n\r\n TM?: string, // Time: Specification to the system time of the reading and synchronization state.\r\n // The time is described according to ISO 8601 with a resolution of milliseconds. Accordingly, the format is according to the following scheme:\r\n // <yyyy>-<MM>-<dd>T<HH>:<mm>:<ss>,<fff><Time Zone> => 2018-07-24T13:22:04,000+0200\r\n // The indication of the time zone consists of a sign and a four-digit indication for hours and minutes.\r\n // The synchronization state consists of a capital letter as identifier. This is added to the time, separated by a space:\r\n //\r\n // Identifier Description\r\n // ------------ ------------------------------------------------------------------------------------------------------\r\n // U unknown, unsynchronized\r\n // I informative (info clock)\r\n // S synchronized\r\n // R relative time accounting with a calibration law accurate time, based on an info clock.\r\n // That means, at the beginning of the charging process, a time with informative quality was available.\r\n // During the charging process, the time (duration) was recorded in accordance with the legal metrology\r\n // requirements.\r\n\r\n TX?: string, // Transaction: Meter reading reason, reference of meter reading to transaction, noted as capital letter:\r\n // B – Begin of transaction\r\n // C – Charging = during charging (can be used optionally)\r\n // X – Exception = Error during charging, transaction continues, time and/or energy are no longer usable from this reading (incl.).\r\n // E – End of transaction, alternatively more precise codes:\r\n // L – Charging process was terminated locally\r\n // R – Charging process was terminated remotely\r\n // A – (Abort) Charging process was aborted by error\r\n // P – (Power) Charging process was terminated by power failure\r\n // S – Suspended = Transaction active, but currently not charging (can be used optionally)\r\n // T – Tariff change\r\n // This field is missing if there is no transaction reference (Fiscal Metering).\r\n\r\n RV?: Decimal, // Reading Value: The value of the meter reading.\r\n // Here the JSON data format Number is used, this allows among other things an exact marking of the valid decimal places.\r\n // However, the representation must not be transformed by further handling methods (e.g. processing by JSON parser)\r\n // (rewriting the number with a different exponent, truncation of decimal places, etc.) since this would change the\r\n // representation of the physical quantity and thus potentially the number of valid digits. According to the application\r\n // rule, it is recommended to represent the measured value with two decimal places of accuracy, if it is kWh.\r\n\r\n RI?: string, // Reading Identification: Optional identifier, which quantity was read, according to OBIS code.\r\n\r\n RU?: string, // Reading-Unit: Unit of reading, e.g. \"kWh\", \"Wh\", \"mOhm\", \"uOhm\"\r\n\r\n RT?: string, // Reading-Current-Type: The optional type of current measured by the meter, e.g. \"AC\", \"DC\"\r\n\r\n CL?: number, // Cumulated Loss: This parameter is optional and can be added only when RI is indicating an accumulation register reading. The value\r\n // reported here represents cumulated loss withdrawned from measurement when computing loss compensation on RV.\r\n // CL must be reset at TX=B. CL is given in the same unit as RV which is specified in RU.\r\n\r\n EF?: string, // Error Flags: Optional statement about which quantities are no longer usable for billing due to an error. Each character in this\r\n // string identifies a quantity. The following characters are defined: \"E\" – Energy, \"t\" – Time\r\n\r\n ST?: string // Status: State of the meter at the time of reading. Noted as abbreviation according to:\r\n //\r\n // Value Identifier Description\r\n // ------- --------------- --------------------------------------------------------------------------------\r\n // N NOT_PRESENT The meter is not present or has not been found\r\n // G OK Meter is working correctly (Good)\r\n // T TIMEOUT Timeout when trying to control the meter\r\n // D DISCONNECTED Meter was disconnected from the signature component\r\n // R NOT_FOUND Meter no longer found (has already been found at least once before) (Removed)\r\n // M MANIPULATED Manipulation detected\r\n // X EXCHANGED Meter exchanged (serial number no longer matches the last known one)\r\n // I INCOMPATIBLE Meter version or its API not compatible with signature component\r\n // O OUT_OF_RANGE Read value outside the value range\r\n // S SUBSTITUTE A substitute value was formed\r\n // E OTHER_ERROR Other, not further known error\r\n // F READ_ERROR Meter register not read correctly; value of the readout is not valid\r\n\r\n}\r\n\r\nexport interface IOCMFSignature {\r\n\r\n // {\r\n // \"SA\": \"ECDSA-secp256r1-SHA256\",\r\n // \"SD\": \"304402201455BF1082C9EB8B1272D7FA838EB44286B03AC96E8BAFC5E79E30C5B3E1B872022006286CA81AEE0FAFCB1D6A137FFB2C0DD014727E2AEC149F30CD5A7E87619139\"\r\n // }\r\n\r\n SA?: string, // Signature Algorithm: Optionally selects the algorithm used to create the signature. This includes the signature algorithm, its parameters, and the hash algorithm\r\n // that will be applied to the data to be signed. If it is omitted, the default value is effective.\r\n // ECDSA-secp256r1-SHA256 is the default since OCMF Version 0.4.\r\n //\r\n // Identifier Signature Algorithm Curve Name and Synonyms Key Length Hash Algorithm Block Length\r\n // ---------------------------------- --------------------- ------------------------------------------------------------- ------------ ---------------- --------------\r\n // ECDSA-secp192k1-SHA256 ECDSA secp192k1 192 bit SHA-256 48\r\n // ECDSA-secp256k1-SHA256 ECDSA secp256k1 256 bit SHA-256 64\r\n // ECDSA-secp192r1-SHA256 ECDSA secp192r1 192 bit SHA-256 48\r\n // ECDSA-secp256r1-SHA256 (default) ECDSA secp256r1, NIST P-256, ANSI X9.62 elliptic curve prime256v1 256 bit SHA-256 64\r\n // ECDSA-brainpool256r1-SHA256 ECDSA brainpool256r1 256 bit SHA-256 64\r\n // ECDSA-secp384r1-SHA256 ECDSA secp384r1, NIST P-384, ANSI X9.62 elliptic curve prime384v1 384 bit SHA-256 96\r\n // ECDSA-brainpool384r1-SHA256 ECDSA brainpool384r1 384 bit SHA-256 96\r\n\r\n // Note: The hash algorithms for 384++ key lengths should be SHA-384 and SHA-512, not SHA-256 to match the security levels of the official crypto standards!\r\n\r\n SE?: string, // Signature Encoding: Optionally indicates how the signature data is encoded to be stored in the JSON string.\r\n // If it is omitted, the default value is effective.\r\n // The following values are possible:\r\n // hex: The signature data is represented in the JSON string in hexadecimal encoding (default)\r\n // base64: The signature data is base64 encoded in the JSON string.\r\n\r\n SM?: string, // Signature Mime Type: Optionally indicates how the signature data is to be interpreted.\r\n // If it is omitted, the default value is effective.\r\n // The following values are possible:\r\n // application/x-der: DER encoded ASN.1 structure (default)\r\n\r\n SD: string // Signature Data: The actual signature data according to the format specification above.\r\n\r\n\r\n //#region Components in subsequent processing of data\r\n\r\n A?: unknown, // Any JSON property starting with \"A\" is reserved for components in subsequent processing of data.\r\n B?: unknown, // Any JSON property starting with \"B\" is reserved for components in subsequent processing of data.\r\n C?: unknown, // Any JSON property starting with \"C\" is reserved for components in subsequent processing of data.\r\n D?: unknown, // Any JSON property starting with \"D\" is reserved for components in subsequent processing of data.\r\n E?: unknown, // Any JSON property starting with \"E\" is reserved for components in subsequent processing of data.\r\n F?: unknown, // Any JSON property starting with \"F\" is reserved for components in subsequent processing of data.\r\n\r\n //#endregion\r\n\r\n //#region Manufacturer Specific Data\r\n\r\n U?: unknown, // Any JSON property starting with \"U\" is reserved for manufacturer-specific data.\r\n V?: unknown, // Any JSON property starting with \"V\" is reserved for manufacturer-specific data.\r\n W?: unknown, // Any JSON property starting with \"W\" is reserved for manufacturer-specific data.\r\n X?: unknown, // Any JSON property starting with \"X\" is reserved for manufacturer-specific data.\r\n Y?: unknown, // Any JSON property starting with \"Y\" is reserved for manufacturer-specific data.\r\n Z?: unknown, // Any JSON property starting with \"Z\" is reserved for manufacturer-specific data.\r\n\r\n //#endregion\r\n\r\n}\r\n\r\nexport interface IOCMFPayload {\r\n\r\n // Source: https://github.com/SAFE-eV/OCMF-Open-Charge-Metering-Format/blob/master/OCMF-en.md\r\n\r\n // {\r\n // \"FV\": \"1.0\",\r\n // \"GI\": \"SEAL AG\",\r\n // \"GS\": \"1850006a\",\r\n // \"GV\": \"1.34\",\r\n //\r\n // \"PG\": \"T9289\",\r\n //\r\n // \"MV\": \"Carlo Gavazzi\",\r\n // \"MM\": \"EM340-DIN.AV2.3.X.S1.PF\",\r\n // \"MS\": \"******240084S\",\r\n // \"MF\": \"B4\",\r\n //\r\n // \"IS\": true,\r\n // \"IL\": \"TRUSTED\",\r\n // \"IF\": [\"OCCP_AUTH\"],\r\n // \"IT\": \"ISO14443\",\r\n // \"ID\": \"56213C05\",\r\n //\r\n // \"RD\": [...]\r\n //\r\n // }\r\n\r\n //#region General Information\r\n\r\n FV?: string, // Format Version: Optional version of the data format in the representation.\r\n // The version specification is coded according to the version of this document, i.e. 0.4 corresponds to major 0 and minor 4.\r\n // The revision (third digit) is not transmitted, since this does not change anything in the format itself.\r\n GI?: string, // Gateway Identification: Optional identifier of the manufacturer for the system which has generated the present data (manufacturer, model, variant, etc.).\r\n VI?: string, // Vendor Identification: Legacy OCMF 0.1 name for the manufacturer/system identification. Newer OCMF versions use GI.\r\n GS?: string, // Gateway Serial: Optional serial number of the above mentioned system. This field is __conditionally mandatory__!\r\n GV?: string, // Gateway Version: Optional version designation of the manufacturer for the software of the above mentioned system.\r\n VV?: string, // Vendor Version: Legacy OCMF 0.1 name for the software version. Newer OCMF versions use GV.\r\n\r\n //#endregion\r\n\r\n //#region Pagination\r\n\r\n PG: string, // Pagination: Pagination of the entire data set, i.e. the data that is combined in one signature. Format: <indicator><number>\r\n // The string is composed of an identifying letter for the context and a number without leading zeros.\r\n // There is a separate independent pagination counter for each context.\r\n // The following indicators are defined:\r\n // T: Transaction Readings in transaction reference (mandatory)\r\n // F: Fiscal Readings independent of transactions (optional)\r\n // The respective pagination counter is incremented after each use for a record.\r\n\r\n //#endregion\r\n\r\n //#region Meter Identification\r\n\r\n MV?: string, // Meter Vendor: Optional manufacturer identification of the meter, name of the manufacturer.\r\n MM?: string, // Meter Model: Optional model identification of the meter.\r\n MS?: string, // Meter Serial: Serial number of the meter.\r\n // The field table marks MS as mandatory, but the OCMF relation-of-serial-numbers section makes the\r\n // gateway and meter serial numbers conditionally mandatory depending on the hardware design.\r\n // KEBA KCP30 OCMF 1.0 data can contain GS without MS. Keep GS/MS semantically separate and use\r\n // GS only as the CTR meter identifier fallback when MS is absent.\r\n MF?: string, // Meter Firmware: Optional firmware version of the meter.\r\n\r\n //#endregion\r\n\r\n //#region User Assignment\r\n\r\n IS: boolean|string, // Identification Status: General status for user assignment:\r\n // true: User successfully assigned\r\n // false: User not assigned\r\n // OCMF 0.1 SAFE samples use status strings such as \"VERIFIED\". Keep this accepted for\r\n // legacy verification while preserving boolean OCMF 1.x values.\r\n\r\n IL?: string, // Identification Level: Optional encoded overall status of the user assignment, represented by an identifier:\r\n //\r\n // Group Status/Error Description\r\n // ------------------------------ --------------- ----------------------------------------------------------------------------------------\r\n // not available - The field is not specified.\r\n // status without assignment NONE There is no user assignment. The other data for user assignment have no significance.\r\n // status with assignment HEARSAY The assignment is unsecured; e.g. by reading an RFID UID.\r\n // TRUSTED The mapping can be trusted to some extent, but there is no absolute reliability.\r\n // Example: Authorization by backend.\r\n // VERIFIED The assignment has been verified by the signature component and special measures.\r\n // CERTIFIED The assignment was verified by the signature component using a cryptographic signature\r\n // that certifies the assignment.\r\n // SECURE The mapping was established by a secure feature\r\n // (e.g. secure RFID card, ISO 15118 with plug and charge, etc.).\r\n // Error MISMATCH Error; UIDs do not match.\r\n // INVALID Error; certificate not correct (check negative).\r\n // OUTDATED Error; referenced trust certificate expired.\r\n // UNKNOWN Certificate could not be successfully verified (no matching trust certificate found).\r\n\r\n IF?: string[], // Identification Flags: An optional enumeration of detailed statements about the user assignment, represented by one or more identifiers.\r\n // The identifiers are always noted as string elements in an array.\r\n // Also one or no element must be noted as an array.\r\n //\r\n // Note: Some vendors send a null value in the case of an empty array, others do not sent the field at all.\r\n //\r\n // RFID_NONE No assignment via RFID\r\n // RFID_PLAIN Assignment via external RFID card reader\r\n // RFID_RELATED Assignment via protected RFID card reader\r\n // RFID_PSK A previously known shared key (pre-shared key) was used, e.g. with a secured RFID card.\r\n //\r\n // OCPP_NONE No user assignment by OCPP\r\n // OCPP_RS Assignment by OCPP RemoteStart method\r\n // OCPP_AUTH Assignment by OCPP Authorize method\r\n // OCPP_RS_TLS Assignment by OCPP RemoteStart method, obtained via a secured TLS connection.\r\n // OCPP_AUTH_TLS Assignment by OCPP Authorize method, obtained via a secured TLS connection.\r\n // OCPP_CACHE Assignment by authorization cache of OCPP\r\n // OCPP_WHITELIST Assignment by whitelist from OCPP\r\n // OCPP_CERTIFIED A certificate of the backend was used which certifies the user mapping.\r\n //\r\n // ISO15118_NONE no user assignment by ISO 15118\r\n // ISO15118_PNC Plug & Charge was used\r\n //\r\n // PLMN_NONE no user assignment\r\n // PLMN_RING call\r\n // PLMN_SMS short message\r\n\r\n IT?: string, // Identification Type: Describes the possible types of user mappings, which can be used in the Type field as unsigned integer in the Type field.\r\n // The OCMF table lists IT as 1..1 for transaction-related user assignment. Some OCMF 1.0\r\n // implementations, including KEBA KCP30 samples, omit IT when IS is false and ID is empty.\r\n // We accept this as a compatibility case and map it to an explicit unknown contract type in the CTR.\r\n // These mappings are based on the specifications from OCPP. OCPP currently (version 1.5) only provides 20 characters for the\r\n // identification feature. In accordance with the maximum length of an IBAN (34 characters) allocations of up to 40 bytes\r\n // have been provided for the data area.\r\n //\r\n // Token Identifier Description\r\n // ------- --------------- -------------------------------------------------------\r\n // 0 NONE No assignment available\r\n // 1 DENIED Assignment currently not available (due to two-factor a\r\n // 2 UNDEFINED Type not specified\r\n // 10 ISO14443 UID of an RFID card according to ISO 14443. Represented\r\n // 11 ISO15693 UID of an RFID card according to ISO 15693. Represented\r\n // 20 EMAID Electro-Mobility-Account-ID according to ISO/IEC 15118 \r\n // 21 EVCCID ID of an electric vehicle according to ISO/IEC 15118 (m\r\n // 30 EVCOID EV Contract ID according to DIN 91286.\r\n // 40 ISO7812 Identification card format according to ISO/IEC 7812 (c\r\n // 50 CARD_TXN_NR Card transaction number (CardTxNbr) for a payment with \r\n // 60 CENTRAL Centrally generated ID. No exact format defined, can be\r\n // 61 CENTRAL_1 Centrally generated ID, e.g. by start via SMS. No exact\r\n // 62 CENTRAL_2 Centrally generated ID, e.g. by operator start. No exac\r\n // 70 LOCAL Locally generated ID. No exact format defined, might be\r\n // 71 LOCAL_1 Locally generated ID, e.g. ID generated internally by t\r\n // 72 LOCAL_2 Locally generated ID, for other cases. No exact format \r\n // 80 PHONE_NUMBER International phone number with leading \"+\".\r\n // 90 KEY_CODE User-related private key code. No exact format defined.\r\n\r\n ID?: string, // Identification Data: The actual identification data according to the <Identification Type>, e.g. a hex-coded UID according to ISO 14443.\r\n\r\n TT?: string, // Tariff Text: An optional textual description used to identify a unique tariff.\r\n // This field is intended for the tariff designation in \"Direct Payment\" use case.\r\n\r\n //#endregion\r\n\r\n //#region EVSE Metrologic parameters\r\n\r\n CF?: string, // Controller Firmware: Firmware version of the charge controller on the EVSE.\r\n // This optional value is, e.g., required by (some) notified bodies to ensure traceability of any OCMF data set to the\r\n // documentation of the corresponding Schalt-Mess-Koordination (\"switch-measure-coordination\").\r\n\r\n LC?: IOCMFLossCompensation, // Loss Compensation: Optional characteristics of EVSE's charging cable used for identifying and processing cable loss compensation algorithm.\r\n // The cable loss data consists in an object under the key \"LC\". It shall contain Cable Resistance value and may contain optional traceability\r\n // parameters, as explained in following table.\r\n //\r\n // Key Type Cardinality Description\r\n // -- -------------- -------------- ---------------------------------------------------------------------------------------------------------------------------------\r\n // LN String (0..20) 0..1 Optional Loss compensation Naming\r\n // A meter can use this value for adding a traceability text for justifying cable loss characteristics.\r\n // LI Number 0..1 Optional Loss compensation Identification\r\n // A meter can use this value for adding a traceability ID number for justifying cable loss characteristics\r\n // from a lookup table specified in meter's documentation.\r\n // LR Number 1..1 Loss compensation cable Resistance\r\n // A meter shall use this value for specifying the cable resistance value used in cable Loss compensation computation.\r\n // LU Number 1..1 Loss compensation cable resistance Unit\r\n // A meter shall use this field for specifying the unit of cable resistance value given by LR field used in cable loss\r\n // compensation computation. The unit of this value can be traced in OCMF format in addition to meter's documentation.\r\n // Allowed values are milliohm or microohm:\r\n // - The LU value for milliohm shall be \"mOhm\".\r\n // - The LU value for microohm shall be \"µOhm\".\r\n\r\n //#endregion\r\n\r\n //#region Assignment of the Charge Point\r\n\r\n CT?: string, // Charge Point Type: Optional type of the specification for the identification of the charge point:\r\n //\r\n // Identifier Description\r\n // ------------ ----------------------------------------------------------------------------------------------------------\r\n // EVSEID EVSE ID\r\n // CBIDC Charge box ID and connector ID according to OCPP, a space is used as field separator, e.g. „STEVE_01 1“.\r\n\r\n CI?: string, // Charge Point Identification: Optional identification information for the charge point.\r\n\r\n //#endregion\r\n\r\n //#region Readings\r\n\r\n RD: Array<IOCMFReading>,\r\n\r\n //#endregion\r\n\r\n\r\n //#region Manufacturer Specific Data\r\n\r\n U?: unknown, // Any JSON property starting with \"U\" is reserved for manufacturer-specific data.\r\n V?: unknown, // Any JSON property starting with \"V\" is reserved for manufacturer-specific data.\r\n W?: unknown, // Any JSON property starting with \"W\" is reserved for manufacturer-specific data.\r\n X?: unknown, // Any JSON property starting with \"X\" is reserved for manufacturer-specific data.\r\n Y?: unknown, // Any JSON property starting with \"Y\" is reserved for manufacturer-specific data.\r\n Z?: unknown, // Any JSON property starting with \"Z\" is reserved for manufacturer-specific data.\r\n\r\n //#endregion\r\n\r\n}\r\n\r\nexport interface IOCMFJSONDocument {\r\n\r\n \"@context\": string|string[],\r\n\r\n raw?: string, // The raw OCMF document is used for visualization only.\r\n rawPayload?: string, // The raw OCMF payload can be used for calculating the signature, as OCMF does\r\n // not define a canonical format for calculating the signature which prevents a\r\n // meaningful interoperability of the signature verification process!\r\n // When the payload JSON was canonicalized, the rawPayload field is not needed.\r\n hashAlgorithm: string,\r\n hashValue: string,\r\n\r\n payload: IOCMFPayload,\r\n signature: IOCMFSignature,\r\n signatureRS?: chargyInterfaces.ISignatureRS,\r\n publicKey?: string|chargyInterfaces.IPublicKeyXY,\r\n publicKeyEncoding?: string,\r\n\r\n validationStatus?: chargyInterfaces.VerificationResult\r\n\r\n}\r\n\r\n//#endregion\r\n\r\n//#region OCMF Charge Transparency Record Extensions\r\n\r\nexport interface IOCMFMeasurementValue extends chargeTransparencyRecord.IMeasurementValue\r\n{\r\n measurement?: IOCMFMeasurement;\r\n timeSync: string;\r\n transaction?: string;\r\n transactionType: OCMFTransactionTypes;\r\n pagination: number;\r\n errorFlags?: string;\r\n cumulatedLoss?: Decimal;\r\n status: string;\r\n ocmfDocument?: IOCMFJSONDocument;\r\n}\r\n\r\nexport interface IOCMFMeasurement extends chargeTransparencyRecord.IMeasurement\r\n{\r\n currentType?: string;\r\n values: Array<IOCMFMeasurementValue>;\r\n}\r\n\r\nexport interface IOCMFAuthorization extends chargyInterfaces.IAuthorization\r\n{\r\n identificationStatus?: boolean|string;\r\n identificationLevel?: string;\r\n identificationFlags?: Array<string>;\r\n}\r\n\r\nexport interface IOCMFChargingSession extends chargeTransparencyRecord.IChargingSession\r\n{\r\n internalSessionId?: string;\r\n authorizationStart: IOCMFAuthorization;\r\n meter?: chargyInterfaces.IMeter;\r\n measurements: Array<IOCMFMeasurement>;\r\n}\r\n\r\nexport interface IOCMFCTRExtensions {\r\n formatVersion?: string,\r\n gatewayInformation?: string,\r\n gatewaySerial?: string,\r\n gatewayVersion?: string\r\n}\r\n\r\nexport interface IOCMFChargeTransparencyRecord extends chargeTransparencyRecord.IChargeTransparencyRecord\r\n{\r\n ocmf?: IOCMFCTRExtensions;\r\n chargingSessions?: Array<IOCMFChargingSession>;\r\n}\r\n\r\n//#endregion\r\n\r\nexport class OCMF {\r\n\r\n private readonly chargy: Chargy;\r\n\r\n constructor(chargy: Chargy) {\r\n this.chargy = chargy;\r\n }\r\n\r\n //#region (private) tryToParseOCMFv1_0(OCMFDataList, ContainerInfos?)\r\n\r\n private tryToParseOCMFv1_0(OCMFJSONDocuments: IOCMFJSONDocument[],\r\n ContainerInfos?: unknown)\r\n\r\n : IOCMFChargeTransparencyRecord |\r\n chargyInterfaces.ISessionCryptoResult\r\n\r\n {\r\n\r\n try\r\n {\r\n\r\n //#region Container infos, e.g. from a surrounding SAFE XML container\r\n\r\n // The container infos are optional and provided by the surrounding\r\n // container parsers (SAFE XML, OCPI, chargeIT, ...). They describe\r\n // the charging station, EVSE and connector of the charging session\r\n // and will be merged into the resulting charge transparency record.\r\n const containerInfos = chargyLib.asJSONObject(ContainerInfos) ?? {};\r\n const chargingStationInfo = chargyLib.asJSONObject(containerInfos[\"chargingStation\"]);\r\n const evseInfo = chargyLib.asJSONObject(containerInfos[\"EVSE\"]);\r\n const connectorInfo = chargyLib.asJSONObject(containerInfos[\"connector\"]);\r\n const energyMeterInfo = chargyLib.asJSONObject(containerInfos[\"energyMeter\"]);\r\n\r\n const chargingStationId = chargyLib.asString(containerInfos[\"ChargingStationId\"])\r\n ?? chargyLib.asString(chargingStationInfo?.[\"@id\"])\r\n ?? \"DE*GEF*STATION*CHARGY*1\";\r\n\r\n const evseId = chargyLib.asString(containerInfos[\"EVSEId\"])\r\n ?? chargyLib.asString(evseInfo?.[\"@id\"])\r\n ?? \"DE*GEF*EVSE*CHARGY*1\";\r\n\r\n const stationDescription = chargyLib.asJSONObject(chargingStationInfo?.[\"description\"]) as chargyInterfaces.IMultilanguageText | undefined;\r\n const evseDescription = chargyLib.asJSONObject(evseInfo?.[\"description\"]) as chargyInterfaces.IMultilanguageText | undefined;\r\n\r\n //#endregion\r\n\r\n const firstOCMDJSONDocument = OCMFJSONDocuments[0];\r\n\r\n if (firstOCMDJSONDocument != undefined)\r\n {\r\n\r\n //#region General Information\r\n\r\n const formatVersion = firstOCMDJSONDocument.payload.FV;\r\n const gatewayInformation = firstOCMDJSONDocument.payload.GI ?? firstOCMDJSONDocument.payload.VI;\r\n const gatewaySerial = firstOCMDJSONDocument.payload.GS;\r\n const gatewayVersion = firstOCMDJSONDocument.payload.GV ?? firstOCMDJSONDocument.payload.VV;\r\n\r\n //#endregion\r\n\r\n //#region Pagination\r\n\r\n const paging = firstOCMDJSONDocument.payload.PG;\r\n\r\n //#endregion\r\n\r\n //#region Meter Identification\r\n\r\n const meterVendor = firstOCMDJSONDocument.payload.MV;\r\n const meterModel = firstOCMDJSONDocument.payload.MM;\r\n const meterSerial = firstOCMDJSONDocument.payload.MS;\r\n const effectiveMeterSerial = meterSerial ?? gatewaySerial;\r\n const meterFirmware = firstOCMDJSONDocument.payload.MF;\r\n\r\n //#endregion\r\n\r\n //#region User Assignment\r\n\r\n const identificationStatus = firstOCMDJSONDocument.payload.IS;\r\n const identificationLevel = firstOCMDJSONDocument.payload.IL;\r\n const identificationFlags = firstOCMDJSONDocument.payload.IF;\r\n const identificationType = firstOCMDJSONDocument.payload.IT;\r\n const identificationData = firstOCMDJSONDocument.payload.ID;\r\n const tariffText = firstOCMDJSONDocument.payload.TT;\r\n\r\n //#endregion\r\n\r\n //#region EVSE Metrologic parameters\r\n\r\n const controlerFirmwareVersion = firstOCMDJSONDocument.payload.CF;\r\n const lossCompensation = firstOCMDJSONDocument.payload.LC;\r\n\r\n //#endregion\r\n\r\n //#region Assignment of the Charge Point\r\n\r\n const chargePointIdType = firstOCMDJSONDocument.payload.CT;\r\n const chargePointId = firstOCMDJSONDocument.payload.CI;\r\n\r\n //#endregion\r\n\r\n if (chargyLib.isOptionalString (formatVersion) &&\r\n chargyLib.isOptionalString (gatewayInformation) &&\r\n chargyLib.isOptionalString (gatewaySerial) &&\r\n chargyLib.isOptionalString (gatewayVersion) &&\r\n\r\n chargyLib.isMandatoryString (paging) &&\r\n\r\n chargyLib.isOptionalString (meterVendor) &&\r\n chargyLib.isOptionalString (meterModel) &&\r\n // OCMF 1.0 table 3 lists MS as 1..1, but the later \"Relation of Serial Numbers,\r\n // Charge Point and Public Key\" section makes the serial-number fields conditionally\r\n // mandatory. KEBA KCP30 records identify the signing gateway via GS and omit MS.\r\n // Therefore we keep meterSerial and gatewaySerial separate, but require at least one\r\n // usable serial number for the CTR meter identity.\r\n chargyLib.isMandatoryString (effectiveMeterSerial) &&\r\n chargyLib.isOptionalString (meterFirmware) &&\r\n\r\n // OCMF 1.x uses boolean IS values. OCMF 0.1 SAFE reference data used status strings\r\n // such as \"VERIFIED\", so accept both forms and preserve the original value in the CTR.\r\n (chargyLib.isMandatoryBoolean (identificationStatus) ||\r\n chargyLib.isMandatoryString (identificationStatus)) &&\r\n chargyLib.isOptionalString (identificationLevel) &&\r\n //chargyLib.isMandatoryArrayOfStrings (identificationFlags) &&\r\n chargyLib.isOptionalArrayOfStrings (identificationFlags) && // Note: Some vendors do not use this MANDATORY field!\r\n // IT is 1..1 in the user-assignment table for transaction records. Some OCMF 1.0\r\n // implementations omit it when no user is assigned (IS=false, ID empty). We tolerate\r\n // this vendor compatibility case instead of rejecting otherwise valid signatures.\r\n chargyLib.isOptionalString (identificationType) &&\r\n chargyLib.isOptionalString (identificationData) &&\r\n chargyLib.isOptionalString (tariffText) &&\r\n\r\n chargyLib.isOptionalString (controlerFirmwareVersion) &&\r\n chargyLib.isOptionalJSONObject (lossCompensation) &&\r\n\r\n chargyLib.isOptionalString (chargePointIdType) &&\r\n chargyLib.isOptionalString (chargePointId))\r\n {\r\n\r\n //#region Validate pagination and transaction type\r\n\r\n const paginationPrefix = paging.length > 0\r\n ? paging[0]?.toLowerCase()\r\n : null;\r\n const transactionType = paginationPrefix === 't'\r\n ? OCMFTransactionTypes.transaction\r\n : paginationPrefix === 'f'\r\n ? OCMFTransactionTypes.fiscal\r\n : OCMFTransactionTypes.undefined;\r\n const pagination = paging.length > 1\r\n ? chargyLib.parseNumber(paging.substring(1))\r\n : null;\r\n\r\n if (transactionType === OCMFTransactionTypes.undefined) return {\r\n status: chargyInterfaces.SessionVerificationResult.InvalidSessionFormat,\r\n message: this.chargy.GetLocalizedMessage(\"The given OCMF data does not have a valid transaction type!\"),\r\n certainty: 0\r\n }\r\n\r\n if (!chargyLib.isMandatoryNumber(pagination)) return {\r\n status: chargyInterfaces.SessionVerificationResult.InvalidSessionFormat,\r\n message: this.chargy.GetLocalizedMessage(\"The given OCMF data does not have a valid pagination counter!\"),\r\n certainty: 0\r\n }\r\n\r\n //#endregion\r\n\r\n if (firstOCMDJSONDocument.payload.RD.length == 0) return {\r\n status: chargyInterfaces.SessionVerificationResult.InvalidSessionFormat,\r\n message: this.chargy.GetLocalizedMessage(\"Each OCMF data set must have at least one meter reading!\"),\r\n certainty: 0\r\n }\r\n\r\n const CTR:IOCMFChargeTransparencyRecord = {\r\n\r\n \"@id\": \"?\",\r\n \"@context\": \"https://open.charging.cloud/contexts/CTR+json\",\r\n //\"@context\": [ \"https://open.charging.cloud/contexts/CTR+json\", \"https://open.charging.cloud/contexts/CTR_OCMF+json\" ],\r\n \"begin\": \"?\",\r\n \"end\": \"?\",\r\n \"description\": {\r\n \"de\": \"Alle OCMF-Ladevorgänge\"\r\n },\r\n\r\n \"contract\": {\r\n \"@id\": identificationData ?? \"?\",\r\n \"type\": identificationType ?? \"?\"\r\n },\r\n\r\n \"ocmf\": {\r\n \"formatVersion\": formatVersion,\r\n \"gatewayInformation\": gatewayInformation,\r\n \"gatewaySerial\": gatewaySerial,\r\n \"gatewayVersion\": gatewayVersion\r\n },\r\n\r\n // \"chargingStationOperators\": [{\r\n\r\n \"chargingPools\": [{\r\n \"@id\": \"DE*GEF*POOL*CHARGY*1\",\r\n \"description\": { \"en\": \"GraphDefined CHARGY Virtual Charging Pool 1\" },\r\n\r\n \"chargingStations\": [{\r\n \"@id\": chargingStationId,\r\n \"description\": stationDescription && Object.keys(stationDescription).length > 0\r\n ? stationDescription\r\n : { \"en\": \"GraphDefined CHARGY Virtual Charging Station 1\" },\r\n \"firmwareVersion\": chargyLib.asString(chargingStationInfo?.[\"softwareVersion\"])\r\n ?? chargyLib.asString(chargingStationInfo?.[\"firmwareVersion\"]),\r\n \"geoLocation\": chargyLib.asJSONObject(chargingStationInfo?.[\"geoLocation\"]) as chargyInterfaces.IGeoLocation | undefined,\r\n \"address\": chargyLib.asJSONObject(chargingStationInfo?.[\"address\"]) as chargyInterfaces.IAddress | undefined,\r\n\r\n \"EVSEs\": [{\r\n \"@id\": evseId,\r\n \"description\": evseDescription && Object.keys(evseDescription).length > 0\r\n ? evseDescription\r\n : { \"en\": \"GraphDefined CHARGY Virtual EVSE 1\" },\r\n \"connectors\": connectorInfo\r\n ? [{\r\n \"type\": chargyLib.asString(connectorInfo[\"type\"]) ?? \"\",\r\n \"looses\": chargyLib.asNumber(connectorInfo[\"looses\"]) ?? 0\r\n }]\r\n : undefined,\r\n \"meters\": [{\r\n \"@id\": effectiveMeterSerial,\r\n // The signed OCMF payload values always win,\r\n // the container infos only fill the gaps!\r\n \"manufacturer\": meterVendor ?? chargyLib.asString(energyMeterInfo?.[\"manufacturer\"]),\r\n \"manufacturerURL\": chargyLib.asString(energyMeterInfo?.[\"manufacturerURL\"]),\r\n \"model\": meterModel ?? chargyLib.asString(energyMeterInfo?.[\"model\"]),\r\n \"modelURL\": chargyLib.asString(energyMeterInfo?.[\"modelURL\"]),\r\n \"hardwareVersion\": chargyLib.asString(energyMeterInfo?.[\"hardwareVersion\"]),\r\n \"firmwareVersion\": meterFirmware ?? chargyLib.asString(energyMeterInfo?.[\"firmwareVersion\"]),\r\n \"signatureFormat\": \"https://open.charging.cloud/contexts/EnergyMeterSignatureFormats/OCMFv1.0+json\",\r\n \"publicKeys\": [{\r\n \"algorithm\": \"?\",\r\n \"encoding\": \"?\",\r\n \"format\": \"?\",\r\n \"value\": \"?\",\r\n }]\r\n }]\r\n\r\n }],\r\n\r\n }]\r\n\r\n }],\r\n\r\n \"chargingSessions\": [{\r\n\r\n \"@id\": \"1554181214441:-1965658344385548683:2\",\r\n \"@context\": \"https://open.charging.cloud/contexts/SessionSignatureFormats/OCMFv1.0+json\",\r\n \"begin\": \"?\",\r\n \"end\": \"?\",\r\n \"EVSEId\": evseId,\r\n\r\n \"authorizationStart\": {\r\n \"@id\": identificationData ?? \"?\",\r\n \"type\": identificationType ?? \"?\",\r\n \"identificationStatus\": identificationStatus,\r\n \"identificationLevel\": identificationLevel,\r\n \"identificationFlags\": identificationFlags ?? [] // Note: The OCMF documentation expects an empty array!\r\n },\r\n\r\n \"measurements\": [ ]\r\n\r\n }],\r\n\r\n \"certainty\": 1\r\n\r\n };\r\n\r\n const measurementsByKey = new Map<string, IOCMFMeasurement>();\r\n\r\n for (const ocmfJSONDocument of OCMFJSONDocuments)\r\n {\r\n\r\n // ToDo: Validate the pagination!\r\n\r\n let inheritedReading: Partial<IOCMFReading> = {};\r\n\r\n for (const reading of ocmfJSONDocument.payload.RD)\r\n {\r\n\r\n //#region Data\r\n\r\n // OCMF allows fields with the same value as the previous reading to be omitted,\r\n // but only within the same signed OCMF record. KEBA KCP30 OCMF 1.0 data uses this\r\n // for the third reading in a record: it contains a different OBIS value, but omits\r\n // TM/TX/EF/ST. Treating such readings as invalid or skipping them would lose a\r\n // signed value even though the standard describes this carry-forward rule.\r\n const effectiveReading = { ...inheritedReading, ...reading };\r\n\r\n const time = effectiveReading.TM;\r\n const transaction = effectiveReading.TX;\r\n const readingValue = effectiveReading.RV;\r\n const readingIdentification = effectiveReading.RI;\r\n const readingUnit = effectiveReading.RU;\r\n const readingCurrentType = effectiveReading.RT;\r\n const cumulatedLoss = effectiveReading.CL;\r\n const errorFlags = effectiveReading.EF;\r\n const status = effectiveReading.ST;\r\n\r\n inheritedReading = effectiveReading;\r\n\r\n //#endregion\r\n\r\n if (chargyLib.isMandatoryString (time) &&\r\n chargyLib.isOptionalString (transaction) &&\r\n chargyLib.isMandatoryDecimal (readingValue) && // Note: Some vendors use a JSON string here!\r\n chargyLib.isOptionalString (readingIdentification) &&\r\n chargyLib.isMandatoryString (readingUnit) &&\r\n chargyLib.isOptionalString (readingCurrentType) &&\r\n chargyLib.isOptionalDecimal (cumulatedLoss) &&\r\n chargyLib.isOptionalString (errorFlags) &&\r\n chargyLib.isMandatoryString (status))\r\n {\r\n\r\n //#region Meter Reading Validation\r\n\r\n const timeSplit = time.split(\" \");\r\n\r\n if (timeSplit.length != 2) return {\r\n status: chargyInterfaces.SessionVerificationResult.InvalidSessionFormat,\r\n message: this.chargy.GetLocalizedMessage(\"The given OCMF meter value does not have a valid time format!\"),\r\n certainty: 0\r\n }\r\n\r\n const timeRegEx = /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2},\\d{3}[+-]\\d{4}$/;\r\n const timeStamp = timeSplit[0];\r\n\r\n if (!chargyLib.isMandatoryString (timeStamp) || !timeRegEx.test(timeStamp)) return {\r\n status: chargyInterfaces.SessionVerificationResult.InvalidSessionFormat,\r\n message: this.chargy.GetLocalizedMessage(\"The given OCMF meter value does not have a valid time sync format!\"),\r\n certainty: 0\r\n }\r\n\r\n const timeStampISO8601 = this.convertToISO8601(timeStamp);\r\n const timeSyncText = timeSplit[1];\r\n let timeSync = TimeStatusTypes.unknown;\r\n\r\n if (!chargyLib.isMandatoryString (timeSyncText) || ![\"U\", \"I\", \"S\", \"R\"].includes(timeSyncText)) return {\r\n status: chargyInterfaces.SessionVerificationResult.InvalidSessionFormat,\r\n message: this.chargy.GetLocalizedMessage(\"The given OCMF meter value does not have a valid time sync format!\"),\r\n certainty: 0\r\n }\r\n\r\n switch (timeSyncText) {\r\n\r\n case \"U\":\r\n timeSync = TimeStatusTypes.unknown;\r\n break;\r\n\r\n case \"I\":\r\n timeSync = TimeStatusTypes.informative;\r\n break;\r\n\r\n case \"S\":\r\n timeSync = TimeStatusTypes.syncronized;\r\n break;\r\n\r\n case \"R\":\r\n timeSync = TimeStatusTypes.relative;\r\n break;\r\n\r\n default:\r\n return {\r\n status: chargyInterfaces.SessionVerificationResult.InvalidSessionFormat,\r\n message: this.chargy.GetLocalizedMessage(\"The given OCMF meter value does not have a valid time sync format!\"),\r\n certainty: 0\r\n }\r\n\r\n }\r\n\r\n if (transaction && ![\"B\", \"C\", \"X\", \"E\", \"L\", \"R\", \"A\", \"P\", \"S\", \"T\"].includes(transaction)) return {\r\n status: chargyInterfaces.SessionVerificationResult.InvalidSessionFormat,\r\n message: this.chargy.GetLocalizedMessage(\"The given OCMF meter value does not have a valid transaction type!\"),\r\n certainty: 0\r\n }\r\n\r\n if (![\"kWh\", \"Wh\", \"mOhm\", \"uOhm\"].includes(readingUnit)) return {\r\n status: chargyInterfaces.SessionVerificationResult.InvalidSessionFormat,\r\n message: this.chargy.GetLocalizedMessage(\"The given OCMF meter value does not have a valid current type!\"),\r\n certainty: 0\r\n }\r\n\r\n if (readingCurrentType && ![\"AC\", \"DC\"].includes(readingCurrentType)) return {\r\n status: chargyInterfaces.SessionVerificationResult.InvalidSessionFormat,\r\n message: this.chargy.GetLocalizedMessage(\"The given OCMF meter value does not have a valid current type!\"),\r\n certainty: 0\r\n }\r\n\r\n //#endregion\r\n\r\n if (CTR.chargingSessions?.[0]?.begin === \"?\")\r\n CTR.chargingSessions[0].begin = timeStampISO8601;\r\n\r\n CTR.chargingSessions![0]!.end = timeStampISO8601;\r\n\r\n const measurementKey = [\r\n readingIdentification ?? \"?\",\r\n readingUnit,\r\n readingCurrentType ?? \"\"\r\n ].join(\"|\");\r\n\r\n let measurement = measurementsByKey.get(measurementKey);\r\n\r\n if (measurement == null)\r\n {\r\n\r\n measurement = {\r\n \"name\": chargyLib.OBIS2MeasurementName(readingIdentification ?? \"\"),\r\n \"scale\": 0,\r\n \"energyMeterId\": effectiveMeterSerial,\r\n \"@context\": \"https://open.charging.cloud/contexts/EnergyMeterSignatureFormats/OCMFv1.0+json\",\r\n \"obis\": readingIdentification ?? \"?\", // OBIS: \"1-b:1.8.0\"\r\n \"unit\": readingUnit, // \"kWh\"\r\n \"currentType\": readingCurrentType, // \"AC\"\r\n \"values\": []\r\n };\r\n\r\n measurementsByKey.set(measurementKey, measurement);\r\n CTR.chargingSessions![0]!.measurements.push(measurement);\r\n\r\n }\r\n\r\n measurement.values.push({\r\n \"timestamp\": timeStampISO8601, // \"2019-06-26T08:57:44,337+0000\"\r\n \"timeSync\": timeSync, // \"U\"|\"I\"|\"S\"|\"R\"\r\n \"transaction\": transaction, // \"B\"|\"C\"|\"X\"|\"E\"|\"L\"|\"R\"|\"A\"|\"P\"|\"S\"|\"T\"|null\r\n \"value\": new Decimal(readingValue), // 2935.6\r\n \"transactionType\": transactionType, // \"T\" ToDo: Serialize this to a string!\r\n \"pagination\": pagination, // \"9289\"\r\n \"errorFlags\": errorFlags, // \"\"\r\n \"cumulatedLoss\": cumulatedLoss // 0.0\r\n ? new Decimal(cumulatedLoss)\r\n : undefined,\r\n \"status\": status, // \"G\"\r\n // \"signatures\": [{\r\n // \"value\": ocmfJSONDocument.signature[\"SD\"]\r\n // }],\r\n \"result\": {\r\n \"status\": ocmfJSONDocument.validationStatus ?? chargyInterfaces.VerificationResult.Unvalidated\r\n },\r\n \"ocmfDocument\": ocmfJSONDocument\r\n });\r\n\r\n }\r\n\r\n }\r\n }\r\n\r\n\r\n CTR.status = (OCMFJSONDocuments.every(ocmfJSONDocument => ocmfJSONDocument.validationStatus === chargyInterfaces.VerificationResult.ValidSignature)\r\n ? chargyInterfaces.SessionVerificationResult.ValidSignature\r\n : chargyInterfaces.SessionVerificationResult.InvalidSignature);\r\n\r\n\r\n if (CTR.chargingSessions != null &&\r\n CTR.chargingSessions.length > 0 &&\r\n CTR.chargingSessions[0] != null)\r\n {\r\n\r\n CTR.begin = CTR.chargingSessions[0].begin;\r\n CTR.end = CTR.chargingSessions[0].end;\r\n\r\n return CTR;\r\n\r\n }\r\n\r\n }\r\n\r\n }\r\n\r\n }\r\n catch (exception)\r\n {\r\n return {\r\n status: chargyInterfaces.SessionVerificationResult.InvalidSessionFormat,\r\n message: \"Invalid OCMF data: \" + (exception instanceof Error ? exception.message : String(exception)),\r\n certainty: 0\r\n }\r\n }\r\n\r\n return {\r\n status: chargyInterfaces.SessionVerificationResult.InvalidSessionFormat,\r\n certainty: 0\r\n }\r\n\r\n }\r\n\r\n //#endregion\r\n\r\n\r\n //#region (private) mergeOCMFSessions(CTRs)\r\n\r\n private mergeOCMFSessions(CTRs: Array<IOCMFChargeTransparencyRecord>): IOCMFChargeTransparencyRecord\r\n {\r\n\r\n const mergedCTR:IOCMFChargeTransparencyRecord = {\r\n \"@id\": \"\",\r\n \"@context\": \"\",\r\n certainty: 1\r\n };\r\n\r\n for (const ctr of CTRs)\r\n {\r\n\r\n if (mergedCTR[\"@id\"] === \"\")\r\n mergedCTR[\"@id\"] = ctr[\"@id\"];\r\n\r\n if (mergedCTR[\"@context\"] === \"\")\r\n mergedCTR[\"@context\"] = ctr[\"@context\"];\r\n\r\n if (!mergedCTR.begin || (mergedCTR.begin && ctr.begin && mergedCTR.begin > ctr.begin))\r\n mergedCTR.begin = ctr.begin;\r\n\r\n if (!mergedCTR.end || (mergedCTR.end && ctr.end && mergedCTR.end < ctr.end))\r\n mergedCTR.end = ctr.end;\r\n\r\n if (!mergedCTR.description)\r\n mergedCTR.description = ctr.description;\r\n\r\n //ToDo: Is this a really good idea? Or should we fail, whenever this information is different?\r\n if (!mergedCTR.contract)\r\n mergedCTR.contract = ctr.contract;\r\n\r\n\r\n if (!mergedCTR.chargingStationOperators)\r\n mergedCTR.chargingStationOperators = ctr.chargingStationOperators;\r\n else if (ctr.chargingStationOperators)\r\n for (const chargingStationOperator of ctr.chargingStationOperators)\r\n mergedCTR.chargingStationOperators.push(chargingStationOperator);\r\n\r\n if (!mergedCTR.chargingPools)\r\n mergedCTR.chargingPools = ctr.chargingPools;\r\n else if (ctr.chargingPools)\r\n for (const chargingPool of ctr.chargingPools)\r\n mergedCTR.chargingPools.push(chargingPool);\r\n\r\n if (!mergedCTR.chargingStations)\r\n mergedCTR.chargingStations = ctr.chargingStations;\r\n else if (ctr.chargingStations)\r\n for (const chargingStation of ctr.chargingStations)\r\n mergedCTR.chargingStations.push(chargingStation);\r\n\r\n // publicKeys\r\n\r\n if (!mergedCTR.chargingSessions)\r\n mergedCTR.chargingSessions = ctr.chargingSessions;\r\n else if (ctr.chargingSessions)\r\n for (const chargingSession of ctr.chargingSessions)\r\n mergedCTR.chargingSessions.push(chargingSession);\r\n\r\n if (!mergedCTR.eMobilityProviders)\r\n mergedCTR.eMobilityProviders = ctr.eMobilityProviders;\r\n else if (ctr.eMobilityProviders)\r\n for (const eMobilityProvider of ctr.eMobilityProviders)\r\n mergedCTR.eMobilityProviders.push(eMobilityProvider);\r\n\r\n if (!mergedCTR.mediationServices)\r\n mergedCTR.mediationServices = ctr.mediationServices;\r\n else if (ctr.mediationServices)\r\n for (const mediationService of ctr.mediationServices)\r\n mergedCTR.mediationServices.push(mediationService);\r\n\r\n }\r\n\r\n return mergedCTR;\r\n\r\n }\r\n\r\n //#endregion\r\n\r\n //#region (private) mergeChargeTransparencyRecords(CTRs)\r\n\r\n private mergeChargeTransparencyRecords(CTRs: Array<IOCMFChargeTransparencyRecord>): IOCMFChargeTransparencyRecord\r\n {\r\n\r\n const mergedCTR:IOCMFChargeTransparencyRecord = {\r\n \"@id\": \"\",\r\n \"@context\": \"\",\r\n certainty: 1\r\n };\r\n\r\n for (const ctr of CTRs)\r\n {\r\n\r\n if (mergedCTR[\"@id\"] === \"\")\r\n mergedCTR[\"@id\"] = ctr[\"@id\"];\r\n\r\n if (mergedCTR[\"@context\"] === \"\")\r\n mergedCTR[\"@context\"] = ctr[\"@context\"];\r\n\r\n if (!mergedCTR.begin || (mergedCTR.begin && ctr.begin && mergedCTR.begin > ctr.begin))\r\n mergedCTR.begin = ctr.begin;\r\n\r\n if (!mergedCTR.end || (mergedCTR.end && ctr.end && mergedCTR.end < ctr.end))\r\n mergedCTR.end = ctr.end;\r\n\r\n if (!mergedCTR.description)\r\n mergedCTR.description = ctr.description;\r\n\r\n //ToDo: Is this a really good idea? Or should we fail, whenever this information is different?\r\n if (!mergedCTR.contract)\r\n mergedCTR.contract = ctr.contract;\r\n\r\n\r\n if (!mergedCTR.chargingStationOperators)\r\n mergedCTR.chargingStationOperators = ctr.chargingStationOperators;\r\n else if (ctr.chargingStationOperators)\r\n for (const chargingStationOperator of ctr.chargingStationOperators)\r\n mergedCTR.chargingStationOperators.push(chargingStationOperator);\r\n\r\n if (!mergedCTR.chargingPools)\r\n mergedCTR.chargingPools = ctr.chargingPools;\r\n else if (ctr.chargingPools)\r\n for (const chargingPool of ctr.chargingPools)\r\n mergedCTR.chargingPools.push(chargingPool);\r\n\r\n if (!mergedCTR.chargingStations)\r\n mergedCTR.chargingStations = ctr.chargingStations;\r\n else if (ctr.chargingStations)\r\n for (const chargingStation of ctr.chargingStations)\r\n mergedCTR.chargingStations.push(chargingStation);\r\n\r\n // publicKeys\r\n\r\n if (!mergedCTR.chargingSessions)\r\n mergedCTR.chargingSessions = ctr.chargingSessions;\r\n else if (ctr.chargingSessions)\r\n for (const chargingSession of ctr.chargingSessions)\r\n mergedCTR.chargingSessions.push(chargingSession);\r\n\r\n if (!mergedCTR.eMobilityProviders)\r\n mergedCTR.eMobilityProviders = ctr.eMobilityProviders;\r\n else if (ctr.eMobilityProviders)\r\n for (const eMobilityProvider of ctr.eMobilityProviders)\r\n mergedCTR.eMobilityProviders.push(eMobilityProvider);\r\n\r\n if (!mergedCTR.mediationServices)\r\n mergedCTR.mediationServices = ctr.mediationServices;\r\n else if (ctr.mediationServices)\r\n for (const mediationService of ctr.mediationServices)\r\n mergedCTR.mediationServices.push(mediationService);\r\n\r\n }\r\n\r\n return mergedCTR;\r\n\r\n }\r\n\r\n //#endregion\r\n\r\n\r\n //#region (private) validateOCMFSignature(OCMFJSONDocument, PublicKey, PublicKeyEncoding?)\r\n\r\n private async validateOCMFSignature(OCMFJSONDocument: IOCMFJSONDocument,\r\n PublicKey: string|chargyInterfaces.IPublicKeyXY,\r\n PublicKeyEncoding?: string): Promise<chargyInterfaces.VerificationResult>\r\n {\r\n\r\n // Note: We could also get the ECC curve from the DER-encoded public key!\r\n\r\n try\r\n {\r\n\r\n //#region Setup crypto\r\n\r\n let curve: EllipticCurve | null = null;\r\n let publicKey: EllipticKeyPair | null = null;\r\n\r\n try\r\n {\r\n\r\n switch (OCMFJSONDocument.signature.SA)\r\n {\r\n\r\n case \"ECDSA-secp192k1-SHA256\":\r\n break;\r\n\r\n case \"ECDSA-secp192r1-SHA256\":\r\n break;\r\n\r\n case \"ECDSA-secp256k1-SHA256\":\r\n curve = new this.chargy.elliptic.ec('secp256k1');\r\n break;\r\n\r\n case \"ECDSA-brainpool256r1-SHA256\":\r\n break;\r\n\r\n // Note: Cryptographical wrong hash algorithm!\r\n case \"ECDSA-secp384r1-SHA256\":\r\n curve = new this.chargy.elliptic.ec('p384');\r\n break;\r\n\r\n // Note: Cryptographical wrong hash algorithm!\r\n case \"ECDSA-brainpool384r1-SHA256\":\r\n break;\r\n\r\n // Not an OCMF standard!\r\n case \"ECDSA-secp384r1-SHA384\":\r\n curve = new this.chargy.elliptic.ec('p384');\r\n break;\r\n\r\n // Not an OCMF standard!\r\n case \"ECDSA-brainpool384r1-SHA384\":\r\n break;\r\n\r\n // Not an OCMF standard!\r\n case \"ECDSA-secp521r1-SHA512\":\r\n curve = new this.chargy.elliptic.ec('p521');\r\n break;\r\n\r\n // ECDSA-secp256r1-SHA256\r\n default:\r\n curve = new this.chargy.elliptic.ec('p256');\r\n break;\r\n\r\n }\r\n\r\n }\r\n catch\r\n {\r\n OCMFJSONDocument.validationStatus = chargyInterfaces.VerificationResult.UnknownSignatureFormat;\r\n return OCMFJSONDocument.validationStatus;\r\n }\r\n\r\n //#endregion\r\n\r\n //#region Parse the public key\r\n\r\n try\r\n {\r\n\r\n // Unsupported ECC curves are detected here, so that the\r\n // 'catch' below returns an 'InvalidPublicKey' result!\r\n if (curve === null)\r\n throw new Error(`Unsupported ECC curve '${OCMFJSONDocument.signature.SA ?? \"\"}'!`);\r\n\r\n //#region Public Key from string\r\n\r\n OCMFJSONDocument.publicKey ??= PublicKey;\r\n\r\n let publicKeyBytes:Buffer|null = null;\r\n\r\n if (typeof OCMFJSONDocument.publicKey === 'string')\r\n {\r\n\r\n //#region Define an ASN.1 structure for an ECC public key\r\n\r\n const ECPoint = this.chargy.asn1.define('ECPoint', function () {\r\n this.seq().obj(\r\n this.key('algorithm').seq().obj(\r\n this.key('id').objid(),\r\n this.key('curve').objid()\r\n ),\r\n this.key('pubKey').bitstr()\r\n );\r\n });\r\n\r\n //#endregion\r\n\r\n //#region Try to determine the public key encoding format\r\n\r\n if (PublicKeyEncoding)\r\n {\r\n switch (PublicKeyEncoding.toLowerCase())\r\n {\r\n\r\n case 'hex':\r\n publicKeyBytes = Buffer.from(OCMFJSONDocument.publicKey, 'hex');\r\n break;\r\n\r\n case \"base32\":\r\n publicKeyBytes = Buffer.from(this.chargy.base32Decode(OCMFJSONDocument.publicKey, 'RFC4648'));\r\n break;\r\n\r\n case 'base64':\r\n publicKeyBytes = Buffer.from(OCMFJSONDocument.publicKey, 'base64');\r\n break;\r\n\r\n }\r\n }\r\n\r\n // Try to guess the encoding format\r\n if (publicKeyBytes == null)\r\n {\r\n\r\n const hexRegex = /^[0-9A-Fa-f]+$/;\r\n const base32Regex = /^(?:[A-Z2-7]{8})*(?:[A-Z2-7]{2}={6}|[A-Z2-7]{4}={4}|[A-Z2-7]{5}={3}|[A-Z2-7]{7}=)?$/;\r\n const base64Regex = /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/;\r\n\r\n if (hexRegex.test(OCMFJSONDocument.publicKey))\r\n {\r\n PublicKeyEncoding = 'hex';\r\n publicKeyBytes = Buffer.from(OCMFJSONDocument.publicKey, 'hex');\r\n }\r\n\r\n else if (base32Regex.test(OCMFJSONDocument.publicKey))\r\n {\r\n PublicKeyEncoding = 'base32';\r\n publicKeyBytes = Buffer.from(this.chargy.base32Decode(OCMFJSONDocument.publicKey, 'RFC4648'));\r\n }\r\n\r\n else if (base64Regex.test(OCMFJSONDocument.publicKey))\r\n {\r\n PublicKeyEncoding = 'base64';\r\n publicKeyBytes = Buffer.from(OCMFJSONDocument.publicKey, 'base64');\r\n }\r\n\r\n }\r\n\r\n // Or fail...\r\n if (!publicKeyBytes)\r\n {\r\n OCMFJSONDocument.validationStatus = chargyInterfaces.VerificationResult.UnknownPublicKeyFormat;\r\n return OCMFJSONDocument.validationStatus;\r\n }\r\n\r\n //#endregion\r\n\r\n //#region Parse the DER-encoded public key\r\n\r\n const publicKeyASN1 = ECPoint.decode<{ algorithm: { id: number[], curve: number[] }, pubKey: { data: Buffer } }>(publicKeyBytes, 'der');\r\n\r\n // publicKeyASN1.algorithm.id: e.g. \"1.2.840.10045.2.1\" => ECDSA and ECDH Public Key, https://www.alvestrand.no/objectid/1.2.840.10045.2.1.html\r\n // publicKeyASN1.algorithm.curve: e.g. \"1.2.840.10045.3.1.7\" => ECC (NIST) P-256 / secp256r1, https://www.alvestrand.no/objectid/1.2.840.10045.3.1.7.html\r\n\r\n // Assuming the public key is an uncompressed point\r\n // The first byte is 0x04 (indicating an uncompressed point), followed by the x and y coordinates\r\n const coordinates = publicKeyASN1.pubKey.data.subarray(1); // Remove the first byte\r\n const halfLength = coordinates.length / 2;\r\n const publicKeyXY = {\r\n x: coordinates.subarray(0, halfLength).toString('hex'),\r\n y: coordinates.subarray( halfLength).toString('hex')\r\n }\r\n // Will fail when the public key does not match the curve!\r\n publicKey = curve.keyFromPublic(publicKeyXY, 'hex');\r\n\r\n //#endregion\r\n\r\n OCMFJSONDocument.publicKey = {\r\n algorithm: OCMFJSONDocument.signature.SA\r\n ? OCMFJSONDocument.signature.SA.substring(\r\n OCMFJSONDocument.signature.SA.indexOf('-') + 1,\r\n OCMFJSONDocument.signature.SA.lastIndexOf('-')\r\n )\r\n : 'secp256r1',\r\n encoding: PublicKeyEncoding ?? 'hex',\r\n format: 'XY',\r\n value: OCMFJSONDocument.publicKey,\r\n x: publicKeyXY.x,\r\n y: publicKeyXY.y\r\n };\r\n\r\n }\r\n\r\n //#endregion\r\n\r\n //#region Public Key from XY\r\n\r\n else if (chargyInterfaces.isIPublicKeyXY(OCMFJSONDocument.publicKey))\r\n {\r\n publicKey = curve.keyFromPublic({\r\n x: OCMFJSONDocument.publicKey.x,\r\n y: OCMFJSONDocument.publicKey.y\r\n }, 'hex');\r\n }\r\n\r\n //#endregion\r\n\r\n }\r\n catch\r\n {\r\n OCMFJSONDocument.validationStatus = chargyInterfaces.VerificationResult.InvalidPublicKey;\r\n return OCMFJSONDocument.validationStatus;\r\n }\r\n\r\n //#endregion\r\n\r\n //#region Verify the signature\r\n\r\n try\r\n {\r\n\r\n // A missing public key is detected here, so that the\r\n // 'catch' below returns an 'InvalidSignature' result!\r\n if (publicKey === null)\r\n throw new Error(\"Missing public key!\");\r\n\r\n OCMFJSONDocument.validationStatus = publicKey.verify(OCMFJSONDocument.hashValue, OCMFJSONDocument.signatureRS)\r\n ? chargyInterfaces.VerificationResult.ValidSignature\r\n : chargyInterfaces.VerificationResult.InvalidSignature;\r\n\r\n return await Promise.resolve(OCMFJSONDocument.validationStatus);\r\n\r\n }\r\n catch\r\n {\r\n OCMFJSONDocument.validationStatus = chargyInterfaces.VerificationResult.InvalidSignature;\r\n return OCMFJSONDocument.validationStatus;\r\n }\r\n\r\n //#endregion\r\n\r\n }\r\n catch\r\n {\r\n OCMFJSONDocument.validationStatus = chargyInterfaces.VerificationResult.InvalidSignature;\r\n return OCMFJSONDocument.validationStatus;\r\n }\r\n\r\n }\r\n\r\n //#endregion\r\n\r\n //#region (private) parseOCMFJSONDocuments(OCMFDocuments, PublicKey?, PublicKeyEncoding?)\r\n\r\n private async parseOCMFJSONDocuments(OCMFDocuments: string[],\r\n PublicKey?: string|chargyInterfaces.IPublicKeyXY,\r\n PublicKeyEncoding?: string): Promise<IOCMFJSONDocument[] | string>\r\n {\r\n\r\n //#region Data\r\n\r\n const combinedOCMF = OCMFDocuments.join('\\n');\r\n\r\n let ocmfStructure = 0;\r\n let ocmfRAWPayload:string = \"\";\r\n\r\n // The casts are backed by the field-by-field validation\r\n // within tryToParseOCMFv1_0(...)!\r\n let ocmfPayload = {} as IOCMFPayload;\r\n let ocmfSignature = {} as IOCMFSignature;\r\n\r\n let depth = 0;\r\n let ocmfStartIndex = -1;\r\n let startIndex = -1;\r\n let endIndex = -1;\r\n\r\n const ocmfJSONDocuments: Array<IOCMFJSONDocument> = [];\r\n\r\n //#endregion\r\n\r\n try\r\n {\r\n\r\n for (let i = 0; i < combinedOCMF.length; i++)\r\n {\r\n\r\n //#region OCMF header\r\n\r\n if (ocmfStructure == 0 &&\r\n i >= 3 &&\r\n combinedOCMF[i] === 'F' && combinedOCMF[i-1] === 'M' && combinedOCMF[i-2] === 'C' && combinedOCMF[i-3] === 'O')\r\n {\r\n ocmfStructure = 1;\r\n ocmfStartIndex = i-3;\r\n continue;\r\n }\r\n\r\n //#endregion\r\n\r\n //#region |\r\n\r\n if (ocmfStructure == 1 || ocmfStructure == 3)\r\n {\r\n if (combinedOCMF[i] === '|') {\r\n ocmfStructure++;\r\n continue;\r\n }\r\n }\r\n\r\n //#endregion\r\n\r\n if (ocmfStructure == 2 || ocmfStructure == 4)\r\n {\r\n\r\n //#region {\r\n\r\n if (combinedOCMF[i] === '{')\r\n {\r\n\r\n depth++;\r\n\r\n if (depth === 1)\r\n startIndex = i;\r\n\r\n continue;\r\n\r\n }\r\n\r\n //#endregion\r\n\r\n if (combinedOCMF[i] === '}')\r\n {\r\n\r\n depth--;\r\n\r\n if (depth === 0)\r\n {\r\n\r\n endIndex = i;\r\n\r\n //#region Copy OCMF\r\n\r\n if (startIndex !== -1 && endIndex !== -1) {\r\n\r\n //#region Copy payload\r\n\r\n if (ocmfStructure == 2)\r\n {\r\n try\r\n {\r\n ocmfRAWPayload = combinedOCMF.substring(startIndex, endIndex + 1);\r\n ocmfPayload = JSON.parse(ocmfRAWPayload) as IOCMFPayload;\r\n }\r\n catch\r\n {\r\n return \"The \" + (ocmfJSONDocuments.length + 1).toString() + \". OCMF payload is not a valid JSON document!\";\r\n }\r\n }\r\n\r\n //#endregion\r\n\r\n //#region Copy signature\r\n\r\n if (ocmfStructure == 4)\r\n {\r\n\r\n //#region Copy signature\r\n\r\n try\r\n {\r\n ocmfSignature = JSON.parse(combinedOCMF.substring(startIndex, endIndex + 1)) as IOCMFSignature;\r\n }\r\n catch\r\n {\r\n return \"The \" + (ocmfJSONDocuments.length + 1).toString() + \". OCMF signature is not a valid JSON document!\";\r\n }\r\n\r\n //#endregion\r\n\r\n //#region Hash the payload\r\n\r\n let hashAlgorithm: string = \"?\";\r\n let hashValue: string = \"?\";\r\n let validationStatus: chargyInterfaces.VerificationResult|null = null;\r\n\r\n const plaintext = ocmfRAWPayload;\r\n\r\n try\r\n {\r\n\r\n switch (ocmfSignature.SA)\r\n {\r\n\r\n case \"ECDSA-secp192k1-SHA256\":\r\n hashAlgorithm = \"SHA256\";\r\n hashValue = (await chargyLib.sha256(plaintext));\r\n break;\r\n\r\n case \"ECDSA-secp192r1-SHA256\":\r\n hashAlgorithm = \"SHA256, 256 Bits, hex\";\r\n hashValue = (await chargyLib.sha256(plaintext));\r\n break;\r\n\r\n case \"ECDSA-secp256k1-SHA256\":\r\n hashAlgorithm = \"SHA256, 256 Bits, hex\";\r\n hashValue = (await chargyLib.sha256(plaintext));\r\n break;\r\n\r\n case \"ECDSA-brainpool256r1-SHA256\":\r\n hashAlgorithm = \"SHA256, 256 Bits, hex\";\r\n hashValue = (await chargyLib.sha256(plaintext));\r\n break;\r\n\r\n // Note: Cryptographical wrong hash algorithm!\r\n case \"ECDSA-secp384r1-SHA256\":\r\n hashAlgorithm = \"SHA256, 256 Bits, hex\";\r\n hashValue = (await chargyLib.sha256(plaintext));\r\n break;\r\n\r\n // Note: Cryptographical wrong hash algorithm!\r\n case \"ECDSA-brainpool384r1-SHA256\":\r\n hashAlgorithm = \"SHA256, 256 Bits, hex\";\r\n hashValue = (await chargyLib.sha256(plaintext));\r\n break;\r\n\r\n // Not an OCMF standard!\r\n case \"ECDSA-secp384r1-SHA384\":\r\n hashAlgorithm = \"SHA384, 384 Bits, hex\";\r\n hashValue = (await chargyLib.sha256(plaintext));\r\n break;\r\n\r\n // Not an OCMF standard!\r\n case \"ECDSA-brainpool384r1-SHA384\":\r\n hashAlgorithm = \"SHA384, 384 Bits, hex\";\r\n hashValue = (await chargyLib.sha256(plaintext));\r\n break;\r\n\r\n // Not an OCMF standard!\r\n case \"ECDSA-secp521r1-SHA512\":\r\n hashAlgorithm = \"SHA512, 512 Bits, hex\";\r\n hashValue = (await chargyLib.sha256(plaintext));\r\n break;\r\n\r\n // ECDSA-secp256r1-SHA256\r\n default:\r\n hashAlgorithm = \"SHA256\";\r\n hashValue = (await chargyLib.sha256(plaintext));\r\n break;\r\n\r\n }\r\n\r\n }\r\n catch\r\n {\r\n validationStatus = chargyInterfaces.VerificationResult.UnknownSignatureFormat;\r\n }\r\n\r\n //#endregion\r\n\r\n const ocmfJSONDocument:IOCMFJSONDocument = {\r\n \"@context\": \"OCMF\",\r\n raw: combinedOCMF.substring(ocmfStartIndex, endIndex + 1),\r\n rawPayload: ocmfRAWPayload,\r\n payload: ocmfPayload,\r\n signature: ocmfSignature,\r\n hashAlgorithm: hashAlgorithm,\r\n hashValue: hashValue,\r\n publicKey: PublicKey,\r\n publicKeyEncoding: PublicKeyEncoding,\r\n validationStatus: validationStatus\r\n ? validationStatus\r\n : PublicKey\r\n ? chargyInterfaces.VerificationResult.Unvalidated\r\n : chargyInterfaces.VerificationResult.PublicKeyNotFound\r\n }\r\n\r\n //#region Parse the signature\r\n\r\n try\r\n {\r\n\r\n // Define an ASN.1 structure for an ECDSA signature\r\n const ECDSASignature = this.chargy.asn1.define('ECDSASignature', function () {\r\n this.seq().obj(\r\n this.key('r').int(),\r\n this.key('s').int()\r\n );\r\n });\r\n\r\n let bufferEncoding: BufferEncoding = 'hex';\r\n\r\n switch (ocmfJSONDocument.signature.SE?.toLowerCase() ?? \"\")\r\n {\r\n\r\n case \"\":\r\n break;\r\n\r\n case \"hex\":\r\n bufferEncoding = 'hex';\r\n break;\r\n\r\n case 'base64':\r\n bufferEncoding = 'base64';\r\n break;\r\n\r\n default:\r\n ocmfJSONDocument.validationStatus = chargyInterfaces.VerificationResult.UnknownSignatureFormat;\r\n\r\n }\r\n\r\n // Parse the DER-encoded signature\r\n const signatureObj = ECDSASignature.decode<{ r: { toString(base: number): string }, s: { toString(base: number): string } }>(Buffer.from(ocmfJSONDocument.signature.SD, bufferEncoding), 'der');\r\n\r\n // Extract the r and s components of the signature\r\n ocmfJSONDocument.signatureRS = {\r\n value: ocmfJSONDocument.signature.SD,\r\n r: signatureObj.r.toString(16),\r\n s: signatureObj.s.toString(16)\r\n };\r\n\r\n }\r\n catch\r\n {\r\n ocmfJSONDocument.validationStatus = chargyInterfaces.VerificationResult.InvalidSignature;\r\n }\r\n\r\n //#endregion\r\n\r\n if (PublicKey && ocmfJSONDocument.validationStatus === chargyInterfaces.VerificationResult.Unvalidated)\r\n await this.validateOCMFSignature(ocmfJSONDocument,\r\n PublicKey,\r\n PublicKeyEncoding);\r\n\r\n ocmfJSONDocuments.push(ocmfJSONDocument);\r\n\r\n }\r\n\r\n //#endregion\r\n\r\n }\r\n\r\n //#endregion\r\n\r\n ocmfStructure++;\r\n\r\n if (ocmfStructure == 5)\r\n ocmfStructure = 0;\r\n\r\n continue;\r\n\r\n }\r\n\r\n }\r\n\r\n }\r\n\r\n }\r\n\r\n return ocmfJSONDocuments.length > 0\r\n ? ocmfJSONDocuments\r\n : \"No valid OCMF data found!\";\r\n\r\n }\r\n catch (exception)\r\n {\r\n\r\n if (exception instanceof Error)\r\n return exception.message;\r\n\r\n if (typeof exception === 'string')\r\n return exception;\r\n\r\n return \"Unknown error!\";\r\n\r\n }\r\n\r\n }\r\n\r\n //#endregion\r\n\r\n //#region TryToParseOCMFDocument (OCMFDocument, PublicKey?, PublicKeyEncoding?, ContainerInfos?)\r\n\r\n public async TryToParseOCMFDocument(OCMFDocument: string,\r\n PublicKey?: string|chargyInterfaces.IPublicKeyXY,\r\n PublicKeyEncoding?: string,\r\n ContainerInfos?: unknown) : Promise<chargeTransparencyRecord.IChargeTransparencyRecord|chargyInterfaces.ISessionCryptoResult>\r\n {\r\n return await this.TryToParseOCMFDocuments([ OCMFDocument ], PublicKey, PublicKeyEncoding, ContainerInfos);\r\n }\r\n\r\n //#endregion\r\n\r\n //#region TryToParseOCMFDocuments(OCMFDocuments, PublicKey?, PublicKeyEncoding?, ContainerInfos?)\r\n\r\n public async TryToParseOCMFDocuments(OCMFDocuments: string[],\r\n PublicKey?: string|chargyInterfaces.IPublicKeyXY,\r\n PublicKeyEncoding?: string,\r\n ContainerInfos?: unknown) : Promise<chargeTransparencyRecord.IChargeTransparencyRecord|chargyInterfaces.ISessionCryptoResult>\r\n {\r\n\r\n //#region Data\r\n\r\n if (OCMFDocuments.length == 0) return {\r\n status: chargyInterfaces.SessionVerificationResult.InvalidSessionFormat,\r\n message: this.chargy.GetLocalizedMessage(\"The given OCMF data could not be parsed\") + \"!\",\r\n certainty: 0\r\n }\r\n\r\n const ocmfJSONDocumentGroups = new Map<string, Array<IOCMFJSONDocument>>();\r\n const ocmfCTRs = new Array<IOCMFChargeTransparencyRecord|chargyInterfaces.ISessionCryptoResult>();\r\n\r\n //#endregion\r\n\r\n const ocmfJSONDocuments = await this.parseOCMFJSONDocuments(\r\n OCMFDocuments,\r\n PublicKey,\r\n PublicKeyEncoding\r\n );\r\n\r\n if (typeof ocmfJSONDocuments !== 'string')\r\n {\r\n\r\n //#region Group OCMF data\r\n\r\n for (const ocmfJSONDocument of ocmfJSONDocuments)\r\n {\r\n try\r\n {\r\n\r\n const groupingKey = (ocmfJSONDocument.payload.FV ?? \"\") + \"|\" +\r\n (ocmfJSONDocument.payload.GI ?? \"\") + \"|\" +\r\n (ocmfJSONDocument.payload.GS ?? \"\") + \"|\" +\r\n (ocmfJSONDocument.payload.GV ?? \"\") + \"|\" +\r\n\r\n (ocmfJSONDocument.payload.MV ?? \"\") + \"|\" +\r\n (ocmfJSONDocument.payload.MM ?? \"\") + \"|\" +\r\n (ocmfJSONDocument.payload.MS ?? \"\") + \"|\" +\r\n (ocmfJSONDocument.payload.MF ?? \"\") + \"|\" +\r\n\r\n (ocmfJSONDocument.payload.IS ? \"1|\" : \"0|\") +\r\n (ocmfJSONDocument.payload.IL ?? \"\") + \"|\" +\r\n (ocmfJSONDocument.payload.IF ?? \"\") + \"|\" +\r\n (ocmfJSONDocument.payload.IT ?? \"\") + \"|\" +\r\n (ocmfJSONDocument.payload.ID ?? \"\") + \"|\" +\r\n (ocmfJSONDocument.payload.TT ?? \"\") + \"|\" +\r\n\r\n (ocmfJSONDocument.payload.CF ?? \"\") + \"|\" +\r\n\r\n (ocmfJSONDocument.payload.CT ?? \"\") + \"|\" +\r\n (ocmfJSONDocument.payload.CI ?? \"\");\r\n\r\n if (!ocmfJSONDocumentGroups.has(groupingKey))\r\n ocmfJSONDocumentGroups.set(groupingKey, new Array<IOCMFJSONDocument>());\r\n\r\n ocmfJSONDocumentGroups.get(groupingKey)?.push(ocmfJSONDocument);\r\n\r\n }\r\n catch (exception)\r\n {\r\n return {\r\n status: chargyInterfaces.SessionVerificationResult.InvalidSessionFormat,\r\n message: this.chargy.GetLocalizedMessage(\"The given OCMF data could not be parsed\") + \": \" + (exception instanceof Error ? exception.message : String(exception)),\r\n certainty: 0\r\n }\r\n }\r\n }\r\n\r\n //#endregion\r\n\r\n //ToDo: Order groups by timestamp!\r\n for (const ocmfJSONDocumentGroup of ocmfJSONDocumentGroups.values())\r\n {\r\n\r\n if (PublicKey)\r\n for (const ocmfJSONDocument of ocmfJSONDocumentGroup)\r\n if (ocmfJSONDocument.validationStatus === chargyInterfaces.VerificationResult.Unvalidated)\r\n await this.validateOCMFSignature(ocmfJSONDocument, PublicKey);\r\n\r\n // Switch over the Format Version of the first OCMF document within the group\r\n if (ocmfJSONDocumentGroup[0])\r\n {\r\n switch (ocmfJSONDocumentGroup[0].payload.FV)\r\n {\r\n\r\n case \"0.1\":\r\n // OCMF 0.1 SAFE reference data uses a few legacy field names/forms (VI/VV,\r\n // string based IS values), but the compact signed document structure is close\r\n // enough to the 1.x parser once those compatibility aliases are normalized.\r\n // falls through\r\n case \"1.0\":\r\n case \"1.1\":\r\n case \"1.2\":\r\n case \"1.3\":\r\n case \"1.4\":\r\n ocmfCTRs.push(this.tryToParseOCMFv1_0(ocmfJSONDocumentGroup, ContainerInfos));\r\n break;\r\n\r\n default:\r\n ocmfCTRs.push({\r\n status: chargyInterfaces.SessionVerificationResult.InvalidSessionFormat,\r\n message: this.chargy.GetLocalizedMessage(\"Unknown OCMF version!\"),\r\n certainty: 0\r\n });\r\n break;\r\n\r\n }\r\n }\r\n\r\n }\r\n\r\n if (ocmfCTRs.length > 0 && ocmfCTRs[0])\r\n return ocmfCTRs[0];\r\n\r\n }\r\n\r\n return {\r\n status: chargyInterfaces.SessionVerificationResult.InvalidSessionFormat,\r\n message: this.chargy.GetLocalizedMessage(\"The given OCMF data could not be parsed\") +\r\n (typeof ocmfJSONDocuments === 'string' ? \": \" + ocmfJSONDocuments : \"!\"),\r\n certainty: 0\r\n }\r\n\r\n }\r\n\r\n //#endregion\r\n\r\n\r\n //#region Helpers\r\n\r\n private convertToISO8601(timestamp: string): string {\r\n return timestamp.replace(',', '.').replace(/([+-])(\\d{2})(\\d{2})$/, '$1$2:$3');\r\n }\r\n\r\n //#endregion\r\n\r\n}\r\n","/*\n * Copyright (c) 2018-2026 GraphDefined GmbH <achim.friedland@graphdefined.com>\n * This file is part of Chargy Desktop App <https://github.com/OpenChargingCloud/ChargyDesktopApp>\n *\n * Licensed under the Affero GPL license, Version 3.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.gnu.org/licenses/agpl.html\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Chargy } from './chargy'\nimport { Alfen } from './Alfen'\nimport { BSMCrypt01 } from './BSMCrypt01'\nimport * as chargyInterfaces from './interfaces/chargyInterfaces'\nimport * as chargeTransparencyRecord from './interfaces/IChargeTransparencyRecord'\nimport * as chargyLib from './chargyLib'\nimport { OCMF } from './OCMF'\n\n\nexport class OCPI {\n\n private readonly chargy: Chargy;\n\n constructor(chargy: Chargy) {\n this.chargy = chargy;\n }\n\n\n private bufferToHex(buffer: ArrayBuffer, Reverse?: boolean) : string {\n return (Reverse\n ? Array.from(new Uint8Array(buffer)).reverse()\n : Array.from(new Uint8Array(buffer))\n ).map (b => b.toString(16).padStart(2, \"0\")).join(\"\");\n }\n\n private bufferToNumber(buffer: ArrayBuffer) : number {\n return parseInt(Array\n .from(new Uint8Array(buffer))\n .map (b => b.toString(16).padStart(2, \"0\"))\n .join(\"\"), 16);\n }\n\n\n //#region tryToParseChargeITContainerFormat(SomeJSON)\n\n // The chargeIT mobility data format does not always provide context information or format identifiers!\n public async tryToParseOCPIFormat(SomeJSON: unknown) : Promise<chargeTransparencyRecord.IChargeTransparencyRecord|chargyInterfaces.ISessionCryptoResult>\n {\n\n const errors = new Array<string>();\n const warnings = new Array<string>();\n\n if (!chargyLib.isMandatoryJSONObject(SomeJSON))\n {\n return {\n status: chargyInterfaces.SessionVerificationResult.InvalidSessionFormat,\n errors: errors,\n warnings: warnings,\n certainty: 0\n }\n }\n\n const jsonContextInformation = chargyLib.asString(SomeJSON[\"@context\"])?.trim() ?? \"\";\n\n\n //#region Old chargeIT container format\n\n if (jsonContextInformation === \"\")\n {\n\n const encoding_method = SomeJSON[\"encoding_method\"];\n const public_key = SomeJSON[\"public_key\"];\n const signed_values = SomeJSON[\"signed_values\"];\n\n if (!chargyLib.isMandatoryString(encoding_method))\n errors.push(this.chargy.GetLocalizedMessage(\"MissingOrInvalidEncodingMethod\"));\n\n if (!chargyLib.isMandatoryString(public_key))\n errors.push(this.chargy.GetLocalizedMessage(\"MissingOrInvalidPublicKey\"));\n\n if (!chargyLib.isMandatoryJSONArray(signed_values))\n errors.push(this.chargy.GetLocalizedMessage(\"MissingOrInvalidSignedValues\"));\n\n if (errors.length > 0)\n return {\n status: chargyInterfaces.SessionVerificationResult.InvalidSessionFormat,\n errors: errors,\n warnings: warnings,\n certainty: 0\n }\n\n if (encoding_method === \"OCMF\" &&\n chargyLib.isMandatoryJSONArray(signed_values) &&\n signed_values.length > 0)\n {\n\n const firstSignedData = chargyLib.asString(chargyLib.asJSONObject(signed_values[0])?.[\"signed_data\"]);\n\n if (firstSignedData)\n {\n\n //#region Optional container infos (placeInfo, meterInfo, ...)\n\n // Convert the optional place and meter information of the\n // container into the common container info format, so that\n // the OCMF parser can merge it into the resulting charge\n // transparency record.\n\n const placeInfo = chargyLib.asJSONObject(SomeJSON[\"placeInfo\"]);\n const geoLocation = chargyLib.asJSONObject(placeInfo?.[\"geoLocation\"]);\n const address = chargyLib.asJSONObject(placeInfo?.[\"address\"]);\n\n const geoLat = chargyLib.asNumber(geoLocation?.[\"lat\"]);\n const geoLon = chargyLib.asNumber(geoLocation?.[\"lon\"]);\n\n const containerInfos = {\n\n EVSEId: chargyLib.asString(placeInfo?.[\"evseId\"]),\n\n chargingStation: {\n geoLocation: geoLat !== undefined && geoLon !== undefined\n ? { lat: geoLat, lng: geoLon }\n : undefined,\n address: address\n ? {\n street: chargyLib.asString(address[\"street\"]),\n postalCode: chargyLib.asString(address[\"zipCode\"]) ?? \"\",\n city: chargyLib.asString(address[\"town\"]),\n country: chargyLib.asString(address[\"country\"]) ?? \"\"\n }\n : undefined\n },\n\n energyMeter: chargyLib.asJSONObject(SomeJSON[\"meterInfo\"])\n\n };\n\n //#endregion\n\n return await new OCMF(this.chargy).TryToParseOCMFDocument(firstSignedData,\n chargyLib.asString(public_key),\n encoding_method,\n containerInfos);\n\n }\n\n }\n\n }\n\n //#endregion\n\n //#region New chargeIT container format\n\n if (jsonContextInformation == \"https://open.charging.cloud/contexts/ocpi-2.1\")\n {\n\n const numberOfFormatChecks = 81;\n let secondaryErrors = 0;\n\n try\n {\n\n const chargingSessionId = SomeJSON[\"@id\"];\n\n const chargePointInfo = chargyLib.asJSONObject(SomeJSON[\"chargePointInfo\"]);\n const evseId = chargePointInfo?.[\"evseId\"];\n\n const placeInfo = chargyLib.asJSONObject(chargePointInfo?.[\"placeInfo\"]);\n const geoLocation = chargyLib.asJSONObject(placeInfo?.[\"geoLocation\"]);\n const geoLocation_lat = geoLocation?.[\"lat\"];\n const geoLocation_lon = geoLocation?.[\"lon\"];\n\n const address = chargyLib.asJSONObject(placeInfo?.[\"address\"]);\n const address_street = address?.[\"street\"];\n const address_zipCode = address?.[\"zipCode\"];\n const address_town = address?.[\"town\"];\n const address_country = address?.[\"country\"] ?? \"\";\n\n const chargingStationInfo = chargyLib.asJSONObject(SomeJSON[\"chargingStationInfo\"]);\n const chargingStation_manufacturer = chargingStationInfo?.[\"manufacturer\"];\n const chargingStation_type = chargingStationInfo?.[\"type\"];\n const chargingStation_serialNumber = chargingStationInfo?.[\"serialNumber\"];\n const chargingStation_controllerSoftwareVersion = chargingStationInfo?.[\"controllerSoftwareVersion\"];\n const chargingStation_compliance = chargingStationInfo?.[\"compliance\"];\n const chargingStation_complianceURL = chargingStationInfo?.[\"complianceURL\"];\n const chargingStation_conformity = chargingStationInfo?.[\"conformity\"];\n const chargingStation_conformity_URL = chargingStationInfo?.[\"conformityURL\"];\n const chargingStation_conformity_certificateId = chargingStationInfo?.[\"conformityCertificateId\"];\n const chargingStation_calibration = chargingStationInfo?.[\"calibration\"];\n const chargingStation_calibration_URL = chargingStationInfo?.[\"calibrationURL\"];\n const chargingStation_calibration_certificateId = chargingStationInfo?.[\"calibrationCertificateId\"];\n\n // meterInfo can also be under the signedMeterValues!\n const meterInfo = chargyLib.asJSONObject(SomeJSON[\"meterInfo\"]);\n const meterInfo_meterId = meterInfo?.[\"meterId\"];\n const meterInfo_manufacturer = meterInfo?.[\"manufacturer\"];\n const meterInfo_manufacturerURL = meterInfo?.[\"manufacturerURL\"];\n const meterInfo_model = meterInfo?.[\"model\"];\n const meterInfo_modelURL = meterInfo?.[\"modelURL\"];\n const meterInfo_hardwareVersion = meterInfo?.[\"hardwareVersion\"];\n const meterInfo_firmwareVersion = meterInfo?.[\"firmwareVersion\"];\n const meterInfo_publicKey = meterInfo?.[\"publicKey\"];\n const meterInfo_publicKeyFormat = meterInfo?.[\"publicKeyFormat\"];\n const meterInfo_publicKeyEncoding = meterInfo?.[\"publicKeyEncoding\"];\n const meterInfo_signatureFormat = meterInfo?.[\"signatureFormat\"];\n const meterInfo_signatureEncoding = meterInfo?.[\"signatureEncoding\"];\n\n const connectorInfo = chargyLib.asJSONObject(SomeJSON[\"connectorInfo\"]);\n const connectorInfo_type = connectorInfo?.[\"type\"];\n const connectorInfo_losses = connectorInfo?.[\"losses\"];\n\n const chargingCostsInfo = chargyLib.asJSONObject(SomeJSON[\"chargingCostsInfo\"]);\n const chargingCostsInfo_total = chargingCostsInfo?.[\"total\"];\n const chargingCostsInfo_currency = chargingCostsInfo?.[\"currency\"];\n const chargingCostsInfo_reservation = chargyLib.asJSONObject(chargingCostsInfo?.[\"reservation\"]);\n const chargingCostsInfo_reservation_cost = chargingCostsInfo_reservation?.[\"cost\"];\n const chargingCostsInfo_reservation_unit = chargingCostsInfo_reservation?.[\"unit\"];\n const chargingCostsInfo_energy = chargyLib.asJSONObject(chargingCostsInfo?.[\"energy\"]);\n const chargingCostsInfo_energy_cost = chargingCostsInfo_energy?.[\"cost\"];\n const chargingCostsInfo_energy_unit = chargingCostsInfo_energy?.[\"unit\"];\n const chargingCostsInfo_time = chargyLib.asJSONObject(chargingCostsInfo?.[\"time\"]);\n const chargingCostsInfo_time_cost = chargingCostsInfo_time?.[\"cost\"];\n const chargingCostsInfo_time_unit = chargingCostsInfo_time?.[\"unit\"];\n const chargingCostsInfo_idle = chargyLib.asJSONObject(chargingCostsInfo?.[\"idle\"]);\n const chargingCostsInfo_idle_cost = chargingCostsInfo_idle?.[\"cost\"];\n const chargingCostsInfo_idle_unit = chargingCostsInfo_idle?.[\"unit\"];\n const chargingCostsInfo_flat = chargyLib.asJSONObject(chargingCostsInfo?.[\"flat\"]);\n const chargingCostsInfo_flat_cost = chargingCostsInfo_flat?.[\"cost\"];\n\n const signedMeterValues = SomeJSON[\"signedMeterValues\"];\n\n\n if (!chargyLib.isMandatoryString(chargingSessionId))\n errors.push(this.chargy.GetLocalizedMessage(\"Missing or invalid charge transparency record identification!\"));\n\n //#region chargePointInfo\n\n if (!chargyLib.isMandatoryJSONObject(chargePointInfo))\n {\n errors.push(this.chargy.GetLocalizedMessage(\"MissingOrInvalidChargePointInfo\"));\n secondaryErrors += 19;\n }\n else\n {\n\n if (!chargyLib.isMandatoryString(evseId))\n errors.push(this.chargy.GetLocalizedMessage(\"MissingOrInvalidEVSEIdentification\"));\n\n //#region placeInfo\n\n if (!chargyLib.isMandatoryJSONObject(placeInfo))\n {\n errors.push(this.chargy.GetLocalizedMessage(\"MissingOrInvalidPlaceInfo\"));\n secondaryErrors += 8;\n }\n else\n {\n\n //#region geoLocation\n\n if (!chargyLib.isMandatoryJSONObject(geoLocation))\n {\n errors.push(this.chargy.GetLocalizedMessage(\"MissingOrInvalidGeoLocation\"));\n secondaryErrors += 2;\n }\n else\n {\n\n if (!chargyLib.isMandatoryNumber(geoLocation_lat))\n errors.push(this.chargy.GetLocalizedMessage(\"MissingOrInvalidGeoLocationLatitude\"));\n\n if (!chargyLib.isMandatoryNumber(geoLocation_lon))\n errors.push(this.chargy.GetLocalizedMessage(\"MissingOrInvalidGeoLocationLongitude\"));\n\n }\n\n //#endregion\n\n //#region address\n\n if (!chargyLib.isMandatoryJSONObject(address))\n {\n errors.push(this.chargy.GetLocalizedMessage(\"MissingOrInvalidAddress\"));\n secondaryErrors += 4;\n }\n else\n {\n\n if (!chargyLib.isMandatoryString(address_street))\n errors.push(this.chargy.GetLocalizedMessage(\"MissingOrInvalidAddressStreetName\"));\n\n if (!chargyLib.isMandatoryString(address_zipCode))\n errors.push(this.chargy.GetLocalizedMessage(\"MissingOrInvalidAddressZIPCode\"));\n\n if (!chargyLib.isMandatoryString(address_town))\n errors.push(this.chargy.GetLocalizedMessage(\"MissingOrInvalidAddressCityName\"));\n\n if (!chargyLib.isMandatoryString(address_country))\n errors.push(this.chargy.GetLocalizedMessage(\"MissingOrInvalidAddressCountryName\"));\n\n }\n\n //#endregion\n\n }\n\n //#endregion\n\n }\n\n //#endregion\n\n //#region chargingStationInfo\n\n if (!chargyLib.isMandatoryJSONObject(chargingStationInfo))\n {\n errors.push(this.chargy.GetLocalizedMessage(\"MissingOrInvalidChargingStationInfo\"));\n secondaryErrors += 5;\n }\n else\n {\n\n if (!chargyLib.isOptionalString(chargingStation_manufacturer))\n errors.push(this.chargy.GetLocalizedMessage(\"Invalid charging station manufacturer!\"));\n\n if (!chargyLib.isOptionalString(chargingStation_type))\n errors.push(this.chargy.GetLocalizedMessage(\"Invalid charging station type!\"));\n\n if (!chargyLib.isOptionalString(chargingStation_serialNumber))\n errors.push(this.chargy.GetLocalizedMessage(\"Invalid charging station serial number!\"));\n\n if (!chargyLib.isOptionalString(chargingStation_controllerSoftwareVersion))\n errors.push(this.chargy.GetLocalizedMessage(\"Invalid charging station controller software version!\"));\n\n\n if (!chargyLib.isOptionalString(chargingStation_compliance))\n errors.push(this.chargy.GetLocalizedMessage(\"Invalid charging station compliance!\"));\n\n if (!chargyLib.isOptionalURL (chargingStation_complianceURL))\n errors.push(this.chargy.GetLocalizedMessage(\"Invalid charging station compliance URL!\"));\n\n\n if (!chargyLib.isOptionalString(chargingStation_conformity))\n errors.push(this.chargy.GetLocalizedMessage(\"Invalid charging station conformity!\"));\n\n if (!chargyLib.isOptionalURL (chargingStation_conformity_URL))\n errors.push(this.chargy.GetLocalizedMessage(\"Invalid charging station conformity URL!\"));\n\n if (!chargyLib.isOptionalURL (chargingStation_conformity_certificateId))\n errors.push(this.chargy.GetLocalizedMessage(\"Invalid charging station conformity certificate identification!\"));\n\n\n if (!chargyLib.isOptionalString(chargingStation_calibration))\n errors.push(this.chargy.GetLocalizedMessage(\"Invalid charging station calibration!\"));\n\n if (!chargyLib.isOptionalURL (chargingStation_calibration_URL))\n errors.push(this.chargy.GetLocalizedMessage(\"Invalid charging station calibration URL!\"));\n\n if (!chargyLib.isOptionalURL (chargingStation_calibration_certificateId))\n errors.push(this.chargy.GetLocalizedMessage(\"Invalid charging station calibration certificate identification!\"));\n\n }\n\n //#endregion\n\n //#region meterInfo\n\n if (meterInfo) {\n\n if (!chargyLib.isOptionalString(meterInfo_meterId))\n errors.push(this.chargy.GetLocalizedMessageWithParameter(\"MissingOrInvalid_SignedMeterValue_MeterInfo_MeterIdP\", 1));\n\n if (!chargyLib.isOptionalString(meterInfo_manufacturer))\n errors.push(this.chargy.GetLocalizedMessageWithParameter(\"MissingOrInvalid_SignedMeterValue_MeterInfo_ManufacturerP\", 1));\n\n if (!chargyLib.isOptionalString(meterInfo_manufacturerURL))\n errors.push(this.chargy.GetLocalizedMessageWithParameter(\"MissingOrInvalid_SignedMeterValue_MeterInfo_ManufacturerP\", 1));\n\n if (!chargyLib.isOptionalString(meterInfo_model))\n errors.push(this.chargy.GetLocalizedMessageWithParameter(\"MissingOrInvalid_SignedMeterValue_MeterInfo_ManufacturerP\", 1));\n\n if (!chargyLib.isOptionalString(meterInfo_modelURL))\n errors.push(this.chargy.GetLocalizedMessageWithParameter(\"MissingOrInvalid_SignedMeterValue_MeterInfo_ManufacturerP\", 1));\n\n if (!chargyLib.isOptionalString(meterInfo_firmwareVersion))\n errors.push(this.chargy.GetLocalizedMessageWithParameter(\"MissingOrInvalid_SignedMeterValue_MeterInfo_FirmwareVersionP\", 1));\n\n if (!chargyLib.isOptionalString(meterInfo_hardwareVersion))\n errors.push(this.chargy.GetLocalizedMessageWithParameter(\"MissingOrInvalid_SignedMeterValue_MeterInfo_FirmwareVersionP\", 1));\n\n\n if (!chargyLib.isOptionalString(meterInfo_publicKey))\n errors.push(this.chargy.GetLocalizedMessageWithParameter(\"MissingOrInvalid_SignedMeterValue_MeterInfo_PublicKeyP\", 1));\n\n if (!chargyLib.isOptionalString(meterInfo_publicKeyFormat))\n errors.push(this.chargy.GetLocalizedMessageWithParameter(\"MissingOrInvalid_SignedMeterValue_MeterInfo_PublicKeyP\", 1));\n\n if (!chargyLib.isOptionalString(meterInfo_publicKeyEncoding))\n errors.push(this.chargy.GetLocalizedMessageWithParameter(\"MissingOrInvalid_SignedMeterValue_MeterInfo_PublicKeyP\", 1));\n\n\n if (!chargyLib.isOptionalString(meterInfo_signatureFormat))\n errors.push(this.chargy.GetLocalizedMessageWithParameter(\"MissingOrInvalid_SignedMeterValue_MeterInfo_PublicKeyP\", 1));\n\n if (!chargyLib.isOptionalString(meterInfo_signatureEncoding))\n errors.push(this.chargy.GetLocalizedMessageWithParameter(\"MissingOrInvalid_SignedMeterValue_MeterInfo_PublicKeyP\", 1));\n\n }\n\n //#endregion\n\n //#region connectorInfo\n\n if (connectorInfo) {\n\n if (!chargyLib.isOptionalString(connectorInfo_type))\n errors.push(this.chargy.GetLocalizedMessageWithParameter(\"MissingOrInvalid_SignedMeterValue_MeterInfo_MeterIdP\", 1));\n\n if (!chargyLib.isOptionalString(connectorInfo_losses))\n errors.push(this.chargy.GetLocalizedMessageWithParameter(\"MissingOrInvalid_SignedMeterValue_MeterInfo_MeterIdP\", 1));\n\n }\n\n //#endregion\n\n //#region chargingCostsInfo\n\n if (chargingCostsInfo)\n {\n\n if (!chargyLib.isMandatoryNumber(chargingCostsInfo_total))\n errors.push(this.chargy.GetLocalizedMessage(\"Missing or invalid total costs within the charging costs!\"));\n\n if (!chargyLib.isMandatoryString(chargingCostsInfo_currency))\n errors.push(this.chargy.GetLocalizedMessage(\"Missing or invalid currency within the charging costs!\"));\n\n if (chargingCostsInfo_reservation)\n {\n\n if (!chargyLib.isMandatoryNumber(chargingCostsInfo_reservation_cost))\n errors.push(this.chargy.GetLocalizedMessage(\"Missing or invalid reservation cost within the charging costs!\"));\n\n // ToDo: Check for valid reservation unit\n if (!chargyLib.isMandatoryString(chargingCostsInfo_reservation_unit))\n errors.push(this.chargy.GetLocalizedMessage(\"Missing or invalid reservation unit within the charging costs!\"));\n\n }\n\n if (chargingCostsInfo_energy)\n {\n\n if (!chargyLib.isMandatoryNumber(chargingCostsInfo_energy_cost))\n errors.push(this.chargy.GetLocalizedMessage(\"Missing or invalid energy cost within the charging costs!\"));\n\n // ToDo: Check for valid energy unit\n if (!chargyLib.isMandatoryString(chargingCostsInfo_energy_unit))\n errors.push(this.chargy.GetLocalizedMessage(\"Missing or invalid energy unit within the charging costs!\"));\n\n }\n\n if (chargingCostsInfo_time)\n {\n\n if (!chargyLib.isMandatoryNumber(chargingCostsInfo_time_cost))\n errors.push(this.chargy.GetLocalizedMessage(\"Missing or invalid time cost within the charging costs!\"));\n\n // ToDo: Check for valid time unit\n if (!chargyLib.isMandatoryString(chargingCostsInfo_time_unit))\n errors.push(this.chargy.GetLocalizedMessage(\"Missing or invalid time unit within the charging costs!\"));\n\n }\n\n if (chargingCostsInfo_idle)\n {\n\n if (!chargyLib.isMandatoryNumber(chargingCostsInfo_idle_cost))\n errors.push(this.chargy.GetLocalizedMessage(\"Missing or invalid idle cost within the charging costs!\"));\n\n // ToDo: Check for valid idle unit\n if (!chargyLib.isMandatoryString(chargingCostsInfo_idle_unit))\n errors.push(this.chargy.GetLocalizedMessage(\"Missing or invalid idle unit within the charging costs!\"));\n\n }\n\n if (chargingCostsInfo_flat)\n {\n\n if (!chargyLib.isMandatoryNumber(chargingCostsInfo_flat_cost))\n errors.push(this.chargy.GetLocalizedMessage(\"Missing or invalid flat cost within the charging costs!\"));\n\n }\n\n }\n\n //#endregion\n\n if (!chargyLib.isMandatoryJSONArray(signedMeterValues) || signedMeterValues.length < 2) {\n errors.push(this.chargy.GetLocalizedMessage(\"MissingOrInvalidSignedMeterValues\"));\n secondaryErrors += 2*39;\n }\n else\n {\n\n const firstSMV = chargyLib.asJSONObject(signedMeterValues[0]);\n const smvContext = chargyLib.asString(firstSMV?.[\"@context\"])?.trim()\n ?? chargyLib.asString(firstSMV?.[\"format\"])?.trim()\n ?? null;\n\n for (let i = 1; i < signedMeterValues.length; i++)\n {\n\n const currentSMV = chargyLib.asJSONObject(signedMeterValues[i]);\n const context = chargyLib.asString(currentSMV?.[\"@context\"])?.trim()\n ?? chargyLib.asString(currentSMV?.[\"format\"])?.trim()\n ?? null;\n\n if (smvContext !== context) return {\n status: chargyInterfaces.SessionVerificationResult.InvalidSessionFormat,\n message: \"Inconsistent signed meter value format!\",\n certainty: 1\n }\n\n }\n\n\n //#region Generate default-transparency record\n\n const evseIdStr = chargyLib.asString(evseId) ?? \"\";\n\n const CTR: chargeTransparencyRecord.IChargeTransparencyRecord = {\n\n \"@id\": \"\",\n \"@context\": \"https://open.charging.cloud/contexts/CTR+json\",\n\n \"description\": {\n \"de\": \"Alle Ladevorgänge\",\n \"en\": \"All charging sessions\"\n },\n\n \"chargingStationOperators\": [\n {\n\n \"@id\": \"chargeITmobilityCSO\",\n \"description\": {\n \"de\": \"chargeIT mobility GmbH - Charging Station Operator Services\"\n },\n\n \"contact\": {\n \"email\": \"info@chargeit-mobility.com\",\n \"web\": \"https://www.chargeit-mobility.com\",\n \"logoUrl\": \"http://www.chargeit-mobility.com/fileadmin/BELECTRIC_Drive/templates/pics/chargeit_logo_408x70.png\",\n \"publicKeys\": [\n {\n \"algorithm\": \"secp192r1\",\n \"format\": \"DER\",\n \"encoding\": \"hex\",\n \"value\": \"042313b9e469612b4ca06981bfdecb226e234632b01d84b6a814f63a114b7762c34ddce2e6853395b7a0f87275f63ffe3c\",\n \"signatures\": [\n {\n \"keyId\": \"...\",\n \"algorithm\": \"secp192r1\",\n \"format\": \"DER\",\n \"value\": \"????\"\n }\n ]\n },\n {\n \"algorithm\": \"secp256k1\",\n \"format\": \"DER\",\n \"encoding\": \"hex\",\n \"value\": \"04a8ff0d82107922522e004a167cc658f0eef408c5020f98e7a2615be326e61852666877335f4f8d9a0a756c26f0c9fb3f401431416abb5317cc0f5d714d3026fe\",\n \"signatures\": [ ]\n }\n ]\n },\n\n \"support\": {\n \"hotline\": \"+49 9321 / 2680 - 700\",\n \"email\": \"service@chargeit-mobility.com\",\n \"web\": \"https://cso.chargeit.charging.cloud/issues\"\n // \"mediationServices\": [ \"GraphDefined Mediation\" ],\n // \"publicKeys\": [\n // {\n // \"algorithm\": \"secp256k1\",\n // \"format\": \"DER\",\n // \"value\": \"04a8ff0d82107922522e004a167cc658f0eef408c5020f98e7a2615be326e61852666877335f4f8d9a0a756c26f0c9fb3f401431416abb5317cc0f5d714d3026fe\",\n // \"signatures\": [ ]\n // }\n // ]\n },\n\n \"privacy\": {\n \"contact\": \"Dr. iur. Christian Borchers, datenschutz süd GmbH\",\n \"email\": \"datenschutz@chargeit-mobility.com\",\n \"web\": \"http://www.chargeit-mobility.com/de/datenschutz/\"\n // \"publicKeys\": [\n // {\n // \"algorithm\": \"secp256k1\",\n // \"format\": \"DER\",\n // \"value\": \"04a8ff0d82107922522e004a167cc658f0eef408c5020f98e7a2615be326e61852666877335f4f8d9a0a756c26f0c9fb3f401431416abb5317cc0f5d714d3026fe\",\n // \"signatures\": [ ]\n // }\n // ]\n },\n\n \"chargingStations\": [\n {\n \"@id\": evseIdStr.substring(0, evseIdStr.lastIndexOf(\"*\")),\n //\"@context\": \"\",\n //\"description\": { },\n //\"firmwareVersion\": \"\", //CTRArray[0][\"chargePoint\"][\"softwareVersion\"],\n \"geoLocation\": { \"lat\": chargyLib.asNumber(geoLocation_lat) ?? 0, \"lng\": chargyLib.asNumber(geoLocation_lon) ?? 0 },\n \"address\": {\n //\"@context\": \"\",\n \"street\": chargyLib.asString(address_street),\n \"postalCode\": chargyLib.asString(address_zipCode) ?? \"\",\n \"city\": chargyLib.asString(address_town) ?? \"\",\n \"country\": chargyLib.asString(address_country) ?? \"\"\n },\n \"EVSEs\": [\n {\n \"@id\": evseIdStr,\n //\"@context\": \"\",\n // \"description\": {\n // \"de\": \"GraphDefined EVSE - CI-Tests Pool 3 / Station A / EVSE 1\"\n // },\n //\"connectors\": [ ],\n \"meters\": [ ]\n }\n ]\n }\n ]\n\n }\n ],\n\n certainty: 0\n\n };\n\n //#endregion\n\n if (smvContext?.startsWith(\"https://www.chargeit-mobility.com/contexts/bsm-ws36a-json\"))\n return new BSMCrypt01(this.chargy).tryToParseBSM_WS36aMeasurements(CTR, evseIdStr, chargyLib.asString(chargingStation_controllerSoftwareVersion) ?? null, signedMeterValues);\n\n if (smvContext?.startsWith(\"ALFEN\"))\n return new Alfen(this.chargy).TryToParseALFENFormat(\n signedMeterValues.map(value => chargyLib.asString(chargyLib.asJSONObject(value)?.[\"payload\"]) ?? \"\"),\n {\n chargingSession: {\n \"@id\": chargingSessionId\n },\n EVSEId: evseId,\n chargingStation: {\n manufacturer: chargingStation_manufacturer,\n type: chargingStation_type,\n serialNumber: chargingStation_serialNumber,\n firmwareVersion: chargingStation_controllerSoftwareVersion,\n legalCompliance: {\n conformity: [{\n\n freeText: chargingStation_compliance\n }],\n calibration: [{\n freeText: chargingStation_calibration\n }]\n },\n geoLocation: { \"lat\": geoLocation_lat, \"lng\": geoLocation_lon },\n address: { \"street\": address_street, \"postalCode\": address_zipCode, \"city\": address_town, \"country\": address_country }\n },\n energyMeter: meterInfo,\n connector: connectorInfo,\n chargingCosts: chargingCostsInfo\n });\n\n }\n\n return {\n status: chargyInterfaces.SessionVerificationResult.InvalidSessionFormat,\n errors: errors,\n warnings: warnings,\n certainty: (numberOfFormatChecks - errors.length - secondaryErrors)/numberOfFormatChecks\n }\n\n }\n catch (exception)\n {\n return {\n status: chargyInterfaces.SessionVerificationResult.InvalidSessionFormat,\n message: \"Exception occured: \" + (exception instanceof Error ? exception.message : String(exception)),\n errors: errors,\n warnings: warnings,\n certainty: (numberOfFormatChecks - errors.length - secondaryErrors)/numberOfFormatChecks\n }\n }\n\n }\n\n //#endregion\n\n return {\n status: chargyInterfaces.SessionVerificationResult.InvalidSessionFormat,\n message: \"No chargeIT charge transparency record\",\n errors: errors,\n warnings: warnings,\n certainty: 0\n }\n\n }\n\n //#endregion\n\n}\n","/*\n * Copyright (c) 2018-2026 GraphDefined GmbH <achim.friedland@graphdefined.com>\n * This file is part of Chargy WebApp <https://github.com/OpenChargingCloud/ChargyWebApp>\n *\n * Licensed under the Affero GPL license, Version 3.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.gnu.org/licenses/agpl.html\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { Chargy } from './chargy'\nimport { ACrypt } from './ACrypt'\nimport * as chargyInterfaces from './interfaces/chargyInterfaces'\nimport * as chargeTransparencyRecord from './interfaces/IChargeTransparencyRecord'\nimport * as chargyLib from './chargyLib'\nimport Decimal from 'decimal.js';\n\n\nexport const PCDF_PREFIX = \"128.8.0\";\n\nexport const PCDF_FIELD_ORDER = [\n \"ST\",\n \"CT\",\n \"CD\",\n \"TV\",\n \"BV\",\n \"CSC\",\n \"SP\",\n \"RV\",\n \"SI\",\n \"CS\",\n \"HW\",\n \"DT\",\n \"PK\",\n \"SG\"\n] as const;\n\nconst PCDF_PUBLIC_KEY_CONTEXT = \"https://open.charging.cloud/contexts/publicKey+json\";\nconst PCDF_SESSION_CONTEXT = \"https://open.charging.cloud/contexts/SessionSignatureFormats/PCDF+json\";\nconst PCDF_SPKI_P256_PREFIX = \"3059301306072a8648ce3d020106082a8648ce3d030107034200\";\n\nexport type PCDFFieldKey = typeof PCDF_FIELD_ORDER[number];\n\nexport interface IPCDFRawFields extends Record<PCDFFieldKey, string> {\n ST: string;\n CT: string;\n CD: string;\n TV: string;\n BV: string;\n CSC: string;\n SP: string;\n RV: string;\n SI: string;\n CS: string;\n HW: string;\n DT: string;\n PK: string;\n SG: string;\n}\n\nexport interface IPCDFSessionInfo {\n idTag: string;\n idTagType: string;\n transactionId: string;\n}\n\nexport interface IPCDFValidatedData {\n startTime: string;\n stopTime: string;\n durationSeconds: number;\n timeValid: boolean;\n billingValid: boolean;\n chargingSessionCounter: number;\n stopPresent: boolean;\n readingValue: Decimal;\n readingUnit: string;\n session: IPCDFSessionInfo;\n softwareChecksum: string;\n hardwareSerial: string;\n dcMeterType: number;\n publicKey: chargyInterfaces.IPublicKeyXY;\n signature: chargyInterfaces.ISignatureRS;\n}\n\nexport interface IPCDFDocument {\n \"@context\": \"PCDF\";\n raw: string;\n fields: IPCDFRawFields;\n signedPayload: string;\n hashAlgorithm: string;\n hashValue: string;\n data: IPCDFValidatedData;\n publicKeyHex: string;\n signatureHex: string;\n validationStatus: chargyInterfaces.VerificationResult;\n}\n\nexport interface IPCDFMeasurementValue extends chargeTransparencyRecord.IMeasurementValue {\n pcdfDocument?: IPCDFDocument;\n}\n\nexport interface IPCDFMeasurement extends chargeTransparencyRecord.IMeasurement {\n values: Array<IPCDFMeasurementValue>;\n}\n\nexport interface IPCDFChargingSession extends chargeTransparencyRecord.IChargingSession {\n measurements: Array<IPCDFMeasurement>;\n}\n\nexport interface IPCDFChargeTransparencyRecord extends chargeTransparencyRecord.IChargeTransparencyRecord {\n pcdf?: {\n chargingSessionCounter: number;\n timeValid: boolean;\n billingValid: boolean;\n stopPresent: boolean;\n chargingDuration: number;\n dcMeterType: number;\n softwareChecksum: string;\n };\n chargingSessions?: Array<IPCDFChargingSession>;\n}\n\nexport class PCDFParseError extends Error {\n\n constructor(readonly code: string,\n message: string,\n readonly field?: PCDFFieldKey) {\n super(message);\n this.name = \"PCDFParseError\";\n }\n\n}\n\nexport class PCDFValidationError extends Error {\n\n constructor(readonly errors: Array<string>) {\n super(errors.join(\"; \"));\n this.name = \"PCDFValidationError\";\n }\n\n}\n\nexport function isPCDFText(input: string | undefined): boolean {\n\n if (input == null)\n return false;\n\n const cleaned = stripPCDFControlCharacters(unquotePCDFText(input));\n\n return cleaned.startsWith(PCDF_PREFIX);\n\n}\n\nexport function unquotePCDFText(input: string): string {\n\n const trimmed = input.trim();\n\n if (trimmed.startsWith(\"\\\"\") && trimmed.endsWith(\"\\\"\"))\n return trimmed.substring(1, trimmed.length - 1);\n\n return trimmed;\n\n}\n\nexport function stripPCDFControlCharacters(input: string): string {\n\n let cleaned = input.trim();\n\n if (cleaned.charCodeAt(0) === 0x02)\n cleaned = cleaned.substring(1);\n\n if (cleaned.charCodeAt(cleaned.length - 1) === 0x03)\n cleaned = cleaned.substring(0, cleaned.length - 1);\n\n return cleaned.trim();\n\n}\n\nexport function parsePCDFDocument(input: string): {\n raw: string;\n fields: IPCDFRawFields;\n signedPayload: string;\n} {\n\n let cleaned = stripPCDFControlCharacters(unquotePCDFText(input));\n const prefixIndex = cleaned.indexOf(PCDF_PREFIX);\n\n if (prefixIndex < 0)\n throw new PCDFParseError(\"MISSING_PREFIX\", \"Charging data is not valid\");\n\n cleaned = cleaned.substring(prefixIndex);\n\n const signatureIndex = cleaned.indexOf(\"(SG:\");\n\n if (signatureIndex < 0)\n throw new PCDFParseError(\"MISSING_SIGNATURE\", \"No signature present in data tuple\", \"SG\");\n\n const fieldPattern = new RegExp(\n \"^\" +\n PCDF_PREFIX.replace(/\\./g, \"\\\\.\") +\n PCDF_FIELD_ORDER.map(field => \"\\\\(\" + field + \":([^)]*)\\\\)\").join(\"\") +\n \"$\"\n );\n\n const match = cleaned.match(fieldPattern);\n\n if (match == null)\n {\n const foundFields = new Set<PCDFFieldKey>();\n const fieldRegex = /\\(([A-Z]{2,3}):([^)]*)\\)/g;\n\n let fieldMatch: RegExpExecArray | null;\n while ((fieldMatch = fieldRegex.exec(cleaned)) !== null)\n {\n const field = fieldMatch[1];\n if (PCDF_FIELD_ORDER.includes(field as PCDFFieldKey))\n foundFields.add(field as PCDFFieldKey);\n }\n\n const missingFields = PCDF_FIELD_ORDER.filter(field => !foundFields.has(field));\n\n if (missingFields.length > 0)\n throw new PCDFParseError(\n \"MISSING_FIELDS\",\n \"Missing fields in the data tuple: \" + missingFields.join(\", \"),\n missingFields[0]\n );\n\n throw new PCDFParseError(\"INVALID_FIELD_ORDER\", \"Charging data is not valid\");\n }\n\n const fields = {} as IPCDFRawFields;\n\n for (let i = 0; i < PCDF_FIELD_ORDER.length; i++)\n {\n const value = match[i + 1];\n const field = PCDF_FIELD_ORDER[i];\n\n if (field == null || value == null)\n throw new PCDFParseError(\"MISSING_FIELDS\", \"Missing fields in the data tuple\", field);\n\n fields[field] = value;\n }\n\n return {\n raw: cleaned,\n fields: fields,\n signedPayload: cleaned.substring(0, signatureIndex)\n };\n\n}\n\nexport function validatePCDFFields(fields: IPCDFRawFields): IPCDFValidatedData {\n\n const errors = new Array<string>();\n\n const startTime = parsePCDFTimestamp(fields.ST, \"ST\", errors);\n const stopTime = parsePCDFTimestamp(fields.CT, \"CT\", errors);\n const durationSeconds = parsePCDFDuration(fields.CD, errors);\n const timeValid = parsePCDFFlag(fields.TV, \"TV\", errors);\n const billingValid = parsePCDFFlag(fields.BV, \"BV\", errors);\n const chargingSessionCounter = parsePCDFInteger(fields.CSC, \"CSC\", errors);\n const stopPresent = parsePCDFFlag(fields.SP, \"SP\", errors);\n const reading = parsePCDFReadingValue(fields.RV, errors);\n const session = parsePCDFSessionInfo(fields.SI, errors);\n const dcMeterType = parsePCDFInteger(fields.DT, \"DT\", errors);\n\n if (startTime != null && stopTime != null && stopTime < startTime)\n errors.push(\"Corrupt time information: CT must be greater than or equal to ST\");\n\n if (billingValid === false)\n errors.push(\"Billing not possible. DCMeter error\");\n\n if (stopPresent !== true)\n errors.push(\"Charge session does not include the last data\");\n\n if (!/^[0-9a-fA-F]{8}$/.test(fields.CS))\n errors.push(\"CS must be exactly 8 hex characters\");\n\n if (fields.HW.length !== 11)\n errors.push(\"HW must be exactly 11 characters\");\n\n let publicKey: chargyInterfaces.IPublicKeyXY | undefined;\n let publicKeyHex: string;\n\n try\n {\n publicKeyHex = normalizePCDFPublicKeyHex(fields.PK);\n publicKey = parsePCDFPublicKey(publicKeyHex);\n }\n catch (exception)\n {\n errors.push(exception instanceof Error ? exception.message : \"Invalid public key\");\n }\n\n let signature: chargyInterfaces.ISignatureRS | undefined;\n\n try\n {\n signature = parsePCDFSignature(fields.SG);\n }\n catch (exception)\n {\n errors.push(exception instanceof Error ? exception.message : \"Invalid signature\");\n }\n\n if (errors.length > 0 ||\n startTime == null ||\n stopTime == null ||\n durationSeconds == null ||\n timeValid == null ||\n billingValid == null ||\n chargingSessionCounter == null ||\n stopPresent == null ||\n reading == null ||\n session == null ||\n dcMeterType == null ||\n publicKey == null ||\n signature == null)\n {\n throw new PCDFValidationError(errors.length > 0 ? errors : [ \"Session information is invalid\" ]);\n }\n\n return {\n startTime: startTime.toISOString(),\n stopTime: stopTime.toISOString(),\n durationSeconds: durationSeconds,\n timeValid: timeValid,\n billingValid: billingValid,\n chargingSessionCounter: chargingSessionCounter,\n stopPresent: stopPresent,\n readingValue: reading.value,\n readingUnit: reading.unit,\n session: session,\n softwareChecksum: fields.CS.toLowerCase(),\n hardwareSerial: fields.HW,\n dcMeterType: dcMeterType,\n publicKey: publicKey,\n signature: signature\n };\n\n}\n\nexport function normalizePCDFPublicKeyHex(publicKeyHex: string): string {\n\n const normalized = publicKeyHex.replace(/\\s+/g, \"\").toLowerCase();\n const rawPoint = normalized.startsWith(PCDF_SPKI_P256_PREFIX)\n ? normalized.substring(PCDF_SPKI_P256_PREFIX.length)\n : normalized;\n\n if (!/^[0-9a-f]+$/.test(rawPoint))\n throw new Error(\"Invalid public key encoding\");\n\n if (rawPoint.length !== 130)\n throw new Error(\"Invalid public key length\");\n\n if (!rawPoint.startsWith(\"04\"))\n throw new Error(\"Invalid public key format\");\n\n return rawPoint;\n\n}\n\nexport function parsePCDFPublicKey(publicKeyHex: string): chargyInterfaces.IPublicKeyXY {\n\n const normalized = normalizePCDFPublicKeyHex(publicKeyHex);\n\n return {\n algorithm: \"secp256r1\",\n format: \"XY\",\n encoding: chargyInterfaces.IEncoding.hex,\n value: normalized,\n x: normalized.substring( 2, 66),\n y: normalized.substring(66, 130)\n };\n\n}\n\nexport function parsePCDFSignature(signatureHex: string): chargyInterfaces.ISignatureRS {\n\n const bytes = hexToBytes(signatureHex, \"Invalid signature encoding\");\n let offset = 0;\n\n if (bytes[offset++] !== 0x30)\n throw new Error(\"Invalid signature\");\n\n const sequenceLength = readDERLength(bytes, () => offset, newOffset => offset = newOffset);\n\n if (offset + sequenceLength !== bytes.length)\n throw new Error(\"Invalid signature\");\n\n const r = readDERInteger(bytes, () => offset, newOffset => offset = newOffset);\n const s = readDERInteger(bytes, () => offset, newOffset => offset = newOffset);\n\n if (offset !== bytes.length)\n throw new Error(\"Invalid signature\");\n\n return {\n algorithm: chargyInterfaces.CryptoAlgorithms.ECC,\n format: chargyInterfaces.SignatureFormats.RS,\n r: r,\n s: s\n };\n\n}\n\nexport async function verifyPCDFDocument(document: IPCDFDocument,\n chargy: Chargy): Promise<chargyInterfaces.VerificationResult> {\n\n try\n {\n\n const curve = new chargy.elliptic.ec('p256');\n const publicKey = curve.keyFromPublic(document.publicKeyHex, 'hex');\n\n document.hashValue = await chargyLib.sha256(document.signedPayload);\n\n return publicKey.verify(document.hashValue, document.data.signature)\n ? chargyInterfaces.VerificationResult.ValidSignature\n : chargyInterfaces.VerificationResult.InvalidSignature;\n\n }\n catch\n {\n return chargyInterfaces.VerificationResult.InvalidSignature;\n }\n\n}\n\nexport class PCDFCrypt01 extends ACrypt {\n\n constructor(chargy: Chargy) {\n super(\"PCDF\",\n chargy);\n }\n\n async VerifyChargingSession(chargingSession: chargeTransparencyRecord.IChargingSession): Promise<chargyInterfaces.ISessionCryptoResult>\n {\n\n let sessionResult = chargyInterfaces.SessionVerificationResult.ValidSignature;\n let valueCount = 0;\n\n for (const measurement of chargingSession.measurements)\n {\n measurement.chargingSession = chargingSession;\n\n for (const measurementValue of measurement.values)\n {\n valueCount++;\n measurementValue.measurement = measurement;\n\n const result = await this.VerifyMeasurement(measurementValue);\n\n if (result.status !== chargyInterfaces.VerificationResult.ValidSignature)\n sessionResult = chargyInterfaces.SessionVerificationResult.InvalidSignature;\n }\n }\n\n if (valueCount === 0)\n sessionResult = chargyInterfaces.SessionVerificationResult.InvalidSessionFormat;\n\n return {\n status: sessionResult,\n certainty: .9\n };\n\n }\n\n async VerifyMeasurement(measurementValue: IPCDFMeasurementValue): Promise<chargyInterfaces.ICryptoResult>\n {\n\n measurementValue.method = this;\n\n const result: IPCDFCrypt01Result = {\n status: chargyInterfaces.VerificationResult.InvalidMeasurement\n };\n\n if (measurementValue.pcdfDocument == null)\n {\n measurementValue.result = result;\n return result;\n }\n\n result.status = measurementValue.pcdfDocument.validationStatus;\n result.hashValue = measurementValue.pcdfDocument.hashValue;\n result.publicKey = measurementValue.pcdfDocument.publicKeyHex;\n result.signature = measurementValue.pcdfDocument.data.signature;\n\n measurementValue.result = result;\n\n return Promise.resolve(result);\n\n }\n\n async ViewMeasurement(measurementValue: IPCDFMeasurementValue,\n errorDiv: HTMLDivElement,\n introDiv: HTMLDivElement,\n infoDiv: HTMLDivElement,\n PlainTextDiv: HTMLDivElement,\n HashedPlainTextDiv: HTMLDivElement,\n PublicKeyDiv: HTMLDivElement,\n SignatureExpectedDiv: HTMLDivElement,\n SignatureCheckDiv: HTMLDivElement) : Promise<Error | undefined>\n {\n\n void errorDiv;\n void infoDiv;\n void SignatureCheckDiv;\n\n if (measurementValue.measurement === undefined)\n return new Error(\"Invalid measurement!\");\n\n introDiv.innerHTML = this.chargy.GetLocalizedMessage(\"The following data of the charging session is relevant for metrological and legal metrological purposes and therefore part of the digital signature\").\n replace(\"{methodName}\", \"PCDF\").\n replace(\"{cryptoAlgorithm}\", \"ECDSA secp256r1 SHA256\");\n\n PlainTextDiv.innerText = measurementValue.pcdfDocument?.signedPayload ?? \"\";\n\n HashedPlainTextDiv.innerHTML = measurementValue.pcdfDocument?.hashValue.match(/.{1,8}/g)?.join(\" \") ?? \"\";\n\n PublicKeyDiv.innerHTML = measurementValue.pcdfDocument?.publicKeyHex.match(/.{1,8}/g)?.join(\" \") ?? \"\";\n\n SignatureExpectedDiv.innerHTML = measurementValue.pcdfDocument?.signatureHex.match(/.{1,8}/g)?.join(\" \") ?? \"\";\n\n return Promise.resolve(undefined);\n\n }\n\n}\n\nexport interface IPCDFCrypt01Result extends chargyInterfaces.ICryptoResult {\n hashValue?: string;\n publicKey?: string;\n signature?: chargyInterfaces.ISignatureRS;\n}\n\nexport class PCDF {\n\n constructor(private readonly chargy: Chargy) {\n }\n\n public async TryToParsePCDFDocument(PCDFDocument: string,\n externalPublicKey?: string): Promise<IPCDFChargeTransparencyRecord|chargyInterfaces.ISessionCryptoResult>\n {\n\n try\n {\n const parsed = parsePCDFDocument(PCDFDocument);\n const validated = validatePCDFFields(parsed.fields);\n const publicKey = normalizePCDFPublicKeyHex(parsed.fields.PK);\n\n if (externalPublicKey != null &&\n normalizePCDFPublicKeyHex(externalPublicKey) !== publicKey)\n {\n return {\n status: chargyInterfaces.SessionVerificationResult.InvalidPublicKey,\n message: \"Wrong Public Key\",\n certainty: 1\n };\n }\n\n const pcdfDocument: IPCDFDocument = {\n \"@context\": \"PCDF\",\n raw: parsed.raw,\n fields: parsed.fields,\n signedPayload: parsed.signedPayload,\n hashAlgorithm: \"SHA256\",\n hashValue: \"\",\n data: validated,\n publicKeyHex: publicKey,\n signatureHex: parsed.fields.SG,\n validationStatus: chargyInterfaces.VerificationResult.Unvalidated\n };\n\n pcdfDocument.validationStatus = await verifyPCDFDocument(pcdfDocument, this.chargy);\n\n return this.createChargeTransparencyRecord(pcdfDocument);\n }\n catch (exception)\n {\n return {\n status: exception instanceof PCDFParseError\n ? chargyInterfaces.SessionVerificationResult.InvalidSessionFormat\n : chargyInterfaces.SessionVerificationResult.InvalidSessionFormat,\n message: exception instanceof Error\n ? exception.message\n : String(exception),\n certainty: 0\n };\n }\n\n }\n\n private createChargeTransparencyRecord(document: IPCDFDocument): IPCDFChargeTransparencyRecord {\n\n const data = document.data;\n const virtualPoolId = \"DE*GEF*POOL*CHARGY*1\";\n const virtualStationId = \"DE*GEF*STATION*CHARGY*1\";\n const virtualEVSEId = \"DE*GEF*EVSE*CHARGY*1\";\n const meterId = data.hardwareSerial;\n const transactionId = data.session.transactionId || String(data.chargingSessionCounter);\n\n return {\n \"@id\": \"PCDF:\" + transactionId,\n \"@context\": \"https://open.charging.cloud/contexts/CTR+json\",\n \"begin\": data.startTime,\n \"end\": data.stopTime,\n \"description\": {\n \"de\": \"Porsche Charging Data Format Ladevorgang\",\n \"en\": \"Porsche Charging Data Format charging session\"\n },\n \"contract\": {\n \"@id\": data.session.idTag,\n \"type\": data.session.idTagType\n },\n \"pcdf\": {\n \"chargingSessionCounter\": data.chargingSessionCounter,\n \"timeValid\": data.timeValid,\n \"billingValid\": data.billingValid,\n \"stopPresent\": data.stopPresent,\n \"chargingDuration\": data.durationSeconds,\n \"dcMeterType\": data.dcMeterType,\n \"softwareChecksum\": data.softwareChecksum\n },\n \"chargingPools\": [{\n \"@id\": virtualPoolId,\n \"description\": { \"en\": \"GraphDefined CHARGY Virtual Charging Pool 1\" },\n \"chargingStations\": [{\n \"@id\": virtualStationId,\n \"description\": { \"en\": \"GraphDefined CHARGY Virtual Charging Station 1\" },\n \"EVSEs\": [{\n \"@id\": virtualEVSEId,\n \"description\": { \"en\": \"GraphDefined CHARGY Virtual EVSE 1\" },\n \"meters\": [{\n \"@id\": meterId,\n \"manufacturer\": \"Porsche\",\n \"model\": data.dcMeterType === 0 ? \"PES DCMeter EU\" : \"Unknown DC Meter\",\n \"firmwareChecksum\": data.softwareChecksum,\n \"signatureFormat\": \"https://open.charging.cloud/contexts/EnergyMeterSignatureFormats/PCDF+json\",\n \"publicKeys\": [{\n \"algorithm\": \"secp256r1\",\n \"encoding\": chargyInterfaces.IEncoding.hex,\n \"format\": \"XY\",\n \"value\": document.publicKeyHex\n }]\n }]\n }]\n }]\n }],\n \"publicKeys\": [{\n \"@id\": meterId,\n \"@context\": PCDF_PUBLIC_KEY_CONTEXT,\n \"subject\": meterId,\n \"algorithm\": \"secp256r1\",\n \"encoding\": chargyInterfaces.IEncoding.hex,\n \"value\": document.publicKeyHex,\n \"certainty\": 1\n }],\n \"chargingSessions\": [{\n \"@id\": transactionId,\n \"@context\": PCDF_SESSION_CONTEXT,\n \"begin\": data.startTime,\n \"end\": data.stopTime,\n \"internalSessionId\": String(data.chargingSessionCounter),\n \"EVSEId\": virtualEVSEId,\n \"meterId\": meterId,\n \"authorizationStart\": {\n \"@id\": data.session.idTag,\n \"type\": data.session.idTagType\n },\n \"measurements\": [{\n \"energyMeterId\": meterId,\n \"name\": \"ENERGY_TOTAL\",\n \"obis\": PCDF_PREFIX,\n \"unit\": data.readingUnit,\n \"scale\": -3,\n \"signatureInfos\": {\n \"hash\": chargyInterfaces.CryptoHashAlgorithms.SHA256,\n \"algorithm\": chargyInterfaces.CryptoAlgorithms.ECC,\n \"curve\": chargyInterfaces.IECCurves.secp256r1,\n \"format\": chargyInterfaces.SignatureFormats.DER,\n \"encoding\": chargyInterfaces.IEncoding.hex\n },\n \"values\": [{\n \"timestamp\": data.stopTime,\n \"value\": data.readingValue,\n \"statusMeter\": data.stopPresent ? \"G\" : \"E\",\n \"signatures\": [ data.signature ],\n \"pcdfDocument\": document,\n \"result\": {\n \"status\": document.validationStatus\n }\n }]\n }]\n }],\n \"certainty\": 1\n };\n\n }\n\n}\n\nfunction parsePCDFTimestamp(value: string,\n field: string,\n errors: Array<string>): Date | undefined {\n\n if (!/^\\d{12}$/.test(value))\n {\n errors.push(\"Corrupt time information: \" + field);\n return undefined;\n }\n\n const year = Number.parseInt(value.substring( 0, 2), 10);\n const month = Number.parseInt(value.substring( 2, 4), 10);\n const day = Number.parseInt(value.substring( 4, 6), 10);\n const hour = Number.parseInt(value.substring( 6, 8), 10);\n const minute = Number.parseInt(value.substring( 8, 10), 10);\n const second = Number.parseInt(value.substring(10, 12), 10);\n\n if (year < 19 ||\n month < 1 || month > 12 ||\n day < 1 || day > 31 ||\n hour > 23 ||\n minute > 59 ||\n second > 59)\n {\n errors.push(\"Corrupt time information: \" + field);\n return undefined;\n }\n\n const timestamp = new Date(Date.UTC(2000 + year, month - 1, day, hour, minute, second));\n\n if (timestamp.getUTCFullYear() !== 2000 + year ||\n timestamp.getUTCMonth() !== month - 1 ||\n timestamp.getUTCDate() !== day ||\n timestamp.getUTCHours() !== hour ||\n timestamp.getUTCMinutes() !== minute ||\n timestamp.getUTCSeconds() !== second)\n {\n errors.push(\"Corrupt time information: \" + field);\n return undefined;\n }\n\n return timestamp;\n\n}\n\nfunction parsePCDFDuration(value: string,\n errors: Array<string>): number | undefined {\n\n if (!/^\\d{6}$/.test(value))\n {\n errors.push(\"Charging duration is invalid\");\n return undefined;\n }\n\n const hours = Number.parseInt(value.substring(0, 2), 10);\n const minutes = Number.parseInt(value.substring(2, 4), 10);\n const seconds = Number.parseInt(value.substring(4, 6), 10);\n\n if (minutes > 59 || seconds > 59)\n {\n errors.push(\"Charging duration is invalid\");\n return undefined;\n }\n\n return hours * 3600 + minutes * 60 + seconds;\n\n}\n\nfunction parsePCDFFlag(value: string,\n field: string,\n errors: Array<string>): boolean | undefined {\n\n if (value === \"0\")\n return false;\n\n if (value === \"1\")\n return true;\n\n errors.push(field + \" must be 0 or 1\");\n\n return undefined;\n\n}\n\nfunction parsePCDFInteger(value: string,\n field: string,\n errors: Array<string>): number | undefined {\n\n if (!/^\\d+$/.test(value))\n {\n errors.push(field + \" must be an integer\");\n return undefined;\n }\n\n return Number.parseInt(value, 10);\n\n}\n\nfunction parsePCDFReadingValue(value: string,\n errors: Array<string>): { value: Decimal; unit: string } | undefined {\n\n const match = value.match(/^(\\d{4})\\.(\\d{3})\\*kWh$/);\n\n if (match == null)\n {\n errors.push(\"Session information is invalid\");\n return undefined;\n }\n\n return {\n value: new Decimal(String(match[1]) + \".\" + String(match[2])),\n unit: \"kWh\"\n };\n\n}\n\nfunction parsePCDFSessionInfo(value: string,\n errors: Array<string>): IPCDFSessionInfo | undefined {\n\n const parts = value.split(\"*\");\n\n if (parts.length !== 3)\n {\n errors.push(\"Session information is invalid\");\n return undefined;\n }\n\n const idTag = parts[0] ?? \"\";\n const idTagType = parts[1] ?? \"\";\n const transactionId = parts[2] ?? \"\";\n\n if (idTag.length < 1 ||\n idTag.length > 36 ||\n idTagType.length !== 1 ||\n !/^[1-5]$/.test(idTagType) ||\n transactionId.length < 1 ||\n transactionId.length > 36 ||\n value.length < 5 ||\n value.length > 75)\n {\n errors.push(\"Session information is invalid\");\n return undefined;\n }\n\n return {\n idTag: idTag,\n idTagType: idTagType,\n transactionId: transactionId\n };\n\n}\n\nfunction hexToBytes(hex: string,\n errorMessage: string): Uint8Array {\n\n const normalized = hex.replace(/\\s+/g, \"\").toLowerCase();\n\n if (normalized.length === 0 ||\n normalized.length % 2 !== 0 ||\n !/^[0-9a-f]+$/.test(normalized))\n {\n throw new Error(errorMessage);\n }\n\n const bytes = new Uint8Array(normalized.length / 2);\n\n for (let i = 0; i < normalized.length; i += 2)\n bytes[i / 2] = Number.parseInt(normalized.substring(i, i + 2), 16);\n\n return bytes;\n\n}\n\nfunction readDERLength(bytes: Uint8Array,\n getOffset: () => number,\n setOffset: (offset: number) => void): number {\n\n let offset = getOffset();\n const b = bytes[offset++];\n\n if (b == null)\n throw new Error(\"Invalid signature\");\n\n if ((b & 0x80) === 0)\n {\n setOffset(offset);\n return b;\n }\n\n const octets = b & 0x7f;\n\n if (octets < 1 || octets > 2 || offset + octets > bytes.length)\n throw new Error(\"Invalid signature\");\n\n let length = 0;\n\n for (let i = 0; i < octets; i++)\n {\n const value = bytes[offset++];\n if (value == null)\n throw new Error(\"Invalid signature\");\n\n length = (length << 8) + value;\n }\n\n setOffset(offset);\n return length;\n\n}\n\nfunction readDERInteger(bytes: Uint8Array,\n getOffset: () => number,\n setOffset: (offset: number) => void): string {\n\n let offset = getOffset();\n\n if (bytes[offset++] !== 0x02)\n throw new Error(\"Invalid signature\");\n\n const length = readDERLength(bytes, () => offset, newOffset => offset = newOffset);\n\n if (length < 1 || offset + length > bytes.length)\n throw new Error(\"Invalid signature\");\n\n const value = bytes.slice(offset, offset + length);\n offset += length;\n setOffset(offset);\n\n let hex = Array.from(value).\n map(byte => byte.toString(16).padStart(2, \"0\")).\n join(\"\").\n replace(/^00+/, \"\");\n\n if (hex.length === 0)\n hex = \"0\";\n\n return hex;\n\n}\n","/*\r\n * Copyright (c) 2018-2026 GraphDefined GmbH <achim.friedland@graphdefined.com>\r\n * This file is part of Chargy Desktop App <https://github.com/OpenChargingCloud/ChargyDesktopApp>\r\n *\r\n * Licensed under the Affero GPL license, Version 3.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.gnu.org/licenses/agpl.html\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n\r\nimport { Chargy } from './chargy'\r\nimport { Alfen } from './Alfen'\r\nimport { OCMF } from './OCMF'\r\nimport * as chargyInterfaces from './interfaces/chargyInterfaces'\r\nimport * as chargeTransparencyRecord from './interfaces/IChargeTransparencyRecord'\r\nimport * as chargyLib from './chargyLib'\r\n\r\n\r\nexport interface ISAFEXMLEVSEContext {\r\n \"@id\": string;\r\n description?: chargyInterfaces.IMultilanguageText;\r\n meters: Array<chargyInterfaces.IMeter>;\r\n connector?: chargyInterfaces.IConnector & { \"@id\"?: string };\r\n}\r\n\r\nexport interface ISAFEXMLChargingStationInfo {\r\n \"@id\": string;\r\n description?: chargyInterfaces.IMultilanguageText;\r\n firmwareVersion?: string;\r\n softwareVersion?: string;\r\n geoLocation?: chargyInterfaces.IGeoLocation;\r\n EVSE?: ISAFEXMLEVSEContext;\r\n}\r\n\r\nexport interface ISAFEXMLChargingStationContext {\r\n ChargingStationId?: string;\r\n EVSEId?: string;\r\n chargingStation?: ISAFEXMLChargingStationInfo;\r\n EVSE?: ISAFEXMLEVSEContext;\r\n connector?: chargyInterfaces.IConnector & { \"@id\"?: string };\r\n}\r\n\r\n// https://github.com/SAFE-eV/transparenzsoftware/blob/archive/XML_Format.md\r\nexport class SAFEXML {\r\n\r\n private readonly chargy: Chargy;\r\n\r\n constructor(chargy: Chargy) {\r\n this.chargy = chargy;\r\n }\r\n\r\n\r\n public static ParseChargingStationContext(XMLDocument: Document): ISAFEXMLChargingStationContext {\r\n\r\n const chargingStationElement = chargyLib.getElementsByLocalName(XMLDocument, \"chargingStation\")[0];\r\n\r\n if (!chargingStationElement)\r\n return {};\r\n\r\n const chargingStationId = chargingStationElement.getAttribute(\"id\")?.trim() ||\r\n chargyLib.getTrimmedTextContent(chargyLib.getDirectChildByLocalName(chargingStationElement, \"id\"));\r\n const softwareVersion = chargyLib.getTrimmedTextContent(chargyLib.getDirectChildByLocalName(chargingStationElement, \"softwareVersion\"));\r\n const geoLocationElement = chargyLib.getDirectChildByLocalName(chargingStationElement, \"geoLocation\");\r\n\r\n const latitude = Number.parseFloat(chargyLib.getTrimmedTextContent(chargyLib.getDirectChildByLocalName(geoLocationElement ?? chargingStationElement, \"latitude\")) ?? \"\");\r\n const longitude = Number.parseFloat(chargyLib.getTrimmedTextContent(chargyLib.getDirectChildByLocalName(geoLocationElement ?? chargingStationElement, \"longitude\")) ?? \"\");\r\n\r\n const geoLocation = Number.isFinite(latitude) && Number.isFinite(longitude)\r\n ? { lat: latitude, lng: longitude }\r\n : undefined;\r\n\r\n if (chargyLib.getDirectChildByLocalName(chargingStationElement, \"EVSEs\"))\r\n throw new Error(\"The SAFE chargingStation XML element must contain EVSE directly and no EVSEs container element!\");\r\n\r\n const evseElements = chargyLib.getDirectChildrenByLocalName(chargingStationElement, \"EVSE\");\r\n\r\n if (evseElements.length > 1)\r\n throw new Error(\"The SAFE chargingStation XML element must not contain more than one EVSE element!\");\r\n\r\n const evseElement = evseElements[0];\r\n const evseId = evseElement?.getAttribute(\"id\")?.trim() ||\r\n chargyLib.getTrimmedTextContent(chargyLib.getDirectChildByLocalName(evseElement ?? chargingStationElement, \"id\")) ||\r\n \"\";\r\n const connectorElements = evseElement ? chargyLib.getDirectChildrenByLocalName(evseElement, \"connector\") : [];\r\n\r\n if (connectorElements.length > 1)\r\n throw new Error(\"The SAFE EVSE XML element must not contain more than one connector element!\");\r\n\r\n const connectorElement = connectorElements[0];\r\n const connectorId = connectorElement?.getAttribute(\"id\")?.trim();\r\n const connectorType = chargyLib.getTrimmedTextContent(chargyLib.getDirectChildByLocalName(connectorElement ?? evseElement ?? chargingStationElement, \"type\"));\r\n const connector = connectorType ? { \"@id\": connectorId, type: connectorType, looses: 0 } : undefined;\r\n\r\n const parsedEVSE: ISAFEXMLEVSEContext | undefined = evseElement\r\n ? {\r\n \"@id\": evseId,\r\n \"description\": chargyLib.parseDescription(evseElement),\r\n \"meters\": [],\r\n \"connector\": connector\r\n }\r\n : undefined;\r\n\r\n const chargingStation: ISAFEXMLChargingStationInfo = {\r\n \"@id\": chargingStationId ?? \"\",\r\n \"description\": chargyLib.parseDescription(chargingStationElement),\r\n \"firmwareVersion\": softwareVersion,\r\n \"softwareVersion\": softwareVersion,\r\n \"geoLocation\": geoLocation,\r\n \"EVSE\": parsedEVSE\r\n };\r\n\r\n return {\r\n \"ChargingStationId\": chargingStationId,\r\n \"EVSEId\": parsedEVSE?.[\"@id\"],\r\n \"chargingStation\": chargingStation,\r\n \"EVSE\": parsedEVSE,\r\n \"connector\": parsedEVSE?.connector\r\n };\r\n\r\n }\r\n\r\n //#region tryToParseSAFEXML(XMLDocument)\r\n\r\n public async tryToParseSAFEXML(XMLDocument: Document) : Promise<chargeTransparencyRecord.IChargeTransparencyRecord|chargyInterfaces.ISessionCryptoResult>\r\n {\r\n\r\n // The SAFE transparency software v1.0 does not understand its own\r\n // XML namespace. Therefore we have to guess the format.\r\n\r\n try\r\n {\r\n\r\n // <?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n // <values>\r\n //\r\n // <chargingStation id=\"DE*GEF*STATION*CI*TESTS*1*A\" xmlns=\"https://open.charging.cloud/CTR/2020/01\">\r\n //\r\n // <description language=\"en\">\r\n // GraphDefined Charging Station - CI-Tests Pool 1 / Station A\r\n // </description>\r\n // <softwareVersion>3.0.25.2089</softwareVersion>\r\n //\r\n // <geoLocation>\r\n // <latitude>50.387945</latitude>\r\n // <longitude>10.4304</longitude>\r\n // </geoLocation>\r\n //\r\n // <EVSE id=\"DE*GEF*EVSE*CI*TESTS*1*A*1\">\r\n // <description language=\"en\">\r\n // GraphDefined EVSE - CI-Tests Pool 1 / Station A / EVSE 1\r\n // </description>\r\n // <connector id=\"1\">\r\n // <type>Type-2</type>\r\n // </connector>\r\n // </EVSE>\r\n //\r\n // </chargingStation>\r\n //\r\n // <value transactionId=\"...\" context=\"Transaction.Begin\">\r\n // <signedData format=\"...\" encoding=\"...\">...</signedData>\r\n // <publicKey encoding=\"...\">...</publicKey>\r\n // </value>\r\n //\r\n // <value transactionId=\"...\" context=\"Transaction.End\">\r\n // <signedData format=\"...\" encoding=\"...\">...</signedData>\r\n // <publicKey encoding=\"...\">...</publicKey>\r\n // </value>\r\n //\r\n // </values>\r\n\r\n if (XMLDocument.documentElement.nodeName === \"values\" ||\r\n XMLDocument.documentElement.localName === \"values\")\r\n {\r\n\r\n const safeXMLContext = SAFEXML.ParseChargingStationContext(XMLDocument);\r\n\r\n const signedDataValues = new Array<string>();\r\n\r\n let commonSignedDataFormat = \"\";\r\n let commonSignedDataEncoding = \"\";\r\n let commonPublicKeyEncoding = \"\";\r\n let commonPublicKey = \"\";\r\n\r\n for (const value of chargyLib.getElementsByLocalName(XMLDocument, \"value\"))\r\n {\r\n\r\n // The public key might be null or empty for some formats!\r\n const publicKey = chargyLib.getElementsByLocalName(value, \"publicKey\")[0];\r\n const signedData = chargyLib.getElementsByLocalName(value, \"signedData\")[0];\r\n\r\n if (signedData == null)\r\n return {\r\n status: chargyInterfaces.SessionVerificationResult.InvalidSessionFormat,\r\n message: \"Each value within the given XML container must contain signed data!\",\r\n certainty: 0\r\n }\r\n\r\n const signedDataFormat = signedData.attributes.getNamedItem(\"format\")?. value.trim().toLowerCase() ?? \"\";\r\n\r\n if (commonSignedDataFormat === \"\" && signedDataFormat !== \"\")\r\n commonSignedDataFormat = signedDataFormat;\r\n else if (signedDataFormat !== commonSignedDataFormat)\r\n return {\r\n status: chargyInterfaces.SessionVerificationResult.InvalidSessionFormat,\r\n message: \"Invalid mixture of different signed data formats within the given XML container!\",\r\n certainty: 0\r\n }\r\n\r\n\r\n const signedDataEncoding = signedData.attributes.getNamedItem(\"encoding\")?.value.trim().toLowerCase() ?? \"\";\r\n\r\n if (commonSignedDataEncoding === \"\" && signedDataEncoding !== \"\")\r\n commonSignedDataEncoding = signedDataEncoding;\r\n else if (signedDataEncoding !== commonSignedDataEncoding)\r\n return {\r\n status: chargyInterfaces.SessionVerificationResult.InvalidSessionFormat,\r\n message: \"Invalid mixture of different signed data encodings within the given XML container!\",\r\n certainty: 0\r\n }\r\n\r\n\r\n const signedDataValue = signedData.textContent.trim();\r\n\r\n if (chargyLib.IsNullOrEmpty(signedDataValue))\r\n return {\r\n status: chargyInterfaces.SessionVerificationResult.InvalidSessionFormat,\r\n message: \"The signed data value within the given XML container must not be empty!\",\r\n certainty: 0\r\n }\r\n\r\n\r\n const publicKeyEncoding = publicKey?.attributes.getNamedItem(\"encoding\")?.value.trim().toLowerCase() ?? \"\";\r\n\r\n if (commonPublicKeyEncoding === \"\" && publicKeyEncoding !== \"\")\r\n commonPublicKeyEncoding = publicKeyEncoding;\r\n else if (publicKeyEncoding !== commonPublicKeyEncoding)\r\n return {\r\n status: chargyInterfaces.SessionVerificationResult.InvalidSessionFormat,\r\n message: \"Invalid mixture of different public key encodings within the given XML container!\",\r\n certainty: 0\r\n }\r\n\r\n // if (commonPublicKeyEncoding !== \"\" &&\r\n // commonPublicKeyEncoding !== \"hex\" &&\r\n // commonPublicKeyEncoding !== \"plain\" )\r\n // return {\r\n // status: chargyInterfaces.SessionVerificationResult.InvalidSessionFormat,\r\n // message: \"Unkown public key encoding within the given XML container!\",\r\n // certainty: 0\r\n // }\r\n\r\n\r\n const publicKeyValue = publicKey?.textContent.trim().replace(/\\s+/g, \"\") ?? \"\";\r\n\r\n if (commonPublicKey === \"\" && publicKeyValue !== \"\")\r\n commonPublicKey = publicKeyValue;\r\n else if (publicKeyValue !== commonPublicKey)\r\n return {\r\n status: chargyInterfaces.SessionVerificationResult.InvalidSessionFormat,\r\n message: \"Invalid mixture of different public keys within the given XML container!\",\r\n certainty: 0\r\n }\r\n\r\n switch (commonSignedDataEncoding)\r\n {\r\n\r\n case \"\":\r\n case \"plain\":\r\n signedDataValues.push(Buffer.from(signedDataValue, 'utf8').toString().trim());\r\n break;\r\n\r\n case \"base32\":\r\n signedDataValues.push(Buffer.from(this.chargy.base32Decode(signedDataValue, 'RFC4648')).toString().trim());\r\n break;\r\n\r\n case \"base64\":\r\n signedDataValues.push(Buffer.from(signedDataValue, 'base64').toString().trim());\r\n break;\r\n\r\n case \"hex\": // Some people put whitespaces, '-' or ':' into the hex format!\r\n signedDataValues.push(Buffer.from(signedDataValue.replace(/[^a-fA-F0-9]/g, ''), 'hex').toString().trim());\r\n break;\r\n\r\n default:\r\n return {\r\n status: chargyInterfaces.SessionVerificationResult.InvalidSessionFormat,\r\n message: \"Unkown signed data encoding within the given SAFE XML!\",\r\n certainty: 0\r\n }\r\n\r\n }\r\n\r\n }\r\n\r\n if (signedDataValues.length > 0)\r\n {\r\n\r\n switch (commonSignedDataFormat)\r\n {\r\n\r\n case \"alfen\":\r\n return new Alfen(this.chargy).\r\n TryToParseALFENFormat(\r\n signedDataValues,\r\n safeXMLContext\r\n );\r\n\r\n case \"ocmf\":\r\n return await new OCMF(this.chargy).\r\n TryToParseOCMFDocuments(\r\n signedDataValues,\r\n commonPublicKey,\r\n commonPublicKeyEncoding,\r\n safeXMLContext\r\n );\r\n\r\n default:\r\n return {\r\n status: chargyInterfaces.SessionVerificationResult.InvalidSessionFormat,\r\n message: this.chargy.GetLocalizedMessage(\"UnknownOrInvalidChargingSessionFormat\"),\r\n certainty: 0\r\n }\r\n\r\n }\r\n }\r\n\r\n }\r\n\r\n }\r\n catch (exception)\r\n {\r\n return {\r\n status: chargyInterfaces.SessionVerificationResult.InvalidSessionFormat,\r\n message: \"Exception occured: \" + (exception instanceof Error ? exception.message : String(exception)),\r\n certainty: 0\r\n }\r\n }\r\n\r\n return {\r\n status: chargyInterfaces.SessionVerificationResult.InvalidSessionFormat,\r\n message: this.chargy.GetLocalizedMessage(\"UnknownOrInvalidChargingSessionFormat\"),\r\n certainty: 0\r\n }\r\n\r\n }\r\n\r\n //#endregion\r\n\r\n}\r\n","/*\r\n * Copyright (c) 2018-2026 GraphDefined GmbH <achim.friedland@graphdefined.com>\r\n * This file is part of Chargy Desktop App <https://github.com/OpenChargingCloud/ChargyDesktopApp>\r\n *\r\n * Licensed under the Affero GPL license, Version 3.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.gnu.org/licenses/agpl.html\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n\r\nimport { Chargy } from './chargy'\r\nimport * as chargyInterfaces from './interfaces/chargyInterfaces'\r\nimport * as chargeTransparencyRecord from './interfaces/IChargeTransparencyRecord'\r\nimport * as chargyLib from './chargyLib'\r\n//import { EMHCrypt01 } from './EMHCrypt01'\r\n//import { Alfen } from './Alfen'\r\n//import { OCMF } from './OCMF'\r\n\r\n\r\ninterface XMLContainerCommonFormat {\r\n publicKey: string;\r\n meterValueSignatures: Array<string>;\r\n signatureMethod: string;\r\n encodingMethod: string;\r\n encodedMeterValues: Array<string>;\r\n}\r\n\r\nexport class XMLContainer {\r\n\r\n private readonly chargy: Chargy;\r\n\r\n constructor(chargy: Chargy) {\r\n this.chargy = chargy;\r\n }\r\n\r\n //#region tryToParseXMLContainer(XMLDocument)\r\n\r\n public tryToParseXMLContainer(XMLDocument: Document)\r\n\r\n : chargeTransparencyRecord.IChargeTransparencyRecord |\r\n chargyInterfaces. ISessionCryptoResult\r\n\r\n {\r\n\r\n try\r\n {\r\n\r\n const common: XMLContainerCommonFormat = {\r\n publicKey: \"\",\r\n meterValueSignatures: [],\r\n signatureMethod: \"\",\r\n encodingMethod: \"\",\r\n encodedMeterValues: []\r\n };\r\n\r\n const values = XMLDocument.querySelectorAll(\"signedMeterValues\");\r\n if (values.length == 1)\r\n {\r\n\r\n const valueList = values[0]?.querySelectorAll(\"signedMeterValue\");\r\n\r\n if (valueList != null &&\r\n valueList.length >= 1)\r\n {\r\n for (let i=0; i<valueList.length; i++) {\r\n\r\n //#region publicKey\r\n\r\n // Note: The public key might be optional...\r\n const publicKey = valueList[i]?.querySelector(\"publicKey\");\r\n if (publicKey != null)\r\n {\r\n\r\n const publicKeyEncoding = publicKey.attributes.getNamedItem(\"encoding\")?.value.trim().toLowerCase() ?? \"\";\r\n let publicKeyValue = publicKey.textContent.trim();\r\n\r\n switch (publicKeyEncoding)\r\n {\r\n\r\n case \"\":\r\n case \"plain\":\r\n publicKeyValue = Buffer.from(publicKeyValue, 'utf8').toString().trim();\r\n break;\r\n\r\n case \"base32\":\r\n publicKeyValue = Buffer.from(this.chargy.base32Decode(publicKeyValue, 'RFC4648')).toString().trim();\r\n break;\r\n\r\n case \"base64\":\r\n publicKeyValue = Buffer.from(publicKeyValue, 'base64').toString().trim();\r\n break;\r\n\r\n case \"hex\": // Some people put whitespaces, '-' or ':' into the hex format!\r\n publicKeyValue = Buffer.from(publicKeyValue.replace(/[^a-fA-F0-9]/g, ''), 'hex').toString().trim();\r\n break;\r\n\r\n default:\r\n return {\r\n status: chargyInterfaces.SessionVerificationResult.InvalidSessionFormat,\r\n message: \"Unkown public key encoding within the given XML container!\",\r\n certainty: 0\r\n }\r\n\r\n }\r\n\r\n if (chargyLib.IsNullOrEmpty(publicKeyValue))\r\n return {\r\n status: chargyInterfaces.SessionVerificationResult.InvalidSessionFormat,\r\n message: \"The public key within the given XML container must not be empty!\",\r\n certainty: 0\r\n }\r\n\r\n else if (common.publicKey == \"\")\r\n common.publicKey = publicKeyValue;\r\n\r\n else if (publicKeyValue != common.publicKey)\r\n return {\r\n status: chargyInterfaces.SessionVerificationResult.InvalidSessionFormat,\r\n message: \"Invalid mixture of different public keys within the given XML container!\",\r\n certainty: 0\r\n }\r\n\r\n }\r\n\r\n //#endregion\r\n\r\n //#region meterValueSignature\r\n\r\n const meterValueSignature = valueList[i]?.querySelector(\"meterValueSignature\");\r\n if (meterValueSignature != null)\r\n {\r\n\r\n const meterValueSignatureEncoding = meterValueSignature.attributes.getNamedItem(\"encoding\")?.value.trim().toLowerCase() ?? \"\";\r\n let meterValueSignatureValue = meterValueSignature.textContent.trim();\r\n\r\n switch (meterValueSignatureEncoding)\r\n {\r\n\r\n case \"\":\r\n case \"plain\":\r\n meterValueSignatureValue = Buffer.from(meterValueSignatureValue, 'utf8').toString().trim();\r\n break;\r\n\r\n case \"base32\":\r\n meterValueSignatureValue = Buffer.from(this.chargy.base32Decode(meterValueSignatureValue, 'RFC4648')).toString().trim();\r\n break;\r\n\r\n case \"base64\":\r\n meterValueSignatureValue = Buffer.from(meterValueSignatureValue, 'base64').toString().trim();\r\n break;\r\n\r\n case \"hex\":\r\n meterValueSignatureValue = Buffer.from(meterValueSignatureValue, 'hex').toString().trim();\r\n break;\r\n\r\n default:\r\n return {\r\n status: chargyInterfaces.SessionVerificationResult.InvalidSessionFormat,\r\n message: \"Unkown meter value signature encoding within the given XML container!\",\r\n certainty: 0\r\n }\r\n\r\n }\r\n\r\n if (chargyLib.IsNullOrEmpty(meterValueSignatureValue))\r\n return {\r\n status: chargyInterfaces.SessionVerificationResult.InvalidSessionFormat,\r\n message: \"The meter value signature within the given XML container must not be empty!\",\r\n certainty: 0\r\n }\r\n\r\n common.meterValueSignatures.push(meterValueSignatureValue);\r\n\r\n }\r\n\r\n //#endregion\r\n\r\n //#region signatureMethod\r\n\r\n const signatureMethod = valueList[i]?.querySelector(\"signatureMethod\")?.textContent.trim().toLowerCase() ?? \"\";\r\n\r\n if (common.signatureMethod == \"\")\r\n common.signatureMethod = signatureMethod;\r\n\r\n else if (common.signatureMethod != signatureMethod)\r\n return {\r\n status: chargyInterfaces.SessionVerificationResult.InvalidSessionFormat,\r\n message: \"Invalid mixture of different signature methods within the given XML container!\",\r\n certainty: 0\r\n }\r\n\r\n //#endregion\r\n\r\n //#region encodingMethod\r\n\r\n const encodingMethod = valueList[i]?.querySelector(\"encodingMethod\")?.textContent.trim().toLowerCase() ?? \"\";\r\n\r\n if (common.encodingMethod == \"\")\r\n common.encodingMethod = encodingMethod;\r\n\r\n else if (common.encodingMethod != encodingMethod)\r\n return {\r\n status: chargyInterfaces.SessionVerificationResult.InvalidSessionFormat,\r\n message: \"Invalid mixture of different signed data formats within the given XML container!\",\r\n certainty: 0\r\n }\r\n\r\n //#endregion\r\n\r\n //#region encodedMeterValue\r\n\r\n const encodedMeterValue = valueList[i]?.querySelector(\"encodedMeterValue\");\r\n if (encodedMeterValue != null)\r\n {\r\n\r\n const signedDataEncoding = encodedMeterValue.attributes.getNamedItem(\"encoding\")?.value.trim() ?? \"\";\r\n let signedDataValue = encodedMeterValue.textContent.trim();\r\n\r\n switch (signedDataEncoding)\r\n {\r\n\r\n case \"\":\r\n case \"plain\":\r\n signedDataValue = Buffer.from(signedDataValue, 'utf8').toString().trim();\r\n break;\r\n\r\n case \"base32\":\r\n signedDataValue = Buffer.from(this.chargy.base32Decode(signedDataValue, 'RFC4648')).toString().trim();\r\n break;\r\n\r\n case \"base64\":\r\n signedDataValue = Buffer.from(signedDataValue, 'base64').toString().trim();\r\n break;\r\n\r\n case \"hex\":\r\n signedDataValue = Buffer.from(signedDataValue, 'hex').toString().trim();\r\n break;\r\n\r\n default:\r\n return {\r\n status: chargyInterfaces.SessionVerificationResult.InvalidSessionFormat,\r\n message: \"Unkown signed data encoding within the given XML container!\",\r\n certainty: 0\r\n }\r\n\r\n }\r\n\r\n if (chargyLib.IsNullOrEmpty(signedDataValue))\r\n return {\r\n status: chargyInterfaces.SessionVerificationResult.InvalidSessionFormat,\r\n message: \"The signed data value within the given XML container must not be empty!\",\r\n certainty: 0\r\n }\r\n\r\n common.encodedMeterValues.push(signedDataValue);\r\n\r\n }\r\n else\r\n return {\r\n status: chargyInterfaces.SessionVerificationResult.InvalidSessionFormat,\r\n message: \"The signed data tag within the given XML container must not be empty!\",\r\n certainty: 0\r\n }\r\n\r\n //#endregion\r\n\r\n }\r\n }\r\n\r\n }\r\n\r\n //ToDo: Convert this XML into Chargy JSON data structures!\r\n\r\n //switch (common.encodingMethod)\r\n //{\r\n\r\n //case \"alfen\":\r\n // return await new Alfen01(this.chargy).tryToParseALFENFormat(signedValues);\r\n\r\n //case \"ocmf\":\r\n // return await new OCMF(this.chargy).tryToParseOCMF2(signedValues, common.publicKey);\r\n\r\n //case \"edl\":\r\n // return await new EMHCrypt01(this.chargy).try(signedValues, common.publicKey);\r\n\r\n //}\r\n\r\n return {\r\n status: chargyInterfaces.SessionVerificationResult.InvalidSessionFormat,\r\n message: this.chargy.GetLocalizedMessage(\"UnknownOrInvalidChargingSessionFormat\"),\r\n certainty: 0\r\n }\r\n\r\n }\r\n catch (exception)\r\n {\r\n return {\r\n status: chargyInterfaces.SessionVerificationResult.InvalidSessionFormat,\r\n message: \"Exception occured: \" + (exception instanceof Error ? exception.message : String(exception)),\r\n certainty: 0\r\n }\r\n }\r\n\r\n }\r\n\r\n //#endregion\r\n\r\n}\r\n","/*\n * Copyright (c) 2018-2026 GraphDefined GmbH <achim.friedland@graphdefined.com>\n * This file is part of Chargy WebApp <https://github.com/OpenChargingCloud/ChargyWebApp>\n *\n * Licensed under the Affero GPL license, Version 3.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.gnu.org/licenses/agpl.html\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { Chargy } from './chargy'\nimport { Alfen } from './Alfen'\nimport { BSMCrypt01 } from './BSMCrypt01'\nimport type { IEMHMeasurementValue } from './EMHCrypt01'\nimport * as chargyInterfaces from './interfaces/chargyInterfaces'\nimport * as chargeTransparencyRecord from './interfaces/IChargeTransparencyRecord'\nimport * as chargyLib from './chargyLib'\nimport Decimal from 'decimal.js'\n\n\n// A local time stamp of the old chargeIT meter value format.\ninterface IChargeITTimestampLocal {\n timestamp: number;\n localOffset: number;\n seasonOffset: number;\n}\n\n// A single, fully validated meter value of the old chargeIT format.\ninterface IChargeITMeterValue {\n timestamp: number;\n meterInfo: {\n firmwareVersion: string;\n publicKey: string;\n publicKeySignatures: Array<unknown> | undefined;\n meterId: string;\n type: string;\n manufacturer: string;\n };\n transactionId: string;\n contract: {\n type: string;\n timestampLocal: IChargeITTimestampLocal;\n timestamp: number;\n id: string;\n };\n measurementId: string;\n measuredValue: {\n timestampLocal: IChargeITTimestampLocal;\n value: string;\n unit: string;\n scale: number;\n valueType: string;\n unitEncoded: number;\n };\n measurand: {\n id: string;\n name: string;\n };\n additionalInfo: {\n indexes: {\n timer: number;\n logBook: string;\n };\n status: string;\n };\n chargePoint: {\n softwareVersion: string | undefined;\n };\n signature: string;\n}\n\n\nexport class ChargeIT {\n\n private readonly chargy: Chargy;\n\n constructor(chargy: Chargy) {\n this.chargy = chargy;\n }\n\n\n private bufferToHex(buffer: ArrayBuffer, Reverse?: boolean) : string {\n return (Reverse\n ? Array.from(new Uint8Array(buffer)).reverse()\n : Array.from(new Uint8Array(buffer))\n ).map (b => b.toString(16).padStart(2, \"0\")).join(\"\");\n }\n\n private bufferToNumber(buffer: ArrayBuffer) : number {\n return parseInt(Array\n .from(new Uint8Array(buffer))\n .map (b => b.toString(16).padStart(2, \"0\"))\n .join(\"\"), 16);\n }\n\n\n //#region TryToParseOldChargeITMeterValuesFormat(CTR, evseId, address, geoLocation, signedMeterValues)\n\n public TryToParseOldChargeITMeterValuesFormat(CTR: chargeTransparencyRecord.IChargeTransparencyRecord,\n evseId: string,\n address: chargyLib.JSONObject,\n geoLocation: chargyLib.JSONObject,\n signedMeterValues: Array<unknown>)\n\n : chargeTransparencyRecord.IChargeTransparencyRecord |\n chargyInterfaces. ISessionCryptoResult\n\n {\n\n const CTRArray = new Array<IChargeITMeterValue>();\n\n //#region Parse Signed Meter Values\n\n for (const signedMeterValue of signedMeterValues)\n {\n\n //#region Data\n\n const smv = chargyLib.asJSONObject(signedMeterValue);\n if (smv === undefined)\n continue;\n\n const measurementId = smv[\"measurementId\"];\n const timestamp = smv[\"timestamp\"];\n const transactionId = smv[\"transactionId\"];\n const signature = smv[\"signature\"];\n\n const meterInfo = chargyLib.asJSONObject(smv[\"meterInfo\"]);\n const meterInfo_meterId = meterInfo?.[\"meterId\"];\n const meterInfo_type = meterInfo?.[\"type\"];\n const meterInfo_firmwareVersion = meterInfo?.[\"firmwareVersion\"];\n const meterInfo_publicKey = meterInfo?.[\"publicKey\"];\n const meterInfo_manufacturer = meterInfo?.[\"manufacturer\"];\n\n const meterInfo_publicKeySignatures = meterInfo?.[\"publicKeySignatures\"];\n\n const contract = chargyLib.asJSONObject(smv[\"contract\"]);\n const contract_id = contract?.[\"id\"];\n const contract_type = contract?.[\"type\"];\n const contract_timestamp = contract?.[\"timestamp\"];\n\n const contract_timestampLocal = chargyLib.asJSONObject(contract?.[\"timestampLocal\"]);\n const contract_timestampLocal_timestamp = contract_timestampLocal?.[\"timestamp\"];\n const contract_timestampLocal_localOffset = contract_timestampLocal?.[\"localOffset\"];\n const contract_timestampLocal_seasonOffset = contract_timestampLocal?.[\"seasonOffset\"];\n\n const measuredValue = chargyLib.asJSONObject(smv[\"measuredValue\"]);\n const measuredValue_value = measuredValue?.[\"value\"];\n const measuredValue_unit = measuredValue?.[\"unit\"];\n const measuredValue_scale = measuredValue?.[\"scale\"];\n const measuredValue_valueType = measuredValue?.[\"valueType\"];\n const measuredValue_unitEncoded = measuredValue?.[\"unitEncoded\"];\n\n const measuredValue_timestampLocal = chargyLib.asJSONObject(measuredValue?.[\"timestampLocal\"]);\n const measuredValue_timestampLocal_timestamp = measuredValue_timestampLocal?.[\"timestamp\"];\n const measuredValue_timestampLocal_localOffset = measuredValue_timestampLocal?.[\"localOffset\"];\n const measuredValue_timestampLocal_seasonOffset = measuredValue_timestampLocal?.[\"seasonOffset\"];\n\n const measurand = chargyLib.asJSONObject(smv[\"measurand\"]);\n const measurand_id = measurand?.[\"id\"];\n const measurand_name = measurand?.[\"name\"];\n\n const additionalInfo = chargyLib.asJSONObject(smv[\"additionalInfo\"]);\n const additionalInfo_status = additionalInfo?.[\"status\"];\n\n const additionalInfo_indexes = chargyLib.asJSONObject(additionalInfo?.[\"indexes\"]);\n const additionalInfo_indexes_timer = additionalInfo_indexes?.[\"timer\"];\n const additionalInfo_indexes_logBook = additionalInfo_indexes?.[\"logBook\"];\n\n const chargePoint = smv[\"chargePoint\"];\n const chargePoint_softwareVersion = chargyLib.asString(chargyLib.asJSONObject(chargePoint)?.[\"softwareVersion\"]);\n\n //#endregion\n\n if (chargyLib.isMandatoryString (measurementId) &&\n chargyLib.isMandatoryNumber (timestamp) &&\n chargyLib.isMandatoryString (transactionId) &&\n chargyLib.isMandatoryString (signature) &&\n\n chargyLib.isMandatoryJSONObject (meterInfo) &&\n chargyLib.isMandatoryString (meterInfo_meterId) &&\n chargyLib.isMandatoryString (meterInfo_type) &&\n chargyLib.isMandatoryString (meterInfo_firmwareVersion) &&\n chargyLib.isMandatoryString (meterInfo_publicKey) &&\n chargyLib.isMandatoryString (meterInfo_manufacturer) &&\n\n chargyLib.isOptionalJSONArrayOk (meterInfo_publicKeySignatures) &&\n\n chargyLib.isMandatoryJSONObject (contract) &&\n chargyLib.isMandatoryString (contract_id) &&\n chargyLib.isMandatoryString (contract_type) &&\n chargyLib.isMandatoryNumber (contract_timestamp) &&\n\n chargyLib.isMandatoryJSONObject (contract_timestampLocal) &&\n chargyLib.isMandatoryNumber (contract_timestampLocal_timestamp) &&\n chargyLib.isMandatoryNumber (contract_timestampLocal_localOffset) &&\n chargyLib.isMandatoryNumber (contract_timestampLocal_seasonOffset) &&\n\n chargyLib.isMandatoryJSONObject (measuredValue) &&\n chargyLib.isMandatoryString (measuredValue_value) &&\n chargyLib.isMandatoryString (measuredValue_unit) &&\n chargyLib.isMandatoryNumber (measuredValue_scale) &&\n chargyLib.isMandatoryString (measuredValue_valueType) &&\n chargyLib.isMandatoryNumber (measuredValue_unitEncoded) &&\n\n chargyLib.isMandatoryJSONObject (measuredValue_timestampLocal) &&\n chargyLib.isMandatoryNumber (measuredValue_timestampLocal_timestamp) &&\n chargyLib.isMandatoryNumber (measuredValue_timestampLocal_localOffset) &&\n chargyLib.isMandatoryNumber (measuredValue_timestampLocal_seasonOffset) &&\n\n chargyLib.isMandatoryJSONObject (measurand) &&\n chargyLib.isMandatoryString (measurand_id) &&\n chargyLib.isMandatoryString (measurand_name) &&\n\n chargyLib.isMandatoryJSONObject (additionalInfo) &&\n chargyLib.isMandatoryString (additionalInfo_status) &&\n\n chargyLib.isMandatoryJSONObject (additionalInfo_indexes) &&\n chargyLib.isMandatoryNumber (additionalInfo_indexes_timer) &&\n chargyLib.isMandatoryString (additionalInfo_indexes_logBook) &&\n\n (chargePoint === undefined || (\n chargyLib.isMandatoryJSONObject (chargePoint) &&\n chargyLib.isMandatoryString (chargePoint_softwareVersion)\n ))) {\n\n CTRArray.push({\n \"timestamp\": timestamp,\n \"meterInfo\": {\n \"firmwareVersion\": meterInfo_firmwareVersion,\n \"publicKey\": meterInfo_publicKey,\n \"publicKeySignatures\": chargyLib.asJSONArray(meterInfo_publicKeySignatures),\n \"meterId\": meterInfo_meterId,\n \"type\": meterInfo_type,\n \"manufacturer\": meterInfo_manufacturer\n },\n \"transactionId\": transactionId,\n \"contract\": {\n \"type\": contract_type,\n \"timestampLocal\": {\n \"timestamp\": contract_timestampLocal_timestamp,\n \"localOffset\": contract_timestampLocal_localOffset,\n \"seasonOffset\": contract_timestampLocal_seasonOffset\n },\n \"timestamp\": contract_timestamp,\n \"id\": contract_id\n },\n \"measurementId\": measurementId,\n \"measuredValue\": {\n \"timestampLocal\": {\n \"timestamp\": measuredValue_timestampLocal_timestamp,\n \"localOffset\": measuredValue_timestampLocal_localOffset,\n \"seasonOffset\": measuredValue_timestampLocal_seasonOffset\n },\n \"value\": measuredValue_value,\n \"unit\": measuredValue_unit,\n \"scale\": measuredValue_scale,\n \"valueType\": measuredValue_valueType,\n \"unitEncoded\": measuredValue_unitEncoded\n },\n \"measurand\": {\n \"id\": measurand_id,\n \"name\": measurand_name\n },\n \"additionalInfo\": {\n \"indexes\": {\n \"timer\": additionalInfo_indexes_timer,\n \"logBook\": additionalInfo_indexes_logBook\n },\n \"status\": additionalInfo_status\n },\n \"chargePoint\": {\n \"softwareVersion\": chargePoint_softwareVersion\n },\n \"signature\": signature\n });\n\n }\n\n }\n\n //#endregion\n\n const firstMeterValue = CTRArray[0];\n const lastMeterValue = CTRArray[CTRArray.length - 1];\n\n if (firstMeterValue === undefined || lastMeterValue === undefined)\n return {\n status: chargyInterfaces.SessionVerificationResult.InvalidSessionFormat,\n message: this.chargy.GetLocalizedMessage(\"UnknownOrInvalidChargingSessionFormat\"),\n certainty: 0\n };\n\n CTR[\"@id\"] = lastMeterValue[\"transactionId\"];\n CTR.begin = this.chargy.moment.unix(firstMeterValue[\"measuredValue\"][\"timestampLocal\"][\"timestamp\"]).utc().format();\n CTR.end = this.chargy.moment.unix(lastMeterValue[\"measuredValue\"][\"timestampLocal\"][\"timestamp\"]).utc().format();\n\n CTR.contract = {\n \"@id\": firstMeterValue[\"contract\"][\"id\"],\n \"@context\": firstMeterValue[\"contract\"][\"type\"]\n };\n\n CTR.chargingStationOperators = [{\n\n \"@id\": \"chargeITmobilityCSO\",\n \"description\": { \"de\": \"chargeIT mobility GmbH - Charging Station Operator Services\" },\n\n \"contact\": {\n \"email\": \"info@chargeit-mobility.com\",\n \"web\": \"https://www.chargeit-mobility.com\",\n \"logoUrl\": \"http://www.chargeit-mobility.com/fileadmin/BELECTRIC_Drive/templates/pics/chargeit_logo_408x70.png\",\n \"publicKeys\": [{\n \"algorithm\": \"secp192r1\",\n \"format\": \"DER\",\n \"encoding\": \"hex\",\n \"value\": \"042313b9e469612b4ca06981bfdecb226e234632b01d84b6a814f63a114b7762c34ddce2e6853395b7a0f87275f63ffe3c\",\n //\"signatures\": [ ]\n },\n {\n \"algorithm\": \"secp256k1\",\n \"format\": \"DER\",\n \"encoding\": \"hex\",\n \"value\": \"04a8ff0d82107922522e004a167cc658f0eef408c5020f98e7a2615be326e61852666877335f4f8d9a0a756c26f0c9fb3f401431416abb5317cc0f5d714d3026fe\",\n //\"signatures\": [ ]\n }\n ]},\n\n \"support\": {\n \"hotline\": \"+49 9321 / 2680 - 700\",\n \"email\": \"service@chargeit-mobility.com\",\n \"web\": \"https://cso.chargeit.charging.cloud/issues\"\n // \"mediationServices\": [ \"GraphDefined Mediation\" ],\n // \"publicKeys\": [\n // {\n // \"algorithm\": \"secp256k1\",\n // \"format\": \"DER\",\n // \"value\": \"04a8ff0d82107922522e004a167cc658f0eef408c5020f98e7a2615be326e61852666877335f4f8d9a0a756c26f0c9fb3f401431416abb5317cc0f5d714d3026fe\",\n // \"signatures\": [ ]\n // }\n // ]\n },\n\n \"privacy\": {\n \"contact\": \"Dr. iur. Christian Borchers, datenschutz süd GmbH\",\n \"email\": \"datenschutz@chargeit-mobility.com\",\n \"web\": \"http://www.chargeit-mobility.com/de/datenschutz/\"\n // \"publicKeys\": [\n // {\n // \"algorithm\": \"secp256k1\",\n // \"format\": \"DER\",\n // \"value\": \"04a8ff0d82107922522e004a167cc658f0eef408c5020f98e7a2615be326e61852666877335f4f8d9a0a756c26f0c9fb3f401431416abb5317cc0f5d714d3026fe\",\n // \"signatures\": [ ]\n // }\n // ]\n },\n\n \"chargingStations\": [\n {\n \"@id\": evseId.substring(0, evseId.lastIndexOf(\"*\")),\n // \"description\": {\n // \"de\": \"GraphDefined Charging Station - CI-Tests Pool 3 / Station A\"\n // },\n \"firmwareVersion\": firstMeterValue[\"chargePoint\"][\"softwareVersion\"],\n \"geoLocation\": { \"lat\": chargyLib.asNumber(geoLocation[\"lat\"]) ?? 0, \"lng\": chargyLib.asNumber(geoLocation[\"lon\"]) ?? 0 },\n \"address\": {\n \"street\": chargyLib.asString(address[\"street\"]),\n \"postalCode\": chargyLib.asString(address[\"zipCode\"]) ?? \"\",\n \"city\": chargyLib.asString(address[\"town\"]) ?? \"\",\n \"country\": chargyLib.asString(address[\"country\"]) ?? \"\"\n },\n \"EVSEs\": [\n {\n \"@id\": evseId,\n // \"description\": {\n // \"de\": \"GraphDefined EVSE - CI-Tests Pool 3 / Station A / EVSE 1\"\n // },\n // \"connectors\": [{ }],\n \"meters\": [\n {\n \"@id\": firstMeterValue[\"meterInfo\"][\"meterId\"],\n \"manufacturer\": firstMeterValue[\"meterInfo\"][\"manufacturer\"],\n \"manufacturerURL\": \"https://www.emh-metering.de\",\n \"model\": firstMeterValue[\"meterInfo\"][\"type\"],\n \"hardwareVersion\": \"1.0\",\n \"firmwareVersion\": firstMeterValue[\"meterInfo\"][\"firmwareVersion\"],\n \"signatureFormat\": \"https://open.charging.cloud/contexts/EnergyMeterSignatureFormats/EMHCrypt01\",\n \"publicKeys\": [\n {\n \"algorithm\": \"secp192r1\",\n \"format\": \"DER\",\n \"encoding\": \"hex\",\n \"value\": firstMeterValue[\"meterInfo\"][\"publicKey\"].startsWith(\"04\")\n ? firstMeterValue[\"meterInfo\"][\"publicKey\"]\n : \"04\" + firstMeterValue[\"meterInfo\"][\"publicKey\"],\n \"signatures\": firstMeterValue[\"meterInfo\"][\"publicKeySignatures\"]\n }\n ]\n }\n ]\n }\n ]\n }\n ]\n\n }];\n\n const measurementValues = new Array<IEMHMeasurementValue>();\n\n for (const measurement of CTRArray)\n {\n measurementValues.push({\n \"timestamp\": this.chargy.moment.unix(measurement[\"measuredValue\"][\"timestampLocal\"][\"timestamp\"]).utc().utcOffset(\n measurement[\"measuredValue\"][\"timestampLocal\"][\"localOffset\"] +\n measurement[\"measuredValue\"][\"timestampLocal\"][\"seasonOffset\"]).format(),\n \"value\": new Decimal(parseInt(measurement[\"measuredValue\"][\"value\"])),\n \"infoStatus\": measurement[\"additionalInfo\"][\"status\"],\n \"secondsIndex\": measurement[\"additionalInfo\"][\"indexes\"][\"timer\"],\n \"paginationId\": measurement[\"measurementId\"],\n \"logBookIndex\": measurement[\"additionalInfo\"][\"indexes\"][\"logBook\"],\n \"signatures\": [\n {\n \"r\": measurement[\"signature\"].substring(0, 48),\n \"s\": measurement[\"signature\"].substring(48)\n }\n ]\n });\n }\n\n CTR.chargingSessions = [{\n\n \"@id\": lastMeterValue[\"transactionId\"],\n \"@context\": \"https://open.charging.cloud/contexts/SessionSignatureFormats/EMHCrypt01+json\",\n \"begin\": this.chargy.moment.unix(firstMeterValue[\"measuredValue\"][\"timestampLocal\"][\"timestamp\"]).utc().format(),\n \"end\": this.chargy.moment.unix(lastMeterValue[\"measuredValue\"][\"timestampLocal\"][\"timestamp\"]).utc().format(),\n \"EVSEId\": evseId,\n\n \"authorizationStart\": {\n \"@id\": firstMeterValue[\"contract\"][\"id\"],\n \"type\": firstMeterValue[\"contract\"][\"type\"],\n \"timestamp\": this.chargy.moment.unix(firstMeterValue[\"contract\"][\"timestampLocal\"][\"timestamp\"]).utc().utcOffset(\n firstMeterValue[\"contract\"][\"timestampLocal\"][\"localOffset\"] +\n firstMeterValue[\"contract\"][\"timestampLocal\"][\"seasonOffset\"]).format(),\n },\n\n \"measurements\": [{\n\n \"energyMeterId\": firstMeterValue[\"meterInfo\"][\"meterId\"],\n \"@context\": \"https://open.charging.cloud/contexts/EnergyMeterSignatureFormats/EMHCrypt01+json\",\n \"name\": firstMeterValue[\"measurand\"][\"name\"],\n \"obis\": chargyLib.parseOBIS(firstMeterValue[\"measurand\"][\"id\"]),\n \"unit\": firstMeterValue[\"measuredValue\"][\"unit\"],\n \"unitEncoded\": firstMeterValue[\"measuredValue\"][\"unitEncoded\"],\n \"valueType\": firstMeterValue[\"measuredValue\"][\"valueType\"],\n \"scale\": firstMeterValue[\"measuredValue\"][\"scale\"],\n\n \"signatureInfos\": {\n \"hash\": chargyInterfaces.CryptoHashAlgorithms.SHA256,\n \"hashTruncation\": 24,\n \"algorithm\": chargyInterfaces.CryptoAlgorithms.ECC,\n \"curve\": \"secp192r1\",\n \"format\": chargyInterfaces.SignatureFormats.RS\n },\n\n \"values\": measurementValues\n\n }]\n\n }];\n\n CTR[\"status\"] = chargyInterfaces.SessionVerificationResult.Unvalidated;\n\n return CTR;\n\n }\n\n //#endregion\n\n\n //#region TryToParseChargeITContainerFormat(SomeJSON)\n\n // The chargeIT mobility data format does not always provide context information or format identifiers!\n public TryToParseChargeITContainerFormat(SomeJSON: unknown)\n\n : chargeTransparencyRecord.IChargeTransparencyRecord |\n chargyInterfaces. ISessionCryptoResult\n\n {\n\n const errors = new Array<string>();\n const warnings = new Array<string>();\n\n if (!chargyLib.isMandatoryJSONObject(SomeJSON))\n {\n return {\n status: chargyInterfaces.SessionVerificationResult.InvalidSessionFormat,\n errors: errors,\n warnings: warnings,\n certainty: 0\n }\n }\n\n const oldChargeITContainerFormat = \"oldChargeITContainerFormat\";\n const oldChargeITMeterValueFormat = \"oldChargeITMeterValueFormat\";\n\n const containerFormat = chargyLib.asString(SomeJSON[\"@context\"])?.trim()\n ?? oldChargeITContainerFormat;\n\n\n //#region Old chargeIT container format\n\n if (containerFormat === oldChargeITContainerFormat)\n {\n\n // How sure we are, that this is really a chargeIT transparency format\n let numberOfFormatChecks = 14 + 2*39; // At least two signed meter values!\n let secondaryErrors = 0;\n\n try\n {\n\n //#region Validate the container format\n {\n\n //#region Validate 'placeInfo'\n\n const placeInfo = chargyLib.asJSONObject(SomeJSON[\"placeInfo\"]);\n if (placeInfo === undefined)\n {\n errors.push(this.chargy.GetLocalizedMessage(\"MissingOrInvalidPlaceInfo\"));\n secondaryErrors += 13;\n }\n else\n {\n\n const evseId = placeInfo[\"evseId\"];\n if (!chargyLib.isMandatoryString(evseId))\n errors.push(this.chargy.GetLocalizedMessage(\"MissingOrInvalidEVSEId\"));\n\n //#region placeInfo.address\n\n const address = chargyLib.asJSONObject(placeInfo[\"address\"]);\n if (address === undefined)\n {\n errors.push(this.chargy.GetLocalizedMessage(\"MissingOrInvalidAddress\"));\n secondaryErrors += 3;\n }\n else\n {\n\n if (!chargyLib.isMandatoryString(address[\"street\"]))\n errors.push(this.chargy.GetLocalizedMessage(\"MissingOrInvalidAddressStreetName\"));\n\n if (!chargyLib.isMandatoryString(address[\"zipCode\"]))\n errors.push(this.chargy.GetLocalizedMessage(\"MissingOrInvalidAddressZIPCode\"));\n\n if (!chargyLib.isMandatoryString(address[\"town\"]))\n errors.push(this.chargy.GetLocalizedMessage(\"MissingOrInvalidAddressCityName\"));\n\n //if (!chargyLib.isMandatoryString(address[\"country\"]))\n // errors.push(this.chargy.GetLocalizedMessage(\"MissingOrInvalidAddressCountryName\"));\n\n }\n\n //#endregion\n\n //#region placeInfo.geoLocation\n\n const geoLocation = chargyLib.asJSONObject(placeInfo[\"geoLocation\"]);\n if (geoLocation === undefined)\n {\n errors.push(this.chargy.GetLocalizedMessage(\"MissingOrInvalidGeoLocation\"));\n secondaryErrors += 2;\n }\n else\n {\n\n if (!chargyLib.isMandatoryNumber(geoLocation[\"lat\"]))\n errors.push(this.chargy.GetLocalizedMessage(\"MissingOrInvalidGeoLocationLatitude\"));\n\n if (!chargyLib.isMandatoryNumber(geoLocation[\"lon\"]))\n errors.push(this.chargy.GetLocalizedMessage(\"MissingOrInvalidGeoLocationLongitude\"));\n\n }\n\n //#endregion\n\n }\n\n //#endregion\n\n //#region Validate 'signedMeterValues'\n\n const signedMeterValues = SomeJSON[\"signedMeterValues\"];\n if (!chargyLib.isMandatoryJSONArray(signedMeterValues) || signedMeterValues.length < 2) {\n errors.push(this.chargy.GetLocalizedMessage(\"MissingOrInvalidSignedMeterValues\"));\n secondaryErrors += 2*39;\n }\n else\n {\n\n // Additional format checks per measurement\n // when there are more than 2 signed meter values\n numberOfFormatChecks += 39 * (signedMeterValues.length - 2);\n\n //#region Get and validate consistency of the signedMeterValue context\n\n const signedMeterValueContext = chargyLib.asString(chargyLib.asJSONObject(signedMeterValues[0])?.[\"@context\"])?.trim()\n ?? oldChargeITMeterValueFormat;\n\n\n let consistent = true;\n\n for (const signedMeterValue of signedMeterValues.map(smv => chargyLib.asJSONObject(smv))) {\n if ((signedMeterValue?.[\"@context\"] ?? oldChargeITMeterValueFormat) !== signedMeterValueContext) {\n\n if (consistent)\n errors.push(this.chargy.GetLocalizedMessage(\"InconsistentJSONContextInformation\"));\n\n consistent = false;\n\n }\n }\n\n //#endregion\n\n if (consistent) {\n\n if (signedMeterValueContext === \"https://www.lichtblick.de/contexts/bsm-ws36a-json-v0\" ||\n signedMeterValueContext === \"https://www.lichtblick.de/contexts/bsm-ws36a-json-v1\" ||\n signedMeterValueContext === \"https://www.eneco.com/contexts/bsm-ws36a-json-v0\" ||\n signedMeterValueContext === \"https://www.eneco.com/contexts/bsm-ws36a-json-v1\" ||\n signedMeterValueContext === \"https://www.chargeit-mobility.com/contexts/bsm-ws36a-json-v0\" ||\n signedMeterValueContext === \"https://www.chargeit-mobility.com/contexts/bsm-ws36a-json-v1\") {\n\n //return await new BSMCrypt01(this.chargy).tryToParseBSM_WS36aMeasurements(CTR, evseId, null, signedMeterValues);\n\n }\n\n else if (signedMeterValueContext.startsWith(\"ALFEN\")) {\n // return await new Alfen01(this.chargy).tryToParseALFENFormat(signedMeterValues.map(value => value.payload));\n }\n\n else if (containerFormat === oldChargeITContainerFormat) {\n\n // let preCTR = null;\n\n // if (signedMeterValues[0].format == \"ALFEN\")\n // preCTR = await new Alfen01(this.chargy).tryToParseALFENFormat(signedMeterValues.map(value => value.payload));\n\n // //if (preCTR != null)\n // // return preCTR;\n\n }\n\n else if (signedMeterValueContext === oldChargeITMeterValueFormat)\n {\n\n let measurementCounter = 0;\n\n for (const signedMeterValue of signedMeterValues)\n {\n\n measurementCounter++;\n\n if (!chargyLib.isMandatoryJSONObject(signedMeterValue)) {\n errors.push(this.chargy.GetLocalizedMessageWithParameter(\"MissingOrInvalidSignedMeterValueP\", measurementCounter));\n secondaryErrors += 38;\n }\n else\n {\n\n if (!chargyLib.isMandatoryString(signedMeterValue[\"measurementId\"]))\n errors.push(this.chargy.GetLocalizedMessageWithParameter(\"MissingOrInvalid_SignedMeterValue_MeasurementIdP\", measurementCounter));\n\n if (!chargyLib.isMandatoryNumber(signedMeterValue[\"timestamp\"]))\n errors.push(this.chargy.GetLocalizedMessageWithParameter(\"MissingOrInvalid_SignedMeterValue_TimestampP\", measurementCounter));\n\n if (!chargyLib.isMandatoryString(signedMeterValue[\"transactionId\"]))\n errors.push(this.chargy.GetLocalizedMessageWithParameter(\"MissingOrInvalid_SignedMeterValue_TransactionIdP\", measurementCounter));\n\n if (!chargyLib.isMandatoryString(signedMeterValue[\"signature\"]))\n errors.push(this.chargy.GetLocalizedMessageWithParameter(\"MissingOrInvalid_SignedMeterValue_SignatureP\", measurementCounter));\n\n //#region Meter information\n\n const meterInfo = signedMeterValue[\"meterInfo\"];\n if (!chargyLib.isMandatoryJSONObject(meterInfo))\n {\n errors.push(this.chargy.GetLocalizedMessageWithParameter(\"MissingOrInvalid_SignedMeterValue_MeterInfoP\", measurementCounter));\n secondaryErrors += 5;\n }\n else\n {\n\n if (!chargyLib.isMandatoryString(meterInfo[\"meterId\"]))\n errors.push(this.chargy.GetLocalizedMessageWithParameter(\"MissingOrInvalid_SignedMeterValue_MeterInfo_MeterIdP\", measurementCounter));\n\n if (!chargyLib.isMandatoryString(meterInfo[\"type\"]))\n errors.push(this.chargy.GetLocalizedMessageWithParameter(\"MissingOrInvalid_SignedMeterValue_MeterInfo_TypeP\", measurementCounter));\n\n if (!chargyLib.isMandatoryString(meterInfo[\"firmwareVersion\"]))\n errors.push(this.chargy.GetLocalizedMessageWithParameter(\"MissingOrInvalid_SignedMeterValue_MeterInfo_FirmwareVersionP\", measurementCounter));\n\n if (!chargyLib.isMandatoryString(meterInfo[\"publicKey\"]))\n errors.push(this.chargy.GetLocalizedMessageWithParameter(\"MissingOrInvalid_SignedMeterValue_MeterInfo_PublicKeyP\", measurementCounter));\n\n if (!chargyLib.isMandatoryString(meterInfo[\"manufacturer\"]))\n errors.push(this.chargy.GetLocalizedMessageWithParameter(\"MissingOrInvalid_SignedMeterValue_MeterInfo_ManufacturerP\", measurementCounter));\n\n //#region Meter information - PublicKey signatures (optional)\n\n if (chargyLib.isOptionalJSONArrayError(meterInfo[\"publicKeySignatures\"]))\n errors.push(this.chargy.GetLocalizedMessageWithParameter(\"Invalid_SignedMeterValue_MeterInfo_PublicKeySignaturesP\", measurementCounter));\n\n //#endregion\n\n }\n\n //#endregion\n\n //#region Contract information\n\n const contract = signedMeterValue[\"contract\"];\n if (!chargyLib.isMandatoryJSONObject(contract))\n {\n errors.push(this.chargy.GetLocalizedMessageWithParameter(\"MissingOrInvalid_SignedMeterValue_ContractP\", measurementCounter));\n secondaryErrors += 7;\n }\n else\n {\n\n if (!chargyLib.isMandatoryString(contract[\"id\"]))\n errors.push(this.chargy.GetLocalizedMessageWithParameter(\"MissingOrInvalid_SignedMeterValue_Contract_IdP\", measurementCounter));\n\n if (!chargyLib.isMandatoryString(contract[\"type\"]))\n errors.push(this.chargy.GetLocalizedMessageWithParameter(\"MissingOrInvalid_SignedMeterValue_Contract_TypeP\", measurementCounter));\n\n if (!chargyLib.isMandatoryNumber(contract[\"timestamp\"]))\n errors.push(this.chargy.GetLocalizedMessageWithParameter(\"MissingOrInvalid_SignedMeterValue_Contract_TimestampP\", measurementCounter));\n\n //#region Contract information - Timestamp local\n\n const timestampLocal = contract[\"timestampLocal\"];\n if (!chargyLib.isMandatoryJSONObject(timestampLocal))\n {\n errors.push(this.chargy.GetLocalizedMessageWithParameter(\"MissingOrInvalid_SignedMeterValue_Contract_TimestampLocalP\", measurementCounter));\n secondaryErrors += 3;\n }\n else\n {\n\n if (!chargyLib.isMandatoryNumber(timestampLocal[\"timestamp\"]))\n errors.push(this.chargy.GetLocalizedMessageWithParameter(\"MissingOrInvalid_SignedMeterValue_Contract_TimestampLocal_TimestampP\", measurementCounter));\n\n if (!chargyLib.isMandatoryNumber(timestampLocal[\"localOffset\"]))\n errors.push(this.chargy.GetLocalizedMessageWithParameter(\"MissingOrInvalid_SignedMeterValue_Contract_TimestampLocal_LocalOffsetP\", measurementCounter));\n\n if (!chargyLib.isMandatoryNumber(timestampLocal[\"seasonOffset\"]))\n errors.push(this.chargy.GetLocalizedMessageWithParameter(\"MissingOrInvalid_SignedMeterValue_Contract_TimestampLocal_SeasonOffsetP\", measurementCounter));\n\n }\n\n //#endregion\n\n }\n\n //#endregion\n\n //#region Measured value\n\n const measuredValue = signedMeterValue[\"measuredValue\"];\n if (!chargyLib.isMandatoryJSONObject(measuredValue))\n {\n errors.push(this.chargy.GetLocalizedMessageWithParameter(\"MissingOrInvalid_SignedMeterValue_MeasuredValueP\", measurementCounter));\n secondaryErrors += 9;\n }\n else\n {\n\n if (!chargyLib.isMandatoryString(measuredValue[\"value\"]))\n errors.push(this.chargy.GetLocalizedMessageWithParameter(\"MissingOrInvalid_SignedMeterValue_MeasuredValue_ValueP\", measurementCounter));\n\n if (!chargyLib.isMandatoryString(measuredValue[\"unit\"]))\n errors.push(this.chargy.GetLocalizedMessageWithParameter(\"MissingOrInvalid_SignedMeterValue_MeasuredValue_UnitP\", measurementCounter));\n\n if (!chargyLib.isMandatoryNumber(measuredValue[\"scale\"]))\n errors.push(this.chargy.GetLocalizedMessageWithParameter(\"MissingOrInvalid_SignedMeterValue_MeasuredValue_ScaleP\", measurementCounter));\n\n if (!chargyLib.isMandatoryString(measuredValue[\"valueType\"]))\n errors.push(this.chargy.GetLocalizedMessageWithParameter(\"MissingOrInvalid_SignedMeterValue_MeasuredValue_ValueTypeP\", measurementCounter));\n\n if (!chargyLib.isMandatoryNumber(measuredValue[\"unitEncoded\"]))\n errors.push(this.chargy.GetLocalizedMessageWithParameter(\"MissingOrInvalid_SignedMeterValue_MeasuredValue_UnitEncodedP\", measurementCounter));\n\n //#region Measured Value - Local timestamp\n\n const timestampLocal = measuredValue[\"timestampLocal\"];\n if (!chargyLib.isMandatoryJSONObject(timestampLocal))\n {\n errors.push(this.chargy.GetLocalizedMessageWithParameter(\"MissingOrInvalidMeasuredValueTimestampLocalP\", measurementCounter));\n secondaryErrors += 3;\n }\n else\n {\n\n if (!chargyLib.isMandatoryNumber(timestampLocal[\"timestamp\"]))\n errors.push(this.chargy.GetLocalizedMessageWithParameter(\"MissingOrInvalidMeasuredValueTimestampLocalTimestampP\", measurementCounter));\n\n if (!chargyLib.isMandatoryNumber(timestampLocal[\"localOffset\"]))\n errors.push(this.chargy.GetLocalizedMessageWithParameter(\"MissingOrInvalidMeasuredValueTimestampLocalOffsetP\", measurementCounter));\n\n if (!chargyLib.isMandatoryNumber(timestampLocal[\"seasonOffset\"]))\n errors.push(this.chargy.GetLocalizedMessageWithParameter(\"MissingOrInvalidMeasuredValueTimestampSeasonOffsetP\", measurementCounter));\n\n }\n\n //#endregion\n\n }\n\n //#endregion\n\n //#region Measurand\n\n const measurand = signedMeterValue[\"measurand\"];\n if (!chargyLib.isMandatoryJSONObject(measurand))\n {\n errors.push(this.chargy.GetLocalizedMessageWithParameter(\"MissingOrInvalid_SignedMeterValue_MeasurandP\", measurementCounter));\n secondaryErrors += 2;\n }\n else\n {\n\n if (!chargyLib.isMandatoryString(measurand[\"id\"]))\n errors.push(this.chargy.GetLocalizedMessageWithParameter(\"MissingOrInvalid_SignedMeterValue_Measurand_IdP\", measurementCounter));\n\n if (!chargyLib.isMandatoryString(measurand[\"name\"]))\n errors.push(this.chargy.GetLocalizedMessageWithParameter(\"MissingOrInvalid_SignedMeterValue_Measurand_NameP\", measurementCounter));\n\n }\n\n //#endregion\n\n //#region Additional info\n\n const additionalInfo = signedMeterValue[\"additionalInfo\"];\n if (!chargyLib.isMandatoryJSONObject(additionalInfo))\n {\n errors.push(this.chargy.GetLocalizedMessageWithParameter(\"MissingOrInvalid_SignedMeterValue_AdditionalInformationP\", measurementCounter));\n secondaryErrors += 4;\n }\n else\n {\n\n if (!chargyLib.isMandatoryString(additionalInfo[\"status\"]))\n errors.push(this.chargy.GetLocalizedMessageWithParameter(\"MissingOrInvalid_SignedMeterValue_AdditionalInformation_StatusP\", measurementCounter));\n\n //#region Additional info - Indexes\n\n const indexes = additionalInfo[\"indexes\"];\n if (!chargyLib.isMandatoryJSONObject(indexes))\n {\n errors.push(this.chargy.GetLocalizedMessageWithParameter(\"MissingOrInvalid_SignedMeterValue_AdditionalInformation_IndexesP\", measurementCounter));\n secondaryErrors += 2;\n }\n else\n {\n\n if (!chargyLib.isMandatoryNumber(indexes[\"timer\"]))\n errors.push(this.chargy.GetLocalizedMessageWithParameter(\"MissingOrInvalid_SignedMeterValue_AdditionalInformation_Indexes_TimerP\", measurementCounter));\n\n if (!chargyLib.isMandatoryString(indexes[\"logBook\"]))\n errors.push(this.chargy.GetLocalizedMessageWithParameter(\"MissingOrInvalid_SignedMeterValue_AdditionalInformation_Indexes_LogBookP\", measurementCounter));\n\n }\n\n //#endregion\n\n }\n\n //#endregion\n\n //#region ChargePoint information\n\n const chargePoint = signedMeterValue[\"chargePoint\"];\n if (!chargyLib.isMandatoryJSONObject(chargePoint))\n {\n errors.push(this.chargy.GetLocalizedMessageWithParameter(\"MissingOrInvalid_SignedMeterValue_ChargePointInformationP\", measurementCounter));\n secondaryErrors += 1;\n }\n else\n {\n\n if (!chargyLib.isMandatoryString(chargePoint[\"softwareVersion\"]))\n errors.push(this.chargy.GetLocalizedMessageWithParameter(\"MissingOrInvalid_SignedMeterValue_ChargePointInformation_SoftwareVersionP\", measurementCounter));\n\n }\n\n //#endregion\n\n }\n\n }\n\n }\n\n }\n\n }\n\n //#endregion\n\n if (errors.length > 0) return {\n status: chargyInterfaces.SessionVerificationResult.InvalidSessionFormat,\n errors: errors,\n warnings: warnings,\n certainty: (numberOfFormatChecks - errors.length - secondaryErrors)/numberOfFormatChecks\n }\n\n }\n //#endregion\n\n //#region Parse the container format\n {\n\n const signedMeterValues = SomeJSON[\"signedMeterValues\"];\n const placeInfo = chargyLib.asJSONObject(SomeJSON[\"placeInfo\"]);\n const evseId = placeInfo?.[\"evseId\"];\n const address = chargyLib.asJSONObject(placeInfo?.[\"address\"]);\n const address_street = address?.[\"street\"];\n const address_zipCode = address?.[\"zipCode\"];\n const address_town = address?.[\"town\"];\n const address_country = address?.[\"country\"] ?? \"Deutschland\"; //ToDo: i18n!\n const geoLocation = chargyLib.asJSONObject(placeInfo?.[\"geoLocation\"]);\n const geoLocation_lat = geoLocation?.[\"lat\"];\n const geoLocation_lon = geoLocation?.[\"lon\"];\n\n\n if (chargyLib.isMandatoryJSONArray (signedMeterValues) &&\n\n chargyLib.isMandatoryJSONObject(placeInfo) &&\n\n chargyLib.isMandatoryString (evseId) &&\n\n chargyLib.isMandatoryJSONObject(address) &&\n chargyLib.isMandatoryString (address_street) &&\n chargyLib.isMandatoryString (address_zipCode) &&\n chargyLib.isMandatoryString (address_town) &&\n chargyLib.isMandatoryString (address_country) &&\n\n chargyLib.isMandatoryJSONObject(geoLocation) &&\n chargyLib.isMandatoryNumber (geoLocation_lat) &&\n chargyLib.isMandatoryNumber (geoLocation_lon))\n {\n\n address[\"country\"] = address_country;\n\n //#region Generate default charge transparency record\n\n const CTR: chargeTransparencyRecord.IChargeTransparencyRecord = {\n\n \"@id\": \"\",\n \"@context\": \"https://open.charging.cloud/contexts/CTR+json\",\n\n \"description\": {\n \"de\": \"Alle Ladevorgänge\"\n },\n\n \"chargingStationOperators\": [\n {\n\n \"@id\": \"chargeITmobilityCSO\",\n \"@context\": \"\",\n //\"eMobilityIds\": [ \"DE*BDO\", \"DE*LVF\", \"+49*822\" ],\n \"description\": {\n \"de\": \"chargeIT mobility GmbH - Charging Station Operator Services\"\n },\n\n \"contact\": {\n \"email\": \"info@chargeit-mobility.com\",\n \"web\": \"https://www.chargeit-mobility.com\",\n \"logoUrl\": \"http://www.chargeit-mobility.com/fileadmin/BELECTRIC_Drive/templates/pics/chargeit_logo_408x70.png\",\n \"publicKeys\": [\n {\n \"algorithm\": \"secp192r1\",\n \"format\": \"DER\",\n \"encoding\": \"hex\",\n \"value\": \"042313b9e469612b4ca06981bfdecb226e234632b01d84b6a814f63a114b7762c34ddce2e6853395b7a0f87275f63ffe3c\",\n \"signatures\": [\n {\n \"keyId\": \"...\",\n \"algorithm\": \"secp192r1\",\n \"format\": \"DER\",\n \"value\": \"????\"\n }\n ]\n },\n {\n \"algorithm\": \"secp256k1\",\n \"format\": \"DER\",\n \"encoding\": \"hex\",\n \"value\": \"04a8ff0d82107922522e004a167cc658f0eef408c5020f98e7a2615be326e61852666877335f4f8d9a0a756c26f0c9fb3f401431416abb5317cc0f5d714d3026fe\",\n \"signatures\": [ ]\n }\n ]\n },\n\n \"support\": {\n \"hotline\": \"+49 9321 / 2680 - 700\",\n \"email\": \"service@chargeit-mobility.com\",\n \"web\": \"https://cso.chargeit.charging.cloud/issues\"\n // \"mediationServices\": [ \"GraphDefined Mediation\" ],\n // \"publicKeys\": [\n // {\n // \"algorithm\": \"secp256k1\",\n // \"format\": \"DER\",\n // \"value\": \"04a8ff0d82107922522e004a167cc658f0eef408c5020f98e7a2615be326e61852666877335f4f8d9a0a756c26f0c9fb3f401431416abb5317cc0f5d714d3026fe\",\n // \"signatures\": [ ]\n // }\n // ]\n },\n\n \"privacy\": {\n \"contact\": \"Dr. iur. Christian Borchers, datenschutz süd GmbH\",\n \"email\": \"datenschutz@chargeit-mobility.com\",\n \"web\": \"http://www.chargeit-mobility.com/de/datenschutz/\"\n // \"publicKeys\": [\n // {\n // \"algorithm\": \"secp256k1\",\n // \"format\": \"DER\",\n // \"value\": \"04a8ff0d82107922522e004a167cc658f0eef408c5020f98e7a2615be326e61852666877335f4f8d9a0a756c26f0c9fb3f401431416abb5317cc0f5d714d3026fe\",\n // \"signatures\": [ ]\n // }\n // ]\n },\n\n \"chargingStations\": [\n {\n \"@id\": evseId.substring(0, evseId.lastIndexOf(\"*\")),\n //\"description\": { },\n //\"firmwareVersion\": \"\", //CTRArray[0][\"chargePoint\"][\"softwareVersion\"],\n \"geoLocation\": { \"lat\": geoLocation_lat, \"lng\": geoLocation_lon },\n \"address\": {\n \"street\": address_street,\n \"postalCode\": address_zipCode,\n \"city\": chargyLib.asString(address_town) ?? \"\",\n \"country\": \"Germany\"\n },\n \"EVSEs\": [\n {\n \"@id\": evseId,\n // \"description\": {\n // \"de\": \"GraphDefined EVSE - CI-Tests Pool 3 / Station A / EVSE 1\"\n // },\n //\"connectors\": [ ],\n \"meters\": [ ]\n }\n ]\n }\n ]\n\n }\n ],\n\n certainty: 0\n\n };\n\n //#endregion\n\n //#region Parse the signedMeterValues\n\n const signedMeterValueContext = chargyLib.asString(chargyLib.asJSONObject(signedMeterValues[0])?.[\"@context\"])?.trim()\n ?? oldChargeITMeterValueFormat;\n\n if (signedMeterValueContext === \"https://www.lichtblick.de/contexts/bsm-ws36a-json-v0\" ||\n signedMeterValueContext === \"https://www.lichtblick.de/contexts/bsm-ws36a-json-v1\" ||\n signedMeterValueContext === \"https://www.eneco.com/contexts/bsm-ws36a-json-v0\" ||\n signedMeterValueContext === \"https://www.eneco.com/contexts/bsm-ws36a-json-v1\" ||\n signedMeterValueContext === \"https://www.chargeit-mobility.com/contexts/bsm-ws36a-json-v0\" ||\n signedMeterValueContext === \"https://www.chargeit-mobility.com/contexts/bsm-ws36a-json-v1\") {\n\n return new BSMCrypt01(this.chargy).tryToParseBSM_WS36aMeasurements(\n CTR,\n evseId,\n null,\n signedMeterValues\n );\n\n }\n\n if (signedMeterValueContext.startsWith(\"ALFEN\")) {\n return new Alfen(this.chargy).TryToParseALFENFormat(\n signedMeterValues.map(value => chargyLib.asString(chargyLib.asJSONObject(value)?.[\"payload\"]) ?? \"\"),\n {\n EVSEId: evseId,\n chargingStation: {\n geoLocation: { \"lat\": geoLocation_lat, \"lng\": geoLocation_lon },\n address: { \"street\": address_street, \"postalCode\": address_zipCode, \"city\": address_town, \"country\": address_country }\n }\n }\n );\n }\n\n if (containerFormat === oldChargeITContainerFormat) {\n\n if (chargyLib.asJSONObject(signedMeterValues[0])?.[\"format\"] == \"ALFEN\")\n return new Alfen(this.chargy).TryToParseALFENFormat(\n signedMeterValues.map(value => chargyLib.asString(chargyLib.asJSONObject(value)?.[\"payload\"]) ?? \"\"),\n {\n EVSEId: evseId,\n chargingStation: {\n geoLocation: { \"lat\": geoLocation_lat, \"lng\": geoLocation_lon },\n address: { \"street\": address_street, \"postalCode\": address_zipCode, \"city\": address_town, \"country\": address_country }\n }\n }\n );\n\n }\n\n if (signedMeterValueContext === oldChargeITMeterValueFormat)\n return this.TryToParseOldChargeITMeterValuesFormat(\n CTR,\n evseId,\n address,\n geoLocation,\n signedMeterValues\n );\n\n //#endregion\n\n return {\n status: chargyInterfaces.SessionVerificationResult.InvalidSessionFormat,\n errors: errors,\n warnings: warnings,\n certainty: (numberOfFormatChecks - errors.length - secondaryErrors)/numberOfFormatChecks\n }\n\n }\n\n }\n\n //#endregion\n\n }\n catch (exception)\n {\n return {\n status: chargyInterfaces.SessionVerificationResult.InvalidSessionFormat,\n message: \"Exception occured: \" + (exception instanceof Error ? exception.message : String(exception)),\n errors: errors,\n warnings: warnings,\n certainty: (numberOfFormatChecks - errors.length - secondaryErrors)/numberOfFormatChecks\n }\n }\n\n }\n\n //#endregion\n\n //#region New chargeIT container format\n\n if (containerFormat == \"https://www.lichtblick.de/contexts/charging-station-json-v0\" ||\n containerFormat == \"https://www.lichtblick.de/contexts/charging-station-json-v1\" ||\n containerFormat == \"https://www.eneco.com/contexts/charging-station-json-v0\" ||\n containerFormat == \"https://www.eneco.com/contexts/charging-station-json-v1\" ||\n containerFormat == \"https://www.chargeit-mobility.com/contexts/charging-station-json-v0\" ||\n containerFormat == \"https://www.chargeit-mobility.com/contexts/charging-station-json-v1\")\n {\n\n const numberOfFormatChecks = 81;\n let secondaryErrors = 0;\n\n try\n {\n\n const chargingSessionId = SomeJSON[\"@id\"];\n\n const chargePointInfo = chargyLib.asJSONObject(SomeJSON[\"chargePointInfo\"]);\n const evseId = chargePointInfo?.[\"evseId\"];\n\n const placeInfo = chargyLib.asJSONObject(chargePointInfo?.[\"placeInfo\"]);\n const geoLocation = chargyLib.asJSONObject(placeInfo?.[\"geoLocation\"]);\n const geoLocation_lat = geoLocation?.[\"lat\"];\n const geoLocation_lon = geoLocation?.[\"lon\"];\n\n const address = chargyLib.asJSONObject(placeInfo?.[\"address\"]);\n const address_street = address?.[\"street\"];\n const address_zipCode = address?.[\"zipCode\"];\n const address_town = address?.[\"town\"];\n const address_country = address?.[\"country\"] ?? \"\";\n\n const chargingStationInfo = chargyLib.asJSONObject(SomeJSON[\"chargingStationInfo\"]);\n const chargingStation_manufacturer = chargingStationInfo?.[\"manufacturer\"];\n const chargingStation_type = chargingStationInfo?.[\"type\"];\n const chargingStation_serialNumber = chargingStationInfo?.[\"serialNumber\"];\n const chargingStation_controllerSoftwareVersion = chargingStationInfo?.[\"controllerSoftwareVersion\"];\n const chargingStation_compliance = chargingStationInfo?.[\"compliance\"];\n const chargingStation_complianceURL = chargingStationInfo?.[\"complianceURL\"];\n const chargingStation_conformity = chargingStationInfo?.[\"conformity\"];\n const chargingStation_conformity_URL = chargingStationInfo?.[\"conformityURL\"];\n const chargingStation_conformity_certificateId = chargingStationInfo?.[\"conformityCertificateId\"];\n const chargingStation_calibration = chargingStationInfo?.[\"calibration\"];\n const chargingStation_calibration_URL = chargingStationInfo?.[\"calibrationURL\"];\n const chargingStation_calibration_certificateId = chargingStationInfo?.[\"calibrationCertificateId\"];\n\n // meterInfo can also be under the signedMeterValues!\n const meterInfo = chargyLib.asJSONObject(SomeJSON[\"meterInfo\"]);\n const meterInfo_meterId = meterInfo?.[\"meterId\"];\n const meterInfo_manufacturer = meterInfo?.[\"manufacturer\"];\n const meterInfo_manufacturerURL = meterInfo?.[\"manufacturerURL\"];\n const meterInfo_model = meterInfo?.[\"model\"];\n const meterInfo_modelURL = meterInfo?.[\"modelURL\"];\n const meterInfo_hardwareVersion = meterInfo?.[\"hardwareVersion\"];\n const meterInfo_firmwareVersion = meterInfo?.[\"firmwareVersion\"];\n const meterInfo_publicKey = meterInfo?.[\"publicKey\"];\n const meterInfo_publicKeyFormat = meterInfo?.[\"publicKeyFormat\"];\n const meterInfo_publicKeyEncoding = meterInfo?.[\"publicKeyEncoding\"];\n const meterInfo_signatureFormat = meterInfo?.[\"signatureFormat\"];\n const meterInfo_signatureEncoding = meterInfo?.[\"signatureEncoding\"];\n\n const connectorInfo = chargyLib.asJSONObject(SomeJSON[\"connectorInfo\"]);\n const connectorInfo_type = connectorInfo?.[\"type\"];\n const connectorInfo_losses = connectorInfo?.[\"losses\"];\n\n const chargingTariffs = SomeJSON[\"chargingTariffs\"];\n\n const chargingPeriods = SomeJSON[\"chargingPeriods\"];\n\n const totalCosts = chargyLib.asJSONObject(SomeJSON[\"totalCosts\"]);\n const totalCosts_total = totalCosts?.[\"total\"];\n const totalCosts_currency = totalCosts?.[\"currency\"];\n const totalCosts_reservation = chargyLib.asJSONObject(totalCosts?.[\"reservation\"]);\n const totalCosts_reservation_cost = totalCosts_reservation?.[\"cost\"];\n const totalCosts_reservation_unit = totalCosts_reservation?.[\"unit\"];\n const totalCosts_energy = chargyLib.asJSONObject(totalCosts?.[\"energy\"]);\n const totalCosts_energy_cost = totalCosts_energy?.[\"cost\"];\n const totalCosts_energy_unit = totalCosts_energy?.[\"unit\"];\n const totalCosts_time = chargyLib.asJSONObject(totalCosts?.[\"time\"]);\n const totalCosts_time_cost = totalCosts_time?.[\"cost\"];\n const totalCosts_time_unit = totalCosts_time?.[\"unit\"];\n const totalCosts_idle = chargyLib.asJSONObject(totalCosts?.[\"idle\"]);\n const totalCosts_idle_cost = totalCosts_idle?.[\"cost\"];\n const totalCosts_idle_unit = totalCosts_idle?.[\"unit\"];\n const totalCosts_flat = chargyLib.asJSONObject(totalCosts?.[\"flat\"]);\n const totalCosts_flat_cost = totalCosts_flat?.[\"cost\"];\n\n const signedMeterValues = SomeJSON[\"signedMeterValues\"];\n\n\n if (!chargyLib.isMandatoryString(chargingSessionId))\n errors.push(this.chargy.GetLocalizedMessage(\"Missing or invalid charge transparency record identification!\"));\n\n //#region chargePointInfo\n\n if (!chargyLib.isMandatoryJSONObject(chargePointInfo))\n {\n errors.push(this.chargy.GetLocalizedMessage(\"MissingOrInvalidChargePointInfo\"));\n secondaryErrors += 19;\n }\n else\n {\n\n if (!chargyLib.isMandatoryString(evseId))\n errors.push(this.chargy.GetLocalizedMessage(\"MissingOrInvalidEVSEIdentification\"));\n\n //#region placeInfo\n\n if (!chargyLib.isMandatoryJSONObject(placeInfo))\n {\n errors.push(this.chargy.GetLocalizedMessage(\"MissingOrInvalidPlaceInfo\"));\n secondaryErrors += 8;\n }\n else\n {\n\n //#region geoLocation\n\n if (!chargyLib.isMandatoryJSONObject(geoLocation))\n {\n errors.push(this.chargy.GetLocalizedMessage(\"MissingOrInvalidGeoLocation\"));\n secondaryErrors += 2;\n }\n else\n {\n\n if (!chargyLib.isMandatoryNumber(geoLocation_lat))\n errors.push(this.chargy.GetLocalizedMessage(\"MissingOrInvalidGeoLocationLatitude\"));\n\n if (!chargyLib.isMandatoryNumber(geoLocation_lon))\n errors.push(this.chargy.GetLocalizedMessage(\"MissingOrInvalidGeoLocationLongitude\"));\n\n }\n\n //#endregion\n\n //#region address\n\n if (!chargyLib.isMandatoryJSONObject(address))\n {\n errors.push(this.chargy.GetLocalizedMessage(\"MissingOrInvalidAddress\"));\n secondaryErrors += 4;\n }\n else\n {\n\n if (!chargyLib.isMandatoryString(address_street))\n errors.push(this.chargy.GetLocalizedMessage(\"MissingOrInvalidAddressStreetName\"));\n\n if (!chargyLib.isMandatoryString(address_zipCode))\n errors.push(this.chargy.GetLocalizedMessage(\"MissingOrInvalidAddressZIPCode\"));\n\n if (!chargyLib.isMandatoryString(address_town))\n errors.push(this.chargy.GetLocalizedMessage(\"MissingOrInvalidAddressCityName\"));\n\n if (!chargyLib.isMandatoryString(address_country))\n errors.push(this.chargy.GetLocalizedMessage(\"MissingOrInvalidAddressCountryName\"));\n\n }\n\n //#endregion\n\n }\n\n //#endregion\n\n }\n\n //#endregion\n\n //#region chargingStationInfo\n\n if (!chargyLib.isMandatoryJSONObject(chargingStationInfo))\n {\n errors.push(this.chargy.GetLocalizedMessage(\"MissingOrInvalidChargingStationInfo\"));\n secondaryErrors += 5;\n }\n else\n {\n\n if (!chargyLib.isOptionalString(chargingStation_manufacturer))\n errors.push(this.chargy.GetLocalizedMessage(\"Invalid charging station manufacturer!\"));\n\n if (!chargyLib.isOptionalString(chargingStation_type))\n errors.push(this.chargy.GetLocalizedMessage(\"Invalid charging station type!\"));\n\n if (!chargyLib.isOptionalString(chargingStation_serialNumber))\n errors.push(this.chargy.GetLocalizedMessage(\"Invalid charging station serial number!\"));\n\n if (!chargyLib.isOptionalString(chargingStation_controllerSoftwareVersion))\n errors.push(this.chargy.GetLocalizedMessage(\"Invalid charging station controller software version!\"));\n\n\n if (!chargyLib.isOptionalString(chargingStation_compliance))\n errors.push(this.chargy.GetLocalizedMessage(\"Invalid charging station compliance!\"));\n\n if (!chargyLib.isOptionalURL (chargingStation_complianceURL))\n errors.push(this.chargy.GetLocalizedMessage(\"Invalid charging station compliance URL!\"));\n\n\n if (!chargyLib.isOptionalString(chargingStation_conformity))\n errors.push(this.chargy.GetLocalizedMessage(\"Invalid charging station conformity!\"));\n\n if (!chargyLib.isOptionalURL (chargingStation_conformity_URL))\n errors.push(this.chargy.GetLocalizedMessage(\"Invalid charging station conformity URL!\"));\n\n if (!chargyLib.isOptionalURL (chargingStation_conformity_certificateId))\n errors.push(this.chargy.GetLocalizedMessage(\"Invalid charging station conformity certificate identification!\"));\n\n\n if (!chargyLib.isOptionalString(chargingStation_calibration))\n errors.push(this.chargy.GetLocalizedMessage(\"Invalid charging station calibration!\"));\n\n if (!chargyLib.isOptionalURL (chargingStation_calibration_URL))\n errors.push(this.chargy.GetLocalizedMessage(\"Invalid charging station calibration URL!\"));\n\n if (!chargyLib.isOptionalURL (chargingStation_calibration_certificateId))\n errors.push(this.chargy.GetLocalizedMessage(\"Invalid charging station calibration certificate identification!\"));\n\n }\n\n //#endregion\n\n //#region meterInfo\n\n if (meterInfo) {\n\n if (!chargyLib.isOptionalString(meterInfo_meterId))\n errors.push(this.chargy.GetLocalizedMessageWithParameter(\"MissingOrInvalid_SignedMeterValue_MeterInfo_MeterIdP\", 1));\n\n if (!chargyLib.isOptionalString(meterInfo_manufacturer))\n errors.push(this.chargy.GetLocalizedMessageWithParameter(\"MissingOrInvalid_SignedMeterValue_MeterInfo_ManufacturerP\", 1));\n\n if (!chargyLib.isOptionalString(meterInfo_manufacturerURL))\n errors.push(this.chargy.GetLocalizedMessageWithParameter(\"MissingOrInvalid_SignedMeterValue_MeterInfo_ManufacturerP\", 1));\n\n if (!chargyLib.isOptionalString(meterInfo_model))\n errors.push(this.chargy.GetLocalizedMessageWithParameter(\"MissingOrInvalid_SignedMeterValue_MeterInfo_ManufacturerP\", 1));\n\n if (!chargyLib.isOptionalString(meterInfo_modelURL))\n errors.push(this.chargy.GetLocalizedMessageWithParameter(\"MissingOrInvalid_SignedMeterValue_MeterInfo_ManufacturerP\", 1));\n\n if (!chargyLib.isOptionalString(meterInfo_firmwareVersion))\n errors.push(this.chargy.GetLocalizedMessageWithParameter(\"MissingOrInvalid_SignedMeterValue_MeterInfo_FirmwareVersionP\", 1));\n\n if (!chargyLib.isOptionalString(meterInfo_hardwareVersion))\n errors.push(this.chargy.GetLocalizedMessageWithParameter(\"MissingOrInvalid_SignedMeterValue_MeterInfo_FirmwareVersionP\", 1));\n\n\n if (!chargyLib.isOptionalString(meterInfo_publicKey))\n errors.push(this.chargy.GetLocalizedMessageWithParameter(\"MissingOrInvalid_SignedMeterValue_MeterInfo_PublicKeyP\", 1));\n\n if (!chargyLib.isOptionalString(meterInfo_publicKeyFormat))\n errors.push(this.chargy.GetLocalizedMessageWithParameter(\"MissingOrInvalid_SignedMeterValue_MeterInfo_PublicKeyP\", 1));\n\n if (!chargyLib.isOptionalString(meterInfo_publicKeyEncoding))\n errors.push(this.chargy.GetLocalizedMessageWithParameter(\"MissingOrInvalid_SignedMeterValue_MeterInfo_PublicKeyP\", 1));\n\n\n if (!chargyLib.isOptionalString(meterInfo_signatureFormat))\n errors.push(this.chargy.GetLocalizedMessageWithParameter(\"MissingOrInvalid_SignedMeterValue_MeterInfo_PublicKeyP\", 1));\n\n if (!chargyLib.isOptionalString(meterInfo_signatureEncoding))\n errors.push(this.chargy.GetLocalizedMessageWithParameter(\"MissingOrInvalid_SignedMeterValue_MeterInfo_PublicKeyP\", 1));\n\n }\n\n //#endregion\n\n //#region connectorInfo\n\n if (connectorInfo) {\n\n if (!chargyLib.isOptionalString(connectorInfo_type))\n errors.push(this.chargy.GetLocalizedMessageWithParameter(\"MissingOrInvalid_SignedMeterValue_MeterInfo_MeterIdP\", 1));\n\n if (!chargyLib.isOptionalString(connectorInfo_losses))\n errors.push(this.chargy.GetLocalizedMessageWithParameter(\"MissingOrInvalid_SignedMeterValue_MeterInfo_MeterIdP\", 1));\n\n }\n\n //#endregion\n\n //#region chargingTariffs\n\n if (chargyLib.isMandatoryJSONArray(chargingTariffs))\n {\n\n for (let i = 0; i < chargingTariffs.length; i++)\n {\n // ToDo: Validate and import the charging tariffs!\n }\n\n }\n\n //#endregion\n\n //#region totalCosts\n\n if (totalCosts)\n {\n\n if (!chargyLib.isMandatoryNumber(totalCosts_total))\n errors.push(this.chargy.GetLocalizedMessage(\"Missing or invalid total costs within the charging costs!\"));\n\n if (!chargyLib.isMandatoryString(totalCosts_currency))\n errors.push(this.chargy.GetLocalizedMessage(\"Missing or invalid currency within the charging costs!\"));\n\n if (totalCosts_reservation)\n {\n\n if (!chargyLib.isMandatoryNumber(totalCosts_reservation_cost))\n errors.push(this.chargy.GetLocalizedMessage(\"Missing or invalid reservation cost within the charging costs!\"));\n\n // ToDo: Check for valid reservation unit\n if (!chargyLib.isMandatoryString(totalCosts_reservation_unit))\n errors.push(this.chargy.GetLocalizedMessage(\"Missing or invalid reservation unit within the charging costs!\"));\n\n }\n\n if (totalCosts_energy)\n {\n\n if (!chargyLib.isMandatoryNumber(totalCosts_energy_cost))\n errors.push(this.chargy.GetLocalizedMessage(\"Missing or invalid energy cost within the charging costs!\"));\n\n // ToDo: Check for valid energy unit\n if (!chargyLib.isMandatoryString(totalCosts_energy_unit))\n errors.push(this.chargy.GetLocalizedMessage(\"Missing or invalid energy unit within the charging costs!\"));\n\n }\n\n if (totalCosts_time)\n {\n\n if (!chargyLib.isMandatoryNumber(totalCosts_time_cost))\n errors.push(this.chargy.GetLocalizedMessage(\"Missing or invalid time cost within the charging costs!\"));\n\n // ToDo: Check for valid time unit\n if (!chargyLib.isMandatoryString(totalCosts_time_unit))\n errors.push(this.chargy.GetLocalizedMessage(\"Missing or invalid time unit within the charging costs!\"));\n\n }\n\n if (totalCosts_idle)\n {\n\n if (!chargyLib.isMandatoryNumber(totalCosts_idle_cost))\n errors.push(this.chargy.GetLocalizedMessage(\"Missing or invalid idle cost within the charging costs!\"));\n\n // ToDo: Check for valid idle unit\n if (!chargyLib.isMandatoryString(totalCosts_idle_unit))\n errors.push(this.chargy.GetLocalizedMessage(\"Missing or invalid idle unit within the charging costs!\"));\n\n }\n\n if (totalCosts_flat)\n {\n\n if (!chargyLib.isMandatoryNumber(totalCosts_flat_cost))\n errors.push(this.chargy.GetLocalizedMessage(\"Missing or invalid flat cost within the charging costs!\"));\n\n }\n\n }\n\n //#endregion\n\n if (!chargyLib.isMandatoryJSONArray(signedMeterValues) || signedMeterValues.length < 2) {\n errors.push(this.chargy.GetLocalizedMessage(\"MissingOrInvalidSignedMeterValues\"));\n secondaryErrors += 2*39;\n }\n else\n {\n\n const firstSMV = chargyLib.asJSONObject(signedMeterValues[0]);\n const smvContext = chargyLib.asString(firstSMV?.[\"@context\"])?.trim()\n ?? chargyLib.asString(firstSMV?.[\"format\"])?.trim()\n ?? null;\n\n for (let i = 1; i < signedMeterValues.length; i++)\n {\n\n const currentSMV = chargyLib.asJSONObject(signedMeterValues[i]);\n const context = chargyLib.asString(currentSMV?.[\"@context\"])?.trim()\n ?? chargyLib.asString(currentSMV?.[\"format\"])?.trim()\n ?? null;\n\n if (smvContext !== context) return {\n status: chargyInterfaces.SessionVerificationResult.InvalidSessionFormat,\n message: \"Inconsistent signed meter value format!\",\n certainty: 1\n }\n\n }\n\n\n //#region Generate default-transparency record\n\n const evseIdStr = chargyLib.asString(evseId) ?? \"\";\n\n const CTR: chargeTransparencyRecord.IChargeTransparencyRecord = {\n\n \"@id\": \"\",\n \"@context\": \"https://open.charging.cloud/contexts/CTR+json\",\n\n \"description\": {\n \"de\": \"Alle Ladevorgänge\",\n \"en\": \"All charging sessions\"\n },\n\n \"chargingStationOperators\": [\n {\n\n \"@id\": \"chargeITmobilityCSO\",\n \"description\": {\n \"de\": \"chargeIT mobility GmbH - Charging Station Operator Services\"\n },\n\n \"contact\": {\n \"email\": \"info@chargeit-mobility.com\",\n \"web\": \"https://www.chargeit-mobility.com\",\n \"logoUrl\": \"http://www.chargeit-mobility.com/fileadmin/BELECTRIC_Drive/templates/pics/chargeit_logo_408x70.png\",\n \"publicKeys\": [\n {\n \"algorithm\": \"secp192r1\",\n \"format\": \"DER\",\n \"encoding\": \"hex\",\n \"value\": \"042313b9e469612b4ca06981bfdecb226e234632b01d84b6a814f63a114b7762c34ddce2e6853395b7a0f87275f63ffe3c\",\n \"signatures\": [\n {\n \"keyId\": \"...\",\n \"algorithm\": \"secp192r1\",\n \"format\": \"DER\",\n \"value\": \"????\"\n }\n ]\n },\n {\n \"algorithm\": \"secp256k1\",\n \"format\": \"DER\",\n \"encoding\": \"hex\",\n \"value\": \"04a8ff0d82107922522e004a167cc658f0eef408c5020f98e7a2615be326e61852666877335f4f8d9a0a756c26f0c9fb3f401431416abb5317cc0f5d714d3026fe\",\n \"signatures\": [ ]\n }\n ]\n },\n\n \"support\": {\n \"hotline\": \"+49 9321 / 2680 - 700\",\n \"email\": \"service@chargeit-mobility.com\",\n \"web\": \"https://cso.chargeit.charging.cloud/issues\"\n // \"mediationServices\": [ \"GraphDefined Mediation\" ],\n // \"publicKeys\": [\n // {\n // \"algorithm\": \"secp256k1\",\n // \"format\": \"DER\",\n // \"value\": \"04a8ff0d82107922522e004a167cc658f0eef408c5020f98e7a2615be326e61852666877335f4f8d9a0a756c26f0c9fb3f401431416abb5317cc0f5d714d3026fe\",\n // \"signatures\": [ ]\n // }\n // ]\n },\n\n \"privacy\": {\n \"contact\": \"Dr. iur. Christian Borchers, datenschutz süd GmbH\",\n \"email\": \"datenschutz@chargeit-mobility.com\",\n \"web\": \"http://www.chargeit-mobility.com/de/datenschutz/\"\n // \"publicKeys\": [\n // {\n // \"algorithm\": \"secp256k1\",\n // \"format\": \"DER\",\n // \"value\": \"04a8ff0d82107922522e004a167cc658f0eef408c5020f98e7a2615be326e61852666877335f4f8d9a0a756c26f0c9fb3f401431416abb5317cc0f5d714d3026fe\",\n // \"signatures\": [ ]\n // }\n // ]\n },\n\n \"chargingStations\": [\n {\n \"@id\": evseIdStr.substring(0, evseIdStr.lastIndexOf(\"*\")),\n //\"@context\": \"\",\n //\"description\": { },\n //\"firmwareVersion\": \"\", //CTRArray[0][\"chargePoint\"][\"softwareVersion\"],\n \"geoLocation\": { \"lat\": chargyLib.asNumber(geoLocation_lat) ?? 0, \"lng\": chargyLib.asNumber(geoLocation_lon) ?? 0 },\n \"address\": {\n //\"@context\": \"\",\n \"street\": chargyLib.asString(address_street),\n \"postalCode\": chargyLib.asString(address_zipCode) ?? \"\",\n \"city\": chargyLib.asString(address_town) ?? \"\",\n \"country\": chargyLib.asString(address_country) ?? \"\"\n },\n \"EVSEs\": [\n {\n \"@id\": evseIdStr,\n //\"@context\": \"\",\n // \"description\": {\n // \"de\": \"GraphDefined EVSE - CI-Tests Pool 3 / Station A / EVSE 1\"\n // },\n //\"connectors\": [ ],\n \"meters\": [ ]\n }\n ]\n }\n ],\n\n // ToDo: The charging tariffs are not validated yet!\n \"chargingTariffs\": chargyLib.asJSONArray(chargingTariffs) as chargyInterfaces.IChargingTariff[] | undefined\n\n }\n ],\n\n certainty: 0\n\n };\n\n //#endregion\n\n if (smvContext?.startsWith(\"https://www.chargeit-mobility.com/contexts/bsm-ws36a-json\"))\n return new BSMCrypt01(this.chargy).tryToParseBSM_WS36aMeasurements(CTR, evseIdStr, chargyLib.asString(chargingStation_controllerSoftwareVersion) ?? null, signedMeterValues);\n\n if (smvContext?.startsWith(\"ALFEN\"))\n return new Alfen(this.chargy).TryToParseALFENFormat(\n signedMeterValues.map(value => chargyLib.asString(chargyLib.asJSONObject(value)?.[\"payload\"]) ?? \"\"),\n {\n chargingSession: {\n \"@id\": chargingSessionId\n },\n EVSEId: evseId,\n chargingStation: {\n manufacturer: chargingStation_manufacturer,\n type: chargingStation_type,\n serialNumber: chargingStation_serialNumber,\n firmwareVersion: chargingStation_controllerSoftwareVersion,\n legalCompliance: {\n conformity: [{\n freeText: chargingStation_compliance\n }],\n calibration: [{\n freeText: chargingStation_calibration\n }]\n },\n geoLocation: { \"lat\": geoLocation_lat, \"lng\": geoLocation_lon },\n address: { \"street\": address_street, \"postalCode\": address_zipCode, \"city\": address_town, \"country\": address_country }\n },\n energyMeter: meterInfo,\n connector: connectorInfo,\n chargingTariffs: chargingTariffs,\n chargingPeriods: chargingPeriods,\n totalCosts: totalCosts\n });\n\n }\n\n return {\n status: chargyInterfaces.SessionVerificationResult.InvalidSessionFormat,\n errors: errors,\n warnings: warnings,\n certainty: (numberOfFormatChecks - errors.length - secondaryErrors)/numberOfFormatChecks\n }\n\n }\n catch (exception)\n {\n return {\n status: chargyInterfaces.SessionVerificationResult.InvalidSessionFormat,\n message: \"Exception occured: \" + (exception instanceof Error ? exception.message : String(exception)),\n errors: errors,\n warnings: warnings,\n certainty: (numberOfFormatChecks - errors.length - secondaryErrors)/numberOfFormatChecks\n }\n }\n\n }\n\n //#endregion\n\n return {\n status: chargyInterfaces.SessionVerificationResult.InvalidSessionFormat,\n message: \"No chargeIT charge transparency record\",\n errors: errors,\n warnings: warnings,\n certainty: 0\n }\n\n }\n\n //#endregion\n\n}\n","/*\r\n * Copyright (c) 2018-2026 GraphDefined GmbH <achim.friedland@graphdefined.com>\r\n * This file is part of Chargy Desktop App <https://github.com/OpenChargingCloud/ChargyDesktopApp>\r\n *\r\n * Licensed under the Affero GPL license, Version 3.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.gnu.org/licenses/agpl.html\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n\r\nimport { Chargy } from './chargy'\r\nimport { ACrypt } from './ACrypt'\r\nimport * as chargyInterfaces from './interfaces/chargyInterfaces'\r\nimport * as chargeTransparencyRecord from './interfaces/IChargeTransparencyRecord'\r\nimport * as chargyLib from './chargyLib'\r\nimport Decimal from 'decimal.js'\r\n\r\n\r\n// ToDo: Add a chargepoint-specific chargingSessions type, when needed:\r\n// chargingSessions?: Array<IChargepointChargingSession>;\r\nexport type IChargepointChargeTransparencyRecord = chargeTransparencyRecord.IChargeTransparencyRecord;\r\n\r\nexport class ChargePoint {\r\n\r\n private readonly chargy: Chargy;\r\n\r\n constructor(chargy: Chargy) {\r\n this.chargy = chargy;\r\n }\r\n\r\n //#region TryToParseChargepointFormat(SomeJSON)\r\n\r\n public TryToParseChargepointFormat(SomeJSON: unknown)\r\n\r\n : chargeTransparencyRecord.IChargeTransparencyRecord |\r\n chargyInterfaces. ISessionCryptoResult\r\n\r\n {\r\n\r\n try\r\n {\r\n\r\n if (!chargyLib.isMandatoryJSONObject(SomeJSON))\r\n return {\r\n status: chargyInterfaces.SessionVerificationResult.InvalidSessionFormat,\r\n message: this.chargy.GetLocalizedMessage(\"UnknownOrInvalidChargingSessionFormat\"),\r\n certainty: 0\r\n }\r\n\r\n //#region First CTR format\r\n\r\n if (SomeJSON[\"company_name\"] !== undefined &&\r\n SomeJSON[\"display_unit\"] !== undefined &&\r\n //SomeJSON[\"energy\"] !== undefined &&\r\n //SomeJSON[\"flat\"] !== undefined &&\r\n SomeJSON[\"minMaxAdj\"] !== undefined &&\r\n //SomeJSON[\"parking\"] !== undefined &&\r\n SomeJSON[\"subtotal\"] !== undefined &&\r\n SomeJSON[\"totalAmount\"] !== undefined &&\r\n SomeJSON[\"additional_info\"] !== undefined)\r\n {\r\n\r\n //#region Documentation\r\n\r\n // {\r\n // \"company_name\": \"ChargePoint&#32;EU&#32;QA&#32;EUR\",\r\n // \"display_unit\": 3600,\r\n // \"energy\": [\r\n // {\r\n // \"active_charging\": 0,\r\n // \"duration\": 421,\r\n // \"end_time\": 1543841929,\r\n // \"end_time_utc\": 1543838329,\r\n // \"line_item_cost\": 0,\r\n // \"seq_num\": 1,\r\n // \"start_time\": 1543841508,\r\n // \"start_time_utc\": 1543837908,\r\n // \"type\": \"ENERGY\",\r\n // \"unit_price\": \"0.05000\",\r\n // \"units\": 0.058999999999999997\r\n // },\r\n // {\r\n // \"duration\": 421,\r\n // \"energy_subtotal\": 0,\r\n // \"seq_num\": \"SUBTOTAL\",\r\n // \"type\": \"ENERGY\",\r\n // \"units\": 0.058999999999999997\r\n // }\r\n // ],\r\n // \"flat\": [\r\n // {\r\n // \"flat_fee\": 0,\r\n // \"flat_fee_subtotal\": 0,\r\n // \"numSubSessions\": 1,\r\n // \"type\": \"FLAT\"\r\n // }\r\n // ],\r\n // \"minMaxAdj\": [\r\n // {\r\n // \"session_length\": 0,\r\n // \"session_min\": 0.070000000000000007,\r\n // \"session_min_adjustment\": 0.059999999999999998,\r\n // \"session_total\": 0.01,\r\n // \"type\": \"SESS_MIN_ADJ\"\r\n // }\r\n // ],\r\n // \"parking\": [\r\n // {\r\n // \"duration\": 421,\r\n // \"end_time\": 1543841929,\r\n // \"end_time_utc\": 1543838329,\r\n // \"line_item_cost\": 0.01,\r\n // \"overstay\": 0,\r\n // \"seq_num\": 1,\r\n // \"start_time\": 1543841508,\r\n // \"start_time_utc\": 1543837908,\r\n // \"type\": \"PARKING\",\r\n // \"unit_price\": \"0.10\",\r\n // \"units\": 421\r\n // },\r\n // {\r\n // \"duration\": 421,\r\n // \"parking_subtotal\": 0.01,\r\n // \"seq_num\": \"SUBTOTAL\",\r\n // \"type\": \"PARKING\",\r\n // \"units\": 421\r\n // }\r\n // ],\r\n // \"subtotal\": 0.070000000000000007,\r\n // \"subtotal_before_adjustment\": 0.01,\r\n // \"tax\": [\r\n // {\r\n // \"tax\": 0.01,\r\n // \"taxPercent\": \"19.0000\",\r\n // \"taxRuleName\": \"MwSt.\",\r\n // \"type\": \"TAX\"\r\n // },\r\n // {\r\n // \"seq_num\": \"SUBTOTAL\",\r\n // \"total_tax\": 0.01,\r\n // \"type\": \"TAX\"\r\n // }\r\n // ],\r\n // \"totalAmount\": 0.080000000000000002,\r\n // \"additional_info\": {\r\n // \"outlet\": 2,\r\n // \"session_id\": 2,\r\n // \"station_mac\": \"0024:b100:0002:e300\",\r\n // \"driver_info\": \"urn:nema:5evse:dn:v1:chargepoint.com:cdid:cncp000009afd2\",\r\n // \"meter_serial\": \"240008S\",\r\n // \"currency_code\": \"EUR\",\r\n // \"meter_startreading\": 3078,\r\n // \"meter_endreading\": 3137,\r\n // \"energy_units\": \"Wh\"\r\n // }\r\n // }\r\n\r\n //#endregion\r\n\r\n const additionalInfo = chargyLib.asJSONObject(SomeJSON[\"additional_info\"]);\r\n if (additionalInfo === undefined)\r\n throw new Error(\"Missing or invalid additional information!\");\r\n\r\n const energy = chargyLib.asJSONArray(SomeJSON[\"energy\"]);\r\n const parking = chargyLib.asJSONArray(SomeJSON[\"parking\"]);\r\n\r\n let chargingStart: number | undefined;\r\n let chargingEnd: number | undefined;\r\n\r\n for (const energyItem of energy ?? [])\r\n {\r\n\r\n const energyObj = chargyLib.asJSONObject(energyItem);\r\n const startTimeUTC = chargyLib.asNumber(energyObj?.[\"start_time_utc\"]);\r\n const endTimeUTC = chargyLib.asNumber(energyObj?.[\"end_time_utc\"]);\r\n\r\n if (startTimeUTC !== undefined && (chargingStart === undefined || startTimeUTC < chargingStart))\r\n chargingStart = startTimeUTC;\r\n\r\n if (startTimeUTC !== undefined && (chargingEnd === undefined || startTimeUTC > chargingEnd))\r\n chargingEnd = endTimeUTC;\r\n\r\n }\r\n\r\n let parkingStart: number | undefined;\r\n let parkingEnd: number | undefined;\r\n\r\n for (const parkingItem of parking ?? [])\r\n {\r\n\r\n const parkingObj = chargyLib.asJSONObject(parkingItem);\r\n const startTimeUTC = chargyLib.asNumber(parkingObj?.[\"start_time_utc\"]);\r\n const endTimeUTC = chargyLib.asNumber(parkingObj?.[\"end_time_utc\"]);\r\n\r\n if (startTimeUTC !== undefined && (parkingStart === undefined || startTimeUTC < parkingStart))\r\n parkingStart = startTimeUTC;\r\n\r\n if (startTimeUTC !== undefined && (parkingEnd === undefined || startTimeUTC > parkingEnd))\r\n parkingEnd = endTimeUTC;\r\n\r\n }\r\n\r\n // Sometimes there is \"parking\" but no \"energy\"...\r\n if (chargingStart === undefined)\r\n chargingStart = parkingStart;\r\n\r\n if (chargingEnd === undefined)\r\n chargingEnd = parkingEnd;\r\n\r\n\r\n let sessionStart = (parkingStart !== undefined && (chargingStart === undefined || parkingStart < chargingStart))\r\n ? parkingStart\r\n : chargingStart;\r\n\r\n if (sessionStart === undefined && parkingStart !== undefined)\r\n sessionStart = parkingStart;\r\n\r\n\r\n let sessionEnd = (parkingEnd !== undefined && (chargingEnd === undefined || parkingEnd < chargingEnd))\r\n ? parkingEnd\r\n : chargingEnd;\r\n\r\n if (sessionEnd === undefined && parkingEnd !== undefined)\r\n sessionEnd = parkingEnd;\r\n\r\n\r\n const stationMac = chargyLib.asString(additionalInfo[\"station_mac\"]) ?? \"\";\r\n const outlet = chargyLib.asNumber(additionalInfo[\"outlet\"]) ?? NaN;\r\n const sessionId = chargyLib.asNumber(additionalInfo[\"session_id\"]) ?? NaN;\r\n const driverInfo = chargyLib.asString(additionalInfo[\"driver_info\"]) ?? \"\";\r\n const meterSerial = chargyLib.asString(additionalInfo[\"meter_serial\"]) ?? \"\";\r\n const currencyCode = chargyLib.asString(additionalInfo[\"currency_code\"]) ?? \"\";\r\n const energyUnits = chargyLib.asString(additionalInfo[\"energy_units\"]) ?? \"\";\r\n const evseId = chargyLib.asString(SomeJSON[\"EVSEId\"]) ?? stationMac + \"-\" + String(outlet);\r\n const original = chargyLib.asString(SomeJSON[\"original\"]);\r\n\r\n // The signature is usually a DER encoded string, but might\r\n // already be in the rs-format...\r\n const signature = chargyLib.asString(SomeJSON[\"signature\"])\r\n ?? chargyLib.asJSONObject(SomeJSON[\"signature\"]) as chargyInterfaces.ISignatureRS | undefined;\r\n\r\n const CTR: IChargepointChargeTransparencyRecord = {\r\n\r\n \"@id\": \"chargepoint-\" + stationMac + \"-\" +\r\n String(outlet) + \"-\" +\r\n String(sessionId),\r\n \"@context\": \"https://open.charging.cloud/contexts/CTR+json\",\r\n\r\n \"begin\": this.chargy.moment.unix(sessionStart ?? NaN).utc().format(),\r\n \"end\": this.chargy.moment.unix(sessionEnd ?? NaN).utc().format(),\r\n\r\n // \"description\": {\r\n // \"de\": \"Alle Ladevorgänge\"\r\n // },\r\n\r\n \"contract\": {\r\n \"@id\": driverInfo,\r\n \"type\": \"userId\"\r\n },\r\n\r\n \"chargingStationOperators\": [{\r\n\r\n \"@id\": chargyLib.asString(SomeJSON[\"company_name\"]) ?? \"\",\r\n \"description\": {\r\n \"de\": \"chargepoint - Charging Station Operator Services\"\r\n },\r\n\r\n \"contact\": {\r\n \"email\": \"sales@chargepoint.com\",\r\n \"web\": \"https://www.chargepoint.com\",\r\n \"logoUrl\": \"https://www.chargepoint.com/themes/chargepoint/logo.svg\",\r\n },\r\n\r\n \"support\": {\r\n \"hotline\": \"+49(69) 95307383\",\r\n \"email\": \"support.eu@chargepoint.com\",\r\n \"web\": \"https://chargepoint.charging.cloud/issues\"\r\n },\r\n\r\n \"privacy\": {\r\n \"contact\": \"ChargePoint, Attn: Data Protection Officer, ChargePoint Network (Netherlands) B.V., Hoogoorddreef 56E, 1101BE Amsterdam\",\r\n \"email\": \"privacy.eu@chargepoint.com \",\r\n \"web\": \"https://de.chargepoint.com/privacy_policy\"\r\n },\r\n\r\n \"chargingStations\": [{\r\n \"@id\": stationMac,\r\n // ToDo: The geo location and address are not validated yet!\r\n \"geoLocation\": chargyLib.asJSONObject(SomeJSON[\"geoLocation\"]) as chargyInterfaces.IGeoLocation | undefined,\r\n \"address\": chargyLib.asJSONObject(SomeJSON[\"address\"]) as chargyInterfaces.IAddress | undefined,\r\n \"EVSEs\": [{\r\n \"@id\": evseId,\r\n \"meters\": [{\r\n \"@id\": meterSerial,\r\n \"manufacturer\": \"Carlo Gavazzi\",\r\n \"manufacturerURL\": \"https://www.gavazziautomation.com\",\r\n \"model\": \"EM340-DIN.AV2.3.X.S1.X\",\r\n \"modelURL\": \"https://www.gavazziautomation.com/fileadmin/images/PIM/DATASHEET/ENG/EM340_DS_ENG.pdf\"\r\n // \"signatureFormat\": \"https://open.charging.cloud/contexts/EnergyMeterSignatureFormats/EMHCrypt01\",\r\n // \"publicKeys\": [\r\n // {\r\n // \"algorithm\": \"secp224k1\",\r\n // \"format\": \"DER\",\r\n // \"value\": null\r\n // }\r\n // ]\r\n }]\r\n }]\r\n }],\r\n\r\n \"chargingTariffs\": [{\r\n \"@id\": \"default\",\r\n \"currency\": currencyCode,\r\n \"taxes\": [{\r\n \"@id\": \"MwSt\",\r\n \"percentage\": 19.0,\r\n }]\r\n }],\r\n\r\n \"parkingTariffs\": [{\r\n \"@id\": \"default\",\r\n \"currency\": currencyCode,\r\n \"taxes\": [{\r\n \"@id\": \"MwSt\",\r\n \"percentage\": 19.0,\r\n }]\r\n }]\r\n\r\n }],\r\n\r\n \"chargingSessions\": [{\r\n\r\n \"original\": original,\r\n \"signature\": signature,\r\n\r\n \"@id\": stationMac + \"-\" +\r\n String(outlet) + \"-\" +\r\n String(sessionId),\r\n \"@context\": \"https://open.charging.cloud/contexts/SessionSignatureFormats/ChargePointCrypt01+json\",\r\n \"begin\": this.chargy.moment.unix(sessionStart ?? NaN).utc().format(),\r\n \"end\": this.chargy.moment.unix(sessionEnd ?? NaN).utc().format(),\r\n \"EVSEId\": evseId,\r\n\r\n \"authorizationStart\": {\r\n \"@id\": driverInfo,\r\n \"type\": \"userId\"\r\n },\r\n\r\n \"chargingProductRelevance\": {\r\n \"time\": chargyInterfaces.InformationRelevance.Informative,\r\n \"energy\": chargyInterfaces.InformationRelevance.Important,\r\n \"parking\": chargyInterfaces.InformationRelevance.Informative,\r\n \"sessionFee\": chargyInterfaces.InformationRelevance.Informative,\r\n },\r\n\r\n // \"signatureInfos\": {\r\n // \"hash\": \"SHA512\",\r\n // \"hashTruncation\": \"24\",\r\n // \"algorithm\": \"ECC\",\r\n // \"curve\": \"secp192r1\",\r\n // \"format\": \"rs\"\r\n // },\r\n\r\n \"measurements\": [{\r\n\r\n \"energyMeterId\": meterSerial,\r\n \"@context\": \"https://open.charging.cloud/contexts/EnergyMeterSignatureFormats/ChargePointCrypt01+json\",\r\n \"name\": \"Bezogene Energiemenge\",\r\n \"obis\": \"1-0:1.8.0\",\r\n \"unit\": energyUnits,\r\n // \"unitEncoded\": CTRArray[0][\"measuredValue\"][\"unitEncoded\"],\r\n // \"valueType\": CTRArray[0][\"measuredValue\"][\"valueType\"],\r\n \"scale\": 0,\r\n\r\n // \"signatureInfos\": {\r\n // \"hash\": \"SHA256\",\r\n // // \"hashTruncation\": \"24\",\r\n // \"algorithm\": \"ECDSA\",\r\n // \"curve\": \"secp224k1\",\r\n // \"format\": \"rs\"\r\n // },\r\n\r\n \"values\": [\r\n {\r\n \"timestamp\": this.chargy.moment.unix(chargingStart ?? NaN).utc().format(),\r\n \"value\": new Decimal(chargyLib.asNumber(additionalInfo[\"meter_startreading\"]) ?? NaN),\r\n signatures: []\r\n },\r\n {\r\n \"timestamp\": this.chargy.moment.unix(chargingEnd ?? NaN).utc().format(),\r\n \"value\": new Decimal(chargyLib.asNumber(additionalInfo[\"meter_endreading\"]) ?? NaN),\r\n signatures: []\r\n }\r\n ]\r\n\r\n }]\r\n\r\n }],\r\n\r\n \"certainty\": 1,\r\n \"status\": chargyInterfaces.SessionVerificationResult.Unvalidated\r\n\r\n };\r\n\r\n\r\n if (parking && parking.length > 0 && CTR.chargingSessions)\r\n {\r\n\r\n const chargingSession = CTR.chargingSessions[0];\r\n\r\n if (chargingSession !== undefined)\r\n {\r\n\r\n chargingSession.parking = [];\r\n\r\n for (const parkingItem of parking)\r\n {\r\n\r\n const parkingObj = chargyLib.asJSONObject(parkingItem);\r\n\r\n if (chargyLib.asString(parkingObj?.[\"seq_num\"]) !== \"SUBTOTAL\")\r\n {\r\n chargingSession.parking.push({\r\n \"@id\": \"-\",\r\n begin: this.chargy.moment.unix(chargyLib.asNumber(parkingObj?.[\"start_time_utc\"]) ?? NaN).utc().format(),\r\n end: this.chargy.moment.unix(chargyLib.asNumber(parkingObj?.[\"end_time_utc\"]) ?? NaN).utc().format(),\r\n overstay: chargyLib.asNumber(parkingObj?.[\"overstay\"]) === 1,\r\n });\r\n }\r\n\r\n }\r\n\r\n }\r\n\r\n }\r\n\r\n return CTR;\r\n\r\n }\r\n\r\n //#endregion\r\n\r\n //#region Second CTR format\r\n\r\n if (SomeJSON[\"outlet\"] !== undefined &&\r\n SomeJSON[\"session_id\"] !== undefined &&\r\n SomeJSON[\"station_mac\"] !== undefined &&\r\n SomeJSON[\"driver_info\"] !== undefined &&\r\n SomeJSON[\"meter_serial\"] !== undefined &&\r\n SomeJSON[\"meter_startreading\"] !== undefined &&\r\n SomeJSON[\"meter_endreading\"] !== undefined &&\r\n SomeJSON[\"total_energy\"] !== undefined &&\r\n SomeJSON[\"energy_units\"] !== undefined &&\r\n SomeJSON[\"start_time\"] !== undefined &&\r\n SomeJSON[\"end_time\"] !== undefined) {\r\n\r\n //#region Documentation\r\n\r\n // {\r\n // \"outlet\": 2,\r\n // \"session_id\": 55,\r\n // \"station_mac\": \"0024b1000002e300\",\r\n // \"driver_info\": \"b2dd852e99433cab70ccd45dad5aff55\",\r\n // \"meter_serial\": \"240008S\",\r\n // \"meter_startreading\": 74.6,\r\n // \"meter_endreading\": 86.6,\r\n // \"total_energy\": 12.0,\r\n // \"energy_units\": \"kWh\",\r\n // \"start_time\": 1581763758, // Is this UTC?\r\n // \"end_time\": 1581772802 // Is this UTC?\r\n // }\r\n\r\n\r\n // PEM Public Key: https://report-uri.com/home/pem_decoder\r\n\r\n // Array\r\n // (\r\n // [bits] => 225\r\n // [key] => -----BEGIN PUBLIC KEY-----\r\n // ME4wEAYHKoZIzj0CAQYFK4EEACADOgAEQwudsru6AlnW9u2AG88FPIKkO5yUwC8N\r\n // hKM53UhVJ6faX1c+EdhUdi6qj0quGVs9emjJ1N95S6Y=\r\n // -----END PUBLIC KEY-----\r\n // [ec] => Array (\r\n // [curve_name] => secp224k1\r\n // [curve_oid] => 1.3.132.0.32\r\n // [x] => 430b9db2bbba0259d6f6ed801bcf053c82a43b9c94c02f0d84a339dd\r\n // [y] => 485527a7da5f573e11d854762eaa8f4aae195b3d7a68c9d4df794ba6\r\n // )\r\n // [type] => 3\r\n // )\r\n\r\n //#endregion\r\n\r\n const stationMac = chargyLib.asString(SomeJSON[\"station_mac\"]) ?? \"\";\r\n const outlet = chargyLib.asNumber(SomeJSON[\"outlet\"]) ?? NaN;\r\n const sessionId = chargyLib.asNumber(SomeJSON[\"session_id\"]) ?? NaN;\r\n const driverInfo = chargyLib.asString(SomeJSON[\"driver_info\"]) ?? \"\";\r\n const meterSerial = chargyLib.asString(SomeJSON[\"meter_serial\"]) ?? \"\";\r\n const energyUnits = chargyLib.asString(SomeJSON[\"energy_units\"]) ?? \"\";\r\n const startTime = chargyLib.asNumber(SomeJSON[\"start_time\"]) ?? NaN;\r\n const endTime = chargyLib.asNumber(SomeJSON[\"end_time\"]) ?? NaN;\r\n const evseId = chargyLib.asString(SomeJSON[\"EVSEId\"]) ?? (stationMac + \"-\" + String(outlet));\r\n const original = chargyLib.asString(SomeJSON[\"original\"]);\r\n\r\n // The signature is usually a DER encoded string, but might\r\n // already be in the rs-format...\r\n const signature = chargyLib.asString(SomeJSON[\"signature\"])\r\n ?? chargyLib.asJSONObject(SomeJSON[\"signature\"]) as chargyInterfaces.ISignatureRS | undefined;\r\n\r\n const CTR: IChargepointChargeTransparencyRecord = {\r\n\r\n \"@id\": \"chargepoint-\" + stationMac + \"-\" +\r\n String(outlet) + \"-\" +\r\n String(sessionId),\r\n \"@context\": \"https://open.charging.cloud/contexts/CTR+json\",\r\n\r\n \"begin\": this.chargy.moment.unix(startTime).utc().format(),\r\n \"end\": this.chargy.moment.unix(endTime).utc().format(),\r\n\r\n // \"description\": {\r\n // \"de\": \"Alle Ladevorgänge\"\r\n // },\r\n\r\n \"contract\": {\r\n \"@id\": driverInfo,\r\n \"type\": \"userId\"\r\n },\r\n\r\n \"chargingStationOperators\": [{\r\n\r\n \"@id\": \"chargepoint\",\r\n \"description\": {\r\n \"de\": \"chargepoint - Charging Station Operator Services\"\r\n },\r\n\r\n \"contact\": {\r\n \"email\": \"sales@chargepoint.com\",\r\n \"web\": \"https://www.chargepoint.com\",\r\n \"logoUrl\": \"https://www.chargepoint.com/themes/chargepoint/logo.svg\",\r\n },\r\n\r\n \"support\": {\r\n \"hotline\": \"+49(69) 95307383\",\r\n \"email\": \"support.eu@chargepoint.com\",\r\n \"web\": \"https://chargepoint.charging.cloud/issues\"\r\n },\r\n\r\n \"privacy\": {\r\n \"contact\": \"chargepoint, Attn: Data Protection Officer, ChargePoint Network (Netherlands) B.V., Hoogoorddreef 56E, 1101BE Amsterdam\",\r\n \"email\": \"privacy.eu@chargepoint.com \",\r\n \"web\": \"https://de.chargepoint.com/privacy_policy\"\r\n },\r\n\r\n \"chargingStations\": [{\r\n \"@id\": stationMac,\r\n // ToDo: The geo location and address are not validated yet!\r\n \"geoLocation\": chargyLib.asJSONObject(SomeJSON[\"geoLocation\"]) as chargyInterfaces.IGeoLocation | undefined,\r\n \"address\": chargyLib.asJSONObject(SomeJSON[\"address\"]) as chargyInterfaces.IAddress | undefined,\r\n \"EVSEs\": [{\r\n \"@id\": evseId,\r\n \"meters\": [{\r\n \"@id\": meterSerial,\r\n \"manufacturer\": \"Carlo Gavazzi\",\r\n \"manufacturerURL\": \"https://www.gavazziautomation.com\",\r\n \"model\": \"EM340-DIN.AV2.3.X.S1.X\",\r\n \"modelURL\": \"https://www.gavazziautomation.com/fileadmin/images/PIM/DATASHEET/ENG/EM340_DS_ENG.pdf\",\r\n \"signatureFormat\": \"https://open.charging.cloud/contexts/EnergyMeterSignatureFormats/EMHCrypt01\",\r\n \"signatureInfos\": {\r\n \"hash\": \"SHA256\",\r\n \"hashTruncation\": 24,\r\n \"algorithm\": \"ECDSA\",\r\n \"curve\": \"secp224k1\",\r\n \"format\": \"rs\"\r\n },\r\n \"publicKeys\": [{\r\n \"algorithm\": \"secp224k1\",\r\n \"format\": \"DER\",\r\n \"encoding\": \"hex\"\r\n }]\r\n }]\r\n }]\r\n }]\r\n\r\n }],\r\n\r\n \"chargingSessions\": [{\r\n\r\n \"original\": original,\r\n \"signature\": signature,\r\n\r\n \"@id\": stationMac + \"-\" +\r\n String(outlet) + \"-\" +\r\n String(sessionId),\r\n \"@context\": \"https://open.charging.cloud/contexts/SessionSignatureFormats/ChargePointCrypt01+json\",\r\n \"begin\": this.chargy.moment.unix(startTime).utc().format(),\r\n \"end\": this.chargy.moment.unix(endTime).utc().format(),\r\n \"EVSEId\": evseId,\r\n\r\n \"authorizationStart\": {\r\n \"@id\": driverInfo,\r\n \"type\": \"userId\"\r\n },\r\n\r\n \"chargingProductRelevance\": {\r\n \"time\": chargyInterfaces.InformationRelevance.Informative,\r\n \"energy\": chargyInterfaces.InformationRelevance.Important,\r\n \"parking\": chargyInterfaces.InformationRelevance.Informative,\r\n \"sessionFee\": chargyInterfaces.InformationRelevance.Informative,\r\n },\r\n\r\n \"measurements\": [{\r\n\r\n \"energyMeterId\": meterSerial,\r\n \"@context\": \"https://open.charging.cloud/contexts/EnergyMeterSignatureFormats/ChargePointCrypt01+json\",\r\n \"name\": \"Bezogene Energiemenge\",\r\n \"obis\": \"1-0:1.8.0\",\r\n \"unit\": energyUnits,\r\n \"scale\": 0,\r\n\r\n \"values\": [\r\n {\r\n \"timestamp\": this.chargy.moment.unix(startTime).utc().format(),\r\n \"value\": new Decimal(chargyLib.asNumber(SomeJSON[\"meter_startreading\"]) ?? NaN),\r\n \"signatures\": []\r\n },\r\n {\r\n \"timestamp\": this.chargy.moment.unix(endTime).utc().format(),\r\n \"value\": new Decimal(chargyLib.asNumber(SomeJSON[\"meter_endreading\"]) ?? NaN),\r\n \"signatures\": []\r\n }\r\n ]\r\n\r\n }]\r\n\r\n }],\r\n\r\n \"certainty\": 1,\r\n \"status\": chargyInterfaces.SessionVerificationResult.Unvalidated\r\n\r\n };\r\n\r\n return CTR;\r\n\r\n }\r\n\r\n //#endregion\r\n\r\n }\r\n catch (exception)\r\n {\r\n return {\r\n status: chargyInterfaces.SessionVerificationResult.InvalidSessionFormat,\r\n message: \"Exception occured: \" + (exception instanceof Error ? exception.message : String(exception)),\r\n certainty: 0\r\n }\r\n }\r\n\r\n return {\r\n status: chargyInterfaces.SessionVerificationResult.InvalidSessionFormat,\r\n message: this.chargy.GetLocalizedMessage(\"UnknownOrInvalidChargingSessionFormat\"),\r\n certainty: 0\r\n }\r\n\r\n }\r\n\r\n //#endregion\r\n\r\n}\r\n\r\n\r\nexport interface IChargepointMeasurementValue extends chargeTransparencyRecord.IMeasurementValue\r\n{\r\n statusMeter: string,\r\n secondsIndex: number,\r\n paginationId: string,\r\n logBookIndex: string\r\n}\r\n\r\nexport interface IChargePointCrypt01Result extends chargyInterfaces.ICryptoResult\r\n{\r\n sha256value?: string,\r\n meterId?: string,\r\n meter?: chargyInterfaces.IMeter,\r\n timestamp?: string,\r\n infoStatus?: string,\r\n secondsIndex?: string,\r\n paginationId?: string,\r\n obis?: string,\r\n unitEncoded?: string,\r\n scale?: string,\r\n value?: string,\r\n logBookIndex?: string,\r\n authorizationStart?: string,\r\n authorizationStop?: string,\r\n authorizationStartTimestamp?: string,\r\n publicKey?: string,\r\n publicKeyFormat?: string,\r\n publicKeySignatures?: Array<unknown>,\r\n signature?: chargyInterfaces.ISignatureRS\r\n}\r\n\r\n\r\nexport class ChargePointCrypt01 extends ACrypt {\r\n\r\n // For older chargepoint charging station firmwares\r\n // Koblitz 224-bit curve: secp224k1\r\n // https://www.secg.org/sec2-v2.pdf\r\n\r\n // For newer chargepoint charging station firmwares\r\n // NIST/ANSI X9.62 named 256-bit elliptic curve: secp256r1\r\n // https://www.secg.org/sec2-v2.pdf\r\n\r\n constructor(chargy: Chargy) {\r\n super(\"ECC secp224k1/secp256r1\",\r\n chargy);\r\n }\r\n\r\n\r\n async VerifyChargingSession(chargingSession: chargeTransparencyRecord.IChargingSession): Promise<chargyInterfaces.ISessionCryptoResult>\r\n {\r\n\r\n if (chargingSession.ctr === undefined)\r\n {\r\n return {\r\n status: chargyInterfaces.SessionVerificationResult.InvalidSignature,\r\n message: this.chargy.GetLocalizedMessage(\"InvalidSignature\"),\r\n certainty: 0\r\n }\r\n }\r\n\r\n try\r\n {\r\n\r\n let sessionResult = chargyInterfaces.SessionVerificationResult.UnknownSessionFormat;\r\n const plainText = chargingSession.original != null ? atob(chargingSession.original) : \"\";\r\n\r\n //#region Convert signature into rs-format...\r\n\r\n if (chargingSession.signature != null &&\r\n chargingSession.signature !== \"\" &&\r\n typeof(chargingSession.signature) === 'string')\r\n {\r\n\r\n const ASN1_SignatureSchema = this.chargy.asn1.define('Signature', function() {\r\n this.seq().obj(\r\n this.key('r').int(),\r\n this.key('s').int()\r\n );\r\n });\r\n\r\n const ASN1Signature = ASN1_SignatureSchema.decode<{ r: { toString(base: number): string }, s: { toString(base: number): string } }>(Buffer.from(chargingSession.signature, 'hex'), 'der');\r\n\r\n chargingSession.signature = { r: ASN1Signature.r.toString(16),\r\n s: ASN1Signature.s.toString(16) };\r\n\r\n }\r\n\r\n //#endregion\r\n\r\n //#region Find public key, or use all available public keys\r\n\r\n const publicKeyId = chargingSession.EVSEId.replace(/:/g, \"\").replace(/-/g, \"_\");\r\n const publicKeys = [];\r\n\r\n if (chargingSession.ctr.publicKeys != null)\r\n {\r\n\r\n for (const publicKeyInfo of chargingSession.ctr.publicKeys)\r\n {\r\n if (publicKeyInfo[\"@id\"] === publicKeyId)\r\n publicKeys.push(publicKeyInfo);\r\n }\r\n\r\n if (publicKeys.length == 0)\r\n {\r\n for (const publicKeyInfo of chargingSession.ctr.publicKeys)\r\n {\r\n publicKeys.push(publicKeyInfo);\r\n }\r\n }\r\n\r\n }\r\n\r\n if (publicKeys.length == 0)\r\n return {\r\n status: chargyInterfaces.SessionVerificationResult.PublicKeyNotFound,\r\n message: this.chargy.GetLocalizedMessage(\"Public key notFound\"),\r\n certainty: 0\r\n }\r\n\r\n //#endregion\r\n\r\n //#region Validate session\r\n\r\n if (plainText !== \"\" &&\r\n chargingSession.signature != null &&\r\n chargingSession.signature !== \"\")\r\n {\r\n\r\n let sha225Value: string|null = null;\r\n let sha256Value: string|null = null;\r\n let sha385Value: string|null = null;\r\n let sha512Value: string|null = null;\r\n\r\n for (const publicKey of publicKeys)\r\n {\r\n\r\n const algorithm = (typeof publicKey.algorithm === \"object\")\r\n ? publicKey.algorithm.name\r\n : publicKey.algorithm;\r\n\r\n switch (algorithm)\r\n {\r\n\r\n case \"secp224k1\":\r\n\r\n sha225Value = sha225Value ?? (BigInt(\"0x\" + (await chargyLib.sha256(plainText))) >> BigInt(31)).toString(16);\r\n sessionResult = this.curve224k1.validate(BigInt(\"0x\" + sha225Value),\r\n BigInt(\"0x\" + (chargingSession.signature.r ?? \"00\")),\r\n BigInt(\"0x\" + (chargingSession.signature.s ?? \"00\")),\r\n [ BigInt(\"0x\" + publicKey.value.slice( 2, 58)),\r\n BigInt(\"0x\" + publicKey.value.slice(58, 114)) ])\r\n ? chargyInterfaces.SessionVerificationResult.ValidSignature\r\n : chargyInterfaces.SessionVerificationResult.InvalidSignature;\r\n break;\r\n\r\n case \"secp256r1\":\r\n sha256Value = sha256Value ?? await chargyLib.sha256(plainText);\r\n sessionResult = this.curve256r1.keyFromPublic(publicKey.value, 'hex').\r\n verify (sha256Value,\r\n chargingSession.signature)\r\n ? chargyInterfaces.SessionVerificationResult.ValidSignature\r\n : chargyInterfaces.SessionVerificationResult.InvalidSignature;\r\n break;\r\n\r\n case \"secp384r1\":\r\n sha385Value = sha385Value ?? await chargyLib.sha384(plainText);\r\n sessionResult = this.curve384r1.keyFromPublic(publicKey.value, 'hex').\r\n verify (sha385Value,\r\n chargingSession.signature)\r\n ? chargyInterfaces.SessionVerificationResult.ValidSignature\r\n : chargyInterfaces.SessionVerificationResult.InvalidSignature;\r\n break;\r\n\r\n case \"secp521r1\":\r\n sha512Value = sha512Value ?? await chargyLib.sha512(plainText);\r\n sessionResult = this.curve521r1.keyFromPublic(publicKey.value, 'hex').\r\n verify (sha512Value,\r\n chargingSession.signature)\r\n ? chargyInterfaces.SessionVerificationResult.ValidSignature\r\n : chargyInterfaces.SessionVerificationResult.InvalidSignature;\r\n break;\r\n\r\n }\r\n\r\n if (sessionResult == chargyInterfaces.SessionVerificationResult.ValidSignature)\r\n {\r\n\r\n chargingSession.publicKey = publicKey;\r\n\r\n switch (algorithm)\r\n {\r\n\r\n case \"secp224k1\":\r\n chargingSession.hashValue = sha225Value ?? \"\";\r\n break;\r\n\r\n case \"secp256r1\":\r\n chargingSession.hashValue = sha256Value ?? \"\";\r\n break;\r\n\r\n case \"secp384r1\":\r\n chargingSession.hashValue = sha385Value ?? \"\";\r\n break;\r\n\r\n case \"secp521r1\":\r\n chargingSession.hashValue = sha512Value ?? \"\";\r\n break;\r\n\r\n }\r\n\r\n }\r\n\r\n }\r\n\r\n }\r\n\r\n //#endregion\r\n\r\n //#region Validate measurements\r\n\r\n for (const measurement of chargingSession.measurements)\r\n {\r\n\r\n measurement.chargingSession = chargingSession;\r\n\r\n // Must include at least two measurements (start & stop)\r\n if (measurement.values.length > 1)\r\n {\r\n\r\n //#region Validate measurements...\r\n\r\n for (const measurementValue of measurement.values)\r\n {\r\n measurementValue.measurement = measurement;\r\n await this.VerifyMeasurement(measurementValue as IChargepointMeasurementValue);\r\n }\r\n\r\n //#endregion\r\n\r\n //#region Find an overall result...\r\n\r\n for (const measurementValue of measurement.values)\r\n {\r\n if (measurementValue.result?.status !== chargyInterfaces.VerificationResult.ValidSignature &&\r\n measurementValue.result?.status !== chargyInterfaces.VerificationResult.NoOperation)\r\n {\r\n return {\r\n status: chargyInterfaces.SessionVerificationResult.InvalidSignature,\r\n message: this.chargy.GetLocalizedMessage(\"InvalidSignature\"),\r\n certainty: 0\r\n }\r\n }\r\n }\r\n\r\n //#endregion\r\n\r\n for (let i = 0; i < measurement.values.length; i++)\r\n {\r\n\r\n const currentResult = measurement.values[i]?.result;\r\n\r\n if (currentResult !== undefined) {\r\n\r\n //#region Adapt start value\r\n\r\n if (i == 0)\r\n {\r\n switch (currentResult.status)\r\n {\r\n\r\n case chargyInterfaces.VerificationResult.ValidSignature:\r\n currentResult.status = chargyInterfaces.VerificationResult.ValidStartValue;\r\n break;\r\n\r\n case chargyInterfaces.VerificationResult.NoOperation:\r\n currentResult.status = chargyInterfaces.VerificationResult.StartValue;\r\n break;\r\n\r\n case chargyInterfaces.VerificationResult.InvalidSignature:\r\n currentResult.status = chargyInterfaces.VerificationResult.InvalidStartValue;\r\n break;\r\n\r\n }\r\n }\r\n\r\n //#endregion\r\n\r\n //#region Adapt stop value\r\n\r\n else if (i == measurement.values.length-1)\r\n {\r\n switch (currentResult.status)\r\n {\r\n\r\n case chargyInterfaces.VerificationResult.ValidSignature:\r\n currentResult.status = chargyInterfaces.VerificationResult.ValidStopValue;\r\n break;\r\n\r\n case chargyInterfaces.VerificationResult.NoOperation:\r\n currentResult.status = chargyInterfaces.VerificationResult.StopValue;\r\n break;\r\n\r\n case chargyInterfaces.VerificationResult.InvalidSignature:\r\n currentResult.status = chargyInterfaces.VerificationResult.InvalidStopValue;\r\n break;\r\n\r\n }\r\n }\r\n\r\n //#endregion\r\n\r\n //#region Adapt intermediate values\r\n\r\n else\r\n {\r\n switch (currentResult.status)\r\n {\r\n\r\n case chargyInterfaces.VerificationResult.ValidSignature:\r\n currentResult.status = chargyInterfaces.VerificationResult.ValidIntermediateValue;\r\n break;\r\n\r\n case chargyInterfaces.VerificationResult.NoOperation:\r\n currentResult.status = chargyInterfaces.VerificationResult.IntermediateValue;\r\n break;\r\n\r\n case chargyInterfaces.VerificationResult.InvalidSignature:\r\n currentResult.status = chargyInterfaces.VerificationResult.InvalidStopValue;\r\n break;\r\n\r\n }\r\n\r\n }\r\n\r\n //#endregion\r\n\r\n }\r\n\r\n }\r\n\r\n }\r\n else\r\n sessionResult = chargyInterfaces.SessionVerificationResult.AtLeastTwoMeasurementsRequired;\r\n\r\n }\r\n\r\n //#endregion\r\n\r\n return {\r\n status: sessionResult,\r\n certainty: .5\r\n }\r\n\r\n }\r\n catch (exception)\r\n {\r\n return {\r\n status: chargyInterfaces.SessionVerificationResult.InvalidSignature,\r\n message: \"Exception occured: \" + (exception instanceof Error ? exception.message : String(exception)),\r\n certainty: 0\r\n }\r\n }\r\n\r\n }\r\n\r\n async VerifyMeasurement(measurementValue: IChargepointMeasurementValue): Promise<IChargePointCrypt01Result>\r\n {\r\n\r\n // Note: chargepoint does not sign individual measurements!\r\n\r\n function setResult(verificationResult: chargyInterfaces.VerificationResult)\r\n {\r\n cryptoResult.status = verificationResult;\r\n measurementValue.result = cryptoResult;\r\n return cryptoResult;\r\n }\r\n\r\n measurementValue.method = this;\r\n\r\n const cryptoResult:IChargePointCrypt01Result = {\r\n status: chargyInterfaces.VerificationResult.NoOperation,\r\n };\r\n\r\n return await Promise.resolve(setResult(chargyInterfaces.VerificationResult.NoOperation));\r\n\r\n }\r\n\r\n async ViewMeasurement(measurementValue: IChargepointMeasurementValue,\r\n errorDiv: HTMLDivElement,\r\n introDiv: HTMLDivElement,\r\n infoDiv: HTMLDivElement,\r\n PlainTextDiv: HTMLDivElement,\r\n HashedPlainTextDiv: HTMLDivElement,\r\n PublicKeyDiv: HTMLDivElement,\r\n SignatureExpectedDiv: HTMLDivElement,\r\n SignatureCheckDiv: HTMLDivElement) : Promise<Error | undefined>\r\n\r\n {\r\n\r\n if (measurementValue.measurement?.chargingSession === undefined)\r\n return new Error(\"Invalid measurement!\");\r\n\r\n\r\n const chargingSession = measurementValue.measurement.chargingSession;\r\n const result = measurementValue.result as IChargePointCrypt01Result;\r\n const algorithmName = (typeof chargingSession.publicKey?.algorithm === \"object\")\r\n ? chargingSession.publicKey.algorithm.name \r\n : chargingSession.publicKey?.algorithm ?? \"\";\r\n const algorithmType = (typeof chargingSession.publicKey?.type === \"object\")\r\n ? chargingSession.publicKey.type.name\r\n : chargingSession.publicKey?.type;\r\n\r\n //#region Headline / Introduction\r\n\r\n introDiv.innerHTML = this.chargy.GetLocalizedMessage(\"The following data of the charging session is relevant for metrological and legal metrological purposes and therefore part of the digital signature\").\r\n replace(\"{methodName}\", \"ChargePointCrypt01\").\r\n replace(\"{cryptoAlgorithm}\", algorithmName);\r\n\r\n //#endregion\r\n\r\n\r\n //#region Plain text\r\n\r\n if (PlainTextDiv.parentElement != undefined &&\r\n PlainTextDiv.parentElement.children[0] != undefined)\r\n {\r\n PlainTextDiv.parentElement.children[0].innerHTML = \"Plain text (secrrct)\";\r\n }\r\n\r\n PlainTextDiv.innerText = atob(chargingSession.original ?? \"\");\r\n\r\n PlainTextDiv.style.fontFamily = \"monospace\";\r\n PlainTextDiv.style.whiteSpace = \"pre\";\r\n PlainTextDiv.style.maxHeight = \"25vh\";\r\n PlainTextDiv.style.overflowY = \"scroll\";\r\n\r\n //#endregion\r\n\r\n //#region Hashed plain text\r\n\r\n let hashInfo = \"\";\r\n\r\n switch (algorithmName)\r\n {\r\n\r\n case \"secp224k1\":\r\n hashInfo = \"(SHA256, 225 Bits, hex)\";\r\n break;\r\n\r\n case \"secp256r1\":\r\n hashInfo = \"(SHA256, 256 Bits, hex)\";\r\n break;\r\n\r\n case \"secp384r1\":\r\n hashInfo = \"(SHA384, 384 Bits, hex)\";\r\n break;\r\n\r\n case \"secp512r1\":\r\n hashInfo = \"(SHA512, 512 Bits, hex)\";\r\n break;\r\n\r\n }\r\n\r\n if (HashedPlainTextDiv.parentElement != undefined &&\r\n HashedPlainTextDiv.parentElement.children[0] != undefined)\r\n {\r\n HashedPlainTextDiv.parentElement.children[0].innerHTML = \"Hashed plain text \" + hashInfo;\r\n }\r\n\r\n HashedPlainTextDiv.innerHTML = chargingSession.hashValue?.match(/.{1,8}/g)?.join(\" \")\r\n ?? \"0x00000000000000000000000000000000000\";\r\n\r\n //#endregion\r\n\r\n //#region Public Key\r\n\r\n if (chargingSession.publicKey != null)\r\n {\r\n\r\n if (PublicKeyDiv.parentElement != undefined &&\r\n PublicKeyDiv.parentElement.children[0] != undefined)\r\n {\r\n PublicKeyDiv.parentElement.children[0].innerHTML = \"Public Key (\" +\r\n (algorithmType\r\n ? algorithmType + \", \"\r\n : \"\") +\r\n (algorithmName\r\n ? algorithmName + \", \"\r\n : \"\") +\r\n \"hex)\";\r\n }\r\n\r\n PublicKeyDiv.innerHTML = chargingSession.publicKey.value.startsWith(\"04\") // Add some space after '04' to avoid confused customers\r\n ? \"<span class=\\\"leadingFour\\\">04</span> \"\r\n + (chargingSession.publicKey.value.substring(2).match(/.{1,8}/g)?.join(\" \") ?? \"\")\r\n : (chargingSession.publicKey.value. match(/.{1,8}/g)?.join(\" \") ?? \"\");\r\n\r\n\r\n //#region Public key signatures\r\n\r\n if (PublicKeyDiv.parentElement != undefined &&\r\n PublicKeyDiv.parentElement.children[3] != undefined)\r\n {\r\n PublicKeyDiv.parentElement.children[3].innerHTML = \"\";\r\n }\r\n\r\n if (result.publicKeySignatures) {\r\n\r\n for (const signature of result.publicKeySignatures)\r\n {\r\n\r\n try\r\n {\r\n\r\n const signatureDiv = PublicKeyDiv.parentElement?.children[3]?.appendChild(document.createElement('div'));\r\n\r\n if (signatureDiv != null)\r\n signatureDiv.innerHTML = await this.chargy.CheckMeterPublicKeySignature(measurementValue.measurement.chargingSession.chargingStation,\r\n measurementValue.measurement.chargingSession.EVSE,\r\n measurementValue.measurement.chargingSession.EVSE?.meters[0],\r\n measurementValue.measurement.chargingSession.EVSE?.meters[0]?.publicKeys?.[0],\r\n signature);\r\n\r\n }\r\n catch\r\n {\r\n // Optional public key signature metadata is displayed only when available.\r\n }\r\n\r\n }\r\n\r\n }\r\n\r\n //#endregion\r\n\r\n }\r\n\r\n //#endregion\r\n\r\n //#region Signature expected\r\n\r\n if (chargingSession.signature != null)\r\n {\r\n\r\n if (SignatureExpectedDiv.parentElement != undefined &&\r\n SignatureExpectedDiv.parentElement.children[0] != undefined)\r\n {\r\n SignatureExpectedDiv.parentElement.children[0].innerHTML = \"Erwartete Signatur (secrrct.sign, rs, hex)\";// \" + (result.signature?.format ?? \"\") + \", hex)\";\r\n }\r\n\r\n if (typeof chargingSession.signature != 'string')\r\n SignatureExpectedDiv.innerHTML = \"r: \" + (chargingSession.signature.r?.toLowerCase().padStart(56, '0').match(/.{1,8}/g)?.join(\" \") ?? \"\") + \"<br />\" +\r\n \"s: \" + (chargingSession.signature.s?.toLowerCase().padStart(56, '0').match(/.{1,8}/g)?.join(\" \") ?? \"\");\r\n\r\n else if (chargingSession.signature)\r\n SignatureExpectedDiv.innerHTML = chargingSession.signature.toLowerCase().match(/.{1,8}/g)?.join(\" \") ?? \"-\";\r\n\r\n }\r\n\r\n //#endregion\r\n\r\n\r\n //#region Signature check\r\n\r\n if (chargingSession.verificationResult != null)\r\n {\r\n switch (chargingSession.verificationResult.status)\r\n {\r\n\r\n // case SessionVerificationResult.UnknownCTRFormat:\r\n // signatureCheckValue.innerHTML = '<i class=\"fas fa-times-circle\"></i><div id=\"description\">Unbekanntes Transparenzdatenformat</div>';\r\n // break;\r\n\r\n // case SessionVerificationResult.EnergyMeterNotFound:\r\n // signatureCheckValue.innerHTML = '<i class=\"fas fa-times-circle\"></i><div id=\"description\">Ungültiger Energiezähler</div>';\r\n // break;\r\n\r\n case chargyInterfaces.SessionVerificationResult.PublicKeyNotFound:\r\n SignatureCheckDiv.innerHTML = '<i class=\"fas fa-times-circle\"></i><div id=\"description\">Ungültiger Public Key</div>';\r\n break;\r\n\r\n case chargyInterfaces.SessionVerificationResult.InvalidPublicKey:\r\n SignatureCheckDiv.innerHTML = '<i class=\"fas fa-times-circle\"></i><div id=\"description\">Ungültiger Public Key</div>';\r\n break;\r\n\r\n case chargyInterfaces.SessionVerificationResult.InvalidSignature:\r\n SignatureCheckDiv.innerHTML = '<i class=\"fas fa-times-circle\"></i><div id=\"description\">Ungültige Signatur</div>';\r\n break;\r\n\r\n case chargyInterfaces.SessionVerificationResult.ValidSignature:\r\n SignatureCheckDiv.innerHTML = '<i class=\"fas fa-check-circle\"></i><div id=\"description\">Gültige Signatur</div>';\r\n break;\r\n\r\n\r\n default:\r\n SignatureCheckDiv.innerHTML = '<i class=\"fas fa-times-circle\"></i><div id=\"description\">Ungültige Signatur</div>';\r\n break;\r\n\r\n }\r\n }\r\n\r\n //#endregion\r\n\r\n }\r\n\r\n}\r\n","/*\n * Copyright (c) 2018-2026 GraphDefined GmbH <achim.friedland@graphdefined.com>\n * This file is part of Chargy WebApp <https://github.com/OpenChargingCloud/ChargyWebApp>\n *\n * Licensed under the Affero GPL license, Version 3.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.gnu.org/licenses/agpl.html\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Decimal from 'decimal.js';\nimport { ACrypt } from '../ACrypt'\nimport type { ISignatureRS } from './chargyInterfaces';\nimport * as chargyInterfaces from './chargyInterfaces'\nimport * as chargyLib from '../chargyLib'\nimport * as chargeTransparencyLiveLink from './IChargeTransparencyLiveLink'\nimport * as publicKeyInfo from './IPublicKeyInfo';\n\n\nexport function IsAChargeTransparencyRecord(data: unknown): data is IChargeTransparencyRecord\n{\n\n if (!chargyLib.isMandatoryJSONObject(data))\n return false;\n\n const chargeTransparencyRecord = data as IChargeTransparencyRecord;\n\n return chargeTransparencyRecord.begin !== undefined &&\n //chargeTransparencyRecord.end !== undefined &&\n chargeTransparencyRecord.chargingSessions !== undefined;\n\n}\n\n\nexport interface IChargeTransparencyRecord extends chargyLib.JSONObject\n{\n\n \"@id\": string;\n \"@context\": string | Array<string>;\n begin?: string;\n end?: string;\n description?: chargyInterfaces.IMultilanguageText;\n contract?: chargyInterfaces.IContract;\n chargingStationOperators?: Array<chargyInterfaces.IChargingStationOperator>;\n chargingPools?: Array<chargyInterfaces.IChargingPool>;\n chargingStations?: Array<chargyInterfaces.IChargingStation>;\n chargingTariffs?: Array<chargyInterfaces.IChargingTariff>;\n publicKeys?: Array<publicKeyInfo. IPublicKeyInfo>;\n chargingSessions?: Array<IChargingSession>;\n eMobilityProviders?: Array<chargyInterfaces.IEMobilityProvider>;\n mediationServices?: Array<chargyInterfaces.IMediationService>;\n verificationResult?: chargyInterfaces.ISessionCryptoResult;\n invalidDataSets?: Array<IExtendedFileInfo>;\n\n // How sure we are that this result is correct!\n // (JSON) transparency records might not always include an unambiguously\n // format identifier. So multiple chargy parsers might be candidates, but\n // hopefully one will be the best matching parser.\n certainty: number;\n\n warnings?: Array<string>;\n errors?: Array<string>;\n status?: chargyInterfaces.SessionVerificationResult;\n\n}\n\n\n\n\n\n\nexport function IsASessionCryptoResult(data: unknown): data is chargyInterfaces.ISessionCryptoResult\n{\n\n if (!chargyLib.isMandatoryJSONObject(data))\n return false;\n\n const sessionCryptoResult = data as chargyInterfaces.ISessionCryptoResult;\n\n return sessionCryptoResult.status !== undefined;\n\n}\n\n\n\n\nexport interface IChargingSession\n{\n \"@id\": string;\n \"@context\"?: string;\n ctr?: IChargeTransparencyRecord;\n GUI?: HTMLDivElement;\n begin: string;\n end?: string; // to allow still running sessions!\n internalSessionId?: string;\n chargingProductRelevance?: chargyInterfaces.IChargingProductRelevance,\n description?: chargyInterfaces.IMultilanguageText;\n chargingStationOperatorId?: string;\n chargingStationOperator?: chargyInterfaces.IChargingStationOperator;\n chargingPoolId?: string;\n chargingPool?: chargyInterfaces.IChargingPool;\n chargingStationId?: string;\n chargingStation?: chargyInterfaces.IChargingStation;\n EVSEId: string;\n EVSE?: chargyInterfaces.IEVSE;\n meterId?: string;\n meter?: chargyInterfaces.IMeter;\n publicKey?: publicKeyInfo.IPublicKeyInfo;\n tariffId?: string;\n chargingTariffs?: Array<chargyInterfaces.IChargingTariff>;\n chargingPeriods?: Array<chargyInterfaces.IChargingPeriod>;\n totalCosts?: chargyInterfaces.IChargingCosts;\n authorizationStart: chargyInterfaces.IAuthorization;\n authorizationStop?: chargyInterfaces.IAuthorization;\n product?: chargyInterfaces.IChargingProduct;\n measurements: Array<IMeasurement>;\n parking?: Array<chargyInterfaces.IParking>;\n transparencyInfos?: chargyInterfaces.ITransparencyInfos;\n method?: ACrypt;\n original?: string;\n signature?: string|chargyInterfaces.ISignatureRS;\n hashValue?: string;\n verificationResult?: chargyInterfaces.ISessionCryptoResult;\n}\n\n\nexport interface IMeasurement\n{\n \"@context\"?: string;\n chargingSession?: IChargingSession;\n energyMeterId: string;\n phenomena?: any[];\n name: string;\n obis: string;\n unit?: string;\n unitEncoded?: number;\n valueType?: string;\n scale: number;\n verifyChain?: boolean;\n signatureInfos?: chargyInterfaces.ISignatureInfos;\n values: Array<IMeasurementValue>;\n verificationResult?: chargyInterfaces.ICryptoResult;\n}\n\nexport interface IMeasurements\n{\n \"@context\"?: string;\n values: Array<IMeasurement>;\n verificationResult?: chargyInterfaces.ICryptoResult;\n}\n\nexport interface IMeasurementValue\n{\n\n measurement?: IMeasurement;\n method?: ACrypt;\n previousValue?: IMeasurementValue;\n\n timestamp: string;\n value: Decimal;\n value_displayPrefix?: chargyInterfaces.DisplayPrefixes;\n value_displayPrecision?: number;\n statusMeter?: string;\n secondsIndex?: number;\n paginationId?: number | string;\n logBookIndex?: string;\n statusAdapter?: string;\n\n errors?: Array<string>;\n warnings?: Array<string>;\n\n signatures?: Array<chargyInterfaces.ISignature|ISignatureRS>;\n result?: chargyInterfaces.ICryptoResult;\n\n}\n\nexport interface IExtendedFileInfo extends chargyInterfaces.IFileInfo {\n\n result: IChargeTransparencyRecord |\n chargeTransparencyLiveLink.IChargeTransparencyLiveLink |\n publicKeyInfo.IPublicKeyInfo |\n publicKeyInfo.IPublicKeyLookup |\n chargyInterfaces.ISessionCryptoResult\n\n}\n\n\nexport function CloneCTR(CTR: IChargeTransparencyRecord): IChargeTransparencyRecord\n{\n\n // const jsonSerializer = (key:string, value:any) => {\n // return value instanceof Decimal ? value.toNumber() : value;\n // };\n\n const clonedCTR = JSON.parse(JSON.stringify(CTR)) as IChargeTransparencyRecord; //, jsonSerializer));\n\n if (clonedCTR.chargingSessions)\n {\n for (const session of clonedCTR.chargingSessions) {\n for (const measurement of session.measurements) {\n for (const value of measurement.values) {\n if (typeof value.value === 'string' || typeof value.value === 'number')\n value.value = new Decimal(value.value);\n }\n }\n }\n }\n\n return clonedCTR;\n\n}\n","/*\n * Copyright (c) 2018-2026 GraphDefined GmbH <achim.friedland@graphdefined.com>\n * This file is part of Chargy WebApp <https://github.com/OpenChargingCloud/ChargyWebApp>\n *\n * Licensed under the Affero GPL license, Version 3.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.gnu.org/licenses/agpl.html\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport * as chargyInterfaces from './chargyInterfaces'\nimport * as chargyLib from '../chargyLib'\n\n\nexport const ChargeTransparencyLiveLinkContext = \"https://open.charging.cloud/contexts/chargeTransparency/live/link/1.0\";\n\n\nfunction isConnector(data: unknown): data is IConnector {\n if (!chargyInterfaces.isObject(data))\n return false;\n\n return [ \"standard\", \"format\", \"powerType\", \"maxPower\" ].\n every(key => data[key] === undefined || typeof data[key] === \"string\");\n}\n\nfunction isTransportURL(data: unknown): data is ITransportURL|string {\n\n if (typeof data === \"string\")\n return data.trim() !== \"\";\n\n return chargyInterfaces.isObject(data) &&\n typeof data[\"url\"] === \"string\" &&\n (data[\"priority\"] === undefined || typeof data[\"priority\"] === \"number\") &&\n (data[\"weight\"] === undefined || typeof data[\"weight\"] === \"number\");\n\n}\n\nfunction isTransport(data: unknown): data is Transport {\n\n if (!chargyInterfaces.isObject(data))\n return false;\n\n const type = data[\"type\"];\n\n if (type !== \"https\" &&\n type !== \"httpSSE\" &&\n type !== \"websocket\")\n {\n return false;\n }\n\n return (data[\"url\"] === undefined || typeof data[\"url\"] === \"string\") &&\n (data[\"urls\"] === undefined || (Array.isArray(data[\"urls\"]) && data[\"urls\"].every(isTransportURL))) &&\n (data[\"totp\"] === undefined || isTOTPConfig(data[\"totp\"]));\n\n}\n\nexport function IsAChargeTransparencyLiveLink(data: unknown): data is IChargeTransparencyLiveLink {\n\n if (!chargyLib.isMandatoryJSONObject(data))\n return false;\n\n return data[\"@context\"] === ChargeTransparencyLiveLinkContext &&\n (data[\"timestamp\"] === undefined || data[\"timestamp\"] === null || typeof data[\"timestamp\"] === \"string\") &&\n (data[\"description\"] === undefined || chargyInterfaces.isMultilanguageText(data[\"description\"])) &&\n (data[\"imageURLs\"] === undefined || (Array.isArray(data[\"imageURLs\"]) && data[\"imageURLs\"].every(value => typeof value === \"string\"))) &&\n (data[\"geoLocation\"] === undefined || chargyInterfaces.isGeoLocation(data[\"geoLocation\"])) &&\n (data[\"connector\"] === undefined || isConnector(data[\"connector\"])) &&\n (data[\"transports\"] === undefined || (Array.isArray(data[\"transports\"]) && data[\"transports\"].every(isTransport))) &&\n (data[\"signatures\"] === undefined || Array.isArray(data[\"signatures\"]));\n\n}\n\nfunction isTOTPConfig(data: unknown): data is TOTPConfig {\n return chargyInterfaces.isObject(data) &&\n typeof data[\"initialSharedSecret\"] === \"string\" &&\n typeof data[\"timeStep\"] === \"number\";\n}\n\nexport interface IChargeTransparencyLiveLink extends chargyLib.JSONObject {\n\n \"@context\": typeof ChargeTransparencyLiveLinkContext;\n\n /** ISO 8601 timestamp */\n timestamp?: string|null;\n\n /** Multi-language description */\n description?: chargyInterfaces.IMultilanguageText;\n\n /** URLs to images / logos */\n imageURLs?: string[];\n\n /** Geographic position of the charging station */\n geoLocation?: chargyInterfaces.IGeoLocation;\n\n /** Technical connector data */\n connector?: IConnector;\n\n /** Available transport methods for live data */\n transports?: Transport[];\n\n /** Digital signatures (currently empty or extendable) */\n signatures?: chargyInterfaces.ISignature[];\n\n}\n\n/** Connector information */\nexport interface IConnector {\n standard?: string;\n format?: string;\n powerType?: string;\n maxPower?: string;\n}\n\n\n\n/** Union type for the different transport variants */\nexport type Transport =\n | TransportHTTPS\n | TransportHTTPSSE\n | TransportWebsocket;\n\n\nexport interface ITransport {\n url?: string;\n urls?: Array<ITransportURL|string>;\n totp?: TOTPConfig;\n}\n\nexport interface TransportHTTPS extends ITransport {\n type: \"https\";\n}\n\nexport interface TransportHTTPSSE extends ITransport {\n type: \"httpSSE\";\n}\n\nexport interface TransportWebsocket extends ITransport {\n type: \"websocket\";\n}\n\nexport interface ITransportURL {\n url: string;\n priority?: number;\n weight?: number;\n}\n\n/** Time-based One-Time Password configuration */\nexport interface TOTPConfig {\n initialSharedSecret: string;\n timeStep: number;\n}\n","/*\n * Copyright (c) 2018-2026 GraphDefined GmbH <achim.friedland@graphdefined.com>\n * This file is part of Chargy WebApp <https://github.com/OpenChargingCloud/ChargyWebApp>\n *\n * Licensed under the Affero GPL license, Version 3.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.gnu.org/licenses/agpl.html\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport * as chargyLib from '../chargyLib'\nimport * as chargyInterfaces from './chargyInterfaces'\n\n\nexport function IsAPublicKeyLookup(data: unknown): data is IPublicKeyLookup\n{\n\n if (!chargyLib.isMandatoryJSONObject(data))\n return false;\n\n // if (!chargyInterfaces.isString(data[\"begin\"])) return false;\n // if (!chargyInterfaces.isString(data[\"end\"])) return false;\n\n return Array.isArray(data[\"publicKeys\"]);\n\n}\n\nexport interface IPublicKeyLookup extends chargyLib.JSONObject\n{\n publicKeys: Array<IPublicKeyInfo>;\n status?: chargyInterfaces.SessionVerificationResult;\n}\n\n\n\n\n\nexport function IsAPublicKeyInfo(data: unknown): data is IPublicKeyInfo\n{\n\n if (!chargyLib.isMandatoryJSONObject(data))\n return false;\n\n //if (typeof JSONObject[\"@id\"] !== \"string\") return false;\n if (!chargyInterfaces.isStringOrStringArray(data[\"@context\"])) return false;\n //if (typeof JSONObject[\"subject\"] !== \"string\") return false;\n if (!chargyInterfaces.isString (data[\"value\"])) return false;\n if (!chargyInterfaces.isStringOrOIDInfo (data[\"algorithm\"])) return false;\n\n if (data[\"certainty\"] !== undefined &&\n (typeof data[\"certainty\"] !== \"number\" ||\n !Number.isFinite(data[\"certainty\"]))) {\n return false;\n }\n\n if (data[\"type\"] !== undefined &&\n !chargyInterfaces.isStringOrOIDInfo(data[\"type\"])) {\n return false;\n }\n\n if (data[\"encoding\"] !== undefined &&\n typeof data[\"encoding\"] !== \"string\") {\n return false;\n }\n\n if (data[\"signatures\"] !== undefined &&\n !Array.isArray(data[\"signatures\"])) {\n return false;\n }\n\n return true;\n\n}\n\nexport interface IPublicKeyInfo extends chargyLib.JSONObject\n{\n \"@id\"?: string; // Just for merging with IChargeTransparencyRecord!\n \"@context\": string;\n subject?: string; // |any\n type?: string|chargyInterfaces.IOIDInfo;\n algorithm: string|chargyInterfaces.IOIDInfo;\n value: string;\n encoding?: string;\n signatures?: Array<IPublicKeysignature>;\n certainty?: number;\n}\n\n\n\n\n\nexport interface IPublicKeysignature\n{\n \"@id\": string;\n \"@context\"?: string;\n timestamp: string;\n keyUsage: Array<string>;\n}\n","/*\n * Copyright (c) 2018-2026 GraphDefined GmbH <achim.friedland@graphdefined.com>\n * This file is part of Chargy WebApp <https://github.com/OpenChargingCloud/ChargyWebApp>\n *\n * Licensed under the Affero GPL license, Version 3.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.gnu.org/licenses/agpl.html\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Buffer } from 'buffer';\nimport jsQR from 'jsqr';\nimport * as chargyLib from './chargyLib'\n\ntype QRImageData = {\n data: Uint8ClampedArray;\n width: number;\n height: number;\n};\n\ntype RasterImageData = {\n data: Uint8Array | Uint8ClampedArray;\n width: number;\n height: number;\n};\n\ntype CanvasImage = {\n naturalWidth?: number;\n naturalHeight?: number;\n width: number;\n height: number;\n};\n\ntype CanvasRenderingContext = {\n drawImage(image: CanvasImage, dx: number, dy: number): void;\n getImageData(sx: number, sy: number, sw: number, sh: number): RasterImageData;\n};\n\ntype CanvasSurface = {\n getContext(contextId: \"2d\"): CanvasRenderingContext | null;\n};\n\ntype CanvasModule = {\n loadImage(data: Buffer): Promise<CanvasImage>;\n createCanvas(width: number, height: number): CanvasSurface;\n};\n\ntype PNGModule = {\n PNG: {\n sync: {\n read(data: Buffer): RasterImageData;\n };\n };\n};\n\ntype JPEGModule = {\n decode(data: Buffer, options: { useTArray: boolean; formatAsRGBA: boolean }): RasterImageData;\n};\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nfunction moduleDefault(value: unknown): unknown {\n return isRecord(value) && \"default\" in value\n ? value[\"default\"]\n : value;\n}\n\nfunction isCanvasModule(value: unknown): value is CanvasModule {\n return isRecord(value) &&\n typeof value[\"loadImage\"] === \"function\" &&\n typeof value[\"createCanvas\"] === \"function\";\n}\n\nfunction isPNGModule(value: unknown): value is PNGModule {\n\n if (!isRecord(value))\n return false;\n\n const png = value[\"PNG\"];\n if (!isRecord(png))\n return false;\n\n const sync = png[\"sync\"];\n\n return isRecord(value) &&\n isRecord(sync) &&\n typeof sync[\"read\"] === \"function\";\n\n}\n\nfunction isJPEGModule(value: unknown): value is JPEGModule {\n return isRecord(value) &&\n typeof value[\"decode\"] === \"function\";\n}\n\nasync function imageDataFromBrowserCanvas(data: ArrayBuffer | Uint8Array,\n mimeType?: string)\n\n : Promise<QRImageData | undefined>\n\n{\n\n if (typeof Blob === \"undefined\" ||\n typeof createImageBitmap !== \"function\")\n {\n return undefined;\n }\n\n const imageBlob = new Blob([ chargyLib.toArrayBuffer(data) ], { type: mimeType ?? \"application/octet-stream\" });\n\n try\n {\n const bitmap = await createImageBitmap(imageBlob);\n\n try\n {\n const canvas = typeof OffscreenCanvas !== \"undefined\"\n ? new OffscreenCanvas(bitmap.width, bitmap.height)\n : typeof document !== \"undefined\"\n ? document.createElement(\"canvas\")\n : undefined;\n\n if (canvas == null)\n return undefined;\n\n canvas.width = bitmap.width;\n canvas.height = bitmap.height;\n\n const context = canvas.getContext(\"2d\", { willReadFrequently: true });\n if (context == null)\n return undefined;\n\n context.drawImage(bitmap, 0, 0);\n\n const imageData = context.getImageData(0, 0, bitmap.width, bitmap.height);\n\n return {\n data: imageData.data,\n width: imageData.width,\n height: imageData.height\n };\n }\n finally\n {\n bitmap.close();\n }\n }\n catch\n {\n return undefined;\n }\n\n}\n\nasync function imageDataFromBrowserImageElement(data: ArrayBuffer | Uint8Array,\n mimeType?: string)\n\n : Promise<QRImageData | undefined>\n\n{\n\n if (typeof Blob === \"undefined\" ||\n typeof URL === \"undefined\" ||\n typeof Image === \"undefined\" ||\n typeof document === \"undefined\")\n {\n return undefined;\n }\n\n const imageBlob = new Blob([ chargyLib.toArrayBuffer(data) ], { type: mimeType ?? \"application/octet-stream\" });\n const imageUrl = URL.createObjectURL(imageBlob);\n\n try\n {\n const image = new Image();\n\n await new Promise<void>((resolve, reject) => {\n image.onload = () => {\n resolve();\n };\n image.onerror = () => {\n reject(new Error(\"Could not decode image.\"));\n };\n image.src = imageUrl;\n });\n\n const canvas = document.createElement(\"canvas\");\n canvas.width = image.naturalWidth || image.width;\n canvas.height = image.naturalHeight || image.height;\n\n const context = canvas.getContext(\"2d\", { willReadFrequently: true });\n if (context == null || canvas.width <= 0 || canvas.height <= 0)\n return undefined;\n\n context.drawImage(image, 0, 0);\n\n const imageData = context.getImageData(0, 0, canvas.width, canvas.height);\n\n return {\n data: imageData.data,\n width: imageData.width,\n height: imageData.height\n };\n }\n catch\n {\n return undefined;\n }\n finally\n {\n URL.revokeObjectURL(imageUrl);\n }\n\n}\n\nasync function imageDataFromNodeCanvas(data: ArrayBuffer | Uint8Array): Promise<QRImageData | undefined>\n{\n\n try\n {\n const canvasLib = moduleDefault(await importOptionalNodeModule(\"@napi-rs/canvas\"));\n\n if (!isCanvasModule(canvasLib))\n return undefined;\n\n const image = await canvasLib.loadImage(Buffer.from(chargyLib.toUint8Array(data)));\n const width = image.naturalWidth || image.width;\n const height = image.naturalHeight || image.height;\n\n if (width <= 0 || height <= 0)\n return undefined;\n\n const canvas = canvasLib.createCanvas(width, height);\n const context = canvas.getContext(\"2d\");\n\n if (context == null)\n return undefined;\n\n context.drawImage(image, 0, 0);\n\n const imageData = context.getImageData(0, 0, width, height);\n\n return {\n data: new Uint8ClampedArray(imageData.data),\n width,\n height\n };\n }\n catch\n {\n return undefined;\n }\n\n}\n\nasync function imageDataFromPNGOrJPEG(data: ArrayBuffer | Uint8Array,\n mimeType?: string)\n\n : Promise<QRImageData | undefined>\n\n{\n\n try\n {\n\n const imageBytes = Buffer.from(chargyLib.toUint8Array(data));\n\n if (mimeType === \"image/png\")\n {\n\n const pngJS = moduleDefault(await importOptionalNodeModule(\"pngjs\"));\n\n if (!isPNGModule(pngJS))\n return undefined;\n\n const png = pngJS.PNG.sync.read(imageBytes);\n\n return {\n data: new Uint8ClampedArray(png.data),\n width: png.width,\n height: png.height\n };\n }\n\n if (mimeType === \"image/jpeg\")\n {\n\n const jpegJS = moduleDefault(await importOptionalNodeModule(\"jpeg-js\"));\n\n if (!isJPEGModule(jpegJS))\n return undefined;\n\n const jpeg = jpegJS.decode(imageBytes, { useTArray: true, formatAsRGBA: true });\n\n return {\n data: new Uint8ClampedArray(jpeg.data),\n width: jpeg.width,\n height: jpeg.height\n };\n }\n\n }\n catch (exception)\n {\n console.error(\"Error decoding image with PNG or JPEG module:\", exception);\n }\n\n return undefined;\n\n}\n\nasync function importOptionalNodeModule(moduleName: string): Promise<unknown>\n{\n\n try\n {\n const createNodeRequire = new Function(`\n const directRequire = typeof require !== 'undefined' ? require : undefined;\n if (directRequire) return directRequire;\n\n const moduleBuiltin = globalThis.process?.getBuiltinModule?.('module');\n if (moduleBuiltin?.createRequire)\n return moduleBuiltin.createRequire(${JSON.stringify(import.meta.url)});\n\n return undefined;\n `) as () => ((moduleName: string) => unknown) | undefined;\n\n const nodeRequire = createNodeRequire();\n\n if (nodeRequire != null)\n return nodeRequire(moduleName);\n\n const nodeImport = new Function(\"moduleName\", \"return import(moduleName)\") as (moduleName: string) => Promise<unknown>;\n return await nodeImport(moduleName);\n }\n catch\n {\n return undefined;\n }\n\n}\n\nexport async function readQRCodeTextFromImage(data: ArrayBuffer | Uint8Array,\n mimeType?: string): Promise<string | undefined>\n{\n\n const imageDataSources = typeof document === \"undefined\"\n ? [\n () => imageDataFromNodeCanvas (data),\n () => imageDataFromPNGOrJPEG (data, mimeType),\n () => imageDataFromBrowserCanvas (data, mimeType),\n () => imageDataFromBrowserImageElement(data, mimeType)\n ]\n : [\n () => imageDataFromBrowserCanvas (data, mimeType),\n () => imageDataFromBrowserImageElement(data, mimeType),\n () => imageDataFromNodeCanvas (data),\n () => imageDataFromPNGOrJPEG (data, mimeType)\n ];\n\n for (const imageDataSource of imageDataSources)\n {\n const imageData = await imageDataSource();\n\n if (imageData == null)\n continue;\n\n const qrText = readQRCodeTextFromImageData(imageData);\n\n if (qrText && qrText.length > 0)\n return qrText;\n }\n\n return undefined;\n\n}\n\nexport function readQRCodeTextFromImageData(imageData: QRImageData): string | undefined\n{\n\n const qrCode = jsQR(\n imageData.data,\n imageData.width,\n imageData.height,\n { inversionAttempts: \"attemptBoth\" }\n );\n\n const qrText = qrCode?.data.trim();\n\n return qrText && qrText.length > 0\n ? qrText\n : undefined;\n\n}\n","/*\n * Copyright (c) 2018-2026 GraphDefined GmbH <achim.friedland@graphdefined.com>\n * This file is part of Chargy Desktop App <https://github.com/OpenChargingCloud/ChargyDesktopApp>\n *\n * Licensed under the Affero GPL license, Version 3.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.gnu.org/licenses/agpl.html\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Buffer } from 'buffer';\nimport { fileTypeFromBuffer } from 'file-type';\nimport { Alfen, AlfenCrypt01 } from './Alfen'\nimport { BSMCrypt01 } from './BSMCrypt01'\nimport { ChargeIT } from './chargeIT'\nimport { ChargePoint, ChargePointCrypt01 } from './chargePoint'\nimport { EMHCrypt01 } from './EMHCrypt01'\nimport { GDFCrypt01 } from './GDFCrypt01'\nimport { Mennekes, MennekesCrypt01 } from './Mennekes'\nimport { OCMF, OCMFv1_x } from './OCMF'\nimport { PCDF, PCDFCrypt01, isPCDFText } from './PCDF'\nimport { SAFEXML } from './SAFE_XML'\nimport { XMLContainer } from './XMLContainer'\nimport { OCPI } from './OCPI'\nimport * as chargyInterfaces from './interfaces/chargyInterfaces'\nimport * as chargeTransparencyRecord from './interfaces/IChargeTransparencyRecord'\nimport * as chargeTransparencyLiveLink from './interfaces/IChargeTransparencyLiveLink'\nimport * as publicKeyInfo from './interfaces/IPublicKeyInfo'\nimport * as chargyLib from './chargyLib'\nimport { readQRCodeTextFromImage } from './qrCodeReader'\nimport seekBzip from 'seek-bzip';\n\ntype DERPublicKey = {\n oids: [number[], number[]];\n publicKey: {\n data: ArrayBuffer | Uint8Array;\n };\n};\n\ntype Asn1Builder = {\n bitstr(): Asn1Builder;\n int(): Asn1Builder;\n key(name: string): Asn1Builder;\n obj(...items: unknown[]): Asn1Builder;\n objid(): Asn1Builder;\n seq(): Asn1Builder;\n seqof(schema: unknown): Asn1Builder;\n};\n\ntype Asn1Schema = {\n decode<T = any>(data: Uint8Array | ArrayBuffer, encoding: string): T;\n};\n\ntype Asn1Module = {\n define: (name: string, body: (this: Asn1Builder) => void) => Asn1Schema;\n};\n\ntype Base32Decode = (input: string, variant: \"RFC3548\" | \"RFC4648\" | \"RFC4648-HEX\" | \"Crockford\") => ArrayBuffer;\n\nexport type EllipticKeyPair = {\n verify(hash: string, signature: unknown): boolean;\n};\n\nexport type EllipticCurve = {\n keyFromPublic(publicKey: string | { x: string; y: string }, encoding: string): EllipticKeyPair;\n};\n\ntype EllipticModule = {\n ec: new (curve: string) => EllipticCurve;\n};\n\ntype MomentModule = typeof import(\"moment\");\n\nexport class Chargy {\n\n //#region Data\n\n public readonly i18n: chargyInterfaces.I18NDictionary;\n public UILanguage: string;\n public readonly elliptic: EllipticModule;\n public readonly moment: MomentModule;\n public readonly asn1: Asn1Module;\n public readonly base32Decode: Base32Decode;\n public readonly showPKIDetails: chargyInterfaces.ShowPKIDetailsFunction;\n\n private chargingStationOperators = new Array<chargyInterfaces.IChargingStationOperator>();\n private chargingPools = new Array<chargyInterfaces.IChargingPool>();\n private chargingStations = new Array<chargyInterfaces.IChargingStation>();\n private EVSEs = new Array<chargyInterfaces.IEVSE>();\n private meters = new Array<chargyInterfaces.IMeter>();\n private chargingSessions = new Array<chargeTransparencyRecord.IChargingSession>();\n\n private eMobilityProviders = new Array<chargyInterfaces.IEMobilityProvider>();\n private mediationServices = new Array<chargyInterfaces.IMediationService>();\n\n public currentCTR = {} as chargeTransparencyRecord.IChargeTransparencyRecord;\n public internalCTR = {} as chargeTransparencyRecord.IChargeTransparencyRecord;\n\n //#endregion\n\n constructor(i18n: chargyInterfaces.I18NDictionary,\n UILanguage: string,\n elliptic: EllipticModule,\n moment: MomentModule,\n asn1: Asn1Module,\n base32Decode: Base32Decode,\n ShowPKIDetails: chargyInterfaces.ShowPKIDetailsFunction) {\n\n this.i18n = i18n;\n this.UILanguage = UILanguage;\n this.elliptic = elliptic;\n this.moment = moment;\n this.asn1 = asn1;\n this.base32Decode = base32Decode;\n this.showPKIDetails = ShowPKIDetails;\n\n }\n\n\n public SetUILanguage(UILanguage: string): void {\n\n this.UILanguage = UILanguage;\n\n }\n\n\n private PublicKeyIdFromFileName(fileName: string): string {\n\n return (fileName.indexOf('.') > -1\n ? fileName.substring(0, fileName.indexOf('.'))\n : fileName).replace(/[-_]?public[-_]?key/i, \"\");\n\n }\n\n\n private TryToParseDERPublicKey(keyId: string,\n publicKeyBuffer: Buffer): publicKeyInfo.IPublicKeyLookup & { \"@id\": string, \"@context\": string } {\n\n // https://lapo.it/asn1js/ for a visual check...\n // https://github.com/indutny/asn1.js\n const ASN1_OIDs = this.asn1.define('OIDs', function(this: Asn1Builder) {\n this.key('oid').objid()\n });\n\n const ASN1_PublicKey = this.asn1.define('PublicKey', function(this: Asn1Builder) {\n this.seq().obj(\n this.key('oids').seqof(ASN1_OIDs),\n this.key('publicKey').bitstr()\n );\n });\n\n const publicKeyDER = ASN1_PublicKey.decode(publicKeyBuffer, 'der');\n\n const KeyType_OID = publicKeyDER.oids[0].join(\".\");\n let KeyType = \"unknown\";\n switch (KeyType_OID)\n {\n case \"1.2.840.10045.2.1\":\n KeyType = \"ecPublicKey\"; // ANSI X9.62 public key type\n break;\n }\n\n const Curve_OID = publicKeyDER.oids[1].join(\".\");\n let Curve = \"unknown\";\n switch (Curve_OID)\n {\n\n // Koblitz 224-bit curve\n case \"1.3.132.0.32\":\n Curve = \"secp224k1\";\n break;\n\n // NIST/ANSI X9.62 named 256-bit elliptic curve used with SHA256\n case \"1.2.840.10045.3.1.7\":\n Curve = \"secp256r1\"; // also: ANSI prime256v1, NIST P-256\n break;\n\n // NIST/ANSI X9.62 named 384-bit elliptic curve used with SHA384\n case \"1.3.132.0.34\":\n Curve = \"secp384r1\"; // also: ANSI prime384v1, NIST P-384\n break;\n\n // NIST/ANSI X9.62 named 521-bit elliptic curve used with SHA512\n case \"1.3.132.0.35\":\n Curve = \"secp521r1\"; // also: ANSI prime521v1, NIST P-521\n break;\n\n }\n\n return {\n \"@id\": keyId,\n \"@context\": \"https://open.charging.cloud/contexts/CTR+json\",\n publicKeys: [\n {\n \"@id\": keyId,\n \"@context\": \"https://open.charging.cloud/contexts/publicKey+json\",\n \"subject\": keyId,\n type: {\n oid: KeyType_OID,\n name: KeyType\n },\n algorithm: {\n oid: Curve_OID,\n name: Curve\n },\n value: chargyLib.buf2hex(publicKeyDER.publicKey.data),\n certainty: 0\n }\n ]\n };\n\n }\n\n\n private IsHexEncodedPublicKeyFile(fileName: string,\n textContent?: string): boolean {\n\n if (textContent == null)\n return false;\n\n const fileNameLower = fileName.toLowerCase();\n const publicKeyFile = fileNameLower.includes(\"publickey\") ||\n fileNameLower.includes(\"public-key\") ||\n fileNameLower.includes(\"public_key\");\n const publicKeyHEX = textContent.replace(/\\s+/g, \"\");\n\n return publicKeyFile &&\n publicKeyHEX.length >= 80 &&\n publicKeyHEX.length % 2 === 0 &&\n publicKeyHEX.startsWith(\"30\") &&\n /^[0-9a-fA-F]+$/.test(publicKeyHEX);\n\n }\n\n\n private TryToGetDERPublicKeyHEX(fileName: string,\n textContent?: string): string|undefined {\n\n if (textContent == null)\n return undefined;\n\n if (textContent.startsWith(\"-----BEGIN PUBLIC KEY-----\") &&\n textContent.endsWith (\"-----END PUBLIC KEY-----\"))\n {\n const publicKeyPEM = textContent.replace(\"-----BEGIN PUBLIC KEY-----\", \"\").\n replace(\"-----END PUBLIC KEY-----\", \"\").\n split ('\\n').\n map ((line) => line.trim()).\n filter ((line) => line !== '' && !line.startsWith('#')).\n join (\"\");\n\n return chargyLib.buf2hex(Buffer.from(publicKeyPEM, 'base64'));\n }\n\n if (this.IsHexEncodedPublicKeyFile(fileName, textContent))\n return textContent.replace(/\\s+/g, \"\");\n\n return undefined;\n\n }\n\n private isSupportedQRCodeImageFile(fileInfo: chargyInterfaces.IFileInfo,\n mimeType?: string): boolean {\n\n const mimeTypeToCheck = (mimeType ?? fileInfo.type ?? \"\").toLowerCase();\n const fileName = fileInfo.name.toLowerCase();\n\n return mimeTypeToCheck === \"image/png\" ||\n mimeTypeToCheck === \"image/jpeg\" ||\n mimeTypeToCheck === \"image/jpg\" ||\n mimeTypeToCheck === \"image/gif\" ||\n mimeTypeToCheck === \"image/webp\" ||\n mimeTypeToCheck === \"image/bmp\" ||\n mimeTypeToCheck === \"image/svg+xml\" ||\n fileName.endsWith(\".png\") ||\n fileName.endsWith(\".jpg\") ||\n fileName.endsWith(\".jpeg\") ||\n fileName.endsWith(\".gif\") ||\n fileName.endsWith(\".webp\") ||\n fileName.endsWith(\".bmp\") ||\n fileName.endsWith(\".svg\");\n\n }\n\n private fileNameWithoutExtension(fileName: string): string {\n\n const lastSeparator = Math.max(fileName.lastIndexOf('/'), fileName.lastIndexOf('\\\\'));\n const lastDot = fileName.lastIndexOf('.');\n\n if (lastDot > lastSeparator)\n return fileName.substring(0, lastDot);\n\n return fileName;\n\n }\n\n private textFileNameForQRCodeContent(fileName: string,\n qrText: string): string {\n\n const trimmedQRCodeText = qrText.trimStart();\n const baseFileName = this.fileNameWithoutExtension(fileName);\n\n if (trimmedQRCodeText.startsWith(\"<?xml\") || trimmedQRCodeText.startsWith(\"<\"))\n return baseFileName + \".xml\";\n\n if (trimmedQRCodeText.startsWith(\"{\") || trimmedQRCodeText.startsWith(\"[\"))\n return baseFileName + \".json\";\n\n return baseFileName + \".txt\";\n\n }\n\n private tryExtractChargeTransparencyTextFromURL(qrText: string): string {\n\n if (!qrText.startsWith(\"http://\") && !qrText.startsWith(\"https://\"))\n return qrText;\n\n try\n {\n\n const url = new URL(qrText);\n\n const candidates = [\n url.hash.startsWith(\"#\") ? url.hash.substring(1) : url.hash,\n url.searchParams.get(\"data\"),\n url.searchParams.get(\"content\"),\n url.searchParams.get(\"ctr\"),\n url.searchParams.get(\"record\"),\n url.searchParams.get(\"payload\"),\n url.searchParams.get(\"q\")\n ];\n\n for (const candidate of candidates)\n {\n const decodedCandidate = candidate != null\n ? decodeURIComponent(candidate).trim()\n : \"\";\n\n if (decodedCandidate.startsWith(\"<?xml\") ||\n decodedCandidate.startsWith(\"<values\") ||\n decodedCandidate.startsWith(\"{\") ||\n decodedCandidate.startsWith(\"[\") ||\n decodedCandidate.startsWith(\"OCMF\") ||\n decodedCandidate.startsWith(\"AP;\"))\n {\n return decodedCandidate;\n }\n }\n }\n catch\n {\n console.log(\"Invalid URL in QR code: \" + qrText);\n }\n\n return qrText;\n\n }\n\n private tryExtractSignedDataTextFromXML(qrText: string): string {\n\n const trimmedQRCodeText = qrText.trim();\n\n if (!trimmedQRCodeText.startsWith(\"<?xml\") && !trimmedQRCodeText.startsWith(\"<\"))\n return qrText;\n\n try\n {\n const xmlDocument = new DOMParser().parseFromString(trimmedQRCodeText, \"text/xml\");\n const signedDataValues = chargyLib.getElementsByLocalName(xmlDocument, \"signedData\").\n filter(signedData => (signedData.getAttribute(\"format\") ?? \"\").trim().toLowerCase() === \"alfen\").\n map (signedData => signedData.textContent.trim()).\n filter(signedData => signedData.startsWith(\"AP;\"));\n\n if (signedDataValues.length > 0)\n return signedDataValues.join(\"\\n\");\n }\n catch\n {\n console.log(\"Error parsing XML content from QR code: \" + qrText);\n }\n\n return qrText;\n\n }\n\n private async expandQRCodeImageFiles(FileInfos: Array<chargyInterfaces.IFileInfo>): Promise<Array<chargyInterfaces.IFileInfo>> {\n\n const expandedFileInfos = new Array<chargyInterfaces.IFileInfo>();\n\n for (const fileInfo of FileInfos)\n {\n if (fileInfo.data != null && this.isSupportedQRCodeImageFile(fileInfo))\n {\n const qrText = await readQRCodeTextFromImage(fileInfo.data, fileInfo.type);\n\n if (qrText != null)\n {\n const extractedText = this.tryExtractSignedDataTextFromXML(\n this.tryExtractChargeTransparencyTextFromURL(qrText)\n );\n\n expandedFileInfos.push({\n name: this.textFileNameForQRCodeContent(fileInfo.name, extractedText),\n path: fileInfo.path,\n type: \"text/plain\",\n data: new TextEncoder().encode(extractedText),\n info: \"Text extracted from QR code image\"\n });\n\n continue;\n }\n\n expandedFileInfos.push({\n name: fileInfo.name,\n path: fileInfo.path,\n type: fileInfo.type,\n data: fileInfo.data,\n exception: \"No QR code with charge transparency data found!\"\n });\n\n continue;\n }\n\n expandedFileInfos.push(fileInfo);\n }\n\n return expandedFileInfos;\n\n }\n\n //#region GetLocalizedMessages...\n\n public GetLocalizedMessage(Text: string): string\n {\n\n const multiLanguage = this.i18n[Text];\n\n if (multiLanguage !== undefined)\n {\n\n const localLanguage = multiLanguage[this.UILanguage];\n if (localLanguage !== undefined)\n return localLanguage;\n\n const english = multiLanguage[\"en\"];\n if (english !== undefined)\n return english;\n\n }\n\n return Text;\n\n }\n\n public GetLocalizedMessageWithParameter(Text: string,\n Parameter: string | number): string\n {\n\n const multiLanguage = this.i18n[Text];\n\n if (multiLanguage !== undefined)\n {\n\n const localLanguage = multiLanguage[this.UILanguage];\n if (localLanguage !== undefined)\n return localLanguage.replace(\"%p\", String(Parameter));\n\n const english = multiLanguage[\"en\"];\n if (english !== undefined)\n return english.replace(\"%p\", String(Parameter));\n\n }\n\n return Text.replace(\"%p\", String(Parameter));\n\n }\n\n //#endregion\n\n //#region GetDevices...\n\n public GetChargingPool: chargyInterfaces.GetChargingPoolFunc = (Id: string) => {\n\n for (const chargingPool of this.chargingPools)\n {\n if (chargingPool[\"@id\"] === Id)\n return chargingPool;\n }\n\n return null;\n\n }\n\n public GetChargingStation: chargyInterfaces.GetChargingStationFunc = (Id: string) => {\n\n for (const chargingStation of this.chargingStations)\n {\n if (chargingStation[\"@id\"] === Id)\n return chargingStation;\n }\n\n return null;\n\n }\n\n public GetEVSE: chargyInterfaces.GetEVSEFunc = (Id: string) => {\n\n for (const evse of this.EVSEs)\n {\n if (evse[\"@id\"] === Id)\n return evse;\n }\n\n return null;\n\n }\n\n public GetMeter: chargyInterfaces.GetMeterFunc = (Id: string) => {\n\n for (const meter of this.meters)\n {\n if (meter[\"@id\"] === Id)\n return meter;\n }\n\n return null;\n\n }\n\n //#endregion\n\n\n //#region CheckMeterPublicKeySignature(...)\n\n public async CheckMeterPublicKeySignature(chargingStation: chargyInterfaces.IChargingStation | null | undefined,\n evse: chargyInterfaces.IEVSE | null | undefined,\n meter: chargyInterfaces.IMeter | null | undefined,\n publicKey: chargyInterfaces.IPublicKey | null | undefined,\n signature: unknown): Promise<string>\n {\n\n // For now: Do not enforce this feature!\n if (chargingStation == null || evse == null || meter == null || publicKey == null || signature == null)\n return \"\";// \"<i class=\\\"fas fa-exclamation-circle\\\"></i> Unbekannter Public Key!\";\n\n // Some of the signed legacy property names (softwareVersion, sockets,\n // vendor, ...) are not part of the current interfaces, but must be\n // kept, as they are part of the signed data structure!\n const chargingStationView = chargingStation as unknown as chargyLib.JSONObject;\n const evseView = evse as unknown as chargyLib.JSONObject;\n const meterView = meter as unknown as chargyLib.JSONObject;\n const signatureView = chargyLib.asJSONObject(signature) ?? {};\n\n try\n {\n\n const toCheck = {\n\n \"@id\": chargingStation[\"@id\"],\n \"description\": chargingStation.description,\n \"geoLocation\": chargingStation.geoLocation,\n \"address\": chargingStation.address,\n \"softwareVersion\": chargingStationView[\"softwareVersion\"],\n\n \"EVSE\": {\n \"@id\": evse[\"@id\"],\n \"description\": evse.description,\n \"sockets\": evseView[\"sockets\"],\n\n \"meter\": {\n \"@id\": meter[\"@id\"],\n \"vendor\": meterView[\"vendor\"],\n \"model\": meter.model,\n \"firmwareVersion\": meter.firmwareVersion,\n \"signatureFormat\": meter.signatureFormat,\n\n \"publicKey\": {\n \"algorithm\": publicKey.algorithm,\n \"format\": publicKey.format,\n \"value\": publicKey.value,\n\n \"signature\": {\n \"signer\": signatureView[\"signer\"],\n \"timestamp\": signatureView[\"timestamp\"],\n \"comment\": signatureView[\"comment\"],\n \"algorithm\": signatureView[\"algorithm\"],\n \"format\": signatureView[\"format\"]\n }\n\n }\n\n }\n\n }\n\n };\n\n //ToDo: Checking the timestamp might be usefull!\n\n const sha256value = await chargyLib.sha256(JSON.stringify(toCheck));\n\n const result = new this.elliptic.ec('secp256r1').\n keyFromPublic(chargyLib.asString(signatureView[\"publicKey\"]) ?? \"\", 'hex').\n verify (sha256value,\n signatureView[\"signature\"]);\n\n if (result)\n return \"<i class=\\\"fas fa-check-circle\\\"></i>\" + String(signatureView[\"signer\"]);\n\n\n }\n catch\n {\n console.log(\"Error verifying public key signature!\");\n }\n\n return \"<i class=\\\"fas fa-times-circle\\\"></i>\" + String(signatureView[\"signer\"]);\n\n }\n\n //#endregion\n\n //#region (private) decompressFiles(FileInfos)\n\n private async decompressFiles(FileInfos: Array<chargyInterfaces.IFileInfo>): Promise<Array<chargyInterfaces.IFileInfo>> {\n\n //#region Initial checks\n\n if (FileInfos.length == 0)\n return FileInfos;\n\n //#endregion\n\n let archiveFound: boolean;\n let expandedFileInfos: chargyInterfaces.IFileInfo[];\n\n do\n {\n\n archiveFound = false;\n expandedFileInfos = new Array<chargyInterfaces.IFileInfo>();\n\n for (const FileInfo of FileInfos)\n {\n\n if (FileInfo.data != null && FileInfo.data.byteLength > 0)\n {\n\n try\n {\n\n const filetype = await fileTypeFromBuffer(FileInfo.data);\n\n if (filetype?.mime == undefined)\n {\n\n if (this.isSupportedQRCodeImageFile(FileInfo))\n expandedFileInfos.push({\n name: FileInfo.name,\n data: FileInfo.data,\n type: FileInfo.type,\n info: \"QR code image file\"\n });\n\n else if (FileInfo.name.endsWith(\".chargy\"))\n expandedFileInfos.push({\n name: FileInfo.name,\n data: FileInfo.data,\n info: \".chargy file\"\n });\n\n else\n expandedFileInfos.push({\n name: FileInfo.name,\n data: FileInfo.data,\n exception: \"Unknown file type!\"\n });\n\n continue;\n\n }\n\n else if (filetype.mime === \"text/xml\" ||\n filetype.mime === \"application/xml\"\n )\n {\n expandedFileInfos.push({\n name: FileInfo.name,\n data: FileInfo.data,\n info: \"XML file\"\n });\n continue;\n }\n\n else if (filetype.mime === \"text/json\" ||\n filetype.mime === \"application/json\"\n )\n {\n expandedFileInfos.push({\n name: FileInfo.name,\n data: FileInfo.data,\n info: \"JSON file\"\n });\n continue;\n }\n\n else if (this.isSupportedQRCodeImageFile(FileInfo, filetype.mime))\n {\n expandedFileInfos.push({\n name: FileInfo.name,\n data: FileInfo.data,\n type: filetype.mime,\n info: \"QR code image file\"\n });\n continue;\n }\n\n else if (filetype.mime === \"application/zip\" ||\n filetype.mime === \"application/x-bzip2\" ||\n filetype.mime === \"application/gzip\" ||\n filetype.mime === \"application/x-tar\")\n {\n\n try\n {\n\n const compressedFiles = await this.extractArchive(FileInfo.name,\n FileInfo.data,\n filetype.mime);\n\n if (compressedFiles.length == 0)\n continue;\n\n archiveFound = true;\n\n //#region A single compressed file without a path/filename, e.g. within bz2\n\n if (compressedFiles.length == 1 && compressedFiles[0]?.path == null)\n {\n expandedFileInfos.push({\n name: FileInfo.name.substring(0, FileInfo.name.lastIndexOf('.')),\n data: compressedFiles[0]?.data\n });\n continue;\n }\n\n //#endregion\n\n //#region A chargepoint compressed archive file\n\n let CTRfile:any = null;\n let dataFile = \"\";\n let signatureFile = \"\";\n\n if (compressedFiles.length >= 2)\n {\n\n for (const file of compressedFiles)\n {\n if (file.type === \"file\")\n {\n switch (file.path)\n {\n\n case \"secrrct\":\n {\n try\n {\n dataFile = new TextDecoder('utf-8').decode(file.data);\n }\n catch (exception)\n {\n console.debug(\"Invalid chargepoint 'secrrct' file: \" + (exception instanceof Error ? exception.message : String(exception)));\n }\n }\n break;\n\n case \"secrrct.sign\":\n {\n try\n {\n signatureFile = chargyLib.buf2hex(file.data);\n }\n catch (exception)\n {\n console.debug(\"Invalid chargepoint 'secrrct.sign' file: \" + (exception instanceof Error ? exception.message : String(exception)));\n }\n }\n break;\n\n }\n }\n\n }\n\n if (dataFile. length > 0 &&\n signatureFile.length > 0)\n {\n try\n {\n\n CTRfile = JSON.parse(dataFile);\n\n // Save the 'original' JSON with whitespaces for later signature verification!\n CTRfile.original = btoa(dataFile);\n CTRfile.signature = signatureFile;\n\n expandedFileInfos.push({\n name: FileInfo.name,\n data: new TextEncoder().encode(JSON.stringify(CTRfile))\n });\n\n }\n catch (exception)\n {\n console.debug(\"Could not parse chargepoint 'secrrct' file: \" + (exception instanceof Error ? exception.message : String(exception)));\n }\n continue;\n }\n\n }\n\n //#endregion\n\n //#region Multiple files\n\n for (const compressedFile of compressedFiles)\n {\n if (compressedFile.type === \"file\")\n {\n expandedFileInfos.push({\n name: compressedFile.path.substring(compressedFile.path.lastIndexOf('/') + 1),// ?? FileInfo.name,\n data: compressedFile.data\n });\n }\n }\n\n //#endregion\n\n }\n catch (exception) {\n console.log(\"Error decompressing files: \" + (exception instanceof Error ? exception.message : String(exception)));\n }\n\n continue;\n\n }\n\n // expandedFileInfos.push({\n // name: FileInfo.name,\n // data: FileInfo.data\n // });\n\n }\n catch (exception)\n {\n expandedFileInfos.push({\n name: FileInfo.name,\n data: FileInfo.data,\n exception: exception\n });\n }\n\n }\n\n }\n\n if (archiveFound)\n FileInfos = expandedFileInfos;\n\n }\n while (archiveFound);\n\n return expandedFileInfos;\n\n }\n\n //#endregion\n\n private async extractArchive(fileName: string,\n data: ArrayBuffer | Uint8Array,\n mimeType: string): Promise<Array<chargyInterfaces.TarInfo>> {\n\n const archiveData = this.toUint8Array(data);\n\n if (mimeType === \"application/zip\")\n return await this.extractZipArchive(archiveData);\n\n if (mimeType === \"application/x-tar\")\n return this.extractTarArchive(archiveData);\n\n if (mimeType === \"application/gzip\") {\n const decompressed = await this.decompressStream(archiveData, \"gzip\");\n const tarFiles = this.extractTarArchive(decompressed);\n\n return tarFiles.length > 0\n ? tarFiles\n : [{\n data: Buffer.from(decompressed),\n mode: 0,\n mtime: \"\",\n path: fileName.substring(0, fileName.lastIndexOf('.')),\n type: \"file\"\n }];\n }\n\n if (mimeType === \"application/x-bzip2\") {\n const decompressed = this.toUint8Array(seekBzip.decode(Buffer.from(archiveData)));\n const tarFiles = this.extractTarArchive(decompressed);\n\n return tarFiles.length > 0\n ? tarFiles\n : [{\n data: Buffer.from(decompressed),\n mode: 0,\n mtime: \"\",\n path: fileName.substring(0, fileName.lastIndexOf('.')),\n type: \"file\"\n }];\n }\n\n return [];\n\n }\n\n private extractTarArchive(data: Uint8Array): Array<chargyInterfaces.TarInfo> {\n\n const files = new Array<chargyInterfaces.TarInfo>();\n\n for (let offset = 0; offset + 512 <= data.byteLength;) {\n\n const header = data.subarray(offset, offset + 512);\n\n if (header.every(byte => byte === 0))\n break;\n\n const name = this.readTarString(header, 0, 100);\n const size = this.readTarOctal (header, 124, 12);\n\n if (name.length === 0 || size < 0)\n break;\n\n const prefix = this.readTarString(header, 345, 155);\n const path = prefix.length > 0 ? prefix + \"/\" + name : name;\n const typeFlag = String.fromCharCode(header[156] ?? 0);\n const dataStart = offset + 512;\n const dataEnd = dataStart + size;\n\n if (dataEnd > data.byteLength)\n break;\n\n if (typeFlag !== \"5\")\n files.push({\n data: Buffer.from(data.subarray(dataStart, dataEnd)),\n mode: this.readTarOctal(header, 100, 8),\n mtime: this.readTarOctal(header, 136, 12).toString(),\n path,\n type: \"file\"\n });\n\n offset += 512 + Math.ceil(size / 512) * 512;\n\n }\n\n return files;\n\n }\n\n private async extractZipArchive(data: Uint8Array): Promise<Array<chargyInterfaces.TarInfo>> {\n\n const files = new Array<chargyInterfaces.TarInfo>();\n const view = new DataView(data.buffer, data.byteOffset, data.byteLength);\n\n const endOfCentralDirectory = this.findZipEndOfCentralDirectory(data);\n\n if (endOfCentralDirectory < 0)\n return files;\n\n const entryCount = view.getUint16(endOfCentralDirectory + 10, true);\n let centralDirectoryOffset = view.getUint32(endOfCentralDirectory + 16, true);\n\n for (let index = 0; index < entryCount && centralDirectoryOffset + 46 <= data.byteLength; index++) {\n\n if (view.getUint32(centralDirectoryOffset, true) !== 0x02014b50)\n break;\n\n const compression = view.getUint16(centralDirectoryOffset + 10, true);\n const compressedSize = view.getUint32(centralDirectoryOffset + 20, true);\n const uncompressedSize = view.getUint32(centralDirectoryOffset + 24, true);\n const fileNameLength = view.getUint16(centralDirectoryOffset + 28, true);\n const extraLength = view.getUint16(centralDirectoryOffset + 30, true);\n const commentLength = view.getUint16(centralDirectoryOffset + 32, true);\n const localHeaderOffset = view.getUint32(centralDirectoryOffset + 42, true);\n const pathStart = centralDirectoryOffset + 46;\n const pathEnd = pathStart + fileNameLength;\n\n if (pathEnd > data.byteLength ||\n localHeaderOffset + 30 > data.byteLength ||\n view.getUint32(localHeaderOffset, true) !== 0x04034b50)\n break;\n\n const localNameLength = view.getUint16(localHeaderOffset + 26, true);\n const localExtraLength = view.getUint16(localHeaderOffset + 28, true);\n const dataStart = localHeaderOffset + 30 + localNameLength + localExtraLength;\n const dataEnd = dataStart + compressedSize;\n\n if (dataEnd > data.byteLength)\n break;\n\n const path = new TextDecoder(\"utf-8\").decode(data.subarray(pathStart, pathEnd));\n const compressedData = data.subarray(dataStart, dataEnd);\n\n if (!path.endsWith(\"/\")) {\n\n let fileData: Uint8Array;\n\n if (compression === 0)\n fileData = compressedData;\n\n else if (compression === 8)\n fileData = await this.decompressStream(compressedData, \"deflate-raw\");\n\n else\n fileData = new Uint8Array(0);\n\n if (compression === 0 || compression === 8)\n files.push({\n data: Buffer.from(fileData),\n mode: 0,\n mtime: \"\",\n path,\n type: \"file\"\n });\n\n if (uncompressedSize > 0 && fileData.byteLength !== uncompressedSize)\n console.debug(\"Unexpected ZIP entry size for '\" + path + \"'!\");\n\n }\n\n centralDirectoryOffset = pathEnd + extraLength + commentLength;\n\n }\n\n return files;\n\n }\n\n private async decompressStream(data: Uint8Array, format: CompressionFormat): Promise<Uint8Array> {\n\n const buffer = data.buffer.slice(data.byteOffset, data.byteOffset + data.byteLength) as ArrayBuffer;\n const stream = new Blob([ buffer ]).stream().pipeThrough(new DecompressionStream(format));\n return new Uint8Array(await new Response(stream).arrayBuffer());\n\n }\n\n private findZipEndOfCentralDirectory(data: Uint8Array): number {\n\n const view = new DataView(data.buffer, data.byteOffset, data.byteLength);\n const maxOffset = Math.max(0, data.byteLength - 65557);\n\n for (let offset = data.byteLength - 22; offset >= maxOffset; offset--)\n if (view.getUint32(offset, true) === 0x06054b50)\n return offset;\n\n return -1;\n\n }\n\n private toUint8Array(data: ArrayBuffer | Uint8Array): Uint8Array {\n\n return data instanceof Uint8Array\n ? data\n : new Uint8Array(data);\n\n }\n\n private readTarString(data: Uint8Array, offset: number, length: number): string {\n\n let end = offset;\n\n while (end < offset + length && data[end] !== 0)\n end++;\n\n return new TextDecoder(\"utf-8\").decode(data.subarray(offset, end)).trim();\n\n }\n\n private readTarOctal(data: Uint8Array, offset: number, length: number): number {\n\n const value = this.readTarString(data, offset, length).replace(/\\0/g, \"\").trim();\n return value.length > 0 ? parseInt(value, 8) : 0;\n\n }\n\n\n //#region DetectAndConvertContentFormat(FileInfos)\n\n public async DetectAndConvertContentFormat(FileInfos: Array<chargyInterfaces.IFileInfo>)\n\n : Promise<chargeTransparencyRecord. IChargeTransparencyRecord |\n chargeTransparencyLiveLink.IChargeTransparencyLiveLink |\n publicKeyInfo. IPublicKeyInfo |\n chargyInterfaces. ISessionCryptoResult> {\n\n //#region Initial checks\n\n if (FileInfos.length == 0) return {\n status: chargyInterfaces.SessionVerificationResult.NoChargeTransparencyRecordsFound,\n message: this.GetLocalizedMessage(\"No charge transparency records found!\"),\n certainty: 0\n }\n\n let expandedFiles = new Array<chargyInterfaces.IFileInfo>();\n const processedFiles = new Array<chargeTransparencyRecord.IExtendedFileInfo>();\n\n //#endregion\n\n //#region Process PDF/A-3 and compressed files\n\n if (FileInfos.length > 0)\n {\n for (const fileInfo of FileInfos)\n {\n\n //#region Process PDF/A-3 attachments\n\n if (fileInfo.type === \"application/pdf\" || fileInfo.name.endsWith(\".pdf\"))\n {\n\n const pdfjsLib = await import('pdfjs-dist');\n const pdfWorkerSrc = await import('pdfjs-dist/build/pdf.worker.mjs');\n\n if (typeof pdfWorkerSrc === \"string\")\n pdfjsLib.GlobalWorkerOptions.workerSrc = pdfWorkerSrc;\n else if (typeof pdfWorkerSrc?.default === \"string\")\n pdfjsLib.GlobalWorkerOptions.workerSrc = pdfWorkerSrc.default;\n\n const pdfDocument = fileInfo.data\n ? await pdfjsLib.getDocument({ data: fileInfo.data }).promise\n : fileInfo.path\n ? await pdfjsLib.getDocument({ url: fileInfo.path }).promise\n : null;\n\n if (pdfDocument)\n {\n try\n {\n\n const attachments = await pdfDocument.getAttachments();\n\n Object.keys(attachments).forEach(fileName => {\n\n const attachment = attachments[fileName];\n\n if (attachment.filename.endsWith('.chargy'))\n expandedFiles.push({\n name: attachment.filename,\n path: FileInfos[0]?.path,\n type: \"application/chargy\",\n data: attachment.content,\n info: \"A CHARGY file extracted from a PDF/A-3 or newer attachment\"\n });\n\n else if (attachment.filename.endsWith('.xml'))\n expandedFiles.push({\n name: attachment.filename,\n path: FileInfos[0]?.path,\n type: \"application/xml\",\n data: attachment.content,\n info: \"A XML file extracted from a PDF/A-3 or newer attachment\"\n });\n\n else if (attachment.filename.endsWith('.json'))\n expandedFiles.push({\n name: attachment.filename,\n path: FileInfos[0]?.path,\n type: \"application/json\",\n data: attachment.content,\n info: \"A JSON file extracted from a PDF/A-3 or newer attachment\"\n });\n\n else if (attachment.filename.endsWith('.csv'))\n expandedFiles.push({\n name: attachment.filename,\n path: FileInfos[0]?.path,\n type: \"text/csv\",\n data: attachment.content,\n info: \"A CSV file extracted from a PDF/A-3 or newer attachment\"\n });\n\n });\n\n } catch (error) {\n console.error(`Error extracting PDF/A-3 attachments: ${String(error)}`);\n }\n }\n\n }\n\n //#endregion\n\n else\n expandedFiles.push(fileInfo);\n\n }\n }\n\n //#endregion\n\n expandedFiles = await this.decompressFiles(expandedFiles);\n expandedFiles = await this.expandQRCodeImageFiles(expandedFiles);\n\n const publicKeyHEXLookup = new Map<string, string>();\n\n for (const expandedFile of expandedFiles)\n {\n\n let textContent = new TextDecoder('utf-8').decode(expandedFile.data).trim();\n\n // Catches EFBBBF (UTF-8 BOM) because the buffer-to-string\n // conversion translates it to FEFF (UTF-16 BOM)\n if (textContent.charCodeAt(0) === 0xFEFF)\n textContent = textContent.substring(1);\n\n const publicKeyHEX = this.TryToGetDERPublicKeyHEX(expandedFile.name, textContent);\n\n if (publicKeyHEX != null)\n publicKeyHEXLookup.set(this.PublicKeyIdFromFileName(expandedFile.name), publicKeyHEX);\n\n }\n\n //#region Process JSON/XML/text files\n\n for (const expandedFile of expandedFiles)\n {\n\n const processedFile = expandedFile as chargeTransparencyRecord.IExtendedFileInfo;\n let textContent = new TextDecoder('utf-8').decode(expandedFile.data).trim();\n\n // Catches EFBBBF (UTF-8 BOM) because the buffer-to-string\n // conversion translates it to FEFF (UTF-16 BOM)\n if (textContent.charCodeAt(0) === 0xFEFF)\n textContent = textContent.substring(1);\n\n //#region XML processing...\n\n if (textContent.startsWith(\"<?xml\") || textContent.startsWith(\"<\"))\n {\n try\n {\n\n const XMLDocument = new DOMParser().parseFromString(textContent, \"text/xml\");\n\n //#region XML namespace found...\n\n const xmlns = XMLDocument.lookupNamespaceURI(null);\n if (xmlns != null)\n {\n\n switch (xmlns)\n {\n\n case \"http://www.mennekes.de/Mennekes.EdlVerification.xsd\":\n processedFile.result = await new Mennekes(this).tryToParseMennekesXML(XMLDocument);\n break;\n\n case \"http://transparenz.software/schema/2018/07\":\n case \"https://open.charging.cloud/CTR/2020/01\":\n // try\n // {\n processedFile.result = await new SAFEXML(this).tryToParseSAFEXML(XMLDocument);\n // }\n // catch (exception)\n // {\n // processedFile.result = {\n // status: chargyInterfaces.SessionVerificationResult.InvalidSessionFormat,\n // exception: exception,\n // certainty: 0\n // };\n // }\n\n // if (processedFile.result.status !== undefined &&\n // processedFile.result.status !== chargyInterfaces.SessionVerificationResult.Unvalidated)\n // {\n // processedFile.result = await new XMLContainer(this).tryToParseXMLContainer(XMLDocument);\n // }\n\n break;\n\n // The SAFE transparency software v1.0 does not understand its own\n // XML namespace. Therefore we have to guess the format.\n case \"\":\n if (XMLDocument.documentElement.localName === \"ChargingProcess\" ||\n XMLDocument.documentElement.localName === \"Billing\")\n {\n processedFile.result = await new Mennekes(this).tryToParseMennekesXML(XMLDocument);\n break;\n }\n\n // if (XMLDocument.documentElement?.nodeName === \"values\" ||\n // XMLDocument.documentElement?.localName === \"values\")\n // {\n // processedFile.result = await new XMLContainer(this).tryToParseXMLContainer(XMLDocument);\n // break;\n // }\n\n processedFile.result = await new SAFEXML(this).tryToParseSAFEXML(XMLDocument);\n\n if (processedFile.result.status &&\n processedFile.result.status !== chargyInterfaces.SessionVerificationResult.Unvalidated &&\n chargyLib.getElementsByLocalName(XMLDocument, \"chargingStation\").length === 0)\n {\n processedFile.result = new XMLContainer(this).tryToParseXMLContainer(XMLDocument);\n }\n\n break;\n\n }\n\n }\n\n //#endregion\n\n //#region ..., or plain XML.\n\n else\n {\n\n // The SAFE transparency software v1.0 does not understand its own\n // XML namespace. Therefore we have to guess the format.\n if (XMLDocument.documentElement.localName === \"ChargingProcess\" ||\n XMLDocument.documentElement.localName === \"Billing\")\n processedFile.result = await new Mennekes(this).tryToParseMennekesXML(XMLDocument);\n else\n processedFile.result = await new SAFEXML(this).tryToParseSAFEXML(XMLDocument);\n\n // Maybe another XML format, e.g. the XML container format?\n if (processedFile.result.status === chargyInterfaces.SessionVerificationResult.InvalidSessionFormat &&\n chargyLib.getElementsByLocalName(XMLDocument, \"chargingStation\").length === 0)\n {\n processedFile.result = new XMLContainer(this).tryToParseXMLContainer(XMLDocument);\n }\n\n }\n\n //#endregion\n\n } catch (exception)\n {\n processedFile.result = {\n status: chargyInterfaces.SessionVerificationResult.InvalidSessionFormat,\n message: this.GetLocalizedMessage(\"UnknownOrInvalidXMLChargeTransparencyFormat\"),\n exception: exception,\n certainty: 0\n }\n }\n }\n\n //#endregion\n\n //#region OCMF processing\n\n else if (textContent.startsWith(\"OCMF\"))\n {\n const publicKeyHEX = publicKeyHEXLookup.get(this.PublicKeyIdFromFileName(processedFile.name)) ??\n (publicKeyHEXLookup.size === 1 ? publicKeyHEXLookup.values().next().value : undefined);\n\n processedFile.result = await new OCMF(this).TryToParseOCMFDocument(\n textContent,\n publicKeyHEX,\n publicKeyHEX != null ? \"hex\" : undefined\n );\n }\n\n else if (textContent.startsWith(\"\\\"OCMF\") && textContent.endsWith(\"\\\"\"))\n {\n const publicKeyHEX = publicKeyHEXLookup.get(this.PublicKeyIdFromFileName(processedFile.name)) ??\n (publicKeyHEXLookup.size === 1 ? publicKeyHEXLookup.values().next().value : undefined);\n\n processedFile.result = await new OCMF(this).TryToParseOCMFDocument(\n textContent.substring(1, textContent.length - 1),\n publicKeyHEX,\n publicKeyHEX != null ? \"hex\" : undefined\n );\n }\n\n //#endregion\n\n //#region PCDF processing\n\n else if (isPCDFText(textContent))\n {\n\n const publicKeyHEX = publicKeyHEXLookup.get(this.PublicKeyIdFromFileName(processedFile.name)) ??\n (publicKeyHEXLookup.size === 1 ? publicKeyHEXLookup.values().next().value : undefined);\n\n processedFile.result = await new PCDF(this).TryToParsePCDFDocument(\n textContent,\n publicKeyHEX\n );\n\n }\n\n //#endregion\n\n //#region ALFEN processing\n\n else if (textContent.startsWith(\"AP;\"))\n processedFile.result = new Alfen(this).TryToParseALFENFormat(textContent, {});\n\n else if (textContent.startsWith(\"\\\"AP;\") && textContent.endsWith(\"\\\"\"))\n processedFile.result = new Alfen(this).TryToParseALFENFormat(textContent.substring(1, textContent.length - 1), {});\n\n //#endregion\n\n //#region Public key processing (PEM format)\n\n else if (textContent.startsWith(\"-----BEGIN PUBLIC KEY-----\") &&\n textContent.endsWith (\"-----END PUBLIC KEY-----\"))\n {\n\n try\n {\n\n const keyId = this.PublicKeyIdFromFileName(processedFile.name);\n\n const publicKeyPEM = textContent.replace(\"-----BEGIN PUBLIC KEY-----\", \"\").\n replace(\"-----END PUBLIC KEY-----\", \"\").\n split ('\\n').\n map ((line) => line.trim()).\n filter ((line) => line !== '' && !line.startsWith('#')).\n join (\"\");\n\n processedFile.result = this.TryToParseDERPublicKey(\n keyId,\n Buffer.from(publicKeyPEM, 'base64')\n );\n\n }\n catch (exception)\n {\n processedFile.result = {\n status: chargyInterfaces.SessionVerificationResult.InvalidPublicKey,\n message: this.GetLocalizedMessage(\"UnknownOrInvalidPublicKeyFormat\"),\n exception: exception,\n certainty: 0\n }\n }\n\n }\n\n //#endregion\n\n //#region Public key processing (HEX encoded DER format)\n\n else if (this.IsHexEncodedPublicKeyFile(processedFile.name, textContent))\n {\n\n try\n {\n\n processedFile.result = this.TryToParseDERPublicKey(\n this.PublicKeyIdFromFileName(processedFile.name),\n Buffer.from(textContent.replace(/\\s+/g, \"\"), 'hex')\n );\n\n }\n catch (exception)\n {\n processedFile.result = {\n status: chargyInterfaces.SessionVerificationResult.InvalidPublicKey,\n message: this.GetLocalizedMessage(\"UnknownOrInvalidPublicKeyFormat\"),\n exception: exception,\n certainty: 0\n }\n }\n\n }\n\n //#endregion\n\n //#region JSON processing\n\n else if (textContent.startsWith(\"{\") && textContent.endsWith(\"}\"))\n {\n try\n {\n\n const JSONContent: unknown = JSON.parse(textContent);\n\n if (typeof JSONContent !== \"object\" || JSONContent === null)\n throw new Error(\"Parsed JSON content is not an object or array!\");\n\n if (chargyLib.isMandatoryJSONObject(JSONContent))\n {\n\n const JSONContext = JSONContent[\"@context\"];//?.trim().toString() ?? \"\";\n\n if (chargeTransparencyLiveLink.IsAChargeTransparencyLiveLink(JSONContent))\n {\n\n if (JSONContent.timestamp == null)\n JSONContent.timestamp = new Date().toISOString();\n\n processedFile.result = JSONContent;\n\n }\n\n else if (chargyLib.isMandatoryString(JSONContext))\n {\n\n if (JSONContext.startsWith(\"https://open.charging.cloud/contexts/CTR+json\"))\n processedFile.result = JSONContent as chargeTransparencyRecord.IChargeTransparencyRecord;\n\n else if (JSONContext.startsWith(\"https://open.charging.cloud/contexts/publicKey+json\"))\n processedFile.result = JSONContent as publicKeyInfo.IPublicKeyInfo;\n\n else if (JSONContext.startsWith(\"https://www.lichtblick.de/contexts/charging-station-json\") ||\n JSONContext.startsWith(\"https://www.eneco.com/contexts/charging-station-json\") ||\n JSONContext.startsWith(\"https://www.chargeit-mobility.com/contexts/charging-station-json\"))\n {\n processedFile.result = new ChargeIT(this).TryToParseChargeITContainerFormat(JSONContent);\n }\n\n }\n\n // Some formats do not provide any context or format identifiers...\n else\n {\n\n const results = [\n new ChargeIT(this). TryToParseChargeITContainerFormat(JSONContent),\n new ChargePoint(this).TryToParseChargepointFormat (JSONContent),\n await new OCPI(this). tryToParseOCPIFormat (JSONContent)\n ];\n\n //#region Filter and sort results\n\n const filteredResults = results.filter((ctr) => {\n\n // At this point we currently only know whether the CTR data format is correct,\n // but NOT whether the crypto signatures are correct!\n return chargyInterfaces.isISessionCryptoResult1(ctr);// &&\n //ctr.status === chargyInterfaces.SessionVerificationResult.Unvalidated;\n\n });\n\n const sortedResults = filteredResults.sort((ctr1, ctr2) => {\n\n if (ctr1.certainty > ctr2.certainty) {\n return -1;\n }\n\n if (ctr1.certainty < ctr2.certainty) {\n return 1;\n }\n\n return 0;\n\n });\n\n if (sortedResults.length >= 1 && sortedResults[0])\n processedFile.result = sortedResults[0];\n\n //#endregion\n\n }\n\n }\n\n }\n catch (exception) {\n processedFile.result = {\n status: chargyInterfaces.SessionVerificationResult.InvalidSessionFormat,\n message: this.GetLocalizedMessage(\"UnknownOrInvalidJSONChargeTransparencyFormat\"),\n exception: exception,\n certainty: 0\n }\n }\n }\n\n //#endregion\n\n\n // if (processedFile.result == undefined) {\n // processedFile.result = {\n // status: chargyInterfaces.SessionVerificationResult.InvalidSessionFormat,\n // message: this.GetLocalizedMessage(\"UnknownOrInvalidChargeTransparencyRecord\"),\n // certainty: 0\n // }\n // }\n\n processedFiles.push(processedFile);\n\n }\n\n //#endregion\n\n\n //#region If a single CTR had been found...\n\n if (processedFiles.length == 1)\n {\n\n const processedFile = processedFiles[0];\n if (processedFile)\n {\n\n if (chargeTransparencyRecord.IsAChargeTransparencyRecord(processedFile.result))\n return this.processChargeTransparencyRecord(processedFile.result);\n\n if (chargeTransparencyLiveLink.IsAChargeTransparencyLiveLink(processedFile.result))\n return processedFile.result;\n\n if (publicKeyInfo.IsAPublicKeyLookup(processedFile.result))\n return {\n status: chargyInterfaces.SessionVerificationResult.InvalidSessionFormat,\n message: this.GetLocalizedMessage(\"UnknownOrInvalidChargeTransparencyRecord\"),\n certainty: 0\n };\n\n // Can only be an ISessionCryptoResult/error message!\n return processedFile.result;\n\n }\n\n return {\n status: chargyInterfaces.SessionVerificationResult.InvalidSessionFormat,\n message: this.GetLocalizedMessage(\"UnknownOrInvalidChargeTransparencyRecord\"),\n certainty: 0\n };\n\n }\n\n //#endregion\n\n //#region If multiple CTR had been found => Merge them into a single CTR!\n\n else if (processedFiles.length > 1)\n {\n\n const mergedCTR:chargeTransparencyRecord.IChargeTransparencyRecord = {\n \"@id\": \"\",\n \"@context\": \"\",\n certainty: 0\n };\n\n for (const processedFile of processedFiles)\n {\n\n const processedFileResult = processedFile.result;\n\n if (chargeTransparencyRecord.IsAChargeTransparencyRecord(processedFileResult))\n {\n\n if (mergedCTR[\"@id\"] === \"\")\n mergedCTR[\"@id\"] = processedFileResult[\"@id\"];\n\n if (mergedCTR[\"@context\"] === \"\")\n mergedCTR[\"@context\"] = processedFileResult[\"@context\"];\n\n if (!mergedCTR.begin || (mergedCTR.begin && processedFileResult.begin && mergedCTR.begin > processedFileResult.begin))\n mergedCTR.begin = processedFileResult.begin;\n\n if (!mergedCTR.end || (mergedCTR.end && processedFileResult.end && mergedCTR.end < processedFileResult.end))\n mergedCTR.end = processedFileResult.end;\n\n if (!mergedCTR.description)\n mergedCTR.description = processedFileResult.description;\n\n //ToDo: Is this a really good idea? Or should we fail, whenever this information is different?\n if (!mergedCTR.contract)\n mergedCTR.contract = processedFileResult.contract;\n\n\n if (!mergedCTR.chargingStationOperators)\n mergedCTR.chargingStationOperators = processedFileResult.chargingStationOperators;\n else if (processedFileResult.chargingStationOperators)\n for (const chargingStationOperator of processedFileResult.chargingStationOperators)\n mergedCTR.chargingStationOperators.push(chargingStationOperator);\n\n if (!mergedCTR.chargingPools)\n mergedCTR.chargingPools = processedFileResult.chargingPools;\n else if (processedFileResult.chargingPools)\n for (const chargingPool of processedFileResult.chargingPools)\n mergedCTR.chargingPools.push(chargingPool);\n\n if (!mergedCTR.chargingStations)\n mergedCTR.chargingStations = processedFileResult.chargingStations;\n else if (processedFileResult.chargingStations)\n for (const chargingStation of processedFileResult.chargingStations)\n mergedCTR.chargingStations.push(chargingStation);\n\n // publicKeys\n\n if (!mergedCTR.chargingSessions)\n mergedCTR.chargingSessions = processedFileResult.chargingSessions;\n else if (processedFileResult.chargingSessions)\n for (const chargingSession of processedFileResult.chargingSessions)\n mergedCTR.chargingSessions.push(chargingSession);\n\n if (!mergedCTR.eMobilityProviders)\n mergedCTR.eMobilityProviders = processedFileResult.eMobilityProviders;\n else if (processedFileResult.eMobilityProviders)\n for (const eMobilityProvider of processedFileResult.eMobilityProviders)\n mergedCTR.eMobilityProviders.push(eMobilityProvider);\n\n if (!mergedCTR.mediationServices)\n mergedCTR.mediationServices = processedFileResult.mediationServices;\n else if (processedFileResult.mediationServices)\n for (const mediationService of processedFileResult.mediationServices)\n mergedCTR.mediationServices.push(mediationService);\n\n }\n\n else if (publicKeyInfo.IsAPublicKeyInfo(processedFileResult))\n {\n\n if (!mergedCTR.publicKeys)\n mergedCTR.publicKeys = new Array<publicKeyInfo.IPublicKeyInfo>();\n\n mergedCTR.publicKeys.push(processedFileResult);\n\n }\n\n else if (publicKeyInfo.IsAPublicKeyLookup(processedFileResult))\n {\n\n if (!mergedCTR.publicKeys)\n mergedCTR.publicKeys = new Array<publicKeyInfo.IPublicKeyInfo>();\n\n for (const publicKey of processedFileResult.publicKeys)\n mergedCTR.publicKeys.push(publicKey);\n\n }\n\n else\n {\n\n if (mergedCTR.invalidDataSets === undefined)\n mergedCTR.invalidDataSets = new Array<chargeTransparencyRecord.IExtendedFileInfo>();\n\n mergedCTR.invalidDataSets.push(processedFile);\n\n }\n\n }\n\n if (chargeTransparencyRecord.IsAChargeTransparencyRecord(mergedCTR))\n return this.processChargeTransparencyRecord(mergedCTR);\n\n }\n\n //#endregion\n\n return {\n status: chargyInterfaces.SessionVerificationResult.InvalidSessionFormat,\n message: this.GetLocalizedMessage(\"No charge transparency records found!\"),\n certainty: 0\n }\n\n }\n\n //#endregion\n\n //#region (private) processChargeTransparencyRecord(CTR)\n\n private async processChargeTransparencyRecord(CTR: chargeTransparencyRecord.IChargeTransparencyRecord): Promise<chargeTransparencyRecord.IChargeTransparencyRecord|chargyInterfaces.ISessionCryptoResult>\n {\n\n //#region Initial checks\n\n if (!chargeTransparencyRecord.IsAChargeTransparencyRecord(CTR))\n return {\n status: chargyInterfaces.SessionVerificationResult.InvalidSessionFormat,\n message: this.GetLocalizedMessage(\"UnknownOrInvalidJSONChargeTransparencyFormat\"),\n certainty: 0\n }\n\n //#endregion\n\n //#region Data\n\n this.chargingStationOperators = [];\n this.chargingPools = [];\n this.chargingStations = [];\n this.EVSEs = [];\n this.meters = [];\n this.chargingSessions = [];\n\n this.eMobilityProviders = [];\n this.mediationServices = [];\n\n //#endregion\n\n //ToDo: Verify @context\n\n try\n {\n\n // We operate on an agumented copy of the data!\n this.internalCTR = chargeTransparencyRecord.CloneCTR(CTR);\n this.currentCTR = CTR;\n\n //#region Process operators (pools, stations, evses, tariffs, ...)\n\n if (this.internalCTR.chargingStationOperators)\n {\n\n for (const chargingStationOperator of this.internalCTR.chargingStationOperators)\n {\n\n this.chargingStationOperators.push(chargingStationOperator);\n\n if (chargingStationOperator.chargingPools) {\n\n for (const chargingPool of chargingStationOperator.chargingPools)\n {\n\n this.chargingPools.push(chargingPool);\n\n if (chargingPool.chargingStations)\n {\n\n for (const chargingStation of chargingPool.chargingStations)\n {\n\n this.chargingStations.push(chargingStation);\n\n for (const EVSE of chargingStation.EVSEs)\n {\n\n EVSE.chargingStation = chargingStation;\n EVSE.chargingStationId = chargingStation[\"@id\"];\n\n this.EVSEs.push(EVSE);\n\n for (const meter of EVSE.meters)\n {\n\n meter.EVSE = EVSE;\n meter.EVSEId = EVSE[\"@id\"];\n\n meter.chargingStation = chargingStation;\n meter.chargingStationId = chargingStation[\"@id\"];\n\n this.meters.push(meter);\n\n }\n\n }\n\n }\n\n }\n\n }\n\n }\n\n if (chargingStationOperator.chargingStations)\n {\n\n for (const chargingStation of chargingStationOperator.chargingStations)\n {\n\n this.chargingStations.push(chargingStation);\n\n for (const EVSE of chargingStation.EVSEs)\n {\n\n EVSE.chargingStation = chargingStation;\n EVSE.chargingStationId = chargingStation[\"@id\"];\n\n this.EVSEs.push(EVSE);\n\n for (const meter of EVSE.meters)\n {\n\n meter.EVSE = EVSE;\n meter.EVSEId = EVSE[\"@id\"];\n\n meter.chargingStation = chargingStation;\n meter.chargingStationId = chargingStation[\"@id\"];\n\n this.meters.push(meter);\n\n }\n\n }\n\n }\n\n }\n\n if (chargingStationOperator.EVSEs) {\n\n for (const EVSE of chargingStationOperator.EVSEs)\n {\n\n // EVSE.chargingStation = chargingStation;\n // EVSE.chargingStationId = chargingStation[\"@id\"];\n\n this.EVSEs.push(EVSE);\n\n for (const meter of EVSE.meters)\n {\n\n meter.EVSE = EVSE;\n meter.EVSEId = EVSE[\"@id\"];\n\n // meter.chargingStation = chargingStation;\n // meter.chargingStationId = chargingStation[\"@id\"];\n\n this.meters.push(meter);\n\n }\n\n }\n\n }\n\n }\n\n }\n\n //#endregion\n\n //#region Process pools ( stations, evses, tariffs, ...)\n\n if (this.internalCTR.chargingPools) {\n\n for (const chargingPool of this.internalCTR.chargingPools)\n {\n\n this.chargingPools.push(chargingPool);\n\n if (chargingPool.chargingStations)\n {\n\n for (const chargingStation of chargingPool.chargingStations)\n {\n\n this.chargingStations.push(chargingStation);\n\n for (const EVSE of chargingStation.EVSEs)\n {\n\n EVSE.chargingStation = chargingStation;\n EVSE.chargingStationId = chargingStation[\"@id\"];\n\n this.EVSEs.push(EVSE);\n\n for (const meter of EVSE.meters)\n {\n\n meter.EVSE = EVSE;\n meter.EVSEId = EVSE[\"@id\"];\n\n meter.chargingStation = chargingStation;\n meter.chargingStationId = chargingStation[\"@id\"];\n\n this.meters.push(meter);\n\n }\n\n }\n\n }\n\n }\n\n }\n\n }\n\n //#endregion\n\n //#region Process stations ( evses, tariffs, ...)\n\n if (this.internalCTR.chargingStations) {\n\n for (const chargingStation of this.internalCTR.chargingStations)\n {\n\n this.chargingStations.push(chargingStation);\n\n for (const EVSE of chargingStation.EVSEs)\n {\n\n EVSE.chargingStation = chargingStation;\n EVSE.chargingStationId = chargingStation[\"@id\"];\n\n this.EVSEs.push(EVSE);\n\n for (const meter of EVSE.meters)\n {\n\n meter.EVSE = EVSE;\n meter.EVSEId = EVSE[\"@id\"];\n\n meter.chargingStation = chargingStation;\n meter.chargingStationId = chargingStation[\"@id\"];\n\n this.meters.push(meter);\n\n }\n\n }\n\n if (chargingStation.meters) {\n\n for (const meter of chargingStation.meters)\n {\n\n meter.chargingStation = chargingStation;\n meter.chargingStationId = chargingStation[\"@id\"];\n\n this.meters.push(meter);\n\n }\n\n }\n\n }\n\n }\n\n //#endregion\n\n if (this.internalCTR.chargingSessions)\n {\n for (const chargingSession of this.internalCTR.chargingSessions)\n {\n chargingSession.ctr = this.internalCTR;\n chargingSession.verificationResult = await this.processChargingSession(chargingSession);\n this.chargingSessions.push(chargingSession);\n }\n }\n\n return this.internalCTR;\n\n }\n catch (exception)\n {\n return {\n status: chargyInterfaces.SessionVerificationResult.InvalidSessionFormat,\n message: \"Exception occured: \" + (exception instanceof Error ? exception.message : String(exception)),\n certainty: 0\n }\n }\n\n }\n\n //#endregion\n\n //#region (private) processChargingSession(chargingSession)\n\n private async processChargingSession(chargingSession: chargeTransparencyRecord.IChargingSession) : Promise<chargyInterfaces.ISessionCryptoResult>\n {\n\n //ToDo: Verify @id exists\n //ToDo: Verify @context\n //ToDo: Verify begin & end\n //ToDo: Verify chargingStationOperatorId => set chargingStationOperator\n //ToDo: Verify chargingPoolId => set chargingPool\n //ToDo: Verify chargingStationId => set chargingStation\n //ToDo: Verify EVSEId => set EVSE\n //ToDo: Verify meterId => set meter\n //ToDo: Verify tariffId => set tariff\n //ToDo: Verify measurements exists & count >= 1\n\n switch (chargingSession[\"@context\"])\n {\n\n case \"https://open.charging.cloud/contexts/SessionSignatureFormats/GDFCrypt01+json\":\n chargingSession.method = new GDFCrypt01(this);\n return await chargingSession.method.VerifyChargingSession(chargingSession);\n\n case \"https://open.charging.cloud/contexts/SessionSignatureFormats/EMHCrypt01+json\":\n chargingSession.method = new EMHCrypt01(this);\n return await chargingSession.method.VerifyChargingSession(chargingSession);\n\n case \"https://open.charging.cloud/contexts/SessionSignatureFormats/OCMFv1.0+json\":\n chargingSession.method = new OCMFv1_x(this);\n return await chargingSession.method.VerifyChargingSession(chargingSession);\n\n case \"https://open.charging.cloud/contexts/SessionSignatureFormats/ChargePointCrypt01+json\":\n chargingSession.method = new ChargePointCrypt01(this);\n return await chargingSession.method.VerifyChargingSession(chargingSession);\n\n case \"https://open.charging.cloud/contexts/SessionSignatureFormats/AlfenCrypt01+json\":\n chargingSession.method = new AlfenCrypt01(this);\n return await chargingSession.method.VerifyChargingSession(chargingSession);\n\n case \"https://open.charging.cloud/contexts/SessionSignatureFormats/MennekesCrypt01+json\":\n chargingSession.method = new MennekesCrypt01(this);\n return await chargingSession.method.VerifyChargingSession(chargingSession);\n\n case \"https://open.charging.cloud/contexts/SessionSignatureFormats/PCDF+json\":\n chargingSession.method = new PCDFCrypt01(this);\n return await chargingSession.method.VerifyChargingSession(chargingSession);\n\n case \"https://open.charging.cloud/contexts/SessionSignatureFormats/bsm-ws36a-v0+json\":\n chargingSession.method = new BSMCrypt01(this);\n return await chargingSession.method.VerifyChargingSession(chargingSession);\n\n default:\n return {\n status: chargyInterfaces.SessionVerificationResult.UnknownSessionFormat,\n message: this.GetLocalizedMessage(\"UnknownOrInvalidChargingSessionFormat\"),\n certainty: 0\n }\n\n }\n\n }\n\n //#endregion\n\n\n\n\n public MergeChargeTransparencyRecords(CTRs: Array<chargeTransparencyRecord.IChargeTransparencyRecord>): chargeTransparencyRecord.IChargeTransparencyRecord\n {\n\n const mergedCTR:chargeTransparencyRecord.IChargeTransparencyRecord = {\n \"@id\": \"\",\n \"@context\": \"\",\n certainty: 0\n };\n\n for (const ctr of CTRs)\n {\n\n //Note: the CTRs might have different @context values and additional context/format specific data!\n\n if (mergedCTR[\"@id\"] === \"\")\n mergedCTR[\"@id\"] = ctr[\"@id\"];\n\n if (mergedCTR[\"@context\"] === \"\")\n mergedCTR[\"@context\"] = ctr[\"@context\"];\n\n if (!mergedCTR.begin || (mergedCTR.begin && ctr.begin && mergedCTR.begin > ctr.begin))\n mergedCTR.begin = ctr.begin;\n\n if (!mergedCTR.end || (mergedCTR.end && ctr.end && mergedCTR.end < ctr.end))\n mergedCTR.end = ctr.end;\n\n if (!mergedCTR.description)\n mergedCTR.description = ctr.description;\n\n //ToDo: Is this a really good idea? Or should we fail, whenever this information is different?\n if (!mergedCTR.contract)\n mergedCTR.contract = ctr.contract;\n\n\n if (!mergedCTR.chargingStationOperators)\n mergedCTR.chargingStationOperators = ctr.chargingStationOperators;\n else if (ctr.chargingStationOperators)\n for (const chargingStationOperator of ctr.chargingStationOperators)\n mergedCTR.chargingStationOperators.push(chargingStationOperator);\n\n if (!mergedCTR.chargingPools)\n mergedCTR.chargingPools = ctr.chargingPools;\n else if (ctr.chargingPools)\n for (const chargingPool of ctr.chargingPools)\n mergedCTR.chargingPools.push(chargingPool);\n\n if (!mergedCTR.chargingStations)\n mergedCTR.chargingStations = ctr.chargingStations;\n else if (ctr.chargingStations)\n for (const chargingStation of ctr.chargingStations)\n mergedCTR.chargingStations.push(chargingStation);\n\n // publicKeys\n\n if (!mergedCTR.chargingSessions)\n mergedCTR.chargingSessions = ctr.chargingSessions;\n else if (ctr.chargingSessions)\n for (const chargingSession of ctr.chargingSessions)\n mergedCTR.chargingSessions.push(chargingSession);\n\n if (!mergedCTR.eMobilityProviders)\n mergedCTR.eMobilityProviders = ctr.eMobilityProviders;\n else if (ctr.eMobilityProviders)\n for (const eMobilityProvider of ctr.eMobilityProviders)\n mergedCTR.eMobilityProviders.push(eMobilityProvider);\n\n if (!mergedCTR.mediationServices)\n mergedCTR.mediationServices = ctr.mediationServices;\n else if (ctr.mediationServices)\n for (const mediationService of ctr.mediationServices)\n mergedCTR.mediationServices.push(mediationService);\n\n }\n\n return mergedCTR;\n\n }\n\n}\n","/*\n * Copyright (c) 2018-2026 GraphDefined GmbH <achim.friedland@graphdefined.com>\n * This file is part of Chargy Desktop App <https://github.com/OpenChargingCloud/ChargyDesktopApp>\n *\n * Licensed under the Affero GPL license, Version 3.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.gnu.org/licenses/agpl.html\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n isISessionCryptoResult1,\n SessionVerificationResult\n} from './interfaces/chargyInterfaces';\nimport type {\n ISessionCryptoResult\n} from './interfaces/chargyInterfaces';\nimport type {\n IChargeTransparencyRecord\n} from './interfaces/IChargeTransparencyRecord';\n\n/**\n * Extracts the per-session verification results from a verified Charge Transparency\n * Record. When the record carries no usable session results, a single \"no charge\n * transparency records found\" result is returned instead.\n *\n * This is exactly the payload the renderer hands to the main process (and, in\n * --nogui / HTTP mode, to the CLI verification service) after a verification. It\n * is kept here as a pure, DOM-free function so the renderer (ChargyApp), the main\n * process and the tests can all share the very same logic instead of mirroring it.\n *\n * The \"no records found\" message is passed in so the renderer can localize it,\n * while non-UI callers (CLI service, tests) get a sensible English default.\n */\nexport function toSessionVerificationResults(\n CTR: IChargeTransparencyRecord,\n noRecordsMessage: string = \"No charge transparency records found!\"\n): ISessionCryptoResult[] | ISessionCryptoResult\n{\n\n const verificationResults = (CTR.chargingSessions ?? [])\n .map(session => session.verificationResult)\n .filter(isISessionCryptoResult1);\n\n if (verificationResults.length > 0)\n return verificationResults;\n\n return {\n status: SessionVerificationResult.Unvalidated,\n message: noRecordsMessage,\n certainty: 0\n };\n\n}\n"]}