Signed Contextual Ads interface

Contextual Ads need to be signed to join auction by its buyer. See
go/rb-signatures-lld for more details.

Bug: 301520360
Test: atest SignedContextualAds
Change-Id: Ia940974100d75f86860105c32799c8108d710c1b
diff --git a/adservices/framework/java/android/adservices/adselection/AdSelectionConfig.java b/adservices/framework/java/android/adservices/adselection/AdSelectionConfig.java
index 3d6f1f1..7b0b1b5 100644
--- a/adservices/framework/java/android/adservices/adselection/AdSelectionConfig.java
+++ b/adservices/framework/java/android/adservices/adselection/AdSelectionConfig.java
@@ -52,7 +52,7 @@
     @NonNull private final AdSelectionSignals mAdSelectionSignals;
     @NonNull private final AdSelectionSignals mSellerSignals;
     @NonNull private final Map<AdTechIdentifier, AdSelectionSignals> mPerBuyerSignals;
-    @NonNull private final Map<AdTechIdentifier, ContextualAds> mBuyerContextualAds;
+    @NonNull private final Map<AdTechIdentifier, SignedContextualAds> mBuyerSignedContextualAds;
     @NonNull private final Uri mTrustedScoringSignalsUri;
 
     @NonNull
@@ -77,7 +77,7 @@
         this.mAdSelectionSignals = AdSelectionSignals.EMPTY;
         this.mSellerSignals = AdSelectionSignals.EMPTY;
         this.mPerBuyerSignals = Collections.emptyMap();
-        this.mBuyerContextualAds = Collections.emptyMap();
+        this.mBuyerSignedContextualAds = Collections.emptyMap();
         this.mTrustedScoringSignalsUri = Uri.EMPTY;
     }
 
@@ -88,7 +88,7 @@
             @NonNull AdSelectionSignals adSelectionSignals,
             @NonNull AdSelectionSignals sellerSignals,
             @NonNull Map<AdTechIdentifier, AdSelectionSignals> perBuyerSignals,
-            @NonNull Map<AdTechIdentifier, ContextualAds> perBuyerContextualAds,
+            @NonNull Map<AdTechIdentifier, SignedContextualAds> perBuyerSignedContextualAds,
             @NonNull Uri trustedScoringSignalsUri) {
         this.mSeller = seller;
         this.mDecisionLogicUri = decisionLogicUri;
@@ -96,7 +96,7 @@
         this.mAdSelectionSignals = adSelectionSignals;
         this.mSellerSignals = sellerSignals;
         this.mPerBuyerSignals = perBuyerSignals;
-        this.mBuyerContextualAds = perBuyerContextualAds;
+        this.mBuyerSignedContextualAds = perBuyerSignedContextualAds;
         this.mTrustedScoringSignalsUri = trustedScoringSignalsUri;
     }
 
@@ -110,9 +110,9 @@
         mPerBuyerSignals =
                 AdServicesParcelableUtil.readMapFromParcel(
                         in, AdTechIdentifier::fromString, AdSelectionSignals.class);
-        mBuyerContextualAds =
+        mBuyerSignedContextualAds =
                 AdServicesParcelableUtil.readMapFromParcel(
-                        in, AdTechIdentifier::fromString, ContextualAds.class);
+                        in, AdTechIdentifier::fromString, SignedContextualAds.class);
         mTrustedScoringSignalsUri = Uri.CREATOR.createFromParcel(in);
     }
 
@@ -131,7 +131,7 @@
         mAdSelectionSignals.writeToParcel(dest, flags);
         mSellerSignals.writeToParcel(dest, flags);
         AdServicesParcelableUtil.writeMapToParcel(dest, mPerBuyerSignals);
-        AdServicesParcelableUtil.writeMapToParcel(dest, mBuyerContextualAds);
+        AdServicesParcelableUtil.writeMapToParcel(dest, mBuyerSignedContextualAds);
         mTrustedScoringSignalsUri.writeToParcel(dest, flags);
     }
 
@@ -146,7 +146,7 @@
                 && Objects.equals(mAdSelectionSignals, that.mAdSelectionSignals)
                 && Objects.equals(mSellerSignals, that.mSellerSignals)
                 && Objects.equals(mPerBuyerSignals, that.mPerBuyerSignals)
-                && Objects.equals(mBuyerContextualAds, that.mBuyerContextualAds)
+                && Objects.equals(mBuyerSignedContextualAds, that.mBuyerSignedContextualAds)
                 && Objects.equals(mTrustedScoringSignalsUri, that.mTrustedScoringSignalsUri);
     }
 
@@ -159,7 +159,7 @@
                 mAdSelectionSignals,
                 mSellerSignals,
                 mPerBuyerSignals,
-                mBuyerContextualAds,
+                mBuyerSignedContextualAds,
                 mTrustedScoringSignalsUri);
     }
 
@@ -171,7 +171,7 @@
     public AdSelectionConfig.Builder cloneToBuilder() {
         return new AdSelectionConfig.Builder()
                 .setSeller(this.getSeller())
-                .setBuyerContextualAds(this.getBuyerContextualAds())
+                .setBuyerSignedContextualAds(this.getBuyerSignedContextualAds())
                 .setAdSelectionSignals(this.getAdSelectionSignals())
                 .setCustomAudienceBuyers(this.getCustomAudienceBuyers())
                 .setDecisionLogicUri(this.getDecisionLogicUri())
@@ -242,8 +242,8 @@
      * @hide
      */
     @NonNull
-    public Map<AdTechIdentifier, ContextualAds> getBuyerContextualAds() {
-        return mBuyerContextualAds;
+    public Map<AdTechIdentifier, SignedContextualAds> getBuyerSignedContextualAds() {
+        return mBuyerSignedContextualAds;
     }
 
     /**
@@ -263,7 +263,8 @@
         private AdSelectionSignals mAdSelectionSignals = AdSelectionSignals.EMPTY;
         private AdSelectionSignals mSellerSignals = AdSelectionSignals.EMPTY;
         private Map<AdTechIdentifier, AdSelectionSignals> mPerBuyerSignals = Collections.emptyMap();
-        private Map<AdTechIdentifier, ContextualAds> mBuyerContextualAds = Collections.emptyMap();
+        private Map<AdTechIdentifier, SignedContextualAds> mBuyerSignedContextualAds =
+                Collections.emptyMap();
         private Uri mTrustedScoringSignalsUri;
 
         public Builder() {}
@@ -383,16 +384,16 @@
          *
          * <p>If not set, defaults to an empty map.
          *
-         * <p>See {@link #getBuyerContextualAds()} ()} for more details.
+         * <p>See {@link #getBuyerSignedContextualAds()} ()} for more details.
          *
          * @hide
          */
         @NonNull
-        public AdSelectionConfig.Builder setBuyerContextualAds(
-                @NonNull Map<AdTechIdentifier, ContextualAds> buyerContextualAds) {
-            Objects.requireNonNull(buyerContextualAds);
+        public AdSelectionConfig.Builder setBuyerSignedContextualAds(
+                @NonNull Map<AdTechIdentifier, SignedContextualAds> buyerSignedContextualAds) {
+            Objects.requireNonNull(buyerSignedContextualAds);
 
-            this.mBuyerContextualAds = buyerContextualAds;
+            this.mBuyerSignedContextualAds = buyerSignedContextualAds;
             return this;
         }
 
@@ -427,7 +428,7 @@
             Objects.requireNonNull(mAdSelectionSignals);
             Objects.requireNonNull(mSellerSignals);
             Objects.requireNonNull(mPerBuyerSignals);
-            Objects.requireNonNull(mBuyerContextualAds);
+            Objects.requireNonNull(mBuyerSignedContextualAds);
             Objects.requireNonNull(mTrustedScoringSignalsUri);
             return new AdSelectionConfig(
                     mSeller,
@@ -436,7 +437,7 @@
                     mAdSelectionSignals,
                     mSellerSignals,
                     mPerBuyerSignals,
-                    mBuyerContextualAds,
+                    mBuyerSignedContextualAds,
                     mTrustedScoringSignalsUri);
         }
     }
diff --git a/adservices/framework/java/android/adservices/adselection/ContextualAds.java b/adservices/framework/java/android/adservices/adselection/ContextualAds.java
deleted file mode 100644
index c34056d..0000000
--- a/adservices/framework/java/android/adservices/adselection/ContextualAds.java
+++ /dev/null
@@ -1,183 +0,0 @@
-/*
- * Copyright (C) 2023 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.adservices.adselection;
-
-import android.adservices.common.AdTechIdentifier;
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.net.Uri;
-import android.os.Parcel;
-import android.os.Parcelable;
-
-import java.util.List;
-import java.util.Objects;
-
-/**
- * Contains Ads supplied by Seller for the Contextual Path
- *
- * <p>Instances of this class are created by SDKs to be injected as part of {@link
- * AdSelectionConfig} and passed to {@link AdSelectionManager#selectAds}
- *
- * @hide
- */
-public final class ContextualAds implements Parcelable {
-    @NonNull private final AdTechIdentifier mBuyer;
-    @NonNull private final Uri mDecisionLogicUri;
-    @NonNull private final List<AdWithBid> mAdsWithBid;
-
-    @NonNull
-    public static final Creator<ContextualAds> CREATOR =
-            new Creator<ContextualAds>() {
-                @Override
-                public ContextualAds createFromParcel(@NonNull Parcel in) {
-                    Objects.requireNonNull(in);
-                    return new ContextualAds(in);
-                }
-
-                @Override
-                public ContextualAds[] newArray(int size) {
-                    return new ContextualAds[0];
-                }
-            };
-
-    private ContextualAds(
-            @NonNull AdTechIdentifier buyer,
-            @NonNull Uri decisionLogicUri,
-            @NonNull List<AdWithBid> adsWithBid) {
-        this.mBuyer = buyer;
-        this.mDecisionLogicUri = decisionLogicUri;
-        this.mAdsWithBid = adsWithBid;
-    }
-
-    private ContextualAds(@NonNull Parcel in) {
-        Objects.requireNonNull(in);
-        mBuyer = AdTechIdentifier.CREATOR.createFromParcel(in);
-        mDecisionLogicUri = Uri.CREATOR.createFromParcel(in);
-        mAdsWithBid = in.createTypedArrayList(AdWithBid.CREATOR);
-    }
-
-    @Override
-    public int describeContents() {
-        return 0;
-    }
-
-    @Override
-    public void writeToParcel(@NonNull Parcel dest, int flags) {
-        Objects.requireNonNull(dest);
-
-        mBuyer.writeToParcel(dest, flags);
-        mDecisionLogicUri.writeToParcel(dest, flags);
-        dest.writeTypedList(mAdsWithBid);
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) return true;
-        if (!(o instanceof ContextualAds)) return false;
-        ContextualAds that = (ContextualAds) o;
-        return Objects.equals(mBuyer, that.mBuyer)
-                && Objects.equals(mDecisionLogicUri, that.mDecisionLogicUri)
-                && Objects.equals(mAdsWithBid, that.mAdsWithBid);
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hash(mBuyer, mDecisionLogicUri, mAdsWithBid);
-    }
-
-    /** @return the Ad tech identifier from which this contextual Ad would have been downloaded */
-    @NonNull
-    public AdTechIdentifier getBuyer() {
-        return mBuyer;
-    }
-
-    /**
-     * @return the URI used for to retrieve the updateBid() and reportWin() function used during the
-     *     ad selection and reporting process
-     */
-    @NonNull
-    public Uri getDecisionLogicUri() {
-        return mDecisionLogicUri;
-    }
-
-    /** @return the Ad data with bid value associated with this ad */
-    @NonNull
-    public List<AdWithBid> getAdsWithBid() {
-        return mAdsWithBid;
-    }
-
-    /** Builder for {@link ContextualAds} object */
-    public static final class Builder {
-        @Nullable private AdTechIdentifier mBuyer;
-        @Nullable private Uri mDecisionLogicUri;
-        @Nullable private List<AdWithBid> mAdsWithBid;
-
-        public Builder() {}
-
-        /**
-         * Sets the buyer Ad tech Identifier
-         *
-         * <p>See {@link #getBuyer()} for more details
-         */
-        @NonNull
-        public ContextualAds.Builder setBuyer(@NonNull AdTechIdentifier buyer) {
-            Objects.requireNonNull(buyer);
-
-            this.mBuyer = buyer;
-            return this;
-        }
-
-        /**
-         * Sets the URI to fetch the decision logic used in ad selection and reporting
-         *
-         * <p>See {@link #getDecisionLogicUri()} for more details
-         */
-        @NonNull
-        public ContextualAds.Builder setDecisionLogicUri(@NonNull Uri decisionLogicUri) {
-            Objects.requireNonNull(decisionLogicUri);
-
-            this.mDecisionLogicUri = decisionLogicUri;
-            return this;
-        }
-
-        /**
-         * Sets the Ads with pre-defined bid values
-         *
-         * <p>See {@link #getAdsWithBid()} for more details
-         */
-        @NonNull
-        public ContextualAds.Builder setAdsWithBid(@NonNull List<AdWithBid> adsWithBid) {
-            Objects.requireNonNull(adsWithBid);
-
-            this.mAdsWithBid = adsWithBid;
-            return this;
-        }
-
-        /**
-         * Builds a {@link ContextualAds} instance.
-         *
-         * @throws NullPointerException if any required params are null
-         */
-        @NonNull
-        public ContextualAds build() {
-            Objects.requireNonNull(mBuyer);
-            Objects.requireNonNull(mDecisionLogicUri);
-            Objects.requireNonNull(mAdsWithBid);
-            return new ContextualAds(mBuyer, mDecisionLogicUri, mAdsWithBid);
-        }
-    }
-}
diff --git a/adservices/framework/java/android/adservices/adselection/ContextualAds.aidl b/adservices/framework/java/android/adservices/adselection/SignedContextualAds.aidl
similarity index 84%
rename from adservices/framework/java/android/adservices/adselection/ContextualAds.aidl
rename to adservices/framework/java/android/adservices/adselection/SignedContextualAds.aidl
index d96b1f1..0d61311 100644
--- a/adservices/framework/java/android/adservices/adselection/ContextualAds.aidl
+++ b/adservices/framework/java/android/adservices/adselection/SignedContextualAds.aidl
@@ -17,9 +17,7 @@
 package android.adservices.adselection;
 
 /**
- * This defines the ContextualAds class, ads that are used for the contextual auction path in
+ * This defines the SignedContextualAds class, ads that are used for the contextual auction path in
  * ad selection and reporting
- *
- * @hide
  */
-parcelable ContextualAds;
+parcelable SignedContextualAds;
diff --git a/adservices/framework/java/android/adservices/adselection/SignedContextualAds.java b/adservices/framework/java/android/adservices/adselection/SignedContextualAds.java
new file mode 100644
index 0000000..0505520
--- /dev/null
+++ b/adservices/framework/java/android/adservices/adselection/SignedContextualAds.java
@@ -0,0 +1,269 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.adservices.adselection;
+
+import android.adservices.common.AdTechIdentifier;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.net.Uri;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * Contains a buyer supplied {@link ContextualAds} bundle and its signature.
+ *
+ * <p>Instances of this class are created by SDKs to be injected as part of {@link
+ * AdSelectionConfig} and passed to {@link AdSelectionManager#selectAds}
+ *
+ * <p>SignedContextualAds are signed using ECDSA algorithm with SHA256 hashing algorithm (aka
+ * SHA256withECDSA). Keys used should belong to P-256 curve (aka “secp256r1” or “prime256v1”).
+ *
+ * <p>Signature should include the buyer, decisionLogicUri and adsWithBid fields.
+ *
+ * <p>While creating the signature a specific serialization rules must be followed as it's outlined
+ * here:
+ *
+ * <ul>
+ *   <li>{@code Objects} concatenate the serialized values of their fields with the {@code |} (pipe)
+ *       in between each field
+ *   <li>{@code All fields} are sorted by alphabetical order within the object
+ *   <li>{@code Nullable fields} are serialized as ”null” if they are null
+ *   <li>{@code Doubles} are converted to String preserving precision
+ *   <li>{@code Integers} are converted to string values
+ *   <li>{@code Sets} are sorted alphabetically
+ *   <li>{@code Lists} keep the same order
+ *   <li>{@code Strings} get encoded into byte[] using UTF-8 encoding
+ * </ul>
+ *
+ * @hide
+ */
+public final class SignedContextualAds implements Parcelable {
+    private static final String BUYER_CANNOT_BE_NULL = "Buyer cannot be null.";
+    private static final String DECISION_LOGIC_URI_CANNOT_BE_NULL =
+            "DecisionLogicUri cannot be null.";
+    private static final String ADS_WITH_BID_CANNOT_BE_NULL = "AdsWithBid cannot be null.";
+    private static final String SIGNATURE_CANNOT_BE_NULL = "Signature cannot be null.";
+    @NonNull private final AdTechIdentifier mBuyer;
+    @NonNull private final Uri mDecisionLogicUri;
+    @NonNull private final List<AdWithBid> mAdsWithBid;
+    @NonNull private final byte[] mSignature;
+
+    @NonNull
+    public static final Creator<SignedContextualAds> CREATOR =
+            new Creator<>() {
+                @Override
+                public SignedContextualAds createFromParcel(@NonNull Parcel in) {
+                    Objects.requireNonNull(in);
+                    return new SignedContextualAds(in);
+                }
+
+                @Override
+                public SignedContextualAds[] newArray(int size) {
+                    return new SignedContextualAds[0];
+                }
+            };
+
+    private SignedContextualAds(
+            @NonNull AdTechIdentifier buyer,
+            @NonNull Uri decisionLogicUri,
+            @NonNull List<AdWithBid> adsWithBid,
+            @NonNull byte[] signature) {
+        this.mBuyer = buyer;
+        this.mDecisionLogicUri = decisionLogicUri;
+        this.mAdsWithBid = adsWithBid;
+        this.mSignature = signature;
+    }
+
+    private SignedContextualAds(@NonNull Parcel in) {
+        Objects.requireNonNull(in);
+        mBuyer = AdTechIdentifier.CREATOR.createFromParcel(in);
+        mDecisionLogicUri = Uri.CREATOR.createFromParcel(in);
+        mAdsWithBid = in.createTypedArrayList(AdWithBid.CREATOR);
+        mSignature = in.createByteArray();
+    }
+
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+    @Override
+    public void writeToParcel(@NonNull Parcel dest, int flags) {
+        Objects.requireNonNull(dest);
+
+        mBuyer.writeToParcel(dest, flags);
+        mDecisionLogicUri.writeToParcel(dest, flags);
+        dest.writeTypedList(mAdsWithBid);
+        dest.writeByteArray(mSignature);
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (!(o instanceof SignedContextualAds)) return false;
+        SignedContextualAds that = (SignedContextualAds) o;
+        return Objects.equals(mBuyer, that.mBuyer)
+                && Objects.equals(mDecisionLogicUri, that.mDecisionLogicUri)
+                && Objects.equals(mAdsWithBid, that.mAdsWithBid)
+                && Arrays.equals(mSignature, that.mSignature);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(mBuyer, mDecisionLogicUri, mAdsWithBid, Arrays.hashCode(mSignature));
+    }
+
+    /**
+     * @return a new builder from this SignedContextualAds instance
+     * @hide
+     */
+    @NonNull
+    public SignedContextualAds.Builder cloneToBuilder() {
+        return new SignedContextualAds.Builder()
+                .setBuyer(mBuyer)
+                .setDecisionLogicUri(mDecisionLogicUri)
+                .setAdsWithBid(mAdsWithBid)
+                .setSignature(mSignature);
+    }
+
+    /**
+     * @return the Ad tech identifier from which this contextual Ad would have been downloaded
+     */
+    @NonNull
+    public AdTechIdentifier getBuyer() {
+        return mBuyer;
+    }
+
+    /**
+     * @return the URI used to retrieve the updateBid() and reportWin() function used during the ad
+     *     selection and reporting process
+     */
+    @NonNull
+    public Uri getDecisionLogicUri() {
+        return mDecisionLogicUri;
+    }
+
+    /**
+     * @return the Ad data with bid value associated with this ad
+     */
+    @NonNull
+    public List<AdWithBid> getAdsWithBid() {
+        return mAdsWithBid;
+    }
+
+    /**
+     * Returns a copy of the signature for the contextual ads object.
+     *
+     * <p>See {@link SignedContextualAds} for more details.
+     *
+     * @return the signature
+     */
+    public byte[] getSignature() {
+        return Arrays.copyOf(mSignature, mSignature.length);
+    }
+
+    @Override
+    public String toString() {
+        return "SignedContextualAds{"
+                + "mBuyer="
+                + mBuyer
+                + ", mDecisionLogicUri="
+                + mDecisionLogicUri
+                + ", mAdsWithBid="
+                + mAdsWithBid
+                + ", mSignature="
+                + Arrays.toString(mSignature)
+                + '}';
+    }
+
+    /** Builder for {@link SignedContextualAds} object */
+    public static final class Builder {
+        @Nullable private AdTechIdentifier mBuyer;
+        @Nullable private Uri mDecisionLogicUri;
+        @Nullable private List<AdWithBid> mAdsWithBid;
+        @Nullable private byte[] mSignature;
+
+        public Builder() {}
+
+        /**
+         * Sets the buyer Ad tech Identifier
+         *
+         * <p>See {@link #getBuyer()} for more details
+         */
+        @NonNull
+        public SignedContextualAds.Builder setBuyer(@NonNull AdTechIdentifier buyer) {
+            Objects.requireNonNull(buyer, BUYER_CANNOT_BE_NULL);
+
+            this.mBuyer = buyer;
+            return this;
+        }
+
+        /**
+         * Sets the URI to fetch the decision logic used in ad selection and reporting
+         *
+         * <p>See {@link #getDecisionLogicUri()} for more details
+         */
+        @NonNull
+        public SignedContextualAds.Builder setDecisionLogicUri(@NonNull Uri decisionLogicUri) {
+            Objects.requireNonNull(decisionLogicUri, DECISION_LOGIC_URI_CANNOT_BE_NULL);
+
+            this.mDecisionLogicUri = decisionLogicUri;
+            return this;
+        }
+
+        /**
+         * Sets the Ads with pre-defined bid values
+         *
+         * <p>See {@link #getAdsWithBid()} for more details
+         */
+        @NonNull
+        public SignedContextualAds.Builder setAdsWithBid(@NonNull List<AdWithBid> adsWithBid) {
+            Objects.requireNonNull(adsWithBid, ADS_WITH_BID_CANNOT_BE_NULL);
+
+            this.mAdsWithBid = adsWithBid;
+            return this;
+        }
+
+        /** Sets the copied signature */
+        @NonNull
+        public SignedContextualAds.Builder setSignature(@NonNull byte[] signature) {
+            Objects.requireNonNull(signature, SIGNATURE_CANNOT_BE_NULL);
+
+            this.mSignature = Arrays.copyOf(signature, signature.length);
+            return this;
+        }
+
+        /**
+         * Builds a {@link SignedContextualAds} instance.
+         *
+         * @throws NullPointerException if any required params are null
+         */
+        @NonNull
+        public SignedContextualAds build() {
+            Objects.requireNonNull(mBuyer, BUYER_CANNOT_BE_NULL);
+            Objects.requireNonNull(mDecisionLogicUri, DECISION_LOGIC_URI_CANNOT_BE_NULL);
+            Objects.requireNonNull(mAdsWithBid, ADS_WITH_BID_CANNOT_BE_NULL);
+            Objects.requireNonNull(mSignature, SIGNATURE_CANNOT_BE_NULL);
+
+            return new SignedContextualAds(mBuyer, mDecisionLogicUri, mAdsWithBid, mSignature);
+        }
+    }
+}
diff --git a/adservices/service-core/java/com/android/adservices/service/adselection/AdFilterer.java b/adservices/service-core/java/com/android/adservices/service/adselection/AdFilterer.java
index 06dfe81..8ea8367 100644
--- a/adservices/service-core/java/com/android/adservices/service/adselection/AdFilterer.java
+++ b/adservices/service-core/java/com/android/adservices/service/adselection/AdFilterer.java
@@ -16,7 +16,7 @@
 
 package com.android.adservices.service.adselection;
 
-import android.adservices.adselection.ContextualAds;
+import android.adservices.adselection.SignedContextualAds;
 
 import com.android.adservices.data.customaudience.DBCustomAudience;
 
@@ -37,11 +37,11 @@
      */
     List<DBCustomAudience> filterCustomAudiences(List<DBCustomAudience> cas);
     /**
-     * Takes in a {@link ContextualAds} object and filters out ads from it that should not be in the
-     * auction
+     * Takes in a {@link SignedContextualAds} object and filters out ads from it that should not be
+     * in the auction
      *
      * @param contextualAds An object containing contextual ads corresponding to a buyer
      * @return A list of object identical to the input, but without any ads that should be filtered
      */
-    ContextualAds filterContextualAds(ContextualAds contextualAds);
+    SignedContextualAds filterContextualAds(SignedContextualAds contextualAds);
 }
diff --git a/adservices/service-core/java/com/android/adservices/service/adselection/AdFiltererImpl.java b/adservices/service-core/java/com/android/adservices/service/adselection/AdFiltererImpl.java
index c262df1..199b313 100644
--- a/adservices/service-core/java/com/android/adservices/service/adselection/AdFiltererImpl.java
+++ b/adservices/service-core/java/com/android/adservices/service/adselection/AdFiltererImpl.java
@@ -17,7 +17,7 @@
 package com.android.adservices.service.adselection;
 
 import android.adservices.adselection.AdWithBid;
-import android.adservices.adselection.ContextualAds;
+import android.adservices.adselection.SignedContextualAds;
 import android.adservices.common.AdTechIdentifier;
 import android.adservices.common.FrequencyCapFilters;
 import android.adservices.common.KeyedFrequencyCap;
@@ -101,14 +101,14 @@
     }
 
     /**
-     * Takes in a {@link ContextualAds} object and filters out ads from it that should not be in the
-     * auction
+     * Takes in a {@link SignedContextualAds} object and filters out ads from it that should not be
+     * in the auction
      *
      * @param contextualAds An object containing contextual ads corresponding to a buyer
      * @return A list of object identical to the input, but without any ads that should be filtered
      */
     @Override
-    public ContextualAds filterContextualAds(ContextualAds contextualAds) {
+    public SignedContextualAds filterContextualAds(SignedContextualAds contextualAds) {
         final int traceCookie = Tracing.beginAsyncSection(Tracing.FILTER_CONTEXTUAL);
         try {
             List<AdWithBid> adsList = new ArrayList<>();
@@ -126,14 +126,8 @@
             sLogger.v(
                     "Filtering finished. %d contextual ads of the original %d remain.",
                     adsList.size(), contextualAds.getAdsWithBid().size());
-            ContextualAds toReturn =
-                    new ContextualAds.Builder()
-                            .setAdsWithBid(adsList)
-                            .setDecisionLogicUri(contextualAds.getDecisionLogicUri())
-                            .setBuyer(contextualAds.getBuyer())
-                            .build();
 
-            return toReturn;
+            return contextualAds.cloneToBuilder().setAdsWithBid(adsList).build();
         } finally {
             Tracing.endAsyncSection(Tracing.FILTER_CONTEXTUAL, traceCookie);
         }
diff --git a/adservices/service-core/java/com/android/adservices/service/adselection/AdFiltererNoOpImpl.java b/adservices/service-core/java/com/android/adservices/service/adselection/AdFiltererNoOpImpl.java
index ff58729..08f0043 100644
--- a/adservices/service-core/java/com/android/adservices/service/adselection/AdFiltererNoOpImpl.java
+++ b/adservices/service-core/java/com/android/adservices/service/adselection/AdFiltererNoOpImpl.java
@@ -16,7 +16,7 @@
 
 package com.android.adservices.service.adselection;
 
-import android.adservices.adselection.ContextualAds;
+import android.adservices.adselection.SignedContextualAds;
 
 import com.android.adservices.LoggerFactory;
 import com.android.adservices.data.customaudience.DBCustomAudience;
@@ -47,7 +47,7 @@
      * @return contextual ads
      */
     @Override
-    public ContextualAds filterContextualAds(ContextualAds contextualAds) {
+    public SignedContextualAds filterContextualAds(SignedContextualAds contextualAds) {
         logSkip();
         return contextualAds;
     }
diff --git a/adservices/service-core/java/com/android/adservices/service/adselection/AdSelectionConfigValidator.java b/adservices/service-core/java/com/android/adservices/service/adselection/AdSelectionConfigValidator.java
index ce0d279..fc0f163 100644
--- a/adservices/service-core/java/com/android/adservices/service/adselection/AdSelectionConfigValidator.java
+++ b/adservices/service-core/java/com/android/adservices/service/adselection/AdSelectionConfigValidator.java
@@ -18,7 +18,7 @@
 
 import android.adservices.adselection.AdSelectionConfig;
 import android.adservices.adselection.AdWithBid;
-import android.adservices.adselection.ContextualAds;
+import android.adservices.adselection.SignedContextualAds;
 import android.adservices.common.AdTechIdentifier;
 import android.annotation.NonNull;
 import android.net.Uri;
@@ -110,20 +110,22 @@
                     adSelectionConfig.getTrustedScoringSignalsUri(), violations);
         }
 
-        violations.addAll(validateContextualAds(adSelectionConfig.getBuyerContextualAds()));
+        violations.addAll(
+                validateSignedContextualAds(adSelectionConfig.getBuyerSignedContextualAds()));
     }
 
-    private ImmutableList<String> validateContextualAds(
-            Map<AdTechIdentifier, ContextualAds> contextualAdsMap) {
+    private ImmutableList<String> validateSignedContextualAds(
+            Map<AdTechIdentifier, SignedContextualAds> signedContextualAdsMap) {
         ImmutableList.Builder<String> violations = new ImmutableList.Builder<>();
 
-        for (Map.Entry<AdTechIdentifier, ContextualAds> entry : contextualAdsMap.entrySet()) {
+        for (Map.Entry<AdTechIdentifier, SignedContextualAds> entry :
+                signedContextualAdsMap.entrySet()) {
             // Validate that the buyer decision logic for Contextual Ads satisfies buyer eTLD+1
             AdTechUriValidator buyerUriValidator =
                     new AdTechUriValidator(
                             ValidatorUtil.AD_TECH_ROLE_BUYER,
                             entry.getValue().getBuyer().toString(),
-                            ContextualAds.class.getName(),
+                            SignedContextualAds.class.getName(),
                             CONTEXTUAL_ADS_DECISION_LOGIC_FIELD_NAME);
             buyerUriValidator.addValidation(entry.getValue().getDecisionLogicUri(), violations);
 
diff --git a/adservices/service-core/java/com/android/adservices/service/adselection/AdSelectionRunner.java b/adservices/service-core/java/com/android/adservices/service/adselection/AdSelectionRunner.java
index 0e99d26..c337bf1 100644
--- a/adservices/service-core/java/com/android/adservices/service/adselection/AdSelectionRunner.java
+++ b/adservices/service-core/java/com/android/adservices/service/adselection/AdSelectionRunner.java
@@ -23,7 +23,7 @@
 import android.adservices.adselection.AdSelectionConfig;
 import android.adservices.adselection.AdSelectionInput;
 import android.adservices.adselection.AdSelectionResponse;
-import android.adservices.adselection.ContextualAds;
+import android.adservices.adselection.SignedContextualAds;
 import android.adservices.common.AdServicesStatusUtils;
 import android.adservices.common.AdTechIdentifier;
 import android.adservices.common.FledgeErrorResponse;
@@ -564,7 +564,7 @@
                 () -> {
                     boolean atLeastOnePresent =
                             !(adSelectionConfig.getCustomAudienceBuyers().isEmpty()
-                                    && adSelectionConfig.getBuyerContextualAds().isEmpty());
+                                    && adSelectionConfig.getBuyerSignedContextualAds().isEmpty());
 
                     Preconditions.checkArgument(
                             atLeastOnePresent, ERROR_NO_BUYERS_OR_CONTEXTUAL_ADS_AVAILABLE);
@@ -577,7 +577,7 @@
                                     mClock.instant(),
                                     mFlags.getFledgeCustomAudienceActiveTimeWindowInMs());
                     if ((buyerCustomAudience == null || buyerCustomAudience.isEmpty())
-                            && adSelectionConfig.getBuyerContextualAds().isEmpty()) {
+                            && adSelectionConfig.getBuyerSignedContextualAds().isEmpty()) {
                         IllegalStateException exception =
                                 new IllegalStateException(ERROR_NO_CA_AND_CONTEXTUAL_ADS_AVAILABLE);
                         mAdSelectionExecutionLogger.endBiddingProcess(
@@ -726,16 +726,16 @@
 
     private AdSelectionConfig getAdSelectionConfigFilterContextualAds(
             AdSelectionConfig adSelectionConfig) {
-        Map<AdTechIdentifier, ContextualAds> filteredContextualAdsMap = new HashMap<>();
+        Map<AdTechIdentifier, SignedContextualAds> filteredContextualAdsMap = new HashMap<>();
         sLogger.v("Filtering contextual ads in Ad Selection Config");
-        for (Map.Entry<AdTechIdentifier, ContextualAds> entry :
-                adSelectionConfig.getBuyerContextualAds().entrySet()) {
+        for (Map.Entry<AdTechIdentifier, SignedContextualAds> entry :
+                adSelectionConfig.getBuyerSignedContextualAds().entrySet()) {
             filteredContextualAdsMap.put(
                     entry.getKey(), mAdFilterer.filterContextualAds(entry.getValue()));
         }
         return adSelectionConfig
                 .cloneToBuilder()
-                .setBuyerContextualAds(filteredContextualAdsMap)
+                .setBuyerSignedContextualAds(filteredContextualAdsMap)
                 .build();
     }
 
@@ -744,7 +744,7 @@
         sLogger.v("Emptying contextual ads in Ad Selection Config");
         return adSelectionConfig
                 .cloneToBuilder()
-                .setBuyerContextualAds(Collections.EMPTY_MAP)
+                .setBuyerSignedContextualAds(Collections.EMPTY_MAP)
                 .build();
     }
 
diff --git a/adservices/service-core/java/com/android/adservices/service/adselection/AdsScoreGeneratorImpl.java b/adservices/service-core/java/com/android/adservices/service/adselection/AdsScoreGeneratorImpl.java
index 48008ba..6759b38 100644
--- a/adservices/service-core/java/com/android/adservices/service/adselection/AdsScoreGeneratorImpl.java
+++ b/adservices/service-core/java/com/android/adservices/service/adselection/AdsScoreGeneratorImpl.java
@@ -24,7 +24,7 @@
 
 import android.adservices.adselection.AdSelectionConfig;
 import android.adservices.adselection.AdWithBid;
-import android.adservices.adselection.ContextualAds;
+import android.adservices.adselection.SignedContextualAds;
 import android.adservices.common.AdSelectionSignals;
 import android.adservices.common.AdTechIdentifier;
 import android.adservices.exceptions.AdServicesException;
@@ -159,8 +159,8 @@
         mAdSelectionExecutionLogger.startRunAdScoring(adBiddingOutcomes);
         int traceCookie = Tracing.beginAsyncSection(Tracing.RUN_AD_SCORING);
 
-        final List<ContextualAds> contextualAds =
-                new ArrayList<>(adSelectionConfig.getBuyerContextualAds().values());
+        final List<SignedContextualAds> contextualAds =
+                new ArrayList<>(adSelectionConfig.getBuyerSignedContextualAds().values());
 
         AdServicesHttpClientRequest scoringLogicUriHttpRequest =
                 AdServicesHttpClientRequest.builder()
@@ -262,7 +262,7 @@
     private ListenableFuture<Pair<List<ScoreAdResult>, SellerContextualSignals>> getAdScores(
             @NonNull String scoringLogic,
             @NonNull List<AdBiddingOutcome> adBiddingOutcomes,
-            @NonNull List<ContextualAds> contextualAds,
+            @NonNull List<SignedContextualAds> contextualAds,
             @NonNull final AdSelectionConfig adSelectionConfig) {
         mAdSelectionExecutionLogger.startGetAdScores();
         final AdSelectionSignals sellerSignals = adSelectionConfig.getSellerSignals();
@@ -276,7 +276,7 @@
         sLogger.v("Total Remarketing AdsWithBid count: %d", adsWithBid.size());
 
         List<AdWithBid> contextualBidAds = new ArrayList<>();
-        for (ContextualAds ctx : contextualAds) {
+        for (SignedContextualAds ctx : contextualAds) {
             contextualBidAds.addAll(ctx.getAdsWithBid());
         }
         sLogger.v("Total Contextual Ads count: %d", contextualBidAds.size());
@@ -459,7 +459,7 @@
      */
     private List<AdScoringOutcome> mapAdsToScore(
             List<AdBiddingOutcome> adBiddingOutcomes,
-            List<ContextualAds> contextualAds,
+            List<SignedContextualAds> contextualAds,
             List<ScoreAdResult> adScores,
             AdSelectionConfig adSelectionConfig,
             SellerContextualSignals sellerContextualSignals) {
@@ -501,7 +501,7 @@
         }
 
         int i = contextualAdsIdx;
-        for (ContextualAds ctx : contextualAds) {
+        for (SignedContextualAds ctx : contextualAds) {
             for (AdWithBid adWithBid : ctx.getAdsWithBid()) {
                 if (i >= adScores.size()) {
                     throw new IllegalStateException(SCORES_COUNT_LESS_THAN_EXPECTED);
diff --git a/adservices/service-core/java/com/android/adservices/service/adselection/OnDeviceAdSelectionRunner.java b/adservices/service-core/java/com/android/adservices/service/adselection/OnDeviceAdSelectionRunner.java
index dd4f530..4c5b280 100644
--- a/adservices/service-core/java/com/android/adservices/service/adselection/OnDeviceAdSelectionRunner.java
+++ b/adservices/service-core/java/com/android/adservices/service/adselection/OnDeviceAdSelectionRunner.java
@@ -347,7 +347,8 @@
                 adBiddingOutcomes.stream().filter(Objects::nonNull).collect(Collectors.toList());
         sLogger.v("Got %d valid bidding outcomes", validBiddingOutcomes.size());
 
-        if (validBiddingOutcomes.isEmpty() && adSelectionConfig.getBuyerContextualAds().isEmpty()) {
+        if (validBiddingOutcomes.isEmpty()
+                && adSelectionConfig.getBuyerSignedContextualAds().isEmpty()) {
             sLogger.w("Received empty list of successful bidding outcomes and contextual ads");
             throw new IllegalStateException(ERROR_NO_VALID_BIDS_OR_CONTEXTUAL_ADS_FOR_SCORING);
         }
diff --git a/adservices/tests/unittest/fixtures/java/android/adservices/adselection/AdSelectionConfigFixture.java b/adservices/tests/unittest/fixtures/java/android/adservices/adselection/AdSelectionConfigFixture.java
index 948c8a7..0f1b385 100644
--- a/adservices/tests/unittest/fixtures/java/android/adservices/adselection/AdSelectionConfigFixture.java
+++ b/adservices/tests/unittest/fixtures/java/android/adservices/adselection/AdSelectionConfigFixture.java
@@ -29,7 +29,6 @@
 
 /** This is a static class meant to help with tests that involve creating an AdSelectionConfig. */
 public class AdSelectionConfigFixture {
-
     public static final AdTechIdentifier SELLER = AdTechIdentifier.fromString("test.com");
     public static final AdTechIdentifier SELLER_1 = AdTechIdentifier.fromString("test2.com");
 
@@ -128,6 +127,6 @@
      */
     public static AdSelectionConfig.Builder anAdSelectionConfigWithContextualAdsBuilder() {
         return anAdSelectionConfigBuilder()
-                .setBuyerContextualAds(ContextualAdsFixture.getBuyerContextualAdsMap());
+                .setBuyerSignedContextualAds(SignedContextualAdsFixture.getBuyerContextualAdsMap());
     }
 }
diff --git a/adservices/tests/unittest/fixtures/java/android/adservices/adselection/ContextualAdsFixture.java b/adservices/tests/unittest/fixtures/java/android/adservices/adselection/SignedContextualAdsFixture.java
similarity index 71%
rename from adservices/tests/unittest/fixtures/java/android/adservices/adselection/ContextualAdsFixture.java
rename to adservices/tests/unittest/fixtures/java/android/adservices/adselection/SignedContextualAdsFixture.java
index 00b16c5..d1a9a4f 100644
--- a/adservices/tests/unittest/fixtures/java/android/adservices/adselection/ContextualAdsFixture.java
+++ b/adservices/tests/unittest/fixtures/java/android/adservices/adselection/SignedContextualAdsFixture.java
@@ -29,10 +29,11 @@
 import java.util.stream.Collectors;
 
 /**
- * This is a static class meant to help with tests that involve creating an {@link ContextualAds}.
+ * This is a static class meant to help with tests that involve creating an {@link
+ * SignedContextualAds}.
  */
-public class ContextualAdsFixture {
-
+public class SignedContextualAdsFixture {
+    public static final byte[] PLACEHOLDER_SIGNATURE = new byte[] {0, 0};
     public static final AdTechIdentifier BUYER = CommonFixture.VALID_BUYER_1;
     public static final AdTechIdentifier BUYER_2 = CommonFixture.VALID_BUYER_2;
 
@@ -50,16 +51,17 @@
     public static final List<AdWithBid> ADS_WITH_BID =
             ImmutableList.of(AD_WITH_BID_1, AD_WITH_BID_2);
 
-    public static ContextualAds.Builder aContextualAdBuilder() {
-        return new ContextualAds.Builder()
+    public static SignedContextualAds.Builder aSignedContextualAdBuilder() {
+        return new SignedContextualAds.Builder()
                 .setBuyer(BUYER)
                 .setDecisionLogicUri(DECISION_LOGIC_URI)
-                .setAdsWithBid(ADS_WITH_BID);
+                .setAdsWithBid(ADS_WITH_BID)
+                .setSignature(PLACEHOLDER_SIGNATURE);
     }
 
-    public static ContextualAds.Builder generateContextualAds(
+    public static SignedContextualAds.Builder generateSignedContextualAds(
             AdTechIdentifier buyer, List<Double> bids) {
-        return new ContextualAds.Builder()
+        return new SignedContextualAds.Builder()
                 .setBuyer(buyer)
                 .setDecisionLogicUri(CommonFixture.getUri(buyer, DECISION_LOGIC_FRAGMENT))
                 .setAdsWithBid(
@@ -70,22 +72,23 @@
                                                         AdDataFixture.getValidFilterAdDataByBuyer(
                                                                 buyer, bid.intValue()),
                                                         bid))
-                                .collect(Collectors.toList()));
+                                .collect(Collectors.toList()))
+                .setSignature(PLACEHOLDER_SIGNATURE);
     }
 
-    public static ContextualAds aContextualAd() {
-        return aContextualAdBuilder().build();
+    public static SignedContextualAds aSignedContextualAd() {
+        return aSignedContextualAdBuilder().build();
     }
 
-    public static ContextualAds aContextualAd(AdTechIdentifier buyer) {
-        return aContextualAdBuilder().setBuyer(buyer).build();
+    public static SignedContextualAds aSignedContextualAd(AdTechIdentifier buyer) {
+        return aSignedContextualAdBuilder().setBuyer(buyer).build();
     }
 
-    public static ImmutableMap<AdTechIdentifier, ContextualAds> getBuyerContextualAdsMap() {
+    public static ImmutableMap<AdTechIdentifier, SignedContextualAds> getBuyerContextualAdsMap() {
         return ImmutableMap.of(
                 CommonFixture.VALID_BUYER_1,
-                aContextualAd(CommonFixture.VALID_BUYER_1),
+                aSignedContextualAd(CommonFixture.VALID_BUYER_1),
                 CommonFixture.VALID_BUYER_2,
-                aContextualAd(CommonFixture.VALID_BUYER_2));
+                aSignedContextualAd(CommonFixture.VALID_BUYER_2));
     }
 }
diff --git a/adservices/tests/unittest/framework/src/android/adservices/adselection/ContextualAdsTest.java b/adservices/tests/unittest/framework/src/android/adservices/adselection/ContextualAdsTest.java
deleted file mode 100644
index 403d9a9..0000000
--- a/adservices/tests/unittest/framework/src/android/adservices/adselection/ContextualAdsTest.java
+++ /dev/null
@@ -1,157 +0,0 @@
-/*
- * Copyright (C) 2023 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.adservices.adselection;
-
-import static org.junit.Assert.assertThrows;
-
-import android.adservices.common.CommonFixture;
-import android.os.Parcel;
-
-import org.junit.Assert;
-import org.junit.Test;
-
-public class ContextualAdsTest {
-
-    @Test
-    public void testBuildContextualAdsSuccess() {
-        ContextualAds contextualAds =
-                new ContextualAds.Builder()
-                        .setBuyer(ContextualAdsFixture.BUYER)
-                        .setDecisionLogicUri(ContextualAdsFixture.DECISION_LOGIC_URI)
-                        .setAdsWithBid(ContextualAdsFixture.ADS_WITH_BID)
-                        .build();
-
-        Assert.assertEquals(contextualAds.getBuyer(), ContextualAdsFixture.BUYER);
-        Assert.assertEquals(
-                contextualAds.getDecisionLogicUri(), ContextualAdsFixture.DECISION_LOGIC_URI);
-        Assert.assertEquals(contextualAds.getAdsWithBid(), ContextualAdsFixture.ADS_WITH_BID);
-    }
-
-    @Test
-    public void testParcelValidContextualAdsSuccess() {
-        ContextualAds contextualAds = ContextualAdsFixture.aContextualAd();
-
-        Parcel p = Parcel.obtain();
-        contextualAds.writeToParcel(p, 0);
-        p.setDataPosition(0);
-        ContextualAds fromParcel = ContextualAds.CREATOR.createFromParcel(p);
-
-        Assert.assertEquals(contextualAds.getBuyer(), fromParcel.getBuyer());
-        Assert.assertEquals(contextualAds.getDecisionLogicUri(), fromParcel.getDecisionLogicUri());
-        Assert.assertEquals(contextualAds.getAdsWithBid(), fromParcel.getAdsWithBid());
-    }
-
-    @Test
-    public void testSetContextualAdsNullBuyerFailure() {
-        assertThrows(
-                NullPointerException.class,
-                () -> {
-                    new ContextualAds.Builder().setBuyer(null);
-                });
-    }
-
-    @Test
-    public void testSetContextualAdsNullDecisionLogicUriFailure() {
-        assertThrows(
-                NullPointerException.class,
-                () -> {
-                    new ContextualAds.Builder().setDecisionLogicUri(null);
-                });
-    }
-
-    @Test
-    public void testSetContextualAdsNullAdWithBidFailure() {
-        assertThrows(
-                NullPointerException.class,
-                () -> {
-                    new ContextualAds.Builder().setAdsWithBid(null);
-                });
-    }
-
-    @Test
-    public void testParcelNullDestFailure() {
-        ContextualAds contextualAds = ContextualAdsFixture.aContextualAd();
-        Parcel nullDest = null;
-        assertThrows(
-                NullPointerException.class,
-                () -> {
-                    contextualAds.writeToParcel(nullDest, 0);
-                });
-    }
-
-    @Test
-    public void testBuildContextualAdsUnsetBuyerFailure() {
-        assertThrows(
-                NullPointerException.class,
-                () -> {
-                    new ContextualAds.Builder()
-                            .setDecisionLogicUri(ContextualAdsFixture.DECISION_LOGIC_URI)
-                            .setAdsWithBid(ContextualAdsFixture.ADS_WITH_BID)
-                            .build();
-                });
-    }
-
-    @Test
-    public void testBuildContextualAdsUnsetDecisionLogicUriFailure() {
-        assertThrows(
-                NullPointerException.class,
-                () -> {
-                    new ContextualAds.Builder()
-                            .setBuyer(ContextualAdsFixture.BUYER)
-                            .setAdsWithBid(ContextualAdsFixture.ADS_WITH_BID)
-                            .build();
-                });
-    }
-
-    @Test
-    public void testBuildContextualAdsUnsetAdWithBidFailure() {
-        assertThrows(
-                NullPointerException.class,
-                () -> {
-                    new ContextualAds.Builder()
-                            .setBuyer(ContextualAdsFixture.BUYER)
-                            .setDecisionLogicUri(ContextualAdsFixture.DECISION_LOGIC_URI)
-                            .build();
-                });
-    }
-
-    @Test
-    public void testContextualAdsDescribeContents() {
-        ContextualAds obj = ContextualAdsFixture.aContextualAd();
-
-        Assert.assertEquals(obj.describeContents(), 0);
-    }
-
-    @Test
-    public void testContextualAdsHaveSameHashCode() {
-        ContextualAds obj1 = ContextualAdsFixture.aContextualAd();
-        ContextualAds obj2 = ContextualAdsFixture.aContextualAd();
-
-        CommonFixture.assertHaveSameHashCode(obj1, obj2);
-    }
-
-    @Test
-    public void testContextualAdsHaveDifferentHashCode() {
-        ContextualAds obj1 = ContextualAdsFixture.aContextualAd();
-        ContextualAds obj2 =
-                ContextualAdsFixture.aContextualAdBuilder()
-                        .setBuyer(ContextualAdsFixture.BUYER_2)
-                        .build();
-
-        CommonFixture.assertDifferentHashCode(obj1, obj2);
-    }
-}
diff --git a/adservices/tests/unittest/framework/src/android/adservices/adselection/SignedContextualAdsTest.java b/adservices/tests/unittest/framework/src/android/adservices/adselection/SignedContextualAdsTest.java
new file mode 100644
index 0000000..f46a51c
--- /dev/null
+++ b/adservices/tests/unittest/framework/src/android/adservices/adselection/SignedContextualAdsTest.java
@@ -0,0 +1,193 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.adservices.adselection;
+
+import static junit.framework.Assert.assertEquals;
+
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertThrows;
+
+import android.adservices.common.CommonFixture;
+import android.os.Parcel;
+
+import org.junit.Test;
+
+/** Unit tests for {@link SignedContextualAds} */
+public class SignedContextualAdsTest {
+
+    @Test
+    public void testBuildContextualAdsSuccess() {
+        SignedContextualAds contextualAds =
+                new SignedContextualAds.Builder()
+                        .setBuyer(SignedContextualAdsFixture.BUYER)
+                        .setDecisionLogicUri(SignedContextualAdsFixture.DECISION_LOGIC_URI)
+                        .setAdsWithBid(SignedContextualAdsFixture.ADS_WITH_BID)
+                        .setSignature(SignedContextualAdsFixture.PLACEHOLDER_SIGNATURE)
+                        .build();
+
+        assertEquals(contextualAds.getBuyer(), SignedContextualAdsFixture.BUYER);
+        assertEquals(
+                contextualAds.getDecisionLogicUri(), SignedContextualAdsFixture.DECISION_LOGIC_URI);
+        assertEquals(contextualAds.getAdsWithBid(), SignedContextualAdsFixture.ADS_WITH_BID);
+        assertArrayEquals(
+                contextualAds.getSignature(), SignedContextualAdsFixture.PLACEHOLDER_SIGNATURE);
+    }
+
+    @Test
+    public void testParcelValidContextualAdsSuccess() {
+        SignedContextualAds contextualAds = SignedContextualAdsFixture.aSignedContextualAd();
+
+        Parcel p = Parcel.obtain();
+        contextualAds.writeToParcel(p, 0);
+        p.setDataPosition(0);
+        SignedContextualAds fromParcel = SignedContextualAds.CREATOR.createFromParcel(p);
+
+        assertEquals(contextualAds.getBuyer(), fromParcel.getBuyer());
+        assertEquals(contextualAds.getDecisionLogicUri(), fromParcel.getDecisionLogicUri());
+        assertEquals(contextualAds.getAdsWithBid(), fromParcel.getAdsWithBid());
+        assertArrayEquals(contextualAds.getSignature(), fromParcel.getSignature());
+    }
+
+    @Test
+    public void testSetContextualAdsNullBuyerFailure() {
+        assertThrows(
+                NullPointerException.class,
+                () -> {
+                    new SignedContextualAds.Builder().setBuyer(null);
+                });
+    }
+
+    @Test
+    public void testSetContextualAdsNullDecisionLogicUriFailure() {
+        assertThrows(
+                NullPointerException.class,
+                () -> {
+                    new SignedContextualAds.Builder().setDecisionLogicUri(null);
+                });
+    }
+
+    @Test
+    public void testSetContextualAdsNullAdWithBidFailure() {
+        assertThrows(
+                NullPointerException.class,
+                () -> {
+                    new SignedContextualAds.Builder().setAdsWithBid(null);
+                });
+    }
+
+    @Test
+    public void testSetContextualAdsNullSignatureFailure() {
+        assertThrows(
+                NullPointerException.class,
+                () -> {
+                    new SignedContextualAds.Builder().setSignature(null);
+                });
+    }
+
+    @Test
+    public void testParcelNullDestFailure() {
+        SignedContextualAds contextualAds = SignedContextualAdsFixture.aSignedContextualAd();
+        Parcel nullDest = null;
+        assertThrows(
+                NullPointerException.class,
+                () -> {
+                    contextualAds.writeToParcel(nullDest, 0);
+                });
+    }
+
+    @Test
+    public void testBuildContextualAdsUnsetBuyerFailure() {
+        assertThrows(
+                NullPointerException.class,
+                () -> {
+                    new SignedContextualAds.Builder()
+                            .setDecisionLogicUri(SignedContextualAdsFixture.DECISION_LOGIC_URI)
+                            .setAdsWithBid(SignedContextualAdsFixture.ADS_WITH_BID)
+                            .setSignature(SignedContextualAdsFixture.PLACEHOLDER_SIGNATURE)
+                            .build();
+                });
+    }
+
+    @Test
+    public void testBuildContextualAdsUnsetDecisionLogicUriFailure() {
+        assertThrows(
+                NullPointerException.class,
+                () -> {
+                    new SignedContextualAds.Builder()
+                            .setBuyer(SignedContextualAdsFixture.BUYER)
+                            .setAdsWithBid(SignedContextualAdsFixture.ADS_WITH_BID)
+                            .setSignature(SignedContextualAdsFixture.PLACEHOLDER_SIGNATURE)
+                            .build();
+                });
+    }
+
+    @Test
+    public void testBuildContextualAdsUnsetAdWithBidFailure() {
+        assertThrows(
+                NullPointerException.class,
+                () -> {
+                    new SignedContextualAds.Builder()
+                            .setBuyer(SignedContextualAdsFixture.BUYER)
+                            .setDecisionLogicUri(SignedContextualAdsFixture.DECISION_LOGIC_URI)
+                            .setSignature(SignedContextualAdsFixture.PLACEHOLDER_SIGNATURE)
+                            .build();
+                });
+    }
+
+    @Test
+    public void testBuildContextualAdsUnsetSignatureFailure() {
+        assertThrows(
+                NullPointerException.class,
+                () -> {
+                    new SignedContextualAds.Builder()
+                            .setBuyer(SignedContextualAdsFixture.BUYER)
+                            .setDecisionLogicUri(SignedContextualAdsFixture.DECISION_LOGIC_URI)
+                            .setAdsWithBid(SignedContextualAdsFixture.ADS_WITH_BID)
+                            .build();
+                });
+    }
+
+    @Test
+    public void testContextualAdsDescribeContents() {
+        SignedContextualAds obj = SignedContextualAdsFixture.aSignedContextualAd();
+
+        assertEquals(obj.describeContents(), 0);
+    }
+
+    @Test
+    public void testContextualAdsHaveSameHashCode() {
+        SignedContextualAds obj1 = SignedContextualAdsFixture.aSignedContextualAd();
+        SignedContextualAds obj2 = SignedContextualAdsFixture.aSignedContextualAd();
+
+        CommonFixture.assertHaveSameHashCode(obj1, obj2);
+    }
+
+    @Test
+    public void testContextualAdsHaveDifferentHashCode() {
+        SignedContextualAds obj1 = SignedContextualAdsFixture.aSignedContextualAd();
+        SignedContextualAds obj2 =
+                SignedContextualAdsFixture.aSignedContextualAdBuilder()
+                        .setBuyer(SignedContextualAdsFixture.BUYER_2)
+                        .build();
+        SignedContextualAds obj3 =
+                SignedContextualAdsFixture.aSignedContextualAdBuilder()
+                        .setSignature(new byte[] {1, 2, 3})
+                        .build();
+
+        CommonFixture.assertDifferentHashCode(obj1, obj2, obj3);
+    }
+}
diff --git a/adservices/tests/unittest/service-core/src/com/android/adservices/service/adselection/AdFiltererImplTest.java b/adservices/tests/unittest/service-core/src/com/android/adservices/service/adselection/AdFiltererImplTest.java
index 15e4cb6..490e585 100644
--- a/adservices/tests/unittest/service-core/src/com/android/adservices/service/adselection/AdFiltererImplTest.java
+++ b/adservices/tests/unittest/service-core/src/com/android/adservices/service/adselection/AdFiltererImplTest.java
@@ -29,8 +29,8 @@
 import static org.mockito.Mockito.when;
 
 import android.adservices.adselection.AdWithBid;
-import android.adservices.adselection.ContextualAds;
-import android.adservices.adselection.ContextualAdsFixture;
+import android.adservices.adselection.SignedContextualAds;
+import android.adservices.adselection.SignedContextualAdsFixture;
 import android.adservices.common.AdData;
 import android.adservices.common.AdDataFixture;
 import android.adservices.common.AdFilters;
@@ -91,8 +91,8 @@
                     .setMetadata(AD_DATA.getMetadata())
                     .build();
 
-    private static final ContextualAds.Builder CONTEXTUAL_ADS_BUILDER =
-            ContextualAdsFixture.aContextualAdBuilder()
+    private static final SignedContextualAds.Builder CONTEXTUAL_ADS_BUILDER =
+            SignedContextualAdsFixture.aSignedContextualAdBuilder()
                     .setAdsWithBid(ImmutableList.of(new AdWithBid(AD_DATA, 1.0)))
                     .setBuyer(CommonFixture.VALID_BUYER_1)
                     .setDecisionLogicUri(
@@ -114,7 +114,7 @@
     @Test
     public void testFilterContextualAdsDoesNotFilterNullAdFilters() {
         final AdData adData = AD_DATA_BUILDER.setAdFilters(null).build();
-        final ContextualAds contextualAds =
+        final SignedContextualAds contextualAds =
                 CONTEXTUAL_ADS_BUILDER
                         .setAdsWithBid(ImmutableList.of(new AdWithBid(adData, 1.0)))
                         .build();
@@ -132,7 +132,7 @@
                                         .setFrequencyCapFilters(null)
                                         .build())
                         .build();
-        final ContextualAds contextualAds =
+        final SignedContextualAds contextualAds =
                 CONTEXTUAL_ADS_BUILDER
                         .setAdsWithBid(ImmutableList.of(new AdWithBid(adData, 1.0)))
                         .build();
@@ -153,7 +153,7 @@
                         .setAdFilters(
                                 new AdFilters.Builder().setAppInstallFilters(appFilters).build())
                         .build();
-        final ContextualAds contextualAds =
+        final SignedContextualAds contextualAds =
                 CONTEXTUAL_ADS_BUILDER
                         .setAdsWithBid(ImmutableList.of(new AdWithBid(adData, 1.0)))
                         .build();
@@ -177,7 +177,7 @@
                         .setAdFilters(
                                 new AdFilters.Builder().setAppInstallFilters(appFilters).build())
                         .build();
-        final ContextualAds contextualAds =
+        final SignedContextualAds contextualAds =
                 CONTEXTUAL_ADS_BUILDER
                         .setAdsWithBid(ImmutableList.of(new AdWithBid(adData, 1.0)))
                         .build();
@@ -209,7 +209,7 @@
                         .setAdFilters(
                                 new AdFilters.Builder().setAppInstallFilters(appFilters).build())
                         .build();
-        final ContextualAds contextualAds =
+        final SignedContextualAds contextualAds =
                 CONTEXTUAL_ADS_BUILDER
                         .setAdsWithBid(ImmutableList.of(new AdWithBid(adData, 1.0)))
                         .build();
@@ -248,7 +248,7 @@
                         .setAdFilters(
                                 new AdFilters.Builder().setAppInstallFilters(appFilters2).build())
                         .build();
-        final ContextualAds contextualAds =
+        final SignedContextualAds contextualAds =
                 CONTEXTUAL_ADS_BUILDER
                         .setAdsWithBid(
                                 ImmutableList.of(
@@ -285,7 +285,7 @@
                 ImmutableList.of(
                         new AdWithBid(adDataNotFiltered, 1.0), new AdWithBid(dataNoFilters, 2.0));
 
-        final ContextualAds contextualAds =
+        final SignedContextualAds contextualAds =
                 CONTEXTUAL_ADS_BUILDER.setAdsWithBid(adsWithBid).build();
 
         assertThat(mAdFilterer.filterContextualAds(contextualAds).getAdsWithBid())
@@ -313,7 +313,7 @@
         List<AdWithBid> adsWithBid =
                 ImmutableList.of(new AdWithBid(adData, 1.0), new AdWithBid(dataNoFilters, 2.0));
 
-        final ContextualAds contextualAds =
+        final SignedContextualAds contextualAds =
                 CONTEXTUAL_ADS_BUILDER.setAdsWithBid(adsWithBid).build();
 
         assertThat(mAdFilterer.filterContextualAds(contextualAds).getAdsWithBid())
@@ -355,7 +355,7 @@
         final AdData dataNoFilters = AD_DATA_NO_FILTER;
         List<AdWithBid> adsWithBid =
                 ImmutableList.of(new AdWithBid(adData, 1.0), new AdWithBid(dataNoFilters, 2.0));
-        final ContextualAds contextualAds =
+        final SignedContextualAds contextualAds =
                 CONTEXTUAL_ADS_BUILDER.setAdsWithBid(adsWithBid).build();
 
         assertThat(mAdFilterer.filterContextualAds(contextualAds).getAdsWithBid())
@@ -381,7 +381,7 @@
                 ImmutableList.of(
                         new AdWithBid(adDataOnlyWinFilters, 1.0),
                         new AdWithBid(dataNoFilters, 2.0));
-        final ContextualAds contextualAds =
+        final SignedContextualAds contextualAds =
                 CONTEXTUAL_ADS_BUILDER.setAdsWithBid(adsWithBid).build();
 
         assertThat(mAdFilterer.filterContextualAds(contextualAds).getAdsWithBid())
diff --git a/adservices/tests/unittest/service-core/src/com/android/adservices/service/adselection/AdFiltererNoOpImplTest.java b/adservices/tests/unittest/service-core/src/com/android/adservices/service/adselection/AdFiltererNoOpImplTest.java
index b8e36d4..7e3e358 100644
--- a/adservices/tests/unittest/service-core/src/com/android/adservices/service/adselection/AdFiltererNoOpImplTest.java
+++ b/adservices/tests/unittest/service-core/src/com/android/adservices/service/adselection/AdFiltererNoOpImplTest.java
@@ -19,8 +19,8 @@
 import static org.junit.Assert.assertEquals;
 
 import android.adservices.adselection.AdWithBid;
-import android.adservices.adselection.ContextualAds;
-import android.adservices.adselection.ContextualAdsFixture;
+import android.adservices.adselection.SignedContextualAds;
+import android.adservices.adselection.SignedContextualAdsFixture;
 import android.adservices.common.AdData;
 import android.adservices.common.AdDataFixture;
 import android.adservices.common.AdFilters;
@@ -47,8 +47,8 @@
     private static final AdData.Builder AD_DATA_BUILDER =
             AdDataFixture.getValidFilterAdDataBuilderByBuyer(CommonFixture.VALID_BUYER_1, 0);
 
-    private static final ContextualAds.Builder CONTEXTUAL_ADS_BUILDER =
-            ContextualAdsFixture.aContextualAdBuilder()
+    private static final SignedContextualAds.Builder CONTEXTUAL_ADS_BUILDER =
+            SignedContextualAdsFixture.aSignedContextualAdBuilder()
                     .setAdsWithBid(ImmutableList.of(new AdWithBid(AD_DATA_BUILDER.build(), 1.0)))
                     .setBuyer(CommonFixture.VALID_BUYER_1)
                     .setDecisionLogicUri(
@@ -64,7 +64,7 @@
     @Test
     public void testFilterNullAdFilters() {
         final AdData adData = AD_DATA_BUILDER.setAdFilters(null).build();
-        final ContextualAds contextualAds =
+        final SignedContextualAds contextualAds =
                 CONTEXTUAL_ADS_BUILDER
                         .setAdsWithBid(ImmutableList.of(new AdWithBid(adData, 1.0)))
                         .build();
@@ -82,7 +82,7 @@
                                         .setFrequencyCapFilters(null)
                                         .build())
                         .build();
-        final ContextualAds contextualAds =
+        final SignedContextualAds contextualAds =
                 CONTEXTUAL_ADS_BUILDER
                         .setAdsWithBid(ImmutableList.of(new AdWithBid(adData, 1.0)))
                         .build();
@@ -100,7 +100,7 @@
                         .setAdFilters(
                                 new AdFilters.Builder().setAppInstallFilters(appFilters).build())
                         .build();
-        final ContextualAds contextualAds =
+        final SignedContextualAds contextualAds =
                 CONTEXTUAL_ADS_BUILDER
                         .setAdsWithBid(ImmutableList.of(new AdWithBid(adData, 1.0)))
                         .build();
@@ -122,7 +122,7 @@
                         .setAdFilters(
                                 new AdFilters.Builder().setAppInstallFilters(appFilters).build())
                         .build();
-        final ContextualAds contextualAds =
+        final SignedContextualAds contextualAds =
                 CONTEXTUAL_ADS_BUILDER
                         .setAdsWithBid(ImmutableList.of(new AdWithBid(adData, 1.0)))
                         .build();
@@ -151,7 +151,7 @@
                         .setAdFilters(
                                 new AdFilters.Builder().setAppInstallFilters(appFilters2).build())
                         .build();
-        final ContextualAds contextualAds =
+        final SignedContextualAds contextualAds =
                 CONTEXTUAL_ADS_BUILDER
                         .setAdsWithBid(
                                 ImmutableList.of(
diff --git a/adservices/tests/unittest/service-core/src/com/android/adservices/service/adselection/AdSelectionConfigValidatorTest.java b/adservices/tests/unittest/service-core/src/com/android/adservices/service/adselection/AdSelectionConfigValidatorTest.java
index 30bdf9b..a66caec 100644
--- a/adservices/tests/unittest/service-core/src/com/android/adservices/service/adselection/AdSelectionConfigValidatorTest.java
+++ b/adservices/tests/unittest/service-core/src/com/android/adservices/service/adselection/AdSelectionConfigValidatorTest.java
@@ -16,6 +16,8 @@
 
 package com.android.adservices.service.adselection;
 
+import static android.adservices.adselection.SignedContextualAdsFixture.PLACEHOLDER_SIGNATURE;
+
 import static com.android.adservices.service.adselection.AdSelectionConfigValidator.DECISION_LOGIC_URI_TYPE;
 import static com.android.adservices.service.adselection.AdSelectionConfigValidator.TRUSTED_SCORING_SIGNALS_URI_TYPE;
 
@@ -26,8 +28,8 @@
 import android.adservices.adselection.AdSelectionConfig;
 import android.adservices.adselection.AdSelectionConfigFixture;
 import android.adservices.adselection.AdWithBid;
-import android.adservices.adselection.ContextualAds;
-import android.adservices.adselection.ContextualAdsFixture;
+import android.adservices.adselection.SignedContextualAds;
+import android.adservices.adselection.SignedContextualAdsFixture;
 import android.adservices.common.AdData;
 import android.adservices.common.AdDataFixture;
 import android.adservices.common.AdTechIdentifier;
@@ -346,17 +348,18 @@
 
     @Test
     public void testContextualAdsDecisionLogicEtldMismatch() {
-        Map<AdTechIdentifier, ContextualAds> buyerContextualAds = new HashMap<>();
+        Map<AdTechIdentifier, SignedContextualAds> buyerContextualAds = new HashMap<>();
         AdTechIdentifier buyer2 = CommonFixture.VALID_BUYER_2;
-        ContextualAds contextualAds2 =
-                ContextualAdsFixture.generateContextualAds(buyer2, ImmutableList.of(100.0, 200.0))
+        SignedContextualAds contextualAds2 =
+                SignedContextualAdsFixture.generateSignedContextualAds(
+                                buyer2, ImmutableList.of(100.0, 200.0))
                         .setDecisionLogicUri(
                                 CommonFixture.getUri(
                                         CommonFixture.VALID_BUYER_1, BUYER_BIDDING_LOGIC_URI_PATH))
                         .build();
         buyerContextualAds.put(buyer2, contextualAds2);
         AdSelectionConfig adSelectionConfig =
-                mAdSelectionConfigBuilder.setBuyerContextualAds(buyerContextualAds).build();
+                mAdSelectionConfigBuilder.setBuyerSignedContextualAds(buyerContextualAds).build();
         AdSelectionConfigValidator adSelectionConfigValidator =
                 new AdSelectionConfigValidator(
                         mPrebuiltLogicGenerator, new FrequencyCapAdDataValidatorImpl());
@@ -373,11 +376,11 @@
 
     @Test
     public void testContextualAdsRenderUriEtldMismatch() {
-        Map<AdTechIdentifier, ContextualAds> buyerContextualAds = new HashMap<>();
+        Map<AdTechIdentifier, SignedContextualAds> buyerContextualAds = new HashMap<>();
         AdTechIdentifier buyer2 = CommonFixture.VALID_BUYER_2;
         ImmutableList<Double> bids = ImmutableList.of(100.0, 200.0);
-        ContextualAds contextualAds2 =
-                ContextualAdsFixture.generateContextualAds(buyer2, bids)
+        SignedContextualAds contextualAds2 =
+                SignedContextualAdsFixture.generateSignedContextualAds(buyer2, bids)
                         .setDecisionLogicUri(
                                 CommonFixture.getUri(buyer2, BUYER_BIDDING_LOGIC_URI_PATH))
                         .setAdsWithBid(
@@ -394,7 +397,7 @@
         // Creating ads which have a render Uri with a different buyer
         buyerContextualAds.put(buyer2, contextualAds2);
         AdSelectionConfig adSelectionConfig =
-                mAdSelectionConfigBuilder.setBuyerContextualAds(buyerContextualAds).build();
+                mAdSelectionConfigBuilder.setBuyerSignedContextualAds(buyerContextualAds).build();
         AdSelectionConfigValidator adSelectionConfigValidator =
                 new AdSelectionConfigValidator(
                         mPrebuiltLogicGenerator, new FrequencyCapAdDataValidatorImpl());
@@ -440,20 +443,21 @@
         List<AdWithBid> adsWithBids =
                 List.of(new AdWithBid(adDataWithExceededFrequencyCapLimits, 100.0));
 
-        Map<AdTechIdentifier, ContextualAds> buyerContextualAds = new HashMap<>();
+        Map<AdTechIdentifier, SignedContextualAds> buyerContextualAds = new HashMap<>();
         buyerContextualAds.put(
                 CommonFixture.VALID_BUYER_1,
-                new ContextualAds.Builder()
+                new SignedContextualAds.Builder()
                         .setBuyer(CommonFixture.VALID_BUYER_1)
                         .setDecisionLogicUri(
                                 CommonFixture.getUri(
                                         CommonFixture.VALID_BUYER_1,
-                                        ContextualAdsFixture.DECISION_LOGIC_FRAGMENT))
+                                        SignedContextualAdsFixture.DECISION_LOGIC_FRAGMENT))
                         .setAdsWithBid(adsWithBids)
+                        .setSignature(PLACEHOLDER_SIGNATURE)
                         .build());
 
         AdSelectionConfig adSelectionConfig =
-                mAdSelectionConfigBuilder.setBuyerContextualAds(buyerContextualAds).build();
+                mAdSelectionConfigBuilder.setBuyerSignedContextualAds(buyerContextualAds).build();
 
         AdSelectionConfigValidator adSelectionConfigValidator =
                 new AdSelectionConfigValidator(
diff --git a/adservices/tests/unittest/service-core/src/com/android/adservices/service/adselection/AdSelectionE2ETest.java b/adservices/tests/unittest/service-core/src/com/android/adservices/service/adselection/AdSelectionE2ETest.java
index b5bacd8..5657dc5 100644
--- a/adservices/tests/unittest/service-core/src/com/android/adservices/service/adselection/AdSelectionE2ETest.java
+++ b/adservices/tests/unittest/service-core/src/com/android/adservices/service/adselection/AdSelectionE2ETest.java
@@ -81,10 +81,10 @@
 import android.adservices.adselection.AdSelectionConfigFixture;
 import android.adservices.adselection.AdSelectionInput;
 import android.adservices.adselection.AdSelectionResponse;
-import android.adservices.adselection.ContextualAds;
-import android.adservices.adselection.ContextualAdsFixture;
 import android.adservices.adselection.ReportImpressionCallback;
 import android.adservices.adselection.ReportImpressionInput;
+import android.adservices.adselection.SignedContextualAds;
+import android.adservices.adselection.SignedContextualAdsFixture;
 import android.adservices.common.AdDataFixture;
 import android.adservices.common.AdSelectionSignals;
 import android.adservices.common.AdServicesStatusUtils;
@@ -2877,7 +2877,7 @@
                                 mMockWebServerRule.uriForPath(SELLER_DECISION_LOGIC_URI_PATH))
                         .setTrustedScoringSignalsUri(
                                 mMockWebServerRule.uriForPath(SELLER_TRUSTED_SIGNAL_URI_PATH))
-                        .setBuyerContextualAds(createContextualAds())
+                        .setBuyerSignedContextualAds(createContextualAds())
                         .build();
 
         mMockWebServerRule.startMockWebServer(mDispatcher);
@@ -2971,7 +2971,7 @@
                                 mMockWebServerRule.uriForPath(SELLER_DECISION_LOGIC_URI_PATH))
                         .setTrustedScoringSignalsUri(
                                 mMockWebServerRule.uriForPath(SELLER_TRUSTED_SIGNAL_URI_PATH))
-                        .setBuyerContextualAds(createContextualAds())
+                        .setBuyerSignedContextualAds(createContextualAds())
                         .build();
 
         MockWebServer server = mMockWebServerRule.startMockWebServer(mDispatcher);
@@ -3145,7 +3145,7 @@
                                 mMockWebServerRule.uriForPath(SELLER_DECISION_LOGIC_URI_PATH))
                         .setTrustedScoringSignalsUri(
                                 mMockWebServerRule.uriForPath(SELLER_TRUSTED_SIGNAL_URI_PATH))
-                        .setBuyerContextualAds(createContextualAds())
+                        .setBuyerSignedContextualAds(createContextualAds())
                         .build();
 
         mMockWebServerRule.startMockWebServer(mDispatcher);
@@ -3261,7 +3261,7 @@
                                 mMockWebServerRule.uriForPath(SELLER_DECISION_LOGIC_URI_PATH))
                         .setTrustedScoringSignalsUri(
                                 mMockWebServerRule.uriForPath(SELLER_TRUSTED_SIGNAL_URI_PATH))
-                        .setBuyerContextualAds(createContextualAds())
+                        .setBuyerSignedContextualAds(createContextualAds())
                         .build();
 
         mMockWebServerRule.startMockWebServer(mDispatcher);
@@ -3330,7 +3330,7 @@
                                 mMockWebServerRule.uriForPath(SELLER_DECISION_LOGIC_URI_PATH))
                         .setTrustedScoringSignalsUri(
                                 mMockWebServerRule.uriForPath(SELLER_TRUSTED_SIGNAL_URI_PATH))
-                        .setBuyerContextualAds(createContextualAds())
+                        .setBuyerSignedContextualAds(createContextualAds())
                         .build();
 
         mMockWebServerRule.startMockWebServer(mDispatcher);
@@ -3418,7 +3418,7 @@
                         .setCustomAudienceBuyers(Collections.emptyList())
                         .setSeller(mSeller)
                         .setDecisionLogicUri(prebuiltUri)
-                        .setBuyerContextualAds(createContextualAds())
+                        .setBuyerSignedContextualAds(createContextualAds())
                         .setTrustedScoringSignalsUri(Uri.EMPTY)
                         .build();
 
@@ -3497,7 +3497,7 @@
                                 mMockWebServerRule.uriForPath(SELLER_DECISION_LOGIC_URI_PATH))
                         .setTrustedScoringSignalsUri(
                                 mMockWebServerRule.uriForPath(SELLER_TRUSTED_SIGNAL_URI_PATH))
-                        .setBuyerContextualAds(createContextualAds())
+                        .setBuyerSignedContextualAds(createContextualAds())
                         .build();
 
         mMockWebServerRule.startMockWebServer(mDispatcher);
@@ -7681,8 +7681,8 @@
                 adCost);
     }
 
-    private Map<AdTechIdentifier, ContextualAds> createContextualAds() {
-        Map<AdTechIdentifier, ContextualAds> buyerContextualAds = new HashMap<>();
+    private Map<AdTechIdentifier, SignedContextualAds> createContextualAds() {
+        Map<AdTechIdentifier, SignedContextualAds> buyerContextualAds = new HashMap<>();
 
         // In order to meet ETLd+1 requirements creating Contextual ads with MockWebserver's host
         AdTechIdentifier buyer2 =
@@ -7690,8 +7690,8 @@
                         mMockWebServerRule
                                 .uriForPath(BUYER_BIDDING_LOGIC_URI_PATH + BUYER_2)
                                 .getHost());
-        ContextualAds contextualAds2 =
-                ContextualAdsFixture.generateContextualAds(
+        SignedContextualAds contextualAds2 =
+                SignedContextualAdsFixture.generateSignedContextualAds(
                                 buyer2, ImmutableList.of(100.0, 200.0, 300.0, 400.0, 500.0))
                         .setDecisionLogicUri(
                                 mMockWebServerRule.uriForPath(
diff --git a/adservices/tests/unittest/service-core/src/com/android/adservices/service/adselection/AdsScoreGeneratorImplTest.java b/adservices/tests/unittest/service-core/src/com/android/adservices/service/adselection/AdsScoreGeneratorImplTest.java
index 18ffa31..7a4088a 100644
--- a/adservices/tests/unittest/service-core/src/com/android/adservices/service/adselection/AdsScoreGeneratorImplTest.java
+++ b/adservices/tests/unittest/service-core/src/com/android/adservices/service/adselection/AdsScoreGeneratorImplTest.java
@@ -62,8 +62,8 @@
 import android.adservices.adselection.AdSelectionConfig;
 import android.adservices.adselection.AdSelectionConfigFixture;
 import android.adservices.adselection.AdWithBid;
-import android.adservices.adselection.ContextualAds;
-import android.adservices.adselection.ContextualAdsFixture;
+import android.adservices.adselection.SignedContextualAds;
+import android.adservices.adselection.SignedContextualAdsFixture;
 import android.adservices.common.AdSelectionSignals;
 import android.adservices.common.AdTechIdentifier;
 import android.adservices.common.CommonFixture;
@@ -815,24 +815,24 @@
 
         Uri decisionLogicUri = mMockWebServerRule.uriForPath(mFetchJavaScriptPath);
 
-        Map<AdTechIdentifier, ContextualAds> contextualAdsMap = createContextualAds();
+        Map<AdTechIdentifier, SignedContextualAds> contextualAdsMap = createContextualAds();
         mAdSelectionConfig =
                 AdSelectionConfigFixture.anAdSelectionConfigWithContextualAdsBuilder()
                         .setDecisionLogicUri(decisionLogicUri)
                         .setTrustedScoringSignalsUri(
                                 mMockWebServerRule.uriForPath(mTrustedScoringSignalsPath))
-                        .setBuyerContextualAds(contextualAdsMap)
+                        .setBuyerSignedContextualAds(contextualAdsMap)
                         .build();
 
         List<AdWithBid> adsWithBid =
                 mAdBiddingOutcomeList.stream()
                         .map(a -> a.getAdWithBid())
                         .collect(Collectors.toList());
-        List<ContextualAds> contextualAds =
-                mAdSelectionConfig.getBuyerContextualAds().values().stream()
+        List<SignedContextualAds> signedContextualAds =
+                mAdSelectionConfig.getBuyerSignedContextualAds().values().stream()
                         .collect(Collectors.toList());
         List<AdWithBid> contextualBidAds = new ArrayList<>();
-        for (ContextualAds ctx : contextualAds) {
+        for (SignedContextualAds ctx : signedContextualAds) {
             contextualBidAds.addAll(ctx.getAdsWithBid());
         }
 
@@ -936,24 +936,24 @@
 
         Uri decisionLogicUri = mMockWebServerRule.uriForPath(mFetchJavaScriptPath);
 
-        Map<AdTechIdentifier, ContextualAds> contextualAdsMap = createContextualAds();
+        Map<AdTechIdentifier, SignedContextualAds> contextualAdsMap = createContextualAds();
         mAdSelectionConfig =
                 AdSelectionConfigFixture.anAdSelectionConfigWithContextualAdsBuilder()
                         .setDecisionLogicUri(decisionLogicUri)
                         .setTrustedScoringSignalsUri(
                                 mMockWebServerRule.uriForPath(mTrustedScoringSignalsPath))
-                        .setBuyerContextualAds(contextualAdsMap)
+                        .setBuyerSignedContextualAds(contextualAdsMap)
                         .build();
 
         List<AdWithBid> adsWithBid =
                 mAdBiddingOutcomeList.stream()
                         .map(a -> a.getAdWithBid())
                         .collect(Collectors.toList());
-        List<ContextualAds> contextualAds =
-                mAdSelectionConfig.getBuyerContextualAds().values().stream()
+        List<SignedContextualAds> signedContextualAds =
+                mAdSelectionConfig.getBuyerSignedContextualAds().values().stream()
                         .collect(Collectors.toList());
         List<AdWithBid> contextualBidAds = new ArrayList<>();
-        for (ContextualAds ctx : contextualAds) {
+        for (SignedContextualAds ctx : signedContextualAds) {
             contextualBidAds.addAll(ctx.getAdsWithBid());
         }
 
@@ -1084,24 +1084,24 @@
 
         Uri decisionLogicUri = mMockWebServerRule.uriForPath(mFetchJavaScriptPath);
 
-        Map<AdTechIdentifier, ContextualAds> contextualAdsMap = createContextualAds();
+        Map<AdTechIdentifier, SignedContextualAds> contextualAdsMap = createContextualAds();
         mAdSelectionConfig =
                 AdSelectionConfigFixture.anAdSelectionConfigWithContextualAdsBuilder()
                         .setDecisionLogicUri(decisionLogicUri)
                         .setTrustedScoringSignalsUri(
                                 mMockWebServerRule.uriForPath(mTrustedScoringSignalsPath))
-                        .setBuyerContextualAds(contextualAdsMap)
+                        .setBuyerSignedContextualAds(contextualAdsMap)
                         .build();
 
         List<AdWithBid> adsWithBid =
                 mAdBiddingOutcomeList.stream()
                         .map(a -> a.getAdWithBid())
                         .collect(Collectors.toList());
-        List<ContextualAds> contextualAds =
-                mAdSelectionConfig.getBuyerContextualAds().values().stream()
+        List<SignedContextualAds> signedContextualAds =
+                mAdSelectionConfig.getBuyerSignedContextualAds().values().stream()
                         .collect(Collectors.toList());
         List<AdWithBid> contextualBidAds = new ArrayList<>();
-        for (ContextualAds ctx : contextualAds) {
+        for (SignedContextualAds ctx : signedContextualAds) {
             contextualBidAds.addAll(ctx.getAdsWithBid());
         }
 
@@ -1255,24 +1255,24 @@
 
         Uri decisionLogicUri = mMockWebServerRule.uriForPath(mFetchJavaScriptPath);
 
-        Map<AdTechIdentifier, ContextualAds> contextualAdsMap = createContextualAds();
+        Map<AdTechIdentifier, SignedContextualAds> contextualAdsMap = createContextualAds();
         mAdSelectionConfig =
                 AdSelectionConfigFixture.anAdSelectionConfigWithContextualAdsBuilder()
                         .setDecisionLogicUri(decisionLogicUri)
                         .setTrustedScoringSignalsUri(
                                 mMockWebServerRule.uriForPath(mTrustedScoringSignalsPath))
-                        .setBuyerContextualAds(contextualAdsMap)
+                        .setBuyerSignedContextualAds(contextualAdsMap)
                         .build();
 
         List<AdWithBid> adsWithBid =
                 mAdBiddingOutcomeList.stream()
                         .map(a -> a.getAdWithBid())
                         .collect(Collectors.toList());
-        List<ContextualAds> contextualAds =
-                mAdSelectionConfig.getBuyerContextualAds().values().stream()
+        List<SignedContextualAds> signedContextualAds =
+                mAdSelectionConfig.getBuyerSignedContextualAds().values().stream()
                         .collect(Collectors.toList());
         List<AdWithBid> contextualBidAds = new ArrayList<>();
-        for (ContextualAds ctx : contextualAds) {
+        for (SignedContextualAds ctx : signedContextualAds) {
             contextualBidAds.addAll(ctx.getAdsWithBid());
         }
 
@@ -1899,18 +1899,19 @@
         assertEquals(AdSelectionSignals.EMPTY, signals.getUserBiddingSignals());
     }
 
-    private Map<AdTechIdentifier, ContextualAds> createContextualAds() {
-        Map<AdTechIdentifier, ContextualAds> buyerContextualAds = new HashMap<>();
+    private Map<AdTechIdentifier, SignedContextualAds> createContextualAds() {
+        Map<AdTechIdentifier, SignedContextualAds> buyerContextualAds = new HashMap<>();
 
         AdTechIdentifier buyer1 = BUYER_1;
-        ContextualAds contextualAds1 =
-                ContextualAdsFixture.generateContextualAds(
+        SignedContextualAds contextualAds1 =
+                SignedContextualAdsFixture.generateSignedContextualAds(
                                 buyer1, ImmutableList.of(100.0, 200.0, 300.0))
                         .build();
 
         AdTechIdentifier buyer2 = CommonFixture.VALID_BUYER_2;
-        ContextualAds contextualAds2 =
-                ContextualAdsFixture.generateContextualAds(buyer2, ImmutableList.of(400.0, 500.0))
+        SignedContextualAds contextualAds2 =
+                SignedContextualAdsFixture.generateSignedContextualAds(
+                                buyer2, ImmutableList.of(400.0, 500.0))
                         .build();
 
         buyerContextualAds.put(buyer1, contextualAds1);
diff --git a/adservices/tests/unittest/service-core/src/com/android/adservices/service/adselection/OnDeviceAdSelectionRunnerTest.java b/adservices/tests/unittest/service-core/src/com/android/adservices/service/adselection/OnDeviceAdSelectionRunnerTest.java
index 3b0bee3..ae38208 100644
--- a/adservices/tests/unittest/service-core/src/com/android/adservices/service/adselection/OnDeviceAdSelectionRunnerTest.java
+++ b/adservices/tests/unittest/service-core/src/com/android/adservices/service/adselection/OnDeviceAdSelectionRunnerTest.java
@@ -89,8 +89,8 @@
 import android.adservices.adselection.AdSelectionConfigFixture;
 import android.adservices.adselection.AdSelectionInput;
 import android.adservices.adselection.AdSelectionResponse;
-import android.adservices.adselection.ContextualAds;
-import android.adservices.adselection.ContextualAdsFixture;
+import android.adservices.adselection.SignedContextualAds;
+import android.adservices.adselection.SignedContextualAdsFixture;
 import android.adservices.common.AdDataFixture;
 import android.adservices.common.AdFilters;
 import android.adservices.common.AdSelectionSignals;
@@ -2973,12 +2973,13 @@
 
     @Test
     public void testCreateAdSelectionResult_Contextual_Enabled() throws AdServicesException {
+        Map<AdTechIdentifier, SignedContextualAds> signedContextualAdsMap = createContextualAds();
         AdSelectionConfig adSelectionConfig =
                 mAdSelectionConfigBuilder
                         .build()
                         .cloneToBuilder()
                         .setCustomAudienceBuyers(Collections.EMPTY_LIST)
-                        .setBuyerContextualAds(createContextualAds())
+                        .setBuyerSignedContextualAds(signedContextualAdsMap)
                         .build();
 
         final Flags flags =
@@ -3037,13 +3038,12 @@
                         eq(Collections.EMPTY_LIST), mAdSelectionConfigArgumentCaptor.capture());
         assertEquals(
                 "The contextual ads should have reached scoring as is",
-                createContextualAds(),
-                mAdSelectionConfigArgumentCaptor.getValue().getBuyerContextualAds());
+                signedContextualAdsMap,
+                mAdSelectionConfigArgumentCaptor.getValue().getBuyerSignedContextualAds());
     }
 
     @Test
-    public void testCreateAdSelectionResult_Contextual_DisabledAndSkipped()
-            throws ExecutionException, InterruptedException, TimeoutException, AdServicesException {
+    public void testCreateAdSelectionResult_Contextual_DisabledAndSkipped() {
         when(mClockSpy.instant()).thenReturn(Clock.systemUTC().instant());
         AdSelectionConfig adSelectionConfig =
                 mAdSelectionConfigBuilder
@@ -3051,7 +3051,7 @@
                         .cloneToBuilder()
                         .setCustomAudienceBuyers(Collections.EMPTY_LIST)
                         // Despite populating Contextual Ads, they will be removed
-                        .setBuyerContextualAds(createContextualAds())
+                        .setBuyerSignedContextualAds(createContextualAds())
                         .build();
         final Flags flags =
                 new OnDeviceAdSelectionRunnerTestFlags() {
@@ -3113,14 +3113,14 @@
     @Test
     public void testCreateAdSelectionResult_Contextual_AppInstallFiltered()
             throws AdServicesException {
-        Map<AdTechIdentifier, ContextualAds> contextualAdsMap = createContextualAds();
+        Map<AdTechIdentifier, SignedContextualAds> contextualAdsMap = createContextualAds();
 
         AdSelectionConfig adSelectionConfig =
                 mAdSelectionConfigBuilder
                         .build()
                         .cloneToBuilder()
                         .setCustomAudienceBuyers(Collections.EMPTY_LIST)
-                        .setBuyerContextualAds(contextualAdsMap)
+                        .setBuyerSignedContextualAds(contextualAdsMap)
                         .build();
 
         final Flags flags =
@@ -3171,7 +3171,7 @@
                 .thenReturn(contextualAdsMap.get(CommonFixture.VALID_BUYER_1));
         when(mMockAdFilterer.filterContextualAds(contextualAdsMap.get(CommonFixture.VALID_BUYER_2)))
                 .thenReturn(
-                        new ContextualAds.Builder()
+                        SignedContextualAdsFixture.aSignedContextualAdBuilder()
                                 .setBuyer(CommonFixture.VALID_BUYER_2)
                                 .setDecisionLogicUri(
                                         contextualAdsMap
@@ -3188,7 +3188,7 @@
                 contextualAdsMap.get(CommonFixture.VALID_BUYER_1).getAdsWithBid(),
                 mAdSelectionConfigArgumentCaptor
                         .getValue()
-                        .getBuyerContextualAds()
+                        .getBuyerSignedContextualAds()
                         .get(CommonFixture.VALID_BUYER_1)
                         .getAdsWithBid());
         assertEquals(
@@ -3196,7 +3196,7 @@
                 Collections.EMPTY_LIST,
                 mAdSelectionConfigArgumentCaptor
                         .getValue()
-                        .getBuyerContextualAds()
+                        .getBuyerSignedContextualAds()
                         .get(CommonFixture.VALID_BUYER_2)
                         .getAdsWithBid());
     }
@@ -3826,20 +3826,21 @@
         }
     }
 
-    private Map<AdTechIdentifier, ContextualAds> createContextualAds() {
-        Map<AdTechIdentifier, ContextualAds> buyerContextualAds = new HashMap<>();
+    private Map<AdTechIdentifier, SignedContextualAds> createContextualAds() {
+        Map<AdTechIdentifier, SignedContextualAds> buyerContextualAds = new HashMap<>();
 
         AdTechIdentifier buyer1 = CommonFixture.VALID_BUYER_1;
-        ContextualAds contextualAds1 =
-                ContextualAdsFixture.generateContextualAds(
+        SignedContextualAds contextualAds1 =
+                SignedContextualAdsFixture.generateSignedContextualAds(
                                 buyer1, ImmutableList.of(100.0, 200.0, 300.0))
                         .setDecisionLogicUri(
                                 CommonFixture.getUri(BUYER_1, BUYER_BIDDING_LOGIC_URI_PATH))
                         .build();
 
         AdTechIdentifier buyer2 = CommonFixture.VALID_BUYER_2;
-        ContextualAds contextualAds2 =
-                ContextualAdsFixture.generateContextualAds(buyer2, ImmutableList.of(400.0, 500.0))
+        SignedContextualAds contextualAds2 =
+                SignedContextualAdsFixture.generateSignedContextualAds(
+                                buyer2, ImmutableList.of(400.0, 500.0))
                         .setDecisionLogicUri(
                                 CommonFixture.getUri(BUYER_2, BUYER_BIDDING_LOGIC_URI_PATH))
                         .build();
diff --git a/adservices/tests/unittest/service-core/src/com/android/adservices/service/common/FledgeE2ETest.java b/adservices/tests/unittest/service-core/src/com/android/adservices/service/common/FledgeE2ETest.java
index 9892411..bb6a740 100644
--- a/adservices/tests/unittest/service-core/src/com/android/adservices/service/common/FledgeE2ETest.java
+++ b/adservices/tests/unittest/service-core/src/com/android/adservices/service/common/FledgeE2ETest.java
@@ -65,8 +65,6 @@
 import android.adservices.adselection.AdSelectionOverrideCallback;
 import android.adservices.adselection.AdSelectionResponse;
 import android.adservices.adselection.BuyersDecisionLogic;
-import android.adservices.adselection.ContextualAds;
-import android.adservices.adselection.ContextualAdsFixture;
 import android.adservices.adselection.DecisionLogic;
 import android.adservices.adselection.ReportEventRequest;
 import android.adservices.adselection.ReportImpressionCallback;
@@ -75,6 +73,8 @@
 import android.adservices.adselection.ReportInteractionInput;
 import android.adservices.adselection.SetAppInstallAdvertisersCallback;
 import android.adservices.adselection.SetAppInstallAdvertisersInput;
+import android.adservices.adselection.SignedContextualAds;
+import android.adservices.adselection.SignedContextualAdsFixture;
 import android.adservices.adselection.UpdateAdCounterHistogramInput;
 import android.adservices.common.AdData;
 import android.adservices.common.AdDataFixture;
@@ -3081,7 +3081,7 @@
                                         AdTechIdentifier.fromString(
                                                 mLocalhostBuyerDomain.getHost()),
                                         AdSelectionSignals.fromString("{\"buyer_signals\":0}")))
-                        .setBuyerContextualAds(createContextualAds())
+                        .setBuyerSignedContextualAds(createContextualAds())
                         .build();
 
         String decisionLogicJs =
@@ -4882,21 +4882,20 @@
         }
     }
 
-    private Map<AdTechIdentifier, ContextualAds> createContextualAds() {
-        Map<AdTechIdentifier, ContextualAds> buyerContextualAds = new HashMap<>();
+    private Map<AdTechIdentifier, SignedContextualAds> createContextualAds() {
+        Map<AdTechIdentifier, SignedContextualAds> buyerContextualAds = new HashMap<>();
 
         // In order to meet ETLd+1 requirements creating Contextual ads with MockWebserver's host
         AdTechIdentifier buyer =
                 AdTechIdentifier.fromString(
                         mockWebServerRule.uriForPath(BUYER_BIDDING_LOGIC_URI_PATH).getHost());
-        ContextualAds contextualAds =
-                ContextualAdsFixture.generateContextualAds(
+        SignedContextualAds contextualAds =
+                SignedContextualAdsFixture.generateSignedContextualAds(
                                 buyer, ImmutableList.of(100.0, 200.0, 300.0, 400.0, 500.0))
                         .setDecisionLogicUri(
                                 mockWebServerRule.uriForPath(BUYER_BIDDING_LOGIC_URI_PATH))
                         .build();
         buyerContextualAds.put(buyer, contextualAds);
-
         return buyerContextualAds;
     }