mouse07410 / asn1c

The ASN.1 Compiler
http://lionet.info/asn1c/
BSD 2-Clause "Simplified" License
94 stars 70 forks source link

COER decoding fails with a specific item (USDOT SCMS protocol, 1609.2 related) #116

Open nobodyguy opened 1 year ago

nobodyguy commented 1 year ago

Hello, I've come across a weird issue with COER decoding. I have ScopedLocalPolicyFile PDU (XER version is here: https://github.com/nobodyguy/asn1c_sandbox_do_not_use/blob/main/fixtures/ScopedLocalPolicyFile.xml) When I try to decode it from COER to text or any other encoding, it returns:

AD: Processing ./ScopedLocalPolicyFile.coer
AD: Decoding 1962 bytes
AD: decode(0) consumed 1+0b (1962), code 2
# I added asn_fprint trace with partially decoded struct here:
ScopedLocalPolicyFile ::= {
    version: 1
    content: LocalPolicyFile ::= {
        globalParameters: BasePolicyFile ::= {
            version: 1
            tbsData: ToBeSignedPolicyData ::= {
                policyID: 31 32
                generationTime: 445819815000000
                activeTime: 445819815000000
                policy: CustomPolicyData ::= {
                    requestingRaHostname: test.com
                    globalPolicy: GlobalPolicyData ::= {
                        temporalSeriesOfScmsVersion: temporalSeriesOfScmsVersion ::= {
                            initialScmsVersion: 1
                            intervals: intervals ::= {
                                SEQUENCE ::= {
                                    startTime: 445819815000000
                                    scmsVersion: 1
                                }
                            }
                        }
                        temporalSeriesOfCertChainFileID: temporalSeriesOfCertChainFileID ::= {
                            initialGlobalCertChainFileID: 1
                            intervals: intervals ::= {
                                SEQUENCE ::= {
                                    startTime: 445819815000000
                                    globalCertChainFileID: 1
                                }
                            }
                        }
                        temporalSeriesOfOverdueCrlTolerance: temporalSeriesOfOverdueCrlTolerance ::= {
                            initialOverdueCrlTolerance: 336
                            intervals: intervals ::= {
                                SEQUENCE ::= {
                                    startTime: 445819815000000
                                    overdueCrlTolerance: 336
                                }
                            }
                        }
                        temporalSeriesOfIPeriod: temporalSeriesOfIPeriod ::= {
                            initialIPeriod: 168
                            intervals: intervals ::= {
                                SEQUENCE ::= {
                                    startTime: 445819815000000
                                    iPeriod: 168
                                }
                            }
                        }
                        temporalSeriesOfMinCertsPerIPeriod: temporalSeriesOfMinCertsPerIPeriod ::= {
                            initialMinCertsPerIPeriod: 20
                            intervals: intervals ::= {
                                SEQUENCE ::= {
                                    startTime: 445819815000000
                                    minCertsPerIPeriod: 20
                                }
                            }
                        }
                        temporalSeriesOfCertValidityModel: temporalSeriesOfCertValidityModel ::= {
                            initialCertValidityModel: 1 (concurrent)
                            intervals: intervals ::= {
                                SEQUENCE ::= {
                                    startTime: 445819815000000
                                    certValidityModel: 1 (concurrent)
                                }
                            }
                        }
                        temporalSeriesOfMaxAvailableCertSupply: temporalSeriesOfMaxAvailableCertSupply ::= {
                            initialMaxAvailableCertSupply: 3360
                            intervals: intervals ::= {
                                SEQUENCE ::= {
                                    startTime: 445819815000000
                                    maxAvailableCertSupply: 3360
                                }
                            }
                        }
                        temporalSeriesOfMaxCertRequestAge: temporalSeriesOfMaxCertRequestAge ::= {
                            initialMaxCertRequestAge: 48
                            intervals: intervals ::= {
                                SEQUENCE ::= {
                                    startTime: 445819815000000
                                    maxCertRequestAge: 48
                                }
                            }
                        }
                        temporalSeriesOfShuffleThreshold: temporalSeriesOfShuffleThreshold ::= {
                            initialShuffleThreshold: 10000
                            intervals: intervals ::= {
                                SEQUENCE ::= {
                                    startTime: 445819815000000
                                    shuffleThreshold: 10000
                                }
                            }
                        }
                        temporalSeriesOfHashOfRequestSize: temporalSeriesOfHashOfRequestSize ::= {
                            initialHashOfRequestSize: 32
                            intervals: intervals ::= {
                                SEQUENCE ::= {
                                    startTime: 445819815000000
                                    hashOfRequestSize: 32
                                }
                            }
                        }
                        temporalSeriesOfMaxGpfGccfRetrievalInterval: temporalSeriesOfMaxGpfGccfRetrievalInterval ::= {
                            initialMaxGpfGccfRetrievalInterval: 1
                            intervals: intervals ::= {
                                SEQUENCE ::= {
                                    startTime: 445819815000000
                                    maxGpfGccfRetrievalInterval: 1
                                }
                            }
                        }
                        temporalSeriesOfRseApplicationCertValidity: temporalSeriesOfRseApplicationCertValidity ::= {
                            initialRseApplicationCertValidity: 169
                            intervals: intervals ::= {
                                SEQUENCE ::= {
                                    startTime: 445819815000000
                                    rseApplicationCertValidity: 169
                                }
                            }
                        }
                        temporalSeriesOfRseApplicationCertOVerlap: temporalSeriesOfRseApplicationCertOVerlap ::= {
                            initialRseApplicationCertOverlap: 1
                            intervals: intervals ::= {
                                SEQUENCE ::= {
                                    startTime: 445819815000000
                                    rseApplicationCertOverlap: 1
                                }
                            }
                        }
                    }
                }
            }
            signatures: signatures ::= {
            }
        }
        localParameters: BasePolicyFile ::= {
            version: 0
            tbsData: ToBeSignedPolicyData ::= {
                policyID: 
                generationTime: <absent>
                activeTime: <absent>
                policy: <absent>
            }
            signatures: signatures ::= {
            }
        }
    }
}
AD: Clean up partially decoded ScopedLocalPolicyFile
AD: ofp 1, no=1, oo=0, dbl=0
./ScopedLocalPolicyFile.coer: Decode failed past byte 1: Input processing error

I found out that it's caused by this element:

<temporalSeriesOfMaxCertRequestAge>
    <initialMaxCertRequestAge>
        <hours>48</hours>
    </initialMaxCertRequestAge>
    <intervals>
        <SEQUENCE>
            <startTime>445819815000000</startTime>
            <maxCertRequestAge>
                <hours>48</hours>
            </maxCertRequestAge>
        </SEQUENCE>
    </intervals>
</temporalSeriesOfMaxCertRequestAge>

When I remove it and try to decode it, it works as expected. What's wrong with that? temporalSeriesOfMaxCertRequestAge is defined as:

   MaxCertRequestAge ::= Duration  

    temporalSeriesOfMaxCertRequestAge SEQUENCE {
        initialMaxCertRequestAge MaxCertRequestAge,
        intervals SEQUENCE SIZE(0..MAX) OF SEQUENCE {
            startTime Time64,
            maxCertRequestAge MaxCertRequestAge
        }
    } OPTIONAL,

I thought that maybe there is something wrong with Time64 or Duration type, but there is also temporalSeriesOfMaxAvailableCertSupply element with the same definition that works.

   MaxAvailableCertSupply ::= Duration

    temporalSeriesOfMaxAvailableCertSupply SEQUENCE {
        initialMaxAvailableCertSupply MaxAvailableCertSupply,
        intervals SEQUENCE SIZE(0..MAX) OF SEQUENCE {
            startTime Time64,
            maxAvailableCertSupply MaxAvailableCertSupply
        }
    } OPTIONAL,

I tried the latest master of vlm/asn1c and also latest vlm_master of this fork. Sandbox is here: https://github.com/nobodyguy/asn1c_sandbox_do_not_use