### Install jsSHA for Browser and Node.js Source: https://github.com/skatteetaten/saf-t/blob/master/Digital Signature Validator/jsSHA-2.3.1/README.md Instructions for installing jsSHA in both browser and Node.js environments. For browsers, include the relevant JavaScript file. For Node.js, use npm to install and then require the module. ```html ``` ```bash npm install jssha ``` ```javascript jsSHA = require("jssha"); ``` -------------------------------- ### Initialize Tipped Tooltips with jQuery Source: https://github.com/skatteetaten/saf-t/blob/master/Digital Signature Validator/tipped-4.6.0-light/example/index.html This snippet demonstrates how to initialize Tipped.js tooltips on elements with the class 'box' within elements with the class 'boxes' using jQuery. It ensures the DOM is ready before execution. No external dependencies beyond Tipped.js and jQuery are explicitly mentioned. ```javascript $(document).ready(function() { Tipped.create('.boxes .box'); }); ``` -------------------------------- ### Calculate SHA-512 Hash with jsSHA Source: https://github.com/skatteetaten/saf-t/blob/master/Digital Signature Validator/jsSHA-2.3.1/README.md Example demonstrating how to calculate a SHA-512 hash using jsSHA. It involves instantiating the jsSHA object with the desired algorithm and input type, updating the object with input data, and then retrieving the hash in HEX format. ```javascript var shaObj = new jsSHA("SHA-512", "TEXT"); shaObj.update("This is a "); shaObj.update("test"); var hash = shaObj.getHash("HEX"); ``` -------------------------------- ### Calculate SHA-512 HMAC with jsSHA Source: https://github.com/skatteetaten/saf-t/blob/master/Digital Signature Validator/jsSHA-2.3.1/README.md Example showcasing how to compute a SHA-512 HMAC using jsSHA. This process includes setting the HMAC key before updating the object with the message data and then retrieving the HMAC in HEX format. ```javascript var shaObj = new jsSHA("SHA-512", "TEXT"); shaObj.setHMACKey("abc", "TEXT"); shaObj.update("This is a "); shaObj.update("test"); var hmac = shaObj.getHMAC("HEX"); ``` -------------------------------- ### Error Handling for SAF-T Financial XML Validation with xmllint Source: https://context7.com/skatteetaten/saf-t/llms.txt This example shows how to perform validation of a SAF-T Financial XML file using `xmllint` and capture any validation errors to standard error for logging or user feedback. It checks if the validation command succeeds or fails. ```bash if xmllint --noout --schema Norwegian_SAF-T_Financial_Schema_v_1.10.xsd myfile.xml 2>&1; then echo "Validation successful" else echo "Validation failed - check XML structure" fi ``` -------------------------------- ### File Hashing with jsSHA in JavaScript Source: https://github.com/skatteetaten/saf-t/blob/master/Digital Signature Validator/jsSHA-2.3.1/test/hash-file.html This JavaScript code calculates SHA hashes for a file using the jsSHA library. It reads the file in chunks to manage memory usage and handles potential file reading errors. The function updates multiple hashers concurrently and displays the progress and final hash values. ```javascript var chunkSize = Math.pow(10, 5) function errorHandler(evt) { switch(evt.target.error.code) { case evt.target.error.NOT_FOUND_ERR: alert('File Not Found!') break case evt.target.error.NOT_READABLE_ERR: alert('File is not readable') break case evt.target.error.ABORT_ERR: break // noop default: alert('An error occurred reading this file.') } } function readFile(hasher1, hasher224, hasher256, hasher384, hasher512, file, start, stop) { var progress = document.querySelector('#progress') stop = (stop <= file.size) ? stop : file.size var reader = new FileReader() reader.onerror = errorHandler reader.onloadend = function(evt) { if (evt.target.readyState == FileReader.DONE) { hasher1.update(evt.target.result) hasher224.update(evt.target.result) hasher256.update(evt.target.result) hasher384.update(evt.target.result) hasher512.update(evt.target.result) var percent = Math.round((stop / file.size) * 100) progress.innerHTML = 'Progress: ' + percent + '%' if (stop == file.size) { progress.innerHTML = ""; result1 = hasher1.getHash('HEX') result224 = hasher224.getHash('HEX') result256 = hasher256.getHash('HEX') result384 = hasher384.getHash('HEX') result512 = hasher512.getHash('HEX') progress.innerHTML += '

SHA-1: ' + result1 + '

'; progress.innerHTML += '

SHA-224: ' + result224 + '

'; progress.innerHTML += '

SHA-256: ' + result256 + '

'; progress.innerHTML += '

SHA-384: ' + result384 + '

'; progress.innerHTML += '

SHA-512: ' + result512 + '

'; } else { readFile(hasher1, hasher224, hasher256, hasher384, hasher512, file, start + chunkSize, stop + chunkSize) } } } var blob = file.slice(start, stop) reader.readAsBinaryString(blob) } function handleFileSelect(input) { var progress = document.querySelector('#progress') progress.innerHTML = 'Progress: 0%'; var file = input.files[0]; var hasher1 = new jsSHA('SHA-1', 'BYTES') var hasher224 = new jsSHA('SHA-224', 'BYTES') var hasher256 = new jsSHA('SHA-256', 'BYTES') var hasher384 = new jsSHA('SHA-384', 'BYTES') var hasher512 = new jsSHA('SHA-512', 'BYTES') readFile(hasher1, hasher224, hasher256, hasher384, hasher512, file, 0, chunkSize) } ``` -------------------------------- ### SAF-T Cash Register XML Schema Example Source: https://context7.com/skatteetaten/saf-t/llms.txt This XML snippet demonstrates the structure of a SAF-T Cash Register transaction export file, including header information, company details, location, and individual cash transactions with digital signatures for integrity verification. It adheres to the Norwegian_SAF-T_Cash_Register_Schema_v_1.00.xsd. ```xml
2021 2021-03-01 2021-03-30 NOK 2021-03-30 10:40:00 Your Cash Register System 1.0 Your Company 1.00
999999999 Example Store AS LOC001 Main Store REG001 01 2021-03-30 10:39:00 1 125.00 100.00 iHh68DWCU3G42eL/7vOGUMSkvMM=
``` -------------------------------- ### SAF-T Financial XML: Standard Account Mapping Example Source: https://context7.com/skatteetaten/saf-t/llms.txt This XML snippet illustrates how to map a company's account (e.g., '1500' for 'Kundefordringer') to a Norwegian standard accounting classification ID (e.g., '15') within a SAF-T Financial XML file. It also shows an alternative method using `GroupingCategory` and `GroupingCode`. ```xml 1500 Kundefordringer 15 GL ``` -------------------------------- ### Compile jsSHA with Google Closure Compiler Source: https://github.com/skatteetaten/saf-t/blob/master/Digital Signature Validator/jsSHA-2.3.1/README.md Command to compile the jsSHA library using Google Closure Compiler. This allows for customized output by defining which algorithms to support using a bitwise OR flag. ```bash java -jar compiler.jar --define="SUPPORTED_ALGS=" \ --externs /path/to/build/externs.js --warning_level VERBOSE \ --compilation_level ADVANCED_OPTIMIZATIONS \ --js /path/to/sha_dev.js --js_output_file /path/to/sha.js ``` -------------------------------- ### XSD Schema Validation with xmllint for SAF-T Financial XML Source: https://context7.com/skatteetaten/saf-t/llms.txt This command demonstrates how to validate a SAF-T Financial XML file against its corresponding XSD schema using the `xmllint` tool. This process ensures that the XML file conforms to the expected structure and data types before submission to tax authorities. The `--noout` flag suppresses the output of the XML content itself, and the `--schema` flag specifies the schema file to use for validation. ```bash # Validate SAF-T Financial XML file against schema xmllint --noout --schema Norwegian_SAF-T_Financial_Schema_v_1.10.xsd \ "Example Files/ExampleFile SAF-T Financial_888888888_20180228235959.xml" # Expected output on success: # ExampleFile SAF-T Financial_888888888_20180228235959.xml validates ``` -------------------------------- ### Validate SAF-T Cash Register XML with xmllint Source: https://context7.com/skatteetaten/saf-t/llms.txt This snippet demonstrates how to validate a SAF-T Cash Register XML file against its schema using the `xmllint` command-line tool. It requires the XML file and the corresponding schema file. ```bash xmllint --noout --schema Norwegian_SAF-T_Cash_Register_Schema_v_1.00.xsd \n "Example Files/ExampleFile SAF-T Cash Register_999999999_20210330104000.xml" ``` -------------------------------- ### RSA Digital Signature Generation in JavaScript for SAF-T Cash Registers Source: https://context7.com/skatteetaten/saf-t/llms.txt This JavaScript code demonstrates how to generate and verify RSA-SHA1-1024 digital signatures for SAF-T cash register transactions using the KJUR.crypto.Signature library. It requires the data to be signed, a private key for signing, and a public key for verification. The output is a Base64-encoded signature. ```javascript // Generate RSA signature using the validator.js functions // Data format: signature_from_previous;transDate;transTime;nr;transAmntIn;transAmntEx // Example data to sign var dataToSign = "0;2024-12-28;14:30:00;123456789;1250.00;1000.00"; // Private key in PEM format (1024-bit RSA) var privateKey = `-----BEGIN RSA PRIVATE KEY----- MIICXQIBAAKBgQC3...your_private_key_here... -----END RSA PRIVATE KEY-----`; // Public key in PEM format var publicKey = `-----BEGIN PUBLIC KEY----- MIGfMA0GCSqGSIb3...your_public_key_here... -----END PUBLIC KEY-----`; // Generate signature using KJUR.crypto.Signature var sig = new KJUR.crypto.Signature({"alg": "SHA1withRSA"}); sig.init(privateKey); sig.updateString(dataToSign); var hSigVal = sig.sign(); var signature = hex2b64(hSigVal); console.log("Generated Signature:", signature); // Output: Base64-encoded signature string // Verify the signature var sig2 = new KJUR.crypto.Signature({"alg": "SHA1withRSA"}); sig2.init(publicKey); sig2.updateString(dataToSign); var isValid = sig2.verify(hSigVal); console.log("Signature Valid:", isValid); // Output: true ``` -------------------------------- ### HMAC Digital Signature Generation in JavaScript for SAF-T Cash Registers Source: https://context7.com/skatteetaten/saf-t/llms.txt This JavaScript code demonstrates HMAC-SHA1-128 signature generation and verification for SAF-T cash register transactions using the jsSHA library. It's suitable for systems with simpler cryptographic needs. The code includes generating the signature from data and a secret key, and then verifying it by regenerating and comparing. ```javascript // Generate HMAC-SHA1 signature // Data format: signature_from_previous;transDate;transTime;nr;transAmntIn;transAmntEx var dataToSign = "0;2024-12-28;14:30:00;123456789;1250.00;1000.00"; // Secret key (16 bytes = 128 bits for TEXT format) var secretKey = "SkatteetatenSign"; // Generate HMAC signature using jsSHA library var hmacObj = new jsSHA("SHA-1", "TEXT"); hmacObj.setHMACKey(secretKey, "TEXT"); hmacObj.update(dataToSign); var signature = hmacObj.getHMAC("B64"); console.log("HMAC Signature:", signature); // Output: iHh68DWCU3G42eL/7vOGUMSkvMM= // Verify by regenerating and comparing var hmacVerify = new jsSHA("SHA-1", "TEXT"); hmacVerify.setHMACKey(secretKey, "TEXT"); hmacVerify.update(dataToSign); var verifySignature = hmacVerify.getHMAC("B64"); var isValid = (signature === verifySignature); console.log("Signature Valid:", isValid); // Output: true // Convert secret key to Base64 for Altinn product declaration var secretKeyBase64 = utf8tob64(secretKey); console.log("Secret Key (Base64):", secretKeyBase64); // Output: U2thdHRlZXRhdGVuU2lnbg== ``` -------------------------------- ### JavaScript: Validate SAF-T Transaction Data Format Source: https://context7.com/skatteetaten/saf-t/llms.txt This JavaScript function, `validateTransactionData`, checks if a semicolon-separated string of transaction data conforms to the expected format. It validates the number of fields, date format (YYYY-MM-DD), time format (HH:MM:SS), and amount formats (decimal with 2 places) before signature generation. ```javascript // Validate complete transaction data string before signing function validateTransactionData(txt) { var parts = txt.split(";"); if (parts.length < 6) { throw new Error("Invalid format: Expected 6 semicolon-separated fields"); } // Validate each field var signature = parts[0]; // Previous signature or "0" for first transaction var transDate = parts[1]; // Format: YYYY-MM-DD var transTime = parts[2]; // Format: HH:MM:SS var nr = parts[3]; // Transaction number (max 35 chars) var amountIn = parts[4]; // Amount with VAT (decimal with 2 places) var amountEx = parts[5]; // Amount without VAT (decimal with 2 places) // Date validation (YYYY-MM-DD) if (!/^\d{4}-\d{2}-\d{2}$/.test(transDate)) { throw new Error("Invalid date format: Use YYYY-MM-DD"); } // Time validation (HH:MM:SS) if (!/^(?:2[0-3]|[01][0-9]):[0-5][0-9]:[0-5][0-9]$/.test(transTime)) { throw new Error("Invalid time format: Use HH:MM:SS"); } // Amount validation (decimal with 2 places) if (!/^-?[0-9]+[.]([0-9]{2})?$/.test(amountIn)) { throw new Error("Invalid amount format: Use decimal with 2 places (e.g., 1250.00)"); } return true; } // Usage example try { var txData = "0;2024-12-28;14:30:00;123456789;1250.00;1000.00"; validateTransactionData(txData); console.log("Transaction data is valid"); // Proceed with signature generation } catch (error) { console.error("Validation error:", error.message); } ``` === COMPLETE CONTENT === This response contains all available snippets from this library. No additional content exists. Do not make further requests.