Browse Source

cleaned up client directory for slitheen code

cecylia 8 years ago
parent
commit
33bf57b7af

+ 0 - 5
client/Makefile

@@ -4,11 +4,6 @@ TARGETS= socks
 
 
 all: $(TARGETS)
 all: $(TARGETS)
 
 
-rclient.o ptwist168.o testget.o:: ptwist.h
-
-testget: testget.c rclient.o ptwist168.o ptwist.h
-	gcc -g -o $@ $^ -I/home/sltiheen/Downloads/include/openssl libssl.a libcrypto.a -ldl
-
 socks: socks5proxy.c
 socks: socks5proxy.c
 	gcc -o $@ $^ -lpthread -lssl -lcrypto
 	gcc -o $@ $^ -lpthread -lssl -lcrypto
 
 

+ 0 - 85
client/crypto.c

@@ -1,85 +0,0 @@
-#include <openssl/evp.h>
-#include <openssl/dh.h>
-#include <openssl/bn.h>
-#include <openssl/err.h>
-#include <openssl/rand.h>
-#include <openssl/ssl.h>
-#include "crypto.h"
-
-/* PRF using sha384, as defined in RFC 5246 */
-int PRF(uint8_t *secret, int32_t secret_len,
-		uint8_t *seed1, int32_t seed1_len,
-		uint8_t *seed2, int32_t seed2_len,
-		uint8_t *seed3, int32_t seed3_len,
-		uint8_t *seed4, int32_t seed4_len,
-		uint8_t *output, int32_t output_len){
-
-	EVP_MD_CTX ctx, ctx_tmp, ctx_init;
-	EVP_PKEY *mac_key;
-	const EVP_MD *md = EVP_sha384();
-
-	uint8_t A[EVP_MAX_MD_SIZE];
-	size_t len, A_len;
-	int chunk = EVP_MD_size(md);
-	int remaining = output_len;
-
-	uint8_t *out = output;
-
-	EVP_MD_CTX_init(&ctx);
-	EVP_MD_CTX_init(&ctx_tmp);
-	EVP_MD_CTX_init(&ctx_init);
-	EVP_MD_CTX_set_flags(&ctx_init, EVP_MD_CTX_FLAG_NON_FIPS_ALLOW);
-
-	mac_key = EVP_PKEY_new_mac_key(EVP_PKEY_HMAC, NULL, secret, secret_len);
-
-	/* Calculate first A value */
-	EVP_DigestSignInit(&ctx_init, NULL, md, NULL, mac_key);
-	EVP_MD_CTX_copy_ex(&ctx, &ctx_init);
-	if(seed1 != NULL && seed1_len > 0){
-		EVP_DigestSignUpdate(&ctx, seed1, seed1_len);
-	}
-	if(seed2 != NULL && seed2_len > 0){
-		EVP_DigestSignUpdate(&ctx, seed2, seed2_len);
-	}
-	if(seed3 != NULL && seed3_len > 0){
-		EVP_DigestSignUpdate(&ctx, seed3, seed3_len);
-	}
-	if(seed4 != NULL && seed4_len > 0){
-		EVP_DigestSignUpdate(&ctx, seed4, seed4_len);
-	}
-	EVP_DigestSignFinal(&ctx, A, &A_len);
-
-	//iterate until desired length is achieved
-	while(remaining > 0){
-		/* Now compute SHA384(secret, A+seed) */
-		EVP_MD_CTX_copy_ex(&ctx, &ctx_init);
-		EVP_DigestSignUpdate(&ctx, A, A_len);
-		EVP_MD_CTX_copy_ex(&ctx_tmp, &ctx);
-		if(seed1 != NULL && seed1_len > 0){
-			EVP_DigestSignUpdate(&ctx, seed1, seed1_len);
-		}
-		if(seed2 != NULL && seed2_len > 0){
-			EVP_DigestSignUpdate(&ctx, seed2, seed2_len);
-		}
-		if(seed3 != NULL && seed3_len > 0){
-			EVP_DigestSignUpdate(&ctx, seed3, seed3_len);
-		}
-		if(seed4 != NULL && seed4_len > 0){
-			EVP_DigestSignUpdate(&ctx, seed4, seed4_len);
-		}
-		
-		if(remaining > chunk){
-			EVP_DigestSignFinal(&ctx, out, &len);
-			out += len;
-			remaining -= len;
-
-			/* Next A value */
-			EVP_DigestSignFinal(&ctx_tmp, A, &A_len);
-		} else {
-			EVP_DigestSignFinal(&ctx, A, &A_len);
-			memcpy(out, A, remaining);
-			remaining -= remaining;
-		}
-	}
-	return 1;
-}

+ 0 - 17
client/crypto.h

@@ -1,17 +0,0 @@
-#ifndef _CRYPTO_H_
-#define _CRYPTO_H_
-
-# define n2s(c,s)        ((s=(((unsigned int)(c[0]))<< 8)| \
-							(((unsigned int)(c[1]))    )),c+=2)
-
-
-int PRF(uint8_t *secret, int32_t secret_len,
-		uint8_t *seed1, int32_t seed1_len,
-		uint8_t *seed2, int32_t seed2_len,
-		uint8_t *seed3, int32_t seed3_len,
-		uint8_t *seed4, int32_t seed4_len,
-		uint8_t *output, int32_t output_len);
-
-#define PRE_MASTER_LEN 256
-
-#endif /* _CRYPTO_H_ */

+ 0 - 66
client/getImagesData.py

@@ -1,66 +0,0 @@
-#!/usr/bin/python
-
-import sys
-import urllib
-#import http.client
-import urllib2
-import re
-from PIL import Image
-from io import BytesIO
-import cStringIO
-#import URLError, HTTPError
-
-
-
-urls = ["http://cnn.com"]
-
-
-i = 0
-regex1 = '<title>(.+?)</title>'
-pattern1 = re.compile(regex1)
-regex2 = '<img src="(.+?)"'
-pattern2 = re.compile(regex2)
-
-while i < len(urls):
-        htmlfile = urllib.urlopen(urls[i])
-        htmltext = htmlfile.read()
-        titles = re.findall(pattern1,htmltext)
-	images = re.findall(pattern2,htmltext)
-	size1 = htmlfile.headers.get("content-length")	
-#	size2 = len(htmlfile.read())
-        
-	print titles
-#	print images
-	print "content-length of header: "  
-	print size1
-#	print size2 
-	print "-------"
-        i+=1
-
-totalImageSize = 0
-
-print "Output:"
-#i = 0
-#while i < len(images):
-#	url = '\''+images[i]+'\''
-#		print images[i] 
-#		i+=1
-
-#	try:
-i = 0
-while i < len(images):
-
-		response = urllib.urlopen(images[i])
-#	except URLError as e:
-#	        print "ERROR: ", e.code()
-#	else:
-		headers = response.info()
-		data = response.read()
-		print 'URL: ', response.geturl()
-		print 'DATE:', headers['date'] 
-		print 'LENGTH:', len(data)
-		totalImageSize+=len(data)
-		i+=1
-
-print "---------------------"
-print "Total bandwidth to download images from %s is %d KB" % (urls, totalImageSize)

+ 0 - 456
client/httpData/httpProxy.py

@@ -1,456 +0,0 @@
-# -*- coding: utf-8 -*-
-import sys
-import os
-import socket
-import ssl
-import select
-import httplib
-import urlparse
-import threading
-import gzip
-import zlib
-import time
-import json
-import re
-from BaseHTTPServer import HTTPServer, BaseHTTPRequestHandler
-from SocketServer import ThreadingMixIn
-from cStringIO import StringIO
-from subprocess import Popen, PIPE
-from HTMLParser import HTMLParser
-
-#filename = 'proxyOutput-%s'%datetime.now().strftime('%Y-%m-%d')
-f1 = open('mainData','w')
-
-f = open('extraData', 'w')
-
-
-
-
-def with_color(c, s):
-    #print ("def #1")
-    return "\x1b[%dm%s\x1b[0m" % (c, s)
-
-
-class ThreadingHTTPServer(ThreadingMixIn, HTTPServer):
-    address_family = socket.AF_INET6
-    daemon_threads = True
-
-    def handle_error(self, request, client_address):
-        # surpress socket/ssl related errors
-        #print ("def #2")
-        cls, e = sys.exc_info()[:2]
-        if cls is socket.error or cls is ssl.SSLError:
-            pass
-        else:
-            return HTTPServer.handle_error(self, request, client_address)
-
-
-class ProxyRequestHandler(BaseHTTPRequestHandler):
-    cakey = 'ca.key'
-    cacert = 'ca.crt'
-    certkey = 'cert.key'
-    certdir = 'certs/'
-    timeout = 5
-    lock = threading.Lock()
-
-    def __init__(self, *args, **kwargs):
-        #print ("def #3")
-        self.tls = threading.local()
-        self.tls.conns = {}
-
-        BaseHTTPRequestHandler.__init__(self, *args, **kwargs)
-
-    def log_error(self, format, *args):
-        #print ("def #4")
-        # surpress "Request timed out: timeout('timed out',)"
-        if isinstance(args[0], socket.timeout):
-            return
-
-        self.log_message(format, *args)
-
-    def do_CONNECT(self):
-        #print ("def #5")
-        if os.path.isfile(self.cakey) and os.path.isfile(self.cacert) and os.path.isfile(self.certkey) and os.path.isdir(self.certdir):
-            self.connect_intercept()
-        else:
-            self.connect_relay()
-
-    def connect_intercept(self):
-        #print ("def #6")
-        hostname = self.path.split(':')[0]
-
-        certpath = "%s/%s.crt" % (self.certdir.rstrip('/'), hostname)
-
-        with self.lock:
-            if not os.path.isfile(certpath):
-                epoch = "%d" % (time.time() * 1000)
-                p1 = Popen(["openssl", "req", "-new", "-key", self.certkey, "-subj", "/CN=%s" % hostname], stdout=PIPE)
-                p2 = Popen(["openssl", "x509", "-req", "-days", "3650", "-CA", self.cacert, "-CAkey", self.cakey, "-set_serial", epoch, "-out", certpath], stdin=p1.stdout, stderr=PIPE)
-                p2.communicate()
-
-        self.wfile.write("%s %d %s\r\n" % (self.protocol_version, 200, 'Connection Established'))
-        self.end_headers()
-
-        self.connection = ssl.wrap_socket(self.connection, keyfile=self.certkey, certfile=certpath, server_side=True)
-        self.rfile = self.connection.makefile("rb", self.rbufsize)
-        self.wfile = self.connection.makefile("wb", self.wbufsize)
-
-        conntype = self.headers.get('Proxy-Connection', '')
-        if conntype.lower() == 'close':
-            self.close_connection = 1
-        elif (conntype.lower() == 'keep-alive' and self.protocol_version >= "HTTP/1.1"):
-            self.close_connection = 0
-
-    def connect_relay(self):
-        #print ("def #7")
-        address = self.path.split(':', 1)
-        
-        address[1] = int(address[1]) or 443
-        try:
-            s = socket.create_connection(address, timeout=self.timeout)
-        except Exception as e:
-            self.send_error(502)
-            return
-        self.send_response(200, 'Connection Established')
-        self.end_headers()
-
-        conns = [self.connection, s]
-        self.close_connection = 0
-        while not self.close_connection:
-            rlist, wlist, xlist = select.select(conns, [], conns, self.timeout)
-            if xlist or not rlist:
-                break
-            for r in rlist:
-                other = conns[1] if r is conns[0] else conns[0]
-                data = r.recv(8192)
-                if not data:
-                    self.close_connection = 1
-                    break
-                other.sendall(data)
-
-    def do_GET(self):
-        #print ("def #8")
-      
-        if self.path == 'http://proxy2.test/':
-            self.send_cacert()
-            return
-        #print ("mainhost: %s \n" % (self.headers['Host']))
-        
-        ######## request ########
-        req = self
-        content_length = int(req.headers.get('Content-Length', 0))
-        req_body = self.rfile.read(content_length) if content_length else None
-
-        if req.path[0] == '/':
-            if isinstance(self.connection, ssl.SSLSocket):
-                req.path = "https://%s%s" % (req.headers['Host'], req.path)
-            else:
-                req.path = "http://%s%s" % (req.headers['Host'], req.path)
-
-    
-      ########### request host name#########
-        print ("Working on host: %s \n" % (req.headers['Host']))
-       
-        req_body_modified = self.request_handler(req, req_body)
-        if req_body_modified is not None:
-            req_body = req_body_modified
-            req.headers['Content-length'] = str(len(req_body))
-            
-      
-         #   print ("request size: %s \n" % req.headers.get('content-length')) ###########content size#########
-         #   print ("request type: %s \n" % req.headers.get('content-type'))   ###########content type#########
-
-        
-        u = urlparse.urlsplit(req.path)
-        scheme, netloc, path = u.scheme, u.netloc, (u.path + '?' + u.query if u.query else u.path)
-        assert scheme in ('http', 'https')
-        if netloc:
-            req.headers['Host'] = netloc
-        req_headers = self.filter_headers(req.headers)
-
-        try:
-            origin = (scheme, netloc)
-            if not origin in self.tls.conns:
-                if scheme == 'https':
-                    self.tls.conns[origin] = httplib.HTTPSConnection(netloc, timeout=self.timeout)
-                else:
-                    self.tls.conns[origin] = httplib.HTTPConnection(netloc, timeout=self.timeout)
-            conn = self.tls.conns[origin]
-            conn.request(self.command, path, req_body, dict(req_headers))
-    
-        ####### response###########
-            res = conn.getresponse()
-            res_body = res.read()
-        except Exception as e:
-            if origin in self.tls.conns:
-                del self.tls.conns[origin]
-            self.send_error(502)
-            return
-        
-
-        version_table = {10: 'HTTP/1.0', 11: 'HTTP/1.1'}
-        setattr(res, 'headers', res.msg)
-        setattr(res, 'response_version', version_table[res.version])
-
-        content_encoding = res.headers.get('Content-Encoding', 'identity')
-        res_body_plain = self.decode_content_body(res_body, content_encoding)
-
-        res_body_modified = self.response_handler(req, req_body, res, res_body_plain)
-        if res_body_modified is not None:
-            res_body_plain = res_body_modified
-            res_body = self.encode_content_body(res_body_plain, content_encoding)
-            res.headers['Content-Length'] = str(len(res_body))
-
-  
-   ###########content size and type#########
-  #      print (" response size: %s \n" % res.headers.get('content-length'))
-  #      print (" response type: %s \n" % res.headers.get('content-type'))
-
-
-        res_headers = self.filter_headers(res.headers)
-
-        self.wfile.write("%s %d %s\r\n" % (self.protocol_version, res.status, res.reason))
-        for line in res_headers.headers:
-            self.wfile.write(line)
-        self.end_headers()
-        self.wfile.write(res_body)
-        self.wfile.flush()
-
-        with self.lock:
-            self.save_handler(req, req_body, res, res_body_plain)
-
-    do_HEAD = do_GET
-    do_POST = do_GET
-    do_OPTIONS = do_GET
-
-    def filter_headers(self, headers):
-        #print ("def #9")
-        # http://tools.ietf.org/html/rfc2616#section-13.5.1
-        hop_by_hop = ('connection', 'keep-alive', 'proxy-authenticate', 'proxy-authorization', 'te', 'trailers', 'transfer-encoding', 'upgrade')
-        for k in hop_by_hop:
-            del headers[k]
-        return headers
-
-    def encode_content_body(self, text, encoding):
-        #print ("def #10")
-        if encoding == 'identity':
-            data = text
-        elif encoding in ('gzip', 'x-gzip'):
-            io = StringIO()
-            with gzip.GzipFile(fileobj=io, mode='wb') as f:
-                f.write(text)
-            data = io.getvalue()
-        elif encoding == 'deflate':
-            data = zlib.compress(text)
-        else:
-            raise Exception("Unknown Content-Encoding: %s" % encoding)
-        return data
-
-    def decode_content_body(self, data, encoding):
-        #print ("def #11")  
-        if encoding == 'identity':
-            text = data
-        elif encoding in ('gzip', 'x-gzip'):
-            io = StringIO(data)
-            with gzip.GzipFile(fileobj=io) as f:
-                text = f.read()
-        elif encoding == 'deflate':
-            try:
-                text = zlib.decompress(data)
-            except zlib.error:
-                text = zlib.decompress(data, -zlib.MAX_WBITS)
-        else:
-            raise Exception("Unknown Content-Encoding: %s" % encoding)
-        return text
-
-    def send_cacert(self):
-        #print ("def #12")
-        with open(self.cacert, 'rb') as f:
-            data = f.read()
-
-        self.wfile.write("%s %d %s\r\n" % (self.protocol_version, 200, 'OK'))
-        self.send_header('Content-Type', 'application/x-x509-ca-cert')
-        self.send_header('Content-Length', len(data))
-        self.send_header('Connection', 'close')
-        self.end_headers()
-        self.wfile.write(data)
-
-    def print_info(self, req, req_body, res, res_body):
-        #print ("def #13")
-        def parse_qsl(s):
-            #print ("def #14")
-            return '\n'.join("%-20s %s" % (k, v) for k, v in urlparse.parse_qsl(s, keep_blank_values=True))
-
-      
-        request_data = "%s\t%s\t%s\t%s" % (req.headers['Referer'],req.headers['Host'],req.command,req.path)
-        f1.write('Request:\t')
-        f1.write(str(request_data))
-        f1.write(str('\n'))
-        
-        response_data = "%s\t%s" % (res.headers.get('content-length'),res.headers.get('content-type'))
-        f1.write('Response:\t')
-        f1.write(str(response_data))
-        f1.write(str('\n'))
-        
-    #    print (" request host: %s \n" % (req.headers['Host']))
-    #    print (" request referer: %s \n" % (req.headers['Referer']))
-    #    print (" response size: %s \n" % res.headers.get('content-length'))
-    #    print (" response type: %s \n" % res.headers.get('content-type'))
-    #    print (" req path: %s \n" % req.path)
-    #    print (" req command: %s \n" % req.command)        
-
-        req_header_text = "%s %s %s\n%s" % (req.command, req.path, req.request_version, req.headers)
-        res_header_text = "%s %d %s\n%s" % (res.response_version, res.status, res.reason, res.headers)
-        
-     #   print ("\nRequest:\t %s \t %s" % (req.headers['Host']), req.command)
-     #   print ("\nResponse:\t %s \t %d" % (res.headers['Content-Type']), int(res.headers['Content-Length']))
-        print ("\n+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n")
-        
-   #     print ("=====OUTPUT 1=====")
-   #     req_header_text = " %s \n" % ( req.host)
-   #     res_header_text = "%s %d %s\n%s" % (res.response_version, res.status, res.reason, res.headers)
-        
-    #    r1 = conn.getresponse()
-    #    data1 = r1.read()
-    #    print ("+++++MY OUTPUT+++++")
-    #    print (data)
-
-     #   print with_color(33, req_header_text)
-        f.write(str(req_header_text))
-
-        u = urlparse.urlsplit(req.path)
-        if u.query:
-            query_text = parse_qsl(u.query)
-       #     print with_color(32, "==== QUERY PARAMETERS ====\n%s\n" % query_text)
-            f.write (str('==== QUERY PARAMETERS ====\n'))
-            f.write (str(query_text))
-            f.write (str('\n'))
-
-        cookie = req.headers.get('Cookie', '')
-        if cookie:
-            cookie = parse_qsl(re.sub(r';\s*', '&', cookie))
-      #      print with_color(32, "==== COOKIE ====\n%s\n" % cookie)
-            f.write (str('==== COOKIE ====\n'))
-            f.write (str(cookie))
-            f.write (str('\n'))
-
-
-        auth = req.headers.get('Authorization', '')
-        if auth.lower().startswith('basic'):
-            token = auth.split()[1].decode('base64')
-      #      print with_color(31, "==== BASIC AUTH ====\n%s\n" % token)
-            f.write (str('==== BASIC AUTH ====\n'))
-            f.write (str(token))
-            f.write (str('\n'))
-
-        if req_body is not None:
-            req_body_text = None
-            content_type = req.headers.get('Content-Type', '')
-
-            if content_type.startswith('application/x-www-form-urlencoded'):
-                req_body_text = parse_qsl(req_body)
-            elif content_type.startswith('application/json'):
-                try:
-                    json_obj = json.loads(req_body)
-                    json_str = json.dumps(json_obj, indent=2)
-                    if json_str.count('\n') < 50:
-                        req_body_text = json_str
-                    else:
-                        lines = json_str.splitlines()
-                        req_body_text = "%s\n(%d lines)" % ('\n'.join(lines[:50]), len(lines))
-                except ValueError:
-                    req_body_text = req_body
-            elif len(req_body) < 1024:
-                req_body_text = req_body
-
-            if req_body_text:
-                #print with_color(32, "==== REQUEST BODY ====\n%s\n" % req_body_text)
-                f.write (str('==== REQUEST BODY ====\n'))
-                f.write (str(req_body_text))
-                f.write (str('\n'))
-
-        print with_color(36, res_header_text)
-        f.write(str(res_header_text))
-
-        cookies = res.headers.getheaders('Set-Cookie')
-        if cookies:
-            cookies = '\n'.join(cookies)
-         #   print with_color(31, "==== SET-COOKIE ====\n%s\n" % cookies)
-            f.write (str('==== SET-COOKIE ====\n'))
-            f.write (str(cookies))
-            f.write (str('\n'))
-
-        if res_body is not None:
-            res_body_text = None
-            content_type = res.headers.get('Content-Type', '')
-
-            if content_type.startswith('application/json'):
-                try:
-                    json_obj = json.loads(res_body)
-                    json_str = json.dumps(json_obj, indent=2)
-                    if json_str.count('\n') < 50:
-                        res_body_text = json_str
-                    else:
-                        lines = json_str.splitlines()
-                        res_body_text = "%s\n(%d lines)" % ('\n'.join(lines[:50]), len(lines))
-                except ValueError:
-                    res_body_text = res_body
-            elif content_type.startswith('text/html'):
-                m = re.search(r'<title[^>]*>\s*([^<]+?)\s*</title>', res_body, re.I)
-                if m:
-                    h = HTMLParser()
-                    #print with_color(32, "==== HTML TITLE ====\n%s\n" % h.unescape(m.group(1).decode('utf-8')))
-                    f.write (str('==== HTML TITLE ====\n'))
-                    f.write (str(h.unescape(m.group(1).decode('utf-8'))))
-                    f.write (str('\n'))
-                
-            elif content_type.startswith('text/') and len(res_body) < 1024:
-                res_body_text = res_body
-
-            if res_body_text:
-              #  print with_color(32, "==== RESPONSE BODY ====\n%s\n" % res_body_text)
-                f.write (str('==== RESPONSE BODY ====\n'))
-                f.write (str(res_body_text))
-                f.write (str('\n'))
-                
-    def request_handler(self, req, req_body):
-        #print ("def #15")
-        pass
-
-    def response_handler(self, req, req_body, res, res_body):
-        #print ("def #16")
-        pass
-
-    def save_handler(self, req, req_body, res, res_body):
-        #print ("def #17")
-        self.print_info(req, req_body, res, res_body)
-        
-  #      req_host = req.headers(['Host'])
-  #      req_length = int(len(req_body))
-
-#        res_host = res.headers(['Host'])
-#        res_length = int(len(res_body))
-
- #       print ("===DATA===\n %s\t %d\n %s\t %d\n" % req_host, req_length, res_host, res_length  )
-        
-def test(HandlerClass=ProxyRequestHandler, ServerClass=ThreadingHTTPServer, protocol="HTTP/1.1"):
-    #print ("def #18")
-
-    if sys.argv[1:]:
-        port = int(sys.argv[1])
-    else:
-        port = 8080
-    server_address = ('', port)
-
-    HandlerClass.protocol_version = protocol
-    httpd = ServerClass(server_address, HandlerClass)
-
-    sa = httpd.socket.getsockname()
-    print "Serving HTTP Proxy on", sa[0], "port", sa[1], "..."
-    httpd.serve_forever()
-
-
-if __name__ == '__main__':
-    test()
-
-

+ 0 - 28
client/httpData/phantomScript.js

@@ -1,28 +0,0 @@
-var page = require('webpage').create(),
-	system = require('system'),
-	t,address;
-
-
-if (system.args.length === 1){
-	console.log ('Usage: phantomjs --proxy=localhost:8080 --proxy-type=http phantomScript.js <some URL>');
-	phantom.exit();
-}
-
-t = Date.now();
-address = system.args[1];
-
-
-console.log('Loading page..'+ system.args[1]);
-
-page.open(address, function(status){
-	if (status !== 'success'){
-		console.log('FAIL to load the address');
-		console.log(status);
-	}
-	else{
-		t = Date.now() - t;
-		console.log('Loading page..'+ system.args[1]);
-		console.log('Loading time: '+ t + 'msec');
-	}
-	phantom.exit();
-});

+ 0 - 21
client/httpData/readMe.txt

@@ -1,21 +0,0 @@
-1. In one tab run: 
-python httpProxy.py > consoleLog
-# there is a lot of console log generated
-
-2. In second tab run:
-./runPhantom.sh
-
-3. Output:
-mainData
-#contains essential data:
-(Request - host - subdomain - GET/POST - resource)
-(Response - resource size - resource type)
-
-extraData
-#details headers/ cookies etc.
-
-currently i am running a shuffle separately on the list and then rerunning steps 1 and 2
-and fixing the script to sort the output to get domain-based, content-type-based  upstream and downstream data
-
-to do: 
-to get the sorting done during runtime itself

+ 0 - 4
client/httpData/runPhantom.sh

@@ -1,4 +0,0 @@
-for i in `cat top5k`
-do
-phantomjs --proxy=localhost:8080 --proxy-type=http --ssl-protocol=any --ignore-ssl-errors=true phantomScript.js $i
-done

+ 0 - 5000
client/httpData/top5k

@@ -1,5000 +0,0 @@
-https://www.google.com
-https://www.youtube.com
-https://www.facebook.com
-https://www.baidu.com
-https://www.yahoo.com
-https://www.amazon.com
-https://www.wikipedia.org
-https://www.qq.com
-https://www.google.co.in
-https://www.twitter.com
-https://www.live.com
-https://www.taobao.com
-https://www.msn.com
-https://www.sina.com.cn
-https://www.yahoo.co.jp
-https://www.google.co.jp
-https://www.linkedin.com
-https://www.weibo.com
-https://www.bing.com
-https://www.yandex.ru
-https://www.vk.com
-https://www.hao123.com
-https://www.instagram.com
-https://www.ebay.com
-https://www.google.de
-https://www.amazon.co.jp
-https://www.mail.ru
-https://www.tmall.com
-https://www.360.cn
-https://www.google.co.uk
-https://www.pinterest.com
-https://www.google.ru
-https://www.reddit.com
-https://www.google.com.br
-https://www.t.co
-https://www.netflix.com
-https://www.google.fr
-https://www.sohu.com
-https://www.paypal.com
-https://www.microsoft.com
-https://www.wordpress.com
-https://www.google.it
-https://www.google.es
-https://www.blogspot.com
-https://www.gmw.cn
-https://www.onclickads.net
-https://www.tumblr.com
-https://www.ok.ru
-https://www.imgur.com
-https://www.aliexpress.com
-https://www.xvideos.com
-https://www.stackoverflow.com
-https://www.apple.com
-https://www.google.com.mx
-https://www.imdb.com
-https://www.fc2.com
-https://www.google.com.hk
-https://www.ask.com
-https://www.amazon.de
-https://www.google.com.tr
-https://www.google.ca
-https://www.alibaba.com
-https://www.office.com
-https://www.rakuten.co.jp
-https://www.tianya.cn
-https://www.pornhub.com
-https://www.google.co.id
-https://www.diply.com
-https://www.github.com
-https://www.craigslist.org
-https://www.soso.com
-https://www.go.com
-https://www.xinhuanet.com
-https://www.nicovideo.jp
-https://www.amazon.co.uk
-https://www.pixnet.net
-https://www.bongacams.com
-https://www.blogger.com
-https://www.amazon.in
-https://www.outbrain.com
-https://www.cnn.com
-https://www.googleusercontent.com
-https://www.cntv.cn
-https://www.kat.cr
-https://www.jd.com
-https://www.google.pl
-https://www.google.com.au
-https://www.naver.com
-https://www.dropbox.com
-https://www.coccoc.com
-https://www.xhamster.com
-https://www.360.com
-https://www.adobe.com
-https://www.china.com
-https://www.haosou.com
-https://www.microsoftonline.com
-https://www.whatsapp.com
-https://www.nytimes.com
-https://www.adnetworkperformance.com
-https://www.flipkart.com
-https://www.chase.com
-https://www.sogou.com
-https://www.alipay.com
-https://www.163.com
-https://www.google.com.eg
-https://www.booking.com
-https://www.bbc.co.uk
-https://www.google.com.pk
-https://www.google.com.sa
-https://www.wikia.com
-https://www.amazon.cn
-https://www.indiatimes.com
-https://www.youku.com
-https://www.espn.go.com
-https://www.livedoor.jp
-https://www.ebay.co.uk
-https://www.google.co.th
-https://www.google.com.ar
-https://www.youth.cn
-https://www.ebay.de
-https://www.china.com.cn
-https://www.google.com.tw
-https://www.dailymotion.com
-https://www.google.co.kr
-https://www.wittyfeed.com
-https://www.twitch.tv
-https://www.bankofamerica.com
-https://www.quora.com
-https://www.google.nl
-https://www.dmm.co.jp
-https://www.popads.net
-https://www.adf.ly
-https://www.bbc.com
-https://www.xnxx.com
-https://www.huffingtonpost.com
-https://www.cnzz.com
-https://www.buzzfeed.com
-https://www.amazonaws.com
-https://www.dailymail.co.uk
-https://www.tudou.com
-https://www.wellsfargo.com
-https://www.ettoday.net
-https://www.zillow.com
-https://www.etsy.com
-https://www.ameblo.jp
-https://www.globo.com
-https://www.walmart.com
-https://www.detail.tmall.com
-https://www.uol.com.br
-https://www.indeed.com
-https://www.yelp.com
-https://www.blogspot.in
-https://www.avito.ru
-https://www.aol.com
-https://www.detik.com
-https://www.txxx.com
-https://www.zhihu.com
-https://www.slideshare.net
-https://www.bilibili.com
-https://www.directrev.com
-https://www.google.gr
-https://www.cnet.com
-https://www.soundcloud.com
-https://www.google.co.za
-https://www.so.com
-https://www.weather.com
-https://www.kakaku.com
-https://www.google.com.ua
-https://www.theladbible.com
-https://www.goo.ne.jp
-https://www.theguardian.com
-https://www.vice.com
-https://www.naver.jp
-https://www.gfycat.com
-https://www.flickr.com
-https://www.stackexchange.com
-https://www.amazon.it
-https://www.washingtonpost.com
-https://www.taringa.net
-https://www.taboola.com
-https://www.salesforce.com
-https://www.mediafire.com
-https://www.tradeadexchange.com
-https://www.uptodown.com
-https://www.foxnews.com
-https://www.liveadexchanger.com
-https://www.redtube.com
-https://www.google.com.ng
-https://www.amazon.fr
-https://www.leboncoin.fr
-https://www.hclips.com
-https://www.snapdeal.com
-https://www.espncricinfo.com
-https://www.tripadvisor.com
-https://www.forbes.com
-https://www.godaddy.com
-https://www.target.com
-https://www.bp.blogspot.com
-https://www.feedly.com
-https://www.ikea.com
-https://www.daum.net
-https://www.google.com.co
-https://www.softonic.com
-https://www.google.cn
-https://www.reimageplus.com
-https://www.orange.fr
-https://www.ifeng.com
-https://www.youm7.com
-https://www.nih.gov
-https://www.vimeo.com
-https://www.zol.com.cn
-https://www.google.com.sg
-https://www.51.la
-https://www.9gag.com
-https://www.web.de
-https://www.force.com
-https://www.tribunnews.com
-https://www.youporn.com
-https://www.google.ro
-https://www.steamcommunity.com
-https://www.babytree.com
-https://www.intuit.com
-https://www.comcast.net
-https://www.onlinesbi.com
-https://www.gmx.net
-https://www.github.io
-https://www.google.be
-https://www.secureserver.net
-https://www.torrentz.eu
-https://www.pixiv.net
-https://www.americanexpress.com
-https://www.allegro.pl
-https://www.udn.com
-https://www.thepiratebay.se
-https://www.steampowered.com
-https://www.about.com
-https://www.rdsa2012.com
-https://www.wikihow.com
-https://www.gamer.com.tw
-https://www.akamaihd.net
-https://www.google.com.ph
-https://www.wix.com
-https://www.mozilla.org
-https://www.livejournal.com
-https://www.hdfcbank.com
-https://www.1688.com
-https://www.skype.com
-https://www.w3schools.com
-https://www.bestbuy.com
-https://www.homedepot.com
-https://www.xuite.net
-https://www.shutterstock.com
-https://www.capitalone.com
-https://www.usps.com
-https://www.ruten.com.tw
-https://www.onet.pl
-https://www.upornia.com
-https://www.google.co.ve
-https://www.deviantart.com
-https://www.xywy.com
-https://www.nametests.com
-https://www.google.at
-https://www.hulu.com
-https://www.groupon.com
-https://www.businessinsider.com
-https://www.bet365.com
-https://www.xfinity.com
-https://www.speedtest.net
-https://www.iqiyi.com
-https://www.putlocker.is
-https://www.slickdeals.net
-https://www.mega.nz
-https://www.bitauto.com
-https://www.files.wordpress.com
-https://www.google.com.pe
-https://www.icicibank.com
-https://www.t-online.de
-https://www.blastingnews.com
-https://www.rambler.ru
-https://www.wikimedia.org
-https://www.seznam.cz
-https://www.amazon.es
-https://www.weebly.com
-https://www.pandora.com
-https://www.archive.org
-https://www.huanqiu.com
-https://www.blog.jp
-https://www.google.se
-https://www.youtube-mp3.org
-https://www.caijing.com.cn
-https://www.samsung.com
-https://www.ndtv.com
-https://www.goodreads.com
-https://www.wordpress.org
-https://www.webtretho.com
-https://www.eksisozluk.com
-https://www.spotify.com
-https://www.google.pt
-https://www.wp.pl
-https://www.google.ae
-https://www.ups.com
-https://www.doorblog.jp
-https://www.liputan6.com
-https://www.ebay-kleinanzeigen.de
-https://www.google.ch
-https://www.mama.cn
-https://www.wordreference.com
-https://www.popcash.net
-https://www.onedio.com
-https://www.1905.com
-https://www.hp.com
-https://www.usatoday.com
-https://www.webmd.com
-https://www.abs-cbn.com
-https://www.google.dz
-https://www.rediff.com
-https://www.sberbank.ru
-https://www.kaskus.co.id
-https://www.csdn.net
-https://www.fedex.com
-https://www.douyutv.com
-https://www.telegraph.co.uk
-https://www.cnnic.cn
-https://www.2ch.net
-https://www.39.net
-https://www.twimg.com
-https://www.terraclicks.com
-https://www.51yes.com
-https://www.google.co.il
-https://www.ltn.com.tw
-https://www.siteadvisor.com
-https://www.accuweather.com
-https://www.doubleclick.net
-https://www.fbcdn.net
-https://www.themeforest.net
-https://www.sourceforge.net
-https://www.thesaurus.com
-https://www.att.com
-https://www.google.hu
-https://www.milliyet.com.tr
-https://www.addthis.com
-https://www.mercadolivre.com.br
-https://www.gsmarena.com
-https://www.loading-delivery2.com
-https://www.mashable.com
-https://www.google.cz
-https://www.kompas.com
-https://www.dell.com
-https://www.bloomberg.com
-https://www.blogspot.com.br
-https://www.nownews.com
-https://www.icloud.com
-https://www.zendesk.com
-https://www.mailchimp.com
-https://www.sabah.com.tr
-https://www.irctc.co.in
-https://www.chaturbate.com
-https://www.paytm.com
-https://www.cloudfront.net
-https://www.hurriyet.com.tr
-https://www.verizonwireless.com
-https://www.adplxmd.com
-https://www.gizmodo.com
-https://www.mystart.com
-https://www.google.cl
-https://www.google.ie
-https://www.badoo.com
-https://www.kapanlagi.com
-https://www.buzzlie.com
-https://www.sahibinden.com
-https://www.media.tumblr.com
-https://www.livejasmin.com
-https://www.eastday.com
-https://www.kinogo.co
-https://www.impress.co.jp
-https://www.digikala.com
-https://www.trello.com
-https://www.merdeka.com
-https://www.medium.com
-https://www.slack.com
-https://www.bukalapak.com
-https://www.enet.com.cn
-https://www.doublepimp.com
-https://www.varzesh3.com
-https://www.yandex.ua
-https://www.ign.com
-https://www.ilyke.co
-https://www.blogfa.com
-https://www.oracle.com
-https://www.dmm.com
-https://www.wsj.com
-https://www.blackboard.com
-https://www.pinimg.com
-https://www.savefrom.net
-https://www.macys.com
-https://www.olx.pl
-https://www.citi.com
-https://www.naukri.com
-https://www.chaoshi.tmall.com
-https://www.livedoor.biz
-https://www.tube8.com
-https://www.avg.com
-https://www.kinopoisk.ru
-https://www.adidas.tmall.com
-https://www.ebay.in
-https://www.watsons.tmall.com
-https://www.eyny.com
-https://www.reuters.com
-https://www.taleo.net
-https://www.libero.it
-https://www.irs.gov
-https://www.expedia.com
-https://www.evernote.com
-https://www.urdupoint.com
-https://www.bhaskar.com
-https://www.lowes.com
-https://www.giphy.com
-https://www.airbnb.com
-https://www.kohls.com
-https://www.livedoor.com
-https://www.mi.com
-https://www.hootsuite.com
-https://www.amazon.ca
-https://www.jabong.com
-https://www.spiegel.de
-https://www.bild.de
-https://www.google.fi
-https://www.engadget.com
-https://www.thesportbible.com
-https://www.nyaa.se
-https://www.scribd.com
-https://www.ameba.jp
-https://www.instructure.com
-https://www.likes.com
-https://www.realtor.com
-https://www.google.sk
-https://www.google.no
-https://www.ebay.it
-https://www.ci123.com
-https://www.shopify.com
-https://www.infusionsoft.com
-https://www.playstation.com
-https://www.mobile.de
-https://www.haber7.com
-https://www.tokopedia.com
-https://www.tistory.com
-https://www.roblox.com
-https://www.newegg.com
-https://www.thefreedictionary.com
-https://www.friv.com
-https://www.hm.com
-https://www.tabelog.com
-https://www.box.com
-https://www.ancestry.com
-https://www.4shared.com
-https://www.17ok.com
-https://www.google.dk
-https://www.quikr.com
-https://www.patch.com
-https://www.stumbleupon.com
-https://www.hotstar.com
-https://www.battle.net
-https://www.streamcloud.eu
-https://www.southcn.com
-https://www.gearbest.com
-https://www.lifehacker.com
-https://www.baike.com
-https://www.free.fr
-https://www.nike.com
-https://www.yallakora.com
-https://www.shopclues.com
-https://www.58.com
-https://www.elpais.com
-https://www.allrecipes.com
-https://www.surveymonkey.com
-https://www.fidelity.com
-https://www.rbc.ru
-https://www.nbcnews.com
-https://www.asos.com
-https://www.list-manage.com
-https://www.freepik.com
-https://www.cricbuzz.com
-https://www.repubblica.it
-https://www.wunderground.com
-https://www.discovercard.com
-https://www.billdesk.com
-https://www.hespress.com
-https://www.messenger.com
-https://www.aparat.com
-https://www.gap.com
-https://www.npr.org
-https://www.spaceshipads.com
-https://www.nifty.com
-https://www.youdao.com
-https://www.japanpost.jp
-https://www.google.az
-https://www.rutracker.org
-https://www.marca.com
-https://www.hatena.ne.jp
-https://www.fiverr.com
-https://www.blogimg.jp
-https://www.meetup.com
-https://www.umblr.com
-https://www.bleacherreport.com
-https://www.cbssports.com
-https://www.teepr.com
-https://www.answers.com
-https://www.ebay.com.au
-https://www.xe.com
-https://www.theverge.com
-https://www.exoclick.com
-https://www.momoshop.com.tw
-https://www.politico.com
-https://www.ca.gov
-https://www.goal.com
-https://www.xunlei.com
-https://www.trulia.com
-https://www.retailmenot.com
-https://www.hotels.com
-https://www.woot.com
-https://www.lifebuzz.com
-https://www.southwest.com
-https://www.flirchi.com
-https://www.extratorrent.cc
-https://www.hdzog.com
-https://www.kickstarter.com
-https://www.cnblogs.com
-https://www.azlyrics.com
-https://www.sq.cn
-https://www.nba.com
-https://www.verizon.com
-https://www.wayfair.com
-https://www.airtel.in
-https://www.seesaa.net
-https://www.chip.de
-https://www.zomato.com
-https://www.costco.com
-https://www.albawabhnews.com
-https://www.ebates.com
-https://www.ask.fm
-https://www.acfun.tv
-https://www.olx.in
-https://www.conservativetribune.com
-https://www.nordstrom.com
-https://www.photobucket.com
-https://www.indianexpress.com
-https://www.kooora.com
-https://www.xda-developers.com
-https://www.rt.com
-https://www.ero-advertising.com
-https://www.blogspot.jp
-https://www.so-net.ne.jp
-https://www.mobfactory.info
-https://www.zippyshare.com
-https://www.jimdo.com
-https://www.sh.st
-https://www.vid.me
-https://www.adcash.com
-https://www.drudgereport.com
-https://www.alexa.cn
-https://www.udemy.com
-https://www.subscene.com
-https://www.trackingclick.net
-https://www.lenovo.com
-https://www.kayak.com
-https://www.nikkei.com
-https://www.gamefaqs.com
-https://www.yandex.com.tr
-https://www.india.com
-https://www.mercadolibre.com.ar
-https://www.okezone.com
-https://www.alicdn.com
-https://www.justdial.com
-https://www.chinaz.com
-https://www.biglobe.ne.jp
-https://www.kijiji.ca
-https://www.uploaded.net
-https://www.squarespace.com
-https://www.souq.com
-https://www.yodobashi.com
-https://www.hatenablog.com
-https://www.wikiwiki.jp
-https://www.123cha.com
-https://www.liveinternet.ru
-https://www.independent.co.uk
-https://www.life.tw
-https://www.meaww.com
-https://www.zulily.com
-https://www.beeg.com
-https://www.tsite.jp
-https://www.overstock.com
-https://www.sakura.ne.jp
-https://www.list.tmall.com
-https://www.ampclicks.com
-https://www.abcnews.go.com
-https://www.intoday.in
-https://www.adp.com
-https://www.leagueoflegends.com
-https://www.clipconverter.cc
-https://www.itmedia.co.jp
-https://www.moneycontrol.com
-https://www.google.com.vn
-https://www.houzz.com
-https://www.gameforge.com
-https://www.cbsnews.com
-https://www.sabq.org
-https://www.zing.vn
-https://www.latimes.com
-https://www.tutorialspoint.com
-https://www.zoho.com
-https://www.telegram.org
-https://www.olx.ua
-https://www.netteller.com
-https://www.voc.com.cn
-https://www.slate.com
-https://www.elmundo.es
-https://www.makemytrip.com
-https://www.myfitnesspal.com
-https://www.quizlet.com
-https://www.worldlifestyle.com
-https://www.oeeee.com
-https://www.upwork.com
-https://www.fitbit.com
-https://www.people.com
-https://www.mydala.com
-https://www.mackolik.com
-https://www.ensonhaber.com
-https://www.venturead.com
-https://www.blkget.com
-https://www.ytimg.com
-https://www.livescore.com
-https://www.cookpad.com
-https://www.daikynguyenvn.com
-https://www.instructables.com
-https://www.emol.com
-https://www.thewatchseries.to
-https://www.4dsply.com
-https://www.thekitchn.com
-https://www.104.com.tw
-https://www.time.com
-https://www.familydoctor.com.cn
-https://www.asahi.com
-https://www.timeanddate.com
-https://www.eventbrite.com
-https://www.java.com
-https://www.myway.com
-https://www.reference.com
-https://www.mixi.jp
-https://www.dropbooks.tv
-https://www.subito.it
-https://www.agar.io
-https://www.manoramaonline.com
-https://www.disqus.com
-https://www.usaa.com
-https://www.jrj.com.cn
-https://www.infoseek.co.jp
-https://www.aa.com
-https://www.researchgate.net
-https://www.google.com.my
-https://www.chinaso.com
-https://www.lenta.ru
-https://www.nhk.or.jp
-https://www.google.lk
-https://www.delta.com
-https://www.glassdoor.com
-https://www.www.gov.uk
-https://www.ibm.com
-https://www.urbandictionary.com
-https://www.custhelp.com
-https://www.stockstar.com
-https://www.mlb.com
-https://www.yandex.kz
-https://www.fivethirtyeight.com
-https://www.google.kz
-https://www.twoo.com
-https://www.google.bg
-https://www.nikkeibp.co.jp
-https://www.rottentomatoes.com
-https://www.shaparak.ir
-https://www.interia.pl
-https://www.asana.com
-https://www.elwatannews.com
-https://www.prezi.com
-https://www.slimspots.com
-https://www.aliyun.com
-https://www.bhphotovideo.com
-https://www.egou.com
-https://www.starsports.com
-https://www.gamersky.com
-https://www.google.com.kw
-https://www.microsoftstore.com
-https://www.constantcontact.com
-https://www.all2lnk.com
-https://www.change.org
-https://www.openload.co
-https://www.bs.to
-https://www.agoda.com
-https://www.asus.com
-https://www.mcafee.com
-https://www.investing.com
-https://www.youboy.com
-https://www.issuu.com
-https://www.ero-video.net
-https://www.norton.com
-https://www.weblio.jp
-https://www.wetransfer.com
-https://www.ticketmaster.com
-https://www.atwiki.jp
-https://www.sciencedirect.com
-https://www.ontests.me
-https://www.reverso.net
-https://www.pch.com
-https://www.tmz.com
-https://www.6pm.com
-https://www.prpops.com
-https://www.absoluteclickscom.com
-https://www.pof.com
-https://www.fanpage.gr
-https://www.zone-telechargement.com
-https://www.y8.com
-https://www.zhaopin.com
-https://www.nypost.com
-https://www.usbank.com
-https://www.mynavi.jp
-https://www.swagbucks.com
-https://www.drom.ru
-https://www.faithtap.com
-https://www.rightmove.co.uk
-https://www.elfagr.org
-https://www.academia.edu
-https://www.coursera.org
-https://www.corriere.it
-https://www.kdnet.net
-https://www.ouo.io
-https://www.yadi.sk
-https://www.foodnetwork.com
-https://www.google.rs
-https://www.clien.net
-https://www.techcrunch.com
-https://www.gmarket.co.kr
-https://www.sears.com
-https://www.cisco.com
-https://www.mit.edu
-https://www.filehippo.com
-https://www.abplive.in
-https://www.staples.com
-https://www.gismeteo.ru
-https://www.eonline.com
-https://www.google.by
-https://www.jcpenney.com
-https://www.okcupid.com
-https://www.eastmoney.com
-https://www.yaolan.com
-https://www.gamepedia.com
-https://www.gigazine.net
-https://www.neobux.com
-https://www.wp.com
-https://www.seasonvar.ru
-https://www.webex.com
-https://www.bankmellat.ir
-https://www.gawker.com
-https://www.popsugar.com
-https://www.cnbc.com
-https://www.vk.me
-https://www.kissanime.to
-https://www.alwafd.org
-https://www.126.com
-https://www.abril.com.br
-https://www.chron.com
-https://www.vnexpress.net
-https://www.google.co.nz
-https://www.howtogeek.com
-https://www.buzzfil.net
-https://www.blogspot.com.eg
-https://www.superuser.com
-https://www.behance.net
-https://www.biobiochile.cl
-https://www.nydailynews.com
-https://www.gutefrage.net
-https://www.thehindu.com
-https://www.wattpad.com
-https://www.k618.cn
-https://www.ebay.fr
-https://www.farsnews.com
-https://www.pcmag.com
-https://www.commentcamarche.net
-https://www.exblog.jp
-https://www.yandex.by
-https://www.huaban.com
-https://www.duckduckgo.com
-https://www.google.com.bd
-https://www.priceline.com
-https://www.bodybuilding.com
-https://www.clickadu.com
-https://www.bomb01.com
-https://www.123rf.com
-https://www.suning.com
-https://www.popundertotal.com
-https://www.gyazo.com
-https://www.gazetaexpress.com
-https://www.atlassian.net
-https://www.php.net
-https://www.e-hentai.org
-https://www.bt.com
-https://www.mirror.co.uk
-https://www.united.com
-https://www.olx.com.br
-https://www.redirectvoluum.com
-https://www.ed.gov
-https://www.audible.com
-https://www.carview.co.jp
-https://www.t-mobile.com
-https://www.inquirer.net
-https://www.shareasale.com
-https://www.tim.it
-https://www.wish.com
-https://www.zara.com
-https://www.yomiuri.co.jp
-https://www.geocities.jp
-https://www.google.hr
-https://www.inspsearch.com
-https://www.cdiscount.com
-https://www.merriam-webster.com
-https://www.vetogate.com
-https://www.google.com.do
-https://www.lun.com
-https://www.51job.com
-https://www.westernjournalism.com
-https://www.mapquest.com
-https://www.sfr.fr
-https://www.buy.tmall.com
-https://www.mydomainadvisor.com
-https://www.wiktionary.org
-https://www.thedailybeast.com
-https://www.mayoclinic.org
-https://www.googleadservices.com
-https://www.pchome.com.tw
-https://www.europa.eu
-https://www.gamespot.com
-https://www.realclearpolitics.com
-https://www.weather.gov
-https://www.3dmgame.com
-https://www.predictivadvertising.com
-https://www.4399.com
-https://www.himado.in
-https://www.indianrail.gov.in
-https://www.gmanetwork.com
-https://www.investopedia.com
-https://www.codecanyon.net
-https://www.hilton.com
-https://www.xbox.com
-https://www.zappos.com
-https://www.wired.com
-https://www.google.com.ec
-https://www.anitube.se
-https://www.android.com
-https://www.nhadatso.com
-https://www.milanuncios.com
-https://www.otto.de
-https://www.marriott.com
-https://www.4pda.ru
-https://www.goo.gl
-https://www.sozcu.com.tr
-https://www.mercadolibre.com.mx
-https://www.bestadbid.com
-https://www.getpocket.com
-https://www.sankei.com
-https://www.youjizz.com
-https://www.sky.com
-https://www.elmogaz.com
-https://www.servingclks.com
-https://www.ria.ru
-https://www.ted.com
-https://www.redfin.com
-https://www.internethaber.com
-https://www.as.com
-https://www.hotnewhiphop.com
-https://www.ew.com
-https://www.ppomppu.co.kr
-https://www.yenisafak.com
-https://www.appledaily.com.tw
-https://www.kotaku.com
-https://www.almasryalyoum.com
-https://www.lapatilla.com
-https://www.indiamart.com
-https://www.cpasbien.cm
-https://www.mobile01.com
-https://www.blogspot.com.tr
-https://www.wav.tv
-https://www.whitepages.com
-https://www.syosetu.com
-https://www.focus.de
-https://www.gazeta.pl
-https://www.intel.com
-https://www.livestrong.com
-https://www.babycenter.com
-https://www.marketwatch.com
-https://www.panasonic.jp
-https://www.hostgator.com
-https://www.lazada.co.id
-https://www.vox.com
-https://www.rollingstone.com
-https://www.informer.com
-https://www.fatosdesconhecidos.com.br
-https://www.nhl.com
-https://www.google.lt
-https://www.jin115.com
-https://www.novinky.cz
-https://www.xmediaserve.com
-https://www.rednet.cn
-https://www.voyeurhit.com
-https://www.excite.co.jp
-https://www.uzone.id
-https://www.ukr.net
-https://www.11st.co.kr
-https://www.homepage-web.com
-https://www.dianping.com
-https://www.theatlantic.com
-https://www.legacy.com
-https://www.4chan.org
-https://www.megapopads.com
-https://www.2345.com
-https://www.nta.go.jp
-https://www.gongchang.com
-https://www.duolingo.com
-https://www.dailypakistan.com.pk
-https://www.rapidgator.net
-https://www.emgn.com
-https://www.tomshardware.com
-https://www.cocolog-nifty.com
-https://www.auto.ru
-https://www.pantip.com
-https://www.primewire.ag
-https://www.hh.ru
-https://www.duba.com
-https://www.leadzupc.com
-https://www.ccm.net
-https://www.cbs.com
-https://www.pnc.com
-https://www.line.me
-https://www.aweber.com
-https://www.cda.pl
-https://www.backpage.com
-https://www.state.gov
-https://www.marktplaats.nl
-https://www.mega.co.nz
-https://www.lequipe.fr
-https://www.sfgate.com
-https://www.qingdaonews.com
-https://www.creditkarma.com
-https://www.match.com
-https://www.pole-emploi.fr
-https://www.mercadolibre.com.ve
-https://www.nairaland.com
-https://www.kuronekoyamato.co.jp
-https://www.credit-agricole.fr
-https://www.n11.com
-https://www.wiley.com
-https://www.pbs.org
-https://www.ultimate-guitar.com
-https://www.breitbart.com
-https://www.dafont.com
-https://www.walgreens.com
-https://www.ecnavi.jp
-https://www.windows.com
-https://www.rarbg.to
-https://www.ryanair.com
-https://www.mynet.com
-https://www.mihanblog.com
-https://www.dmv.org
-https://www.acunn.com
-https://www.deezer.com
-https://www.torcache.net
-https://www.cracked.com
-https://www.360doc.com
-https://www.rakuten.ne.jp
-https://www.hamariweb.com
-https://www.folha.uol.com.br
-https://www.chinadaily.com.cn
-https://www.yellowpages.com
-https://www.mbc.net
-https://www.caixa.gov.br
-https://www.mufg.jp
-https://www.o2.pl
-https://www.banggood.com
-https://www.yjc.ir
-https://www.axisbank.co.in
-https://www.gittigidiyor.com
-https://www.springer.com
-https://www.114la.com
-https://www.mint.com
-https://www.lemonde.fr
-https://www.hubspot.com
-https://www.bitly.com
-https://www.ecollege.com
-https://www.haberturk.com
-https://www.zougla.gr
-https://www.hepsiburada.com
-https://www.histats.com
-https://www.qvc.com
-https://www.allocine.fr
-https://www.basecamp.com
-https://www.biblegateway.com
-https://www.uber.com
-https://www.nfl.com
-https://www.21cn.com
-https://www.images-amazon.com
-https://www.fanli.com
-https://www.androidcentral.com
-https://www.immobilienscout24.de
-https://www.express.pk
-https://www.popped.biz
-https://www.poringa.net
-https://www.monster.com
-https://www.coupons.com
-https://www.disq.us
-https://www.etao.com
-https://www.oschina.net
-https://www.statcounter.com
-https://www.dreamstime.com
-https://www.usnews.com
-https://www.mysmartprice.com
-https://www.dostor.org
-https://www.fanfiction.net
-https://www.apache.org
-https://www.videomega.tv
-https://www.garmin.com
-https://www.thisav.com
-https://www.yts.ag
-https://www.drive2.ru
-https://www.office365.com
-https://www.harvard.edu
-https://www.labanquepostale.fr
-https://www.pogo.com
-https://www.ampxchange.com
-https://www.aljazeera.net
-https://www.6park.com
-https://www.padsdel.com
-https://www.vodlocker.com
-https://www.serving-sys.com
-https://www.paytm.in
-https://www.tabnak.ir
-https://www.askubuntu.com
-https://www.hulu.jp
-https://www.oneindia.com
-https://www.donga.com
-https://www.warmportrait.com
-https://www.clarin.com
-https://www.digitaltrends.com
-https://www.lefigaro.fr
-https://www.bedbathandbeyond.com
-https://www.eroterest.net
-https://www.rakuten-card.co.jp
-https://www.esuteru.com
-https://www.gumtree.com
-https://www.bidvertiser.com
-https://www.2chblog.jp
-https://www.saramin.co.kr
-https://www.stanford.edu
-https://www.klikbca.com
-https://www.axisbank.com
-https://www.bitbucket.org
-https://www.jagran.com
-https://www.chouftv.ma
-https://www.panda.tv
-https://www.techradar.com
-https://www.mr-johal.com
-https://www.prothom-alo.com
-https://www.gazzetta.it
-https://www.tnaflix.com
-https://www.watchseries.li
-https://www.idnes.cz
-https://www.schwab.com
-https://www.lloydsbank.co.uk
-https://www.pagesjaunes.fr
-https://www.ehow.com
-https://www.pretty52.com
-https://www.sopitas.com
-https://www.onliner.by
-https://www.plarium.com
-https://www.ldblog.jp
-https://www.javedch.com
-https://www.deadspin.com
-https://www.ascii.jp
-https://www.jumia.com.ng
-https://www.uptobox.com
-https://www.forever21.com
-https://www.tripadvisor.co.uk
-https://www.kinox.to
-https://www.sephora.com
-https://www.sony.jp
-https://www.telegram.me
-https://www.fang.com
-https://www.liveleak.com
-https://www.discover.com
-https://www.canva.com
-https://www.niuche.com
-https://www.nexusmods.com
-https://www.khanacademy.org
-https://www.cambridge.org
-https://www.blog.me
-https://www.npmpecd.com
-https://www.jalan.net
-https://www.commbank.com.au
-https://www.ozon.ru
-https://www.wargaming.net
-https://www.istockphoto.com
-https://www.fandango.com
-https://www.jezebel.com
-https://www.elevenia.co.id
-https://www.cbc.ca
-https://www.dailykos.com
-https://www.toysrus.com
-https://www.what-character-are-you.com
-https://www.fishki.net
-https://www.takungpao.com
-https://www.genius.com
-https://www.truecaller.com
-https://www.sapo.pt
-https://www.donanimhaber.com
-https://www.samsclub.com
-https://www.ebay.ca
-https://www.wiocha.pl
-https://www.ctrip.com
-https://www.arstechnica.com
-https://www.chekb.com
-https://www.tgbus.com
-https://www.makeuseof.com
-https://www.finn.no
-https://www.onlinecreditcenter6.com
-https://www.gofundme.com
-https://www.nikkansports.com
-https://www.entrepreneur.com
-https://www.drtuber.com
-https://www.lynda.com
-https://www.avito.ma
-https://www.skysports.com
-https://www.ebay.es
-https://www.royalbank.com
-https://www.keepvid.com
-https://www.myfreecams.com
-https://www.divar.ir
-https://www.xing.com
-https://www.battlefield.com
-https://www.sindonews.com
-https://www.reclameaqui.com.br
-https://www.shutterfly.com
-https://www.rozblog.com
-https://www.qualtrics.com
-https://www.sponichi.co.jp
-https://www.efukt.com
-https://www.1337x.to
-https://www.panet.co.il
-https://www.pikabu.ru
-https://www.tattoodo.com
-https://www.mackeeper.com
-https://www.movie4k.to
-https://www.jb51.net
-https://www.gumtree.com.au
-https://www.scoop.it
-https://www.today.com
-https://www.tagged.com
-https://www.minecraft.net
-https://www.yaplakal.com
-https://www.nasa.gov
-https://www.duowan.com
-https://www.firstpost.com
-https://www.disney.go.com
-https://www.tesco.com
-https://www.americanas.com.br
-https://www.brassring.com
-https://www.clixsense.com
-https://www.lanacion.com.ar
-https://www.telekom.com
-https://www.domaintools.com
-https://www.dlsite.com
-https://www.dangdang.com
-https://www.porn.com
-https://www.victoriassecret.com
-https://www.elcomercio.pe
-https://www.gamewith.jp
-https://www.mgid.com
-https://www.gnavi.co.jp
-https://www.food.com
-https://www.autotrader.com
-https://www.dict.cc
-https://www.usmagazine.com
-https://www.face-masr.com
-https://www.cvs.com
-https://www.deviantart.net
-https://www.spankbang.com
-https://www.salon.com
-https://www.yahoo-mbga.jp
-https://www.workercn.cn
-https://www.citibank.co.in
-https://www.google.si
-https://www.bookmyshow.com
-https://www.r10.net
-https://www.airasia.com
-https://www.cbslocal.com
-https://www.hindustantimes.com
-https://www.inc.com
-https://www.capitalone360.com
-https://www.bluehost.com
-https://www.barnesandnoble.com
-https://www.icc-cricket.com
-https://www.ccb.com
-https://www.wildberries.ru
-https://www.chicagotribune.com
-https://www.blog.ir
-https://www.xl415.com
-https://www.auction.co.kr
-https://www.olx.co.id
-https://www.chefkoch.de
-https://www.icims.com
-https://www.topix.com
-https://www.autoscout24.de
-https://www.setn.com
-https://www.blogspot.co.uk
-https://www.vcommission.com
-https://www.ly.com
-https://www.zozo.jp
-https://www.nnm-club.me
-https://www.iherb.com
-https://www.cam4.com
-https://www.narod.ru
-https://www.foursquare.com
-https://www.garanti.com.tr
-https://www.kizi.com
-https://www.tut.by
-https://www.nbcsports.com
-https://www.bintang.com
-https://www.barclaycardus.com
-https://www.jw.org
-https://www.onclickpredictiv.com
-https://www.bankrate.com
-https://www.mileroticos.com
-https://www.discogs.com
-https://www.argos.co.uk
-https://www.nextdoor.com
-https://www.abc.go.com
-https://www.ncaa.com
-https://www.fotostrana.ru
-https://www.tvguide.com
-https://www.munrvscurlms.com
-https://www.hsbc.co.uk
-https://www.hupu.com
-https://www.algocashmaster.com
-https://www.bmi.ir
-https://www.google.tn
-https://www.kizlarsoruyor.com
-https://www.givemesport.com
-https://www.theblaze.com
-https://www.adme.ru
-https://www.2ch-c.net
-https://www.bahn.de
-https://www.lego.com
-https://www.thevideo.me
-https://www.teamviewer.com
-https://www.jobrapido.com
-https://www.gotowebinar.com
-https://www.hollywoodreporter.com
-https://www.fortune.com
-https://www.feng.com
-https://www.archiveofourown.org
-https://www.discuss.com.hk
-https://www.2gis.ru
-https://www.lady8844.com
-https://www.grammarly.com
-https://www.mediaset.it
-https://www.lockerdome.com
-https://www.digg.com
-https://www.td.com
-https://www.vente-privee.com
-https://www.uniqlo.com
-https://www.drugs.com
-https://www.sprint.com
-https://www.lacaixa.es
-https://www.haberler.com
-https://www.welt.de
-https://www.dictionary.com
-https://www.alfalfalfa.com
-https://www.vrbo.com
-https://www.engageya.com
-https://www.ubi.com
-https://www.kompasiana.com
-https://www.google.iq
-https://www.mmm-mmm.info
-https://www.12306.cn
-https://www.rei.com
-https://www.shaadi.com
-https://www.privatbank.ua
-https://www.mangafox.me
-https://www.nationalgeographic.com
-https://www.postbank.de
-https://www.ibnlive.com
-https://www.leo.org
-https://www.junbi-tracker.com
-https://www.hibapress.com
-https://www.indiegogo.com
-https://www.macrumors.com
-https://www.ngacn.cc
-https://www.littlethings.com
-https://www.voluumtrk.com
-https://www.24h.com.vn
-https://www.trafficserving.com
-https://www.pcworld.com
-https://www.4gamer.net
-https://www.facenama.com
-https://www.tunein.com
-https://www.news.com.au
-https://www.askmebazaar.com
-https://www.virginmedia.com
-https://www.autotrader.co.uk
-https://www.webssearches.com
-https://www.super.cz
-https://www.gorillavid.in
-https://www.premierleague.com
-https://www.foxsports.com
-https://www.ing.nl
-https://www.daily.co.jp
-https://www.gotporn.com
-https://www.solarmovie.ph
-https://www.zimuzu.tv
-https://www.finishclueobscure.info
-https://www.docin.com
-https://www.ea.com
-https://www.patheos.com
-https://www.dhgate.com
-https://www.msnbc.com
-https://www.ranker.com
-https://www.pixabay.com
-https://www.iza.ne.jp
-https://www.kinja.com
-https://www.anjuke.com
-https://www.juksy.com
-https://www.si.com
-https://www.ig.com.br
-https://www.flashx.pw
-https://www.bustle.com
-https://www.convert2mp3.net
-https://www.eenadu.net
-https://www.vine.co
-https://www.argaam.com
-https://www.dl-protect.com
-https://www.telegrafi.com
-https://www.opentable.com
-https://www.kbb.com
-https://www.xn--igbhe7b5a3d5a.com
-https://www.1and1.com
-https://www.blogspot.my
-https://www.eztv.ag
-https://www.kicker.de
-https://www.list-manage1.com
-https://www.adservingsolutionsinc.com
-https://www.cinemablend.com
-https://www.turbobit.net
-https://www.serverfault.com
-https://www.mediaplex.com
-https://www.asriran.com
-https://www.okta.com
-https://www.doodle.com
-https://www.editor.wix.com
-https://www.talk.tw
-https://www.id.net
-https://www.businessweekly.com.tw
-https://www.miniclip.com
-https://www.admaimai.com
-https://www.fool.com
-https://www.videodownloadconverter.com
-https://www.digitalocean.com
-https://www.wunderlist.com
-https://www.nmisr.com
-https://www.directv.com
-https://www.mail.com
-https://www.mydrivers.com
-https://www.ptt.cc
-https://www.macromill.com
-https://www.n121adserv.com
-https://www.psu.edu
-https://www.cnmo.com
-https://www.gotomeeting.com
-https://www.reallifecam.com
-https://www.gaana.com
-https://www.vistaprint.com
-https://www.hexun.com
-https://www.mts.ru
-https://www.typepad.com
-https://www.gamestop.com
-https://www.here.com
-https://www.indeed.co.uk
-https://www.jav68.me
-https://www.programme-tv.net
-https://www.1und1.de
-https://www.nipic.com
-https://www.aftonbladet.se
-https://www.blogphongthuy.com
-https://www.torrentz.com
-https://www.renren.com
-https://www.dawn.com
-https://www.newyorker.com
-https://www.17track.net
-https://www.jqw.com
-https://www.yhd.com
-https://www.58pic.com
-https://www.cdc.gov
-https://www.taimienphi.vn
-https://www.sbnation.com
-https://www.ocn.ne.jp
-https://www.codeproject.com
-https://www.mainichi.jp
-https://www.gazeta.ru
-https://www.google.com.gt
-https://www.sitepoint.com
-https://www.infobae.com
-https://www.xiaomi.com
-https://www.strava.com
-https://www.seekingalpha.com
-https://www.nosub.tv
-https://www.freedom251.com
-https://www.humblebundle.com
-https://www.lg.com
-https://www.dpreview.com
-https://www.cnki.net
-https://www.piriform.com
-https://www.fnb.co.za
-https://www.filmweb.pl
-https://www.citibankonline.com
-https://www.paidverts.com
-https://www.zatnawqy.net
-https://www.virgilio.it
-https://www.vanguard.com
-https://www.trklnks.com
-https://www.qz.com
-https://www.edmunds.com
-https://www.xtube.com
-https://www.crunchyroll.com
-https://www.google.lv
-https://www.ubuntu.com
-https://www.linternaute.com
-https://www.baixaki.com.br
-https://www.ulmart.ru
-https://www.shasha.ps
-https://www.aarp.org
-https://www.olx.ro
-https://www.zybang.com
-https://www.autodesk.com
-https://www.ilmeteo.it
-https://www.vg.no
-https://www.abc.net.au
-https://www.hubpages.com
-https://www.wowhead.com
-https://www.motherless.com
-https://www.tempo.co
-https://www.cars.com
-https://www.itau.com.br
-https://www.idealo.de
-https://www.himasoku.com
-https://www.persianblog.ir
-https://www.nocookie.net
-https://www.nttdocomo.co.jp
-https://www.bab.la
-https://www.caf.fr
-https://www.sulekha.com
-https://www.am15.net
-https://www.lightinthebox.com
-https://www.realestate.com.au
-https://www.flightradar24.com
-https://www.1111.com.tw
-https://www.bc.vc
-https://www.smartnewtab.com
-https://www.mirtesen.ru
-https://www.tomsguide.com
-https://www.a10.com
-https://www.poste.it
-https://www.picofile.com
-https://www.brainyquote.com
-https://www.xiami.com
-https://www.healthline.com
-https://www.525j.com.cn
-https://www.myanimelist.net
-https://www.ali213.net
-https://www.17173.com
-https://www.softbank.jp
-https://www.khabaronline.ir
-https://www.timewarnercable.com
-https://www.dhl.com
-https://www.refinery29.com
-https://www.greatergood.com
-https://www.berkeley.edu
-https://www.unity3d.com
-https://www.jalopnik.com
-https://www.freecharge.in
-https://www.ny.gov
-https://www.epochtimes.com
-https://www.uludagsozluk.com
-https://www.abc.es
-https://www.weheartit.com
-https://www.evite.com
-https://www.postimg.org
-https://www.metrolyrics.com
-https://www.thepennyhoarder.com
-https://www.getbootstrap.com
-https://www.g2a.com
-https://www.pureadexchange.com
-https://www.smh.com.au
-https://www.blogspot.de
-https://www.noaa.gov
-https://www.beytoote.com
-https://www.over-blog.com
-https://www.purdue.edu
-https://www.ibanking-services.com
-https://www.peyvandha.ir
-https://www.goodgamestudios.com
-https://www.ns5n.com
-https://www.ft.com
-https://www.thechive.com
-https://www.jeuxvideo.com
-https://www.prnt.sc
-https://www.bandcamp.com
-https://www.bb.com.br
-https://www.sp.gov.br
-https://www.skroutz.gr
-https://www.unicredit.it
-https://www.smi2.ru
-https://www.secureinternetbank.com
-https://www.sporx.com
-https://www.codepen.io
-https://www.correios.com.br
-https://www.streamin.to
-https://www.shufoo.net
-https://www.10086.cn
-https://www.sbisec.co.jp
-https://www.mxttrf.com
-https://www.santander.co.uk
-https://www.otomoto.pl
-https://www.mic.com
-https://www.freelancer.com
-https://www.vesti.ru
-https://www.allmyvideos.net
-https://www.all-free-download.com
-https://www.tutsplus.com
-https://www.goibibo.com
-https://www.rakuten-bank.co.jp
-https://www.thehill.com
-https://www.lifenews.ru
-https://www.rakuten.com
-https://www.hdfilmifullizle.com.tr
-https://www.ravelry.com
-https://www.tenki.jp
-https://www.last.fm
-https://www.homeaway.com
-https://www.ihg.com
-https://www.iciba.com
-https://www.suara.com
-https://www.dns-shop.ru
-https://www.picmonkey.com
-https://www.nbc.com
-https://www.bttiantang.com
-https://www.wetter.com
-https://www.591.com.tw
-https://www.goodhousekeeping.com
-https://www.forgeofempires.com
-https://www.smallpdf.com
-https://www.unam.mx
-https://www.depositphotos.com
-https://www.starbucks.com
-https://www.hotpepper.jp
-https://www.imagebam.com
-https://www.my-hit.org
-https://www.caisse-epargne.fr
-https://www.vporn.com
-https://www.wnd.com
-https://www.auntyacid.com
-https://www.empflix.com
-https://www.officedepot.com
-https://www.techbang.com
-https://www.jugem.jp
-https://www.arcot.com
-https://www.bsnl.in
-https://www.freejobalert.com
-https://www.lindaikejisblog.com
-https://www.huawei.com
-https://www.sputniknews.com
-https://www.azet.sk
-https://www.enews.com.tw
-https://www.2chan.net
-https://www.pckeeper.software
-https://www.complex.com
-https://www.sat.gob.mx
-https://www.filmibeat.com
-https://www.linkwithin.com
-https://www.iconosquare.com
-https://www.mobafire.com
-https://www.phonearena.com
-https://www.oscar.go.com
-https://www.nature.com
-https://www.rappler.com
-https://www.sznews.com
-https://www.payoneer.com
-https://www.softpedia.com
-https://www.chiphell.com
-https://www.orbitz.com
-https://www.polyvore.com
-https://www.cleartrip.com
-https://www.echo.msk.ru
-https://www.wwe.com
-https://www.filmesonlinegratis.net
-https://www.ucoz.ru
-https://www.careerbuilder.com
-https://www.iheart.com
-https://www.irpopup.ir
-https://www.bizjournals.com
-https://www.telegraaf.nl
-https://www.samplicio.us
-https://www.moz.com
-https://www.slidesharecdn.com
-https://www.bamilo.com
-https://www.world.tmall.com
-https://www.google.com.pr
-https://www.51cto.com
-https://www.vip.com
-https://www.gemius.pl
-https://www.rozetka.com.ua
-https://www.aljaras.com
-https://www.monotaro.com
-https://www.earthlink.net
-https://www.docusign.net
-https://www.justporno.tv
-https://www.flirt4free.com
-https://www.alarabiya.net
-https://www.alexa.com
-https://www.watchfree.to
-https://www.le.com
-https://www.lostfilm.tv
-https://www.kongregate.com
-https://www.hrblock.com
-https://www.heise.de
-https://www.p5w.net
-https://www.togetter.com
-https://www.ynet.co.il
-https://www.zergnet.com
-https://www.adultfriendfinder.com
-https://www.vmware.com
-https://www.fazenda.gov.br
-https://www.ana.co.jp
-https://www.lagou.com
-https://www.americancolumn.com
-https://www.projectfreetv.so
-https://www.jquery.com
-https://www.nudevista.com
-https://www.orf.at
-https://www.techtarget.com
-https://www.study.com
-https://www.travelocity.com
-https://www.cnbeta.com
-https://www.consumerreports.org
-https://www.dominos.com
-https://www.adservone.com
-https://www.miui.com
-https://www.standardmedia.co.ke
-https://www.gstatic.com
-https://www.cloudsrvtrk.com
-https://www.vidto.me
-https://www.gamefactory.jp
-https://www.irecommend.ru
-https://www.gome.com.cn
-https://www.layalina.com
-https://www.emirates.com
-https://www.edmodo.com
-https://www.weightwatchers.com
-https://www.suntrust.com
-https://www.nymag.com
-https://www.tasnimnews.com
-https://www.allabout.co.jp
-https://www.nate.com
-https://www.caribbeancom.com
-https://www.tiscali.it
-https://www.championat.com
-https://www.zalando.de
-https://www.livetv.sx
-https://www.brazzers.com
-https://www.focus.cn
-https://www.pchome.net
-https://www.yalla-shoot.com
-https://www.chess.com
-https://www.aastocks.com
-https://www.kddi.com
-https://www.pixlr.com
-https://www.disney.com
-https://www.shop-pro.jp
-https://www.weathernews.jp
-https://www.flashscore.com
-https://www.ragestream.com
-https://www.howstuffworks.com
-https://www.dnaindia.com
-https://www.protothema.gr
-https://www.mvideo.ru
-https://www.animeflv.net
-https://www.userscloud.com
-https://www.fiducia.de
-https://www.rackcdn.com
-https://www.boredpanda.com
-https://www.tf1.fr
-https://www.blocket.se
-https://www.maybank2u.com.my
-https://www.mangareader.net
-https://www.repelis.tv
-https://www.websta.me
-https://www.trade.tmall.com
-https://www.worldstarhiphop.com
-https://www.opensubtitles.org
-https://www.nuvid.com
-https://www.nextmedia.com
-https://www.iltalehti.fi
-https://www.cloudflare.com
-https://www.internetdownloadmanager.com
-https://www.perfectgirls.net
-https://www.heroquizz.com
-https://www.el-nacional.com
-https://www.rikunabi.com
-https://www.adschemist.com
-https://www.saisoncard.co.jp
-https://www.bbb.org
-https://www.pastebin.com
-https://www.androidauthority.com
-https://www.cornell.edu
-https://www.banesconline.com
-https://www.mentalfloss.com
-https://www.lds.org
-https://www.kp.ru
-https://www.nu.nl
-https://www.abchina.com
-https://www.payseal.com
-https://www.webmoney.ru
-https://www.cityheaven.net
-https://www.yoox.com
-https://www.national-lottery.co.uk
-https://www.billboard.com
-https://www.emuch.net
-https://www.telegraf.com.ua
-https://www.vagalume.com.br
-https://www.halifax-online.co.uk
-https://www.likemag.com
-https://www.dropboxusercontent.com
-https://www.planetromeo.com
-https://www.bradesco.com.br
-https://www.fromdoctopdf.com
-https://www.scoopwhoop.com
-https://www.medscape.com
-https://www.jsfiddle.net
-https://www.digialm.com
-https://www.pearsoncmg.com
-https://www.edx.org
-https://www.carsensor.net
-https://www.ssa.gov
-https://www.economist.com
-https://www.1111.tmall.com
-https://www.rr.com
-https://www.cox.net
-https://www.popmaster.ir
-https://www.yourdailydish.com
-https://www.theepochtimes.com
-https://www.concursolutions.com
-https://www.szn.cz
-https://www.easyjet.com
-https://www.xkcd.com
-https://www.51sole.com
-https://www.stubhub.com
-https://www.masralarabia.com
-https://www.tdbank.com
-https://www.w3.org
-https://www.nation.co.ke
-https://www.windows.net
-https://www.dummies.com
-https://www.comenity.net
-https://www.incometaxindiaefiling.gov.in
-https://www.codecademy.com
-https://www.ponparemall.com
-https://www.terra.com.br
-https://www.dribbble.com
-https://www.express.co.uk
-https://www.01net.com
-https://www.ebscohost.com
-https://www.alfabank.ru
-https://www.cityadspix.com
-https://www.hamusoku.com
-https://www.nguoiduatin.vn
-https://www.elcomercio.com
-https://www.tripadvisor.in
-https://www.brucelead.com
-https://www.zwaar.net
-https://www.metacritic.com
-https://www.ibtimes.co.uk
-https://www.gamme.com.tw
-https://www.makeleio.gr
-https://www.indeed.co.in
-https://www.snopes.com
-https://www.mysql.com
-https://www.variety.com
-https://www.cafemom.com
-https://www.hsbc.com.hk
-https://www.p30download.com
-https://www.eskimi.com
-https://www.elsevier.com
-https://www.trustpilot.com
-https://www.elconfidencial.com
-https://www.searchalgo.com
-https://www.medicinenet.com
-https://www.douguo.com
-https://www.wuxiaworld.com
-https://www.ynet.com
-https://www.google.co.ma
-https://www.metro.co.uk
-https://www.mheducation.com
-https://www.hellou.co.uk
-https://www.500px.com
-https://www.gmail.com
-https://www.thenextweb.com
-https://www.mizuhobank.co.jp
-https://www.20minutos.es
-https://www.esquire.com
-https://www.traffichunt.com
-https://www.misrjournal.com
-https://www.habrahabr.ru
-https://www.tripadvisor.it
-https://www.kaspersky.com
-https://www.marketgid.com
-https://www.ntdtv.com
-https://www.jet.com
-https://www.playbuzz.com
-https://www.online-convert.com
-https://www.python.org
-https://www.sueddeutsche.de
-https://www.tokyo.jp
-https://www.eluniverso.com
-https://www.bbt.com
-https://www.redbox.com
-https://www.radikal.com.tr
-https://www.acer.com
-https://www.tilestwra.com
-https://www.mtsindia.in
-https://www.chosun.com
-https://www.house365.com
-https://www.isna.ir
-https://www.ipko.pl
-https://www.dytt8.net
-https://www.liveperson.net
-https://www.utorrent.com
-https://www.korabia.com
-https://www.mtv.com
-https://www.smrtgs.com
-https://www.gidonline.club
-https://www.toastedballs.com
-https://www.skyscanner.net
-https://www.famitsu.com
-https://www.doisongphapluat.com
-https://www.ceneo.pl
-https://www.okwave.jp
-https://www.mashreghnews.ir
-https://www.ghanaweb.com
-https://www.hotukdeals.com
-https://www.computerbild.de
-https://www.gumtree.pl
-https://www.prom.ua
-https://www.jma.go.jp
-https://www.lotterypost.com
-https://www.ieee.org
-https://www.bol.uol.com.br
-https://www.tubepatrol.net
-https://www.jal.co.jp
-https://www.hsn.com
-https://www.etrade.com
-https://www.ilfattoquotidiano.it
-https://www.spankwire.com
-https://www.ssisurveys.com
-https://www.zeit.de
-https://www.webcrawler.com
-https://www.umich.edu
-https://www.avast.com
-https://www.chatwork.com
-https://www.meteofrance.com
-https://www.couchtuner.ag
-https://www.ksl.com
-https://www.uefa.com
-https://www.starwoodhotels.com
-https://www.cima4u.tv
-https://www.squareup.com
-https://www.idealista.com
-https://www.zdnet.com
-https://www.sanook.com
-https://www.vidzi.tv
-https://www.jcrew.com
-https://www.namu.wiki
-https://www.99acres.com
-https://www.amarujala.com
-https://www.wikispaces.com
-https://www.williamhill.com
-https://www.cb01.co
-https://www.netdna-cdn.com
-https://www.bloglovin.com
-https://www.cabelas.com
-https://www.musica.com
-https://www.ems.com.cn
-https://www.jetblue.com
-https://www.sammydress.com
-https://www.crhoy.com
-https://www.globaltestmarket.com
-https://www.bastillepost.com
-https://www.zhibo8.cc
-https://www.lastpass.com
-https://www.googlevideo.com
-https://www.angieslist.com
-https://www.pcadvisor.co.uk
-https://www.google.com.ly
-https://www.eldorado.ru
-https://www.zazzle.com
-https://www.gumtree.co.za
-https://www.imagetwist.com
-https://www.carwale.com
-https://www.hollywoodlife.com
-https://www.craigslist.ca
-https://www.lamoda.ru
-https://www.sedty.com
-https://www.blomaga.jp
-https://www.zcool.com.cn
-https://www.spanishdict.com
-https://www.synchronycredit.com
-https://www.sap.com
-https://www.soosooka.com
-https://www.searchengineland.com
-https://www.bartarinha.ir
-https://www.yr.no
-https://www.recruit.co.jp
-https://www.theweathernetwork.com
-https://www.yandex.com
-https://www.yunpan.cn
-https://www.1tv.ru
-https://www.aucfan.com
-https://www.city-data.com
-https://www.healthgrades.com
-https://www.zimbio.com
-https://www.shine.com
-https://www.icook.tw
-https://www.betradar.com
-https://www.index.hu
-https://www.christian-dogma.com
-https://www.scotiabank.com
-https://www.popmyads.com
-https://www.creditmutuel.fr
-https://www.smbc-card.com
-https://www.zoopla.co.uk
-https://www.att.net
-https://www.mos.ru
-https://www.sport1.de
-https://www.pizzahut.com
-https://www.ibtimes.com
-https://www.newsnow.co.uk
-https://www.cosmopolitan.com
-https://www.who.is
-https://www.dealwifi.com
-https://www.chinatimes.com
-https://www.pex.jp
-https://www.cc.com
-https://www.liepin.com
-https://www.exam8.com
-https://www.urbanoutfitters.com
-https://www.lonelyplanet.com
-https://www.xero.com
-https://www.submarino.com.br
-https://www.barclays.co.uk
-https://www.tvn24.pl
-https://www.nguyentandung.org
-https://www.misr5.com
-https://www.kaiserpermanente.org
-https://www.sparknotes.com
-https://www.dickssportinggoods.com
-https://www.blogspot.tw
-https://www.sportsdirect.com
-https://www.tradedoubler.com
-https://www.dealnews.com
-https://www.pochta.ru
-https://www.vodafone.in
-https://www.kenh14.vn
-https://www.fetlife.com
-https://www.ucla.edu
-https://www.lifehack.org
-https://www.lagaceta.com.ar
-https://www.suumo.jp
-https://www.tebyan.net
-https://www.ivi.ru
-https://www.flipboard.com
-https://www.republika.co.id
-https://www.faz.net
-https://www.lavanguardia.com
-https://www.slashdot.org
-https://www.avclub.com
-https://www.toyokeizai.net
-https://www.buscape.com.br
-https://www.smallseotools.com
-https://www.newsmth.net
-https://www.docomo.ne.jp
-https://www.staticflickr.com
-https://www.mangahere.co
-https://www.fnac.com
-https://www.pelis24.com
-https://www.westpac.com.au
-https://www.washington.edu
-https://www.olx.kz
-https://www.jstor.org
-https://www.tiu.ru
-https://www.baskino.club
-https://www.lazada.com.my
-https://www.suruga-ya.jp
-https://www.square-enix.com
-https://www.rackspace.com
-https://www.dhl.de
-https://www.icbc.com.cn
-https://www.zalukaj.com
-https://www.iteye.com
-https://www.avira.com
-https://www.bayt.com
-https://www.rabobank.nl
-https://www.uproxx.com
-https://www.adslgate.com
-https://www.w3school.com.cn
-https://www.vector.co.jp
-https://www.dw.com
-https://www.way2sms.com
-https://www.rutube.ru
-https://www.boc.cn
-https://www.kmart.com
-https://www.blogspot.com.co
-https://www.haraj.com.sa
-https://www.nouvelobs.com
-https://www.clips4sale.com
-https://www.netsuite.com
-https://www.fatwallet.com
-https://www.cumhuriyet.com.tr
-https://www.zdf.de
-https://www.state.tx.us
-https://www.epicurious.com
-https://www.sakshi.com
-https://www.protect0r.com
-https://www.google.jo
-https://www.laposte.net
-https://www.sunporno.com
-https://www.1varzesh.com
-https://www.logitech.com
-https://www.lohaco.jp
-https://www.iflscience.com
-https://www.rocketnews24.com
-https://www.worldoftanks.ru
-https://www.seriesflv.net
-https://www.sports.ru
-https://www.sina.com.tw
-https://www.voyages-sncf.com
-https://www.books.com.tw
-https://www.ulta.com
-https://www.url1.me
-https://www.news24.com
-https://www.navyfederal.org
-https://www.arbeitsagentur.de
-https://www.mp4ba.com
-https://www.gocomics.com
-https://www.beeline.ru
-https://www.ning.com
-https://www.namecheap.com
-https://www.journaldesfemmes.com
-https://www.realsimple.com
-https://www.ajanshaber.com
-https://www.coolmath-games.com
-https://www.diretta.it
-https://www.meituan.com
-https://www.alohatube.com
-https://www.nitroflare.com
-https://www.bancobrasil.com.br
-https://www.gogoanime.io
-https://www.mojang.com
-https://www.rbcroyalbank.com
-https://www.timetobreak.com
-https://www.pcgamer.com
-https://www.trafstarcurlms.com
-https://www.daraz.pk
-https://www.ex.ua
-https://www.inquisitr.com
-https://www.ccavenue.com
-https://www.attn.com
-https://www.myspace.com
-https://www.sanspo.com
-https://www.blogsky.com
-https://www.marksandspencer.com
-https://www.marmiton.org
-https://www.doc88.com
-https://www.naij.com
-https://www.resultados-futbol.com
-https://www.google.com.gh
-https://www.yourdictionary.com
-https://www.vulture.com
-https://www.senejet.net
-https://www.ameritrade.com
-https://www.debate.com.mx
-https://www.betfair.com
-https://www.toptenreviews.com
-https://www.trademe.co.nz
-https://www.overdrive.com
-https://www.porntube.com
-https://www.elintransigente.com
-https://www.babylon.com
-https://www.history.com
-https://www.soccerway.com
-https://www.livestream.com
-https://www.ap.org
-https://www.iltasanomat.fi
-https://www.minecraftforum.net
-https://www.willhaben.at
-https://www.rosegal.com
-https://www.video-one.com
-https://www.minuto30.com
-https://www.sourcenext.com
-https://www.toutiao.com
-https://www.arabi21.com
-https://www.ustream.tv
-https://www.gtbank.com
-https://www.wisc.edu
-https://www.payu.in
-https://www.shahrekhabar.com
-https://www.papajohns.com
-https://www.ck101.com
-https://www.mehrnews.com
-https://www.jd.hk
-https://www.kapook.com
-https://www.qidian.com
-https://www.alimama.com
-https://www.rakuten-sec.co.jp
-https://www.google.ba
-https://www.ttshow.tw
-https://www.autoblog.com
-https://www.0103.pics
-https://www.b9dm.com
-https://www.baomihua.com
-https://www.criteo.com
-https://www.bol.com
-https://www.psychologytoday.com
-https://www.level3.com
-https://www.cheezburger.com
-https://www.newsmax.com
-https://www.colourpop.com
-https://www.20minutes.fr
-https://www.chegg.com
-https://www.columbia.edu
-https://www.imagefap.com
-https://www.clicksvenue.com
-https://www.geico.com
-https://www.joins.com
-https://www.kotak.com
-https://www.societegenerale.fr
-https://www.konga.com
-https://www.kinokrad.net
-https://www.gizmodo.jp
-https://www.britishairways.com
-https://www.farfesh.com
-https://www.google.com.bo
-https://www.made-in-china.com
-https://www.phoenixads.co.in
-https://www.ilsole24ore.com
-https://www.ku6.com
-https://www.bizrate.com
-https://www.thrillist.com
-https://www.zapmeta.ws
-https://www.koreastardaily.com
-https://www.greatandhra.com
-https://www.pornhd.com
-https://www.uidai.gov.in
-https://www.charter.net
-https://www.i.ua
-https://www.cargurus.com
-https://www.mawdoo3.com
-https://www.0109.pics
-https://www.onlinekhabar.com
-https://www.www.nhs.uk
-https://www.sh0rt.site
-https://www.bet365.es
-https://www.saavn.com
-https://www.tmall.hk
-https://www.monografias.com
-https://www.mbank.pl
-https://www.opensooq.com
-https://www.reverb.com
-https://www.sky.de
-https://www.askgamblers.com
-https://www.privat24.ua
-https://www.templatemonster.com
-https://www.plala.or.jp
-https://www.lolking.net
-https://www.pps.tv
-https://www.researchnow.com
-https://www.timeout.com
-https://www.mathworks.com
-https://www.dantri.com.vn
-https://www.metrotvnews.com
-https://www.onlinevideoconverter.com
-https://www.theonion.com
-https://www.storm.mg
-https://www.pointtown.com
-https://www.vanguardngr.com
-https://www.moneyforward.com
-https://www.tickld.com
-https://www.creativemarket.com
-https://www.xueqiu.com
-https://www.tripadvisor.fr
-https://www.hotwire.com
-https://www.juegos.com
-https://www.videoyoum7.com
-https://www.biblehub.com
-https://www.cna.com.tw
-https://www.gilt.com
-https://www.ford.com
-https://www.kt9267.com
-https://www.sonyentertainmentnetwork.com
-https://www.tinypic.com
-https://www.fudan.edu.cn
-https://www.sciencedaily.com
-https://www.go2cloud.org
-https://www.business-standard.com
-https://www.webry.info
-https://www.zeroredirect10.com
-https://www.doctissimo.fr
-https://www.sheknows.com
-https://www.health.com
-https://www.cic.gc.ca
-https://www.forocoches.com
-https://www.zedo.com
-https://www.homes.co.jp
-https://www.akhbarak.net
-https://www.tv.com
-https://www.0382.pics
-https://www.one.com
-https://www.watchmygf.net
-https://www.flagrasamadores.net
-https://www.regions.com
-https://www.dailycaller.com
-https://www.apartmenttherapy.com
-https://www.dxy.cn
-https://www.plurk.com
-https://www.moneysavingexpert.com
-https://www.rtve.es
-https://www.ccb.com.cn
-https://www.logmein.com
-https://www.baiducontent.com
-https://www.vidyomani.tv
-https://www.178.com
-https://www.delfi.lt
-https://www.uploadboy.com
-https://www.tandfonline.com
-https://www.zhanqi.tv
-https://www.googleapis.com
-https://www.service.gov.uk
-https://www.libraryreserve.com
-https://www.larousse.fr
-https://www.google.com.lb
-https://www.csgolounge.com
-https://www.wmtransfer.com
-https://www.meowshare.com
-https://www.manta.com
-https://www.thesun.co.uk
-https://www.torrentz.in
-https://www.ycombinator.com
-https://www.readthedocs.org
-https://www.247sports.com
-https://www.n-tv.de
-https://www.caranddriver.com
-https://www.citrixonline.com
-https://www.blackhatworld.com
-https://www.asp.net
-https://www.pornolab.net
-https://www.mindbodyonline.com
-https://www.todayhumor.co.kr
-https://www.gettyimages.com
-https://www.techtudo.com.br
-https://www.bigpoint.com
-https://www.pordede.com
-https://www.wa.gov
-https://www.seesaawiki.jp
-https://www.asda.com
-https://www.google.com.uy
-https://www.sbicard.com
-https://www.teacherspayteachers.com
-https://www.familysearch.org
-https://www.siriusxm.com
-https://www.utexas.edu
-https://www.slopeaota.com
-https://www.pornmd.com
-https://www.tagesschau.de
-https://www.ingbank.pl
-https://www.mysynchrony.com
-https://www.mypearson.com
-https://www.passportindia.gov.in
-https://www.goo-net.com
-https://www.viva.co.id
-https://www.1fichier.com
-https://www.ebrun.com
-https://www.findagrave.com
-https://www.duden.de
-https://www.citilink.ru
-https://www.nrk.no
-https://www.hbogo.com
-https://www.atlassian.com
-https://www.90min.com
-https://www.le360.ma
-https://www.unblocked.red
-https://www.redbubble.com
-https://www.netshoes.com.br
-https://www.yaraon-blog.com
-https://www.usajobs.gov
-https://www.omni7.jp
-https://www.jiwu.com
-https://www.webs.com
-https://www.ixxx.com
-https://www.nesn.com
-https://www.href.li
-https://www.ouedkniss.com
-https://www.jetbrains.com
-https://www.google.ee
-https://www.wolframalpha.com
-https://www.freelotto.com
-https://www.fastpic.ru
-https://www.seek.com.au
-https://www.abv.bg
-https://www.proboards.com
-https://www.huya.com
-https://www.fotolia.com
-https://www.sewar.net
-https://www.jjwxc.net
-https://www.sport.es
-https://www.mundosexanuncio.com
-https://www.nj.com
-https://www.gazetevatan.com
-https://www.hitc.com
-https://www.flaticon.com
-https://www.07073.com
-https://www.deutsche-bank.de
-https://www.qiwi.com
-https://www.bhg.com
-https://www.rimanews.com
-https://www.dizibox.com
-https://www.lazyadsmedia.com
-https://www.bigfishgames.com
-https://www.who.int
-https://www.chomikuj.pl
-https://www.superjob.ru
-https://www.newtab-tv.com
-https://www.delicious.com
-https://www.cmbchina.com
-https://www.epfoservices.in
-https://www.hihi2.com
-https://www.commerzbank.de
-https://www.pornhublive.com
-https://www.blic.rs
-https://www.skyrock.com
-https://www.interpark.com
-https://www.moudamepo.com
-https://www.timesjobs.com
-https://www.otzovik.com
-https://www.intentmedia.net
-https://www.venturebeat.com
-https://www.brightside.me
-https://www.livingsocial.com
-https://www.inmotionhosting.com
-https://www.fanatik.com.tr
-https://www.shoutmeloud.com
-https://www.johnlewis.com
-https://www.sonymobile.com
-https://www.web.tv
-https://www.anipo.jp
-https://www.va.gov
-https://www.nur.kz
-https://www.infojobs.net
-https://www.wonderlandads.com
-https://www.addtoany.com
-https://www.entekhab.ir
-https://www.zerohedge.com
-https://www.kijiji.it
-https://www.ashleyrnadison.com
-https://www.lajmi.net
-https://www.travelchannel.com
-https://www.keywordblocks.com
-https://www.streamcomplet.com
-https://www.mtime.com
-https://www.teespring.com
-https://www.bdnews24.com
-https://www.sinaimg.cn
-https://www.successfactors.com
-https://www.umn.edu
-https://www.myegy.to
-https://www.onpato.ru
-https://www.lcl.fr
-https://www.po.st
-https://www.bouyguestelecom.fr
-https://www.staticwebdom.com
-https://www.sky.it
-https://www.feebee.com.tw
-https://www.google.com.sv
-https://www.ithome.com
-https://www.bostonglobe.com
-https://www.wyborcza.pl
-https://www.twitcasting.tv
-https://www.anz.com
-https://www.scholastic.com
-https://www.nacion.com
-https://www.lvmama.com
-https://www.eset.com
-https://www.research-panel.jp
-https://www.jcb.co.jp
-https://www.magicbricks.com
-https://www.adk2x.com
-https://www.qatarairways.com
-https://www.giga.de
-https://www.danawa.com
-https://www.rawstory.com
-https://www.trafficmonsoon.com
-https://www.soft98.ir
-https://www.static1.squarespace.com
-https://www.zoosk.com
-https://www.priceminister.com
-https://www.monova.org
-https://www.mercola.com
-https://www.illinois.edu
-https://www.op.gg
-https://www.lazada.com.ph
-https://www.manualslib.com
-https://www.showroomprive.com
-https://www.yatra.com
-https://www.mango.com
-https://www.tukif.com
-https://www.po-kaki-to.com
-https://www.turnitin.com
-https://www.pbskids.org
-https://www.trkute.com
-https://www.envato.com
-https://www.news-us.jp
-https://www.bulbagarden.net
-https://www.alibaba-inc.com
-https://www.17k.com
-https://www.uscis.gov
-https://www.jusbrasil.com.br
-https://www.actblue.com
-https://www.bankmandiri.co.id
-https://www.tahrirnews.com
-https://www.periscope.tv
-https://www.schoology.com
-https://www.surveyrouter.com
-https://www.crunchbase.com
-https://www.wwwpromoter.com
-https://www.adam4adam.com
-https://www.onlymyhealth.com
-https://www.rockstargames.com
-https://www.kinozal.tv
-https://www.cra-arc.gc.ca
-https://www.graphicriver.net
-https://www.mejortorrent.com
-https://www.thestreet.com
-https://www.banki.ru
-https://www.nowvideo.sx
-https://www.lolesports.com
-https://www.vonvon.me
-https://www.blockchain.info
-https://www.boston.com
-https://www.ggpht.com
-https://www.hyatt.com
-https://www.couchtuner.city
-https://www.alc.co.jp
-https://www.pudelek.pl
-https://www.planetminecraft.com
-https://www.listindiario.com
-https://www.indiarailinfo.com
-https://www.onlinemoviewatchs.com
-https://www.iobit.com
-https://www.navitime.co.jp
-https://www.aljazeera.com
-https://www.dagbladet.no
-https://www.mydocomo.com
-https://www.dreevee.com
-https://www.un.org
-https://www.piliapp.com
-https://www.zoominfo.com
-https://www.traidnt.net
-https://www.centurylink.com
-https://www.dx.com
-https://www.trafficshop.com
-https://www.dawanda.com
-https://www.mafengwo.cn
-https://www.nab.com.au
-https://www.banvenez.com
-https://www.collegeboard.org
-https://www.ink361.com
-https://www.aruba.it
-https://www.xvideo-jp.com
-https://www.streamable.com
-https://www.mediamarkt.de
-https://www.extra.com.br
-https://www.freenet.de
-https://www.dayt.se
-https://www.casasbahia.com.br
-https://www.exhentai.org
-https://www.animaljam.com
-https://www.dcinside.com
-https://www.frys.com
-https://www.leparisien.fr
-https://www.holiday-weather.com
-https://www.oxforddictionaries.com
-https://www.bioyun.com
-https://www.polygon.com
-https://www.alodokter.com
-https://www.yammer.com
-https://www.gosuslugi.ru
-https://www.zopim.com
-https://www.signupgenius.com
-https://www.akb48matomemory.com
-https://www.mundodeportivo.com
-https://www.plex.tv
-https://www.natwest.com
-https://www.next.co.uk
-https://www.inps.it
-https://www.neogaf.com
-https://www.olx.com.pk
-https://www.thethao247.vn
-https://www.cibc.com
-https://www.theknot.com
-https://www.wpbeginner.com
-https://www.nyu.edu
-https://www.diaforetiko.gr
-https://www.nationwide.co.uk
-https://www.skycn.com
-https://www.xsrv.jp
-https://www.sbrf.ru
-https://www.google.com.qa
-https://www.masrawy.com
-https://www.bama.ir
-https://www.privalia.com
-https://www.trafficfactory.biz
-https://www.hongkiat.com
-https://www.elitetorrent.net
-https://www.ucdavis.edu
-https://www.clubic.com
-https://www.medianewtab.com
-https://www.mathxl.com
-https://www.yoob.com
-https://www.farpost.ru
-https://www.shopbop.com
-https://www.multitran.ru
-https://www.kanald.com.tr
-https://www.bancsabadell.com
-https://www.techrepublic.com
-https://www.lazada.co.th
-https://www.cloob.com
-https://www.pitchfork.com
-https://www.css-tricks.com
-https://www.sf-express.com
-https://www.nesaporn.com
-https://www.tripadvisor.es
-https://www.hugedomains.com
-https://www.elle.com
-https://www.123movies.to
-https://www.nps.gov
-https://www.smrtgsrtbsourceads.net
-https://www.safenetdir.com
-https://www.a-q-f.com
-https://www.thomsonreuters.com
-https://www.arecio.work
-https://www.buffer.com
-https://www.diamond.jp
-https://www.younow.com
-https://www.standardbank.co.za
-https://www.sme.sk
-https://www.noticias.uol.com.br
-https://www.thewhizmarketing.com
-https://www.vtv.vn
-https://www.zoomit.ir
-https://www.trovaprezzi.it
-https://www.banquepopulaire.fr
-https://www.letras.mus.br
-https://www.myworkday.com
-https://www.patreon.com
-https://www.youradexchange.com
-https://www.cyberciti.biz
-https://www.linkshrink.net
-https://www.leroymerlin.fr
-https://www.michaels.com
-https://www.liftable.com
-https://www.yle.fi
-https://www.imgchili.net
-https://www.tchibo.de
-https://www.0128.pics
-https://www.chsi.com.cn
-https://www.malwarebytes.org
-https://www.upenn.edu
-https://www.jpnn.com
-https://www.examiner.com
-https://www.usda.gov
-https://www.turkiye.gov.tr
-https://www.google.com.bh
-https://www.qiita.com
-https://www.scottrade.com
-https://www.newsit.gr
-https://www.morningstar.com
-https://www.eltiempo.es
-https://www.elegantthemes.com
-https://www.aaa.com
-https://www.index.hr
-https://www.porn.porn
-https://www.nhaccuatui.com
-https://www.amc.com
-https://www.punchng.com
-https://www.dy2018.com
-https://www.korrespondent.net
-https://www.immowelt.de
-https://www.jra.go.jp
-https://www.fakt.pl
-https://www.51auto.com
-https://www.google.com.kh
-https://www.expressen.se
-https://www.finalfantasyxiv.com
-https://www.toranoana.jp
-https://www.8drama.com
-https://www.cheapoair.com
-https://www.shadbase.com
-https://www.searchincognito.com
-https://www.oricon.co.jp
-https://www.craftsy.com
-https://www.ipeen.com.tw
-https://www.rojadirecta.me
-https://www.dhs.gov
-https://www.189.cn
-https://www.hateblo.jp
-https://www.smbc.co.jp
-https://www.tribune.com.pk
-https://www.spokeo.com
-https://www.infowars.com
-https://www.thoughtcatalog.com
-https://www.encuentra24.com
-https://www.filgoal.com
-https://www.iefimerida.gr
-https://www.kisscartoon.me
-https://www.safefinder.com
-https://www.baimao.com
-https://www.boursorama.com
-https://www.dix3.com
-https://www.coursehero.com
-https://www.freshdesk.com
-https://www.money.pl
-https://www.bigcartel.com
-https://www.whatculture.com
-https://www.skrill.com
-https://www.viadeo.com
-https://www.vic.gov.au
-https://www.prntscr.com
-https://www.curse.com
-https://www.fs.to
-https://www.laposte.fr
-https://www.zipbogo.net
-https://www.shopstyle.com
-https://www.sport.cz
-https://www.mlive.com
-https://www.yahoo.net
-https://www.wufoo.com
-https://www.wetteronline.de
-https://www.livemaster.ru
-https://www.statefarm.com
-https://www.28.com
-https://www.megafon.ru
-https://www.popkade.ir
-https://www.bmo.com
-https://www.cox.com
-https://www.japannetbank.co.jp
-https://www.similarweb.com
-https://www.inven.co.kr
-https://www.hirufm.lk
-https://www.cankaoxiaoxi.com
-https://www.forexfactory.com
-https://www.bbva.es
-https://www.kotobank.jp
-https://www.trustedreviews.com
-https://www.indiapost.gov.in
-https://www.trusttraffic.de
-https://www.gfan.com
-https://www.invisionapp.com
-https://www.tvbs.com.tw
-https://www.cqnews.net
-https://www.zap2it.com
-https://www.lastampa.it
-https://www.eltiempo.com
-https://www.alarab.com
-https://www.ccidnet.com
-https://www.rae.es
-https://www.guokr.com
-https://www.gsgazete.com
-https://www.ubuntuforums.org
-https://www.taoche.com
-https://www.whois.com
-https://www.heavy.com
-https://www.qoo10.sg
-https://www.bancomercantil.com
-https://www.mgtv.com
-https://www.vanityfair.com
-https://www.getresponse.com
-https://www.paparazzieg.com
-https://www.ansa.it
-https://www.8tracks.com
-https://www.blogspot.com.ng
-https://www.drupal.org
-https://www.wmaraci.com
-https://www.zakzak.co.jp
-https://www.anetwork.ir
-https://www.worldcat.org
-https://www.itv.com
-https://www.blogos.com
-https://www.ae.com
-https://www.allmusic.com
-https://www.llbean.com
-https://www.stuff.co.nz
-https://www.githubusercontent.com
-https://www.viralthread.com
-https://www.nex1music.ir
-https://www.voonik.com
-https://www.brides.com.cn
-https://www.lidl.de
-https://www.todaypk.com
-https://www.pmang.jp
-https://www.shmoop.com
-https://www.iloveoldschoolmusic.com
-https://www.matomeantena.com
-https://www.tikona.in
-https://www.chengdu.cn
-https://www.7769domain.com
-https://www.talkingpointsmemo.com
-https://www.ameli.fr
-https://www.ehowenespanol.com
-https://www.say-move.org
-https://www.spiceworks.com
-https://www.almubasher.com.sa
-https://www.mudah.my
-https://www.telecomitalia.it
-https://www.mapion.co.jp
-https://www.tass.ru
-https://www.qianlong.com
-https://www.toyota.jp
-https://www.wikiwand.com
-https://www.gravatar.com
-https://www.yiqifa.com
-https://www.mmmoffice.com
-https://www.btolat.com
-https://www.labirint.ru
-https://www.bigccq.cn
-https://www.techinsider.io
-https://www.akairan.com
-https://www.camelcamelcamel.com
-https://www.origin.com
-https://www.stern.de
-https://www.linguee.fr
-https://www.rentalcars.com
-https://www.enjoydressup.com
-https://www.sanjesh.org
-https://www.netbk.co.jp
-https://www.cctv.com
-https://www.mnrate.com
-https://www.all.biz
-https://www.pc6.com
-https://www.adidas.com
-https://www.twipple.jp
-https://www.thinkprogress.org
-https://www.literotica.com
-https://www.radaronline.com
-https://www.cn163.net
-https://www.centurylink.net
-https://www.ipage.com
-https://www.ixl.com
-https://www.todoist.com
-https://www.heureka.cz
-https://www.imlive.com
-https://www.govome.com
-https://www.padlet.com
-https://www.serviporno.com
-https://www.dnsrsearch.com
-https://www.vodafone.de
-https://www.lumosity.com
-https://www.ipsosinteractive.com
-https://www.blog.com
-https://www.new-rutor.org
-https://www.turkishairlines.com
-https://www.bgr.com
-https://www.with2.net
-https://www.alaskaair.com
-https://www.seriouseats.com
-https://www.zoznam.sk
-https://www.lianjia.com
-https://www.commonhealth.com.tw
-https://www.hgtv.com
-https://www.3sk.tv
-https://www.xjtour.com
-https://www.wangtu.com
-https://www.udacity.com
-https://www.eater.com
-https://www.yessearches.com
-https://www.exist.ru
-https://www.sierratradingpost.com
-https://www.53.com
-https://www.ing-diba.de
-https://www.adweek.com
-https://www.pons.com
-https://www.directadvert.ru
-https://www.onclicktop.com
-https://www.u67gam.com
-https://www.warriorforum.com
-https://www.sportbox.ru
-https://www.lloydsbank.com
-https://www.wikibooks.org
-https://www.gtmetrix.com
-https://www.wpengine.com
-https://www.visualstudio.com
-https://www.raspberrypi.org
-https://www.dubizzle.com
-https://www.elasticbeanstalk.com
-https://www.nsw.gov.au
-https://www.marthastewart.com
-https://www.nowvideo.li
-https://www.anybunny.com
-https://www.bigbangnews.com
-https://www.nvidia.com
-https://www.kolesa.kz
-https://www.standardchartered.com
-https://www.sport24.gr
-https://www.ria.com
-https://www.mapy.cz
-https://www.filelist.ro
-https://www.jiji.com
-https://www.popularmechanics.com
-https://www.potterybarn.com
-https://www.blogspot.kr
-https://www.movierulz.to
-https://www.honda.co.jp
-https://www.phunuvagiadinh.vn
-https://www.ibtimes.co.in
-https://www.sagawa-exp.co.jp
-https://www.prizegrab.com
-https://www.theglobeandmail.com
-https://www.tv8.com.tr
-https://www.ally.com
-https://www.elbotola.com
-https://www.datafile.com
-https://www.payscale.com
-https://www.18183.com
-https://www.cuny.edu
-https://www.meishichina.com
-https://www.login.tmall.com
-https://www.rstyle.me
-https://www.hinet.net
-https://www.angel.co
-https://www.coupondunia.in
-https://www.sendspace.com
-https://www.5dcar.com
-https://www.tv2.no
-https://www.iwank.tv
-https://www.alwakeelnews.com
-https://www.banglanews24.com
-https://www.perezhilton.com
-https://www.cdninstagram.com
-https://www.centrum24.pl
-https://www.grubhub.com
-https://www.alitrip.com
-https://www.internetspeedtracker.com
-https://www.grabon.in
-https://www.cafe24.com
-https://www.teamchanypshow.net
-https://www.screenrant.com
-https://www.vidbull.com
-https://www.landsend.com
-https://www.citationmachine.net
-https://www.yify-torrent.org
-https://www.google.com.af
-https://www.sony.com
-https://www.bankbazaar.com
-https://www.omegle.com
-https://www.yandex.net
-https://www.wykop.pl
-https://www.promocodeclub.com
-https://www.realtor.ca
-https://www.tosarang2.net
-https://www.shabdkosh.com
-https://www.sammobile.com
-https://www.buenastareas.com
-https://www.pop-music.ir
-https://www.kroger.com
-https://www.smugmug.com
-https://www.neimanmarcus.com
-https://www.yummly.com
-https://www.citibank.com
-https://www.navient.com
-https://www.dorkly.com
-https://www.desjardins.com
-https://www.everydayhealth.com
-https://www.consultant.ru
-https://www.alhea.com
-https://www.sarkariresult.com
-https://www.direct.gov.uk
-https://www.lowyat.net
-https://www.ad4game.com
-https://www.blu-ray.com
-https://www.express.com.pk
-https://www.livescores.biz
-https://www.mightytext.net
-https://www.joomla.org
-https://www.ucoz.com
-https://www.tasify.com
-https://www.meb.gov.tr
-https://www.kalerkantho.com
-https://www.fotor.com
-https://www.moviepilot.com
-https://www.comicbook.com
-https://www.yxdown.com
-https://www.redbus.in
-https://www.ralphlauren.com
-https://www.dikaiologitika.gr
-https://www.duga.jp
-https://www.auone.jp
-https://www.jofogas.hu
-https://www.videolan.org
-https://www.pages.tmall.com
-https://www.ddanzi.com
-https://www.e1.ru
-https://www.appbank.net
-https://www.swiki.jp
-https://www.justjared.com
-https://www.jkforum.net
-https://www.tankionline.com
-https://www.ultipro.com
-https://www.sagepub.com
-https://www.livescience.com
-https://www.apartments.com
-https://www.mamba.ru
-https://www.nintendo.com
-https://www.tamin.ir
-https://www.oriflame.com
-https://www.uloz.to
-https://www.vz.ru
-https://www.taxact.com
-https://www.absa.co.za
-https://www.telecinco.es
-https://www.scol.com.cn
-https://www.thebrowsergame.com
-https://www.freep.com
-https://www.boardgamegeek.com
-https://www.viidii.info
-https://www.pontofrio.com.br
-https://www.elle.com.tw
-https://www.backcountry.com
-https://www.bollywoodbubble.com
-https://www.gazzetta.gr
-https://www.leadzu.com
-https://www.swedbank.se
-https://www.bazos.sk
-https://www.ntv.com.tr
-https://www.spotlight-media.jp
-https://www.withgoogle.com
-https://www.centrum.cz
-https://www.nordstromrack.com
-https://www.islamweb.net
-https://www.monsterindia.com
-https://www.semrush.com
-https://www.trovi.com
-https://www.searchlock.com
-https://www.telekom.de
-https://www.leadpages.co
-https://www.immobiliare.it
-https://www.vibbo.com
-https://www.meinestadt.de
-https://www.armorgames.com
-https://www.laprensagrafica.com
-https://www.moi.gov.sa
-https://www.fararu.com
-https://www.servedbytrackingdesk.com
-https://www.aizhan.com
-https://www.canon.jp
-https://www.elsalvador.com
-https://www.easybib.com
-https://www.serialssolutions.com
-https://www.optimum.net
-https://www.nasdaq.com
-https://www.gmx.at
-https://www.etnet.com.hk
-https://www.adobelogin.com
-https://www.yemeksepeti.com
-https://www.fatakat.com
-https://www.tune.pk
-https://www.amd.com
-https://www.unblocked.li
-https://www.mangapanda.com
-https://www.gelocal.it
-https://www.monex.co.jp
-https://www.7k7k.com
-https://www.dpstream.net
-https://www.ezinearticles.com
-https://www.boxofficemojo.com
-https://www.ligtv.com.tr
-https://www.elcorteingles.es
-https://www.codeplex.com
-https://www.jorudan.co.jp
-https://www.clickbank.com
-https://www.gpoint.co.jp
-https://www.ucsd.edu
-https://www.blogmura.com
-https://www.walmart.com.br
-https://www.skyscrapercity.com
-https://www.creditonebank.com
-https://www.harborfreight.com
-https://www.eluniversal.com.mx
-https://www.ismedia.jp
-https://www.seloger.com
-https://www.jetstar.com
-https://www.creativebloq.com
-https://www.dongtw.com
-https://www.nintendo.co.jp
-https://www.futhead.com
-https://www.myhabit.com
-https://www.xinjunshi.com
-https://www.sparkpeople.com
-https://www.cliponyu.com
-https://www.santander.com.br
-https://www.searchpile.com
-https://www.voicenews.gr
-https://www.burst.co
-https://www.walla.co.il
-https://www.prnewswire.com
-https://www.nationalreview.com
-https://www.cnhubei.com
-https://www.oregonlive.com
-https://www.carmax.com
-https://www.petsmart.com
-https://www.boots.com
-https://www.unilad.co.uk
-https://www.24video.xxx
-https://www.emag.ro
-https://www.fujitv.co.jp
-https://www.joshinweb.jp
-https://www.whatismyipaddress.com
-https://www.bakufu.jp
-https://www.ardmediathek.de
-https://www.gruposantander.es
-https://www.huffingtonpost.co.uk
-https://www.suntory.co.jp
-https://www.clicrbs.com.br
-https://www.jiameng.com
-https://www.estadao.com.br
-https://www.quanjing.com
-https://www.talktalk.co.uk
-https://www.viator.com
-https://www.thomann.de
-https://www.makepolo.com
-https://www.wikimapia.org
-https://www.shiftdelete.net
-https://www.docusign.com
-https://www.bonprix.de
-https://www.dsw.com
-https://www.berniesanders.com
-https://www.governmentjobs.com
-https://www.eroprofile.com
-https://www.j-cast.com
-https://www.mediab.uy
-https://www.tripadvisor.de
-https://www.cas.sk
-https://www.origo.hu
-https://www.rivals.com
-https://www.motherjones.com
-https://www.ml.com
-https://www.wemakeprice.com
-https://www.irna.ir
-https://www.anandabazar.com
-https://www.pravda.com.ua
-https://www.promptfile.com
-https://www.smv.to
-https://www.emuparadise.me
-https://www.list-manage2.com
-https://www.thingiverse.com
-https://www.ttmeiju.com
-https://www.lodynet.com
-https://www.zimbra.free.fr
-https://www.mobtada.com
-https://www.torrentproject.se
-https://www.petfinder.com
-https://www.rg.ru
-https://www.diigo.com
-https://www.tradeindia.com
-https://www.10jqka.com.cn
-https://www.footlocker.com
-https://www.huffingtonpost.jp
-https://www.canalrcn.com
-https://www.jreast.co.jp
-https://www.ponta.jp
-https://www.blesk.cz
-https://www.zoom.us
-https://www.yoursearch.me
-https://www.ifixit.com
-https://www.bluestacks.com
-https://www.4tube.com
-https://www.menards.com
-https://www.alabout.com
-https://www.rincondelvago.com
-https://www.slrclub.com
-https://www.panasonic.com
-https://www.segundamano.mx
-https://www.syosetu.org
-https://www.518.com.tw
-https://www.espnfc.com
-https://www.menshealth.com
-https://www.minijuegos.com
-https://www.lofter.com
-https://www.inoreader.com
-https://www.cs.com.cn
-https://www.tbs.co.jp
-https://www.britannica.com
-https://www.pikore.com
-https://www.bom.gov.au
-https://www.homes.com
-https://www.draugiem.lv
-https://www.mystartsearch.com
-https://www.freshbooks.com
-https://www.csfd.cz
-https://www.lufthansa.com
-https://www.mangbongda.net
-https://www.kugou.com
-https://www.almaany.com
-https://www.rankingsandreviews.com
-https://www.jawabkom.com
-https://www.licindia.in
-https://www.jxntv.cn
-https://www.shinobi.jp
-https://www.cheatsheet.com
-https://www.forexpf.ru
-https://www.simpletds.net
-https://www.mabanque.bnpparibas
-https://www.justanswer.com
-https://www.minecraftskins.com
-https://www.verseriesynovelas.tv
-https://www.nalog.ru
-https://www.masturbate.io
-https://www.nwolb.com
-https://www.fmworld.net
-https://www.soy502.com
-https://www.blkget8.com
-https://www.autozone.com
-https://www.usc.edu
-https://www.nick.com
-https://www.academic.ru
-https://www.nttxstore.jp
-https://www.hochi.co.jp
-https://www.usembassy.gov
-https://www.patrika.com
-https://www.linguee.de
-https://www.woman.ru
-https://www.eleconomista.es
-https://www.cuevana2.tv
-https://www.check24.de
-https://www.downloadha.com
-https://www.drugstore.com
-https://www.anthropologie.com
-https://www.babbel.com
-https://www.khabarfarsi.com
-https://www.andhrajyothy.com
-https://www.mp3lio.co
-https://www.espeedcheck.com
-https://www.blackberry.com
-https://www.upsocl.com
-https://www.tamilwin.com
-https://www.hi5.com
-https://www.movie2free.com
-https://www.espnfc.us
-https://www.surveygizmo.com
-https://www.trivago.com
-https://www.divyabhaskar.co.in
-https://www.fastcompany.com
-https://www.qoo10.jp
-https://www.couchsurfing.com
-https://www.oanda.com
-https://www.sarayanews.com
-https://www.deseretnews.com
-https://www.sportskeeda.com
-https://www.dinamalar.com
-https://www.folkd.com
-https://www.myfonts.com
-https://www.vov.vn
-https://www.fast-torrent.ru
-https://www.windowscentral.com
-https://www.365jia.cn
-https://www.modcloth.com
-https://www.tpsl-india.in
-https://www.softgozar.com
-https://www.keezmovies.com
-https://www.panoramio.com
-https://www.eurosport.fr
-https://www.dealmoon.com
-https://www.fraghero.com
-https://www.nextdirect.com
-https://www.votdengi.club
-https://www.hbr.org
-https://www.openoffice.org
-https://www.olx.ph
-https://www.brazzersnetwork.com
-https://www.perfectmoney.is
-https://www.aif.ru
-https://www.ideacellular.com
-https://www.isbank.com.tr
-https://www.minube.com
-https://www.retenews24.it
-https://www.pr-cy.ru
-https://www.mmotraffic.com
-https://www.enstage.com
-https://www.biccamera.com
-https://www.newsru.com
-https://www.gigacircle.com
-https://www.totaljerkface.com
-https://www.csod.com
-https://www.santabanta.com
-https://www.canon.com
-https://www.startimes.com
-https://www.6play.fr
-https://www.clickyab.com
-https://www.wenxuecity.com
-https://www.santandernet.com.br
-https://www.hometalk.com
-https://www.t411.ch
-https://www.iconfinder.com
-https://www.jandan.net
-https://www.wetalk.tw
-https://www.msu.edu
-https://www.hyperpromote.com
-https://www.90tv.ir
-https://www.knowyourmeme.com
-https://www.nyc.gov
-https://www.babyblog.ru
-https://www.cardekho.com
-https://www.goodsearch.com
-https://www.24wro.com.gr
-https://www.countryliving.com
-https://www.bloomingdales.com
-https://www.ssconline2.gov.in
-https://www.anonym.to
-https://www.post-survey.com
-https://www.yam.com
-https://www.torrentdownloads.me
-https://www.blkget5.com
-https://www.mosaiquefm.net
-https://www.philly.com
-https://www.puu.sh
-https://www.redhat.com
-https://www.deadline.com
-https://www.collegehumor.com
-https://www.gayboystube.com
-https://www.tecmundo.com.br
-https://www.kariyer.net
-https://www.ex-news.net
-https://www.washingtontimes.com
-https://www.mamaclub.com
-https://www.mensfitness.com
-https://www.zaobao.com
-https://www.itslearning.com
-https://www.dolartoday.com
-https://www.tsetmc.com
-https://www.revistaforum.com.br
-https://www.autoscout24.it
-https://www.oxfordjournals.org
-https://www.dkb.de
-https://www.cian.ru
-https://www.saraiva.com.br
-https://www.jutarnji.hr
-https://www.pingdom.com
-https://www.sankakucomplex.com
-https://www.gq.com
-https://www.abnamro.nl
-https://www.solidfiles.com
-https://www.vogue.com.tw
-https://www.mathrubhumi.com
-https://www.anandtech.com
-https://www.cmu.edu
-https://www.maalaimalar.com
-https://www.bookingbuddy.com
-https://www.toroadvertising.com
-https://www.tureng.com
-https://www.bfmtv.com
-https://www.lifescript.com
-https://www.guiltyfix.com
-https://www.mk.ru
-https://www.wine-searcher.com
-https://www.360kan.com
-https://www.copyscape.com
-https://www.gizmag.com
-https://www.definicion.de
-https://www.namethatporn.com
-https://www.joann.com
-https://www.topky.sk
-https://www.sabay.com.kh
-https://www.hikaritv.net
-https://www.acesso.uol.com.br
-https://www.dmoz.org
-https://www.123kubo.com
-https://www.top81.com.cn
-https://www.wimp.com
-https://www.reed.co.uk
-https://www.beritasatu.com
-https://www.olx.com.eg
-https://www.coupang.com
-https://www.coolkora.com
-https://www.9to5mac.com
-https://www.thenewslens.com
-https://www.91mobiles.com
-https://www.xiaomi.cn
-https://www.onlinedown.net
-https://www.aeon.co.jp
-https://www.teacup.com
-https://www.ahrefs.com
-https://www.filmaffinity.com
-https://www.pubted.com
-https://www.jang.com.pk
-https://www.dmkt-sp.jp
-https://www.mca.gov.in
-https://www.1001fonts.com
-https://www.studentdoctor.net
-https://www.rotoworld.com
-https://www.brtn.cn
-https://www.secondlife.com
-https://www.tvline.com
-https://www.agenziaentrate.gov.it
-https://www.geforce.com
-https://www.yonhapnews.co.kr
-https://www.travelzoo.com
-https://www.vidio.com
-https://www.fynsy.com
-https://www.lordpopup.com
-https://www.dmzj.com
-https://www.laredoute.fr
-https://www.yifysubtitles.com
-https://www.iqoption.com
-https://www.webgozar.com
-https://www.mastercard.com.au
-https://www.hepsibahis301.com
-https://www.acs.org
-https://www.clixten.info
-https://www.carters.com
-https://www.aktuality.sk
-https://www.intesasanpaolo.com
-https://www.mirrorcreator.com
-https://www.vitacost.com
-https://www.harpersbazaar.com
-https://www.36kr.com
-https://www.amtrak.com
-https://www.bazos.cz
-https://www.tiphero.com
-https://www.gog.com
-https://www.algornalgy.com
-https://www.downloadastro.com
-https://www.lexpress.fr
-https://www.arcor.de
-https://www.kurir.rs
-https://www.yinhang.com
-https://www.weather.com.cn
-https://www.on.cc
-https://www.vatanbilgisayar.com
-https://www.budsgunshop.com
-https://www.pornxs.com
-https://www.obdesign.com.tw
-https://www.ixbt.com
-https://www.qld.gov.au
-https://www.jmw.com.cn
-https://www.vogue.com
-https://www.yourstory.com
-https://www.ecuavisa.com
-https://www.stripe.com
-https://www.r7.com
-https://www.androidpit.com
-https://www.askmen.com
-https://www.sape.ru
-https://www.citizensbankonline.com
-https://www.fb.com
-https://www.televisionfanatic.com
-https://www.netpnb.com
-https://www.sport-fm.gr
-https://www.atmarkit.co.jp
-https://www.fark.com
-https://www.kodi.tv
-https://www.sport.pl
-https://www.okmagazine.com
-https://www.dnb.no
-https://www.triviatoday.com
-https://www.progressive.com
-https://www.mapsofindia.com
-https://www.zaycev.net
-https://www.umd.edu
-https://www.pcbeta.com
-https://www.playground.ru
-https://www.farfetch.com
-https://www.amazon.com.mx
-https://www.phimmoi.net
-https://www.altadefinizione.online
-https://www.bestbuy.ca
-https://www.mysurvey.com
-https://www.ss.lv
-https://www.bzw315.com
-https://www.symantec.com
-https://www.bancomer.com
-https://www.taikang.com
-https://www.championselect.net
-https://www.abola.pt
-https://www.getchu.com
-https://www.wonderhowto.com
-https://www.esy.es
-https://www.myrecipes.com
-https://www.mercadolibre.com.co
-https://www.etorrent.co.kr
-https://www.tatadocomo.com
-https://www.stardoll.com
-https://www.buyvip.com
-https://www.lan.com
-https://www.bankia.es
-https://www.seattletimes.com
-https://www.ya.ru
-https://www.xvideos-field5.com
-https://www.tasteofhome.com
-https://www.ren.tv
-https://www.eol.cn
-https://www.screencast.com
-https://www.getintopc.com
-https://www.ingdirect.es
-https://www.the-star.co.ke
-https://www.readms.com
-https://www.zamunda.net
-https://www.nseindia.com
-https://www.wapka.mobi
-https://www.bmail.uol.com.br
-https://www.finanzen.net
-https://www.dbw.cn
-https://www.cyol.com
-https://www.elitedaily.com
-https://www.xitek.com
-https://www.pr.gov.br
-https://www.forumfree.it
-https://www.questionablecontent.net
-https://www.shitaraba.net
-https://www.adsrvmedia.net
-https://www.metafilter.com
-https://www.canalblog.com
-https://www.hltv.org
-https://www.unc.edu
-https://www.epson.com
-https://www.pptv.com
-https://www.ticketmonster.co.kr
-https://www.ufl.edu
-https://www.cr173.com
-https://www.ilaiki.net
-https://www.3dwwwgame.com
-https://www.stoloto.ru
-https://www.intellicast.com
-https://www.tro-ma-ktiko.blogspot.gr
-https://www.texas.gov
-https://www.19lou.com
-https://www.blogspot.pe
-https://www.v1.cn
-https://www.videowood.tv
-https://www.businessinsider.in
-https://www.nos.nl
-https://www.jobvite.com
-https://www.asu.edu
-https://www.kommersant.ru
-https://www.reviewjournal.com
-https://www.fantasticpictureshindig.net
-https://www.el7l.co
-https://www.5giay.vn
-https://www.netgear.com
-https://www.opendns.com
-https://www.marinetraffic.com
-https://www.nuomi.com
-https://www.bobaedream.co.kr
-https://www.brother.com
-https://www.oi.com.br
-https://www.hbo.com
-https://www.bva-auctions.com
-https://www.jkanime.net
-https://www.royalmail.com
-https://www.princeton.edu
-https://www.bravotube.net
-https://www.idntimes.com
-https://www.seneweb.com
-https://www.bola.com
-https://www.belastingdienst.nl
-https://www.tomtom.com
-https://www.worldbank.org
-https://www.10010.com
-https://www.dafiti.com.br
-https://www.lifehacker.jp
-https://www.jobsdb.com
-https://www.theweek.com
-https://www.tvtropes.org
-https://www.onhax.net
-https://www.mlsmatrix.com
-https://www.pepperfry.com
-https://www.ouest-france.fr
-https://www.societe.com
-https://www.javpop.com
-https://www.newsweek.com
-https://www.djpunjab.video
-https://www.bbvanet.com.mx
-https://www.looper.com
-https://www.acttv.in
-https://www.nearbuy.com
-https://www.pelispedia.tv
-https://www.mhlw.go.jp
-https://www.dailyfeed.co.uk
-https://www.flightaware.com
-https://www.mobile.ir
-https://www.transfermarkt.de
-https://www.safeway.com
-https://www.bradsdeals.com
-https://www.viki.com
-https://www.gottabemobile.com
-https://www.military38.com
-https://www.honda.com
-https://www.sc.com
-https://www.svyaznoy.ru
-https://www.desire2learn.com
-https://www.morpakampus.com
-https://www.holidaycheck.de
-https://www.zamzar.com
-https://www.fixya.com
-https://www.ekstrabladet.dk
-https://www.dr.dk
-https://www.provinet.net
-https://www.exlibrisgroup.com
-https://www.nk.pl
-https://www.umeng.com
-https://www.parenting.com.tw
-https://www.filmix.net
-https://www.xiu.com
-https://www.finishline.com
-https://www.natalie.mu
-https://www.ninemsn.com.au
-https://www.giallozafferano.it
-https://www.vitalsource.com
-https://www.alternativeto.net
-https://www.iridiumsergeiprogenitor.info
-https://www.pulzo.com
-https://www.upworthy.com
-https://www.news247.gr
-https://www.simplyhired.com
-https://www.tuicool.com
-https://www.wizzair.com
-https://www.maplestage.com
-https://www.fanpop.com
-https://www.aranzulla.it
-https://www.tinkoff.ru
-https://www.m3.com
-https://www.eporner.com
-https://www.magazineluiza.com.br
-https://www.movietube.online
-https://www.huihui.cn
-https://www.persiantools.com
-https://www.tvb.com
-https://www.hmv.co.jp
-https://www.ch.com
-https://www.google.com.ni
-https://www.nga.cn
-https://www.chinaunix.net
-https://www.mappy.com
-https://www.t-nation.com
-https://www.pearsonmylabandmastering.com
-https://www.player.pl
-https://www.mxtoolbox.com
-https://www.biography.com
-https://www.financial-net.com
-https://www.idbibank.co.in
-https://www.esporte.uol.com.br
-https://www.britishcouncil.org
-https://www.webassign.net
-https://www.koha.net
-https://www.pccomponentes.com
-https://www.gouv.qc.ca
-https://www.plus.es
-https://www.digid.nl
-https://www.tripadvisor.ru
-https://www.telstra.com.au
-https://www.laughy.jp
-https://www.eurostreaming.tv
-https://www.baomoi.com
-https://www.olx.pt
-https://www.mlit.go.jp
-https://www.ultrafarma.com.br
-https://www.sport-express.ru
-https://www.someecards.com
-https://www.noa.al
-https://www.expansion.com
-https://www.rs-online.com
-https://www.ad.nl
-https://www.tvmuse.com
-https://www.joyme.com
-https://www.computerhope.com
-https://www.diy.com
-https://www.bellemaison.jp
-https://www.dasoertliche.de
-https://www.npmjs.com
-https://www.vtb24.ru
-https://www.hammihan.com
-https://www.zhe800.com
-https://www.aetna.com
-https://www.price.com.hk
-https://www.watchcartoononline.com
-https://www.shopathome.com
-https://www.boingboing.net
-https://www.opera.com
-https://www.sbi.co.in
-https://www.ctitv.com.tw
-https://www.thestorypedia.com
-https://www.zemtv.com
-https://www.bd24live.com
-https://www.ifttt.com
-https://www.subscribe.ru
-https://www.saudiairlines.com
-https://www.dallasnews.com
-https://www.vodafone.it
-https://www.localmoxie.com
-https://www.hatenablog.jp
-https://www.hearthpwn.com
-https://www.eclipse.org
-https://www.dramafever.com
-https://www.dospara.co.jp
-https://www.reduxmediia.com
-https://www.moretify.com
-https://www.zeroredirect2.com
-https://www.ebay.ie
-https://www.ole.com.ar
-https://www.campaign-archive2.com
-https://www.eyoonn.com
-https://www.ctfile.com
-https://www.honto.jp
-https://www.sporcle.com
-https://www.usenet.nl
-https://www.francetvinfo.fr
-https://www.channel4.com
-https://www.cyzone.cn
-https://www.ucweb.com
-https://www.99114.com
-https://www.hola.com
-https://www.businessdictionary.com
-https://www.wlp-acs.com
-https://www.bakusai.com
-https://www.scout.com
-https://www.healthcare.gov
-https://www.upjers.com
-https://www.saksfifthavenue.com
-https://www.service-now.com
-https://www.worktile.com
-https://www.tvnow.de
-https://www.ahram.org.eg
-https://www.thecelebslife.com
-https://www.disneystore.com
-https://www.qip.ru
-https://www.carzoom.in
-https://www.phununet.com
-https://www.mixcloud.com
-https://www.chooseauto.com.cn
-https://www.csair.com
-https://www.xl.pt
-https://www.banamex.com.mx
-https://www.typeform.com
-https://www.indeed.fr
-https://www.google.com.cy
-https://www.mydealz.de
-https://www.xmlheads.com
-https://www.angularjs.org
-https://www.megogo.net
-https://www.v9.com
-https://www.tripadvisor.jp
-https://www.imore.com
-https://www.121ware.com
-https://www.gleam.io
-https://www.mpnrs.com
-https://www.cncn.org.cn
-https://www.movixhub.com
-https://www.domofond.ru
-https://www.iptorrents.com
-https://www.independent.ie
-https://www.etonline.com
-https://www.underarmour.com
-https://www.hilltopads.net
-https://www.aufeminin.com
-https://www.91jm.com
-https://www.powerschool.com
-https://www.znds.com
-https://www.conduit.com
-https://www.globaltimes.cn
-https://www.gucheng.com
-https://www.therichest.com
-https://www.lenovo.com.cn
-https://www.users.wix.com
-https://www.wanfangdata.com.cn
-https://www.smartsheet.com
-https://www.locanto.in
-https://www.archive.is
-https://www.gunbroker.com
-https://www.cengage.com
-https://www.rai.tv
-https://www.censor.net.ua
-https://www.yale.edu
-https://www.grepolis.com
-https://www.comdirect.de
-https://www.geocaching.com
-https://www.classmates.com
-https://www.smartprix.com
-https://www.yohogirls.com
-https://www.dji.com
-https://www.kissmanga.com
-https://www.mr-jatt.com
-https://www.tvnet.lv
-https://www.superinterstitial.com
-https://www.fineco.it
-https://www.teamtreehouse.com
-https://www.ooopic.com
-https://www.rajasthan.gov.in
-https://www.accenture.com
-https://www.domain.com.au
-https://www.expatriates.com
-https://www.discordapp.com
-https://www.hizliresim.com
-https://www.kuwo.cn
-https://www.usp.br
-https://www.iiyi.com
-https://www.dm5.com
-https://www.blackdesertonline.com
-https://www.gao7.com
-https://www.hapitas.jp
-https://www.main.jp
-https://www.fdj.fr
-https://www.els-cdn.com
-https://www.lifedaily.com
-https://www.fragrantica.com
-https://www.niusnews.com
-https://www.uservoice.com
-https://www.tokyo-porn-tube.com
-https://www.takealot.com
-https://www.tenforums.com
-https://www.response.jp
-https://www.tcs.com
-https://www.fotocasa.es
-https://www.tvefamosos.uol.com.br
-https://www.freeones.com
-https://www.meduza.io
-https://www.rns.online
-https://www.bigmir.net
-https://www.cj.com
-https://www.hosyusokuhou.jp
-https://www.mediaite.com
-https://www.obozrevatel.com
-https://www.actcorp.in
-https://www.manager.co.th
-https://www.njuskalo.hr
-https://www.clickjogos.com.br
-https://www.daserste.de
-https://www.google.com.py
-https://www.yiwugou.com
-https://www.oceanofgames.com
-https://www.kafan.cn
-https://www.a9vg.com
-https://www.artron.net
-https://www.istartsurf.com
-https://www.jstv.com
-https://www.miercn.com
-https://www.jooble.org
-https://www.athome.co.jp
-https://www.searchengines.guru
-https://www.nissen.co.jp
-https://www.verycd.com
-https://www.blogosfera.uol.com.br
-https://www.cafepress.com
-https://www.walmart.ca
-https://www.4cdn.org
-https://www.tfile.me
-https://www.smarter.com
-https://www.bancoestado.cl
-https://www.3dnews.ru
-https://www.cloudapp.net
-https://www.fiuxy.net
-https://www.segmentfault.com
-https://www.1000mg.jp
-https://www.tamu.edu
-https://www.snapchat.com
-https://www.viralnova.com
-https://www.vmall.com
-https://www.theadvocate.com
-https://www.prevention.com
-https://www.fssnet.co.in
-https://www.clickfunnels.com
-https://www.google.lu
-https://www.paginegialle.it
-https://www.newsgd.com
-https://www.lacasadelcurioso.com
-https://www.fasttech.com
-https://www.jiayuan.com
-https://www.siteground.com
-https://www.mec.gov.br
-https://www.aglasem.com
-https://www.wtoip.com
-https://www.v2ex.com
-https://www.state.pa.us
-https://www.k12.ca.us
-https://www.18374ir.com
-https://www.currys.co.uk
-https://www.garaanews.com
-https://www.pcstore.com.tw
-https://www.contentabc.com
-https://www.worlddailyonline.com
-https://www.dbs.com.sg
-https://www.jeevansathi.com
-https://www.rutgers.edu
-https://www.agame.com
-https://www.bibliocommons.com
-https://www.theage.com.au
-https://www.einfachporno.xxx
-https://www.bettycrocker.com
-https://www.lazada.vn
-https://www.mmgp.ru
-https://www.alwatanvoice.com
-https://www.bsnl.co.in
-https://www.serebii.net
-https://www.flexmls.com
-https://www.indonesia-community.net
-https://www.amung.us
-https://www.tinyurl.com
-https://www.thestar.com
-https://www.dotabuff.com
-https://www.hattrick.org
-https://www.p-bandai.jp
-https://www.sketchup.com
-https://www.mediametrics.ru
-https://www.yohoboys.com
-https://www.balkanweb.com
-https://www.masutabe.info
-https://www.duke.edu
-https://www.darty.com
-https://www.yoursites123.com
-https://www.hdrezka.me
-https://www.mtv.com.lb
-https://www.huntington.com
-https://www.bigbasket.com
-https://www.cwtv.com
-https://www.regnum.ru
-https://www.promopro.com
-https://www.librus.pl
-https://www.atresplayer.com
-https://www.appgame.com
-https://www.guancha.cn
-https://www.ovh.net
-https://www.toyota.com
-https://www.foundationapi.com
-https://www.avon.com
-https://www.exploader.net
-https://www.15min.lt
-https://www.proprofs.com
-https://www.ebayimg.com
-https://www.ea3w.com
-https://www.fanpage.it
-https://www.carfax.com
-https://www.qyer.com
-https://www.blick.ch
-https://www.funnyjunk.com
-https://www.strawberrynet.com
-https://www.redichat.com
-https://www.immonet.de
-https://www.campaign-archive1.com
-https://www.0377.pics
-https://www.55haitao.com
-https://www.msi.com
-https://www.vivo.sx
-https://www.fzg360.com
-https://www.etoro.com
-https://www.wizards.com
-https://www.filmifullizle.org
-https://www.miniinthebox.com
-https://www.uchicago.edu
-https://www.afpbb.com
-https://www.tripadvisor.ca
-https://www.yimg.jp
-https://www.5usport.com
-https://www.hangame.co.jp
-https://www.payumoney.com
-https://www.citruspay.com
-https://www.ashemaletube.com
-https://www.hotchatdate.com
-https://www.ck12.org
-https://www.mplife.com
-https://www.capacostarica.com
-https://www.dardarkom.com
-https://www.niksalehi.com
-https://www.sparda.de
-https://www.girlsaskguys.com
-https://www.pulsk.com
-https://www.tupaki.com
-https://www.virginia.gov
-https://www.upi.com
-https://www.xiamp4.com
-https://www.november-lax.com
-https://www.americasfreedomfighters.com
-https://www.myheritage.com
-https://www.asg.to
-https://www.jianshu.com
-https://www.girlschannel.net
-https://www.arduino.cc
-https://www.buffalo.jp
-https://www.aichun.co
-https://www.kwejk.pl
-https://www.sinoptik.ua
-https://www.rzd.ru
-https://www.uidai.net.in
-https://www.imvu.com
-https://www.wetter.de
-https://www.google.com.np
-https://www.discovery.com
-https://www.bbcgoodfood.com
-https://www.khabarpu.com
-https://www.myuhc.com
-https://www.everydayhealth.com.tw
-https://www.medu.ir
-https://www.battlenet.com.cn
-https://www.noonpresse.com
-https://www.roasted.com
-https://www.spirit.com
-https://www.zum.com
-https://www.thinkgeek.com
-https://www.secretsdujeu.com
-https://www.avenues.info
-https://www.tsn.ca
-https://www.camfrog.com
-https://www.zaman.com.tr
-https://www.filmsenzalimiti.co
-https://www.couponfollow.com
-https://www.craftsvilla.com
-https://www.mthai.com
-https://www.eprice.com.tw
-https://www.dv37.com
-https://www.chowhound.com
-https://www.pfhsystem.com
-https://www.htc.com
-https://www.fbsbx.com
-https://www.onlinelic.in
-https://www.light-dark.net
-https://www.jiemian.com
-https://www.cvent.com
-https://www.azcentral.com
-https://www.statista.com
-https://www.movistar.es
-https://www.decolar.com
-https://www.startpage.com
-https://www.voirfilms.org
-https://www.tzarmedia.com
-https://www.androidpolice.com
-https://www.sofmap.com
-https://www.stylebistro.com
-https://www.petco.com
-https://www.cathaypacific.com
-https://www.utarget.ru
-https://www.distractify.com
-https://www.pcdiy.com.tw
-https://www.shein.com
-https://www.geektimes.ru
-https://www.financialexpress.com
-https://www.ubs.com
-https://www.mql5.com
-https://www.oxu.az
-https://www.adorocinema.com
-https://www.lacentrale.fr
-https://www.infopanel.asia
-https://www.xb11766.com
-https://www.rosewholesale.com
-https://www.facilisimo.com
-https://www.razerzone.com
-https://www.heavy-r.com
-https://www.comdotgame.com
-https://www.in.gr
-https://www.ntv.ru
-https://www.nzherald.co.nz
-https://www.anysex.com
-https://www.rai.it
-https://www.paultan.org
-https://www.viamichelin.fr
-https://www.songspk.link
-https://www.govdelivery.com
-https://www.pixhost.org
-https://www.tubegalore.com
-https://www.worldpay.com
-https://www.speakingtree.in
-https://www.tamilo.com
-https://www.shqiperiaime.al
-https://www.duomai.com
-https://www.hjenglish.com
-https://www.huffingtonpost.es
-https://www.myfedloan.org
-https://www.easyphotoedit.com
-https://www.imooc.com
-https://www.biglike.com
-https://www.confirmit.com
-https://www.dygang.com
-https://www.malltail.com
-https://www.probuilds.net
-https://www.ssg.com
-https://www.care.com
-https://www.irr.ru
-https://www.authorize.net
-https://www.dingit.tv
-https://www.kidstaff.com.ua
-https://www.email.cz
-https://www.guidegame.vn
-https://www.abebooks.com
-https://www.dek-d.com
-https://www.techtimes.com
-https://www.mmtrkam.com
-https://www.muji.net
-https://www.xendan.org
-https://www.hln.be
-https://www.ruyaanlami.com
-https://www.klm.com
-https://www.zdbb.net
-https://www.teslamotors.com
-https://www.incruit.com
-https://www.click.in
-https://www.plsdrct2.me
-https://www.macworld.com
-https://www.xataka.com
-https://www.sainsburys.co.uk
-https://www.sjtu.edu.cn
-https://www.ntv.co.jp
-https://www.standardchartered.co.in
-https://www.youwatch.org
-https://www.service-public.fr
-https://www.divxtotal.com
-https://www.king.com
-https://www.enterprise.com
-https://www.crossfit.com
-https://www.vudu.com
-https://www.i-doxs.net
-https://www.cityhouse.cn
-https://www.cint.com
-https://www.xs8.cn
-https://www.staseraintv.com
-https://www.playmonopolycodes.us
-https://www.thumbtack.com
-https://www.webmotors.com.br
-https://www.libertyland.tv
-https://www.arealme.com
-https://www.bet9ja.com
-https://www.vikatan.com
-https://www.comicbookresources.com
-https://www.campograndenews.com.br
-https://www.porndig.com
-https://www.uspto.gov
-https://www.kaola.com
-https://www.aesoponline.com
-https://www.jhu.edu
-https://www.euronews.com
-https://www.google.com.mm
-https://www.payline.ir
-https://www.usuncut.com
-https://www.enamad.ir
-https://www.vietnamnet.vn
-https://www.adorama.com
-https://www.haouzy.info
-https://www.name.com
-https://www.carnival.com
-https://www.spectranet.com.ng
-https://www.csmonitor.com
-https://www.pokemon.com
-https://www.ogone.com
-https://www.wondershare.com
-https://www.gnula.nu
-https://www.boredomtherapy.com
-https://www.ktrmr.com
-https://www.muzofon.com
-https://www.ntvspor.net
-https://www.ojooo.com
-https://www.cimbclicks.com.my
-https://www.cyberforum.ru
-https://www.sidereel.com
-https://www.seosprint.net
-https://www.schoolloop.com
-https://www.znanija.com
-https://www.ratewrite.tmall.com
-https://www.mercadolibre.com
-https://www.active.com
-https://www.postimees.ee
-https://www.freshersworld.com
-https://www.mci.ir
-https://www.yeucahat.com
-https://www.pagalworld.com
-https://www.childrensplace.com
-https://www.djelfa.info
-https://www.addictinggames.com
-https://www.ziprecruiter.com
-https://www.al.com
-https://www.usgs.gov
-https://www.ancestry.co.uk
-https://www.vidal.fr
-https://www.lifo.gr
-https://www.royalgames.com
-https://www.utah.edu
-https://www.shatel.ir
-https://www.pekao24.pl
-https://www.aol.de
-https://www.lapagina.com.sv
-https://www.discas.net
-https://www.washwasha.org
-https://www.cue-monitor.jp
-https://www.philips.com
-https://www.rpp.pe
-https://www.cic.fr
-https://www.stepstone.de
-https://www.groupme.com
-https://www.altsantiri.gr
-https://www.stafaband.co
-https://www.pluralsight.com
-https://www.trend.az
-https://www.2ememain.be
-https://www.ocnk.net
-https://www.symplicity.com
-https://www.ighome.com
-https://www.ok365.com
-https://www.nts.org.pk
-https://www.tgju.org
-https://www.aplus.com
-https://www.tomshardware.co.uk
-https://www.pcpartpicker.com
-https://www.kongzhong.com
-https://www.bu.edu
-https://www.goglogo.com
-https://www.technopoint.ru
-https://www.media.wix.com
-https://www.isohunt.to
-https://www.mycar168.com
-https://www.haber3.com
-https://www.jawharafm.net
-https://www.westelm.com
-https://www.zhcw.com
-https://www.pandora.tv
-https://www.freemail.hu
-https://www.bluewin.ch
-https://www.accorhotels.com
-https://www.uci.edu
-https://www.hkgolden.com
-https://www.aktualne.cz
-https://www.kakao.com
-https://www.escapadarural.com
-https://www.ilbe.com
-https://www.cineulagam.com
-https://www.ymobile.jp
-https://www.pornerbros.com
-https://www.raiffeisen.at
-https://www.akhbaralahly.com
-https://www.castorama.fr
-https://www.icicidirect.com
-https://www.dict.cn
-https://www.shueisha.co.jp
-https://www.sarzamindownload.com
-https://www.bet365.gr
-https://www.vagas.com.br
-https://www.pagesix.com
-https://www.mobilelikez.com
-https://www.stream2watch.co
-https://www.ballotpedia.org
-https://www.parents.com
-https://www.orientaltrading.com
-https://www.akakce.com
-https://www.ufc.com
-https://www.cheaa.com
-https://www.forbes.ru
-https://www.goud.ma
-https://www.dose.com
-https://www.ssc.nic.in
-https://www.sharefile.com
-https://www.forumcommunity.net
-https://www.alpha.gr
-https://www.pipeaota.com
-https://www.dirty.ru
-https://www.glwiz.com
-https://www.xdf.cn
-https://www.baby.ru
-https://www.kshowonline.com
-https://www.ets.org
-https://www.epson.jp
-https://www.trendyol.com
-https://www.imgflip.com
-https://www.miralinks.ru
-https://www.jamnews.ir
-https://www.3djuegos.com
-https://www.dir.bg
-https://www.rj.gov.br
-https://www.nairabet.com
-https://www.lifehacker.ru
-https://www.netkeiba.com
-https://www.cleveland.com
-https://www.hellogiggles.com
-https://www.nordea.fi
-https://www.cosme.net
-https://www.jxnews.com.cn
-https://www.eldiario.es
-https://www.nikkan-gendai.com
-https://www.sbup.com
-https://www.dominos.co.in
-https://www.startribune.com
-https://www.abcya.com
-https://www.retty.me
-https://www.playmonopoly.us
-https://www.shareably.net
-https://www.infospace.com
-https://www.80018.cn
-https://www.torrenty.org
-https://www.cookinglight.com
-https://www.debenhams.com
-https://www.crateandbarrel.com
-https://www.sevenforums.com
-https://www.newlook.com
-https://www.bnf76d.com
-https://www.mitbbs.com
-https://www.fda.gov
-https://www.retre.org
-https://www.lepoint.fr
-https://www.800notes.com
-https://www.seemorgh.com
-https://www.eastbay.com
-https://www.hoolo.tv
-https://www.solvusoft.com
-https://www.elvenar.com
-https://www.bonanza.com
-https://www.qinqinbaby.com
-https://www.wikidot.com
-https://www.babyschool.com.cn
-https://www.scientificamerican.com
-https://www.ox.ac.uk
-https://www.allin1convert.com
-https://www.prosieben.de
-https://www.parentanswercenter.com
-https://www.womenshealthmag.com
-https://www.gomaji.com
-https://www.iu.edu
-https://www.newpost.gr
-https://www.roku.com
-https://www.adreactor.com
-https://www.83suncity.com
-https://www.wenkang.cn
-https://www.miomio.tv
-https://www.gamerch.com
-https://www.skincareimprove.com
-https://www.skidrowreloaded.com
-https://www.aol.co.uk
-https://www.dana.ir
-https://www.chinanetrank.com
-https://www.yimg.com
-https://www.juntadeandalucia.es
-https://www.torrentfunk.com
-https://www.home.pl
-https://www.instantcheckmate.com
-https://www.tower.jp
-https://www.tv-asahi.co.jp
-https://www.pronews.gr
-https://www.vecteezy.com
-https://www.ar15.com
-https://www.osu.edu
-https://www.my.com
-https://www.zbj.com
-https://www.northwestern.edu
-https://www.gardenweb.com
-https://www.kuaidi100.com
-https://www.musichostnetwork.com
-https://www.apytrc.com
-https://www.limeroad.com
-https://www.deccanchronicle.com
-https://www.tnews.ir
-https://www.warau.jp
-https://www.depositfiles.com
-https://www.reklama5.mk
-https://www.hpe.com
-https://www.toshiba.com
-https://www.haber61.net
-https://www.warthunder.com
-https://www.dreammail.jp
-https://www.xossip.com
-https://www.vista.ir
-https://www.sonhoo.com
-https://www.radiko.jp
-https://www.blog.hu
-https://www.realitykings.com
-https://www.92lux.cn
-https://www.thedodo.com
-https://www.cnnturk.com
-https://www.barstoolsports.com
-https://www.experts-exchange.com
-https://www.uwants.com
-https://www.stamplive.com
-https://www.omgpm.com
-https://www.tokyo-sports.co.jp
-https://www.lifemedia.jp
-https://www.cybersource.com
-https://www.aili.com
-https://www.2nn.jp
-https://www.inbox.lv
-https://www.westernunion.com
-https://www.sdo.com
-https://www.telewizjada.net
-https://www.wikiquote.org
-https://www.synxis.com
-https://www.dopr.net
-https://www.torrenthound.com
-https://www.6vhao.com
-https://www.banamex.com
-https://www.afip.gob.ar
-https://www.netvibes.com
-https://www.dice.com
-https://www.lastminute.com
-https://www.linio.com.mx
-https://www.oa.com
-https://www.ajc.com
-https://www.wankr.com.cn
-https://www.tnt-online.ru
-https://www.aukro.ua
-https://www.tori.fi
-https://www.20min.ch
-https://www.stargames.com
-https://www.planetsuzy.org
-https://www.sabaharabi.com
-https://www.watchepisodes1.tv
-https://www.yify-movie.com
-https://www.onlinebank.com
-https://www.demotywatory.pl
-https://www.anime-sharing.com
-https://www.townhall.com
-https://www.bseindia.com
-https://www.odatv.com
-https://www.tutu.ru
-https://www.irishtimes.com
-https://www.sec.gov
-https://www.rockauto.com
-https://www.rusvesna.su
-https://www.paragonrels.com
-https://www.arxiv.org
-https://www.powvideo.net
-https://www.lichess.org
-https://www.tuikuan.tmall.com
-https://www.team-bhp.com
-https://www.ganool.ag
-https://www.ebaumsworld.com
-https://www.svt.se
-https://www.intodns.com
-https://www.yapikredi.com.tr
-https://www.deloitte.com
-https://www.goindigo.in
-https://www.adfoc.us
-https://www.antpedia.com
-https://www.icy-veins.com
-https://www.skyscanner.com
-https://www.acrobat.com
-https://www.gismeteo.ua
-https://www.songkick.com
-https://www.mindbodygreen.com
-https://www.capterra.com
-https://www.nhentai.net
-https://www.mitele.es
-https://www.webinarjam.net
-https://www.huffingtonpost.ca
-https://www.pso2.jp
-https://www.tympanus.net
-https://www.groupon.it
-https://www.forumhouse.ru
-https://www.midwayusa.com
-https://www.screwfix.com
-https://www.alef.ir
-https://www.cafebazaar.ir
-https://www.dtiblog.com
-https://www.furaffinity.net
-https://www.prestashop.com
-https://www.manyvids.com
-https://www.17zwd.com
-https://www.allkpop.com
-https://www.alayam24.com
-https://www.resellerclub.com
-https://www.iconarchive.com
-https://www.freevideo.cz
-https://www.loopnet.com
-https://www.tsb.co.uk
-https://www.sastasundar.com
-https://www.nascar.com
-https://www.izlesene.com
-https://www.egypttoday.co.uk
-https://www.laptopmag.com
-https://www.fontsquirrel.com
-https://www.seamless.com
-https://www.smbc-comics.com
-https://www.mercadolibre.com.pe
-https://www.colorado.edu
-https://www.mmafighting.com
-https://www.16888.com
-https://www.p30world.com
-https://www.livemint.com
-https://www.donaldjtrump.com
-https://www.pia.jp
-https://www.getformsonline.com
-https://www.mobrevflwms.com
-https://www.yinyuetai.com
-https://www.linksynergy.com
-https://www.cocacola.co.jp
-https://www.gendama.jp
-https://www.listenonrepeat.com
-https://www.mysites123.com
-https://www.linguee.com
-https://www.jagranjosh.com
-https://www.neteller.com
-https://www.runescape.com
-https://www.srv2trking.com
-https://www.loc.gov
-https://www.sportmaster.ru
-https://www.walkerplus.com
-https://www.povarenok.ru
-https://www.geocities.co.jp
-https://www.scamadviser.com
-https://www.gxsky.com
-https://www.stream.cz
-https://www.xxxtubedot.com
-https://www.kaoyan.com
-https://www.ad-link.jp
-https://www.onlinemultfilmy.ru
-https://www.iminent.com
-https://www.foodandwine.com
-https://www.edline.net
-https://www.newgrounds.com
-https://www.istruzione.it
-https://www.adobeconnect.com
-https://www.cifraclub.com.br
-https://www.opposingviews.com
-https://www.delfi.lv
-https://www.n159adserv.com
-https://www.fontspace.com
-https://www.admtpmp123.com
-https://www.rev2pub.com
-https://www.wpmudev.org
-https://www.lovoo.com
-https://www.ilmessaggero.it
-https://www.rssing.com
-https://www.ib-game.jp
-https://www.cpanel.net
-https://www.skybet.com
-https://www.politicususa.com
-https://www.dilbert.com
-https://www.hastidownload.org
-https://www.nulltheme.net
-https://www.echoroukonline.com
-https://www.jvzoo.com
-https://www.osym.gov.tr
-https://www.leadpages.net
-https://www.juno.com
-https://www.outlook.com
-https://www.osxdaily.com
-https://www.imagevenue.com
-https://www.glaz.tv
-https://www.ncsu.edu
-https://www.banorte.com
-https://www.c-and-a.com
-https://www.soha.vn
-https://www.gamesradar.com
-https://www.tinydeal.com
-https://www.williams-sonoma.com
-https://www.juicyads.com
-https://www.buhidoh.net
-https://www.webofknowledge.com
-https://www.google.hn
-https://www.myvidster.com
-https://www.kabu.co.jp
-https://www.marieclaire.com
-https://www.uline.com
-https://www.about.me
-https://www.btaia.com
-https://www.largehdtube.com
-https://www.silkroad.com
-https://www.tamilgun.com
-https://www.golfdigest.co.jp
-https://www.nsdl.com
-https://www.up.nic.in
-https://www.fatorrents.com
-https://www.milli.az
-https://www.champion.gg
-https://www.virustotal.com
-https://www.infibeam.com
-https://www.q.gs
-https://www.filmon.com
-https://www.virginia.edu
-https://www.speednetwork6.com
-https://www.ngs.ru
-https://www.vidtomp3.com
-https://www.ufindmedia.com
-https://www.googlegroups.com
-https://www.winshang.com
-https://www.santanderrio.com.ar
-https://www.rueducommerce.fr
-https://www.mom.me
-https://www.youngliving.com
-https://www.soufun.com
-https://www.kxg99.com
-https://www.hewitt.com
-https://www.hhj9.com
-https://www.pulse.ng
-https://www.51credit.com
-https://www.property24.com
-https://www.groupon.co.uk
-https://www.webhostingtalk.com
-https://www.askfrank.net
-https://www.rte.ie
-https://www.i-gamer.net
-https://www.freee.co.jp
-https://www.idol-blog.com
-https://www.sciencemag.org
-https://www.gusuwang.com
-https://www.joyclub.de
-https://www.etsystatic.com
-https://www.thewindowsclub.com
-https://www.univision.com
-https://www.stockcharts.com
-https://www.tooxclusive.com
-https://www.taxactonline.com
-https://www.runnersworld.com
-https://www.176.com
-https://www.lolnexus.com
-https://www.modernweekly.com
-https://www.olx.co.za
-https://www.toluna.com
-https://www.sabavision.com
-https://www.memurlar.net
-https://www.livenation.com
-https://www.guns.ru
-https://www.rutor.info
-https://www.enjin.com
-https://www.whitehouse.gov
-https://www.cybozu.com
-https://www.dailydot.com
-https://www.mailerlite.com
-https://www.mag2.com
-https://www.vipsister23.com
-https://www.shop.com
-https://www.52pojie.cn
-https://www.roodo.com
-https://www.go108.com.cn
-https://www.bravotv.com
-https://www.11467.com
-https://www.scielo.br
-https://www.dinakaran.com
-https://www.yixun.com
-https://www.soltana.ma
-https://www.biquge.la
-https://www.ohio.gov
-https://www.fortadpays.com
-https://www.greatist.com
-https://www.hotpads.com
-https://www.torrentfreak.com
-https://www.tusfiles.net
-https://www.bollywoodlife.com
-https://www.sweetwater.com
-https://www.litres.ru
-https://www.livechatinc.com
-https://www.fao.org
-https://www.limetorrents.cc
-https://www.buy123.com.tw
-https://www.artww.com
-https://www.imgbox.com
-https://www.express-scripts.com
-https://www.webdunia.com
-https://www.rustoria.ru
-https://www.mathsisfun.com
-https://www.larepublica.pe
-https://www.doostiha.ir
-https://www.india-mmm.org
-https://www.ee.co.uk
-https://www.aeroflot.ru
-https://www.dailystar.co.uk
-https://www.bancodevenezuela.com
-https://www.themuse.com
-https://www.jumei.com
-https://www.ikonfx.com
-https://www.asianews2ch.jp
-https://www.24sata.hr
-https://www.arizona.edu
-https://www.sportsauthority.com
-https://www.indiabix.com
-https://www.bungie.net
-https://www.utoronto.ca
-https://www.loteriasyapuestas.es
-https://www.glosbe.com
-https://www.hdblog.it
-https://www.nest.com
-https://www.just-eat.co.uk
-https://www.media-fire.org
-https://www.hipchat.com
-https://www.uscourts.gov
-https://www.akiba-online.com
-https://www.bestblackhatforum.com
-https://www.nerdwallet.com
-https://www.televisa.com
-https://www.mangastream.com
-https://www.tv-tokyo.co.jp
-https://www.huxiu.com
-https://www.webgains.com
-https://www.mbalib.com
-https://www.npo.nl
-https://www.megashare.sc
-https://www.kimia.es
-https://www.layarkaca21.com
-https://www.logsoku.com
-https://www.tower.im
-https://www.almesryoon.com
-https://www.homeshop18.com
-https://www.2670.com
-https://www.brobible.com
-https://www.turktelekom.com.tr
-https://www.tvrain.ru
-https://www.thepointsguy.com
-https://www.mouthshut.com
-https://www.firefoxchina.cn
-https://www.traveloka.com
-https://www.telerik.com
-https://www.jiyoujia.com
-https://www.payback.de
-https://www.teamliquid.net
-https://www.computerworld.com
-https://www.tripadvisor.com.au
-https://www.funda.nl
-https://www.tripadvisor.com.br
-https://www.uptodate.com
-https://www.nespresso.com
-https://www.viralands.com
-https://www.enotes.com
-https://www.citizentv.co.ke
-https://www.hurriyetemlak.com
-https://www.dizimag.co
-https://www.ulke.com.tr
-https://www.tre.it
-https://www.glassdoor.co.in
-https://www.bobibanking.com
-https://www.songsmp3.com
-https://www.wowkeren.com
-https://www.ebcbuzz.com
-https://www.technews.tw
-https://www.aproductmsg.com
-https://www.2mnd56.com
-https://www.whattoexpect.com
-https://www.knowable.com
-https://www.wechat.com
-https://www.loft.com
-https://www.dntrax.com
-https://www.n156adserv.com
-https://www.care2.com
-https://www.zhulong.com
-https://www.lrytas.lt
-https://www.hertz.com
-https://www.timesofmalta.com
-https://www.hobbyking.com
-https://www.addmefast.com
-https://www.rt.ru
-https://www.beatport.com
-https://www.k2s.cc
-https://www.codeschool.com
-https://www.sureawesomeness.com
-https://www.manga-enquete.com
-https://www.tsinghua.edu.cn
-https://www.thepetitionsite.com
-https://www.eventim.de
-https://www.china.cn
-https://www.leroymerlin.ru
-https://www.saturn.de
-https://www.hitta.se
-https://www.auspost.com.au
-https://www.totaljobs.com
-https://www.allstate.com
-https://www.kataweb.it
-https://www.hautelook.com
-https://www.elblog.com
-https://www.blankrefer.com
-https://www.rajanews.com
-https://www.trenitalia.com
-https://www.net-a-porter.com
-https://www.gamejolt.com
-https://www.libertaddigital.com
-https://www.boohoo.com
-https://www.tonarinoyj.jp
-https://www.miltt.com
-https://www.mymovies.it
-https://www.b92.net
-https://www.opencart.com
-https://www.thewirecutter.com
-https://www.vkmag.com
-https://www.bankcomm.com
-https://www.linkis.com
-https://www.eonet.jp
-https://www.digitalmacaronni.com
-https://www.economia.uol.com.br
-https://www.kinokong.net
-https://www.nomura.co.jp
-https://www.nicoseiga.jp
-https://www.youmaker.com
-https://www.hc360.com
-https://www.pinggu.org
-https://www.tvspielfilm.de
-https://www.sirsi.net
-https://www.lefrecce.it
-https://www.producthunt.com
-https://www.worldmarket.com
-https://www.zeroredirect11.com
-https://www.rabota.ru
-https://www.jetairways.com
-https://www.royalcaribbean.com
-https://www.mobikwik.com
-https://www.sblo.jp
-https://www.pcauto.com.cn
-https://www.derstandard.at
-https://www.synology.com
-https://www.publix.com
-https://www.tdameritrade.com
-https://www.bpi.ir
-https://www.bongda60.net
-https://www.dailybananas.com
-https://www.mypoints.com
-https://www.flashx.tv
-https://www.newsbomb.gr
-https://www.23wx.com
-https://www.census.gov
-https://www.yourbittorrent.com
-https://www.265.com
-https://www.95599.cn
-https://www.lingualeo.com
-https://www.lifed.com
-https://www.shihuo.cn
-https://www.alriyadh.com
-https://www.booloo.com
-https://www.smithsonianmag.com
-https://www.ikman.lk
-https://www.3bmeteo.com
-https://www.apsense.com
-https://www.cruisecritic.com
-https://www.mensxp.com
-https://www.mg.gov.br
-https://www.ruelala.com
-https://www.thestar.com.my
-https://www.thewhizproducts.com
-https://www.thetoptens.com
-https://www.car.gr
-https://www.intelius.com
-https://www.amiami.jp
-https://www.dawnnews.tv
-https://www.gamebase.com.tw
-https://www.liontravel.com
-https://www.rcom.co.in
-https://www.aguo.com
-https://www.wrike.com
-https://www.ricardo.ch
-https://www.bigcinema.tv
-https://www.hani.co.kr
-https://www.namnak.com
-https://www.asiae.co.kr
-https://www.wdc.com
-https://www.waveapps.com
-https://www.prwidgets.com
-https://www.crichd.in
-https://www.winbank.gr
-https://www.society6.com
-https://www.javarchive.com
-https://www.bozhong.com
-https://www.mycanal.fr
-https://www.centos.org
-https://www.thrivemarket.com
-https://www.dietnavi.com
-https://www.ilgiornale.it
-https://www.msn.com.cn
-https://www.state.nj.us
-https://www.theodysseyonline.com
-https://www.almorakib.com
-https://www.animeid.tv
-https://www.medallia.com
-https://www.mediamarkt.es
-https://www.flyfrontier.com
-https://www.popmog.com
-https://www.hsbc.com
-https://www.atv.com.tr
-https://www.giantbomb.com
-https://www.phoenix.edu
-https://www.realself.com
-https://www.hostelworld.com
-https://www.videohive.net
-https://www.atpanel.com
-https://www.delta-homes.com
-https://www.createspace.com
-https://www.atpworldtour.com
-https://www.pure-t.ru
-https://www.e-monsite.com
-https://www.medindia.net
-https://www.akhbarelyom.com
-https://www.gh0089.com
-https://www.arabseed.com
-https://www.coolenjoy.net
-https://www.rus.ec
-https://www.newsbeast.gr
-https://www.fashionguide.com.tw
-https://www.macmillandictionary.com
-https://www.homeadvisor.com
-https://www.grainger.com
-https://www.seagate.com
-https://www.buyee.jp
-https://www.fantasti.cc
-https://www.lilplay.com
-https://www.chainreactioncycles.com
-https://www.ed2000.com
-https://www.shopping-now.jp
-https://www.mail.uol.com.br
-https://www.skyscanner.ru
-https://www.78.cn
-https://www.awwwards.com
-https://www.businesswire.com
-https://www.blizzard.cn
-https://www.join.me
-https://www.in.gov
-https://www.o2online.de
-https://www.mako.co.il
-https://www.commonfloor.com
-https://www.fox.com
-https://www.barclaycard.co.uk
-https://www.kompass.com
-https://www.sex.com
-https://www.864321.com
-https://www.news-postseven.com
-https://www.smashingmagazine.com
-https://www.mbtrx.com
-https://www.bigfile.to
-https://www.loldytt.com
-https://www.linguee.es
-https://www.dion.ne.jp
-https://www.woothemes.com
-https://www.treccani.it
-https://www.straitstimes.com
-https://www.kickasstorrentsso.com
-https://www.awesomeinventions.com
-https://www.vevo.com
-https://www.bnpparibasfortis.be
-https://www.coocan.jp
-https://www.shoplocal.com
-https://www.wdr.de
-https://www.motor-talk.de
-https://www.flyertea.com
-https://www.libreoffice.org
-https://www.ge.com
-https://www.hobbylobby.com
-https://www.hdmovie14.net
-https://www.beva.com
-https://www.hrloo.com
-https://www.lesechos.fr
-https://www.gamespark.jp
-https://www.toggl.com
-https://www.poshmark.com
-https://www.ghatreh.com
-https://www.scarlet-clicks.info
-https://www.jwplayer.com
-https://www.zalando.it
-https://www.nonton.mobi
-https://www.11185.cn
-https://www.dastelefonbuch.de
-https://www.yahoo-help.jp
-https://www.indiewire.com
-https://www.provincial.com
-https://www.forex.com.cn
-https://www.115.com
-https://www.cigna.com
-https://www.jikexueyuan.com
-https://www.wallpaperscraft.com
-https://www.chaduo.com
-https://www.becu.org
-https://www.f-picture.net
-https://www.papystreaming.com
-https://www.google.tt
-https://www.topshop.com
-https://www.techsmith.com
-https://www.afisha.ru
-https://www.bookdepository.com
-https://www.bonappetit.com
-https://www.bet365.it
-https://www.guitarcenter.com
-https://www.google.cm
-https://www.1nimo.com
-https://www.mediatakeout.com
-https://www.zakon.kz
-https://www.tableau.com
-https://www.95516.com
-https://www.runoob.com
-https://www.macworld.co.uk
-https://www.panerabread.com
-https://www.palikan.com
-https://www.smartwebads.com
-https://www.donnaplay.com
-https://www.askul.co.jp
-https://www.jotform.com
-https://www.thesimsresource.com
-https://www.theregister.co.uk
-https://www.msdn.com
-https://www.arabytracking.com
-https://www.aemet.es
-https://www.pjmedia.com
-https://www.bonprix.ru
-https://www.pcbaby.com.cn
-https://www.hpconnected.com
-https://www.mongodb.org
-https://www.gatech.edu
-https://www.oomall.com
-https://www.ptt01.cc
-https://www.wed114.cn
-https://www.eharmony.com
-https://www.dqx.jp
-https://www.nikkei.co.jp
-https://www.yes24.com
-https://www.fundsxpress.com
-https://www.u-car.com.tw
-https://www.fj-n-tax.gov.cn
-https://www.muyzorras.com
-https://www.cplusplus.com
-https://www.news-choice.net
-https://www.aircanada.com
-https://www.sensacine.com
-https://www.truecar.com
-https://www.interfax.ru
-https://www.ycwb.com
-https://www.tuoitre.vn
-https://www.khan.co.kr
-https://www.safepcrepair.com
-https://www.bell.ca
-https://www.kinoprofi.net
-https://www.robokassa.ru
-https://www.zeri.info
-https://www.51seer.com
-https://www.text.ru
-https://www.tvp.pl
-https://www.aviasales.ru
-https://www.dodocook.com
-https://www.sciencealert.com
-https://www.musiciansfriend.com
-https://www.sep.gob.mx
-https://www.babyou.com
-https://www.oneplus.net
-https://www.convio.net
-https://www.tjsp.jus.br
-https://www.firstcry.com
-https://www.iqucai.com
-https://www.dreamfilmhd.bz
-https://www.sarizeybekhaber.com.tr
-https://www.paddypower.com
-https://www.delfi.ee
-https://www.hujiang.com
-https://www.jobstreet.co.id
-https://www.dealsplus.com
-https://www.saraba1st.com
-https://www.1544.ir
-https://www.git-scm.com
-https://www.c-ij.com
-https://www.dillards.com
-https://www.beautyexchange.com.hk
-https://www.michigan.gov
-https://www.google.co.ke
-https://www.coinbase.com
-https://www.kino-teatr.ru
-https://www.vocabulary.com
-https://www.zarplata.ru
-https://www.worldoftanks.eu
-https://www.kakprosto.ru
-https://www.ctvnews.ca
-https://www.moddb.com
-https://www.narvar.com
-https://www.antenam.info
-https://www.transaccionesbancolombia.com
-https://www.watchepisodes1.com
-https://www.blogspot.cl
-https://www.gopro.com
-https://www.designmantic.com
-https://www.mercurynews.com
-https://www.gingersoftware.com
-https://www.99designs.com
-https://www.break.com
-https://www.mysku.ru
-https://www.dl-zip.com
-https://www.kindle114.com
-https://www.films-regarder.com
-https://www.addic7ed.com
-https://www.probiller.com
-https://www.boldsky.com
-https://www.afkarnews.ir
-https://www.thetrainline.com
-https://www.groupon.jp
-https://www.wallpaperswide.com
-https://www.mytatasky.com

File diff suppressed because it is too large
+ 0 - 35
client/output


+ 0 - 37
client/ptwist.h

@@ -1,37 +0,0 @@
-#ifndef __PTWIST_H__
-#define __PTWIST_H__
-
-#define PTWIST_BITS 168  /* must be a multiple of 8 */
-#define PTWIST_BYTES (PTWIST_BITS/8)
-
-#define PTWIST_TAG_BITS 224  /* must be a multiple of 8 */
-#define PTWIST_TAG_BYTES (PTWIST_TAG_BITS/8)
-
-#define PTWIST_PUZZLE_STRENGTH 0 /*21*/  /* set to 0 to disable client puzzle */
-#define PTWIST_PUZZLE_MASK ((1<<PTWIST_PUZZLE_STRENGTH)-1)
-
-#if PTWIST_PUZZLE_STRENGTH == 0
-#define PTWIST_RESP_BITS 0
-#else
-#define PTWIST_RESP_BITS (PTWIST_PUZZLE_STRENGTH+6)
-#endif
-
-#define PTWIST_RESP_BYTES ((PTWIST_RESP_BITS+7)/8)
-#define PTWIST_RESP_MASK ((1<<(((PTWIST_RESP_BITS&7)==0)?8:(PTWIST_RESP_BITS&7)))-1)
-
-#define PTWIST_HASH_SHOWBITS (PTWIST_TAG_BITS-PTWIST_BITS-PTWIST_RESP_BITS)
-#define PTWIST_HASH_TOTBITS (PTWIST_HASH_SHOWBITS+PTWIST_PUZZLE_STRENGTH)
-#define PTWIST_HASH_TOTBYTES ((PTWIST_HASH_TOTBITS+7)/8)
-#define PTWIST_HASH_MASK ((1<<(((PTWIST_HASH_TOTBITS&7)==0)?8:(PTWIST_HASH_TOTBITS&7)))-1)
-
-typedef unsigned char byte;
-
-/* Figure out whether there's a point with x-coordinate x on the main
- * curve.  If not, then there's one on the twist curve.  (There are
- * actually two, which are negatives of each other; that doesn't
- * matter.)  Multiply that point by seckey and set out to the
- * x-coordinate of the result. */
-void ptwist_pointmul(byte out[PTWIST_BYTES], const byte x[PTWIST_BYTES],
-	const byte seckey[PTWIST_BYTES]);
-
-#endif

+ 0 - 1651
client/ptwist168.c

@@ -1,1651 +0,0 @@
-#include "ptwist.h"
-
-/* ptwist168.c by Ian Goldberg. Based on: */
-
-/* crypto/ec/ecp_nistp224.c */
-/*
- * Written by Emilia Kasper (Google) for the OpenSSL project.
- */
-/* ====================================================================
- * Copyright (c) 2000-2010 The OpenSSL Project.  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. All advertising materials mentioning features or use of this
- *    software must display the following acknowledgment:
- *    "This product includes software developed by the OpenSSL Project
- *    for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
- *
- * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
- *    endorse or promote products derived from this software without
- *    prior written permission. For written permission, please contact
- *    licensing@OpenSSL.org.
- *
- * 5. Products derived from this software may not be called "OpenSSL"
- *    nor may "OpenSSL" appear in their names without prior written
- *    permission of the OpenSSL Project.
- *
- * 6. Redistributions of any form whatsoever must retain the following
- *    acknowledgment:
- *    "This product includes software developed by the OpenSSL Project
- *    for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
- *
- * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
- * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
- * OF THE POSSIBILITY OF SUCH DAMAGE.
- * ====================================================================
- *
- * This product includes cryptographic software written by Eric Young
- * (eay@cryptsoft.com).  This product includes software written by Tim
- * Hudson (tjh@cryptsoft.com).
- *
- */
-
-/*
- * A 64-bit implementation of the NIST P-224 elliptic curve point multiplication
- *
- * Inspired by Daniel J. Bernstein's public domain nistp224 implementation
- * and Adam Langley's public domain 64-bit C implementation of curve25519
- */
-#include <stdint.h>
-#include <string.h>
-
-#if defined(__GNUC__) && (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1))
-  /* even with gcc, the typedef won't work for 32-bit platforms */
-  typedef __uint128_t uint128_t; /* nonstandard; implemented by gcc on 64-bit platforms */
-#else
-  #error "Need GCC 3.1 or later to define type uint128_t"
-#endif
-
-typedef uint8_t u8;
-
-
-/******************************************************************************/
-/*		    INTERNAL REPRESENTATION OF FIELD ELEMENTS
- *
- * Field elements are represented as a_0 + 2^56*a_1 + 2^112*a_2
- * where each slice a_i is a 64-bit word, i.e., a field element is an fslice
- * array a with 3 elements, where a[i] = a_i.
- * Outputs from multiplications are represented as unreduced polynomials
- * b_0 + 2^56*b_1 + 2^112*b_2 + 2^168*b_3 + 2^224*b_4
- * where each b_i is a 128-bit word. We ensure that inputs to each field
- * multiplication satisfy a_i < 2^60, so outputs satisfy b_i < 4*2^60*2^60,
- * and fit into a 128-bit word without overflow. The coefficients are then
- * again partially reduced to a_i < 2^57. We only reduce to the unique minimal
- * representation at the end of the computation.
- *
- */
-
-typedef uint64_t fslice;
-
-typedef fslice coord[3];
-typedef coord point[3];
-
-
-#include <stdio.h>
-#include <stdlib.h>
-
-/*static void dump_coord(const char *label, const coord c)
-{
-    if (label) fprintf(stderr, "%s: ", label);
-    printf("%016lx %016lx %016lx\n", c[2], c[1], c[0]);
-}*/
-
-/*static void dump_point(const char *label, point p)
-{
-    if (label) fprintf(stderr, "%s:\n", label);
-    dump_coord(" x", p[0]);
-    dump_coord(" y", p[1]);
-    dump_coord(" z", p[2]);
-}*/
-
-/* Field element represented as a byte arrary.
- * 21*8 = 168 bits is also the group order size for the elliptic curve.  */
-typedef u8 felem_bytearray[21];
-
-static const felem_bytearray ptwist168_curve_params[5] = {
-	{0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,    /* p */
-	 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,
-	 0xFF},
-	{0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,    /* a */
-	 0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0xFE,
-	 0xFC},
-	{0x4E,0x35,0x5E,0x95,0xCA,0xFE,0xDD,0x48,0x6E,0xBC,    /* b */
-	 0x69,0xBA,0xD3,0x16,0x46,0xD3,0x20,0xE0,0x1D,0xC7,
-	 0xD6},
-	{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,    /* x */
-	 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-	 0x02},
-	{0xEA,0x67,0x47,0xB7,0x5A,0xF8,0xC7,0xF9,0x3C,0x1F,    /* y */
-	 0x5E,0x6D,0x32,0x0F,0x88,0xB9,0xBE,0x15,0x66,0xD2,
-	 0xF2}
-};
-
-/* Helper functions to convert field elements to/from internal representation */
-static void bin21_to_felem(fslice out[3], const u8 in[21])
-	{
-	out[0] = *((const uint64_t *)(in)) & 0x00ffffffffffffff;
-	out[1] = (*((const uint64_t *)(in+7))) & 0x00ffffffffffffff;
-	out[2] = (*((const uint64_t *)(in+14))) & 0x00ffffffffffffff;
-	}
-
-static void felem_to_bin21(u8 out[21], const fslice in[3])
-	{
-	unsigned i;
-	for (i = 0; i < 7; ++i)
-		{
-		out[i]	  = in[0]>>(8*i);
-		out[i+7]  = in[1]>>(8*i);
-		out[i+14] = in[2]>>(8*i);
-		}
-	}
-
-#if 0
-/* To preserve endianness when using BN_bn2bin and BN_bin2bn */
-static void flip_endian(u8 *out, const u8 *in, unsigned len)
-	{
-	unsigned i;
-	for (i = 0; i < len; ++i)
-		out[i] = in[len-1-i];
-	}
-#endif
-
-/******************************************************************************/
-/*				FIELD OPERATIONS
- *
- * Field operations, using the internal representation of field elements.
- * NB! These operations are specific to our point multiplication and cannot be
- * expected to be correct in general - e.g., multiplication with a large scalar
- * will cause an overflow.
- *
- */
-
-/* Sum two field elements: out += in */
-static void felem_sum64(fslice out[3], const fslice in[3])
-	{
-	out[0] += in[0];
-	out[1] += in[1];
-	out[2] += in[2];
-	}
-
-/* Subtract field elements: out -= in */
-/* Assumes in[i] < 2^57 */
-static void felem_diff64(fslice out[3], const fslice in[3])
-	{
-	/* a = 3*2^56 - 3 */
-	/* b = 3*2^56 - 3*257 */
-	static const uint64_t a = (((uint64_t) 3) << 56) - ((uint64_t) 3);
-	static const uint64_t b = (((uint64_t) 3) << 56) - ((uint64_t) 771);
-
-	/* Add 0 mod 2^168-2^8-1 to ensure out > in at each element */
-	/* a*2^112 + a*2^56 + b = 3*p */
-	out[0] += b;
-	out[1] += a;
-	out[2] += a;
-
-	out[0] -= in[0];
-	out[1] -= in[1];
-	out[2] -= in[2];
-	}
-
-/* Subtract in unreduced 128-bit mode: out128 -= in128 */
-/* Assumes in[i] < 2^119 */
-static void felem_diff128(uint128_t out[5], const uint128_t in[5])
-	{
-	/* a = 3*2^118 - 192
-	   b = 3*2^118 - 49536
-	   c = 3*2^118
-	   d = 3*2^118 - 12681408
-
-	   a*2^224 + a*2^168 + b*2^112 + c*2^56 + d
-	    = (3*2^174 + 3*2^118 + 49344)*p
-	*/
-	static const uint128_t a = (((uint128_t)3) << 118) - ((uint128_t) 192);
-	static const uint128_t b = (((uint128_t)3) << 118) - ((uint128_t) 49536);
-	static const uint128_t c = (((uint128_t)3) << 118);
-	static const uint128_t d = (((uint128_t)3) << 118) - ((uint128_t) 12681408);;
-
-	/* Add 0 mod 2^168-2^8-1 to ensure out > in */
-	out[0] += d;
-	out[1] += c;
-	out[2] += b;
-	out[3] += a;
-	out[4] += a;
-
-	out[0] -= in[0];
-	out[1] -= in[1];
-	out[2] -= in[2];
-	out[3] -= in[3];
-	out[4] -= in[4];
-	}
-
-/* Subtract in mixed mode: out128 -= in64 */
-/* in[i] < 2^63 */
-static void felem_diff_128_64(uint128_t out[5], const fslice in[3])
-	{
-	/* a = 3*2^62 - 192
-	   b = 3*2^62 - 49344
-	   a*2^112 + a*2^56 + b = 192*p
-	*/
-	static const uint128_t a = (((uint128_t) 3) << 62) - ((uint128_t) 192);
-	static const uint128_t b = (((uint128_t) 3) << 62) - ((uint128_t) 49344);
-
-	/* Add 0 mod 2^168-2^8-1 to ensure out > in */
-	out[0] += b;
-	out[1] += a;
-	out[2] += a;
-
-	out[0] -= in[0];
-	out[1] -= in[1];
-	out[2] -= in[2];
-	}
-
-/* Multiply a field element by a scalar: out64 = out64 * scalar
- * The scalars we actually use are small, so results fit without overflow */
-static void felem_scalar64(fslice out[3], const fslice scalar)
-	{
-	out[0] *= scalar;
-	out[1] *= scalar;
-	out[2] *= scalar;
-	}
-
-/* Multiply an unreduced field element by a scalar: out128 = out128 * scalar
- * The scalars we actually use are small, so results fit without overflow */
-static void felem_scalar128(uint128_t out[5], const uint128_t scalar)
-	{
-	out[0] *= scalar;
-	out[1] *= scalar;
-	out[2] *= scalar;
-	out[3] *= scalar;
-	out[4] *= scalar;
-	}
-
-/* Square a field element: out = in^2 */
-static void felem_square(uint128_t out[5], const fslice in[3])
-	{
-	out[0] = ((uint128_t) in[0]) * in[0];
-	out[1] = ((uint128_t) in[0]) * in[1] * 2;
-	out[2] = ((uint128_t) in[0]) * in[2] * 2 + ((uint128_t) in[1]) * in[1];
-	out[3] = ((uint128_t) in[1]) * in[2] * 2;
-	out[4] = ((uint128_t) in[2]) * in[2];
-	}
-
-/* Multiply two field elements: out = in1 * in2 */
-static void felem_mul(uint128_t out[5], const fslice in1[3], const fslice in2[3])
-	{
-	out[0] = ((uint128_t) in1[0]) * in2[0];
-	out[1] = ((uint128_t) in1[0]) * in2[1] + ((uint128_t) in1[1]) * in2[0];
-	out[2] = ((uint128_t) in1[0]) * in2[2] + ((uint128_t) in1[1]) * in2[1] +
-		((uint128_t) in1[2]) * in2[0];
-	out[3] = ((uint128_t) in1[1]) * in2[2] +
-		((uint128_t) in1[2]) * in2[1];
-	out[4] = ((uint128_t) in1[2]) * in2[2];
-	}
-
-#define M257(x) (((x)<<8)+(x))
-
-/* Reduce 128-bit coefficients to 64-bit coefficients. Requires in[i] < 2^126,
- * ensures out[0] < 2^56, out[1] < 2^56, out[2] < 2^57 */
-static void felem_reduce(fslice out[3], const uint128_t in[5])
-	{
-	static const uint128_t two56m1 = (((uint128_t) 1)<<56) -
-		((uint128_t)1);
-	uint128_t output[3];
-
-	output[0] = in[0];  /* < 2^126 */
-	output[1] = in[1];  /* < 2^126 */
-	output[2] = in[2];  /* < 2^126 */
-
-	/* Eliminate in[3], in[4] */
-	output[2] += M257(in[4] >> 56);       /* < 2^126 + 2^79 */
-	output[1] += M257(in[4] & two56m1);   /* < 2^126 + 2^65 */
-
-	output[1] += M257(in[3] >> 56);       /* < 2^126 + 2^65 + 2^79 */
-	output[0] += M257(in[3] & two56m1);   /* < 2^126 + 2^65 */
-
-	/* Eliminate the top part of output[2] */
-	output[0] += M257(output[2] >> 56);   /* < 2^126 + 2^65 + 2^79 */
-	output[2] &= two56m1;                 /* < 2^56 */
-
-	/* Carry 0 -> 1 -> 2 */
-	output[1] += output[0] >> 56;         /* < 2^126 + 2^71 */
-	output[0] &= two56m1;                 /* < 2^56 */
-
-	output[2] += output[1] >> 56;         /* < 2^71 */
-	output[1] &= two56m1;                 /* < 2^56 */
-
-	/* Eliminate the top part of output[2] */
-	output[0] += M257(output[2] >> 56);   /* < 2^57 */
-	output[2] &= two56m1;                 /* < 2^56 */
-
-	/* Carry 0 -> 1 -> 2 */
-	output[1] += output[0] >> 56;         /* <= 2^56 */
-	out[0] = output[0] & two56m1;         /* < 2^56 */
-
-	out[2] = output[2] + (output[1] >> 56);  /* <= 2^56 */
-	out[1] = output[1] & two56m1;         /* < 2^56 */
-
-	}
-
-/* Reduce to unique minimal representation */
-static void felem_contract(fslice out[3], const fslice in[3])
-	{
-	static const uint64_t two56m1 = (((uint64_t) 1)<<56) -
-		((uint64_t)1);
-	static const uint64_t two56m257 = (((uint64_t) 1)<<56) -
-		((uint64_t)257);
-	uint64_t a;
-
-	/* in[0] < 2^56, in[1] < 2^56, in[2] <= 2^56 */
-	/* so in < 2*p for sure */
-
-	/* Eliminate the top part of in[2] */
-	out[0] = in[0] + M257(in[2] >> 56);   /* < 2^57 */
-	out[2] = in[2] & two56m1;             /* < 2^56, but if out[0] >= 2^56
-	                                         then out[2] now = 0 */
-
-	/* Carry 0 -> 1 -> 2 */
-	out[1] = in[1] + (out[0] >> 56);      /* < 2^56 + 2, but if
-	                                         out[1] >= 2^56 then
-						 out[2] = 0 */
-	out[0] &= two56m1;                    /* < 2^56 */
-
-	out[2] += out[1] >> 56;               /* < 2^56 due to the above */
-	out[1] &= two56m1;                    /* < 2^56 */
-
-	/* Now out < 2^168, but it could still be > p */
-	a = ((out[2] == two56m1) & (out[1] == two56m1) & (out[0] >= two56m257));
-	out[2] -= two56m1*a;
-	out[1] -= two56m1*a;
-	out[0] -= two56m257*a;
-	}
-
-/* Negate a field element: out = -in */
-/* Assumes in[i] < 2^57 */
-static void felem_neg(fslice out[3], const fslice in[3])
-	{
-	/* a = 3*2^56 - 3 */
-	/* b = 3*2^56 - 3*257 */
-	static const uint64_t a = (((uint64_t) 3) << 56) - ((uint64_t) 3);
-	static const uint64_t b = (((uint64_t) 3) << 56) - ((uint64_t) 771);
-	static const uint64_t two56m1 = (((uint64_t) 1) << 56) - ((uint64_t) 1);
-	fslice tmp[3];
-
-	/* Add 0 mod 2^168-2^8-1 to ensure out > in at each element */
-	/* a*2^112 + a*2^56 + b = 3*p */
-	tmp[0] = b - in[0];
-	tmp[1] = a - in[1];
-	tmp[2] = a - in[2];
-
-	/* Carry 0 -> 1 -> 2 */
-	tmp[1] += tmp[0] >> 56;
-	tmp[0] &= two56m1;                 /* < 2^56 */
-
-	tmp[2] += tmp[1] >> 56;         /* < 2^71 */
-	tmp[1] &= two56m1;                 /* < 2^56 */
-
-	felem_contract(out, tmp);
-
-	}
-
-/* Zero-check: returns 1 if input is 0, and 0 otherwise.
- * We know that field elements are reduced to in < 2^169,
- * so we only need to check three cases: 0, 2^168 - 2^8 - 1,
- * and 2^169 - 2^9 - 2 */
-static fslice felem_is_zero(const fslice in[3])
-	{
-	fslice zero, two168m8m1, two169m9m2;
-	static const uint64_t two56m1 = (((uint64_t) 1)<<56) -
-		((uint64_t)1);
-	static const uint64_t two56m257 = (((uint64_t) 1)<<56) -
-		((uint64_t)257);
-	static const uint64_t two57m1 = (((uint64_t) 1)<<57) -
-		((uint64_t)1);
-	static const uint64_t two56m514 = (((uint64_t) 1)<<56) -
-		((uint64_t)514);
-
-	zero = (in[0] == 0) & (in[1] == 0) & (in[2] == 0);
-	two168m8m1 = (in[2] == two56m1) & (in[1] == two56m1) &
-			(in[0] == two56m257);
-	two169m9m2 = (in[2] == two57m1) & (in[1] == two56m1) &
-			(in[0] == two56m514);
-
-	return (zero | two168m8m1 | two169m9m2);
-	}
-
-/* Invert a field element */
-static void felem_inv(fslice out[3], const fslice in[3])
-	{
-	fslice ftmp[3], ftmp2[3], ftmp3[3], ftmp4[3];
-	uint128_t tmp[5];
-	unsigned i;
-
-	felem_square(tmp, in); felem_reduce(ftmp, tmp);		/* 2 */
-	felem_mul(tmp, in, ftmp); felem_reduce(ftmp, tmp);	/* 2^2 - 1 */
-								/* = ftmp */
-
-	felem_square(tmp, ftmp); felem_reduce(ftmp2, tmp);	/* 2^3 - 2 */
-	felem_square(tmp, ftmp2); felem_reduce(ftmp2, tmp);	/* 2^4 - 2^2 */
-	felem_mul(tmp, ftmp2, ftmp); felem_reduce(ftmp2, tmp);	/* 2^4 - 1 */
-	felem_square(tmp, ftmp2); felem_reduce(ftmp2, tmp);	/* 2^5 - 2 */
-	felem_square(tmp, ftmp2); felem_reduce(ftmp2, tmp);	/* 2^6 - 2^2 */
-	felem_mul(tmp, ftmp2, ftmp); felem_reduce(ftmp, tmp);	/* 2^6 - 1 */
-								/* = ftmp */
-
-	felem_square(tmp, ftmp); felem_reduce(ftmp2, tmp);	/* 2^7 - 2 */
-	for (i = 0; i < 5; ++i)					/* 2^12 - 2^6 */
-		{
-		felem_square(tmp, ftmp2); felem_reduce(ftmp2, tmp);
-		}
-	felem_mul(tmp, ftmp, ftmp2); felem_reduce(ftmp3, tmp);	/* 2^12 - 1 */
-								/* = ftmp3 */
-
-	felem_square(tmp, ftmp3); felem_reduce(ftmp2, tmp);	/* 2^13 - 2 */
-	for (i = 0; i < 11; ++i)				/* 2^24 - 2^12 */
-		{
-		felem_square(tmp, ftmp2); felem_reduce(ftmp2, tmp);
-		}
-	felem_mul(tmp, ftmp2, ftmp3); felem_reduce(ftmp3, tmp);	/* 2^24 - 1 */
-								/* = ftmp3 */
-	felem_square(tmp, ftmp3); felem_reduce(ftmp2, tmp);	/* 2^25 - 2 */
-	for (i = 0; i < 23; ++i)				/* 2^48 - 2^24 */
-		{
-		felem_square(tmp, ftmp2); felem_reduce(ftmp2, tmp);
-		}
-	felem_mul(tmp, ftmp2, ftmp3); felem_reduce(ftmp4, tmp);	/* 2^48 - 1 */
-								/* = ftmp4 */
-	felem_square(tmp, ftmp4); felem_reduce(ftmp2, tmp);	/* 2^49 - 2 */
-	for (i = 0; i < 23; ++i)				/* 2^72 - 2^24 */
-		{
-		felem_square(tmp, ftmp2); felem_reduce(ftmp2, tmp);
-		}
-	felem_mul(tmp, ftmp2, ftmp3); felem_reduce(ftmp4, tmp);	/* 2^72 - 1 */
-								/* = ftmp4 */
-
-	felem_square(tmp, ftmp4); felem_reduce(ftmp2, tmp);	/* 2^73 - 2 */
-	for (i = 0; i < 5; ++i)					/* 2^78 - 2^6 */
-		{
-		felem_square(tmp, ftmp2); felem_reduce(ftmp2, tmp);
-		}
-	felem_mul(tmp, ftmp, ftmp2); felem_reduce(ftmp2, tmp);	/* 2^78 - 1 */
-	felem_square(tmp, ftmp2); felem_reduce(ftmp2, tmp);	/* 2^79 - 2 */
-	felem_mul(tmp, in, ftmp2); felem_reduce(ftmp4, tmp);	/* 2^79 - 1 */
-								/* = ftmp4 */
-	felem_square(tmp, ftmp4); felem_reduce(ftmp2, tmp);	/* 2^80 - 2 */
-	for (i = 0; i < 78; ++i)				/* 2^158 - 2^79 */
-		{
-		felem_square(tmp, ftmp2); felem_reduce(ftmp2, tmp);
-		}
-	felem_mul(tmp, ftmp4, ftmp2); felem_reduce(ftmp2, tmp); /* 2^158 - 1 */
-	felem_square(tmp, ftmp2); felem_reduce(ftmp2, tmp);	/* 2^159 - 2 */
-	felem_mul(tmp, in, ftmp2); felem_reduce(ftmp2, tmp);	/* 2^159 - 1 */
-	for (i = 0; i < 7; ++i)					/* 2^166 - 2^7 */
-		{
-		felem_square(tmp, ftmp2); felem_reduce(ftmp2, tmp);
-		}
-	felem_mul(tmp, ftmp, ftmp2); felem_reduce(ftmp2, tmp);	/* 2^166 - 2^6 - 1 */
-	felem_square(tmp, ftmp2); felem_reduce(ftmp2, tmp);	/* 2^167 - 2^7 - 2 */
-	felem_square(tmp, ftmp2); felem_reduce(ftmp2, tmp);	/* 2^168 - 2^8 - 4 */
-	felem_mul(tmp, in, ftmp2); felem_reduce(out, tmp);	/* 2^168 - 2^8 - 3 */
-								/* = out */
-	}
-
-/* Take the square root of a field element */
-static void felem_sqrt(fslice out[3], const fslice in[3])
-	{
-	fslice ftmp[3], ftmp2[3];
-	uint128_t tmp[5];
-	unsigned i;
-
-	felem_square(tmp, in); felem_reduce(ftmp, tmp);		/* 2 */
-	felem_mul(tmp, in, ftmp); felem_reduce(ftmp, tmp);	/* 2^2 - 1 */
-								/* = ftmp */
-
-	felem_square(tmp, ftmp); felem_reduce(ftmp2, tmp);	/* 2^3 - 2 */
-	felem_square(tmp, ftmp2); felem_reduce(ftmp2, tmp);	/* 2^4 - 2^2 */
-	felem_mul(tmp, ftmp2, ftmp); felem_reduce(ftmp2, tmp);	/* 2^4 - 1 */
-	felem_square(tmp, ftmp2); felem_reduce(ftmp2, tmp);	/* 2^5 - 2 */
-	felem_mul(tmp, ftmp2, in); felem_reduce(ftmp, tmp);	/* 2^5 - 1 */
-								/* = ftmp */
-
-	felem_square(tmp, ftmp); felem_reduce(ftmp2, tmp);	/* 2^6 - 2 */
-	for (i = 0; i < 4; ++i)					/* 2^10 - 2^5 */
-		{
-		felem_square(tmp, ftmp2); felem_reduce(ftmp2, tmp);
-		}
-	felem_mul(tmp, ftmp, ftmp2); felem_reduce(ftmp, tmp);	/* 2^10 - 1 */
-								/* = ftmp */
-
-	felem_square(tmp, ftmp); felem_reduce(ftmp2, tmp);	/* 2^11 - 2 */
-	for (i = 0; i < 9; ++i)					/* 2^20 - 2^10 */
-		{
-		felem_square(tmp, ftmp2); felem_reduce(ftmp2, tmp);
-		}
-	felem_mul(tmp, ftmp2, ftmp); felem_reduce(ftmp, tmp);	/* 2^20 - 1 */
-								/* = ftmp */
-	felem_square(tmp, ftmp); felem_reduce(ftmp2, tmp);	/* 2^21 - 2 */
-	for (i = 0; i < 19; ++i)				/* 2^40 - 2^20 */
-		{
-		felem_square(tmp, ftmp2); felem_reduce(ftmp2, tmp);
-		}
-	felem_mul(tmp, ftmp2, ftmp); felem_reduce(ftmp, tmp);	/* 2^40 - 1 */
-								/* = ftmp */
-	felem_square(tmp, ftmp); felem_reduce(ftmp2, tmp);	/* 2^41 - 2 */
-	for (i = 0; i < 39; ++i)				/* 2^80 - 2^40 */
-		{
-		felem_square(tmp, ftmp2); felem_reduce(ftmp2, tmp);
-		}
-	felem_mul(tmp, ftmp2, ftmp); felem_reduce(ftmp, tmp);	/* 2^80 - 1 */
-								/* = ftmp */
-
-	felem_square(tmp, ftmp); felem_reduce(ftmp2, tmp);	/* 2^81 - 2 */
-	for (i = 0; i < 79; ++i)				/* 2^160 - 2^80 */
-		{
-		felem_square(tmp, ftmp2); felem_reduce(ftmp2, tmp);
-		}
-	felem_mul(tmp, ftmp, ftmp2); felem_reduce(ftmp2, tmp);	/* 2^160 - 1 */
-	for (i = 0; i < 5; ++i)					/* 2^165 - 2^5 */
-		{
-		felem_square(tmp, ftmp2); felem_reduce(ftmp2, tmp);
-		}
-	felem_square(tmp, ftmp2); felem_reduce(out, tmp);	/* 2^166 - 2^6 */
-								/* = out */
-	}
-
-/* Copy in constant time:
- * if icopy == 1, copy in to out,
- * if icopy == 0, copy out to itself. */
-static void
-copy_conditional(fslice *out, const fslice *in, unsigned len, fslice icopy)
-	{
-	unsigned i;
-	/* icopy is a (64-bit) 0 or 1, so copy is either all-zero or all-one */
-	const fslice copy = -icopy;
-	for (i = 0; i < len; ++i)
-		{
-		const fslice tmp = copy & (in[i] ^ out[i]);
-		out[i] ^= tmp;
-		}
-	}
-
-/* Copy in constant time:
- * if isel == 1, copy in2 to out,
- * if isel == 0, copy in1 to out. */
-static void select_conditional(fslice *out, const fslice *in1, const fslice *in2,
-	unsigned len, fslice isel)
-	{
-	unsigned i;
-	/* isel is a (64-bit) 0 or 1, so sel is either all-zero or all-one */
-	const fslice sel = -isel;
-	for (i = 0; i < len; ++i)
-		{
-		const fslice tmp = sel & (in1[i] ^ in2[i]);
-		out[i] = in1[i] ^ tmp;
-		}
-}
-
-/******************************************************************************/
-/*			 ELLIPTIC CURVE POINT OPERATIONS
- *
- * Points are represented in Jacobian projective coordinates:
- * (X, Y, Z) corresponds to the affine point (X/Z^2, Y/Z^3),
- * or to the point at infinity if Z == 0.
- *
- */
-
-/* Double an elliptic curve point:
- * (X', Y', Z') = 2 * (X, Y, Z), where
- * X' = (3 * (X - Z^2) * (X + Z^2))^2 - 8 * X * Y^2
- * Y' = 3 * (X - Z^2) * (X + Z^2) * (4 * X * Y^2 - X') - 8 * Y^2
- * Z' = (Y + Z)^2 - Y^2 - Z^2 = 2 * Y * Z
- * Outputs can equal corresponding inputs, i.e., x_out == x_in is allowed,
- * while x_out == y_in is not (maybe this works, but it's not tested). */
-static void
-point_double(fslice x_out[3], fslice y_out[3], fslice z_out[3],
-	     const fslice x_in[3], const fslice y_in[3], const fslice z_in[3])
-	{
-	uint128_t tmp[5], tmp2[5];
-	fslice delta[3];
-	fslice gamma[3];
-	fslice beta[3];
-	fslice alpha[3];
-	fslice ftmp[3], ftmp2[3];
-	memcpy(ftmp, x_in, 3 * sizeof(fslice));
-	memcpy(ftmp2, x_in, 3 * sizeof(fslice));
-
-	/* delta = z^2 */
-	felem_square(tmp, z_in);
-	felem_reduce(delta, tmp);
-
-	/* gamma = y^2 */
-	felem_square(tmp, y_in);
-	felem_reduce(gamma, tmp);
-
-	/* beta = x*gamma */
-	felem_mul(tmp, x_in, gamma);
-	felem_reduce(beta, tmp);
-
-	/* alpha = 3*(x-delta)*(x+delta) */
-	felem_diff64(ftmp, delta);
-	/* ftmp[i] < 2^57 + 2^58 + 2 < 2^59 */
-	felem_sum64(ftmp2, delta);
-	/* ftmp2[i] < 2^57 + 2^57 = 2^58 */
-	felem_scalar64(ftmp2, 3);
-	/* ftmp2[i] < 3 * 2^58 < 2^60 */
-	felem_mul(tmp, ftmp, ftmp2);
-	/* tmp[i] < 2^60 * 2^59 * 4 = 2^121 */
-	felem_reduce(alpha, tmp);
-
-	/* x' = alpha^2 - 8*beta */
-	felem_square(tmp, alpha);
-	/* tmp[i] < 4 * 2^57 * 2^57 = 2^116 */
-	memcpy(ftmp, beta, 3 * sizeof(fslice));
-	felem_scalar64(ftmp, 8);
-	/* ftmp[i] < 8 * 2^57 = 2^60 */
-	felem_diff_128_64(tmp, ftmp);
-	/* tmp[i] < 2^116 + 2^64 + 8 < 2^117 */
-	felem_reduce(x_out, tmp);
-
-	/* z' = (y + z)^2 - gamma - delta */
-	felem_sum64(delta, gamma);
-	/* delta[i] < 2^57 + 2^57 = 2^58 */
-	memcpy(ftmp, y_in, 3 * sizeof(fslice));
-	felem_sum64(ftmp, z_in);
-	/* ftmp[i] < 2^57 + 2^57 = 2^58 */
-	felem_square(tmp, ftmp);
-	/* tmp[i] < 4 * 2^58 * 2^58 = 2^118 */
-	felem_diff_128_64(tmp, delta);
-	/* tmp[i] < 2^118 + 2^64 + 8 < 2^119 */
-	felem_reduce(z_out, tmp);
-
-	/* y' = alpha*(4*beta - x') - 8*gamma^2 */
-	felem_scalar64(beta, 4);
-	/* beta[i] < 4 * 2^57 = 2^59 */
-	felem_diff64(beta, x_out);
-	/* beta[i] < 2^59 + 2^58 + 2 < 2^60 */
-	felem_mul(tmp, alpha, beta);
-	/* tmp[i] < 4 * 2^57 * 2^60 = 2^119 */
-	felem_square(tmp2, gamma);
-	/* tmp2[i] < 4 * 2^57 * 2^57 = 2^116 */
-	felem_scalar128(tmp2, 8);
-	/* tmp2[i] < 8 * 2^116 = 2^119 */
-	felem_diff128(tmp, tmp2);
-	/* tmp[i] < 2^119 + 2^120 < 2^121 */
-	felem_reduce(y_out, tmp);
-	}
-
-/* Add two elliptic curve points:
- * (X_1, Y_1, Z_1) + (X_2, Y_2, Z_2) = (X_3, Y_3, Z_3), where
- * X_3 = (Z_1^3 * Y_2 - Z_2^3 * Y_1)^2 - (Z_1^2 * X_2 - Z_2^2 * X_1)^3 -
- * 2 * Z_2^2 * X_1 * (Z_1^2 * X_2 - Z_2^2 * X_1)^2
- * Y_3 = (Z_1^3 * Y_2 - Z_2^3 * Y_1) * (Z_2^2 * X_1 * (Z_1^2 * X_2 - Z_2^2 * X_1)^2 - X_3) -
- *        Z_2^3 * Y_1 * (Z_1^2 * X_2 - Z_2^2 * X_1)^3
- * Z_3 = (Z_1^2 * X_2 - Z_2^2 * X_1) * (Z_1 * Z_2) */
-
-/* This function is not entirely constant-time:
- * it includes a branch for checking whether the two input points are equal,
- * (while not equal to the point at infinity).
- * This case never happens during single point multiplication,
- * so there is no timing leak for ECDH or ECDSA signing. */
-static void point_add(fslice x3[3], fslice y3[3], fslice z3[3],
-	const fslice x1[3], const fslice y1[3], const fslice z1[3],
-	const fslice x2[3], const fslice y2[3], const fslice z2[3])
-	{
-	fslice ftmp[3], ftmp2[3], ftmp3[3], ftmp4[3], ftmp5[3];
-	fslice xout[3], yout[3], zout[3];
-	uint128_t tmp[5], tmp2[5];
-	fslice z1_is_zero, z2_is_zero, x_equal, y_equal;
-
-	/* ftmp = z1^2 */
-	felem_square(tmp, z1);
-	felem_reduce(ftmp, tmp);
-
-	/* ftmp2 = z2^2 */
-	felem_square(tmp, z2);
-	felem_reduce(ftmp2, tmp);
-
-	/* ftmp3 = z1^3 */
-	felem_mul(tmp, ftmp, z1);
-	felem_reduce(ftmp3, tmp);
-
-	/* ftmp4 = z2^3 */
-	felem_mul(tmp, ftmp2, z2);
-	felem_reduce(ftmp4, tmp);
-
-	/* ftmp3 = z1^3*y2 */
-	felem_mul(tmp, ftmp3, y2);
-	/* tmp[i] < 4 * 2^57 * 2^57 = 2^116 */
-
-	/* ftmp4 = z2^3*y1 */
-	felem_mul(tmp2, ftmp4, y1);
-	felem_reduce(ftmp4, tmp2);
-
-	/* ftmp3 = z1^3*y2 - z2^3*y1 */
-	felem_diff_128_64(tmp, ftmp4);
-	/* tmp[i] < 2^116 + 2^64 + 8 < 2^117 */
-	felem_reduce(ftmp3, tmp);
-
-	/* ftmp = z1^2*x2 */
-	felem_mul(tmp, ftmp, x2);
-	/* tmp[i] < 4 * 2^57 * 2^57 = 2^116 */
-
-	/* ftmp2 =z2^2*x1 */
-	felem_mul(tmp2, ftmp2, x1);
-	felem_reduce(ftmp2, tmp2);
-
-	/* ftmp = z1^2*x2 - z2^2*x1 */
-	felem_diff128(tmp, tmp2);
-	/* tmp[i] < 2^116 + 2^64 + 8 < 2^117 */
-	felem_reduce(ftmp, tmp);
-
-	/* the formulae are incorrect if the points are equal
-	 * so we check for this and do doubling if this happens */
-	x_equal = felem_is_zero(ftmp);
-	y_equal = felem_is_zero(ftmp3);
-	z1_is_zero = felem_is_zero(z1);
-	z2_is_zero = felem_is_zero(z2);
-	/* In affine coordinates, (X_1, Y_1) == (X_2, Y_2) */
-	if (x_equal && y_equal && !z1_is_zero && !z2_is_zero)
-		{
-		point_double(x3, y3, z3, x1, y1, z1);
-		return;
-		}
-
-	/* ftmp5 = z1*z2 */
-	felem_mul(tmp, z1, z2);
-	felem_reduce(ftmp5, tmp);
-
-	/* zout = (z1^2*x2 - z2^2*x1)*(z1*z2) */
-	felem_mul(tmp, ftmp, ftmp5);
-	felem_reduce(zout, tmp);
-
-	/* ftmp = (z1^2*x2 - z2^2*x1)^2 */
-	memcpy(ftmp5, ftmp, 3 * sizeof(fslice));
-	felem_square(tmp, ftmp);
-	felem_reduce(ftmp, tmp);
-
-	/* ftmp5 = (z1^2*x2 - z2^2*x1)^3 */
-	felem_mul(tmp, ftmp, ftmp5);
-	felem_reduce(ftmp5, tmp);
-
-	/* ftmp2 = z2^2*x1*(z1^2*x2 - z2^2*x1)^2 */
-	felem_mul(tmp, ftmp2, ftmp);
-	felem_reduce(ftmp2, tmp);
-
-	/* ftmp4 = z2^3*y1*(z1^2*x2 - z2^2*x1)^3 */
-	felem_mul(tmp, ftmp4, ftmp5);
-	/* tmp[i] < 4 * 2^57 * 2^57 = 2^116 */
-
-	/* tmp2 = (z1^3*y2 - z2^3*y1)^2 */
-	felem_square(tmp2, ftmp3);
-	/* tmp2[i] < 4 * 2^57 * 2^57 < 2^116 */
-
-	/* tmp2 = (z1^3*y2 - z2^3*y1)^2 - (z1^2*x2 - z2^2*x1)^3 */
-	felem_diff_128_64(tmp2, ftmp5);
-	/* tmp2[i] < 2^116 + 2^64 + 8 < 2^117 */
-
-	/* ftmp5 = 2*z2^2*x1*(z1^2*x2 - z2^2*x1)^2 */
-	memcpy(ftmp5, ftmp2, 3 * sizeof(fslice));
-	felem_scalar64(ftmp5, 2);
-	/* ftmp5[i] < 2 * 2^57 = 2^58 */
-
-	/* xout = (z1^3*y2 - z2^3*y1)^2 - (z1^2*x2 - z2^2*x1)^3 -
-	   2*z2^2*x1*(z1^2*x2 - z2^2*x1)^2 */
-	felem_diff_128_64(tmp2, ftmp5);
-	/* tmp2[i] < 2^117 + 2^64 + 8 < 2^118 */
-	felem_reduce(xout, tmp2);
-
-	/* ftmp2 = z2^2*x1*(z1^2*x2 - z2^2*x1)^2 - xout */
-	felem_diff64(ftmp2, xout);
-	/* ftmp2[i] < 2^57 + 2^58 + 2 < 2^59 */
-
-	/* tmp2 = (z1^3*y2 - z2^3*y1)*(z2^2*x1*(z1^2*x2 - z2^2*x1)^2 - xout) */
-	felem_mul(tmp2, ftmp3, ftmp2);
-	/* tmp2[i] < 4 * 2^57 * 2^59 = 2^118 */
-
-	/* yout = (z1^3*y2 - z2^3*y1)*(z2^2*x1*(z1^2*x2 - z2^2*x1)^2 - xout) -
-	   z2^3*y1*(z1^2*x2 - z2^2*x1)^3 */
-	felem_diff128(tmp2, tmp);
-	/* tmp2[i] < 2^118 + 2^120 < 2^121 */
-	felem_reduce(yout, tmp2);
-
-	/* the result (xout, yout, zout) is incorrect if one of the
-	 * inputs is the point at infinity, so we need to check for this
-	 * separately */
-
-	/* if point 1 is at infinity, copy point 2 to output, and vice versa */
-	copy_conditional(xout, x2, 3, z1_is_zero);
-	select_conditional(x3, xout, x1, 3, z2_is_zero);
-	copy_conditional(yout, y2, 3, z1_is_zero);
-	select_conditional(y3, yout, y1, 3, z2_is_zero);
-	copy_conditional(zout, z2, 3, z1_is_zero);
-	select_conditional(z3, zout, z1, 3, z2_is_zero);
-	}
-
-/*static void affine(point P)
-{
-    coord z1, z2, xin, yin;
-    uint128_t tmp[7];
-
-    if (felem_is_zero(P[2])) return;
-    felem_inv(z2, P[2]);
-    felem_square(tmp, z2); felem_reduce(z1, tmp);
-    felem_mul(tmp, P[0], z1); felem_reduce(xin, tmp);
-    felem_contract(P[0], xin);
-    felem_mul(tmp, z1, z2); felem_reduce(z1, tmp);
-    felem_mul(tmp, P[1], z1); felem_reduce(yin, tmp);
-    felem_contract(P[1], yin);
-    memset(P[2], 0, sizeof(coord));
-    P[2][0] = 1;
-}*/
-
-static void affine_x(coord out, point P)
-{
-    coord z1, z2, xin;
-    uint128_t tmp[7];
-
-    if (felem_is_zero(P[2])) return;
-    felem_inv(z2, P[2]);
-    felem_square(tmp, z2); felem_reduce(z1, tmp);
-    felem_mul(tmp, P[0], z1); felem_reduce(xin, tmp);
-    felem_contract(out, xin);
-}
-
-/* Multiply the given point by s */
-static void point_mul(point out, point in, const felem_bytearray s)
-{
-    int i;
-    point tmp;
-
-    point table[16];
-    memset(table[0], 0, sizeof(point));
-    memmove(table[1], in, sizeof(point));
-    for(i=2; i<16; i+=2) {
-	point_double(table[i][0], table[i][1], table[i][2],
-		     table[i/2][0], table[i/2][1], table[i/2][2]);
-	point_add(table[i+1][0], table[i+1][1], table[i+1][2],
-		  table[i][0], table[i][1], table[i][2],
-		  in[0], in[1], in[2]);
-    }
-    /*
-    for(i=0;i<16;++i) {
-	fprintf(stderr, "table[%d]:\n", i);
-	affine(table[i]);
-	dump_point(NULL, table[i]);
-    }
-    */
-
-    memset(tmp, 0, sizeof(point));
-    for(i=0;i<21;i++) {
-	u8 oh = s[20-i] >> 4;
-	u8 ol = s[20-i] & 0x0f;
-	point_double(tmp[0], tmp[1], tmp[2], tmp[0], tmp[1], tmp[2]);
-	point_double(tmp[0], tmp[1], tmp[2], tmp[0], tmp[1], tmp[2]);
-	point_double(tmp[0], tmp[1], tmp[2], tmp[0], tmp[1], tmp[2]);
-	point_double(tmp[0], tmp[1], tmp[2], tmp[0], tmp[1], tmp[2]);
-	point_add(tmp[0], tmp[1], tmp[2], tmp[0], tmp[1], tmp[2],
-		  table[oh][0], table[oh][1], table[oh][2]);
-	point_double(tmp[0], tmp[1], tmp[2], tmp[0], tmp[1], tmp[2]);
-	point_double(tmp[0], tmp[1], tmp[2], tmp[0], tmp[1], tmp[2]);
-	point_double(tmp[0], tmp[1], tmp[2], tmp[0], tmp[1], tmp[2]);
-	point_double(tmp[0], tmp[1], tmp[2], tmp[0], tmp[1], tmp[2]);
-	point_add(tmp[0], tmp[1], tmp[2], tmp[0], tmp[1], tmp[2],
-		  table[ol][0], table[ol][1], table[ol][2]);
-    }
-    memmove(out, tmp, sizeof(point));
-}
-
-#if 0
-/* Select a point from an array of 16 precomputed point multiples,
- * in constant time: for bits = {b_0, b_1, b_2, b_3}, return the point
- * pre_comp[8*b_3 + 4*b_2 + 2*b_1 + b_0] */
-static void select_point(const fslice bits[4], const fslice pre_comp[16][3][4],
-	fslice out[12])
-	{
-	fslice tmp[5][12];
-	select_conditional(tmp[0], pre_comp[7][0], pre_comp[15][0], 12, bits[3]);
-	select_conditional(tmp[1], pre_comp[3][0], pre_comp[11][0], 12, bits[3]);
-	select_conditional(tmp[2], tmp[1], tmp[0], 12, bits[2]);
-	select_conditional(tmp[0], pre_comp[5][0], pre_comp[13][0], 12, bits[3]);
-	select_conditional(tmp[1], pre_comp[1][0], pre_comp[9][0], 12, bits[3]);
-	select_conditional(tmp[3], tmp[1], tmp[0], 12, bits[2]);
-	select_conditional(tmp[4], tmp[3], tmp[2], 12, bits[1]);
-	select_conditional(tmp[0], pre_comp[6][0], pre_comp[14][0], 12, bits[3]);
-	select_conditional(tmp[1], pre_comp[2][0], pre_comp[10][0], 12, bits[3]);
-	select_conditional(tmp[2], tmp[1], tmp[0], 12, bits[2]);
-	select_conditional(tmp[0], pre_comp[4][0], pre_comp[12][0], 12, bits[3]);
-	select_conditional(tmp[1], pre_comp[0][0], pre_comp[8][0], 12, bits[3]);
-	select_conditional(tmp[3], tmp[1], tmp[0], 12, bits[2]);
-	select_conditional(tmp[1], tmp[3], tmp[2], 12, bits[1]);
-	select_conditional(out, tmp[1], tmp[4], 12, bits[0]);
-	}
-
-/* Interleaved point multiplication using precomputed point multiples:
- * The small point multiples 0*P, 1*P, ..., 15*P are in pre_comp[],
- * the scalars in scalars[]. If g_scalar is non-NULL, we also add this multiple
- * of the generator, using certain (large) precomputed multiples in g_pre_comp.
- * Output point (X, Y, Z) is stored in x_out, y_out, z_out */
-static void batch_mul(fslice x_out[4], fslice y_out[4], fslice z_out[4],
-	const felem_bytearray scalars[], const unsigned num_points, const u8 *g_scalar,
-	const fslice pre_comp[][16][3][4], const fslice g_pre_comp[16][3][4])
-	{
-	unsigned i, j, num;
-	unsigned gen_mul = (g_scalar != NULL);
-	fslice nq[12], nqt[12], tmp[12];
-	fslice bits[4];
-	u8 byte;
-
-	/* set nq to the point at infinity */
-	memset(nq, 0, 12 * sizeof(fslice));
-
-	/* Loop over all scalars msb-to-lsb, 4 bits at a time: for each nibble,
-	 * double 4 times, then add the precomputed point multiples.
-	 * If we are also adding multiples of the generator, then interleave
-	 * these additions with the last 56 doublings. */
-	for (i = (num_points ? 28 : 7); i > 0; --i)
-		{
-		for (j = 0; j < 8; ++j)
-			{
-			/* double once */
-			point_double(nq, nq+4, nq+8, nq, nq+4, nq+8);
-			/* add multiples of the generator */
-			if ((gen_mul) && (i <= 7))
-				{
-				bits[3] = (g_scalar[i+20] >> (7-j)) & 1;
-				bits[2] = (g_scalar[i+13] >> (7-j)) & 1;
-				bits[1] = (g_scalar[i+6] >> (7-j)) & 1;
-				bits[0] = (g_scalar[i-1] >> (7-j)) & 1;
-				/* select the point to add, in constant time */
-				select_point(bits, g_pre_comp, tmp);
-				memcpy(nqt, nq, 12 * sizeof(fslice));
-				point_add(nq, nq+4, nq+8, nqt, nqt+4, nqt+8,
-					tmp, tmp+4, tmp+8);
-				}
-			/* do an addition after every 4 doublings */
-			if (j % 4 == 3)
-				{
-				/* loop over all scalars */
-				for (num = 0; num < num_points; ++num)
-					{
-					byte = scalars[num][i-1];
-					bits[3] = (byte >> (10-j)) & 1;
-					bits[2] = (byte >> (9-j)) & 1;
-					bits[1] = (byte >> (8-j)) & 1;
-					bits[0] = (byte >> (7-j)) & 1;
-					/* select the point to add */
-					select_point(bits,
-						pre_comp[num], tmp);
-					memcpy(nqt, nq, 12 * sizeof(fslice));
-					point_add(nq, nq+4, nq+8, nqt, nqt+4,
-						nqt+8, tmp, tmp+4, tmp+8);
-					}
-				}
-			}
-		}
-	memcpy(x_out, nq, 4 * sizeof(fslice));
-	memcpy(y_out, nq+4, 4 * sizeof(fslice));
-	memcpy(z_out, nq+8, 4 * sizeof(fslice));
-	}
-
-/******************************************************************************/
-/*		       FUNCTIONS TO MANAGE PRECOMPUTATION
- */
-
-static NISTP224_PRE_COMP *nistp224_pre_comp_new()
-	{
-	NISTP224_PRE_COMP *ret = NULL;
-	ret = (NISTP224_PRE_COMP *)OPENSSL_malloc(sizeof(NISTP224_PRE_COMP));
-	if (!ret)
-		{
-		ECerr(EC_F_NISTP224_PRE_COMP_NEW, ERR_R_MALLOC_FAILURE);
-		return ret;
-		}
-	memset(ret->g_pre_comp, 0, sizeof(ret->g_pre_comp));
-	ret->references = 1;
-	return ret;
-	}
-
-static void *nistp224_pre_comp_dup(void *src_)
-	{
-	NISTP224_PRE_COMP *src = src_;
-
-	/* no need to actually copy, these objects never change! */
-	CRYPTO_add(&src->references, 1, CRYPTO_LOCK_EC_PRE_COMP);
-
-	return src_;
-	}
-
-static void nistp224_pre_comp_free(void *pre_)
-	{
-	int i;
-	NISTP224_PRE_COMP *pre = pre_;
-
-	if (!pre)
-		return;
-
-	i = CRYPTO_add(&pre->references, -1, CRYPTO_LOCK_EC_PRE_COMP);
-	if (i > 0)
-		return;
-
-	OPENSSL_free(pre);
-	}
-
-static void nistp224_pre_comp_clear_free(void *pre_)
-	{
-	int i;
-	NISTP224_PRE_COMP *pre = pre_;
-
-	if (!pre)
-		return;
-
-	i = CRYPTO_add(&pre->references, -1, CRYPTO_LOCK_EC_PRE_COMP);
-	if (i > 0)
-		return;
-
-	OPENSSL_cleanse(pre, sizeof *pre);
-	OPENSSL_free(pre);
-	}
-
-/******************************************************************************/
-/*			   OPENSSL EC_METHOD FUNCTIONS
- */
-
-int ec_GFp_nistp224_group_init(EC_GROUP *group)
-	{
-	int ret;
-	ret = ec_GFp_simple_group_init(group);
-	group->a_is_minus3 = 1;
-	return ret;
-	}
-
-int ec_GFp_nistp224_group_set_curve(EC_GROUP *group, const BIGNUM *p,
-	const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx)
-	{
-	int ret = 0;
-	BN_CTX *new_ctx = NULL;
-	BIGNUM *curve_p, *curve_a, *curve_b;
-
-	if (ctx == NULL)
-		if ((ctx = new_ctx = BN_CTX_new()) == NULL) return 0;
-	BN_CTX_start(ctx);
-	if (((curve_p = BN_CTX_get(ctx)) == NULL) ||
-		((curve_a = BN_CTX_get(ctx)) == NULL) ||
-		((curve_b = BN_CTX_get(ctx)) == NULL)) goto err;
-	BN_bin2bn(nistp224_curve_params[0], sizeof(felem_bytearray), curve_p);
-	BN_bin2bn(nistp224_curve_params[1], sizeof(felem_bytearray), curve_a);
-	BN_bin2bn(nistp224_curve_params[2], sizeof(felem_bytearray), curve_b);
-	if ((BN_cmp(curve_p, p)) || (BN_cmp(curve_a, a)) ||
-		(BN_cmp(curve_b, b)))
-		{
-		ECerr(EC_F_EC_GFP_NISTP224_GROUP_SET_CURVE,
-			EC_R_WRONG_CURVE_PARAMETERS);
-		goto err;
-		}
-	group->field_mod_func = BN_nist_mod_224;
-	ret = ec_GFp_simple_group_set_curve(group, p, a, b, ctx);
-err:
-	BN_CTX_end(ctx);
-	if (new_ctx != NULL)
-		BN_CTX_free(new_ctx);
-	return ret;
-	}
-
-/* Takes the Jacobian coordinates (X, Y, Z) of a point and returns
- * (X', Y') = (X/Z^2, Y/Z^3) */
-int ec_GFp_nistp224_point_get_affine_coordinates(const EC_GROUP *group,
-	const EC_POINT *point, BIGNUM *x, BIGNUM *y, BN_CTX *ctx)
-	{
-	fslice z1[4], z2[4], x_in[4], y_in[4], x_out[4], y_out[4];
-	uint128_t tmp[7];
-
-	if (EC_POINT_is_at_infinity(group, point))
-		{
-		ECerr(EC_F_EC_GFP_NISTP224_POINT_GET_AFFINE_COORDINATES,
-			EC_R_POINT_AT_INFINITY);
-		return 0;
-		}
-	if ((!BN_to_felem(x_in, &point->X)) || (!BN_to_felem(y_in, &point->Y)) ||
-		(!BN_to_felem(z1, &point->Z))) return 0;
-	felem_inv(z2, z1);
-	felem_square(tmp, z2); felem_reduce(z1, tmp);
-	felem_mul(tmp, x_in, z1); felem_reduce(x_in, tmp);
-	felem_contract(x_out, x_in);
-	if (x != NULL)
-		{
-		if (!felem_to_BN(x, x_out)) {
-		ECerr(EC_F_EC_GFP_NISTP224_POINT_GET_AFFINE_COORDINATES,
-			ERR_R_BN_LIB);
-		return 0;
-		}
-		}
-	felem_mul(tmp, z1, z2); felem_reduce(z1, tmp);
-	felem_mul(tmp, y_in, z1); felem_reduce(y_in, tmp);
-	felem_contract(y_out, y_in);
-	if (y != NULL)
-		{
-		if (!felem_to_BN(y, y_out)) {
-		ECerr(EC_F_EC_GFP_NISTP224_POINT_GET_AFFINE_COORDINATES,
-			ERR_R_BN_LIB);
-		return 0;
-		}
-		}
-	return 1;
-	}
-
-/* Computes scalar*generator + \sum scalars[i]*points[i], ignoring NULL values
- * Result is stored in r (r can equal one of the inputs). */
-int ec_GFp_nistp224_points_mul(const EC_GROUP *group, EC_POINT *r,
-	const BIGNUM *scalar, size_t num, const EC_POINT *points[],
-	const BIGNUM *scalars[], BN_CTX *ctx)
-	{
-	int ret = 0;
-	int i, j;
-	BN_CTX *new_ctx = NULL;
-	BIGNUM *x, *y, *z, *tmp_scalar;
-	felem_bytearray g_secret;
-	felem_bytearray *secrets = NULL;
-	fslice (*pre_comp)[16][3][4] = NULL;
-	felem_bytearray tmp;
-	unsigned num_bytes;
-	int have_pre_comp = 0;
-	size_t num_points = num;
-	fslice x_in[4], y_in[4], z_in[4], x_out[4], y_out[4], z_out[4];
-	NISTP224_PRE_COMP *pre = NULL;
-	fslice (*g_pre_comp)[3][4] = NULL;
-	EC_POINT *generator = NULL;
-	const EC_POINT *p = NULL;
-	const BIGNUM *p_scalar = NULL;
-
-	if (ctx == NULL)
-		if ((ctx = new_ctx = BN_CTX_new()) == NULL) return 0;
-	BN_CTX_start(ctx);
-	if (((x = BN_CTX_get(ctx)) == NULL) ||
-		((y = BN_CTX_get(ctx)) == NULL) ||
-		((z = BN_CTX_get(ctx)) == NULL) ||
-		((tmp_scalar = BN_CTX_get(ctx)) == NULL))
-		goto err;
-
-	if (scalar != NULL)
-		{
-		pre = EC_EX_DATA_get_data(group->extra_data,
-			nistp224_pre_comp_dup, nistp224_pre_comp_free,
-			nistp224_pre_comp_clear_free);
-		if (pre)
-			/* we have precomputation, try to use it */
-			g_pre_comp = pre->g_pre_comp;
-		else
-			/* try to use the standard precomputation */
-			g_pre_comp = (fslice (*)[3][4]) gmul;
-		generator = EC_POINT_new(group);
-		if (generator == NULL)
-			goto err;
-		/* get the generator from precomputation */
-		if (!felem_to_BN(x, g_pre_comp[1][0]) ||
-			!felem_to_BN(y, g_pre_comp[1][1]) ||
-			!felem_to_BN(z, g_pre_comp[1][2]))
-			{
-			ECerr(EC_F_EC_GFP_NISTP224_POINTS_MUL, ERR_R_BN_LIB);
-			goto err;
-			}
-		if (!EC_POINT_set_Jprojective_coordinates_GFp(group,
-				generator, x, y, z, ctx))
-			goto err;
-		if (0 == EC_POINT_cmp(group, generator, group->generator, ctx))
-			/* precomputation matches generator */
-			have_pre_comp = 1;
-		else
-			/* we don't have valid precomputation:
-			 * treat the generator as a random point */
-			num_points = num_points + 1;
-		}
-	secrets = OPENSSL_malloc(num_points * sizeof(felem_bytearray));
-	pre_comp = OPENSSL_malloc(num_points * 16 * 3 * 4 * sizeof(fslice));
-
-	if ((num_points) && ((secrets == NULL) || (pre_comp == NULL)))
-		{
-		ECerr(EC_F_EC_GFP_NISTP224_POINTS_MUL, ERR_R_MALLOC_FAILURE);
-		goto err;
-		}
-
-	/* we treat NULL scalars as 0, and NULL points as points at infinity,
-	 * i.e., they contribute nothing to the linear combination */
-	memset(secrets, 0, num_points * sizeof(felem_bytearray));
-	memset(pre_comp, 0, num_points * 16 * 3 * 4 * sizeof(fslice));
-	for (i = 0; i < num_points; ++i)
-		{
-		if (i == num)
-			/* the generator */
-			{
-			p = EC_GROUP_get0_generator(group);
-			p_scalar = scalar;
-			}
-		else
-			/* the i^th point */
-			{
-			p = points[i];
-			p_scalar = scalars[i];
-			}
-		if ((p_scalar != NULL) && (p != NULL))
-			{
-			num_bytes = BN_num_bytes(p_scalar);
-			/* reduce scalar to 0 <= scalar < 2^224 */
-			if ((num_bytes > sizeof(felem_bytearray)) || (BN_is_negative(p_scalar)))
-				{
-				/* this is an unusual input, and we don't guarantee
-				 * constant-timeness */
-				if (!BN_nnmod(tmp_scalar, p_scalar, &group->order, ctx))
-					{
-					ECerr(EC_F_EC_GFP_NISTP224_POINTS_MUL, ERR_R_BN_LIB);
-					goto err;
-					}
-				num_bytes = BN_bn2bin(tmp_scalar, tmp);
-				}
-			else
-				BN_bn2bin(p_scalar, tmp);
-			flip_endian(secrets[i], tmp, num_bytes);
-			/* precompute multiples */
-			if ((!BN_to_felem(x_out, &p->X)) ||
-				(!BN_to_felem(y_out, &p->Y)) ||
-				(!BN_to_felem(z_out, &p->Z))) goto err;
-			memcpy(pre_comp[i][1][0], x_out, 4 * sizeof(fslice));
-			memcpy(pre_comp[i][1][1], y_out, 4 * sizeof(fslice));
-			memcpy(pre_comp[i][1][2], z_out, 4 * sizeof(fslice));
-			for (j = 1; j < 8; ++j)
-				{
-				point_double(pre_comp[i][2*j][0],
-					pre_comp[i][2*j][1],
-					pre_comp[i][2*j][2],
-					pre_comp[i][j][0],
-					pre_comp[i][j][1],
-					pre_comp[i][j][2]);
-				point_add(pre_comp[i][2*j+1][0],
-					pre_comp[i][2*j+1][1],
-					pre_comp[i][2*j+1][2],
-					pre_comp[i][1][0],
-					pre_comp[i][1][1],
-					pre_comp[i][1][2],
-					pre_comp[i][2*j][0],
-					pre_comp[i][2*j][1],
-					pre_comp[i][2*j][2]);
-				}
-			}
-		}
-
-	/* the scalar for the generator */
-	if ((scalar != NULL) && (have_pre_comp))
-		{
-		memset(g_secret, 0, sizeof g_secret);
-		num_bytes = BN_num_bytes(scalar);
-		/* reduce scalar to 0 <= scalar < 2^224 */
-		if ((num_bytes > sizeof(felem_bytearray)) || (BN_is_negative(scalar)))
-			{
-			/* this is an unusual input, and we don't guarantee
-			 * constant-timeness */
-			if (!BN_nnmod(tmp_scalar, scalar, &group->order, ctx))
-				{
-				ECerr(EC_F_EC_GFP_NISTP224_POINTS_MUL, ERR_R_BN_LIB);
-				goto err;
-				}
-			num_bytes = BN_bn2bin(tmp_scalar, tmp);
-			}
-		else
-			BN_bn2bin(scalar, tmp);
-		flip_endian(g_secret, tmp, num_bytes);
-		/* do the multiplication with generator precomputation*/
-		batch_mul(x_out, y_out, z_out,
-			(const felem_bytearray (*)) secrets, num_points,
-			g_secret, (const fslice (*)[16][3][4]) pre_comp,
-			(const fslice (*)[3][4]) g_pre_comp);
-		}
-	else
-		/* do the multiplication without generator precomputation */
-		batch_mul(x_out, y_out, z_out,
-			(const felem_bytearray (*)) secrets, num_points,
-			NULL, (const fslice (*)[16][3][4]) pre_comp, NULL);
-	/* reduce the output to its unique minimal representation */
-	felem_contract(x_in, x_out);
-	felem_contract(y_in, y_out);
-	felem_contract(z_in, z_out);
-	if ((!felem_to_BN(x, x_in)) || (!felem_to_BN(y, y_in)) ||
-		(!felem_to_BN(z, z_in)))
-		{
-		ECerr(EC_F_EC_GFP_NISTP224_POINTS_MUL, ERR_R_BN_LIB);
-		goto err;
-		}
-	ret = EC_POINT_set_Jprojective_coordinates_GFp(group, r, x, y, z, ctx);
-
-err:
-	BN_CTX_end(ctx);
-	if (generator != NULL)
-		EC_POINT_free(generator);
-	if (new_ctx != NULL)
-		BN_CTX_free(new_ctx);
-	if (secrets != NULL)
-		OPENSSL_free(secrets);
-	if (pre_comp != NULL)
-		OPENSSL_free(pre_comp);
-	return ret;
-	}
-
-int ec_GFp_nistp224_precompute_mult(EC_GROUP *group, BN_CTX *ctx)
-	{
-	int ret = 0;
-	NISTP224_PRE_COMP *pre = NULL;
-	int i, j;
-	BN_CTX *new_ctx = NULL;
-	BIGNUM *x, *y;
-	EC_POINT *generator = NULL;
-
-	/* throw away old precomputation */
-	EC_EX_DATA_free_data(&group->extra_data, nistp224_pre_comp_dup,
-		nistp224_pre_comp_free, nistp224_pre_comp_clear_free);
-	if (ctx == NULL)
-		if ((ctx = new_ctx = BN_CTX_new()) == NULL) return 0;
-	BN_CTX_start(ctx);
-	if (((x = BN_CTX_get(ctx)) == NULL) ||
-		((y = BN_CTX_get(ctx)) == NULL))
-		goto err;
-	/* get the generator */
-	if (group->generator == NULL) goto err;
-	generator = EC_POINT_new(group);
-	if (generator == NULL)
-		goto err;
-	BN_bin2bn(nistp224_curve_params[3], sizeof (felem_bytearray), x);
-	BN_bin2bn(nistp224_curve_params[4], sizeof (felem_bytearray), y);
-	if (!EC_POINT_set_affine_coordinates_GFp(group, generator, x, y, ctx))
-		goto err;
-	if ((pre = nistp224_pre_comp_new()) == NULL)
-		goto err;
-	/* if the generator is the standard one, use built-in precomputation */
-	if (0 == EC_POINT_cmp(group, generator, group->generator, ctx))
-		{
-		memcpy(pre->g_pre_comp, gmul, sizeof(pre->g_pre_comp));
-		ret = 1;
-		goto err;
-		}
-	if ((!BN_to_felem(pre->g_pre_comp[1][0], &group->generator->X)) ||
-		(!BN_to_felem(pre->g_pre_comp[1][1], &group->generator->Y)) ||
-		(!BN_to_felem(pre->g_pre_comp[1][2], &group->generator->Z)))
-		goto err;
-	/* compute 2^56*G, 2^112*G, 2^168*G */
-	for (i = 1; i < 5; ++i)
-		{
-		point_double(pre->g_pre_comp[2*i][0], pre->g_pre_comp[2*i][1],
-			pre->g_pre_comp[2*i][2], pre->g_pre_comp[i][0],
-			pre->g_pre_comp[i][1], pre->g_pre_comp[i][2]);
-		for (j = 0; j < 55; ++j)
-			{
-			point_double(pre->g_pre_comp[2*i][0],
-				pre->g_pre_comp[2*i][1],
-				pre->g_pre_comp[2*i][2],
-				pre->g_pre_comp[2*i][0],
-				pre->g_pre_comp[2*i][1],
-				pre->g_pre_comp[2*i][2]);
-			}
-		}
-	/* g_pre_comp[0] is the point at infinity */
-	memset(pre->g_pre_comp[0], 0, sizeof(pre->g_pre_comp[0]));
-	/* the remaining multiples */
-	/* 2^56*G + 2^112*G */
-	point_add(pre->g_pre_comp[6][0], pre->g_pre_comp[6][1],
-		pre->g_pre_comp[6][2], pre->g_pre_comp[4][0],
-		pre->g_pre_comp[4][1], pre->g_pre_comp[4][2],
-		pre->g_pre_comp[2][0], pre->g_pre_comp[2][1],
-		pre->g_pre_comp[2][2]);
-	/* 2^56*G + 2^168*G */
-	point_add(pre->g_pre_comp[10][0], pre->g_pre_comp[10][1],
-		pre->g_pre_comp[10][2], pre->g_pre_comp[8][0],
-		pre->g_pre_comp[8][1], pre->g_pre_comp[8][2],
-		pre->g_pre_comp[2][0], pre->g_pre_comp[2][1],
-		pre->g_pre_comp[2][2]);
-	/* 2^112*G + 2^168*G */
-	point_add(pre->g_pre_comp[12][0], pre->g_pre_comp[12][1],
-		pre->g_pre_comp[12][2], pre->g_pre_comp[8][0],
-		pre->g_pre_comp[8][1], pre->g_pre_comp[8][2],
-		pre->g_pre_comp[4][0], pre->g_pre_comp[4][1],
-		pre->g_pre_comp[4][2]);
-	/* 2^56*G + 2^112*G + 2^168*G */
-	point_add(pre->g_pre_comp[14][0], pre->g_pre_comp[14][1],
-		pre->g_pre_comp[14][2], pre->g_pre_comp[12][0],
-		pre->g_pre_comp[12][1], pre->g_pre_comp[12][2],
-		pre->g_pre_comp[2][0], pre->g_pre_comp[2][1],
-		pre->g_pre_comp[2][2]);
-	for (i = 1; i < 8; ++i)
-		{
-		/* odd multiples: add G */
-		point_add(pre->g_pre_comp[2*i+1][0], pre->g_pre_comp[2*i+1][1],
-			pre->g_pre_comp[2*i+1][2], pre->g_pre_comp[2*i][0],
-			pre->g_pre_comp[2*i][1], pre->g_pre_comp[2*i][2],
-			pre->g_pre_comp[1][0], pre->g_pre_comp[1][1],
-			pre->g_pre_comp[1][2]);
-		}
-
-	if (!EC_EX_DATA_set_data(&group->extra_data, pre, nistp224_pre_comp_dup,
-			nistp224_pre_comp_free, nistp224_pre_comp_clear_free))
-		goto err;
-	ret = 1;
-	pre = NULL;
- err:
-	BN_CTX_end(ctx);
-	if (generator != NULL)
-		EC_POINT_free(generator);
-	if (new_ctx != NULL)
-		BN_CTX_free(new_ctx);
-	if (pre)
-		nistp224_pre_comp_free(pre);
-	return ret;
-	}
-
-int ec_GFp_nistp224_have_precompute_mult(const EC_GROUP *group)
-	{
-	if (EC_EX_DATA_get_data(group->extra_data, nistp224_pre_comp_dup,
-			nistp224_pre_comp_free, nistp224_pre_comp_clear_free)
-		!= NULL)
-		return 1;
-	else
-		return 0;
-	}
-#endif
-
-#ifdef TESTING
-
-#include <sys/time.h>
-
-static u8 ctoh(char c)
-{
-    if (c >= '0' && c <= '9') return c-'0';
-    if (c >= 'a' && c <= 'f') return c-'a'+10;
-    if (c >= 'A' && c <= 'F') return c-'A'+10;
-    return 0;
-}
-
-static void arg_to_bytearray(felem_bytearray ba, const char *arg)
-{
-    /* Convert the arg, which is a string like "1a2637c8" to a byte
-     * array like 0xc8 0x37 0x26 0x1a. */
-    int size = sizeof(felem_bytearray);
-    int arglen = strlen(arg);
-    int argsize = (arglen+1)/2;
-    const char *argp = arg + arglen;
-    u8 *bap = ba;
-
-    memset(ba, 0, size);
-    if (size < argsize) {
-	fprintf(stderr, "Arg too long: %s\n", arg);
-	exit(1);
-    }
-
-    while (argp > arg+1) {
-	argp -= 2;
-	*bap = (ctoh(argp[0])<<4)|(ctoh(argp[1]));
-	++bap;
-    }
-    if (arglen & 1) {
-	/* Handle the stray top nybble */
-	argp -= 1;
-	*bap = ctoh(argp[0]);
-    }
-}
-
-static void arg_to_coord(coord c, const char *arg)
-{
-    felem_bytearray ba;
-
-    arg_to_bytearray(ba, arg);
-    /* Now convert it to a coord */
-    bin21_to_felem(c, ba);
-}
-
-int main(int argc, char **argv)
-{
-    point infinity, P, Q, P2, PQ;
-    felem_bytearray s;
-    int i;
-    struct timeval st, et;
-    unsigned long el;
-    int niter = 1000;
-
-    memset(infinity, 0, sizeof(infinity));
-    memset(P, 0, sizeof(P));
-    memset(Q, 0, sizeof(Q));
-
-    if (argc != 6) {
-	fprintf(stderr, "Usage: %s Px Py Qx Qy s\n", argv[0]);
-	exit(1);
-    }
-
-    arg_to_coord(P[0], argv[1]);
-    arg_to_coord(P[1], argv[2]);
-    P[2][0] = 1;
-    dump_point("P", P);
-    arg_to_coord(Q[0], argv[3]);
-    arg_to_coord(Q[1], argv[4]);
-    Q[2][0] = 1;
-    dump_point("Q", Q);
-    arg_to_bytearray(s, argv[5]);
-
-    point_double(P2[0], P2[1], P2[2], P[0], P[1], P[2]);
-    affine(P2);
-    point_add(PQ[0], PQ[1], PQ[2], P[0], P[1], P[2], Q[0], Q[1], Q[2]);
-    affine(PQ);
-    dump_point("P2", P2);
-    dump_point("PQ", PQ);
-
-    gettimeofday(&st, NULL);
-    for (i=0;i<niter;++i) {
-	point_mul(P, P, s);
-	affine(P);
-    }
-    gettimeofday(&et, NULL);
-    el = (et.tv_sec-st.tv_sec)*1000000 + (et.tv_usec-st.tv_usec);
-    fprintf(stderr, "%lu / %d = %lu us\n", el, niter, el/niter);
-
-    dump_point("Ps", P);
-
-    return 0;
-}
-#endif
-
-/* Figure out whether there's a point with x-coordinate x on the main
- * curve.  If not, then there's one on the twist curve.  (There are
- * actually two, which are negatives of each other; that doesn't
- * matter.)  Multiply that point by seckey and set out to the
- * x-coordinate of the result. */
-void ptwist_pointmul(byte out[PTWIST_BYTES], const byte x[PTWIST_BYTES],
-	const byte seckey[PTWIST_BYTES])
-{
-    /* Compute z = x^3 + a*x + b */
-    point P, Q;
-    coord z, r2, Qx;
-    uint128_t tmp[5];
-    int ontwist;
-    static const coord three = { 3, 0, 0 };
-    static const coord b =
-	    { 0x46d320e01dc7d6, 0x486ebc69bad316, 0x4e355e95cafedd };
-
-
-    /* Convert the byte array to a coord */
-    bin21_to_felem(P[0], x);
-
-    /* Compute z = x^3 - 3*x + b */
-    felem_square(tmp, P[0]); felem_reduce(z, tmp);
-    felem_diff64(z, three);
-    felem_mul(tmp, z, P[0]); felem_reduce(z, tmp);
-    felem_sum64(z, b);
-
-    /*
-    dump_coord("z", z);
-    */
-    /* Compute r = P[1] = z ^ ((p+1)/4).  This will be a square root of
-     * z, if one exists. */
-    felem_sqrt(P[1], z);
-    /*
-    dump_coord("r", P[1]);
-    */
-
-    /* Is P[1] a square root of z? */
-    felem_square(tmp, P[1]); felem_diff_128_64(tmp, z); felem_reduce(r2, tmp);
-
-    if (felem_is_zero(r2)) {
-	/* P(x,r) is on the curve */
-	ontwist = 0;
-    } else {
-	/* (-x, r) is on the twist */
-	ontwist = 1;
-	felem_neg(P[0], P[0]);
-    }
-    /*
-    fprintf(stderr, "ontwist = %d\n", ontwist);
-    */
-    memset(P[2], 0, sizeof(coord));
-    P[2][0] = 1;
-
-    /* All set.  Now do the point multiplication. */
-    /*
-    dump_point("P", P);
-    for(i=0;i<21;++i) {
-	fprintf(stderr, "%02x", seckey[20-i]);
-    }
-    fprintf(stderr, "\n");
-    */
-    point_mul(Q, P, seckey);
-    affine_x(Qx, Q);
-    /*
-    dump_point("Q", Q);
-    */
-
-    /* Get the x-coordinate of the result, and negate it if we're on the
-     * twist. */
-    if (ontwist) {
-	felem_neg(Qx, Qx);
-    }
-
-    /* Convert back to bytes */
-    felem_to_bin21(out, Qx);
-    /*
-    fprintf(stderr, "out: ");
-    for(i=0;i<21;++i) {
-	fprintf(stderr, "%02x", out[i]);
-    }
-    fprintf(stderr, "\n");
-    */
-}

+ 0 - 1766
client/ptwist168_32.c

@@ -1,1766 +0,0 @@
-#include "ptwist.h"
-
-/* 32-bit version of ptwist168.c by Ian Goldberg. Based on: */
-
-/* crypto/ec/ecp_nistp224.c */
-/*
- * Written by Emilia Kasper (Google) for the OpenSSL project.
- */
-/* ====================================================================
- * Copyright (c) 2000-2010 The OpenSSL Project.  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. All advertising materials mentioning features or use of this
- *    software must display the following acknowledgment:
- *    "This product includes software developed by the OpenSSL Project
- *    for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
- *
- * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
- *    endorse or promote products derived from this software without
- *    prior written permission. For written permission, please contact
- *    licensing@OpenSSL.org.
- *
- * 5. Products derived from this software may not be called "OpenSSL"
- *    nor may "OpenSSL" appear in their names without prior written
- *    permission of the OpenSSL Project.
- *
- * 6. Redistributions of any form whatsoever must retain the following
- *    acknowledgment:
- *    "This product includes software developed by the OpenSSL Project
- *    for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
- *
- * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
- * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
- * OF THE POSSIBILITY OF SUCH DAMAGE.
- * ====================================================================
- *
- * This product includes cryptographic software written by Eric Young
- * (eay@cryptsoft.com).  This product includes software written by Tim
- * Hudson (tjh@cryptsoft.com).
- *
- */
-
-/*
- * A 64-bit implementation of the NIST P-224 elliptic curve point multiplication
- *
- * Inspired by Daniel J. Bernstein's public domain nistp224 implementation
- * and Adam Langley's public domain 64-bit C implementation of curve25519
- */
-#include <stdint.h>
-#include <string.h>
-
-typedef uint8_t u8;
-
-
-/******************************************************************************/
-/*		    INTERNAL REPRESENTATION OF FIELD ELEMENTS
- *
- * Field elements are represented as sum_{i=0}^{6} 2^{24*i}*a_i
- * where each slice a_i is a 32-bit word, i.e., a field element is an fslice
- * array a with 7 elements, where a[i] = a_i.
- * Outputs from multiplications are represented as unreduced polynomials
- * sum_{i=0}^{12} 2^{24*i}*b_i
- * where each b_i is a 64-bit word. We ensure that inputs to each field
- * multiplication satisfy a_i < 2^30, so outputs satisfy b_i < 4*2^30*2^30,
- * and fit into a 128-bit word without overflow. The coefficients are then
- * again partially reduced to a_i < 2^25. We only reduce to the unique
- * minimal representation at the end of the computation.
- *
- */
-
-typedef uint32_t fslice;
-
-typedef fslice coord[7];
-typedef coord point[3];
-
-
-#include <stdio.h>
-#include <stdlib.h>
-
-static void dump_coord(const char *label, const coord c)
-{
-    if (label) fprintf(stderr, "%s: ", label);
-    printf("%016lx %016lx %016lx %016lx %016lx %016lx %016lx\n",
-	c[6], c[5], c[4], c[3], c[2], c[1], c[0]);
-}
-
-static void dump_point(const char *label, point p)
-{
-    if (label) fprintf(stderr, "%s:\n", label);
-    dump_coord(" x", p[0]);
-    dump_coord(" y", p[1]);
-    dump_coord(" z", p[2]);
-}
-
-/* Field element represented as a byte arrary.
- * 21*8 = 168 bits is also the group order size for the elliptic curve.  */
-typedef u8 felem_bytearray[21];
-
-static const felem_bytearray ptwist168_curve_params[5] = {
-	{0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,    /* p */
-	 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,
-	 0xFF},
-	{0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,    /* a */
-	 0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0xFE,
-	 0xFC},
-	{0x4E,0x35,0x5E,0x95,0xCA,0xFE,0xDD,0x48,0x6E,0xBC,    /* b */
-	 0x69,0xBA,0xD3,0x16,0x46,0xD3,0x20,0xE0,0x1D,0xC7,
-	 0xD6},
-	{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,    /* x */
-	 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-	 0x02},
-	{0xEA,0x67,0x47,0xB7,0x5A,0xF8,0xC7,0xF9,0x3C,0x1F,    /* y */
-	 0x5E,0x6D,0x32,0x0F,0x88,0xB9,0xBE,0x15,0x66,0xD2,
-	 0xF2}
-};
-
-/* Helper functions to convert field elements to/from internal representation */
-static void bin21_to_felem(fslice out[7], const u8 in[21])
-	{
-	out[0] = *((const uint32_t *)(in)) & 0x00ffffff;
-	out[1] = (*((const uint32_t *)(in+3))) & 0x00ffffff;
-	out[2] = (*((const uint32_t *)(in+6))) & 0x00ffffff;
-	out[3] = (*((const uint32_t *)(in+9))) & 0x00ffffff;
-	out[4] = (*((const uint32_t *)(in+12))) & 0x00ffffff;
-	out[5] = (*((const uint32_t *)(in+15))) & 0x00ffffff;
-	out[6] = (*((const uint32_t *)(in+18))) & 0x00ffffff;
-	}
-
-static void felem_to_bin21(u8 out[21], const fslice in[7])
-	{
-	unsigned i;
-	for (i = 0; i < 3; ++i)
-		{
-		out[i]	  = in[0]>>(8*i);
-		out[i+3]  = in[1]>>(8*i);
-		out[i+6] = in[2]>>(8*i);
-		out[i+9] = in[3]>>(8*i);
-		out[i+12] = in[4]>>(8*i);
-		out[i+15] = in[5]>>(8*i);
-		out[i+18] = in[6]>>(8*i);
-		}
-	}
-
-#if 0
-/* To preserve endianness when using BN_bn2bin and BN_bin2bn */
-static void flip_endian(u8 *out, const u8 *in, unsigned len)
-	{
-	unsigned i;
-	for (i = 0; i < len; ++i)
-		out[i] = in[len-1-i];
-	}
-#endif
-
-/******************************************************************************/
-/*				FIELD OPERATIONS
- *
- * Field operations, using the internal representation of field elements.
- * NB! These operations are specific to our point multiplication and cannot be
- * expected to be correct in general - e.g., multiplication with a large scalar
- * will cause an overflow.
- *
- */
-
-/* Sum two field elements: out += in */
-static void felem_sum64(fslice out[7], const fslice in[7])
-	{
-	out[0] += in[0];
-	out[1] += in[1];
-	out[2] += in[2];
-	out[3] += in[3];
-	out[4] += in[4];
-	out[5] += in[5];
-	out[6] += in[6];
-	}
-
-/* Subtract field elements: out -= in */
-/* Assumes in[i] < 2^25 */
-static void felem_diff64(fslice out[7], const fslice in[7])
-	{
-	/* a = 3*2^24 - 3 */
-	/* b = 3*2^24 - 3*257 */
-	static const uint32_t a = (((uint32_t) 3) << 24) - ((uint32_t) 3);
-	static const uint32_t b = (((uint32_t) 3) << 24) - ((uint32_t) 771);
-
-	/* Add 0 mod 2^168-2^8-1 to ensure out > in at each element */
-	out[0] += b;
-	out[1] += a;
-	out[2] += a;
-	out[3] += a;
-	out[4] += a;
-	out[5] += a;
-	out[6] += a;
-
-	out[0] -= in[0];
-	out[1] -= in[1];
-	out[2] -= in[2];
-	out[3] -= in[3];
-	out[4] -= in[4];
-	out[5] -= in[5];
-	out[6] -= in[6];
-	}
-
-/* Subtract in unreduced 64-bit mode: out64 -= in64 */
-/* Assumes in[i] < 2^55 */
-static void felem_diff128(uint64_t out[13], const uint64_t in[13])
-	{
-	/* a = 3*2^54
-	   b = 3*2^54 - 49536
-	   c = 3*2^54 - 49344
-	   d = 3*2^54 - 12730752
-
-	   a*2^{288..168} + b*2^{144..48} + c*2^24 + d = 0 mod p
-	*/
-	static const uint64_t a = (((uint64_t)3) << 54);
-	static const uint64_t b = (((uint64_t)3) << 54) - ((uint64_t) 49536);
-	static const uint64_t c = (((uint64_t)3) << 54) - ((uint64_t) 49344);
-	static const uint64_t d = (((uint64_t)3) << 54) - ((uint64_t) 12730752);
-
-	/* Add 0 mod 2^168-2^8-1 to ensure out > in */
-	out[0] += d;
-	out[1] += c;
-	out[2] += b;
-	out[3] += b;
-	out[4] += b;
-	out[5] += b;
-	out[6] += b;
-	out[7] += a;
-	out[8] += a;
-	out[9] += a;
-	out[10] += a;
-	out[11] += a;
-	out[12] += a;
-
-	out[0] -= in[0];
-	out[1] -= in[1];
-	out[2] -= in[2];
-	out[3] -= in[3];
-	out[4] -= in[4];
-	out[5] -= in[5];
-	out[6] -= in[6];
-	out[7] -= in[7];
-	out[8] -= in[8];
-	out[9] -= in[9];
-	out[10] -= in[10];
-	out[11] -= in[11];
-	out[12] -= in[12];
-	}
-
-/* Subtract in mixed mode: out64 -= in32 */
-/* in[i] < 2^31 */
-static void felem_diff_128_64(uint64_t out[13], const fslice in[7])
-	{
-	/* a = 3*2^30 - 192
-	   b = 3*2^30 - 49344
-	   a*2^{144..24} + b = 0 mod p
-	*/
-	static const uint64_t a = (((uint64_t) 3) << 30) - ((uint64_t) 192);
-	static const uint64_t b = (((uint64_t) 3) << 30) - ((uint64_t) 49344);
-
-	/* Add 0 mod 2^168-2^8-1 to ensure out > in */
-	out[0] += b;
-	out[1] += a;
-	out[2] += a;
-	out[3] += a;
-	out[4] += a;
-	out[5] += a;
-	out[6] += a;
-
-	out[0] -= in[0];
-	out[1] -= in[1];
-	out[2] -= in[2];
-	out[3] -= in[3];
-	out[4] -= in[4];
-	out[5] -= in[5];
-	out[6] -= in[6];
-	}
-
-/* Multiply a field element by a scalar: out64 = out64 * scalar
- * The scalars we actually use are small, so results fit without overflow */
-static void felem_scalar64(fslice out[7], const fslice scalar)
-	{
-	out[0] *= scalar;
-	out[1] *= scalar;
-	out[2] *= scalar;
-	out[3] *= scalar;
-	out[4] *= scalar;
-	out[5] *= scalar;
-	out[6] *= scalar;
-	}
-
-/* Multiply an unreduced field element by a scalar: out128 = out128 * scalar
- * The scalars we actually use are small, so results fit without overflow */
-static void felem_scalar128(uint64_t out[13], const uint128_t scalar)
-	{
-	out[0] *= scalar;
-	out[1] *= scalar;
-	out[2] *= scalar;
-	out[3] *= scalar;
-	out[4] *= scalar;
-	out[5] *= scalar;
-	out[6] *= scalar;
-	out[7] *= scalar;
-	out[8] *= scalar;
-	out[9] *= scalar;
-	out[10] *= scalar;
-	out[11] *= scalar;
-	out[12] *= scalar;
-	}
-
-/* Square a field element: out = in^2 */
-static void felem_square(uint64_t out[13], const fslice in[7])
-	{
-	out[0] = ((uint64_t) in[0]) * in[0];
-	out[1] = ((uint64_t) in[0]) * in[1] * 2;
-	out[2] = ((uint64_t) in[0]) * in[2] * 2 +
-		 ((uint64_t) in[1]) * in[1];
-	out[3] = ((uint64_t) in[1]) * in[2] * 2 +
-		 ((uint64_t) in[3]) * in[0] * 2;
-	out[4] = ((uint64_t) in[2]) * in[2] +
-		 ((uint64_t) in[3]) * in[1] * 2 +
-		 ((uint64_t) in[4]) * in[0] * 2;
-	out[5] = ((uint64_t) in[3]) * in[2] * 2 +
-		 ((uint64_t) in[4]) * in[1] * 2 +
-		 ((uint64_t) in[5]) * in[0] * 2;
-	out[6] = ((uint64_t) in[3]) * in[3] +
-		 ((uint64_t) in[4]) * in[2] * 2 +
-		 ((uint64_t) in[5]) * in[1] * 2 +
-		 ((uint64_t) in[6]) * in[0] * 2;
-	out[7] = ((uint64_t) in[4]) * in[3] * 2 +
-		 ((uint64_t) in[5]) * in[2] * 2 +
-		 ((uint64_t) in[6]) * in[1] * 2;
-	out[8] = ((uint64_t) in[4]) * in[4] +
-		 ((uint64_t) in[5]) * in[3] * 2 +
-		 ((uint64_t) in[6]) * in[2] * 2;
-	out[9] = ((uint64_t) in[5]) * in[4] * 2 +
-		 ((uint64_t) in[6]) * in[3] * 2;
-	out[10] = ((uint64_t) in[5]) * in[5] +
-		 ((uint64_t) in[6]) * in[4] * 2;
-	out[11] = ((uint64_t) in[6]) * in[5] * 2;
-	out[12] = ((uint64_t) in[6]) * in[6];
-	}
-
-/* Multiply two field elements: out = in1 * in2 */
-static void felem_mul(uint64 out[13], const fslice in1[7], const fslice in2[7])
-	{
-	out[0] = ((uint64_t) in1[0]) * in2[0];
-	out[1] = ((uint64_t) in1[0]) * in2[1] +
-		 ((uint64_t) in1[1]) * in2[0];
-	out[2] = ((uint64_t) in1[0]) * in2[2] +
-		 ((uint64_t) in1[1]) * in2[1] +
-		 ((uint64_t) in1[2]) * in2[0];
-	out[3] = ((uint64_t) in1[0]) * in2[3] +
-		 ((uint64_t) in1[1]) * in2[2] +
-		 ((uint64_t) in1[2]) * in2[1] +
-		 ((uint64_t) in1[3]) * in2[0];
-	out[4] = ((uint64_t) in1[0]) * in2[4] +
-		 ((uint64_t) in1[1]) * in2[3] +
-		 ((uint64_t) in1[2]) * in2[2] +
-		 ((uint64_t) in1[3]) * in2[1] +
-		 ((uint64_t) in1[4]) * in2[0];
-	out[5] = ((uint64_t) in1[0]) * in2[5] +
-		 ((uint64_t) in1[1]) * in2[4] +
-		 ((uint64_t) in1[2]) * in2[3] +
-		 ((uint64_t) in1[3]) * in2[2] +
-		 ((uint64_t) in1[4]) * in2[1] +
-		 ((uint64_t) in1[5]) * in2[0];
-	out[6] = ((uint64_t) in1[0]) * in2[6] +
-		 ((uint64_t) in1[1]) * in2[5] +
-		 ((uint64_t) in1[2]) * in2[4] +
-		 ((uint64_t) in1[3]) * in2[3] +
-		 ((uint64_t) in1[4]) * in2[2] +
-		 ((uint64_t) in1[5]) * in2[1] +
-		 ((uint64_t) in1[6]) * in2[0];
-	out[7] = ((uint64_t) in1[1]) * in2[6] +
-		 ((uint64_t) in1[2]) * in2[5] +
-		 ((uint64_t) in1[3]) * in2[4] +
-		 ((uint64_t) in1[4]) * in2[3] +
-		 ((uint64_t) in1[5]) * in2[2] +
-		 ((uint64_t) in1[6]) * in2[1];
-	out[8] = ((uint64_t) in1[2]) * in2[6] +
-		 ((uint64_t) in1[3]) * in2[5] +
-		 ((uint64_t) in1[4]) * in2[4] +
-		 ((uint64_t) in1[5]) * in2[3] +
-		 ((uint64_t) in1[6]) * in2[2];
-	out[9] = ((uint64_t) in1[3]) * in2[6] +
-		 ((uint64_t) in1[4]) * in2[5] +
-		 ((uint64_t) in1[5]) * in2[4] +
-		 ((uint64_t) in1[6]) * in2[3];
-	out[10] = ((uint64_t) in1[4]) * in2[6] +
-		 ((uint64_t) in1[5]) * in2[5] +
-		 ((uint64_t) in1[6]) * in2[4];
-	out[11] = ((uint64_t) in1[5]) * in2[6] +
-		 ((uint64_t) in1[6]) * in2[5];
-	out[12] = ((uint64_t) in1[6]) * in2[6];
-	}
-
-#define M257(x) (((x)<<8)+(x))
-
-/* XXX: here */
-
-/* Reduce 128-bit coefficients to 64-bit coefficients. Requires in[i] < 2^126,
- * ensures out[0] < 2^56, out[1] < 2^56, out[2] < 2^57 */
-static void felem_reduce(fslice out[7], const uint64_t in[13])
-	{
-	static const uint64_t two24m1 = (((uint64_t) 1)<<24) -
-		((uint64_t)1);
-	uint64_t output[7];
-
-	output[0] = in[0];  /* < 2^126 */
-	output[1] = in[1];  /* < 2^126 */
-	output[2] = in[2];  /* < 2^126 */
-
-	/* Eliminate in[3], in[4] */
-	output[2] += M257(in[4] >> 56);       /* < 2^126 + 2^79 */
-	output[1] += M257(in[4] & two56m1);   /* < 2^126 + 2^65 */
-
-	output[1] += M257(in[3] >> 56);       /* < 2^126 + 2^65 + 2^79 */
-	output[0] += M257(in[3] & two56m1);   /* < 2^126 + 2^65 */
-
-	/* Eliminate the top part of output[2] */
-	output[0] += M257(output[2] >> 56);   /* < 2^126 + 2^65 + 2^79 */
-	output[2] &= two56m1;                 /* < 2^56 */
-
-	/* Carry 0 -> 1 -> 2 */
-	output[1] += output[0] >> 56;         /* < 2^126 + 2^71 */
-	output[0] &= two56m1;                 /* < 2^56 */
-
-	output[2] += output[1] >> 56;         /* < 2^71 */
-	output[1] &= two56m1;                 /* < 2^56 */
-
-	/* Eliminate the top part of output[2] */
-	output[0] += M257(output[2] >> 56);   /* < 2^57 */
-	output[2] &= two56m1;                 /* < 2^56 */
-
-	/* Carry 0 -> 1 -> 2 */
-	output[1] += output[0] >> 56;         /* <= 2^56 */
-	out[0] = output[0] & two56m1;         /* < 2^56 */
-
-	out[2] = output[2] + (output[1] >> 56);  /* <= 2^56 */
-	out[1] = output[1] & two56m1;         /* < 2^56 */
-
-	}
-
-/* Reduce to unique minimal representation */
-static void felem_contract(fslice out[3], const fslice in[3])
-	{
-	static const uint64_t two56m1 = (((uint64_t) 1)<<56) -
-		((uint64_t)1);
-	static const uint64_t two56m257 = (((uint64_t) 1)<<56) -
-		((uint64_t)257);
-	uint64_t a;
-
-	/* in[0] < 2^56, in[1] < 2^56, in[2] <= 2^56 */
-	/* so in < 2*p for sure */
-
-	/* Eliminate the top part of in[2] */
-	out[0] = in[0] + M257(in[2] >> 56);   /* < 2^57 */
-	out[2] = in[2] & two56m1;             /* < 2^56, but if out[0] >= 2^56
-	                                         then out[2] now = 0 */
-
-	/* Carry 0 -> 1 -> 2 */
-	out[1] = in[1] + (out[0] >> 56);      /* < 2^56 + 2, but if
-	                                         out[1] >= 2^56 then
-						 out[2] = 0 */
-	out[0] &= two56m1;                    /* < 2^56 */
-
-	out[2] += out[1] >> 56;               /* < 2^56 due to the above */
-	out[1] &= two56m1;                    /* < 2^56 */
-
-	/* Now out < 2^168, but it could still be > p */
-	a = ((out[2] == two56m1) & (out[1] == two56m1) & (out[0] >= two56m257));
-	out[2] -= two56m1*a;
-	out[1] -= two56m1*a;
-	out[0] -= two56m257*a;
-	}
-
-/* Negate a field element: out = -in */
-/* Assumes in[i] < 2^57 */
-static void felem_neg(fslice out[3], const fslice in[3])
-	{
-	/* a = 3*2^56 - 3 */
-	/* b = 3*2^56 - 3*257 */
-	static const uint64_t a = (((uint64_t) 3) << 56) - ((uint64_t) 3);
-	static const uint64_t b = (((uint64_t) 3) << 56) - ((uint64_t) 771);
-	static const uint64_t two56m1 = (((uint64_t) 1) << 56) - ((uint64_t) 1);
-	fslice tmp[3];
-
-	/* Add 0 mod 2^168-2^8-1 to ensure out > in at each element */
-	/* a*2^112 + a*2^56 + b = 3*p */
-	tmp[0] = b - in[0];
-	tmp[1] = a - in[1];
-	tmp[2] = a - in[2];
-
-	/* Carry 0 -> 1 -> 2 */
-	tmp[1] += tmp[0] >> 56;
-	tmp[0] &= two56m1;                 /* < 2^56 */
-
-	tmp[2] += tmp[1] >> 56;         /* < 2^71 */
-	tmp[1] &= two56m1;                 /* < 2^56 */
-
-	felem_contract(out, tmp);
-
-	}
-
-/* Zero-check: returns 1 if input is 0, and 0 otherwise.
- * We know that field elements are reduced to in < 2^169,
- * so we only need to check three cases: 0, 2^168 - 2^8 - 1,
- * and 2^169 - 2^9 - 2 */
-static fslice felem_is_zero(const fslice in[3])
-	{
-	fslice zero, two168m8m1, two169m9m2;
-	static const uint64_t two56m1 = (((uint64_t) 1)<<56) -
-		((uint64_t)1);
-	static const uint64_t two56m257 = (((uint64_t) 1)<<56) -
-		((uint64_t)257);
-	static const uint64_t two57m1 = (((uint64_t) 1)<<57) -
-		((uint64_t)1);
-	static const uint64_t two56m514 = (((uint64_t) 1)<<56) -
-		((uint64_t)514);
-
-	zero = (in[0] == 0) & (in[1] == 0) & (in[2] == 0);
-	two168m8m1 = (in[2] == two56m1) & (in[1] == two56m1) &
-			(in[0] == two56m257);
-	two169m9m2 = (in[2] == two57m1) & (in[1] == two56m1) &
-			(in[0] == two56m514);
-
-	return (zero | two168m8m1 | two169m9m2);
-	}
-
-/* Invert a field element */
-static void felem_inv(fslice out[3], const fslice in[3])
-	{
-	fslice ftmp[3], ftmp2[3], ftmp3[3], ftmp4[3];
-	uint128_t tmp[5];
-	unsigned i;
-
-	felem_square(tmp, in); felem_reduce(ftmp, tmp);		/* 2 */
-	felem_mul(tmp, in, ftmp); felem_reduce(ftmp, tmp);	/* 2^2 - 1 */
-								/* = ftmp */
-
-	felem_square(tmp, ftmp); felem_reduce(ftmp2, tmp);	/* 2^3 - 2 */
-	felem_square(tmp, ftmp2); felem_reduce(ftmp2, tmp);	/* 2^4 - 2^2 */
-	felem_mul(tmp, ftmp2, ftmp); felem_reduce(ftmp2, tmp);	/* 2^4 - 1 */
-	felem_square(tmp, ftmp2); felem_reduce(ftmp2, tmp);	/* 2^5 - 2 */
-	felem_square(tmp, ftmp2); felem_reduce(ftmp2, tmp);	/* 2^6 - 2^2 */
-	felem_mul(tmp, ftmp2, ftmp); felem_reduce(ftmp, tmp);	/* 2^6 - 1 */
-								/* = ftmp */
-
-	felem_square(tmp, ftmp); felem_reduce(ftmp2, tmp);	/* 2^7 - 2 */
-	for (i = 0; i < 5; ++i)					/* 2^12 - 2^6 */
-		{
-		felem_square(tmp, ftmp2); felem_reduce(ftmp2, tmp);
-		}
-	felem_mul(tmp, ftmp, ftmp2); felem_reduce(ftmp3, tmp);	/* 2^12 - 1 */
-								/* = ftmp3 */
-
-	felem_square(tmp, ftmp3); felem_reduce(ftmp2, tmp);	/* 2^13 - 2 */
-	for (i = 0; i < 11; ++i)				/* 2^24 - 2^12 */
-		{
-		felem_square(tmp, ftmp2); felem_reduce(ftmp2, tmp);
-		}
-	felem_mul(tmp, ftmp2, ftmp3); felem_reduce(ftmp3, tmp);	/* 2^24 - 1 */
-								/* = ftmp3 */
-	felem_square(tmp, ftmp3); felem_reduce(ftmp2, tmp);	/* 2^25 - 2 */
-	for (i = 0; i < 23; ++i)				/* 2^48 - 2^24 */
-		{
-		felem_square(tmp, ftmp2); felem_reduce(ftmp2, tmp);
-		}
-	felem_mul(tmp, ftmp2, ftmp3); felem_reduce(ftmp4, tmp);	/* 2^48 - 1 */
-								/* = ftmp4 */
-	felem_square(tmp, ftmp4); felem_reduce(ftmp2, tmp);	/* 2^49 - 2 */
-	for (i = 0; i < 23; ++i)				/* 2^72 - 2^24 */
-		{
-		felem_square(tmp, ftmp2); felem_reduce(ftmp2, tmp);
-		}
-	felem_mul(tmp, ftmp2, ftmp3); felem_reduce(ftmp4, tmp);	/* 2^72 - 1 */
-								/* = ftmp4 */
-
-	felem_square(tmp, ftmp4); felem_reduce(ftmp2, tmp);	/* 2^73 - 2 */
-	for (i = 0; i < 5; ++i)					/* 2^78 - 2^6 */
-		{
-		felem_square(tmp, ftmp2); felem_reduce(ftmp2, tmp);
-		}
-	felem_mul(tmp, ftmp, ftmp2); felem_reduce(ftmp2, tmp);	/* 2^78 - 1 */
-	felem_square(tmp, ftmp2); felem_reduce(ftmp2, tmp);	/* 2^79 - 2 */
-	felem_mul(tmp, in, ftmp2); felem_reduce(ftmp4, tmp);	/* 2^79 - 1 */
-								/* = ftmp4 */
-	felem_square(tmp, ftmp4); felem_reduce(ftmp2, tmp);	/* 2^80 - 2 */
-	for (i = 0; i < 78; ++i)				/* 2^158 - 2^79 */
-		{
-		felem_square(tmp, ftmp2); felem_reduce(ftmp2, tmp);
-		}
-	felem_mul(tmp, ftmp4, ftmp2); felem_reduce(ftmp2, tmp); /* 2^158 - 1 */
-	felem_square(tmp, ftmp2); felem_reduce(ftmp2, tmp);	/* 2^159 - 2 */
-	felem_mul(tmp, in, ftmp2); felem_reduce(ftmp2, tmp);	/* 2^159 - 1 */
-	for (i = 0; i < 7; ++i)					/* 2^166 - 2^7 */
-		{
-		felem_square(tmp, ftmp2); felem_reduce(ftmp2, tmp);
-		}
-	felem_mul(tmp, ftmp, ftmp2); felem_reduce(ftmp2, tmp);	/* 2^166 - 2^6 - 1 */
-	felem_square(tmp, ftmp2); felem_reduce(ftmp2, tmp);	/* 2^167 - 2^7 - 2 */
-	felem_square(tmp, ftmp2); felem_reduce(ftmp2, tmp);	/* 2^168 - 2^8 - 4 */
-	felem_mul(tmp, in, ftmp2); felem_reduce(out, tmp);	/* 2^168 - 2^8 - 3 */
-								/* = out */
-	}
-
-/* Take the square root of a field element */
-static void felem_sqrt(fslice out[3], const fslice in[3])
-	{
-	fslice ftmp[3], ftmp2[3];
-	uint128_t tmp[5];
-	unsigned i;
-
-	felem_square(tmp, in); felem_reduce(ftmp, tmp);		/* 2 */
-	felem_mul(tmp, in, ftmp); felem_reduce(ftmp, tmp);	/* 2^2 - 1 */
-								/* = ftmp */
-
-	felem_square(tmp, ftmp); felem_reduce(ftmp2, tmp);	/* 2^3 - 2 */
-	felem_square(tmp, ftmp2); felem_reduce(ftmp2, tmp);	/* 2^4 - 2^2 */
-	felem_mul(tmp, ftmp2, ftmp); felem_reduce(ftmp2, tmp);	/* 2^4 - 1 */
-	felem_square(tmp, ftmp2); felem_reduce(ftmp2, tmp);	/* 2^5 - 2 */
-	felem_mul(tmp, ftmp2, in); felem_reduce(ftmp, tmp);	/* 2^5 - 1 */
-								/* = ftmp */
-
-	felem_square(tmp, ftmp); felem_reduce(ftmp2, tmp);	/* 2^6 - 2 */
-	for (i = 0; i < 4; ++i)					/* 2^10 - 2^5 */
-		{
-		felem_square(tmp, ftmp2); felem_reduce(ftmp2, tmp);
-		}
-	felem_mul(tmp, ftmp, ftmp2); felem_reduce(ftmp, tmp);	/* 2^10 - 1 */
-								/* = ftmp */
-
-	felem_square(tmp, ftmp); felem_reduce(ftmp2, tmp);	/* 2^11 - 2 */
-	for (i = 0; i < 9; ++i)					/* 2^20 - 2^10 */
-		{
-		felem_square(tmp, ftmp2); felem_reduce(ftmp2, tmp);
-		}
-	felem_mul(tmp, ftmp2, ftmp); felem_reduce(ftmp, tmp);	/* 2^20 - 1 */
-								/* = ftmp */
-	felem_square(tmp, ftmp); felem_reduce(ftmp2, tmp);	/* 2^21 - 2 */
-	for (i = 0; i < 19; ++i)				/* 2^40 - 2^20 */
-		{
-		felem_square(tmp, ftmp2); felem_reduce(ftmp2, tmp);
-		}
-	felem_mul(tmp, ftmp2, ftmp); felem_reduce(ftmp, tmp);	/* 2^40 - 1 */
-								/* = ftmp */
-	felem_square(tmp, ftmp); felem_reduce(ftmp2, tmp);	/* 2^41 - 2 */
-	for (i = 0; i < 39; ++i)				/* 2^80 - 2^40 */
-		{
-		felem_square(tmp, ftmp2); felem_reduce(ftmp2, tmp);
-		}
-	felem_mul(tmp, ftmp2, ftmp); felem_reduce(ftmp, tmp);	/* 2^80 - 1 */
-								/* = ftmp */
-
-	felem_square(tmp, ftmp); felem_reduce(ftmp2, tmp);	/* 2^81 - 2 */
-	for (i = 0; i < 79; ++i)				/* 2^160 - 2^80 */
-		{
-		felem_square(tmp, ftmp2); felem_reduce(ftmp2, tmp);
-		}
-	felem_mul(tmp, ftmp, ftmp2); felem_reduce(ftmp2, tmp);	/* 2^160 - 1 */
-	for (i = 0; i < 5; ++i)					/* 2^165 - 2^5 */
-		{
-		felem_square(tmp, ftmp2); felem_reduce(ftmp2, tmp);
-		}
-	felem_square(tmp, ftmp2); felem_reduce(out, tmp);	/* 2^166 - 2^6 */
-								/* = out */
-	}
-
-/* Copy in constant time:
- * if icopy == 1, copy in to out,
- * if icopy == 0, copy out to itself. */
-static void
-copy_conditional(fslice *out, const fslice *in, unsigned len, fslice icopy)
-	{
-	unsigned i;
-	/* icopy is a (64-bit) 0 or 1, so copy is either all-zero or all-one */
-	const fslice copy = -icopy;
-	for (i = 0; i < len; ++i)
-		{
-		const fslice tmp = copy & (in[i] ^ out[i]);
-		out[i] ^= tmp;
-		}
-	}
-
-/* Copy in constant time:
- * if isel == 1, copy in2 to out,
- * if isel == 0, copy in1 to out. */
-static void select_conditional(fslice *out, const fslice *in1, const fslice *in2,
-	unsigned len, fslice isel)
-	{
-	unsigned i;
-	/* isel is a (64-bit) 0 or 1, so sel is either all-zero or all-one */
-	const fslice sel = -isel;
-	for (i = 0; i < len; ++i)
-		{
-		const fslice tmp = sel & (in1[i] ^ in2[i]);
-		out[i] = in1[i] ^ tmp;
-		}
-}
-
-/******************************************************************************/
-/*			 ELLIPTIC CURVE POINT OPERATIONS
- *
- * Points are represented in Jacobian projective coordinates:
- * (X, Y, Z) corresponds to the affine point (X/Z^2, Y/Z^3),
- * or to the point at infinity if Z == 0.
- *
- */
-
-/* Double an elliptic curve point:
- * (X', Y', Z') = 2 * (X, Y, Z), where
- * X' = (3 * (X - Z^2) * (X + Z^2))^2 - 8 * X * Y^2
- * Y' = 3 * (X - Z^2) * (X + Z^2) * (4 * X * Y^2 - X') - 8 * Y^2
- * Z' = (Y + Z)^2 - Y^2 - Z^2 = 2 * Y * Z
- * Outputs can equal corresponding inputs, i.e., x_out == x_in is allowed,
- * while x_out == y_in is not (maybe this works, but it's not tested). */
-static void
-point_double(fslice x_out[3], fslice y_out[3], fslice z_out[3],
-	     const fslice x_in[3], const fslice y_in[3], const fslice z_in[3])
-	{
-	uint128_t tmp[5], tmp2[5];
-	fslice delta[3];
-	fslice gamma[3];
-	fslice beta[3];
-	fslice alpha[3];
-	fslice ftmp[3], ftmp2[3];
-	memcpy(ftmp, x_in, 3 * sizeof(fslice));
-	memcpy(ftmp2, x_in, 3 * sizeof(fslice));
-
-	/* delta = z^2 */
-	felem_square(tmp, z_in);
-	felem_reduce(delta, tmp);
-
-	/* gamma = y^2 */
-	felem_square(tmp, y_in);
-	felem_reduce(gamma, tmp);
-
-	/* beta = x*gamma */
-	felem_mul(tmp, x_in, gamma);
-	felem_reduce(beta, tmp);
-
-	/* alpha = 3*(x-delta)*(x+delta) */
-	felem_diff64(ftmp, delta);
-	/* ftmp[i] < 2^57 + 2^58 + 2 < 2^59 */
-	felem_sum64(ftmp2, delta);
-	/* ftmp2[i] < 2^57 + 2^57 = 2^58 */
-	felem_scalar64(ftmp2, 3);
-	/* ftmp2[i] < 3 * 2^58 < 2^60 */
-	felem_mul(tmp, ftmp, ftmp2);
-	/* tmp[i] < 2^60 * 2^59 * 4 = 2^121 */
-	felem_reduce(alpha, tmp);
-
-	/* x' = alpha^2 - 8*beta */
-	felem_square(tmp, alpha);
-	/* tmp[i] < 4 * 2^57 * 2^57 = 2^116 */
-	memcpy(ftmp, beta, 3 * sizeof(fslice));
-	felem_scalar64(ftmp, 8);
-	/* ftmp[i] < 8 * 2^57 = 2^60 */
-	felem_diff_128_64(tmp, ftmp);
-	/* tmp[i] < 2^116 + 2^64 + 8 < 2^117 */
-	felem_reduce(x_out, tmp);
-
-	/* z' = (y + z)^2 - gamma - delta */
-	felem_sum64(delta, gamma);
-	/* delta[i] < 2^57 + 2^57 = 2^58 */
-	memcpy(ftmp, y_in, 3 * sizeof(fslice));
-	felem_sum64(ftmp, z_in);
-	/* ftmp[i] < 2^57 + 2^57 = 2^58 */
-	felem_square(tmp, ftmp);
-	/* tmp[i] < 4 * 2^58 * 2^58 = 2^118 */
-	felem_diff_128_64(tmp, delta);
-	/* tmp[i] < 2^118 + 2^64 + 8 < 2^119 */
-	felem_reduce(z_out, tmp);
-
-	/* y' = alpha*(4*beta - x') - 8*gamma^2 */
-	felem_scalar64(beta, 4);
-	/* beta[i] < 4 * 2^57 = 2^59 */
-	felem_diff64(beta, x_out);
-	/* beta[i] < 2^59 + 2^58 + 2 < 2^60 */
-	felem_mul(tmp, alpha, beta);
-	/* tmp[i] < 4 * 2^57 * 2^60 = 2^119 */
-	felem_square(tmp2, gamma);
-	/* tmp2[i] < 4 * 2^57 * 2^57 = 2^116 */
-	felem_scalar128(tmp2, 8);
-	/* tmp2[i] < 8 * 2^116 = 2^119 */
-	felem_diff128(tmp, tmp2);
-	/* tmp[i] < 2^119 + 2^120 < 2^121 */
-	felem_reduce(y_out, tmp);
-	}
-
-/* Add two elliptic curve points:
- * (X_1, Y_1, Z_1) + (X_2, Y_2, Z_2) = (X_3, Y_3, Z_3), where
- * X_3 = (Z_1^3 * Y_2 - Z_2^3 * Y_1)^2 - (Z_1^2 * X_2 - Z_2^2 * X_1)^3 -
- * 2 * Z_2^2 * X_1 * (Z_1^2 * X_2 - Z_2^2 * X_1)^2
- * Y_3 = (Z_1^3 * Y_2 - Z_2^3 * Y_1) * (Z_2^2 * X_1 * (Z_1^2 * X_2 - Z_2^2 * X_1)^2 - X_3) -
- *        Z_2^3 * Y_1 * (Z_1^2 * X_2 - Z_2^2 * X_1)^3
- * Z_3 = (Z_1^2 * X_2 - Z_2^2 * X_1) * (Z_1 * Z_2) */
-
-/* This function is not entirely constant-time:
- * it includes a branch for checking whether the two input points are equal,
- * (while not equal to the point at infinity).
- * This case never happens during single point multiplication,
- * so there is no timing leak for ECDH or ECDSA signing. */
-static void point_add(fslice x3[3], fslice y3[3], fslice z3[3],
-	const fslice x1[3], const fslice y1[3], const fslice z1[3],
-	const fslice x2[3], const fslice y2[3], const fslice z2[3])
-	{
-	fslice ftmp[3], ftmp2[3], ftmp3[3], ftmp4[3], ftmp5[3];
-	fslice xout[3], yout[3], zout[3];
-	uint128_t tmp[5], tmp2[5];
-	fslice z1_is_zero, z2_is_zero, x_equal, y_equal;
-
-	/* ftmp = z1^2 */
-	felem_square(tmp, z1);
-	felem_reduce(ftmp, tmp);
-
-	/* ftmp2 = z2^2 */
-	felem_square(tmp, z2);
-	felem_reduce(ftmp2, tmp);
-
-	/* ftmp3 = z1^3 */
-	felem_mul(tmp, ftmp, z1);
-	felem_reduce(ftmp3, tmp);
-
-	/* ftmp4 = z2^3 */
-	felem_mul(tmp, ftmp2, z2);
-	felem_reduce(ftmp4, tmp);
-
-	/* ftmp3 = z1^3*y2 */
-	felem_mul(tmp, ftmp3, y2);
-	/* tmp[i] < 4 * 2^57 * 2^57 = 2^116 */
-
-	/* ftmp4 = z2^3*y1 */
-	felem_mul(tmp2, ftmp4, y1);
-	felem_reduce(ftmp4, tmp2);
-
-	/* ftmp3 = z1^3*y2 - z2^3*y1 */
-	felem_diff_128_64(tmp, ftmp4);
-	/* tmp[i] < 2^116 + 2^64 + 8 < 2^117 */
-	felem_reduce(ftmp3, tmp);
-
-	/* ftmp = z1^2*x2 */
-	felem_mul(tmp, ftmp, x2);
-	/* tmp[i] < 4 * 2^57 * 2^57 = 2^116 */
-
-	/* ftmp2 =z2^2*x1 */
-	felem_mul(tmp2, ftmp2, x1);
-	felem_reduce(ftmp2, tmp2);
-
-	/* ftmp = z1^2*x2 - z2^2*x1 */
-	felem_diff128(tmp, tmp2);
-	/* tmp[i] < 2^116 + 2^64 + 8 < 2^117 */
-	felem_reduce(ftmp, tmp);
-
-	/* the formulae are incorrect if the points are equal
-	 * so we check for this and do doubling if this happens */
-	x_equal = felem_is_zero(ftmp);
-	y_equal = felem_is_zero(ftmp3);
-	z1_is_zero = felem_is_zero(z1);
-	z2_is_zero = felem_is_zero(z2);
-	/* In affine coordinates, (X_1, Y_1) == (X_2, Y_2) */
-	if (x_equal && y_equal && !z1_is_zero && !z2_is_zero)
-		{
-		point_double(x3, y3, z3, x1, y1, z1);
-		return;
-		}
-
-	/* ftmp5 = z1*z2 */
-	felem_mul(tmp, z1, z2);
-	felem_reduce(ftmp5, tmp);
-
-	/* zout = (z1^2*x2 - z2^2*x1)*(z1*z2) */
-	felem_mul(tmp, ftmp, ftmp5);
-	felem_reduce(zout, tmp);
-
-	/* ftmp = (z1^2*x2 - z2^2*x1)^2 */
-	memcpy(ftmp5, ftmp, 3 * sizeof(fslice));
-	felem_square(tmp, ftmp);
-	felem_reduce(ftmp, tmp);
-
-	/* ftmp5 = (z1^2*x2 - z2^2*x1)^3 */
-	felem_mul(tmp, ftmp, ftmp5);
-	felem_reduce(ftmp5, tmp);
-
-	/* ftmp2 = z2^2*x1*(z1^2*x2 - z2^2*x1)^2 */
-	felem_mul(tmp, ftmp2, ftmp);
-	felem_reduce(ftmp2, tmp);
-
-	/* ftmp4 = z2^3*y1*(z1^2*x2 - z2^2*x1)^3 */
-	felem_mul(tmp, ftmp4, ftmp5);
-	/* tmp[i] < 4 * 2^57 * 2^57 = 2^116 */
-
-	/* tmp2 = (z1^3*y2 - z2^3*y1)^2 */
-	felem_square(tmp2, ftmp3);
-	/* tmp2[i] < 4 * 2^57 * 2^57 < 2^116 */
-
-	/* tmp2 = (z1^3*y2 - z2^3*y1)^2 - (z1^2*x2 - z2^2*x1)^3 */
-	felem_diff_128_64(tmp2, ftmp5);
-	/* tmp2[i] < 2^116 + 2^64 + 8 < 2^117 */
-
-	/* ftmp5 = 2*z2^2*x1*(z1^2*x2 - z2^2*x1)^2 */
-	memcpy(ftmp5, ftmp2, 3 * sizeof(fslice));
-	felem_scalar64(ftmp5, 2);
-	/* ftmp5[i] < 2 * 2^57 = 2^58 */
-
-	/* xout = (z1^3*y2 - z2^3*y1)^2 - (z1^2*x2 - z2^2*x1)^3 -
-	   2*z2^2*x1*(z1^2*x2 - z2^2*x1)^2 */
-	felem_diff_128_64(tmp2, ftmp5);
-	/* tmp2[i] < 2^117 + 2^64 + 8 < 2^118 */
-	felem_reduce(xout, tmp2);
-
-	/* ftmp2 = z2^2*x1*(z1^2*x2 - z2^2*x1)^2 - xout */
-	felem_diff64(ftmp2, xout);
-	/* ftmp2[i] < 2^57 + 2^58 + 2 < 2^59 */
-
-	/* tmp2 = (z1^3*y2 - z2^3*y1)*(z2^2*x1*(z1^2*x2 - z2^2*x1)^2 - xout) */
-	felem_mul(tmp2, ftmp3, ftmp2);
-	/* tmp2[i] < 4 * 2^57 * 2^59 = 2^118 */
-
-	/* yout = (z1^3*y2 - z2^3*y1)*(z2^2*x1*(z1^2*x2 - z2^2*x1)^2 - xout) -
-	   z2^3*y1*(z1^2*x2 - z2^2*x1)^3 */
-	felem_diff128(tmp2, tmp);
-	/* tmp2[i] < 2^118 + 2^120 < 2^121 */
-	felem_reduce(yout, tmp2);
-
-	/* the result (xout, yout, zout) is incorrect if one of the
-	 * inputs is the point at infinity, so we need to check for this
-	 * separately */
-
-	/* if point 1 is at infinity, copy point 2 to output, and vice versa */
-	copy_conditional(xout, x2, 3, z1_is_zero);
-	select_conditional(x3, xout, x1, 3, z2_is_zero);
-	copy_conditional(yout, y2, 3, z1_is_zero);
-	select_conditional(y3, yout, y1, 3, z2_is_zero);
-	copy_conditional(zout, z2, 3, z1_is_zero);
-	select_conditional(z3, zout, z1, 3, z2_is_zero);
-	}
-
-static void affine(point P)
-{
-    coord z1, z2, xin, yin;
-    uint128_t tmp[7];
-
-    if (felem_is_zero(P[2])) return;
-    felem_inv(z2, P[2]);
-    felem_square(tmp, z2); felem_reduce(z1, tmp);
-    felem_mul(tmp, P[0], z1); felem_reduce(xin, tmp);
-    felem_contract(P[0], xin);
-    felem_mul(tmp, z1, z2); felem_reduce(z1, tmp);
-    felem_mul(tmp, P[1], z1); felem_reduce(yin, tmp);
-    felem_contract(P[1], yin);
-    memset(P[2], 0, sizeof(coord));
-    P[2][0] = 1;
-}
-
-static void affine_x(coord out, point P)
-{
-    coord z1, z2, xin;
-    uint128_t tmp[7];
-
-    if (felem_is_zero(P[2])) return;
-    felem_inv(z2, P[2]);
-    felem_square(tmp, z2); felem_reduce(z1, tmp);
-    felem_mul(tmp, P[0], z1); felem_reduce(xin, tmp);
-    felem_contract(out, xin);
-}
-
-/* Multiply the given point by s */
-static void point_mul(point out, point in, const felem_bytearray s)
-{
-    int i;
-    point tmp;
-
-    point table[16];
-    memset(table[0], 0, sizeof(point));
-    memmove(table[1], in, sizeof(point));
-    for(i=2; i<16; i+=2) {
-	point_double(table[i][0], table[i][1], table[i][2],
-		     table[i/2][0], table[i/2][1], table[i/2][2]);
-	point_add(table[i+1][0], table[i+1][1], table[i+1][2],
-		  table[i][0], table[i][1], table[i][2],
-		  in[0], in[1], in[2]);
-    }
-    /*
-    for(i=0;i<16;++i) {
-	fprintf(stderr, "table[%d]:\n", i);
-	affine(table[i]);
-	dump_point(NULL, table[i]);
-    }
-    */
-
-    memset(tmp, 0, sizeof(point));
-    for(i=0;i<21;i++) {
-	u8 oh = s[20-i] >> 4;
-	u8 ol = s[20-i] & 0x0f;
-	point_double(tmp[0], tmp[1], tmp[2], tmp[0], tmp[1], tmp[2]);
-	point_double(tmp[0], tmp[1], tmp[2], tmp[0], tmp[1], tmp[2]);
-	point_double(tmp[0], tmp[1], tmp[2], tmp[0], tmp[1], tmp[2]);
-	point_double(tmp[0], tmp[1], tmp[2], tmp[0], tmp[1], tmp[2]);
-	point_add(tmp[0], tmp[1], tmp[2], tmp[0], tmp[1], tmp[2],
-		  table[oh][0], table[oh][1], table[oh][2]);
-	point_double(tmp[0], tmp[1], tmp[2], tmp[0], tmp[1], tmp[2]);
-	point_double(tmp[0], tmp[1], tmp[2], tmp[0], tmp[1], tmp[2]);
-	point_double(tmp[0], tmp[1], tmp[2], tmp[0], tmp[1], tmp[2]);
-	point_double(tmp[0], tmp[1], tmp[2], tmp[0], tmp[1], tmp[2]);
-	point_add(tmp[0], tmp[1], tmp[2], tmp[0], tmp[1], tmp[2],
-		  table[ol][0], table[ol][1], table[ol][2]);
-    }
-    memmove(out, tmp, sizeof(point));
-}
-
-#if 0
-/* Select a point from an array of 16 precomputed point multiples,
- * in constant time: for bits = {b_0, b_1, b_2, b_3}, return the point
- * pre_comp[8*b_3 + 4*b_2 + 2*b_1 + b_0] */
-static void select_point(const fslice bits[4], const fslice pre_comp[16][3][4],
-	fslice out[12])
-	{
-	fslice tmp[5][12];
-	select_conditional(tmp[0], pre_comp[7][0], pre_comp[15][0], 12, bits[3]);
-	select_conditional(tmp[1], pre_comp[3][0], pre_comp[11][0], 12, bits[3]);
-	select_conditional(tmp[2], tmp[1], tmp[0], 12, bits[2]);
-	select_conditional(tmp[0], pre_comp[5][0], pre_comp[13][0], 12, bits[3]);
-	select_conditional(tmp[1], pre_comp[1][0], pre_comp[9][0], 12, bits[3]);
-	select_conditional(tmp[3], tmp[1], tmp[0], 12, bits[2]);
-	select_conditional(tmp[4], tmp[3], tmp[2], 12, bits[1]);
-	select_conditional(tmp[0], pre_comp[6][0], pre_comp[14][0], 12, bits[3]);
-	select_conditional(tmp[1], pre_comp[2][0], pre_comp[10][0], 12, bits[3]);
-	select_conditional(tmp[2], tmp[1], tmp[0], 12, bits[2]);
-	select_conditional(tmp[0], pre_comp[4][0], pre_comp[12][0], 12, bits[3]);
-	select_conditional(tmp[1], pre_comp[0][0], pre_comp[8][0], 12, bits[3]);
-	select_conditional(tmp[3], tmp[1], tmp[0], 12, bits[2]);
-	select_conditional(tmp[1], tmp[3], tmp[2], 12, bits[1]);
-	select_conditional(out, tmp[1], tmp[4], 12, bits[0]);
-	}
-
-/* Interleaved point multiplication using precomputed point multiples:
- * The small point multiples 0*P, 1*P, ..., 15*P are in pre_comp[],
- * the scalars in scalars[]. If g_scalar is non-NULL, we also add this multiple
- * of the generator, using certain (large) precomputed multiples in g_pre_comp.
- * Output point (X, Y, Z) is stored in x_out, y_out, z_out */
-static void batch_mul(fslice x_out[4], fslice y_out[4], fslice z_out[4],
-	const felem_bytearray scalars[], const unsigned num_points, const u8 *g_scalar,
-	const fslice pre_comp[][16][3][4], const fslice g_pre_comp[16][3][4])
-	{
-	unsigned i, j, num;
-	unsigned gen_mul = (g_scalar != NULL);
-	fslice nq[12], nqt[12], tmp[12];
-	fslice bits[4];
-	u8 byte;
-
-	/* set nq to the point at infinity */
-	memset(nq, 0, 12 * sizeof(fslice));
-
-	/* Loop over all scalars msb-to-lsb, 4 bits at a time: for each nibble,
-	 * double 4 times, then add the precomputed point multiples.
-	 * If we are also adding multiples of the generator, then interleave
-	 * these additions with the last 56 doublings. */
-	for (i = (num_points ? 28 : 7); i > 0; --i)
-		{
-		for (j = 0; j < 8; ++j)
-			{
-			/* double once */
-			point_double(nq, nq+4, nq+8, nq, nq+4, nq+8);
-			/* add multiples of the generator */
-			if ((gen_mul) && (i <= 7))
-				{
-				bits[3] = (g_scalar[i+20] >> (7-j)) & 1;
-				bits[2] = (g_scalar[i+13] >> (7-j)) & 1;
-				bits[1] = (g_scalar[i+6] >> (7-j)) & 1;
-				bits[0] = (g_scalar[i-1] >> (7-j)) & 1;
-				/* select the point to add, in constant time */
-				select_point(bits, g_pre_comp, tmp);
-				memcpy(nqt, nq, 12 * sizeof(fslice));
-				point_add(nq, nq+4, nq+8, nqt, nqt+4, nqt+8,
-					tmp, tmp+4, tmp+8);
-				}
-			/* do an addition after every 4 doublings */
-			if (j % 4 == 3)
-				{
-				/* loop over all scalars */
-				for (num = 0; num < num_points; ++num)
-					{
-					byte = scalars[num][i-1];
-					bits[3] = (byte >> (10-j)) & 1;
-					bits[2] = (byte >> (9-j)) & 1;
-					bits[1] = (byte >> (8-j)) & 1;
-					bits[0] = (byte >> (7-j)) & 1;
-					/* select the point to add */
-					select_point(bits,
-						pre_comp[num], tmp);
-					memcpy(nqt, nq, 12 * sizeof(fslice));
-					point_add(nq, nq+4, nq+8, nqt, nqt+4,
-						nqt+8, tmp, tmp+4, tmp+8);
-					}
-				}
-			}
-		}
-	memcpy(x_out, nq, 4 * sizeof(fslice));
-	memcpy(y_out, nq+4, 4 * sizeof(fslice));
-	memcpy(z_out, nq+8, 4 * sizeof(fslice));
-	}
-
-/******************************************************************************/
-/*		       FUNCTIONS TO MANAGE PRECOMPUTATION
- */
-
-static NISTP224_PRE_COMP *nistp224_pre_comp_new()
-	{
-	NISTP224_PRE_COMP *ret = NULL;
-	ret = (NISTP224_PRE_COMP *)OPENSSL_malloc(sizeof(NISTP224_PRE_COMP));
-	if (!ret)
-		{
-		ECerr(EC_F_NISTP224_PRE_COMP_NEW, ERR_R_MALLOC_FAILURE);
-		return ret;
-		}
-	memset(ret->g_pre_comp, 0, sizeof(ret->g_pre_comp));
-	ret->references = 1;
-	return ret;
-	}
-
-static void *nistp224_pre_comp_dup(void *src_)
-	{
-	NISTP224_PRE_COMP *src = src_;
-
-	/* no need to actually copy, these objects never change! */
-	CRYPTO_add(&src->references, 1, CRYPTO_LOCK_EC_PRE_COMP);
-
-	return src_;
-	}
-
-static void nistp224_pre_comp_free(void *pre_)
-	{
-	int i;
-	NISTP224_PRE_COMP *pre = pre_;
-
-	if (!pre)
-		return;
-
-	i = CRYPTO_add(&pre->references, -1, CRYPTO_LOCK_EC_PRE_COMP);
-	if (i > 0)
-		return;
-
-	OPENSSL_free(pre);
-	}
-
-static void nistp224_pre_comp_clear_free(void *pre_)
-	{
-	int i;
-	NISTP224_PRE_COMP *pre = pre_;
-
-	if (!pre)
-		return;
-
-	i = CRYPTO_add(&pre->references, -1, CRYPTO_LOCK_EC_PRE_COMP);
-	if (i > 0)
-		return;
-
-	OPENSSL_cleanse(pre, sizeof *pre);
-	OPENSSL_free(pre);
-	}
-
-/******************************************************************************/
-/*			   OPENSSL EC_METHOD FUNCTIONS
- */
-
-int ec_GFp_nistp224_group_init(EC_GROUP *group)
-	{
-	int ret;
-	ret = ec_GFp_simple_group_init(group);
-	group->a_is_minus3 = 1;
-	return ret;
-	}
-
-int ec_GFp_nistp224_group_set_curve(EC_GROUP *group, const BIGNUM *p,
-	const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx)
-	{
-	int ret = 0;
-	BN_CTX *new_ctx = NULL;
-	BIGNUM *curve_p, *curve_a, *curve_b;
-
-	if (ctx == NULL)
-		if ((ctx = new_ctx = BN_CTX_new()) == NULL) return 0;
-	BN_CTX_start(ctx);
-	if (((curve_p = BN_CTX_get(ctx)) == NULL) ||
-		((curve_a = BN_CTX_get(ctx)) == NULL) ||
-		((curve_b = BN_CTX_get(ctx)) == NULL)) goto err;
-	BN_bin2bn(nistp224_curve_params[0], sizeof(felem_bytearray), curve_p);
-	BN_bin2bn(nistp224_curve_params[1], sizeof(felem_bytearray), curve_a);
-	BN_bin2bn(nistp224_curve_params[2], sizeof(felem_bytearray), curve_b);
-	if ((BN_cmp(curve_p, p)) || (BN_cmp(curve_a, a)) ||
-		(BN_cmp(curve_b, b)))
-		{
-		ECerr(EC_F_EC_GFP_NISTP224_GROUP_SET_CURVE,
-			EC_R_WRONG_CURVE_PARAMETERS);
-		goto err;
-		}
-	group->field_mod_func = BN_nist_mod_224;
-	ret = ec_GFp_simple_group_set_curve(group, p, a, b, ctx);
-err:
-	BN_CTX_end(ctx);
-	if (new_ctx != NULL)
-		BN_CTX_free(new_ctx);
-	return ret;
-	}
-
-/* Takes the Jacobian coordinates (X, Y, Z) of a point and returns
- * (X', Y') = (X/Z^2, Y/Z^3) */
-int ec_GFp_nistp224_point_get_affine_coordinates(const EC_GROUP *group,
-	const EC_POINT *point, BIGNUM *x, BIGNUM *y, BN_CTX *ctx)
-	{
-	fslice z1[4], z2[4], x_in[4], y_in[4], x_out[4], y_out[4];
-	uint128_t tmp[7];
-
-	if (EC_POINT_is_at_infinity(group, point))
-		{
-		ECerr(EC_F_EC_GFP_NISTP224_POINT_GET_AFFINE_COORDINATES,
-			EC_R_POINT_AT_INFINITY);
-		return 0;
-		}
-	if ((!BN_to_felem(x_in, &point->X)) || (!BN_to_felem(y_in, &point->Y)) ||
-		(!BN_to_felem(z1, &point->Z))) return 0;
-	felem_inv(z2, z1);
-	felem_square(tmp, z2); felem_reduce(z1, tmp);
-	felem_mul(tmp, x_in, z1); felem_reduce(x_in, tmp);
-	felem_contract(x_out, x_in);
-	if (x != NULL)
-		{
-		if (!felem_to_BN(x, x_out)) {
-		ECerr(EC_F_EC_GFP_NISTP224_POINT_GET_AFFINE_COORDINATES,
-			ERR_R_BN_LIB);
-		return 0;
-		}
-		}
-	felem_mul(tmp, z1, z2); felem_reduce(z1, tmp);
-	felem_mul(tmp, y_in, z1); felem_reduce(y_in, tmp);
-	felem_contract(y_out, y_in);
-	if (y != NULL)
-		{
-		if (!felem_to_BN(y, y_out)) {
-		ECerr(EC_F_EC_GFP_NISTP224_POINT_GET_AFFINE_COORDINATES,
-			ERR_R_BN_LIB);
-		return 0;
-		}
-		}
-	return 1;
-	}
-
-/* Computes scalar*generator + \sum scalars[i]*points[i], ignoring NULL values
- * Result is stored in r (r can equal one of the inputs). */
-int ec_GFp_nistp224_points_mul(const EC_GROUP *group, EC_POINT *r,
-	const BIGNUM *scalar, size_t num, const EC_POINT *points[],
-	const BIGNUM *scalars[], BN_CTX *ctx)
-	{
-	int ret = 0;
-	int i, j;
-	BN_CTX *new_ctx = NULL;
-	BIGNUM *x, *y, *z, *tmp_scalar;
-	felem_bytearray g_secret;
-	felem_bytearray *secrets = NULL;
-	fslice (*pre_comp)[16][3][4] = NULL;
-	felem_bytearray tmp;
-	unsigned num_bytes;
-	int have_pre_comp = 0;
-	size_t num_points = num;
-	fslice x_in[4], y_in[4], z_in[4], x_out[4], y_out[4], z_out[4];
-	NISTP224_PRE_COMP *pre = NULL;
-	fslice (*g_pre_comp)[3][4] = NULL;
-	EC_POINT *generator = NULL;
-	const EC_POINT *p = NULL;
-	const BIGNUM *p_scalar = NULL;
-
-	if (ctx == NULL)
-		if ((ctx = new_ctx = BN_CTX_new()) == NULL) return 0;
-	BN_CTX_start(ctx);
-	if (((x = BN_CTX_get(ctx)) == NULL) ||
-		((y = BN_CTX_get(ctx)) == NULL) ||
-		((z = BN_CTX_get(ctx)) == NULL) ||
-		((tmp_scalar = BN_CTX_get(ctx)) == NULL))
-		goto err;
-
-	if (scalar != NULL)
-		{
-		pre = EC_EX_DATA_get_data(group->extra_data,
-			nistp224_pre_comp_dup, nistp224_pre_comp_free,
-			nistp224_pre_comp_clear_free);
-		if (pre)
-			/* we have precomputation, try to use it */
-			g_pre_comp = pre->g_pre_comp;
-		else
-			/* try to use the standard precomputation */
-			g_pre_comp = (fslice (*)[3][4]) gmul;
-		generator = EC_POINT_new(group);
-		if (generator == NULL)
-			goto err;
-		/* get the generator from precomputation */
-		if (!felem_to_BN(x, g_pre_comp[1][0]) ||
-			!felem_to_BN(y, g_pre_comp[1][1]) ||
-			!felem_to_BN(z, g_pre_comp[1][2]))
-			{
-			ECerr(EC_F_EC_GFP_NISTP224_POINTS_MUL, ERR_R_BN_LIB);
-			goto err;
-			}
-		if (!EC_POINT_set_Jprojective_coordinates_GFp(group,
-				generator, x, y, z, ctx))
-			goto err;
-		if (0 == EC_POINT_cmp(group, generator, group->generator, ctx))
-			/* precomputation matches generator */
-			have_pre_comp = 1;
-		else
-			/* we don't have valid precomputation:
-			 * treat the generator as a random point */
-			num_points = num_points + 1;
-		}
-	secrets = OPENSSL_malloc(num_points * sizeof(felem_bytearray));
-	pre_comp = OPENSSL_malloc(num_points * 16 * 3 * 4 * sizeof(fslice));
-
-	if ((num_points) && ((secrets == NULL) || (pre_comp == NULL)))
-		{
-		ECerr(EC_F_EC_GFP_NISTP224_POINTS_MUL, ERR_R_MALLOC_FAILURE);
-		goto err;
-		}
-
-	/* we treat NULL scalars as 0, and NULL points as points at infinity,
-	 * i.e., they contribute nothing to the linear combination */
-	memset(secrets, 0, num_points * sizeof(felem_bytearray));
-	memset(pre_comp, 0, num_points * 16 * 3 * 4 * sizeof(fslice));
-	for (i = 0; i < num_points; ++i)
-		{
-		if (i == num)
-			/* the generator */
-			{
-			p = EC_GROUP_get0_generator(group);
-			p_scalar = scalar;
-			}
-		else
-			/* the i^th point */
-			{
-			p = points[i];
-			p_scalar = scalars[i];
-			}
-		if ((p_scalar != NULL) && (p != NULL))
-			{
-			num_bytes = BN_num_bytes(p_scalar);
-			/* reduce scalar to 0 <= scalar < 2^224 */
-			if ((num_bytes > sizeof(felem_bytearray)) || (BN_is_negative(p_scalar)))
-				{
-				/* this is an unusual input, and we don't guarantee
-				 * constant-timeness */
-				if (!BN_nnmod(tmp_scalar, p_scalar, &group->order, ctx))
-					{
-					ECerr(EC_F_EC_GFP_NISTP224_POINTS_MUL, ERR_R_BN_LIB);
-					goto err;
-					}
-				num_bytes = BN_bn2bin(tmp_scalar, tmp);
-				}
-			else
-				BN_bn2bin(p_scalar, tmp);
-			flip_endian(secrets[i], tmp, num_bytes);
-			/* precompute multiples */
-			if ((!BN_to_felem(x_out, &p->X)) ||
-				(!BN_to_felem(y_out, &p->Y)) ||
-				(!BN_to_felem(z_out, &p->Z))) goto err;
-			memcpy(pre_comp[i][1][0], x_out, 4 * sizeof(fslice));
-			memcpy(pre_comp[i][1][1], y_out, 4 * sizeof(fslice));
-			memcpy(pre_comp[i][1][2], z_out, 4 * sizeof(fslice));
-			for (j = 1; j < 8; ++j)
-				{
-				point_double(pre_comp[i][2*j][0],
-					pre_comp[i][2*j][1],
-					pre_comp[i][2*j][2],
-					pre_comp[i][j][0],
-					pre_comp[i][j][1],
-					pre_comp[i][j][2]);
-				point_add(pre_comp[i][2*j+1][0],
-					pre_comp[i][2*j+1][1],
-					pre_comp[i][2*j+1][2],
-					pre_comp[i][1][0],
-					pre_comp[i][1][1],
-					pre_comp[i][1][2],
-					pre_comp[i][2*j][0],
-					pre_comp[i][2*j][1],
-					pre_comp[i][2*j][2]);
-				}
-			}
-		}
-
-	/* the scalar for the generator */
-	if ((scalar != NULL) && (have_pre_comp))
-		{
-		memset(g_secret, 0, sizeof g_secret);
-		num_bytes = BN_num_bytes(scalar);
-		/* reduce scalar to 0 <= scalar < 2^224 */
-		if ((num_bytes > sizeof(felem_bytearray)) || (BN_is_negative(scalar)))
-			{
-			/* this is an unusual input, and we don't guarantee
-			 * constant-timeness */
-			if (!BN_nnmod(tmp_scalar, scalar, &group->order, ctx))
-				{
-				ECerr(EC_F_EC_GFP_NISTP224_POINTS_MUL, ERR_R_BN_LIB);
-				goto err;
-				}
-			num_bytes = BN_bn2bin(tmp_scalar, tmp);
-			}
-		else
-			BN_bn2bin(scalar, tmp);
-		flip_endian(g_secret, tmp, num_bytes);
-		/* do the multiplication with generator precomputation*/
-		batch_mul(x_out, y_out, z_out,
-			(const felem_bytearray (*)) secrets, num_points,
-			g_secret, (const fslice (*)[16][3][4]) pre_comp,
-			(const fslice (*)[3][4]) g_pre_comp);
-		}
-	else
-		/* do the multiplication without generator precomputation */
-		batch_mul(x_out, y_out, z_out,
-			(const felem_bytearray (*)) secrets, num_points,
-			NULL, (const fslice (*)[16][3][4]) pre_comp, NULL);
-	/* reduce the output to its unique minimal representation */
-	felem_contract(x_in, x_out);
-	felem_contract(y_in, y_out);
-	felem_contract(z_in, z_out);
-	if ((!felem_to_BN(x, x_in)) || (!felem_to_BN(y, y_in)) ||
-		(!felem_to_BN(z, z_in)))
-		{
-		ECerr(EC_F_EC_GFP_NISTP224_POINTS_MUL, ERR_R_BN_LIB);
-		goto err;
-		}
-	ret = EC_POINT_set_Jprojective_coordinates_GFp(group, r, x, y, z, ctx);
-
-err:
-	BN_CTX_end(ctx);
-	if (generator != NULL)
-		EC_POINT_free(generator);
-	if (new_ctx != NULL)
-		BN_CTX_free(new_ctx);
-	if (secrets != NULL)
-		OPENSSL_free(secrets);
-	if (pre_comp != NULL)
-		OPENSSL_free(pre_comp);
-	return ret;
-	}
-
-int ec_GFp_nistp224_precompute_mult(EC_GROUP *group, BN_CTX *ctx)
-	{
-	int ret = 0;
-	NISTP224_PRE_COMP *pre = NULL;
-	int i, j;
-	BN_CTX *new_ctx = NULL;
-	BIGNUM *x, *y;
-	EC_POINT *generator = NULL;
-
-	/* throw away old precomputation */
-	EC_EX_DATA_free_data(&group->extra_data, nistp224_pre_comp_dup,
-		nistp224_pre_comp_free, nistp224_pre_comp_clear_free);
-	if (ctx == NULL)
-		if ((ctx = new_ctx = BN_CTX_new()) == NULL) return 0;
-	BN_CTX_start(ctx);
-	if (((x = BN_CTX_get(ctx)) == NULL) ||
-		((y = BN_CTX_get(ctx)) == NULL))
-		goto err;
-	/* get the generator */
-	if (group->generator == NULL) goto err;
-	generator = EC_POINT_new(group);
-	if (generator == NULL)
-		goto err;
-	BN_bin2bn(nistp224_curve_params[3], sizeof (felem_bytearray), x);
-	BN_bin2bn(nistp224_curve_params[4], sizeof (felem_bytearray), y);
-	if (!EC_POINT_set_affine_coordinates_GFp(group, generator, x, y, ctx))
-		goto err;
-	if ((pre = nistp224_pre_comp_new()) == NULL)
-		goto err;
-	/* if the generator is the standard one, use built-in precomputation */
-	if (0 == EC_POINT_cmp(group, generator, group->generator, ctx))
-		{
-		memcpy(pre->g_pre_comp, gmul, sizeof(pre->g_pre_comp));
-		ret = 1;
-		goto err;
-		}
-	if ((!BN_to_felem(pre->g_pre_comp[1][0], &group->generator->X)) ||
-		(!BN_to_felem(pre->g_pre_comp[1][1], &group->generator->Y)) ||
-		(!BN_to_felem(pre->g_pre_comp[1][2], &group->generator->Z)))
-		goto err;
-	/* compute 2^56*G, 2^112*G, 2^168*G */
-	for (i = 1; i < 5; ++i)
-		{
-		point_double(pre->g_pre_comp[2*i][0], pre->g_pre_comp[2*i][1],
-			pre->g_pre_comp[2*i][2], pre->g_pre_comp[i][0],
-			pre->g_pre_comp[i][1], pre->g_pre_comp[i][2]);
-		for (j = 0; j < 55; ++j)
-			{
-			point_double(pre->g_pre_comp[2*i][0],
-				pre->g_pre_comp[2*i][1],
-				pre->g_pre_comp[2*i][2],
-				pre->g_pre_comp[2*i][0],
-				pre->g_pre_comp[2*i][1],
-				pre->g_pre_comp[2*i][2]);
-			}
-		}
-	/* g_pre_comp[0] is the point at infinity */
-	memset(pre->g_pre_comp[0], 0, sizeof(pre->g_pre_comp[0]));
-	/* the remaining multiples */
-	/* 2^56*G + 2^112*G */
-	point_add(pre->g_pre_comp[6][0], pre->g_pre_comp[6][1],
-		pre->g_pre_comp[6][2], pre->g_pre_comp[4][0],
-		pre->g_pre_comp[4][1], pre->g_pre_comp[4][2],
-		pre->g_pre_comp[2][0], pre->g_pre_comp[2][1],
-		pre->g_pre_comp[2][2]);
-	/* 2^56*G + 2^168*G */
-	point_add(pre->g_pre_comp[10][0], pre->g_pre_comp[10][1],
-		pre->g_pre_comp[10][2], pre->g_pre_comp[8][0],
-		pre->g_pre_comp[8][1], pre->g_pre_comp[8][2],
-		pre->g_pre_comp[2][0], pre->g_pre_comp[2][1],
-		pre->g_pre_comp[2][2]);
-	/* 2^112*G + 2^168*G */
-	point_add(pre->g_pre_comp[12][0], pre->g_pre_comp[12][1],
-		pre->g_pre_comp[12][2], pre->g_pre_comp[8][0],
-		pre->g_pre_comp[8][1], pre->g_pre_comp[8][2],
-		pre->g_pre_comp[4][0], pre->g_pre_comp[4][1],
-		pre->g_pre_comp[4][2]);
-	/* 2^56*G + 2^112*G + 2^168*G */
-	point_add(pre->g_pre_comp[14][0], pre->g_pre_comp[14][1],
-		pre->g_pre_comp[14][2], pre->g_pre_comp[12][0],
-		pre->g_pre_comp[12][1], pre->g_pre_comp[12][2],
-		pre->g_pre_comp[2][0], pre->g_pre_comp[2][1],
-		pre->g_pre_comp[2][2]);
-	for (i = 1; i < 8; ++i)
-		{
-		/* odd multiples: add G */
-		point_add(pre->g_pre_comp[2*i+1][0], pre->g_pre_comp[2*i+1][1],
-			pre->g_pre_comp[2*i+1][2], pre->g_pre_comp[2*i][0],
-			pre->g_pre_comp[2*i][1], pre->g_pre_comp[2*i][2],
-			pre->g_pre_comp[1][0], pre->g_pre_comp[1][1],
-			pre->g_pre_comp[1][2]);
-		}
-
-	if (!EC_EX_DATA_set_data(&group->extra_data, pre, nistp224_pre_comp_dup,
-			nistp224_pre_comp_free, nistp224_pre_comp_clear_free))
-		goto err;
-	ret = 1;
-	pre = NULL;
- err:
-	BN_CTX_end(ctx);
-	if (generator != NULL)
-		EC_POINT_free(generator);
-	if (new_ctx != NULL)
-		BN_CTX_free(new_ctx);
-	if (pre)
-		nistp224_pre_comp_free(pre);
-	return ret;
-	}
-
-int ec_GFp_nistp224_have_precompute_mult(const EC_GROUP *group)
-	{
-	if (EC_EX_DATA_get_data(group->extra_data, nistp224_pre_comp_dup,
-			nistp224_pre_comp_free, nistp224_pre_comp_clear_free)
-		!= NULL)
-		return 1;
-	else
-		return 0;
-	}
-#endif
-
-#ifdef TESTING
-
-#include <sys/time.h>
-
-static u8 ctoh(char c)
-{
-    if (c >= '0' && c <= '9') return c-'0';
-    if (c >= 'a' && c <= 'f') return c-'a'+10;
-    if (c >= 'A' && c <= 'F') return c-'A'+10;
-    return 0;
-}
-
-static void arg_to_bytearray(felem_bytearray ba, const char *arg)
-{
-    /* Convert the arg, which is a string like "1a2637c8" to a byte
-     * array like 0xc8 0x37 0x26 0x1a. */
-    int size = sizeof(felem_bytearray);
-    int arglen = strlen(arg);
-    int argsize = (arglen+1)/2;
-    const char *argp = arg + arglen;
-    u8 *bap = ba;
-
-    memset(ba, 0, size);
-    if (size < argsize) {
-	fprintf(stderr, "Arg too long: %s\n", arg);
-	exit(1);
-    }
-
-    while (argp > arg+1) {
-	argp -= 2;
-	*bap = (ctoh(argp[0])<<4)|(ctoh(argp[1]));
-	++bap;
-    }
-    if (arglen & 1) {
-	/* Handle the stray top nybble */
-	argp -= 1;
-	*bap = ctoh(argp[0]);
-    }
-}
-
-static void arg_to_coord(coord c, const char *arg)
-{
-    felem_bytearray ba;
-
-    arg_to_bytearray(ba, arg);
-    /* Now convert it to a coord */
-    bin21_to_felem(c, ba);
-}
-
-int main(int argc, char **argv)
-{
-    point infinity, P, Q, P2, PQ;
-    felem_bytearray s;
-    int i;
-    struct timeval st, et;
-    unsigned long el;
-    int niter = 1000;
-
-    memset(infinity, 0, sizeof(infinity));
-    memset(P, 0, sizeof(P));
-    memset(Q, 0, sizeof(Q));
-
-    if (argc != 6) {
-	fprintf(stderr, "Usage: %s Px Py Qx Qy s\n", argv[0]);
-	exit(1);
-    }
-
-    arg_to_coord(P[0], argv[1]);
-    arg_to_coord(P[1], argv[2]);
-    P[2][0] = 1;
-    dump_point("P", P);
-    arg_to_coord(Q[0], argv[3]);
-    arg_to_coord(Q[1], argv[4]);
-    Q[2][0] = 1;
-    dump_point("Q", Q);
-    arg_to_bytearray(s, argv[5]);
-
-    point_double(P2[0], P2[1], P2[2], P[0], P[1], P[2]);
-    affine(P2);
-    point_add(PQ[0], PQ[1], PQ[2], P[0], P[1], P[2], Q[0], Q[1], Q[2]);
-    affine(PQ);
-    dump_point("P2", P2);
-    dump_point("PQ", PQ);
-
-    gettimeofday(&st, NULL);
-    for (i=0;i<niter;++i) {
-	point_mul(P, P, s);
-	affine(P);
-    }
-    gettimeofday(&et, NULL);
-    el = (et.tv_sec-st.tv_sec)*1000000 + (et.tv_usec-st.tv_usec);
-    fprintf(stderr, "%lu / %d = %lu us\n", el, niter, el/niter);
-
-    dump_point("Ps", P);
-
-    return 0;
-}
-#endif
-
-/* Figure out whether there's a point with x-coordinate x on the main
- * curve.  If not, then there's one on the twist curve.  (There are
- * actually two, which are negatives of each other; that doesn't
- * matter.)  Multiply that point by seckey and set out to the
- * x-coordinate of the result. */
-void ptwist_pointmul(byte out[PTWIST_BYTES], const byte x[PTWIST_BYTES],
-	const byte seckey[PTWIST_BYTES])
-{
-    /* Compute z = x^3 + a*x + b */
-    point P, Q;
-    coord z, r2, Qx;
-    uint128_t tmp[5];
-    int ontwist;
-    static const coord three = { 3, 0, 0 };
-    static const coord b =
-	    { 0x46d320e01dc7d6, 0x486ebc69bad316, 0x4e355e95cafedd };
-
-
-    /* Convert the byte array to a coord */
-    bin21_to_felem(P[0], x);
-
-    /* Compute z = x^3 - 3*x + b */
-    felem_square(tmp, P[0]); felem_reduce(z, tmp);
-    felem_diff64(z, three);
-    felem_mul(tmp, z, P[0]); felem_reduce(z, tmp);
-    felem_sum64(z, b);
-
-    /*
-    dump_coord("z", z);
-    */
-    /* Compute r = P[1] = z ^ ((p+1)/4).  This will be a square root of
-     * z, if one exists. */
-    felem_sqrt(P[1], z);
-    /*
-    dump_coord("r", P[1]);
-    */
-
-    /* Is P[1] a square root of z? */
-    felem_square(tmp, P[1]); felem_diff_128_64(tmp, z); felem_reduce(r2, tmp);
-
-    if (felem_is_zero(r2)) {
-	/* P(x,r) is on the curve */
-	ontwist = 0;
-    } else {
-	/* (-x, r) is on the twist */
-	ontwist = 1;
-	felem_neg(P[0], P[0]);
-    }
-    /*
-    fprintf(stderr, "ontwist = %d\n", ontwist);
-    */
-    memset(P[2], 0, sizeof(coord));
-    P[2][0] = 1;
-
-    /* All set.  Now do the point multiplication. */
-    /*
-    dump_point("P", P);
-    for(i=0;i<21;++i) {
-	fprintf(stderr, "%02x", seckey[20-i]);
-    }
-    fprintf(stderr, "\n");
-    */
-    point_mul(Q, P, seckey);
-    affine_x(Qx, Q);
-    /*
-    dump_point("Q", Q);
-    */
-
-    /* Get the x-coordinate of the result, and negate it if we're on the
-     * twist. */
-    if (ontwist) {
-	felem_neg(Qx, Qx);
-    }
-
-    /* Convert back to bytes */
-    felem_to_bin21(out, Qx);
-    /*
-    fprintf(stderr, "out: ");
-    for(i=0;i<21;++i) {
-	fprintf(stderr, "%02x", out[i]);
-    }
-    fprintf(stderr, "\n");
-    */
-}

+ 0 - 171
client/rclient.c

@@ -1,171 +0,0 @@
-#include <stdio.h>
-#include <string.h>
-#include <openssl/rand.h>
-#include <openssl/sha.h>
-#include "ptwist.h"
-#include "rclient.h"
-
-byte maingen[PTWIST_BYTES];
-byte twistgen[PTWIST_BYTES];
-byte mainpub[PTWIST_BYTES];
-byte twistpub[PTWIST_BYTES];
-
-static void gen_tag(byte *tag, byte key[16],
-	const byte *context, size_t context_len)
-{
-    byte seckey[PTWIST_BYTES];
-    byte sharedsec[PTWIST_BYTES+context_len];
-    byte usetwist;
-    byte taghashout[32];
-#if PTWIST_PUZZLE_STRENGTH > 0
-    size_t puzzle_len = 16+PTWIST_RESP_BYTES;
-    byte value_to_hash[puzzle_len];
-    byte hashout[32];
-    bn_t Rbn, Hbn;
-    int i, len, sign;
-#endif
-
-    memset(tag, 0xAA, PTWIST_TAG_BYTES);
-
-    /* Use the main or the twist curve? */
-    RAND_bytes(&usetwist, 1);
-    usetwist &= 1;
-
-    /* Create seckey*G and seckey*Y */
-    RAND_bytes(seckey, PTWIST_BYTES);
-    ptwist_pointmul(tag, usetwist ? twistgen : maingen, seckey);
-    ptwist_pointmul(sharedsec, usetwist ? twistpub : mainpub, seckey);
-
-    /* Create the tag hash keys */
-    memmove(sharedsec+PTWIST_BYTES, context, context_len);
-    SHA256(sharedsec, PTWIST_BYTES, taghashout);
-
-#if PTWIST_PUZZLE_STRENGTH > 0
-    /* The puzzle is to find a response R such that SHA256(K || R)
-       starts with PTWIST_PUZZLE_STRENGTH bits of 0s.  K is the first
-       128 bits of the above hash tag keys. */
-
-    /* Construct our response to the puzzle.  Start looking for R in a
-     * random place. */
-    memmove(value_to_hash, taghashout, 16);
-    RAND_bytes(value_to_hash+16, PTWIST_RESP_BYTES);
-    value_to_hash[16+PTWIST_RESP_BYTES-1] &= PTWIST_RESP_MASK;
-
-    while(1) {
-	unsigned int firstbits;
-
-	md_map_sh256(hashout, value_to_hash, puzzle_len);
-#if PTWIST_PUZZLE_STRENGTH < 32
-	/* This assumes that you're on an architecture that doesn't care
-	 * about alignment, and is little endian. */
-	firstbits = *(unsigned int*)hashout;
-	if ((firstbits & PTWIST_PUZZLE_MASK) == 0) {
-	    break;
-	}
-	/* Increment R and try again. */
-	for(i=0;i<PTWIST_RESP_BYTES;++i) {
-	    if (++value_to_hash[16+i]) break;
-	}
-	value_to_hash[16+PTWIST_RESP_BYTES-1] &= PTWIST_RESP_MASK;
-#else
-#error "Code assumes PTWIST_PUZZLE_STRENGTH < 32"
-#endif
-    }
-
-	/*
-	for(i=0;i<puzzle_len;++i) {
-	    printf("%02x", value_to_hash[i]);
-	    if ((i%4) == 3) printf(" ");
-	}
-	printf("\n");
-	for(i=0;i<32;++i) {
-	    printf("%02x", hashout[i]);
-	    if ((i%4) == 3) printf(" ");
-	}
-	printf("\n");
-	*/
-    /* When we get here, we have solved the puzzle.  R is in
-     * value_to_hash[16..16+PTWIST_RESP_BYTES-1], the hash output
-     * hashout starts with PTWIST_PUZZLE_STRENGTH bits of 0s, and we'll
-     * want to copy out H (the next PTWIST_HASH_SHOWBITS bits of the
-     * hash output).  The final tag is [seckey*G]_x || R || H . */
-    bn_new(Rbn);
-    bn_new(Hbn);
-
-    bn_read_bin(Rbn, value_to_hash+16, PTWIST_RESP_BYTES, BN_POS);
-    hashout[PTWIST_HASH_TOTBYTES-1] &= PTWIST_HASH_MASK;
-    bn_read_bin(Hbn, hashout, PTWIST_HASH_TOTBYTES, BN_POS);
-    bn_lsh(Hbn, Hbn, PTWIST_RESP_BITS-PTWIST_PUZZLE_STRENGTH);
-    bn_add(Hbn, Hbn, Rbn);
-    len = PTWIST_TAG_BYTES-PTWIST_BYTES;
-    bn_write_bin(tag+PTWIST_BYTES, &len, &sign, Hbn);
-	/*
-	for(i=0;i<PTWIST_TAG_BYTES;++i) {
-	    printf("%02x", tag[i]);
-	    if ((i%4) == 3) printf(" ");
-	}
-	printf("\n");
-	*/
-
-    bn_free(Rbn);
-    bn_free(Hbn);
-#elif PTWIST_HASH_SHOWBITS <= 128
-    /* We're not using a client puzzle, so the tag is [seckey*G]_x || H
-     * where H is the first PTWIST_HASH_SHOWBITS bits of the above hash
-     * output.  The key generated is the last 128 bits of that output.
-     * If there's no client puzzle, PTWIST_HASH_SHOWBITS must be a multiple
-     * of 8. */
-    memmove(tag+PTWIST_BYTES, taghashout, PTWIST_HASH_SHOWBITS/8);
-#else
-#error "No client puzzle used, but PWTIST_HASH_SHOWBITS > 128"
-#endif
-
-    memmove(key, taghashout+16, 16);
-}
-
-int tag_hello(unsigned char *target, byte key[16])
-{
-    FILE *fp;
-    int res, i;
-    byte *tag;
-
-    /* Create the generators */
-    memset(maingen, 0, PTWIST_BYTES);
-    maingen[0] = 2;
-    memset(twistgen, 0, PTWIST_BYTES);
-
-    /* Read the public keys */
-    fp = fopen("pubkey", "rb");
-    if (fp == NULL) {
-		perror("fopen");
-		exit(1);
-    }
-    res = fread(mainpub, PTWIST_BYTES, 1, fp);
-    if (res < 1) {
-		perror("fread");
-		exit(1);
-    }
-    res = fread(twistpub, PTWIST_BYTES, 1, fp);
-    if (res < 1) {
-		perror("fread");
-		exit(1);
-    }
-    fclose(fp);
-
-	//byte key[16];
-	tag = target;
-
-	gen_tag(tag, key, (const byte *)"context", 7);
-    fp = fopen("tags", "wb");
-    if (fp == NULL) {
-		perror("fopen");
-		exit(1);
-    }
-	for(i=0; i< PTWIST_TAG_BYTES; i++){
-		fprintf(fp, "%02x ", tag[i]);
-	}
-	printf("\n");
-	fclose(fp);
-
-    return 0;
-}

+ 0 - 7
client/rclient.h

@@ -1,7 +0,0 @@
-#ifndef __RCLIENT_H__
-#define __RCLIENT_H__
-
-
-int tag_hello(unsigned char *target, byte key[16]);
-
-#endif /* __RCLIENT_H_ */

+ 0 - 402
client/testget.c

@@ -1,402 +0,0 @@
-#include <sys/socket.h>
-#include <sys/types.h>
-#include <netinet/in.h>
-#include <netdb.h>
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <errno.h>
-
-#include <openssl/rand.h>
-#include <openssl/ssl.h>
-#include <openssl/err.h>
-
-#include "ptwist.h"
-#include "rclient.h"
-/* Copied from ssl_locl.h */
-# define l2n(l,c)        (*((c)++)=(unsigned char)(((l)>>24)&0xff), \
-                         *((c)++)=(unsigned char)(((l)>>16)&0xff), \
-                         *((c)++)=(unsigned char)(((l)>> 8)&0xff), \
-                         *((c)++)=(unsigned char)(((l)    )&0xff))
-
-//from Slitheen header
-struct slitheen_header {
-    u_char marker; /* 0x01 means censored data, 0x02 means dummy data */
-    u_char version; /* For now 0x01 */
-    u_short len;
-};
-#define SLITHEEN_HEADER_LEN 4
-
-
-// Simple structure to keep track of the handle, and
-// of what needs to be freed later.
-typedef struct {
-    int socket;
-    SSL *sslHandle;
-    SSL_CTX *sslContext;
-
-} connection;
-
-int generate_backdoor_key(SSL *s, DH *dh);
-
-// For this example, we'll be testing on openssl.org
-#define SERVER  "cs.uwaterloo.ca"
-#define PORT 443
-
-byte key[16];
-
-//Client hello callback
-int tag_flow(SSL *s){
-	unsigned char *result;
-	int len, i;
-
-	result = s->s3->client_random;
-	len = sizeof(s->s3->client_random);
-
-	if(len < PTWIST_TAG_BYTES) {
-		printf("Uhoh\n");
-		return 1;
-	}
-	unsigned long Time = (unsigned long)time(NULL);
-	unsigned char *p = result;
-	l2n(Time, p);
-	tag_hello((byte *) result+4, key);
-	printf("Hello tagged.\n");
-
-	return 0;
-}
-
-// Establish a regular tcp connection
-int tcpConnect ()
-{
-  int error, handle;
-  struct hostent *host;
-  struct sockaddr_in server;
-
-  host = gethostbyname (SERVER);
-  handle = socket (AF_INET, SOCK_STREAM, 0);
-  if (handle == -1)
-    {
-      perror ("Socket");
-      handle = 0;
-    }
-  else
-    {
-      server.sin_family = AF_INET;
-      server.sin_port = htons (PORT);
-      server.sin_addr = *((struct in_addr *) host->h_addr);
-      bzero (&(server.sin_zero), 8);
-
-      error = connect (handle, (struct sockaddr *) &server,
-                       sizeof (struct sockaddr));
-      if (error == -1)
-        {
-          perror ("Connect");
-          handle = 0;
-        }
-    }
-
-  return handle;
-}
-
-// Establish a connection using an SSL layer
-connection *sslConnect (void)
-{
-  connection *c;
-  FILE *fp;
-
-  c = malloc (sizeof (connection));
-  c->sslHandle = NULL;
-  c->sslContext = NULL;
-
-  c->socket = tcpConnect ();
-  if (c->socket)
-    {
-      // Register the error strings for libcrypto & libssl
-      SSL_load_error_strings();
-      // Register the available ciphers and digests
-      SSL_library_init();
-
-      // New context saying we are a client, and using TLSv1.2
-      c->sslContext = SSL_CTX_new (TLSv1_2_method());
-
-
-	  //Tag the client hello message with Telex tag
-	SSL_CTX_set_client_hello_callback(c->sslContext, tag_flow);
-
-	  //Set backdoored DH callback
-	  SSL_CTX_set_generate_key_callback(c->sslContext, generate_backdoor_key);
-
-      if (c->sslContext == NULL)
-        ERR_print_errors_fp (stderr);
-
-	  //make sure DH is in the cipher list
-	  const char *ciphers = "DHE";
-	  if(!SSL_CTX_set_cipher_list(c->sslContext, ciphers))
-		  printf("Failed to set cipher.\n");
-
-      // Create an SSL struct for the connection
-      c->sslHandle = SSL_new (c->sslContext);
-      if (c->sslHandle == NULL)
-        ERR_print_errors_fp (stderr);
-
-	  const unsigned char *list = SSL_get_cipher_list(c->sslHandle, 1);
-	  printf("List of ciphers: %s", list);
-
-      // Connect the SSL struct to our connection
-      if (!SSL_set_fd (c->sslHandle, c->socket))
-        ERR_print_errors_fp (stderr);
-
-      // Initiate SSL handshake
-      if (SSL_connect (c->sslHandle) != 1)
-        ERR_print_errors_fp (stderr);
-
-	  const unsigned char *cipher = SSL_get_cipher_name(c->sslHandle);
-	  printf("CIPHER: %s\n", cipher);
-    }
-  else
-    {
-      perror ("Connect failed");
-    }
-
-  return c;
-}
-
-// Disconnect & free connection struct
-void sslDisconnect (connection *c)
-{
-  if (c->socket)
-    close (c->socket);
-  if (c->sslHandle)
-    {
-      SSL_shutdown (c->sslHandle);
-      SSL_free (c->sslHandle);
-    }
-  if (c->sslContext)
-    SSL_CTX_free (c->sslContext);
-
-  free (c);
-}
-
-// Read all available text from the connection
-char *sslRead (connection *c)
-{
-  const int readSize = 16384;
-  char *rc = NULL;
-  int received, count = 0;
-  char buffer[16384];
-
-  if (c)
-    {
-      while (1)
-        {
-          if (!rc)
-            rc = malloc (readSize * sizeof (char) + 1);
-          else
-            rc = realloc (rc, count + readSize * sizeof (char)
-					+ 1);
-
-          received = SSL_read (c->sslHandle, buffer, readSize);
-          buffer[received] = '\0';
-
-          if (received > 0){
-			  printf("read %d bytes\n", received);
-			  printf("Slitheen header:\n");
-			  int i;
-			  for(i=0; (i<SLITHEEN_HEADER_LEN) && (i<received); i++)
-				  printf("%02x ", buffer[i]);
-			  printf("\n");
-			  struct slitheen_header *sl_hdr = (struct slitheen_header *) buffer;
-			  printf("recieved %d bytes censored data\n", ntohs(sl_hdr->len));
-			  buffer[SLITHEEN_HEADER_LEN+ ntohs(sl_hdr->len)] = '\0';
-			  if(received > SLITHEEN_HEADER_LEN)
-				  strcat (rc, buffer+SLITHEEN_HEADER_LEN);
-		  }
-		  else if (received < 0){
-			  fprintf(stdout, "Error: %d\n", SSL_get_error(c->sslHandle, received));
-			  unsigned long err = ERR_get_error();
-			  uint8_t errbuf[256];
-			  while(err != 0){
-				  ERR_error_string(err, errbuf);
-				  fprintf(stdout, "%s\n", errbuf);
-				  err = ERR_get_error();
-				  fflush(stdout);
-			  }
-			  break;
-		  }
-		  else{
-			  printf("read %d bytes\n", received);
-			  break;
-		  }
-
-          count+=received;
-        }
-    }
-
-  return rc;
-}
-
-// Write text to the connection
-void sslWrite (connection *c, char *text)
-{
-  if (c)
-    SSL_write (c->sslHandle, text, strlen (text));
-  printf("Wrote:\n%s\n", text);
-}
-
-// Very basic main: we send GET / and print the response.
-int main (int argc, char **argv)
-{
-  connection *c;
-  char *response;
-  char *response2;
-  FILE *fp;
-
-  c = sslConnect ();
-
-  sslWrite (c, "GET /about/ HTTP/1.1\nhost: cs.uwaterloo.ca\nx-ignore: GET /index.html HTTP/1.1\\nhost: xkcd.com\n\n");
-
-  response = sslRead (c);
-  printf ("%s\n", response);
-  fflush(stdout);
-
-
-  //Now manually request image
-  sslWrite (c, "GET /about/ HTTP/1.1\r\nhost: cs.uwaterloo.ca\r\n\r\n");
-
-  response2 = sslRead (c);
-
-  printf ("%s\n", response2);
-  fflush(stdout);
-
-  sslDisconnect (c);
-  free (response);
-  free (response2);
-
-  return 0;
-}
-
-//dh callback
-int generate_backdoor_key(SSL *s, DH *dh)
-{
-    int ok = 0;
-    int generate_new_key = 0;
-    unsigned l;
-    BN_CTX *ctx;
-    BN_MONT_CTX *mont = NULL;
-    BIGNUM *pub_key = NULL, *priv_key= NULL;
-    unsigned char *buf, *seed;
-    int bytes, i;
-	FILE *fp;
-
-	seed = (unsigned char *) key;
-	fp = fopen("seed", "wb");
-	if (fp == NULL) {
-		perror("fopen");
-		exit(1);
-	}
-	  for(i=0; i< 16; i++){
-	      fprintf(fp, "%02x", key[i]);
-	  }
-	  fclose(fp);
-	printf("In backdoor callback.\n");
-
-    ctx = BN_CTX_new();
-    if (ctx == NULL)
-        goto err;
-
-    if (dh->priv_key == NULL) {
-        priv_key = BN_new();
-        if (priv_key == NULL)
-            goto err;
-        generate_new_key = 1;
-    } else
-        priv_key = dh->priv_key;
-
-    if (dh->pub_key == NULL) {
-        pub_key = BN_new();
-        if (pub_key == NULL)
-            goto err;
-    } else
-        pub_key = dh->pub_key;
-
-    if (dh->flags & DH_FLAG_CACHE_MONT_P) {
-        mont = BN_MONT_CTX_set_locked(&dh->method_mont_p,
-                                      CRYPTO_LOCK_DH, dh->p, ctx);
-        if (!mont)
-            goto err;
-    }
-
-    if (generate_new_key) {
-	/* secret exponent length */
-	l = dh->length ? dh->length : BN_num_bits(dh->p) - 1;
-	bytes = (l+7) / 8;
-
-	/* set exponent to seeded prg value */
-	buf = (unsigned char *)OPENSSL_malloc(bytes);
-	if (buf == NULL){
-	    BNerr(BN_F_BNRAND, ERR_R_MALLOC_FAILURE);
-	    goto err;
-	}
-	/*int bytes_read = RAND_load_file("/home/sltiheen/Downloads/client/seed", 16);
-	printf("read %d bytes\n", bytes_read);
-	//RAND_seed(seed, 16);
-	printf("Using the seed: ");
-	for(i=0; i< 16; i++){
-		printf(" %02x ", seed[i]);
-	}
-	printf("\n");
-
-	if(RAND_bytes(buf, bytes) <= 0)
-	    goto err;
-		*/
-	for(i=0; i<bytes; i++){
-		buf[i] = seed[i%16];
-	}
-
-	printf("Generated the following rand bytes: ");
-	for(i=0; i< bytes; i++){
-		printf(" %02x ", buf[i]);
-	}
-	printf("\n");
-
-	if (!BN_bin2bn(buf, bytes, priv_key))
-	    goto err;
-
-    }
-
-    {
-        BIGNUM local_prk;
-        BIGNUM *prk;
-
-        if ((dh->flags & DH_FLAG_NO_EXP_CONSTTIME) == 0) {
-            BN_init(&local_prk);
-            prk = &local_prk;
-            BN_with_flags(prk, priv_key, BN_FLG_CONSTTIME);
-        } else
-            prk = priv_key;
-
-        if (!dh->meth->bn_mod_exp(dh, pub_key, dh->g, prk, dh->p, ctx, mont))
-            goto err;
-    }
-
-    dh->pub_key = pub_key;
-    dh->priv_key = priv_key;
-    ok = 1;
- err:
-    if (buf != NULL){
-	OPENSSL_cleanse(buf, bytes);
-	OPENSSL_free(buf);
-    }
-    if (ok != 1)
-        DHerr(DH_F_GENERATE_KEY, ERR_R_BN_LIB);
-
-    if ((pub_key != NULL) && (dh->pub_key == NULL))
-        BN_free(pub_key);
-    if ((priv_key != NULL) && (dh->priv_key == NULL))
-        BN_free(priv_key);
-    BN_CTX_free(ctx);
-    return (ok);
-}
-

Some files were not shown because too many files changed in this diff