<!DOCTYPE html>
<html lang="en">
<head>
<!--
    Licensed to the Apache Software Foundation (ASF) under one or more
    contributor license agreements.  See the NOTICE file distributed with
    this work for additional information regarding copyright ownership.
    The ASF licenses this file to You under the Apache License, Version 2.0
    (the "License"); you may not use this file except in compliance with
    the License.  You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing, software
    distributed under the License is distributed on an "AS IS" BASIS,
    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    See the License for the specific language governing permissions and
    limitations under the License.
-->
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link href="/css/bootstrap.min.css" rel="stylesheet">
<link href="/css/bootstrap-theme.min.css" rel="stylesheet">
<link href="/css/dataTables.bootstrap.css" rel="stylesheet">
<link href="/css/pirk.css" rel="stylesheet" type="text/css">
<link href="//netdna.bootstrapcdn.com/font-awesome/4.0.3/css/font-awesome.css" rel="stylesheet">

<title>Origin of Apache Pirk</title>

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
<script src="/js/bootstrap.min.js"></script>
<script src="/js/jquery.dataTables.min.js"></script>
<script src="/js/dataTables.bootstrap.js"></script>
<script>
  // show location of canonical site if not currently on the canonical site
  $(function() {
    var host = window.location.host;
    if (typeof host !== 'undefined' && host !== 'pirk.incubator.apache.org') {
      $('#non-canonical').show();
    }
  });

  
  // decorate menu with currently navigated page
  $(function() {
    $("#nav_pirk_origin").addClass("active");
  });
  

  $(function() {
    // decorate section headers with anchors
    return $("h2, h3, h4, h5, h6").each(function(i, el) {
      var $el, icon, id;
      $el = $(el);
      id = $el.attr('id');
      icon = '<i class="fa fa-link"></i>';
      if (id) {
        return $el.append($("<a />").addClass("header-link").attr("href", "#" + id).html(icon));
      }
    });
  });

  // configure Google Analytics
  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
  })(window,document,'script','https://www.google-analytics.com/analytics.js','ga');

  ga('create', 'UA-81114308-1', 'auto');
  ga('send', 'pageview');
  
</script>
</head>
<body style="padding-top: 100px">

  <nav class="navbar navbar-default navbar-fixed-top">
  <div class="container-fluid">
    <div class="navbar-header">
      <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#navbar-items">
        <span class="sr-only">Toggle navigation</span>
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
      </button>
      <a href="/"><img id="nav-logo" alt="Apache Pirk" class="img-responsive" src="/images/pirkImage.png" width="150"/></a>
    </div>
    <div class="collapse navbar-collapse" id="navbar-items">
      <ul class="nav navbar-nav">
        <li class="nav-link"><a href="/downloads">Download</a></li>
        <li class="dropdown">
        <a class="dropdown-toggle" data-toggle="dropdown" href="#">Documentation<span class="caret"></span></a>
        <ul class="dropdown-menu">
          <li id="nav_users"><a href="/for_users">For Users</a></li>
          <li id="nav_developers"><a href="/for_developers">For Developers</a></li>
          <li id="nav_developers"><a href="/cloud_instructions">Cloud instructions</a></li>
          <li id="nav_papers"><a href="/papers">Papers &amp Presentations</a></li>
          <li class="nav_faq"><a href="/faq">FAQ</a></li>
          <li class="divider"></li>
           <li><a href="/javadocs">Javadocs</a></li>     
        </ul>
        </li>
        <li class="dropdown">
        <a class="dropdown-toggle" data-toggle="dropdown" href="#">Community<span class="caret"></span></a>
        <ul class="dropdown-menu">
          <li id="nav_getinvolvedpirk"><a href="/get_involved_pirk">Get Involved</a></li>
          <li id="nav_listspirk"><a href="/mailing_list_pirk">Mailing Lists</a></li>
          <li id="nav_peoplepirk"><a href="/people_pirk">People</a></li>
       	</ul>
        </li>
        <li class="dropdown">
        <a class="dropdown-toggle" data-toggle="dropdown" href="#">Development<span class="caret"></span></a>
        <ul class="dropdown-menu">
          <li id="nav_releasing"><a href="/how_to_contribute">How to Contribute</a></li>
          <li id="nav_releasing"><a href="/releasing">Making Releases</a></li>
          <li id="nav_nav_verify_release"><a href="/verifying_releases">Verifying Releases</a></li>
          <li id="nav_update_website"><a href="/website_updates">Website Updates</a></li>
          <hr>
          <li><a href="https://issues.apache.org/jira/browse/PIRK ">Issue Tracker/JIRA <i class="fa fa-external-link"></i></a></li>
          <li><a href="https://builds.apache.org/job/pirk/">Jenkins Builds <i class="fa fa-external-link"></i></a></li>
          <li><a href="https://travis-ci.org/apache/incubator-pirk">Travis CI Builds <i class="fa fa-external-link"></i></a></li>
          <li><a href="https://github.com/apache/incubator-pirk"> Pirk Github Mirror <i class="fa fa-external-link"></i></a></li>
        </ul>
        </li>
        <li class="nav-link"><a href="/roadmap">Roadmap</a></li>
       <ul class="nav navbar-nav navbar-right">
        <li class="dropdown">
        <a class="dropdown-toggle" data-toggle="dropdown" href="#">Apache Software Foundation<span class="caret"></span></a>
        <ul class="dropdown-menu">
          <li><a href="https://www.apache.org">Apache Homepage <i class="fa fa-external-link"></i></a></li>
          <li><a href="https://www.apache.org/licenses/LICENSE-2.0">License <i class="fa fa-external-link"></i></a></li>
          <li><a href="https://www.apache.org/foundation/sponsorship">Sponsorship <i class="fa fa-external-link"></i></a></li>
          <li><a href="https://www.apache.org/security">Security <i class="fa fa-external-link"></i></a></li>
          <li><a href="https://www.apache.org/foundation/thanks">Thanks <i class="fa fa-external-link"></i></a></li>
          <li><a href="https://www.apache.org/foundation/policies/conduct">Code of Conduct <i class="fa fa-external-link"></i></a></li>
        </ul>
        </li>
        </ul>
        </ul>
    </div> 
  </div>  
</nav>


  <div class="container">
    <div class="row">
      <div class="col-md-12">
        <div id="content">
          
          <h1 class="title">Origin of Apache Pirk</h1>
          
          <p>The initial scalable PIR algorithms and implementations of Pirk were developed at the <a href="https://www.nsa.gov/">National Security Agency</a> and contributed to Apache via a Software Grant Agreement. Please check out the <a href="https://wiki.apache.org/incubator/PirkProposal">Apache Pirk Proposal</a>.</p>


        </div>

        
<footer>

  <p><a href="https://www.apache.org"><img src="/images/feather-small.gif" alt="Apache Software Foundation" id="asf-logo" height="100" /></a></p>

  <p>Copyright © 2016-2016 The Apache Software Foundation. Licensed under the <a href="https://www.apache.org/licenses/LICENSE-2.0">Apache License, Version 2.0</a>.</p>

</footer>


      </div>
    </div>
  </div>
</body>
</html>
