crypto: rsa - Store rest of the private key components
authorSalvatore Benedetto <salvatore.benedetto@intel.com>
Mon, 4 Jul 2016 16:21:38 +0000 (17:21 +0100)
committerHerbert Xu <herbert@gondor.apana.org.au>
Tue, 5 Jul 2016 15:05:26 +0000 (23:05 +0800)
When parsing a private key, store all non-optional fields. These
are required for enabling CRT mode for decrypt and verify

Signed-off-by: Salvatore Benedetto <salvatore.benedetto@intel.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
crypto/rsa_helper.c
crypto/rsaprivkey.asn1
include/crypto/internal/rsa.h

index 583656af4fe288cfe886b9040814c84271dee8c2..4df6451e7543670f7836c2507e77d7329d65b10f 100644 (file)
@@ -78,6 +78,81 @@ int rsa_get_d(void *context, size_t hdrlen, unsigned char tag,
        return 0;
 }
 
+int rsa_get_p(void *context, size_t hdrlen, unsigned char tag,
+             const void *value, size_t vlen)
+{
+       struct rsa_key *key = context;
+
+       /* invalid key provided */
+       if (!value || !vlen || vlen > key->n_sz)
+               return -EINVAL;
+
+       key->p = value;
+       key->p_sz = vlen;
+
+       return 0;
+}
+
+int rsa_get_q(void *context, size_t hdrlen, unsigned char tag,
+             const void *value, size_t vlen)
+{
+       struct rsa_key *key = context;
+
+       /* invalid key provided */
+       if (!value || !vlen || vlen > key->n_sz)
+               return -EINVAL;
+
+       key->q = value;
+       key->q_sz = vlen;
+
+       return 0;
+}
+
+int rsa_get_dp(void *context, size_t hdrlen, unsigned char tag,
+              const void *value, size_t vlen)
+{
+       struct rsa_key *key = context;
+
+       /* invalid key provided */
+       if (!value || !vlen || vlen > key->n_sz)
+               return -EINVAL;
+
+       key->dp = value;
+       key->dp_sz = vlen;
+
+       return 0;
+}
+
+int rsa_get_dq(void *context, size_t hdrlen, unsigned char tag,
+              const void *value, size_t vlen)
+{
+       struct rsa_key *key = context;
+
+       /* invalid key provided */
+       if (!value || !vlen || vlen > key->n_sz)
+               return -EINVAL;
+
+       key->dq = value;
+       key->dq_sz = vlen;
+
+       return 0;
+}
+
+int rsa_get_qinv(void *context, size_t hdrlen, unsigned char tag,
+                const void *value, size_t vlen)
+{
+       struct rsa_key *key = context;
+
+       /* invalid key provided */
+       if (!value || !vlen || vlen > key->n_sz)
+               return -EINVAL;
+
+       key->qinv = value;
+       key->qinv_sz = vlen;
+
+       return 0;
+}
+
 /**
  * rsa_parse_pub_key() - decodes the BER encoded buffer and stores in the
  *                       provided struct rsa_key, pointers to the raw key as is,
index 731aea5edb0cb0b98cb6d95f2d41e7889d84b0b9..4ce06758e8af758de779b276663e5c7d6118e470 100644 (file)
@@ -3,9 +3,9 @@ RsaPrivKey ::= SEQUENCE {
        n               INTEGER ({ rsa_get_n }),
        e               INTEGER ({ rsa_get_e }),
        d               INTEGER ({ rsa_get_d }),
-       prime1          INTEGER,
-       prime2          INTEGER,
-       exponent1       INTEGER,
-       exponent2       INTEGER,
-       coefficient     INTEGER
+       prime1          INTEGER ({ rsa_get_p }),
+       prime2          INTEGER ({ rsa_get_q }),
+       exponent1       INTEGER ({ rsa_get_dp }),
+       exponent2       INTEGER ({ rsa_get_dq }),
+       coefficient     INTEGER ({ rsa_get_qinv })
 }
index d6c042a2ee52a5692ea2d486e0072d1e972a749e..9e8f1590de98026f616f93dddbcbd89fe27af61f 100644 (file)
  * @n           : RSA modulus raw byte stream
  * @e           : RSA public exponent raw byte stream
  * @d           : RSA private exponent raw byte stream
+ * @p           : RSA prime factor p of n raw byte stream
+ * @q           : RSA prime factor q of n raw byte stream
+ * @dp          : RSA exponent d mod (p - 1) raw byte stream
+ * @dq          : RSA exponent d mod (q - 1) raw byte stream
+ * @qinv        : RSA CRT coefficient q^(-1) mod p raw byte stream
  * @n_sz        : length in bytes of RSA modulus n
  * @e_sz        : length in bytes of RSA public exponent
  * @d_sz        : length in bytes of RSA private exponent
+ * @p_sz        : length in bytes of p field
+ * @q_sz        : length in bytes of q field
+ * @dp_sz       : length in bytes of dp field
+ * @dq_sz       : length in bytes of dq field
+ * @qinv_sz     : length in bytes of qinv field
  */
 struct rsa_key {
        const u8 *n;
        const u8 *e;
        const u8 *d;
+       const u8 *p;
+       const u8 *q;
+       const u8 *dp;
+       const u8 *dq;
+       const u8 *qinv;
        size_t n_sz;
        size_t e_sz;
        size_t d_sz;
+       size_t p_sz;
+       size_t q_sz;
+       size_t dp_sz;
+       size_t dq_sz;
+       size_t qinv_sz;
 };
 
 int rsa_parse_pub_key(struct rsa_key *rsa_key, const void *key,