blob: 7f4c77f4903c5945b7e2be40691710aca4547694 [file] [log] [blame]
Alex Gaynorc72e63f2013-09-09 21:44:26 -07001Contributing
2============
3
4Process
5-------
6
7As an open source project, ``cryptography`` welcomes contributions of all
8forms. These can include:
9
10* Bug reports and feature requests
11* Pull requests for both code and documentation
12* Patch reviews
13
Alex Gaynor2c67c822013-09-09 23:44:13 -070014You can file bugs and submit pull requests on `GitHub`_. To discuss larger
Alex Gaynorc72e63f2013-09-09 21:44:26 -070015changes you can start a conversation on `our mailing list`_.
16
17Because cryptography is so complex, and the implications of getting it wrong so
18devastating, ``cryptography`` has a strict code review policy:
19
20* Patches must *never* be pushed directly to ``master``, all changes (even the
21 most trivial typo fixes!) must be submitted as a pull request.
22* A committer may *never* merge their own pull request, a second party must
Alex Gaynore6466a52013-10-18 14:53:04 -070023 merge their changes. If multiple people work on a pull request, it must be
24 merged by someone who did not work on it.
Alex Gaynorc72e63f2013-09-09 21:44:26 -070025* A patch which breaks tests, or introduces regressions by changing or removing
26 existing tests should not be merged. Tests must always be passing on
27 ``master``.
28* If somehow the tests get into a failing state on ``master`` (such as by a
29 backwards incompatible release of a dependency) no pull requests may be
30 merged until this is rectified.
Alex Gaynorf3f00182013-12-13 19:22:33 -080031* All merged patches must have 100% test coverage.
Alex Gaynor3f230402014-01-08 09:21:57 -080032* New features and significant bug fixes should be documented in the
33 :doc:`/changelog`.
Alex Gaynorc72e63f2013-09-09 21:44:26 -070034
35The purpose of these policies is to minimize the chances we merge a change
36which jeopardizes our users' security.
37
Alex Gaynor99b69d92013-10-19 17:52:58 -070038If you believe you've identified a security issue in ``cryptography``, please
39follow the directions on the :doc:`security page </security>`.
Alex Gaynorc72e63f2013-09-09 21:44:26 -070040
41Code
42----
43
Alex Gaynor028a6fc2014-02-03 09:55:11 -080044When in doubt, refer to :pep:`8` for Python code.
Alex Gaynorc72e63f2013-09-09 21:44:26 -070045
Alex Gaynora54dcde2014-02-05 15:04:51 -080046`Write comments as complete sentences.`_
47
Alex Gaynorc72e63f2013-09-09 21:44:26 -070048Every code file must start with the boilerplate notice of the Apache License.
49Additionally, every Python code file must contain
50
51.. code-block:: python
52
53 from __future__ import absolute_import, division, print_function
54
Alex Gaynore21b0b22013-12-12 12:39:05 -080055API Considerations
56~~~~~~~~~~~~~~~~~~
57
58Most projects' APIs are designed with a philosophy of "make easy things easy,
59and make hard things possible". One of the perils of writing cryptographic code
Alex Gaynor95243f52013-12-21 19:37:24 -080060is that secure code looks just like insecure code, and its results are almost
Alex Gaynor15cf6b92013-12-21 19:22:39 -080061always indistinguishable. As a result ``cryptography`` has, as a design
62philosophy: "make it hard to do insecure things". Here are a few strategies for
63API design which should be both followed, and should inspire other API choices:
Alex Gaynore21b0b22013-12-12 12:39:05 -080064
Alex Gaynor61137bc2014-01-27 16:37:04 -080065If it is necessary to compare a user provided value with a computed value (for
66example, verifying a signature), there should be an API provided which performs
67the verification in a secure way (for example, using a constant time
68comparison), rather than requiring the user to perform the comparison
69themselves.
Alex Gaynor24eb6772014-01-27 16:15:54 -080070
Alex Gaynore21b0b22013-12-12 12:39:05 -080071If it is incorrect to ignore the result of a method, it should raise an
72exception, and not return a boolean ``True``/``False`` flag. For example, a
73method to verify a signature should raise ``InvalidSignature``, and not return
74whether the signature was valid.
75
76.. code-block:: python
77
78 # This is bad.
79 def verify(sig):
80 # ...
81 return is_valid
82
83 # Good!
84 def verify(sig):
85 # ...
86 if not is_valid:
87 raise InvalidSignature
88
Alex Gaynor6955ea32013-12-21 19:26:19 -080089Every recipe should include a version or algorithmic marker of some sort in its
90output in order to allow transparent upgrading of the algorithms in use, as
91the algorithms or parameters needed to achieve a given security margin evolve.
92
Alex Gaynore21b0b22013-12-12 12:39:05 -080093APIs at the :doc:`/hazmat/primitives/index` layer should always take an
94explicit backend, APIs at the recipes layer should automatically use the
Alex Gaynorf8796b12013-12-13 20:28:55 -080095:func:`~cryptography.hazmat.backends.default_backend`, but optionally allow
Alex Gaynor2a5b4a82013-12-12 17:53:08 -080096specifying a different backend.
Alex Gaynore21b0b22013-12-12 12:39:05 -080097
Alex Gaynore6466a52013-10-18 14:53:04 -070098C bindings
Alex Gaynor5246e2d2013-12-12 12:23:18 -080099~~~~~~~~~~
Alex Gaynore6466a52013-10-18 14:53:04 -0700100
101When binding C code with ``cffi`` we have our own style guide, it's pretty
102simple.
103
104Don't name parameters:
105
106.. code-block:: c
107
108 // Good
109 long f(long);
110 // Bad
111 long f(long x);
112
Paul Kehrer3ed80ba2013-10-19 20:00:26 -0500113...unless they're inside a struct:
114
115.. code-block:: c
116
117 struct my_struct {
118 char *name;
119 int number;
120 ...;
121 };
122
Paul Kehrer047dab82013-12-27 16:45:52 -0600123Include ``void`` if the function takes no arguments:
Alex Gaynore6466a52013-10-18 14:53:04 -0700124
125.. code-block:: c
126
127 // Good
Alex Gaynore6466a52013-10-18 14:53:04 -0700128 long f(void);
Paul Kehrer047dab82013-12-27 16:45:52 -0600129 // Bad
130 long f();
Alex Gaynore6466a52013-10-18 14:53:04 -0700131
132Wrap lines at 80 characters like so:
133
134.. code-block:: c
135
136 // Pretend this went to 80 characters
137 long f(long, long,
138 int *)
139
Alex Gaynor1e8744a2013-10-18 14:57:18 -0700140Include a space after commas between parameters:
141
142.. code-block:: c
143
144 // Good
145 long f(int, char *)
146 // Bad
147 long f(int,char *)
148
Paul Kehrer745ee072013-12-27 20:42:54 -0600149Values set by ``#define`` should be assigned the appropriate type. If you see
Paul Kehrerccd9c002013-12-27 20:25:06 -0600150this:
151
152.. code-block:: c
153
Alex Stapleton9020b482013-12-28 16:28:59 +0000154 #define SOME_INTEGER_LITERAL 0x0;
155 #define SOME_UNSIGNED_INTEGER_LITERAL 0x0001U;
156 #define SOME_STRING_LITERAL "hello";
Paul Kehrerccd9c002013-12-27 20:25:06 -0600157
158...it should be added to the bindings like so:
159
160.. code-block:: c
161
Alex Stapleton9020b482013-12-28 16:28:59 +0000162 static const int SOME_INTEGER_LITERAL;
163 static const unsigned int SOME_UNSIGNED_INTEGER_LITERAL;
164 static const char *const SOME_STRING_LITERAL;
Paul Kehrerccd9c002013-12-27 20:25:06 -0600165
Alex Gaynorc72e63f2013-09-09 21:44:26 -0700166Documentation
167-------------
168
169All features should be documented with prose.
170
171Docstrings should be written like this:
172
173.. code-block:: python
174
175 def some_function(some_arg):
176 """
177 Does some things.
178
179 :param some_arg: Some argument.
180 """
181
182So, specifically:
183
Alex Gaynor05a190e2013-10-29 17:11:25 -0700184* Always use three double quotes.
185* Put the three double quotes on their own line.
186* No blank line at the end.
187* Use Sphinx parameter/attribute documentation `syntax`_.
188
Alex Gaynora6596882013-11-13 12:54:03 -0800189Because of the inherent challenges in implementing correct cryptographic
Alex Gaynore9d64d72013-11-13 10:28:01 -0800190systems, we want to make our documentation point people in the right directions
191as much as possible. To that end:
192
193* When documenting a generic interface, use a strong algorithm in examples.
194 (e.g. when showing a hashing example, don't use
Alex Gaynor15cf6b92013-12-21 19:22:39 -0800195 :class:`~cryptography.hazmat.primitives.hashes.MD5`)
Alex Gaynor5cbab0c2013-11-13 11:55:57 -0800196* When giving prescriptive advice, always provide references and supporting
Alex Gaynore9d64d72013-11-13 10:28:01 -0800197 material.
Alex Gaynord118c912013-11-13 11:56:49 -0800198* When there is real disagreement between cryptographic experts, represent both
Alex Gaynor54e04002013-11-15 16:44:41 -0800199 sides of the argument and describe the trade-offs clearly.
Alex Gaynore9d64d72013-11-13 10:28:01 -0800200
Alex Gaynor05a190e2013-10-29 17:11:25 -0700201When documenting a new module in the ``hazmat`` package, its documentation
202should begin with the "Hazardous Materials" warning:
203
204.. code-block:: rest
205
206 .. hazmat::
Alex Gaynorc72e63f2013-09-09 21:44:26 -0700207
Alex Gaynor953ebf82013-12-08 10:28:30 -0800208When referring to a hypothetical individual (such as "a person receiving an
209encrypted message") use gender neutral pronouns (they/them/their).
210
Richard Wall40cde822013-10-01 20:20:15 +0100211Development Environment
212-----------------------
Richard Wall0d9bb142013-10-01 16:17:24 +0100213
214Working on ``cryptography`` requires the installation of a small number of
Alex Gaynor166cbd32013-10-01 13:30:29 -0700215development dependencies. These are listed in ``dev-requirements.txt`` and they
216can be installed in a `virtualenv`_ using `pip`_. Once you've installed the
217dependencies, install ``cryptography`` in ``editable`` mode. For example:
Richard Wall0d9bb142013-10-01 16:17:24 +0100218
Alex Gaynorae5c9072013-10-06 11:04:08 -0700219.. code-block:: console
Richard Wall0d9bb142013-10-01 16:17:24 +0100220
Alex Gaynor7587ded2013-10-06 12:14:05 -0700221 $ # Create a virtualenv and activate it
Richard Wall7d4ca1e2013-10-01 21:10:45 +0100222 $ pip install --requirement dev-requirements.txt
223 $ pip install --editable .
Richard Wall0d9bb142013-10-01 16:17:24 +0100224
225You are now ready to run the tests and build the documentation.
Richard Wall0d9bb142013-10-01 16:17:24 +0100226
Richard Wall40cde822013-10-01 20:20:15 +0100227Running Tests
Alex Gaynor5246e2d2013-12-12 12:23:18 -0800228~~~~~~~~~~~~~
Richard Wall0d9bb142013-10-01 16:17:24 +0100229
Alex Gaynor166cbd32013-10-01 13:30:29 -0700230``cryptography`` unit tests are found in the ``tests/`` directory and are
231designed to be run using `pytest`_. `pytest`_ will discover the tests
232automatically, so all you have to do is:
Richard Wall0d9bb142013-10-01 16:17:24 +0100233
Alex Gaynorae5c9072013-10-06 11:04:08 -0700234.. code-block:: console
Richard Wall0d9bb142013-10-01 16:17:24 +0100235
Richard Wall7d4ca1e2013-10-01 21:10:45 +0100236 $ py.test
Richard Wall0d9bb142013-10-01 16:17:24 +0100237 ...
Alex Gaynor15cf6b92013-12-21 19:22:39 -0800238 62746 passed in 220.43 seconds
Richard Wall0d9bb142013-10-01 16:17:24 +0100239
240This runs the tests with the default Python interpreter.
241
242You can also verify that the tests pass on other supported Python interpreters.
Richard Wallc3d1eb52013-10-01 16:29:07 +0100243For this we use `tox`_, which will automatically create a `virtualenv`_ for
Richard Wall40cde822013-10-01 20:20:15 +0100244each supported Python version and run the tests. For example:
Richard Wall0d9bb142013-10-01 16:17:24 +0100245
Alex Gaynorae5c9072013-10-06 11:04:08 -0700246.. code-block:: console
Richard Wall0d9bb142013-10-01 16:17:24 +0100247
Richard Wall7d4ca1e2013-10-01 21:10:45 +0100248 $ tox
Richard Wall0d9bb142013-10-01 16:17:24 +0100249 ...
Richard Wall40cde822013-10-01 20:20:15 +0100250 ERROR: py26: InterpreterNotFound: python2.6
251 py27: commands succeeded
252 ERROR: pypy: InterpreterNotFound: pypy
253 ERROR: py32: InterpreterNotFound: python3.2
254 py33: commands succeeded
255 docs: commands succeeded
256 pep8: commands succeeded
Richard Wall0d9bb142013-10-01 16:17:24 +0100257
Alex Gaynor166cbd32013-10-01 13:30:29 -0700258You may not have all the required Python versions installed, in which case you
259will see one or more ``InterpreterNotFound`` errors.
Richard Wall0d9bb142013-10-01 16:17:24 +0100260
Paul Kehrer2502ce52014-01-18 09:32:47 -0600261
262Explicit Backend Selection
263~~~~~~~~~~~~~~~~~~~~~~~~~~
264
265While testing you may want to run tests against a subset of the backends that
266cryptography supports. Explicit backend selection can be done via the
267``--backend`` flag. This flag should be passed to ``py.test`` with a comma
268delimited list of backend names. To use it with ``tox`` you must pass it as
Paul Kehrerad4f6462014-01-20 09:36:57 -0600269``tox -- --backend=openssl``.
Paul Kehrer2502ce52014-01-18 09:32:47 -0600270
Richard Wall0d9bb142013-10-01 16:17:24 +0100271Building Documentation
Alex Gaynor5246e2d2013-12-12 12:23:18 -0800272~~~~~~~~~~~~~~~~~~~~~~
Richard Wall0d9bb142013-10-01 16:17:24 +0100273
Alex Gaynor166cbd32013-10-01 13:30:29 -0700274``cryptography`` documentation is stored in the ``docs/`` directory. It is
275written in `reStructured Text`_ and rendered using `Sphinx`_.
Richard Wall0d9bb142013-10-01 16:17:24 +0100276
Richard Wall7d4ca1e2013-10-01 21:10:45 +0100277Use `tox`_ to build the documentation. For example:
Richard Wall0d9bb142013-10-01 16:17:24 +0100278
Alex Gaynorae5c9072013-10-06 11:04:08 -0700279.. code-block:: console
Richard Wall0d9bb142013-10-01 16:17:24 +0100280
Richard Wall7d4ca1e2013-10-01 21:10:45 +0100281 $ tox -e docs
Richard Wall0d9bb142013-10-01 16:17:24 +0100282 ...
Richard Wallc3d1eb52013-10-01 16:29:07 +0100283 docs: commands succeeded
Richard Wall0d9bb142013-10-01 16:17:24 +0100284 congratulations :)
285
Alex Gaynor15cf6b92013-12-21 19:22:39 -0800286The HTML documentation index can now be found at
287``docs/_build/html/index.html``.
Richard Wall40cde822013-10-01 20:20:15 +0100288
Alex Gaynorc72e63f2013-09-09 21:44:26 -0700289
Donald Stufft85707942013-10-04 23:55:27 -0400290.. _`GitHub`: https://github.com/pyca/cryptography
Alex Gaynorc72e63f2013-09-09 21:44:26 -0700291.. _`our mailing list`: https://mail.python.org/mailman/listinfo/cryptography-dev
Alex Gaynora54dcde2014-02-05 15:04:51 -0800292.. _`Write comments as complete sentences.`: http://nedbatchelder.com/blog/201401/comments_should_be_sentences.html
Alex Gaynorc72e63f2013-09-09 21:44:26 -0700293.. _`syntax`: http://sphinx-doc.org/domains.html#info-field-lists
Richard Wallc3d1eb52013-10-01 16:29:07 +0100294.. _`pytest`: https://pypi.python.org/pypi/pytest
295.. _`tox`: https://pypi.python.org/pypi/tox
296.. _`virtualenv`: https://pypi.python.org/pypi/virtualenv
297.. _`pip`: https://pypi.python.org/pypi/pip
Alex Gaynor3c1eb122014-01-23 07:46:21 -0600298.. _`sphinx`: https://pypi.python.org/pypi/Sphinx
Alex Gaynora05358d2013-11-06 11:01:22 -0800299.. _`reStructured Text`: http://sphinx-doc.org/rest.html