{"action":"created","comment":{"url":"https://api.github.com/repos/dionyziz/rupture/pulls/comments/87641493","pull_request_review_id":8249493,"id":87641493,"diff_hunk":"@@ -986,19 +1061,380 @@ \\subsection{Amplified attack}\n Where $C$ is a negligible function.\n \\end{IEEEproof}\n \n-\\section{Defense}\\label{sec:defense}\n+\\subsection{Reflection game instances}\n+Having established our theoretical model, it is important to explain how\n+practical attacks can be described as instances of this model. For this case we\n+describe BREACH, CRIME, and TIME in the context of the reflection security model.\n+\n+\\subsubsection{BREACH}\n+As we described in section \\ref{subsec:example}, the adversary that issues the\n+BREACH attack fulfills some basic assumptions. He has found a vulnerable\n+endpoint in the web service under attack which allows him to inject a chosen\n+reflection in the response data along with a secret. He is also able to issue an\n+arbitrary amount of requests from the user's browser to said endpoint and\n+observe the encrypted network traffic.\n+\n+The challenger, in terms of the reflection game, is the server that handles the\n+user's request.\n+\n+The secret $s$ is a predefined data element in the\n+response that was generated by either a user or the service.\n+\n+The encryption algorithm and key are included in the implementation of the TLS\n+protocol. In most real-world systems, the encryption algorithm is AES and the\n+key is typically 128 or 256 bits. In relation to the reflection game, this is\n+represented by the $\\textrm{Enc}$ and the $KeyGen$ functions, whereas the AES\n+key used for the TLS application data is $sk$.\n+\n+The support of the distribution $\\mathcal{M}$ contains all strings that consist\n+of a known prefix concatenated with each character in the secret's alphabet. The\n+secret's alphabet is in general the digits and letters of the English alphabet.\n+In order to bootstrap the attack, the adversary already knows this prefix of the\n+secret.\n+\n+The adversary issues consecutive requests, each containing a candidate string\n+drawn from $\\mathcal{M}$ as the reflection. The secret also exists in the\n+support of $\\mathcal{M}$ so one of the reflections is bound to match it. The\n+goal of the adversary is to recognize which reflection that is.\n+\n+The reflection oracle constructs the encrypted responses by concatenating the\n+secret, the reflection, noise and static data and rendering them with function\n+$f$, compressing them with compression function $\\textrm{Com}$ and encrypting them with\n+the encryption algorithm $\\textrm{Enc}$. The reflection oracle in this case is the web\n+application framework that implements the encryption function and the underlying\n+web server that contains modules for compression and encryption. The final part\n+of the oracle, sending the ciphertext $c_i$ to the adversary, is impemented by\n+the Man-in-the-Middle module that gives the adversary the ability to monitor the\n+user's network traffic.\n+\n+The noise distribution $\\mathcal{V}$ contains strings with the same alphabet as\n+$\\mathcal{M}$. Noise data is generally unpredictable, so the adversary issues\n+multiple requests per reflection candidate in order to statistically bypass the\n+margin of error that noise introduces in the analysis. This is a practical\n+example of the amplified attack described in section \\ref{subsec:amplification}.\n+\n+The rendering function $f$ is the backend that generates the HTML response code.\n+The HTML contains the secret, the reflection, and the noise. All will be\n+compressed by the compression algorithm used by the web service, the most\n+commonly used being the DEFLATE algorithm. The DEFLATE algorithm is the\n+$\\textrm{Com}$ function in terms of the reflection game.\n+\n+The reflection $r$ consists of the known prefix concatenated with a single\n+character. In cases when $r$ matches a prefix of the secret $s$, the probability\n+of this prefix in the response data will be greater than in cases of no match.\n+Given this interdependence between the secret and the reflection the predicate\n+$Q$ of the secret is compression detectable by the reflection set. The\n+reflection vector $\\bar{r}$ contains strings $r_1, r_2, ...$, where $r_i$\n+consists of the known prefix concatenated with character $i$ in the secret's\n+alphabet.\n+\n+The predicate $Q$ in this case checks whether the prefix of $s$ is equal to a\n+certain value. Specifically, when $Q$ is detectable, the adversary is able to\n+find if the length of the response containing the reflection $r_1$ is less than\n+the response containing the reflection $r_2$. If that is the case, then\n+interdependence and compression idealness lead the adversary to conclude that\n+$r_1$ is a prefix of $s$, thus decrypting the character in the secret that\n+follows the known prefix.\n+\n+\\subsubsection{CRIME}\n+The CRIME attack is a similar to instance of the reflection game as BREACH, but\n+with a few key differences.\n+\n+The main difference is that CRIME targets HTTP requests instead of responses. In\n+this case, the challenger and the oracle exist in the user's browser. The secret\n+$s$ is a Cookie that is included in the request, whereas the reflection $r$ is\n+the same GET parameter described in BREACH.\n+\n+The rendering function $f$ is the browser's function that crafts the request\n+payload. The compression function $\\textrm{Com}$ and encryption function\n+$\\textrm{Enc}$ are again\n+the DEFLATE algorithm and the TLS protocol.\n+\n+The rest of the parameters are the same as in BREACH. The adversary follows the\n+same strategy in order to craft the reflections $r_1$ and $r_2$, compare\n+different size lengths of requests that contain each one along with $s$ and\n+decrypt a prefix os $s$.\n+\n+\\subsubsection{TIME}\n+The TIME attack's novelty is the absence of a MitM module and the usage of a\n+time side-channel. In this case, the adversary does not have access to the\n+length, as is the case in BREACH, but the timings of the responses.\n+\n+This attack measures the time until the response is complete. This time value\n+depends on the response length, since a longer response results in slower\n+network transmission. This demonstrates that interdependence of $r$ and $s$ and\n+compression idealness not only affects the length of the ciphertext, but also\n+the time needed for transmission.\n+\n+TIME as a reflection game instance is very close to BREACH. The main difference\n+is found in the oracle. In TIME the last part of the oracle, sending the\n+ciphertext $c$ to the adversary, is implemented in the same script that issues the\n+requests. Also the oracle does not send $c$ to the adversary, but\n+rather an approximation of $\\rvert c \\rvert$.\n+\n+\\section{Rupture: An improved attack}\\label{subsec:rupture}\n+Our contributions include the development development of a production-grade\n+framework for implementing this class of attacks called Rupture.\n+Rupture was developed as part of the work on extending the BREACH attack against\n+modern systems and block ciphers.\n+\n+As long as a vulnerable endpoint described in \\ref{sec:comattack} is found,\n+Rupture offers the ability to inject malicious code in any computer in the\n+network. This code would issue requests to the endpoint and serve as a caller of\n+the reflection oracle that is the endpoint.\n+\n+Furthermore, it enables the traffic inspection and analysis of packet\n+lengths. Encrypted network packets serve as the response $c_i$ from the\n+reflection oracle and the length of each packet is visible on the network and\n+captured.\n+\n+In addition, Rupture offers multiple instances of oracle $\\mathcal{O}_R$, based\n+on various $Q$ described in \\ref{subsec:parallel}, and enables the automated\n+computation of the reflection strings in each stage of the attack.\n+\n+Finally, it amplifies the attack by issuing multiple requests per candidate\n+symbol in alphabet $\\mathcal{S}$ in order to demonstrate better probability of\n+success. This is achieved by grouping requests in samplesets, where each\n+sampleset contains requests on a symbol in alphabet $\\mathcal{S}$. Requests in a\n+sampleset may be constructed to enable optimization methods described in\n+\\ref{subsec:blockalign} and \\ref{subsec:parallel}.\n+\n+Rupture issues the attack in rounds. Each round consists of phases, whose result\n+leads to the detection of property $Q$, where $Q$ is specified by the method of\n+attack described in \\ref{subsec:parallel}, with some confidence $n$. Confidence\n+is a metric calculated in bytes, that depicts the length difference between a\n+pair $r_1, r_2$ of requests that make property $Q$ of secret $s$ compression\n+detectable.\n+\n+\\subsection{Rupture architecture}\\label{app:rupture}\n+Rupture consists of multiple components that collaborate in executing\n+compression-based attacks, such as BREACH. Each component is autonomous and\n+communicates with the rest over the network.\n+\n+\\subsubsection{Client}\n+\n+The client component is a Javascript code that issues requests towards a chosen\n+endpoint. This endpoint should offer the functionality described in\n+\\ref{subsec:breachapp} and serve as the reflection oracle of the attack. The client\n+needs to be executed from the browser of the victim that the adversary is trying\n+to steal secrets from. That way, the victim's authentication cookies will be\n+included in the request and lead to the endpoint including secrets in the\n+response.\n+\n+The client contains minimal logic. It connects to the real-time service through\n+a command-and-control channel and registers itself there. Afterwards, it waits\n+for work instructions by the command-and-control channel, which it executes. The\n+client does not take any decisions or receive data about the progress of the\n+attack other than the work it is requested to do. This is intentional so as\n+to conceal the workings of the adversary analysis mechanisms from the victim\n+in case the victim attempts to reverse engineer what the adversary is doing.\n+Furthermore, it allows the system to be upgraded without having to deploy a\n+new client at the victim's network, which can be a difficult process.\n+\n+As a regular user is browsing the Internet, multiple clients will be\n+injected in insecure pages and they will run under various contexts. All of\n+them will register and maintain an open connection through a\n+command-and-control channel with the real-time service. The real-time\n+service will enable one of them for this victim, while keeping the others\n+dormant. The one enabled will then receive work instructions to perform the\n+required requests. If the enabled client dies for whatever reason, such as a\n+closed tab, one of the rest of the clients will be waken up to take over the\n+attack.\n+\n+\\subsubsection{Injector}\n+\n+The injector component is responsible for injecting code to the victim's\n+computer for execution. The injection is performed by ARP spoofing the local\n+network and forwarding all traffic in a Man-in-the-Middle manner. Since all HTTP\n+responses are infected, this provides for greatly increased robustness.\n+\n+The injector component needs to run on the victim network and as such is\n+light-weight and stateless. It can easily be deployed on a small machine and\n+used for massive attacks. Multiple injectors can be deployed to different\n+networks, all controlled by the same central command-and-control channel.\n+\n+\\subsubsection{Realtime}\n+\n+The realtime service is a service which awaits for work requests by clients. It\n+can handle multiple targets and victims. It receives command-and-control\n+connections from various clients which can live on different networks,\n+orchestrates them, and tells them which ones will remain dormant and which ones\n+will receive work, enabling one client per victim.\n+\n+It maintains open web socket command-and-control connections with clients and\n+connects to the backend service, facilitating the communication between the two.\n+\n+\\subsubsection{Sniffer}\n+\n+The sniffer component is responsible for collecting data directly from the\n+victim's network. As the client issues chosen plaintext requests, the sniffer\n+collects the respective ciphertext requests and ciphertext responses as they\n+travel on the network. These encrypted data are then transmitted to the backend\n+for further analysis and decryption.\n+\n+The sniffer component has access to the victim's network traffic and\n+keeps track of the encrypted communication between the victim and the endpoint.\n+The length of the packets is unencrypted, so the sniffer is able to collenct and\n+report the observations on the network to the backend component.\n+\n+The sniffer exposes an HTTP API which is utilized by the backend for controlling\n+when sniffing starts, when it is completed, and to retrieve the data that was\n+sniffed.\n+\n+\\subsubsection{Backend}\n+\n+The backend component is a Python code that controls the attack execution. It\n+initializes the attack and calculates the initial request sets that should be\n+collected. It is responsible for strategic decision taking, statistical\n+analysis of samples collected, adaptively advancing the attack, and storing\n+persistent data about the attacks in progress for future analysis.\n+\n+It communicates with the realtime component in order to guide the client as to\n+what requests need to be made at each stage of the attack. Meanwhile, it orders\n+the sniffer to listen and report network traffic, which is collected and stored\n+at the end of each phase of the attack. At each round, the backend analyzes the\n+sniffer reports and calculates the probability of success for the attack. At the\n+end of each round, property $Q$, which depends on the method of attack described\n+in \\ref{subsec:reflectionmethods}, is detected, until the entire secret is\n+calculated.\n+\n+   \\begin{figure}[thpb]\n+      \\centering\n+      \\includegraphics[width=0.48\\textwidth]{architecture.png}\n+      \\caption{Rupture Architecture}\n+   \\end{figure}\n+\n+\\subsection{Block alignment}\\label{subsec:blockalign}\n+Block ciphers are \\textit{length monotonic}, but not \\textit{strictly length\n+monotonic}, as described in section \\ref{subsec:lenmonotone}. Specifically, the\n+length of the encrypted text is rounded to a product of $\\mu$-bits, where $\\mu$\n+is the block size, using added padding. The same applies for stream ciphers,\n+whose functionality is similar to block ciphers with block size 1 byte. In this\n+case, plaintext length difference between two messages does not always result in\n+length difference between the respective encrypted ciphertext.\n+\n+It is possible to bypass this problem by using block alignment. Block alignment\n+techniques have already been explored in the literature \\cite{c14}.  This method\n+demands issuing multiple requests to the reflection oracle while including\n+artificial noise in the reflection string $r$.  That way, one out of\n+$\\ceil{\\mu / |r^i|}$ requests, where $|r^i|$ is the length of one digit of\n+$r$ in bits, will result in a block distinction between different reflection\n+strings $r_i$.\n+\n+\\subsection{Reflection computation methods}\\label{subsec:reflectionmethods}\n+Reflection strings $r$ should be polynomially computable, as defined in\n+\\ref{sec:propertycom}. BREACH, defined in \\ref{subsec:breachapp}, is\n+parameterized with an alphabet of ASCII symbols $\\mathcal{S}$ for each character of the\n+secret. A successful attack should distinguish a single character of the\n+alphabet as the correct one through a series of requests to the reflection\n+oracle.\n+\n+The first method of issuing requests is serial. Each request to the oracle\n+corresponds to a single character of the alphabet. An attack phase is completed\n+when requests have been issued for the entire alphabet.\n+\n+In this case, $Q$ is the property \"Given a known prefix $p_s$ of secret $s$ and\n+a symbol $t \\in \\mathcal{S}$, is $p_s:t$ a prefix of $s$?\" and $\\exists\n+s_i \\in \\mathcal{S}: Q(s_i)$ and $\\forall s_j \\in \\mathcal{S} \\setminus \\{s_i\\}:\n+\\lnot Q(s_j)$. The complexity of the attack is $\\mathcal{O}(|\\mathcal{S}|)$ and\n+the round ends by finding a character of the secret.\n+\n+The second method of attack is divide and conquer. In each phase the alphabet is\n+divided into two subsets $\\mathcal{S}_1$ and $\\mathcal{S}_2 = \\mathcal{S}\n+\\setminus \\mathcal{S}_1$, where $|\\mathcal{S}_1| = |\\mathcal{S}_2| =\n+\\ceil{|\\mathcal{S}| / 2}$. The reflection string for $\\mathcal{S}_1$ composes of","path":"etc/theory/compression_security.tex","position":941,"original_position":941,"commit_id":"b15cd13ee17dbc3041da59cbb04d08ffe22c6be9","original_commit_id":"b15cd13ee17dbc3041da59cbb04d08ffe22c6be9","user":{"login":"dionyziz","id":544572,"avatar_url":"https://avatars.githubusercontent.com/u/544572?v=3","gravatar_id":"","url":"https://api.github.com/users/dionyziz","html_url":"https://github.com/dionyziz","followers_url":"https://api.github.com/users/dionyziz/followers","following_url":"https://api.github.com/users/dionyziz/following{/other_user}","gists_url":"https://api.github.com/users/dionyziz/gists{/gist_id}","starred_url":"https://api.github.com/users/dionyziz/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dionyziz/subscriptions","organizations_url":"https://api.github.com/users/dionyziz/orgs","repos_url":"https://api.github.com/users/dionyziz/repos","events_url":"https://api.github.com/users/dionyziz/events{/privacy}","received_events_url":"https://api.github.com/users/dionyziz/received_events","type":"User","site_admin":false},"body":":s/composes/consists","created_at":"2016-11-11T19:11:42Z","updated_at":"2016-11-11T19:11:43Z","html_url":"https://github.com/dionyziz/rupture/pull/257#discussion_r87641493","pull_request_url":"https://api.github.com/repos/dionyziz/rupture/pulls/257","_links":{"self":{"href":"https://api.github.com/repos/dionyziz/rupture/pulls/comments/87641493"},"html":{"href":"https://github.com/dionyziz/rupture/pull/257#discussion_r87641493"},"pull_request":{"href":"https://api.github.com/repos/dionyziz/rupture/pulls/257"}}},"pull_request":{"url":"https://api.github.com/repos/dionyziz/rupture/pulls/257","id":93023283,"html_url":"https://github.com/dionyziz/rupture/pull/257","diff_url":"https://github.com/dionyziz/rupture/pull/257.diff","patch_url":"https://github.com/dionyziz/rupture/pull/257.patch","issue_url":"https://api.github.com/repos/dionyziz/rupture/issues/257","number":257,"state":"open","locked":false,"title":"Update Oakland grammar/language","user":{"login":"dimkarakostas","id":8135971,"avatar_url":"https://avatars.githubusercontent.com/u/8135971?v=3","gravatar_id":"","url":"https://api.github.com/users/dimkarakostas","html_url":"https://github.com/dimkarakostas","followers_url":"https://api.github.com/users/dimkarakostas/followers","following_url":"https://api.github.com/users/dimkarakostas/following{/other_user}","gists_url":"https://api.github.com/users/dimkarakostas/gists{/gist_id}","starred_url":"https://api.github.com/users/dimkarakostas/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dimkarakostas/subscriptions","organizations_url":"https://api.github.com/users/dimkarakostas/orgs","repos_url":"https://api.github.com/users/dimkarakostas/repos","events_url":"https://api.github.com/users/dimkarakostas/events{/privacy}","received_events_url":"https://api.github.com/users/dimkarakostas/received_events","type":"User","site_admin":false},"body":null,"created_at":"2016-11-09T19:25:51Z","updated_at":"2016-11-11T19:11:43Z","closed_at":null,"merged_at":null,"merge_commit_sha":"9a89fd1cdaa99a52292c2ab2399057faf195e16a","assignee":{"login":"dionyziz","id":544572,"avatar_url":"https://avatars.githubusercontent.com/u/544572?v=3","gravatar_id":"","url":"https://api.github.com/users/dionyziz","html_url":"https://github.com/dionyziz","followers_url":"https://api.github.com/users/dionyziz/followers","following_url":"https://api.github.com/users/dionyziz/following{/other_user}","gists_url":"https://api.github.com/users/dionyziz/gists{/gist_id}","starred_url":"https://api.github.com/users/dionyziz/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dionyziz/subscriptions","organizations_url":"https://api.github.com/users/dionyziz/orgs","repos_url":"https://api.github.com/users/dionyziz/repos","events_url":"https://api.github.com/users/dionyziz/events{/privacy}","received_events_url":"https://api.github.com/users/dionyziz/received_events","type":"User","site_admin":false},"assignees":[{"login":"dionyziz","id":544572,"avatar_url":"https://avatars.githubusercontent.com/u/544572?v=3","gravatar_id":"","url":"https://api.github.com/users/dionyziz","html_url":"https://github.com/dionyziz","followers_url":"https://api.github.com/users/dionyziz/followers","following_url":"https://api.github.com/users/dionyziz/following{/other_user}","gists_url":"https://api.github.com/users/dionyziz/gists{/gist_id}","starred_url":"https://api.github.com/users/dionyziz/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dionyziz/subscriptions","organizations_url":"https://api.github.com/users/dionyziz/orgs","repos_url":"https://api.github.com/users/dionyziz/repos","events_url":"https://api.github.com/users/dionyziz/events{/privacy}","received_events_url":"https://api.github.com/users/dionyziz/received_events","type":"User","site_admin":false}],"milestone":null,"commits_url":"https://api.github.com/repos/dionyziz/rupture/pulls/257/commits","review_comments_url":"https://api.github.com/repos/dionyziz/rupture/pulls/257/comments","review_comment_url":"https://api.github.com/repos/dionyziz/rupture/pulls/comments{/number}","comments_url":"https://api.github.com/repos/dionyziz/rupture/issues/257/comments","statuses_url":"https://api.github.com/repos/dionyziz/rupture/statuses/b15cd13ee17dbc3041da59cbb04d08ffe22c6be9","head":{"label":"dimkarakostas:oakland_general_update","ref":"oakland_general_update","sha":"b15cd13ee17dbc3041da59cbb04d08ffe22c6be9","user":{"login":"dimkarakostas","id":8135971,"avatar_url":"https://avatars.githubusercontent.com/u/8135971?v=3","gravatar_id":"","url":"https://api.github.com/users/dimkarakostas","html_url":"https://github.com/dimkarakostas","followers_url":"https://api.github.com/users/dimkarakostas/followers","following_url":"https://api.github.com/users/dimkarakostas/following{/other_user}","gists_url":"https://api.github.com/users/dimkarakostas/gists{/gist_id}","starred_url":"https://api.github.com/users/dimkarakostas/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dimkarakostas/subscriptions","organizations_url":"https://api.github.com/users/dimkarakostas/orgs","repos_url":"https://api.github.com/users/dimkarakostas/repos","events_url":"https://api.github.com/users/dimkarakostas/events{/privacy}","received_events_url":"https://api.github.com/users/dimkarakostas/received_events","type":"User","site_admin":false},"repo":{"id":55201967,"name":"rupture","full_name":"dimkarakostas/rupture","owner":{"login":"dimkarakostas","id":8135971,"avatar_url":"https://avatars.githubusercontent.com/u/8135971?v=3","gravatar_id":"","url":"https://api.github.com/users/dimkarakostas","html_url":"https://github.com/dimkarakostas","followers_url":"https://api.github.com/users/dimkarakostas/followers","following_url":"https://api.github.com/users/dimkarakostas/following{/other_user}","gists_url":"https://api.github.com/users/dimkarakostas/gists{/gist_id}","starred_url":"https://api.github.com/users/dimkarakostas/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dimkarakostas/subscriptions","organizations_url":"https://api.github.com/users/dimkarakostas/orgs","repos_url":"https://api.github.com/users/dimkarakostas/repos","events_url":"https://api.github.com/users/dimkarakostas/events{/privacy}","received_events_url":"https://api.github.com/users/dimkarakostas/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/dimkarakostas/rupture","description":"A framework for BREACH and other compression-based crypto attacks","fork":true,"url":"https://api.github.com/repos/dimkarakostas/rupture","forks_url":"https://api.github.com/repos/dimkarakostas/rupture/forks","keys_url":"https://api.github.com/repos/dimkarakostas/rupture/keys{/key_id}","collaborators_url":"https://api.github.com/repos/dimkarakostas/rupture/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/dimkarakostas/rupture/teams","hooks_url":"https://api.github.com/repos/dimkarakostas/rupture/hooks","issue_events_url":"https://api.github.com/repos/dimkarakostas/rupture/issues/events{/number}","events_url":"https://api.github.com/repos/dimkarakostas/rupture/events","assignees_url":"https://api.github.com/repos/dimkarakostas/rupture/assignees{/user}","branches_url":"https://api.github.com/repos/dimkarakostas/rupture/branches{/branch}","tags_url":"https://api.github.com/repos/dimkarakostas/rupture/tags","blobs_url":"https://api.github.com/repos/dimkarakostas/rupture/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/dimkarakostas/rupture/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/dimkarakostas/rupture/git/refs{/sha}","trees_url":"https://api.github.com/repos/dimkarakostas/rupture/git/trees{/sha}","statuses_url":"https://api.github.com/repos/dimkarakostas/rupture/statuses/{sha}","languages_url":"https://api.github.com/repos/dimkarakostas/rupture/languages","stargazers_url":"https://api.github.com/repos/dimkarakostas/rupture/stargazers","contributors_url":"https://api.github.com/repos/dimkarakostas/rupture/contributors","subscribers_url":"https://api.github.com/repos/dimkarakostas/rupture/subscribers","subscription_url":"https://api.github.com/repos/dimkarakostas/rupture/subscription","commits_url":"https://api.github.com/repos/dimkarakostas/rupture/commits{/sha}","git_commits_url":"https://api.github.com/repos/dimkarakostas/rupture/git/commits{/sha}","comments_url":"https://api.github.com/repos/dimkarakostas/rupture/comments{/number}","issue_comment_url":"https://api.github.com/repos/dimkarakostas/rupture/issues/comments{/number}","contents_url":"https://api.github.com/repos/dimkarakostas/rupture/contents/{+path}","compare_url":"https://api.github.com/repos/dimkarakostas/rupture/compare/{base}...{head}","merges_url":"https://api.github.com/repos/dimkarakostas/rupture/merges","archive_url":"https://api.github.com/repos/dimkarakostas/rupture/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/dimkarakostas/rupture/downloads","issues_url":"https://api.github.com/repos/dimkarakostas/rupture/issues{/number}","pulls_url":"https://api.github.com/repos/dimkarakostas/rupture/pulls{/number}","milestones_url":"https://api.github.com/repos/dimkarakostas/rupture/milestones{/number}","notifications_url":"https://api.github.com/repos/dimkarakostas/rupture/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/dimkarakostas/rupture/labels{/name}","releases_url":"https://api.github.com/repos/dimkarakostas/rupture/releases{/id}","deployments_url":"https://api.github.com/repos/dimkarakostas/rupture/deployments","created_at":"2016-04-01T03:45:57Z","updated_at":"2016-05-22T11:00:37Z","pushed_at":"2016-11-11T18:52:49Z","git_url":"git://github.com/dimkarakostas/rupture.git","ssh_url":"git@github.com:dimkarakostas/rupture.git","clone_url":"https://github.com/dimkarakostas/rupture.git","svn_url":"https://github.com/dimkarakostas/rupture","homepage":null,"size":9639,"stargazers_count":0,"watchers_count":0,"language":"TeX","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"develop"}},"base":{"label":"dionyziz:develop","ref":"develop","sha":"06868c9bf90310fb16c6edeb1cf1190cd79b89b4","user":{"login":"dionyziz","id":544572,"avatar_url":"https://avatars.githubusercontent.com/u/544572?v=3","gravatar_id":"","url":"https://api.github.com/users/dionyziz","html_url":"https://github.com/dionyziz","followers_url":"https://api.github.com/users/dionyziz/followers","following_url":"https://api.github.com/users/dionyziz/following{/other_user}","gists_url":"https://api.github.com/users/dionyziz/gists{/gist_id}","starred_url":"https://api.github.com/users/dionyziz/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dionyziz/subscriptions","organizations_url":"https://api.github.com/users/dionyziz/orgs","repos_url":"https://api.github.com/users/dionyziz/repos","events_url":"https://api.github.com/users/dionyziz/events{/privacy}","received_events_url":"https://api.github.com/users/dionyziz/received_events","type":"User","site_admin":false},"repo":{"id":51319299,"name":"rupture","full_name":"dionyziz/rupture","owner":{"login":"dionyziz","id":544572,"avatar_url":"https://avatars.githubusercontent.com/u/544572?v=3","gravatar_id":"","url":"https://api.github.com/users/dionyziz","html_url":"https://github.com/dionyziz","followers_url":"https://api.github.com/users/dionyziz/followers","following_url":"https://api.github.com/users/dionyziz/following{/other_user}","gists_url":"https://api.github.com/users/dionyziz/gists{/gist_id}","starred_url":"https://api.github.com/users/dionyziz/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dionyziz/subscriptions","organizations_url":"https://api.github.com/users/dionyziz/orgs","repos_url":"https://api.github.com/users/dionyziz/repos","events_url":"https://api.github.com/users/dionyziz/events{/privacy}","received_events_url":"https://api.github.com/users/dionyziz/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/dionyziz/rupture","description":"A framework for BREACH and other compression-based crypto attacks","fork":false,"url":"https://api.github.com/repos/dionyziz/rupture","forks_url":"https://api.github.com/repos/dionyziz/rupture/forks","keys_url":"https://api.github.com/repos/dionyziz/rupture/keys{/key_id}","collaborators_url":"https://api.github.com/repos/dionyziz/rupture/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/dionyziz/rupture/teams","hooks_url":"https://api.github.com/repos/dionyziz/rupture/hooks","issue_events_url":"https://api.github.com/repos/dionyziz/rupture/issues/events{/number}","events_url":"https://api.github.com/repos/dionyziz/rupture/events","assignees_url":"https://api.github.com/repos/dionyziz/rupture/assignees{/user}","branches_url":"https://api.github.com/repos/dionyziz/rupture/branches{/branch}","tags_url":"https://api.github.com/repos/dionyziz/rupture/tags","blobs_url":"https://api.github.com/repos/dionyziz/rupture/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/dionyziz/rupture/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/dionyziz/rupture/git/refs{/sha}","trees_url":"https://api.github.com/repos/dionyziz/rupture/git/trees{/sha}","statuses_url":"https://api.github.com/repos/dionyziz/rupture/statuses/{sha}","languages_url":"https://api.github.com/repos/dionyziz/rupture/languages","stargazers_url":"https://api.github.com/repos/dionyziz/rupture/stargazers","contributors_url":"https://api.github.com/repos/dionyziz/rupture/contributors","subscribers_url":"https://api.github.com/repos/dionyziz/rupture/subscribers","subscription_url":"https://api.github.com/repos/dionyziz/rupture/subscription","commits_url":"https://api.github.com/repos/dionyziz/rupture/commits{/sha}","git_commits_url":"https://api.github.com/repos/dionyziz/rupture/git/commits{/sha}","comments_url":"https://api.github.com/repos/dionyziz/rupture/comments{/number}","issue_comment_url":"https://api.github.com/repos/dionyziz/rupture/issues/comments{/number}","contents_url":"https://api.github.com/repos/dionyziz/rupture/contents/{+path}","compare_url":"https://api.github.com/repos/dionyziz/rupture/compare/{base}...{head}","merges_url":"https://api.github.com/repos/dionyziz/rupture/merges","archive_url":"https://api.github.com/repos/dionyziz/rupture/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/dionyziz/rupture/downloads","issues_url":"https://api.github.com/repos/dionyziz/rupture/issues{/number}","pulls_url":"https://api.github.com/repos/dionyziz/rupture/pulls{/number}","milestones_url":"https://api.github.com/repos/dionyziz/rupture/milestones{/number}","notifications_url":"https://api.github.com/repos/dionyziz/rupture/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/dionyziz/rupture/labels{/name}","releases_url":"https://api.github.com/repos/dionyziz/rupture/releases{/id}","deployments_url":"https://api.github.com/repos/dionyziz/rupture/deployments","created_at":"2016-02-08T19:01:04Z","updated_at":"2016-10-28T13:02:14Z","pushed_at":"2016-11-11T18:52:49Z","git_url":"git://github.com/dionyziz/rupture.git","ssh_url":"git@github.com:dionyziz/rupture.git","clone_url":"https://github.com/dionyziz/rupture.git","svn_url":"https://github.com/dionyziz/rupture","homepage":null,"size":10330,"stargazers_count":127,"watchers_count":127,"language":"TeX","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":24,"mirror_url":null,"open_issues_count":68,"forks":24,"open_issues":68,"watchers":127,"default_branch":"develop"}},"_links":{"self":{"href":"https://api.github.com/repos/dionyziz/rupture/pulls/257"},"html":{"href":"https://github.com/dionyziz/rupture/pull/257"},"issue":{"href":"https://api.github.com/repos/dionyziz/rupture/issues/257"},"comments":{"href":"https://api.github.com/repos/dionyziz/rupture/issues/257/comments"},"review_comments":{"href":"https://api.github.com/repos/dionyziz/rupture/pulls/257/comments"},"review_comment":{"href":"https://api.github.com/repos/dionyziz/rupture/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/dionyziz/rupture/pulls/257/commits"},"statuses":{"href":"https://api.github.com/repos/dionyziz/rupture/statuses/b15cd13ee17dbc3041da59cbb04d08ffe22c6be9"}}}}
{"actor":{"display_login":"dionyziz"}}