@@ -65,6 +65,11 @@ func BuildSandboxConfig(
6565 return nil , nil , fmt .Errorf ("failed to parse sandbox options: %w" , err )
6666 }
6767
68+ // isConfidentialSNP is true when we have a security policy AND real SNP hardware.
69+ // This gates SNP-specific HCS document construction (schema V25, confidential boot, etc.).
70+ // When no-security-hardware is set, we still plumb the policy but use the standard HCS doc.
71+ isConfidentialSNP := sandboxOptions .ConfidentialConfig != nil && ! sandboxOptions .NoSecurityHardware
72+
6873 // ================== Parse Topology (CPU, Memory, NUMA) options =================
6974 // ===============================================================================
7075
@@ -86,10 +91,10 @@ func BuildSandboxConfig(
8691 return nil , nil , fmt .Errorf ("failed to parse memory parameters: %w" , err )
8792 }
8893
89- // Parse NUMA settings only for non- confidential VMs.
94+ // Parse NUMA settings only for SNP confidential VMs.
9095 var numa * hcsschema.Numa
9196 var numaProcessors * hcsschema.NumaProcessors
92- if sandboxOptions . ConfidentialConfig == nil {
97+ if ! isConfidentialSNP {
9398 numa , numaProcessors , err = parseNUMAOptions (
9499 ctx ,
95100 spec .Annotations ,
@@ -121,11 +126,11 @@ func BuildSandboxConfig(
121126 // ================== Parse Boot options =========================================
122127 // ===============================================================================
123128
124- // For confidential VMs, we don't use the standard boot options - the UEFI secure boot
129+ // For SNP confidential VMs, we don't use the standard boot options - the UEFI secure boot
125130 // settings will be set by parseConfidentialOptions.
126131 bootOptions := & hcsschema.Chipset {}
127132 var rootFsFullPath string
128- if sandboxOptions . ConfidentialConfig == nil {
133+ if ! isConfidentialSNP {
129134 bootOptions , rootFsFullPath , err = parseBootOptions (ctx , opts , spec .Annotations )
130135 if err != nil {
131136 return nil , nil , fmt .Errorf ("failed to parse boot options: %w" , err )
@@ -141,9 +146,9 @@ func BuildSandboxConfig(
141146 spec .Annotations ,
142147 spec .Devices ,
143148 rootFsFullPath ,
144- numa != nil && numaProcessors != nil , // isNumaEnabled
145- sandboxOptions .FullyPhysicallyBacked , // isFullyPhysicallyBacked
146- sandboxOptions . ConfidentialConfig != nil , // isConfidential
149+ numa != nil && numaProcessors != nil , // isNumaEnabled
150+ sandboxOptions .FullyPhysicallyBacked , // isFullyPhysicallyBacked
151+ isConfidentialSNP , // isConfidential
147152 )
148153 if err != nil {
149154 return nil , nil , fmt .Errorf ("failed to parse device options: %w" , err )
@@ -156,7 +161,7 @@ func BuildSandboxConfig(
156161 hvSocketConfig , comPorts , err := setAdditionalOptions (
157162 ctx ,
158163 spec .Annotations ,
159- sandboxOptions . ConfidentialConfig != nil , // isConfidential
164+ isConfidentialSNP , // isConfidential
160165 )
161166 if err != nil {
162167 return nil , nil , fmt .Errorf ("failed to parse additional parameters: %w" , err )
@@ -169,7 +174,7 @@ func BuildSandboxConfig(
169174 var securitySettings * hcsschema.SecuritySettings
170175 var guestState * hcsschema.GuestState
171176 var filesToCleanOnError []string
172- if sandboxOptions . ConfidentialConfig != nil {
177+ if isConfidentialSNP {
173178 bootOptions ,
174179 securitySettings ,
175180 guestState ,
@@ -204,9 +209,9 @@ func BuildSandboxConfig(
204209 // ===============================================================================
205210
206211 // Build the kernel command line after all options are parsed.
207- // For confidential VMs (SNP mode) , kernel args are embedded in VMGS file, so skip this.
212+ // For SNP confidential VMs, kernel args are embedded in VMGS file, so skip this.
208213 var kernelArgs string
209- if sandboxOptions . ConfidentialConfig == nil {
214+ if ! isConfidentialSNP {
210215 kernelArgs , err = buildKernelArgs (
211216 ctx ,
212217 opts ,
@@ -238,7 +243,7 @@ func BuildSandboxConfig(
238243 // Use Schema V21 for non-confidential cases.
239244 // Use Schema V25 for confidential cases.
240245 schema := schemaversion .SchemaV21 ()
241- if sandboxOptions . ConfidentialConfig != nil {
246+ if isConfidentialSNP {
242247 schema = schemaversion .SchemaV25 ()
243248 }
244249
@@ -332,12 +337,13 @@ func parseSandboxOptions(ctx context.Context, platform string, annotations map[s
332337 // Determine if this is a confidential VM early, as it affects boot options parsing
333338 securityPolicy := oci .ParseAnnotationsString (annotations , shimannotations .LCOWSecurityPolicy , "" )
334339 noSecurityHardware := oci .ParseAnnotationsBool (ctx , annotations , shimannotations .NoSecurityHardware , false )
335- if securityPolicy != "" && ! noSecurityHardware {
340+ if len ( securityPolicy ) > 0 {
336341 sandboxOptions .ConfidentialConfig = & ConfidentialConfig {
337342 SecurityPolicy : securityPolicy ,
338- SecurityPolicyEnforcer : oci .ParseAnnotationsString (annotations , shimannotations .LCOWSecurityPolicyEnforcer , "" ),
343+ SecurityPolicyEnforcer : oci .ParseAnnotationsString (annotations , shimannotations .LCOWSecurityPolicyEnforcer , "rego " ),
339344 UvmReferenceInfoFile : oci .ParseAnnotationsString (annotations , shimannotations .LCOWReferenceInfoFile , vmutils .DefaultUVMReferenceInfoFile ),
340345 }
346+ sandboxOptions .NoSecurityHardware = noSecurityHardware
341347
342348 log .G (ctx ).WithFields (logrus.Fields {
343349 "securityPolicy" : securityPolicy ,
0 commit comments