Sha256: 76a16dbb05395e204e9a4c1f785848d5f8c45575252d18be65129d189b2305a6

Contents?: true

Size: 1.36 KB

Versions: 3

Compression:

Stored size: 1.36 KB

Contents

# typed: strict
# frozen_string_literal: true

module Paseto
  module ASN1
    class ECDSASignature < T::Struct
      extend T::Sig

      const :signature, T.any(ECDSASigValue, ECDSAFullR)

      sig { params(bytes: String, part_len: Integer).returns(ECDSASignature) }
      def self.from_rs(bytes, part_len)
        r = OpenSSL::BN.new(T.must(bytes[0, part_len]), 2)
        s = OpenSSL::BN.new(T.must(bytes[-part_len, part_len]), 2)
        new(signature: ECDSASigValue.new(r: r, s: s))
      end

      sig { params(sig: String).returns(ECDSASignature) }
      def self.from_asn1(sig)
        r, s = OpenSSL::ASN1.decode(sig).value.map(&:value)
        new(signature: ECDSASigValue.new(r: r, s: s))
      end

      sig { returns(OpenSSL::ASN1::Sequence) }
      def build
        signature.build
      end

      sig { returns(String) }
      def to_der
        build.to_der
      end

      sig { params(part_len: Integer).returns(String) }
      def to_rs(part_len)
        case signature
        when ECDSASigValue
          r = T.cast(signature.r, OpenSSL::BN).to_s(2).rjust(part_len, "\x00")
        when ECDSAFullR
          # :nocov:
          r = T.cast(signature.r, OpenSSL::PKey::EC::Point).to_octet_string(:compressed).rjust(part_len, "\x00")
          # :nocov:
        end
        s = signature.s.to_s(2).rjust(part_len, "\x00")
        [r, s].join
      end
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
ruby-paseto-0.1.2 lib/paseto/asn1/ecdsa_signature.rb
ruby-paseto-0.1.1 lib/paseto/asn1/ecdsa_signature.rb
ruby-paseto-0.1.0 lib/paseto/asn1/ecdsa_signature.rb