La forma en que lo hice funcionar es copiando la implementación de SSL_write y modificando manualmente el relleno después del cifrado. SSL_write utiliza otras funciones no públicas (de un par de archivos) y algunas macros, que también deben copiarse. La implementación correcta del protocolo TLS debe verificar el tamaño del relleno y todos los bytes deben establecerse en el mismo valor (de manera predeterminada, son ceros en OpenSSL). Las implementaciones vulnerables de Poodle TLS no verifican el contenido ni el tamaño del relleno. Así que acabo de agregar un bloque adicional con basura al relleno existente en la función de cifrado. Si la implementación de TLS no es vulnerable, el servidor abortará la conexión o continuará si es vulnerable.
// increase padding size
i += bs;
// fill padding with junk to test TLS protocol compliance
for(size_t j = 0; j < i; ++j) {
rec->input[rec->length + j] = rand() % 256;
}
rec->length += i;
rec->input[l - 1] = (i - 1);