Implement |DES_ede2_cbc_encrypt|.

Change-Id: I0d2a09242e2d5092ee7facab4729e9af36d9d548
Reviewed-on: https://boringssl-review.googlesource.com/4752
Reviewed-by: Adam Langley <agl@google.com>
diff --git a/crypto/des/des.c b/crypto/des/des.c
index 56a2996..9cd75f5 100644
--- a/crypto/des/des.c
+++ b/crypto/des/des.c
@@ -762,3 +762,11 @@
 
   tin[0] = tin[1] = 0;
 }
+
+void DES_ede2_cbc_encrypt(const uint8_t *in, uint8_t *out, size_t len,
+                          const DES_key_schedule *ks1,
+                          const DES_key_schedule *ks2,
+                          DES_cblock *ivec,
+                          int enc) {
+  DES_ede3_cbc_encrypt(in, out, len, ks1, ks2, ks1, ivec, enc);
+}
diff --git a/include/openssl/des.h b/include/openssl/des.h
index f3804c3..6e1b0cf 100644
--- a/include/openssl/des.h
+++ b/include/openssl/des.h
@@ -131,6 +131,16 @@
                                          const DES_key_schedule *ks3,
                                          DES_cblock *ivec, int enc);
 
+/* DES_ede2_cbc_encrypt encrypts (or decrypts, if |enc| is |DES_DECRYPT|) |len|
+ * bytes from |in| to |out| with 3DES in CBC mode. With this keying option, the
+ * first and third 3DES keys are identical. Thus, this function takes only two
+ * different |DES_key_schedule|s. */
+OPENSSL_EXPORT void DES_ede2_cbc_encrypt(const uint8_t *in, uint8_t *out,
+                                         size_t len,
+                                         const DES_key_schedule *ks1,
+                                         const DES_key_schedule *ks2,
+                                         DES_cblock *ivec, int enc);
+
 
 #if defined(__cplusplus)
 }  /* extern C */