1# [libcbor](https://github.com/PJK/libcbor) 2 3[](https://circleci.com/gh/PJK/libcbor/tree/master) 4[](https://readthedocs.org/projects/libcbor/?badge=latest) 5[](https://repology.org/project/libcbor/versions) 6[](https://codecov.io/gh/PJK/libcbor) 7 8**libcbor** is a C library for parsing and generating [CBOR](https://cbor.io/), the general-purpose schema-less binary data format. 9 10## Main features 11 12- Complete CBOR [IETF RFC 8949 (STD 94)](https://www.rfc-editor.org/info/std94) specification conformance (previously known as [RFC 7049](https://www.rfc-editor.org/info/rfc7049)) 13- Supports CBOR Sequences ([RFC 8742](https://datatracker.ietf.org/doc/html/rfc8742)) 14- Robust platform-independent C99 implementation, tested on 15 - Linux, OS X, Windows, BSD 16 - x86(_64), arm(64), mips(el), riscv64 17- Layered architecture offers both control and convenience 18- Flexible memory management 19- No shared global state - threading friendly 20- Proper handling of UTF-8 21- Full support for streams & incremental processing 22- Extensive documentation and test suite 23- No runtime dependencies, small footprint 24 25## References 26 27libcbor is most prominently used in: 28 29- Yubico's [libfido2](https://developers.yubico.com/libfido2/) 2FA security key implementation 30- Amazon's [AWS C SDK](https://github.com/awslabs/aws-c-common) 31- Gnome [fwdup](https://github.com/fwupd/fwupd/blob/main/meson.build#L339) 32- Alibaba's [Inclavare librats](https://github.com/inclavare-containers/librats) 33- [QEMU](https://wiki.qemu.org/ChangeLog/9.2) 34- [ITK](https://docs.itk.org/projects/wasm/en/latest/introduction/parts.html) 35 36It found its way into many open source an proprietary projects. If you run among others [OpenSSH](https://www.matbra.com/2020/02/17/using-fido2-with-ssh.html), [Microsoft PowerShell](https://github.com/PowerShell/libcbor), [SteamOS](https://github.com/randombk/steamos-teardown/blob/5a37d977fae55d9c41eaf1d07528fa965740bb26/docs/packages.md?plain=1#L461), or [MySQL](https://dev.mysql.com/doc/relnotes/mysql/8.0/en/news-8-0-34.html) -- you might be indirectly running libcbor too. 37 38Also, thank you for the shout out in <https://github.com/oz123/awesome-c?tab=readme-ov-file#others>! 39 40## Getting started 41 42### Compile from source 43 44```bash 45git clone https://github.com/PJK/libcbor 46cmake -DCMAKE_BUILD_TYPE=Release libcbor 47make 48make install 49``` 50 51### Homebrew 52 53```bash 54brew install libcbor 55``` 56 57### Ubuntu 18.04 and above 58 59```bash 60sudo add-apt-repository universe 61sudo apt-get install libcbor-dev 62``` 63 64### Fedora & RPM friends 65 66```bash 67yum install libcbor-devel 68``` 69 70### Include git repository using using CMake 71 72See e.g. <https://github.com/inclavare-containers/librats/blob/master/cmake/LibCBOR.cmake>. 73 74## Include git repository using Bazel 75 76See <https://github.com/PJK/libcbor/tree/master/examples/bazel>. 77 78### Others 79 80<details> 81 <summary>Packaged libcbor is available from 15+ major repositories. Click here for more detail</summary> 82 83 [](https://repology.org/project/libcbor/versions) 84</details> 85 86## Usage example 87 88```c 89#include <cbor.h> 90#include <stdio.h> 91 92int main(void) { 93 /* Preallocate the map structure */ 94 cbor_item_t* root = cbor_new_definite_map(2); 95 /* Add the content */ 96 bool success = cbor_map_add( 97 root, (struct cbor_pair){ 98 .key = cbor_move(cbor_build_string("Is CBOR awesome?")), 99 .value = cbor_move(cbor_build_bool(true))}); 100 success &= cbor_map_add( 101 root, (struct cbor_pair){ 102 .key = cbor_move(cbor_build_uint8(42)), 103 .value = cbor_move(cbor_build_string("Is the answer"))}); 104 if (!success) return 1; 105 /* Output: `length` bytes of data in the `buffer` */ 106 unsigned char* buffer; 107 size_t buffer_size; 108 cbor_serialize_alloc(root, &buffer, &buffer_size); 109 110 fwrite(buffer, 1, buffer_size, stdout); 111 free(buffer); 112 113 fflush(stdout); 114 cbor_decref(&root); 115} 116``` 117 118## Documentation 119 120Crash course: <https://libcbor.readthedocs.io/en/latest/tutorial.html#crash-course> 121 122Get the latest documentation at [libcbor.readthedocs.org](http://libcbor.readthedocs.org/) 123 124## Contributions 125 126Bug reports and contributions are welcome. Please see [CONTRIBUTING.md](https://github.com/PJK/libcbor/blob/master/CONTRIBUTING.md) for more info. 127 128Kudos to all the [contributors](https://github.com/PJK/libcbor/graphs/contributors)! 129 130## License 131 132The MIT License (MIT) 133 134Copyright (c) Pavel Kalvoda, 2014-2020 135 136Permission is hereby granted, free of charge, to any person obtaining a copy 137of this software and associated documentation files (the "Software"), to deal 138in the Software without restriction, including without limitation the rights 139to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 140copies of the Software, and to permit persons to whom the Software is 141furnished to do so, subject to the following conditions: 142 143The above copyright notice and this permission notice shall be included in all 144copies or substantial portions of the Software. 145 146THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 147IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 148FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 149AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 150LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 151OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 152SOFTWARE. 153