blob: 4c88945e551d1ffb2f3a80e0912dff26ff3ed848 [file] [log] [blame] [view]
David Benjamin0e3f1d82015-09-03 11:59:44 -04001# BoringSSL Style Guide
2
3BoringSSL usually follows the
David Benjaminecc25912015-10-30 16:31:40 -04004[Google C++ style guide](https://google.github.io/styleguide/cppguide.html),
David Benjamin0e3f1d82015-09-03 11:59:44 -04005The rest of this document describes differences and clarifications on
6top of the base guide.
7
8
9## Legacy code
10
11As a derivative of OpenSSL, BoringSSL contains a lot of legacy code that
12does not follow this style guide. Particularly where public API is
13concerned, balance consistency within a module with the benefits of a
14given rule. Module-wide deviations on naming should be respected while
15integer and return value conventions take precedence over consistency.
16
David Benjamin1a88df12016-06-02 17:14:33 -040017Modules from OpenSSL's legacy ASN.1 and X.509 stack are retained for
18compatibility and left largely unmodified. To ease importing patches from
19upstream, they match OpenSSL's new indentation style. For Emacs,
20`doc/openssl-c-indent.el` from OpenSSL may be helpful in this.
David Benjamin0e3f1d82015-09-03 11:59:44 -040021
22
23## Language
24
25The majority of the project is in C, so C++-specific rules in the
26Google style guide do not apply. Support for C99 features depends on
27our target platforms. Typically, Chromium's target MSVC is the most
28restrictive.
29
David Benjamin0ee31932016-07-11 19:38:56 -040030Variable declarations in the middle of a function or inside a `for` loop are
31allowed and preferred where possible. Note that the common `goto err` cleanup
32pattern requires lifting some variable declarations.
David Benjamin0e3f1d82015-09-03 11:59:44 -040033
34Comments should be `/* C-style */` for consistency.
35
36When declaration pointer types, `*` should be placed next to the variable
37name, not the type. So
38
39 uint8_t *ptr;
40
41not
42
43 uint8_t* ptr;
44
45Rather than `malloc()` and `free()`, use the wrappers `OPENSSL_malloc()`
46and `OPENSSL_free()`. Use the standard C `assert()` function freely.
47
48For new constants, prefer enums when the values are sequential and typed
49constants for flags. If adding values to an existing set of `#define`s,
50continue with `#define`.
51
52
53## Formatting
54
55Single-statement blocks are not allowed. All conditions and loops must
56use braces:
57
58 if (foo) {
59 do_something();
60 }
61
62not
63
64 if (foo)
65 do_something();
66
67
68## Integers
69
70Prefer using explicitly-sized integers where appropriate rather than
71generic C ones. For instance, to represent a byte, use `uint8_t`, not
72`unsigned char`. Likewise, represent a two-byte field as `uint16_t`, not
73`unsigned short`.
74
75Sizes are represented as `size_t`.
76
77Within a struct that is retained across the lifetime of an SSL
78connection, if bounds of a size are known and it's easy, use a smaller
79integer type like `uint8_t`. This is a "free" connection footprint
80optimization for servers. Don't make code significantly more complex for
81it, and do still check the bounds when passing in and out of the
82struct. This narrowing should not propagate to local variables and
83function parameters.
84
85When doing arithmetic, account for overflow conditions.
86
87Except with platform APIs, do not use `ssize_t`. MSVC lacks it, and
88prefer out-of-band error signaling for `size_t` (see Return values).
89
90
91## Naming
92
93Follow Google naming conventions in C++ files. In C files, use the
94following naming conventions for consistency with existing OpenSSL and C
95styles:
96
97Define structs with typedef named `TYPE_NAME`. The corresponding struct
98should be named `struct type_name_st`.
99
100Name public functions as `MODULE_function_name`, unless the module
101already uses a different naming scheme for legacy reasons. The module
102name should be a type name if the function is a method of a particular
103type.
104
105Some types are allocated within the library while others are initialized
106into a struct allocated by the caller, often on the stack. Name these
107functions `TYPE_NAME_new`/`TYPE_NAME_free` and
108`TYPE_NAME_init`/`TYPE_NAME_cleanup`, respectively. All `TYPE_NAME_free`
109functions must do nothing on `NULL` input.
110
111If a variable is the length of a pointer value, it has the suffix
112`_len`. An output parameter is named `out` or has an `out_` prefix. For
113instance, For instance:
114
115 uint8_t *out,
116 size_t *out_len,
117 const uint8_t *in,
118 size_t in_len,
119
120Name public headers like `include/openssl/evp.h` with header guards like
121`OPENSSL_HEADER_EVP_H`. Name internal headers like
122`crypto/ec/internal.h` with header guards like
123`OPENSSL_HEADER_EC_INTERNAL_H`.
124
125Name enums like `enum unix_hacker_t`. For instance:
126
127 enum should_free_handshake_buffer_t {
128 free_handshake_buffer,
129 dont_free_handshake_buffer,
130 };
131
132
133## Return values
134
135As even `malloc` may fail in BoringSSL, the vast majority of functions
136will have a failure case. Functions should return `int` with one on
137success and zero on error. Do not overload the return value to both
138signal success/failure and output an integer. For example:
139
140 OPENSSL_EXPORT int CBS_get_u16(CBS *cbs, uint16_t *out);
141
142If a function needs more than a true/false result code, define an enum
143rather than arbitrarily assigning meaning to int values.
144
145If a function outputs a pointer to an object on success and there are no
146other outputs, return the pointer directly and `NULL` on error.
147
148
149## Parameters
150
151Where not constrained by legacy code, parameter order should be:
152
1531. context parameters
1542. output parameters
1553. input parameters
156
157For example,
158
159 /* CBB_add_asn sets |*out_contents| to a |CBB| into which the contents of an
160 * ASN.1 object can be written. The |tag| argument will be used as the tag for
161 * the object. It returns one on success or zero on error. */
David Benjamin1db42fb2016-08-19 16:08:45 -0400162 OPENSSL_EXPORT int CBB_add_asn1(CBB *cbb, CBB *out_contents, unsigned tag);
David Benjamin0e3f1d82015-09-03 11:59:44 -0400163
164
165## Documentation
166
167All public symbols must have a documentation comment in their header
168file. The style is based on that of Go. The first sentence begins with
169the symbol name, optionally prefixed with "A" or "An". Apart from the
170initial mention of symbol, references to other symbols or parameter
171names should be surrounded by |pipes|.
172
173Documentation should be concise but completely describe the exposed
174behavior of the function. Pay special note to success/failure behaviors
175and caller obligations on object lifetimes. If this sacrifices
176conciseness, consider simplifying the function's behavior.
177
178 /* EVP_DigestVerifyUpdate appends |len| bytes from |data| to the data which
179 * will be verified by |EVP_DigestVerifyFinal|. It returns one on success and
180 * zero otherwise. */
181 OPENSSL_EXPORT int EVP_DigestVerifyUpdate(EVP_MD_CTX *ctx, const void *data,
182 size_t len);
183
184Explicitly mention any surprising edge cases or deviations from common
185return value patterns in legacy functions.
186
187 /* RSA_private_encrypt encrypts |flen| bytes from |from| with the private key in
188 * |rsa| and writes the encrypted data to |to|. The |to| buffer must have at
189 * least |RSA_size| bytes of space. It returns the number of bytes written, or
190 * -1 on error. The |padding| argument must be one of the |RSA_*_PADDING|
191 * values. If in doubt, |RSA_PKCS1_PADDING| is the most common.
192 *
193 * WARNING: this function is dangerous because it breaks the usual return value
194 * convention. Use |RSA_sign_raw| instead. */
195 OPENSSL_EXPORT int RSA_private_encrypt(int flen, const uint8_t *from,
196 uint8_t *to, RSA *rsa, int padding);
197
198Document private functions in their `internal.h` header or, if static,
199where defined.