File Coverage

src/x509/encode_rsa_rawder.c
Criterion Covered Total %
statement 0 23 0.0
branch 0 6 0.0
condition n/a
subroutine n/a
pod n/a
total 0 29 0.0


line stmt bran cond sub pod time code
1             /*
2             * Copyright (c) 2018 Thomas Pornin
3             *
4             * Permission is hereby granted, free of charge, to any person obtaining
5             * a copy of this software and associated documentation files (the
6             * "Software"), to deal in the Software without restriction, including
7             * without limitation the rights to use, copy, modify, merge, publish,
8             * distribute, sublicense, and/or sell copies of the Software, and to
9             * permit persons to whom the Software is furnished to do so, subject to
10             * the following conditions:
11             *
12             * The above copyright notice and this permission notice shall be
13             * included in all copies or substantial portions of the Software.
14             *
15             * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16             * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17             * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18             * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
19             * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
20             * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
21             * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22             * SOFTWARE.
23             */
24              
25             #include "inner.h"
26              
27             /* see bearssl_x509.h */
28             size_t
29 0           br_encode_rsa_raw_der(void *dest, const br_rsa_private_key *sk,
30             const br_rsa_public_key *pk, const void *d, size_t dlen)
31             {
32             /*
33             * ASN.1 format:
34             *
35             * RSAPrivateKey ::= SEQUENCE {
36             * version Version,
37             * modulus INTEGER, -- n
38             * publicExponent INTEGER, -- e
39             * privateExponent INTEGER, -- d
40             * prime1 INTEGER, -- p
41             * prime2 INTEGER, -- q
42             * exponent1 INTEGER, -- d mod (p-1)
43             * exponent2 INTEGER, -- d mod (q-1)
44             * coefficient INTEGER, -- (inverse of q) mod p
45             * otherPrimeInfos OtherPrimeInfos OPTIONAL
46             * }
47             *
48             * The 'version' field is an INTEGER of value 0 (meaning: there
49             * are exactly two prime factors), and 'otherPrimeInfos' will
50             * be absent (because there are exactly two prime factors).
51             */
52              
53             br_asn1_uint num[9];
54             size_t u, slen;
55              
56             /*
57             * For all INTEGER values, get the pointer and length for the
58             * data bytes.
59             */
60 0           num[0] = br_asn1_uint_prepare(NULL, 0);
61 0           num[1] = br_asn1_uint_prepare(pk->n, pk->nlen);
62 0           num[2] = br_asn1_uint_prepare(pk->e, pk->elen);
63 0           num[3] = br_asn1_uint_prepare(d, dlen);
64 0           num[4] = br_asn1_uint_prepare(sk->p, sk->plen);
65 0           num[5] = br_asn1_uint_prepare(sk->q, sk->qlen);
66 0           num[6] = br_asn1_uint_prepare(sk->dp, sk->dplen);
67 0           num[7] = br_asn1_uint_prepare(sk->dq, sk->dqlen);
68 0           num[8] = br_asn1_uint_prepare(sk->iq, sk->iqlen);
69              
70             /*
71             * Get the length of the SEQUENCE contents.
72             */
73 0           slen = 0;
74 0 0         for (u = 0; u < 9; u ++) {
75             uint32_t ilen;
76              
77 0           ilen = num[u].asn1len;
78 0           slen += 1 + len_of_len(ilen) + ilen;
79             }
80              
81 0 0         if (dest == NULL) {
82 0           return 1 + len_of_len(slen) + slen;
83             } else {
84             unsigned char *buf;
85             size_t lenlen;
86              
87 0           buf = dest;
88 0           *buf ++ = 0x30; /* SEQUENCE tag */
89 0           lenlen = br_asn1_encode_length(buf, slen);
90 0           buf += lenlen;
91 0 0         for (u = 0; u < 9; u ++) {
92 0           buf += br_asn1_encode_uint(buf, num[u]);
93             }
94 0           return 1 + lenlen + slen;
95             }
96             }