{"id":50907818,"url":"https://github.com/aniketc068/atick-dotnet","last_synced_at":"2026-06-16T07:01:18.174Z","repository":{"id":364302815,"uuid":"1267318482","full_name":"Aniketc068/ATick-DotNet","owner":"Aniketc068","description":"Standalone PDF digital-signature library for .NET — PAdES/CMS signing (PFX/PEM, deferred eSign/HSM/token), RFC-3161 timestamps, long-term validation, and a green-tick verified appearance Adobe shows as valid. One NuGet package, cross-platform.","archived":false,"fork":false,"pushed_at":"2026-06-12T13:11:33.000Z","size":15263,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-12T14:23:49.605Z","etag":null,"topics":["csharp","digital-signature","dotnet","esign","nuget","pades","pdf","pdf-signature"],"latest_commit_sha":null,"homepage":"https://atick-dotnet.readthedocs.io/","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"agpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Aniketc068.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":"NOTICE","maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-06-12T12:34:19.000Z","updated_at":"2026-06-12T13:11:38.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/Aniketc068/ATick-DotNet","commit_stats":null,"previous_names":["aniketc068/atick-dotnet"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/Aniketc068/ATick-DotNet","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Aniketc068%2FATick-DotNet","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Aniketc068%2FATick-DotNet/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Aniketc068%2FATick-DotNet/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Aniketc068%2FATick-DotNet/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Aniketc068","download_url":"https://codeload.github.com/Aniketc068/ATick-DotNet/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Aniketc068%2FATick-DotNet/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34393305,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-16T02:00:06.860Z","response_time":126,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["csharp","digital-signature","dotnet","esign","nuget","pades","pdf","pdf-signature"],"created_at":"2026-06-16T07:00:33.485Z","updated_at":"2026-06-16T07:01:18.164Z","avatar_url":"https://github.com/Aniketc068.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\n\u003cimg src=\"https://raw.githubusercontent.com/Aniketc068/ATick-DotNet/main/assets/atick_logo.png\" alt=\"ATick\" width=\"260\"/\u003e\n\n# ATick for .NET\n\n**Standalone PDF digital-signature library for .NET — PAdES / CMS signing with no external services.**\n\n[![NuGet](https://img.shields.io/nuget/v/ATick?color=2ea44f\u0026label=nuget)](https://www.nuget.org/packages/ATick/)\n[![.NET](https://img.shields.io/badge/.NET-Framework%202.0%20to%20latest-512BD4)](https://dotnet.microsoft.com/)\n[![PAdES](https://img.shields.io/badge/PAdES-B--B%20%7C%20B--T%20%7C%20B--LT%20%7C%20B--LTA-success)](#pades-levels)\n[![Cross-platform](https://img.shields.io/badge/platform-Windows%20%7C%20Linux%20%7C%20macOS-brightgreen)](#compatibility--one-package-everywhere)\n[![License: AGPL v3](https://img.shields.io/badge/license-AGPL--3.0-blue)](LICENSE)\n[![Also for Python](https://img.shields.io/badge/also%20for-Python-3776AB?logo=python\u0026logoColor=white)](https://github.com/Aniketc068/ATick-Python)\n[![Also for Java](https://img.shields.io/badge/also%20for-Java-007396?logo=openjdk\u0026logoColor=white)](https://github.com/Aniketc068/ATick-Java)\n[![Also for Node.js](https://img.shields.io/badge/also%20for-Node.js-339933?logo=node.js\u0026logoColor=white)](https://github.com/Aniketc068/ATick-Node)\n[![Also for PHP](https://img.shields.io/badge/also%20for-PHP-777BB4?logo=php\u0026logoColor=white)](https://github.com/Aniketc068/ATick-PHP)\n\n\u003c/div\u003e\n\n**Also available in other languages** — the same ATick engine, the same API, native to each ecosystem:\n\n| Language | Install | Source · Docs |\n|---|---|---|\n| **Python** | `pip install atick` | [ATick-Python](https://github.com/Aniketc068/ATick-Python) · [docs](https://atick.readthedocs.io/) |\n| **Java** | `io.github.aniketc068:atick` (Maven) | [ATick-Java](https://github.com/Aniketc068/ATick-Java) · [docs](https://atick-java.readthedocs.io/) |\n| **Node.js** | `npm install atick` | [ATick-Node](https://github.com/Aniketc068/ATick-Node) · [docs](https://atick-node.readthedocs.io/) |\n| **PHP** | `composer require aniketc068/atick` | [ATick-PHP](https://github.com/Aniketc068/ATick-PHP) · [docs](https://atick-php.readthedocs.io/) |\n\n---\n\nATick signs PDFs the way Adobe Acrobat and the EU DSS do — **PAdES baseline** signatures with\ntimestamps and long-term validation. It calls a bundled native engine through **P/Invoke**, so there\nis **no external service** and **nothing to configure**. The matching engine for your OS/arch ships\n**inside the package** and is loaded automatically. Add one NuGet package and you are done.\n\n```csharp\nusing Aniketc068.ATick;\n\nbyte[] pdf = File.ReadAllBytes(\"doc.pdf\");\nbyte[] pfx = File.ReadAllBytes(\"my.pfx\");\n\nbyte[] signed = Atick.SignPfx(pdf, pfx,\n    \"{\\\"password\\\":\\\"••••\\\",\\\"cn\\\":\\\"Aniket Chaturvedi\\\",\\\"reason\\\":\\\"Approved\\\",\" +\n    \"\\\"green_tick\\\":true,\\\"page\\\":1,\\\"rect\\\":[300,55,575,175],\" +\n    \"\\\"pades\\\":true,\\\"timestamp\\\":true,\\\"ltv\\\":true}\");   // PAdES-B-LT\n\nFile.WriteAllBytes(\"signed.pdf\", signed);\n```\n\n---\n\n## The green tick your readers trust\n\nATick draws a verified-signature appearance with a green tick. When the certificate is valid and\ntrusted, Adobe Reader / Acrobat shows **“Signed and all signatures are valid.”**\n\n\u003cdiv align=\"center\"\u003e\n\u003cimg src=\"https://raw.githubusercontent.com/Aniketc068/ATick-DotNet/main/assets/valid_signature_adobe.png\" alt=\"Adobe — signed and all signatures are valid\" width=\"560\"/\u003e\n\u003c/div\u003e\n\nAdobe colours that same mark by the signature's real status — you don't draw these, Adobe does:\n\n\u003ctable align=\"center\"\u003e\n\u003ctr\u003e\n\u003ctd align=\"center\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/Aniketc068/ATick-DotNet/main/assets/signature_appearance.png\" width=\"190\"/\u003e\u003cbr/\u003e\u003cb\u003eValid \u0026amp; trusted\u003c/b\u003e\u003cbr/\u003egreen tick\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/Aniketc068/ATick-DotNet/main/assets/sig_unknown.png\" width=\"190\"/\u003e\u003cbr/\u003e\u003cb\u003eValidity unknown\u003c/b\u003e\u003cbr/\u003eyellow “?”\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/Aniketc068/ATick-DotNet/main/assets/sig_notverified.png\" width=\"190\"/\u003e\u003cbr/\u003e\u003cb\u003eNot verified\u003c/b\u003e\u003cbr/\u003e“?” not validated\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/Aniketc068/ATick-DotNet/main/assets/sig_invalid.png\" width=\"190\"/\u003e\u003cbr/\u003e\u003cb\u003eInvalid\u003c/b\u003e\u003cbr/\u003ered cross\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/table\u003e\n\nThe **green** tick appears only when the signature is valid *and* the certificate chains to a root\nAdobe trusts.\n\n---\n\n## Why ATick\n\n| | ATick for .NET |\n|---|---|\n| **Zero external services** | the crypto, PKCS#12/PEM, image decode, timestamp \u0026 LTV are all in the engine |\n| **One package** | the native engine for every platform is bundled — `dotnet add package ATick` and run |\n| **Full PAdES** | B-B, B-T, B-LT, B-LTA — recognised by Adobe Acrobat as *“PAdES Signature Level”* |\n| **Deferred / remote keys** | two-step `Prepare` → external CMS → `Embed` for a token / HSM / smart-card / Windows store via your own provider |\n| **Cross-platform** | Windows (64/32-bit), Linux (x64/ARM64/ARM), macOS (Intel + Apple Silicon) — .NET 6 and up |\n| **Clear errors** | every failure is a normal `AtickException` you can catch |\n\n---\n\n## Features (A → Z)\n\n| Feature | How |\n|---|---|\n| **Sign with a `.pfx` / `.p12` / `.pem`** | `Atick.SignPfx(pdf, pfx, options)` — PKCS#12 or PEM (key + certs), auto-detected |\n| **PAdES levels** B-B / B-T / B-LT / B-LTA | `\"pades\":true` + `\"timestamp\":true` + `\"ltv\":true` + `\"lta\":true` |\n| **Hash algorithm** | `\"hash_algo\":\"sha256\" \\| \"sha384\" \\| \"sha512\"` |\n| **Timestamp authority** | built in — or your own with `\"tsa_url\":\"…\"` (and `\"tsa_auth\":[\"user\",\"pass\"]`) |\n| **Long-term validation (LTV)** | `\"ltv\":true` embeds the chain + revocation (CRL/OCSP) |\n| **Multi-page / custom coordinates** | `\"placements\":[[page,[x1,y1,x2,y2]], …]` |\n| **Signature layout** | `\"mode\":\"single\"` (one signature on many pages) · `\"mode\":\"shared\"` (many fields, same value) |\n| **Multi-signatory** | sign an already-signed PDF again — each signature is its own revision, all stay valid |\n| **Certification (DocMDP)** | `\"certify\":1` (no changes) · `2` (form filling) · `3` (form filling + annotations) |\n| **Field locking (FieldMDP)** | `\"lock_fields\":[\"*\"]` or `[\"FieldA\", …]` |\n| **Pre-sign checks** | `\"verify_expiry\":true`, `\"verify_crl\":true`, `\"verify_ocsp\":true` (or `\"verify\":true`) |\n| **Document metadata** | `Atick.SetMetadata(pdf, options)` |\n| **Password protection** | `\"encrypt_password\"` (+ `\"owner_password\"`) for output; `\"open_password\"` for input; `Atick.Decrypt(pdf, pw)` |\n| **Appearance** | options `cn, org, ou, location, reason, text, date, dn, body, heading, image` — auto-fit text, transparent logo |\n| **The mark** | the `?` (Adobe greens it), an always-green tick, or nothing — see [The mark](#the-mark) |\n| **CN on the left** (Adobe-style) | `\"image\":\"cn\"` |\n| **Distinguished name** | `\"dn\":\"CN=…, O=…, C=IN\"` |\n| **Custom-text-only appearance** | `\"body\":\"*APPROVED*\\nby *Aniket*\"` — `\\n` = line, `*x*` = bold |\n| **Invisible signature** | `\"placements\":[]` |\n| **Sign an already-signed PDF** | sign again (incremental) — existing signatures stay valid; use a fresh `\"field_name\"` |\n| **Container only** | `Atick.PrepareFields(pdf, options)` |\n| **Document timestamp** | `\"lta\":true` while signing; `Atick.AddDocTimestamp(pdf, options)` afterwards (PAdES-B-LTA) |\n| **Fast signing** | revocation cache (ON by default) — `Atick.SetFastSigning(false)` to disable |\n| **Deferred / eSign (2-step)** | `Atick.Prepare(pdf, options)` → external CMS → `Atick.Embed(prepared, cms)` |\n| **Detached CMS** | `Atick.CmsPfx(data, pfx, options)` |\n\n---\n\n## Install\n\n```bash\ndotnet add package ATick\n```\n\nor in your `.csproj`:\n\n```xml\n\u003cPackageReference Include=\"ATick\" Version=\"1.0.6\" /\u003e\n```\n\nThe native engine for your platform comes with the package — nothing else to install.\n\n---\n\n## Compatibility — one package everywhere\n\n- **Every .NET — .NET Framework 2.0 through the latest .NET.** The package multi-targets\n  `net20`, `net35`, `net40`, `net48`, `netstandard2.0`, `net6.0` and `net8.0`, so it works on old\n  .NET Framework (Windows 7 era) and on modern cross-platform .NET alike.\n- **Every OS/arch** — the package bundles a native engine per platform and .NET loads the right one:\n\n  | RID | Bundled |\n  |---|---|\n  | `win-x64` / `win-x86` | **Windows 7 and up**, 64 / 32-bit (one Windows-7-compatible engine covers Win 7 → 11) |\n  | `win-arm64` | Windows on ARM64 |\n  | `linux-x64` / `linux-arm64` / `linux-arm` | Linux x64 / ARM64 / ARM |\n  | `osx-x64` / `osx-arm64` | macOS Intel / Apple Silicon |\n\nOn modern .NET the engine is resolved per-RID automatically; on .NET Framework MSBuild targets copy\nthe right-arch engine next to your app and ATick pre-loads it. So `ATick` is one cross-platform\ndependency — just like `pip install atick` (Python) or `io.github.aniketc068:atick` (Java).\n\n---\n\n## The API\n\n```csharp\nAtick.SignPfx(pdf, pfx, optionsJson)          // sign with a .pfx / .p12 / .pem (auto-detected)\nAtick.Prepare(pdf, optionsJson)               // deferred / eSign: returns (Prepared, BytesToSign)\nAtick.CmsPfx(data, pfx, optionsJson)          // detached CMS over data\nAtick.Embed(prepared, cms)                    // embed a detached CMS into a prepared PDF\nAtick.PrepareFields(pdf, optionsJson)         // make an empty signature field (template)\nAtick.SignField(pdf, pfx, optionsJson)        // sign an existing empty field\nAtick.SetMetadata(pdf, optionsJson)           // Title / Author / Subject / Keywords / …\nAtick.AddDocTimestamp(pdf, optionsJson)       // archive DocTimeStamp (PAdES-B-LTA)\nAtick.SetFastSigning(true | false)            // revocation-cache toggle\nAtick.Decrypt(pdf, password)                  // decrypt a password-protected PDF\nAtick.Version()                               // engine version\n```\n\nAll options are a JSON string. Any failure throws `AtickException`.\n\n### Options (JSON)\n\n`cn, org, ou, location, reason, text, date, dn, body, heading, show_mark, green_tick, always_check,\nmark_color (hex / name / [r,g,b]), mark_gradient, mark_scale, text_color, bg_color, border, font_size,\nwidth, height, page, rect, placements ([[page,[x1,y1,x2,y2]], …]), mode (single/shared), field_name,\npades, hash_algo (sha256/384/512), timestamp, tsa_url, tsa_auth, ltv, lta, certify, lock_fields,\nverify, verify_expiry, verify_crl, verify_ocsp, open_password, encrypt_password, owner_password,\ncontents_size`.\n\n---\n\n## The mark\n\n```csharp\n\"{… ,\\\"green_tick\\\":true}\"      // the \"?\" mark — Adobe paints it GREEN for valid+trusted, RED if invalid\n\"{… ,\\\"always_check\\\":true}\"    // the green-tick graphic as the base\n\"{… ,\\\"green_tick\\\":false}\"     // no mark — a plain signature\n```\n\nColour it: `\"mark_color\":\"#E53935\"`, `\"blue\"`, `[255,140,0]` — or a gradient\n`\"mark_gradient\":[\"red\",\"orange\",\"yellow\"]`.\n\n---\n\n## Deferred signing \u0026 Indian eSign (two-step)\n\nWhen the private key lives elsewhere (a USB token / HSM / smart-card / Windows store via your own\nprovider, or an eSign ESP):\n\n```csharp\n// 1) prepare (no key): appearance + the exact bytes to sign\nvar (prepared, bytesToSign) = Atick.Prepare(pdf,\n    \"{\\\"cn\\\":\\\"DS TEST\\\",\\\"reason\\\":\\\"eSign\\\",\\\"placements\\\":[[1,[300,55,575,175]]],\\\"contents_size\\\":16384}\");\n\n// 2) your signer (token / HSM / eSign ESP) makes a DETACHED CMS over bytesToSign.\n//    The eSign InputHash is just the SHA-256 of bytesToSign:\nbyte[] digest = System.Security.Cryptography.SHA256.HashData(bytesToSign);\n//    ... sign with your provider, get back a detached CMS ...\n\n// 3) embed\nbyte[] signed = Atick.Embed(prepared, cms);\n```\n\n---\n\n## PAdES levels\n\n```csharp\nAtick.SignPfx(pdf, pfx, \"{… ,\\\"pades\\\":true}\")                                       // B-B\nAtick.SignPfx(pdf, pfx, \"{… ,\\\"pades\\\":true,\\\"timestamp\\\":true}\")                    // B-T\nAtick.SignPfx(pdf, pfx, \"{… ,\\\"pades\\\":true,\\\"timestamp\\\":true,\\\"ltv\\\":true}\")       // B-LT\nAtick.SignPfx(pdf, pfx, \"{… ,\\\"pades\\\":true,\\\"timestamp\\\":true,\\\"lta\\\":true}\")       // B-LTA\n```\n\n---\n\n## Examples\n\nSelf-contained console programs live in [`examples/`](examples/) — one per feature, mirroring the\nPython and Java examples (sign, PAdES levels, appearance, mark colours, hashes, certify/lock,\nmulti-placement, encrypted, multi-revision, dates, deferred eSign, document timestamp, metadata,\nfield API, PEM, verify, sign-already-signed, fast signing, container).\n\n```bash\ncd examples/SignPfx\ndotnet run\n```\n\n---\n\n## Errors\n\n```csharp\ntry\n{\n    Atick.SignPfx(pdf, pfx, \"{\\\"password\\\":\\\"wrong\\\"}\");\n}\ncatch (AtickException e)\n{\n    Console.WriteLine(\"signing failed: \" + e.Message);\n}\n```\n\n---\n\n## License\n\nATick is **dual-licensed** — free for personal \u0026 open use, paid if you sell:\n\n- **Free under [GNU AGPL-3.0](LICENSE)** — personal projects, learning, internal use, and\n  open-source projects (released publicly under AGPL-3.0).\n- **Commercial license (paid)** — if you **build a product with ATick and sell it**, or use it in a\n  **closed-source / commercial** product, you must buy a commercial license first. Contact\n  **aniketc.pro@gmail.com** for a quote.\n\nSee [LICENSING.md](LICENSING.md) for details. © 2026 Aniket Chaturvedi.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faniketc068%2Fatick-dotnet","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Faniketc068%2Fatick-dotnet","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faniketc068%2Fatick-dotnet/lists"}