{"id":17166386,"url":"https://github.com/andreaferretti/lethe","last_synced_at":"2025-10-08T06:49:41.613Z","repository":{"id":66316564,"uuid":"49272561","full_name":"andreaferretti/lethe","owner":"andreaferretti","description":"Oblivious RAM for Scala","archived":false,"fork":false,"pushed_at":"2021-01-21T10:51:49.000Z","size":439,"stargazers_count":19,"open_issues_count":1,"forks_count":2,"subscribers_count":13,"default_branch":"master","last_synced_at":"2025-04-13T15:05:35.327Z","etag":null,"topics":["path-oram","scala","searchable-encryption"],"latest_commit_sha":null,"homepage":"http://andreaferretti.github.io/lethe","language":"Scala","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/andreaferretti.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2016-01-08T13:07:20.000Z","updated_at":"2024-04-12T14:56:36.000Z","dependencies_parsed_at":"2023-02-24T16:45:43.708Z","dependency_job_id":null,"html_url":"https://github.com/andreaferretti/lethe","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/andreaferretti/lethe","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andreaferretti%2Flethe","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andreaferretti%2Flethe/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andreaferretti%2Flethe/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andreaferretti%2Flethe/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/andreaferretti","download_url":"https://codeload.github.com/andreaferretti/lethe/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andreaferretti%2Flethe/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":278903008,"owners_count":26065786,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-08T02:00:06.501Z","response_time":56,"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":["path-oram","scala","searchable-encryption"],"created_at":"2024-10-14T23:05:27.025Z","updated_at":"2025-10-08T06:49:41.608Z","avatar_url":"https://github.com/andreaferretti.png","language":"Scala","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Lethe\n\n![logo](https://raw.githubusercontent.com/andreaferretti/lethe/master/lethe.png)\n\nThis is a library designed to provide an [Oblivious RAM](http://outsourcedbits.org/2013/12/20/how-to-search-on-encrypted-data-part-4-oblivious-rams/)\nand some higher-level tools on top of it.\n\nMore specifically, Lethe is an implementation of [Path ORAM](https://eprint.iacr.org/2013/280.pdf).\n\nTable of contents\n-----------------\n\n\u003c!-- TOC depthFrom:1 depthTo:6 withLinks:1 updateOnSave:1 orderedList:0 --\u003e\n\n- [Lethe](#lethe)\n\t- [So, what is an oblivious RAM?](#so-what-is-an-oblivious-ram)\n\t- [Goals](#goals)\n\t- [Status](#status)\n\t- [Glossary](#glossary)\n\n\u003c!-- /TOC --\u003e\n\n## So, what is an oblivious RAM?\n\nIt is a model that helps when designing applications that delegate an untrusted\nserver with access to their data (think cloud computing). Of course, in such a\nsituation, one should encrypt the data on the client side.\n\n[Turns out](https://personal.utdallas.edu/~mxk055100/publications/ndss2012.pdf) this\nis [not enough](https://eprint.iacr.org/2013/163.pdf). Observation of the access\npatterns to the data can allow an attacker to gain significant information. As\nshown in the papers above, actual attacks can be mounted and this is not only a\ntheoretical concern.\n\nOblivious RAM models a random access data structure giving guarantees that the\nattacker will not learn anything other than the frequency of access and the\noverall size of data. Various techniques exist, all based on the idea of\ncontinuously shuffling memory as it is being accessed.\n\nLethe is an implementation of [Path ORAM](https://eprint.iacr.org/2013/280.pdf).\n\n## Goals\n\nThe end goal is to provide a complete implementation of Path ORAM in Scala, that\nworks both on the JVM and in [Scala.js](http://www.scala-js.org/).\n\nOn top of that, various higher-level features can be constructed:\n\n* data indices to allow serching encrypted data\n* support for SQL-like queries\n* [oblivious data structures](https://eprint.iacr.org/2014/185.pdf)\n\nEventually, the long term aim would be to provide a deployable server together\nwith a client library of data structures that can be mapped on the server and\nsome form of SQL support.\n\n## Status\n\nCurrently Lethe contains a basic implementation of Path ORAM that uses\n[ZeroMQ](http://zeromq.org/) to communicate synchronously with a server.\nThe server is very minimal, and can either work in memory, or use\n[LevelDB](https://github.com/wlu-mstr/leveldb-java) as a storage backend to\npersist data across sessions.\n\nA recursive form of the Path ORAM algorithm is used to minimize the amount of\ndata that the client has to keep.\n\nOn top of that, a very basic form of indexing is developed, allowing search\non both structured data and free text.\n\nA lot remains to be done, and here is a tentative plan:\n\n* Making it work in Scala.js. Most of the work is done: we have chosen\n  libraries that cross-compile, and the communication with the server itself\n  is handled by a very simple interface, allowing other transports than\n  ZeroMQ. But in the browser we cannot use a synchronous model of communication,\n  and this impacts the algorithms. Once everything is stable, we can port it\n  to an asynchronous model using [async/await](https://github.com/scala/async),\n  and then implement the relevant transport interface over AJAX.\n* The indexing technique is currently very rough, and only serves as a proof\n  of concept. We should develop more sophisticated, fast and flexible indices.\n* The server is currently not very robust and not designed to handle multiple\n  clients. It is ok just for the proof of concept, but is not in any sense an\n  actual usable server.\n* We could make use of something like [Catalyst](https://github.com/apache/spark/tree/master/sql/catalyst)\n  to parse SQL queries and translate them into a query plan that makes use of\n  random access as provided by the ORAM and indices. This would allow to\n  support a basic form of SQL in an oblivious manner.\n* The [oblivious data structures](https://eprint.iacr.org/2014/185.pdf) are not\n  implemented yet.\n* Implement integrity checks based on https://core.ac.uk/download/pdf/20024962.pdf\n* Implement [Lookahead ORAM](https://eprint.iacr.org/2018/268.pdf)\n\n\n## Glossary\n\nA `Remote` is an interface to read and write blocks of data, possibly to a\nserver. A trivial example is `MemoryRemote`, that just keeps the blocks in\nmemory without sending them at all. Alternatively, `ZMQRemote` talks to an\nactual remote ZeroMQ server.\n\nA `Serializer[A]` is used to convert between and `Array[Byte]` and back;\nby default we use BooPickle to handle this.\n\nA `Crypter` handles encryptions and decryption, working at the byte array\nlevel. An example is the `AESCrypter`.\n\nA `Client[A]` has access to all of them, and used this to talk to the server,\nsending and receiving encrypted instances of `A`. In particular,\n`StandardClient[A]` just puts together the three.\n\nAn `ORAM` has access to a `Client` that communicates to a server\nand makes sure that one can read or write instances of `Doc`, indexed by `Id`.\nThe `TrivialORAM` does this by always reading and writing back all\ndocuments for all operations.\n\n`PathORAM` does this by implementing the actual Path ORAM construction.\nThe index that maps each `Id` to the relative `Path` is kept abstract in\norder to handle recursion. In `LocalPathORAM`, we specialize the index\nto be a local `Map[Id, Path]`, while `RecursivePathORAM` stores the\nindex as an ORAM itself.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fandreaferretti%2Flethe","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fandreaferretti%2Flethe","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fandreaferretti%2Flethe/lists"}