/**
 *
 *    Copyright (c) 2022-2023 Project CHIP Authors
 *
 *    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.
 */

#import <Foundation/Foundation.h>

#import <Matter/MTRCommandPayloadsObjc.h>
#import <Matter/MTRDefines.h>

NS_ASSUME_NONNULL_BEGIN

/**
 * Represents information relating to a certificate signing request for a Matter
 * operational certificate.
 */
MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4))
@interface MTROperationalCSRInfo : NSObject

/**
 * DER-encoded certificate signing request.
 */
@property (nonatomic, copy, readonly) MTRCSRDERBytes csr;

/**
 * The nonce associated with this CSR.
 */
@property (nonatomic, copy, readonly) NSData * csrNonce;

/**
 * TLV-encoded nocsr-elements structure.  This includes the "csr" and "csrNonce"
 * fields, and can include additional vendor-specific information.
 */
@property (nonatomic, copy, readonly) MTRTLVBytes csrElementsTLV;

/**
 * A signature, using the device attestation private key of the device that
 * created the CSR, over the concatenation of csrElementsTLV and the attestation
 * challenge from the secure session.
 *
 * The attestation challenge is available in MTRAttestionInfo.
 */
@property (nonatomic, copy, readonly) NSData * attestationSignature;

/**
 * Initialize an MTROperationalCSRInfo by providing all the fields.  It's the
 * caller's responsibility to ensure that csr and csrNonce match the csrElementsTLV.
 */
- (instancetype)initWithCSR:(MTRCSRDERBytes)csr
                   csrNonce:(NSData *)csrNonce
             csrElementsTLV:(MTRTLVBytes)csrElementsTLV
       attestationSignature:(NSData *)attestationSignature
    MTR_DEPRECATED("Please use one of the initializers that validates the input", ios(16.4, 17.0), macos(13.3, 14.0),
        watchos(9.4, 10.0), tvos(16.4, 17.0));

/**
 * Initialize an MTROperationalCSRInfo by providing the csrNonce (for example,
 * the nonce the client initially supplied), and the csrElementsTLV and
 * attestationSignature that the server returned.  This will ensure that
 * csrNonce matches the data in csrElementsTLV, returning nil if it does not,
 * and extract the csr from csrElementsTLV.
 */
- (nullable instancetype)initWithCSRNonce:(NSData *)csrNonce
                           csrElementsTLV:(MTRTLVBytes)csrElementsTLV
                     attestationSignature:(NSData *)attestationSignature
    MTR_AVAILABLE(ios(17.0), macos(14.0), watchos(10.0), tvos(17.0));

/**
 * Initialize an MTROperationalCSRInfo by providing just the csrElementsTLV and
 * attestationSignature (which can come from an
 * MTROperationalCredentialsClusterCSRResponseParams).  This will extract the
 * csr and csrNonce from the csrElementsTLV, if possible, and return nil if that
 * fails.
 */
- (nullable instancetype)initWithCSRElementsTLV:(MTRTLVBytes)csrElementsTLV
                           attestationSignature:(NSData *)attestationSignature
    MTR_AVAILABLE(ios(17.0), macos(14.0), watchos(10.0), tvos(17.0));

/**
 * Initialize an MTROperationalCSRInfo by providing an
 * MTROperationalCredentialsClusterCSRResponseParams.  This will extract the
 * relevant fields from the response data.
 */
- (nullable instancetype)initWithCSRResponseParams:(MTROperationalCredentialsClusterCSRResponseParams *)responseParams
    MTR_AVAILABLE(ios(17.0), macos(14.0), watchos(10.0), tvos(17.0));
@end

MTR_DEPRECATED("Please use MTROperationalCSRInfo", ios(16.1, 16.4), macos(13.0, 13.3), watchos(9.1, 9.4), tvos(16.1, 16.4))
@interface CSRInfo : NSObject

@property (nonatomic, copy) NSData * nonce;

@property (nonatomic, copy) NSData * elements;

@property (nonatomic, copy) NSData * elementsSignature;

@property (nonatomic, copy) NSData * csr;

- (instancetype)initWithNonce:(NSData *)nonce
                     elements:(NSData *)elements
            elementsSignature:(NSData *)elementsSignature
                          csr:(NSData *)csr;

@end

NS_ASSUME_NONNULL_END
