openapi: "3.0.3"
info:
  title: legalconsenthub-middleware
  version: 0.1.0
  description: Middleware for digital signature services using OpenSC pkcs11-tool for hash signing.
  contact:
    name: Denis Lugowski
    email: denis.lugowski@gmail.com

servers:
  - url: http://localhost:8081

security:
  - bearerAuth: []

paths:
  ####### Smart Card Operations #######
  /smart-card/info:
    get:
      summary: Get smart card information
      operationId: getSmartCardInfo
      tags:
        - smart-card
      responses:
        "200":
          description: Smart card information
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/SmartCardInfoDto"
        "400":
          $ref: "https://api.swaggerhub.com/domains/smartbear-public/ProblemDetails/1.0.0#/components/responses/BadRequest"
        "401":
          $ref: "https://api.swaggerhub.com/domains/smartbear-public/ProblemDetails/1.0.0#/components/responses/Unauthorized"
        "404":
          $ref: "https://api.swaggerhub.com/domains/smartbear-public/ProblemDetails/1.0.0#/components/responses/NotFound"
        "500":
          $ref: "https://api.swaggerhub.com/domains/smartbear-public/ProblemDetails/1.0.0#/components/responses/ServerError"
        "503":
          $ref: "https://api.swaggerhub.com/domains/smartbear-public/ProblemDetails/1.0.0#/components/responses/ServiceUnavailable"

  /smart-card/certificates:
    get:
      summary: Get available certificates on smart card
      operationId: getSmartCardCertificates
      tags:
        - smart-card
      responses:
        "200":
          description: List of available certificates
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/CertificateDto"
        "400":
          $ref: "https://api.swaggerhub.com/domains/smartbear-public/ProblemDetails/1.0.0#/components/responses/BadRequest"
        "401":
          $ref: "https://api.swaggerhub.com/domains/smartbear-public/ProblemDetails/1.0.0#/components/responses/Unauthorized"
        "404":
          $ref: "https://api.swaggerhub.com/domains/smartbear-public/ProblemDetails/1.0.0#/components/responses/NotFound"
        "500":
          $ref: "https://api.swaggerhub.com/domains/smartbear-public/ProblemDetails/1.0.0#/components/responses/ServerError"
        "503":
          $ref: "https://api.swaggerhub.com/domains/smartbear-public/ProblemDetails/1.0.0#/components/responses/ServiceUnavailable"

  ####### PDF Hash Signing Operations #######
  /sign-pdf-hash:
    post:
      summary: Calculate hash from PDF and sign it using smart card
      operationId: signPdfHash
      tags:
        - signature
      requestBody:
        required: true
        content:
          multipart/form-data:
            schema:
              $ref: "#/components/schemas/SignPdfHashRequestDto"
      responses:
        "200":
          description: Base64 encoded signature
          content:
            text/plain:
              schema:
                type: string
                description: Base64 encoded signature
        "400":
          $ref: "https://api.swaggerhub.com/domains/smartbear-public/ProblemDetails/1.0.0#/components/responses/BadRequest"
        "401":
          $ref: "https://api.swaggerhub.com/domains/smartbear-public/ProblemDetails/1.0.0#/components/responses/Unauthorized"
        "404":
          $ref: "https://api.swaggerhub.com/domains/smartbear-public/ProblemDetails/1.0.0#/components/responses/NotFound"
        "500":
          $ref: "https://api.swaggerhub.com/domains/smartbear-public/ProblemDetails/1.0.0#/components/responses/ServerError"
        "503":
          $ref: "https://api.swaggerhub.com/domains/smartbear-public/ProblemDetails/1.0.0#/components/responses/ServiceUnavailable"

  /verify-signature:
    post:
      summary: Verify a signature against a document
      operationId: verifySignature
      tags:
        - signature
      requestBody:
        required: true
        content:
          multipart/form-data:
            schema:
              $ref: "#/components/schemas/VerifySignatureRequestDto"
      responses:
        "200":
          description: Signature verification result
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/VerifySignatureResponseDto"
        "400":
          $ref: "https://api.swaggerhub.com/domains/smartbear-public/ProblemDetails/1.0.0#/components/responses/BadRequest"
        "401":
          $ref: "https://api.swaggerhub.com/domains/smartbear-public/ProblemDetails/1.0.0#/components/responses/Unauthorized"
        "404":
          $ref: "https://api.swaggerhub.com/domains/smartbear-public/ProblemDetails/1.0.0#/components/responses/NotFound"
        "500":
          $ref: "https://api.swaggerhub.com/domains/smartbear-public/ProblemDetails/1.0.0#/components/responses/ServerError"
        "503":
          $ref: "https://api.swaggerhub.com/domains/smartbear-public/ProblemDetails/1.0.0#/components/responses/ServiceUnavailable"

components:
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT

  schemas:
    ####### Smart Card DTOs #######
    SmartCardInfoDto:
      type: object
      required:
        - isPresent
        - label
      properties:
        isPresent:
          type: boolean
        label:
          type: string
        serialNumber:
          type: string
        manufacturer:
          type: string
        model:
          type: string

    CertificateDto:
      type: object
      required:
        - id
        - subject
        - issuer
        - validFrom
        - validTo
        - keyUsage
      properties:
        id:
          type: string
        subject:
          type: string
        issuer:
          type: string
        validFrom:
          type: string
          format: date-time
        validTo:
          type: string
          format: date-time
        keyUsage:
          type: array
          items:
            type: string
        fingerprint:
          type: string

    ####### PDF Hash Signing DTOs #######
    SignPdfHashRequestDto:
      type: object
      required:
        - document
        - certificateId
      properties:
        document:
          type: string
          format: binary
          description: PDF document to calculate hash from
        certificateId:
          type: string
          description: ID of the certificate to use for signing
        hashAlgorithm:
          type: string
          enum: [SHA1, SHA256, SHA384, SHA512]
          default: SHA256
          description: Hash algorithm to use

    VerifySignatureRequestDto:
      type: object
      required:
        - document
        - signature
      properties:
        document:
          type: string
          format: binary
          description: Document to verify signature against
        signature:
          type: string
          description: Base64 encoded signature to verify
        certificateId:
          type: string
          description: ID of the certificate to use for verification (optional, will use embedded certificate if not provided)
        hashAlgorithm:
          type: string
          enum: [SHA1, SHA256, SHA384, SHA512]
          default: SHA256
          description: Hash algorithm used for verification

    VerifySignatureResponseDto:
      type: object
      required:
        - isValid
      properties:
        isValid:
          type: boolean
          description: Whether the signature is valid
        certificateInfo:
          $ref: "#/components/schemas/CertificateDto"
          description: Information about the certificate used for signing
        verificationDetails:
          type: string
          description: Additional details about the verification process
