Gather all ingredients. Preheat the oven to 350 degrees F (175 degrees C). Butter and flour two 9x2-inch round cake pans.
Sift 3 cups flour, 2 cups sugar, cocoa powder, baking soda, baking powder, and 1 ½ teaspoons salt together in a bowl; set aside.
Whisk eggs in a large bowl until smooth. Add oil, buttermilk, sour cream, food coloring, 1 tablespoon vanilla extract, and vinegar; whisk until combined.
Add flour mixture in 3 batches; mix by hand as little as possible so as not to over beat. If using an electric mixer, add flour mixture and mix until just incorporated. Divide batter evenly between the prepared pans.
Bake in the preheated oven until a toothpick inserted into the center comes out clean, 35 to 40 minutes.
Cool in the pans for 10 minutes, then remove from pans to cool completely on a wire rack, 20 to 30 minutes more.
Meanwhile, make the cream cheese frosting: Whip cream cheese in a bowl using an electric mixer on high speed until light and fluffy, about 5 minutes. Scrape into a different bowl.
Sift remaining 1 cup sugar, remaining ¼ cup flour, and remaining ½ teaspoon salt together in a medium saucepan. Heat over medium-high heat; whisk in milk and remaining 1 teaspoon vanilla extract slowly until there are no lumps. Cook until starts to bubble and becomes thick and pudding-like, 7 to 8 minutes.
Pour into a mixing bowl; refrigerate for 10 minutes.
Whisk chilled mixture using an electric mixer with a whisk attachment for 5 minutes. Add whipped cream cheese slowly, whisking until becomes a smooth frosting, about 5 minutes more.
Frost cooled cake. Enjoy!
