{"id":41468401,"url":"https://github.com/laurencelundblade/t_cose","last_synced_at":"2026-01-23T16:38:11.401Z","repository":{"id":36349131,"uuid":"182541210","full_name":"laurencelundblade/t_cose","owner":"laurencelundblade","description":"Commercial quality COSE_Sign1 implementation in C for constrained environment. Works with MbtedTLS and OpenSSL Crypto.","archived":false,"fork":false,"pushed_at":"2026-01-18T04:38:02.000Z","size":1772,"stargazers_count":32,"open_issues_count":36,"forks_count":29,"subscribers_count":4,"default_branch":"master","last_synced_at":"2026-01-18T15:12:02.671Z","etag":null,"topics":["c","cose","cose-sign1","iot","rfc-8152","rfc-9052"],"latest_commit_sha":null,"homepage":"","language":"C","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-3-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/laurencelundblade.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"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":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2019-04-21T14:05:52.000Z","updated_at":"2026-01-09T12:25:29.000Z","dependencies_parsed_at":"2026-01-18T06:03:57.587Z","dependency_job_id":null,"html_url":"https://github.com/laurencelundblade/t_cose","commit_stats":null,"previous_names":[],"tags_count":10,"template":false,"template_full_name":null,"purl":"pkg:github/laurencelundblade/t_cose","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/laurencelundblade%2Ft_cose","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/laurencelundblade%2Ft_cose/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/laurencelundblade%2Ft_cose/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/laurencelundblade%2Ft_cose/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/laurencelundblade","download_url":"https://codeload.github.com/laurencelundblade/t_cose/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/laurencelundblade%2Ft_cose/sbom","scorecard":{"id":580022,"data":{"date":"2025-08-11","repo":{"name":"github.com/laurencelundblade/t_cose","commit":"64fbc64dd5982a7f75834d2b9a2a8c9ba8207776"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":4.2,"checks":[{"name":"Maintained","score":0,"reason":"0 commit(s) and 1 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Code-Review","score":2,"reason":"Found 8/29 approved changesets -- score normalized to 2","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Security-Policy","score":10,"reason":"security policy file detected","details":["Info: security policy file detected: SECURITY.md:1","Info: Found linked content: SECURITY.md:1","Info: Found disclosure, vulnerability, and/or timelines in security policy: SECURITY.md:1","Info: Found text in security policy: SECURITY.md:1"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/ci.yml:1","Info: topLevel permissions set to 'read-all': .github/workflows/pages.yml:9","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:43: update your workflow using https://app.stepsecurity.io/secureworkflow/laurencelundblade/t_cose/ci.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:59: update your workflow using https://app.stepsecurity.io/secureworkflow/laurencelundblade/t_cose/ci.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:73: update your workflow using https://app.stepsecurity.io/secureworkflow/laurencelundblade/t_cose/ci.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/pages.yml:19: update your workflow using https://app.stepsecurity.io/secureworkflow/laurencelundblade/t_cose/pages.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/pages.yml:28: update your workflow using https://app.stepsecurity.io/secureworkflow/laurencelundblade/t_cose/pages.yml/master?enable=pin","Info:   0 out of   4 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   1 third-party GitHubAction dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: BSD 3-Clause \"New\" or \"Revised\" License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'","Warn: branch protection not enabled for branch 'dev'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 25 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-20T18:57:05.182Z","repository_id":36349131,"created_at":"2025-08-20T18:57:05.182Z","updated_at":"2025-08-20T18:57:05.182Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28695659,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-23T15:57:05.722Z","status":"ssl_error","status_checked_at":"2026-01-23T15:56:27.656Z","response_time":59,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["c","cose","cose-sign1","iot","rfc-8152","rfc-9052"],"created_at":"2026-01-23T16:38:11.286Z","updated_at":"2026-01-23T16:38:11.393Z","avatar_url":"https://github.com/laurencelundblade.png","language":"C","funding_links":[],"categories":[],"sub_categories":[],"readme":"![t_cose](https://github.com/laurencelundblade/t_cose/blob/master/t-cose-logo.png?raw=true)\n\n\n*t_cose* implements enough of COSE to support [CBOR Web Token, RFC 8392](https://tools.ietf.org/html/rfc8392)  \nand [Entity Attestation Token (EAT)](https://tools.ietf.org/html/draft-ietf-rats-eat-01). \nThis is the COSE_Sign1 part of [COSE, RFC 9052](https://tools.ietf.org/html/rfc9052). \n\n**Implemented in C with minimal dependency** – There are three main \ndependencies: 1) [QCBOR](https://github.com/laurencelundblade/QCBOR),\n2) A cryptographic library for ECDSA and SHA-2, 3) C99, \u003cstdint.h\u003e,\n\u003cstddef.h\u003e, \u003cstdbool.h\u003e and \u003cstring.h\u003e.  It is  highly\nportable to different HW, OS's and cryptographic libraries. Except for\nsome minor configuration for the cryptographic library, no #ifdefs or\ncompiler options need to be set for it to run correctly.\n\n**Crypto Library Integration Layer** – Works with different cryptographic\nlibraries via a simple integration layer. The integration layer is kept small and simple, \njust enough for the use cases, so that integration is simpler. Integration layers for \nthe OpenSSL and ARM Mbed TLS (PSA Cryptography API) cryptographic libraries \nare included.\n\n**Secure coding style** – Uses a construct called UsefulBuf / q_useful_buf as a\ndiscipline for safe coding and handling of binary data.\n\n**Small simple memory model** – Malloc is not needed. Besides the\ncryptographic library and payload buffer, about 600 bytes of heap/stack is needed\nfor signing and 1500 bytes for verifying. The caller supplies the output buffer\nand context structures so the caller has control over memory usage making it\nuseful for embedded implementations that have to run in small fixed memory.\n\n## Documentation\n\n[API documentation is here](https://www.securitytheory.com/t_cose-docs)\n\n\n## Code Status\n\nAs of March 2022, the code is in good working order and the public interface has been\nstable for over a year.\n\nIntegration with the [OpenSSL](https://www.openssl.org) and [Arm Mbed\nTLS](https://github.com/ARMmbed/mbedtls) cryptographic libraries is\nfully supported.\n\nt_cose 1.0 only supports COSE Sign1, signing with one recipeint.\n\n\n## t_cose 2.0\n\nAs of August 2022, there are alpha releases of t_cose 2.0. It supports:\n* COSE_Sign\n* Multiple signatures\n* COSE_MAC0\n* COSE_Encrypt and COSE_Encrypt0\n* Encryption with ECDH per RFC 9053\n\nSee the dev branch and the releases.\n\n## Building and Dependencies\n\nExcept for the crypto library set up, t_cose is very portable and\nshould largely just work in any environment. It needs a few standard\nlibraries and [QCBOR](https://github.com/laurencelundblade/QCBOR)\n(which is also very portable). Hence most of this section is about\ncrypto library set up.\n\n### QCBOR\n\nIf QCBOR is installed in /usr/local, then the makefiles should find\nit. If not then QCBOR may need to be downloaded. The makefiles can be\nmodified to reference it other than in /usr/local.\n\nThis works with both QCBOR v1 and v2. When running with v2 it\nuses the QCBOR v1 compatibility mode for tag decoding.\n\n### Supported Cryptographic Libraries\n\nHere's three crypto library configurations that are supported. Others\ncan be added with relative ease.\n\n#### Test Crypto -- Makefile.test\n\nThis configuration should work instantly on any device and is useful\nto do a large amount of testing with, but can't be put to full\ncommercial use. What it lacks is integration with an ECDSA\nimplementation so it can't produce real ECDSA signatures. It does\nhowever produce fake signatures called \"short-circuit\nsignatures\" that are very useful for testing. See header\ndocumentation for details on short-circuit sigs.\n\nThis configuration (and only this configuration) uses a bundled\nSHA-256 implementation (SHA-256 is simple and easy to bundle, ECDSA is\nnot).\n\nTo build run:\n\n    make -f Makefile.test\n\n#### OpenSSL Crypto -- Makefile.ossl\n\nThis OpenSSL integration supports SHA-256, SHA-384 and SHA-512 with\nECDSA, EdDSA, or RSAPSS to support the COSE algorithms ES256, ES384 and\nES512, PS256, PS384 and PS512. It is a full and tested integration\nwith OpenSSL crypto.\n\nIf OpenSSL is installed in /usr/local or as a standar library, you can\nprobably just run make:\n\n    make -f Makefile.ossl\n\nThe specific things that Makefile.ossl does is:\n    * Links the crypto_adapters/t_cose_openssl_crypto.o into libt_cose.a\n    * Links test/test/t_cose_make_openssl_test_key.o into the test binary\n    * `#define T_COSE_USE_OPENSSL_CRYPTO`\n\nt_cose is regularly tested against OpenSSL 1.1.1 and 3.0.\n\nThe crypto adaptor for OpenSSL is about twice the size of that for\nMbed TLS because the API doesn't line up well with the needs for COSE\n(OpenSSL is ASN.1/DER oriented). Memory allocation is performed inside\nOpenSSL and in the crypto adaptation layer. This makes the OpenSSL\ncrypto library less suitable for embedded use.\n\nNo deprecated or to-be-deprecated APIs are used.\n\nThere are several different sets of APIs in OpenSSL that can be used\nto implement ECDSA and hashing. The ones chosen are the most official\nand well-supported, however others might suit particular uses cases\nbetter.  An older t_cose used some to-be-deprecated APIs and is a more\nefficient than this one.  It is unfortunate that these APIs\n(ECDSA_do_sign and ECDSA_do_verify) are slated for deprecation and\nthere is no supported alternative to those that work only with DER-encoded\nsignatures.\n\nThere are no known problems with the code and test coverage for the\nadaptor is good. Not every single memory allocation failure has\ntest coverage, but the code should handle them all correctly.\n\n\n#### PSA Crypto -- Makefile.psa\n\nAs of March 2022, t_cose works with the PSA 1.0 Crypto API as\nimplemented by Mbed TLS 2.x and 3.x.\n\nThis integration supports SHA-256, SHA-384 and SHA-512 with\nECDSA, EdDSA or RSAPSS to support the COSE algorithms ES256, ES384 and\nES512, PS256, PS384 and PS512.\n\nIf Mbed TLS is installed in /usr/local, you can probably just run\nmake:\n\n    make -f Makefile.psa\n\nIf this doesn't work or you have Mbed TLS elsewhere edit the makefile.\n\nThe specific things that Makefile.psa does is:\n    * Links the crypto_adapters/t_cose_psa_crypto.o into libt_cose.a\n    * Links test/test/t_cose_make_psa_test_key.o into the test binary\n    * `#define T_COSE_USE_PSA_CRYPTO`   \n\nThis crypto adapter is small and simple. The adapter allocates no\nmemory and as far as I know it internally allocates no memory. It is a\ngood choice for embedded use.\n\nIt makes use of the 1.0 version of the PSA cryptographic API.  No\ndeprecated or to-be-deprecated functions are called (an older t_cose\nused some to be deprecated APIs).\n\nIt is regularly tested against the latest version 2 and version 3 of\nMbed TLS, an implementation of the PSA crypto API.\n\nConfidence in the adaptor code is high and reasonably well tested\nbecause it is simple.\n\n\n### General Crypto Library Strategy\n\nThe functions that t_cose needs from the crypto library are all\ndefined in src/t_cose_crypto.h.  This is a porting or adaption\nlayer. There are no #ifdefs in the main t_cose code for different\ncrypto libraries. When it needs a crypto function it just calls the\ninterface defined in t_cose_crypto.h.\n\nWhen integrating t_cose with a new cryptographic library, what is\nnecessary is to write some code, an \"adaptor\", that implements\nt_cose_crypto.h using the new target cryptographic library. This can\nbe done without changes to any t_cose code for many cryptographic\nlibraries. See the interface documentation in t_cose_crypto.h for what\nneeds to be implemented.\n\nThat said, there is one case where t_cose source code needs to be\nmodified. This is for hash algorithm implementations that are linked\ninto and run inline with t_cose and that have a context structure. In\nthis case t_cose_crypto.h should be modified to use that context\nstructure. Use the OpenSSL configuration as an example.\n\nTo complete the set up for a new cryptographic library and test it, a\nnew test adaptation file is also needed. This file makes public key\npairs of the correct type for use with testing.  This file is usually\nnamed test/t_cose_make_xxxx_test_key.c and is linked in with the test\napp. The keys it makes are passed through t_cose untouched, through\nthe t_cose_crypto.h interface into the underlying crypto.\n\n\n## Memory Usage\n\n### Code \n\nHere are code sizes on 64-bit x86 optimized for size\n\n     |                           | smallest | largest |  \n     |---------------------------|----------|---------|\n     | signing only              |     1500 |    2300 |\n     | verification only         |     2500 |    3300 |\n     | common to sign and verify |     (500)|    (800)|\n     | combined                  |     3500 |    4800 |\n     \nThings that make the code smaller:\n* PSA / Mbed crypto takes less code to interface with than OpenSSL\n* gcc is usually smaller than llvm because stack guards are off by default\n* Use only 256-bit crypto with the T_COSE_DISABLE_ESXXX options\n* Disable short-circut sig debug faclity T_COSE_DISABLE_SHORT_CIRCUIT_SIGN\n* Disable the content type header T_COSE_DISABLE_CONTENT_TYPE\n\n#### Change in code size with spiffy decode\n\nThe encode size is as before.\n\nCompared to the previous t_cose, the code size for decoding/verifying\nis reduced by about 600 bytes. However, spiffy decode functions in\nQCBOR are now required and they are about 2KB, so there is a net size\nincrease of 1.4KB. But use of spiffy decode will also make other parts\nof the overall SW stack smaller, perhaps by a lot, so this will likely\nbreak even. For example, EAT or CWT decoding will be reduced a lot\nthrough use of spiffy decode.  Basically, the more CBOR maps a SW\nstack has to handle, the more saving there will be from spiffy decode.\n\n\n### Heap and stack\n\nMalloc is not used.\n\nStack usage is variable depending on the key and hash size and the\nstack usage by the cryptographic library that performs the hash and\npublic key crypto functions.  The maximum requirement is roughly\n2KB. This is an estimate from examining the code, not an actual\nmeasurement.\n\nSince the keys, hash outputs and signatures are stored on the stack,\nthe stronger the security, the more stack is used. By default up to\n512 bit EC is enabled. Disable 512 and 384 bit EC to reduce stack\nusage by about 100 bytes.\n\nDifferent cryptographic libraries may have very different stack usage\ncharacteristics.  For example if one use malloc rather than the stack,\nit will (hopefully) use less stack.  The guess estimate range of usage\nby the cryptographic library is between 64 and 1024 bytes of stack.\n\nAside from the cryptographic library, the base stack use by t_cose is\n500 bytes for signing and 1500 bytes for verification. With a large\ncryptographic library, the total is about 1500 bytes for signing and\n2000 bytes for verification (for verification, the crypto library\nstack re uses stack used to decode header parameters so the increment\nisn't so large).\n\nThe design is such that only one copy of the output, the COSE_Sign1,\nneed be in memory.  It makes use of special features in QCBOR that\nallows contstuction of the output including the payload, using just\nthe single output buffer to accomplish this.\n\nA buffer to hold the signed COSE result must be passed in. It must be\nabout 100 bytes larger than the combined size of the payload and key\nid for ECDSA 256. It can be allocated as the caller wishes.\n\n### Crypto library memory usage\nIn addition to the above memory usage, the crypto library will use\nsome stack and/or heap memory. This will vary quite a bit by crypto\nlibrary. Some may use malloc. Some may not.\n\nThe OpenSSL library does use malloc, even with ECDSA. Another\nimplementation of ECDSA might not use malloc, as the keys are small\nenough.\n\n### Mixed code style\nQCBOR uses camelCase and t_cose follows \n[Arm's coding guidelines](https://git.trustedfirmware.org/TF-M/trusted-firmware-m.git/tree/docs/contributing/coding_guide.rst)\nresulting in code with mixed styles. For better or worse, an Arm-style version of UsefulBuf\nis created and used and so there is a duplicate of UsefulBuf. The two are identical. They\njust have different names.\n\n## Limitations \n\n* Most inputs and outputs must be in a continguous buffer. One\n  exception to this is that CBOR payloads being signed can be\n  constructed piecemeal into the output buffer and signed without\n  using a separate buffer.\n* Doesn't handle COSE string algorithm IDs. Only COSE integer\n  algorithm IDs are handled.  Thus far no string algorithm IDs have\n  been assigned by IANA.\n* No way to add custom headers when creating signed messages or\n  process them during verification.\n* Does not handle CBOR indefinite length strings (indefinite length\n  maps and arrays are handled).\n* Counter signatures are not supported.\n\n## Credit\n\n* Paul Liétar for RSA PSS (PS256..PS512) and EdDSA\n* Maik Riechert for cmake, CI and other.\n* Ken Takayama for the bulk of the detached content implementation.\n* Tamas Ban for lots code review comments, design ideas and porting to ARM PSA.\n* Rob Coombs, Shebu Varghese Kuriakose and other ARM folks for sponsorship.\n* Michael Eckel for makefile fixes.\n\n## Copyright and License\n\nt_cose is available under the 3-Clause BSD License.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flaurencelundblade%2Ft_cose","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flaurencelundblade%2Ft_cose","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flaurencelundblade%2Ft_cose/lists"}