Fixed buffer overflow in private key decoding (wrong buffer length used in size check).
[BearSSL] / src / ssl / ssl_engine_default_aesgcm.c
index 9968342..c44a707 100644 (file)
@@ -28,7 +28,7 @@
 void
 br_ssl_engine_set_default_aes_gcm(br_ssl_engine_context *cc)
 {
-#if BR_AES_X86NI
+#if BR_AES_X86NI || BR_POWER8
        const br_block_ctr_class *ictr;
        br_ghash ighash;
 #endif
@@ -47,6 +47,17 @@ br_ssl_engine_set_default_aes_gcm(br_ssl_engine_context *cc)
                br_ssl_engine_set_aes_ctr(cc, &br_aes_ct_ctr_vtable);
 #endif
        }
+#elif BR_POWER8
+       ictr = br_aes_pwr8_ctr_get_vtable();
+       if (ictr != NULL) {
+               br_ssl_engine_set_aes_ctr(cc, ictr);
+       } else {
+#if BR_64
+               br_ssl_engine_set_aes_ctr(cc, &br_aes_ct64_ctr_vtable);
+#else
+               br_ssl_engine_set_aes_ctr(cc, &br_aes_ct_ctr_vtable);
+#endif
+       }
 #else
 #if BR_64
        br_ssl_engine_set_aes_ctr(cc, &br_aes_ct64_ctr_vtable);
@@ -61,6 +72,13 @@ br_ssl_engine_set_default_aes_gcm(br_ssl_engine_context *cc)
                return;
        }
 #endif
+#if BR_POWER8
+       ighash = br_ghash_pwr8_get();
+       if (ighash != 0) {
+               br_ssl_engine_set_ghash(cc, ighash);
+               return;
+       }
+#endif
 #if BR_LOMUL
        br_ssl_engine_set_ghash(cc, &br_ghash_ctmul32);
 #elif BR_64