dat

package module
v4.6.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Aug 1, 2026 License: MIT Imports: 25 Imported by: 0

README

DAT - Distributed Access Token

Document
Support Platform

Support algorithm

Signature
name note
ECDSA-P256 = secp256r1
ECDSA-P384 = secp384r1
ECDSA-P521 = secp521r1
HMAC-SHA256-MFS = 256Bit Fixed Secret
HMAC-SHA384-MFS = 384Bit Fixed Secret
HMAC-SHA512-MFS = 512Bit Fixed Secret
  • MFS : Maximum(Same Bit) Fixed Secret
Crypto
name note
IV-AES128-GCM (IV=NONCE:96BIT) + AES128 GCM
IV-AES256-GCM (IV=NONCE:96BIT) + AES256 GCM

Performance

  • random plain and secure test
  • mac mini m4 2024 basic (10 core)
  • bench_test.go
=== RUN   TestBenchmark
performance test (plain, secure)
plain: QheYmFHedNUXoEYd96XsnzmXRJ1h1WE7hjRhxZRoWU51ClNuWpeXkgFMyoGgloG1UZVZxfMXm1rh4pEuYsN0cY2qkNAXtNQwo4gn
secure: KlpOYIEKFQYdLsSnec3LYM2Y6KJF9zGUO1klicTpWg4tEG9cF8UQxf0eCYFNJHiQb63bpTAMobynfGUBp7JyWEFV25CrfTJfARJP

Multi-Thread
HMAC-SHA256-MFS IV-AES128-GCM Issue * 10000 : 11ms
HMAC-SHA256-MFS IV-AES128-GCM Parse * 10000 : 5ms
HMAC-SHA256-MFS IV-AES256-GCM Issue * 10000 : 9ms
HMAC-SHA256-MFS IV-AES256-GCM Parse * 10000 : 5ms
HMAC-SHA384-MFS IV-AES128-GCM Issue * 10000 : 9ms
HMAC-SHA384-MFS IV-AES128-GCM Parse * 10000 : 5ms
HMAC-SHA384-MFS IV-AES256-GCM Issue * 10000 : 10ms
HMAC-SHA384-MFS IV-AES256-GCM Parse * 10000 : 5ms
HMAC-SHA512-MFS IV-AES128-GCM Issue * 10000 : 10ms
HMAC-SHA512-MFS IV-AES128-GCM Parse * 10000 : 5ms
HMAC-SHA512-MFS IV-AES256-GCM Issue * 10000 : 9ms
HMAC-SHA512-MFS IV-AES256-GCM Parse * 10000 : 5ms
ECDSA-P256 IV-AES128-GCM Issue * 10000 : 53ms
ECDSA-P256 IV-AES128-GCM Parse * 10000 : 71ms
ECDSA-P256 IV-AES256-GCM Issue * 10000 : 58ms
ECDSA-P256 IV-AES256-GCM Parse * 10000 : 72ms
ECDSA-P384 IV-AES128-GCM Issue * 10000 : 214ms
ECDSA-P384 IV-AES128-GCM Parse * 10000 : 593ms
ECDSA-P384 IV-AES256-GCM Issue * 10000 : 220ms
ECDSA-P384 IV-AES256-GCM Parse * 10000 : 566ms
ECDSA-P521 IV-AES128-GCM Issue * 10000 : 468ms
ECDSA-P521 IV-AES128-GCM Parse * 10000 : 1466ms
ECDSA-P521 IV-AES256-GCM Issue * 10000 : 467ms
ECDSA-P521 IV-AES256-GCM Parse * 10000 : 1507ms

Single-Thread
HMAC-SHA256-MFS IV-AES128-GCM Issue * 10000 : 8ms
HMAC-SHA256-MFS IV-AES128-GCM Parse * 10000 : 4ms
HMAC-SHA256-MFS IV-AES256-GCM Issue * 10000 : 7ms
HMAC-SHA256-MFS IV-AES256-GCM Parse * 10000 : 4ms
HMAC-SHA384-MFS IV-AES128-GCM Issue * 10000 : 9ms
HMAC-SHA384-MFS IV-AES128-GCM Parse * 10000 : 6ms
HMAC-SHA384-MFS IV-AES256-GCM Issue * 10000 : 9ms
HMAC-SHA384-MFS IV-AES256-GCM Parse * 10000 : 6ms
HMAC-SHA512-MFS IV-AES128-GCM Issue * 10000 : 9ms
HMAC-SHA512-MFS IV-AES128-GCM Parse * 10000 : 6ms
HMAC-SHA512-MFS IV-AES256-GCM Issue * 10000 : 9ms
HMAC-SHA512-MFS IV-AES256-GCM Parse * 10000 : 6ms
ECDSA-P256 IV-AES128-GCM Issue * 10000 : 165ms
ECDSA-P256 IV-AES128-GCM Parse * 10000 : 358ms
ECDSA-P256 IV-AES256-GCM Issue * 10000 : 156ms
ECDSA-P256 IV-AES256-GCM Parse * 10000 : 345ms
ECDSA-P384 IV-AES128-GCM Issue * 10000 : 1095ms
ECDSA-P384 IV-AES128-GCM Parse * 10000 : 3129ms
ECDSA-P384 IV-AES256-GCM Issue * 10000 : 1073ms
ECDSA-P384 IV-AES256-GCM Parse * 10000 : 3151ms
ECDSA-P521 IV-AES128-GCM Issue * 10000 : 2653ms
ECDSA-P521 IV-AES128-GCM Parse * 10000 : 8665ms
ECDSA-P521 IV-AES256-GCM Issue * 10000 : 2652ms
ECDSA-P521 IV-AES256-GCM Parse * 10000 : 8683ms

Documentation

Index

Constants

View Source
const (
	AES128GCMN = IvAes128Gcm
	AES256GCMN = IvAes256Gcm
)

Deprecated: Use IvAes128Gcm, IvAes256Gcm instead

View Source
const (
	// TOKEN : DAT 토큰 문자열
	CodeTokenMalformed = "DAT_TOKEN_MALFORMED"
	CodeTokenExpired   = "DAT_TOKEN_EXPIRED"
	CodeTokenUnknown   = "DAT_TOKEN_UNKNOWN"

	// CERT : 인증서
	CodeCertMalformed      = "DAT_CERT_MALFORMED"
	CodeCertExpired        = "DAT_CERT_EXPIRED"
	CodeCertNotYetIssuable = "DAT_CERT_NOT_YET_ISSUABLE"
	CodeCertIssuanceEnded  = "DAT_CERT_ISSUANCE_ENDED"
	CodeCertVerifyOnly     = "DAT_CERT_VERIFY_ONLY"
	CodeCertNotFound       = "DAT_CERT_NOT_FOUND"
	CodeCertNotSynced      = "DAT_CERT_NOT_SYNCED"
	CodeCertDuplicateCid   = "DAT_CERT_DUPLICATE_CID"
	CodeCertUnknown        = "DAT_CERT_UNKNOWN"

	// SIG : 서명
	CodeSigMismatch   = "DAT_SIG_MISMATCH"
	CodeSigMalformed  = "DAT_SIG_MALFORMED"
	CodeSigKeyMissing = "DAT_SIG_KEY_MISSING"
	CodeSigBackend    = "DAT_SIG_BACKEND"
	CodeSigUnknown    = "DAT_SIG_UNKNOWN"

	// CRYPTO : secure 페이로드
	CodeCryptoTagMismatch = "DAT_CRYPTO_TAG_MISMATCH"
	CodeCryptoDataInvalid = "DAT_CRYPTO_DATA_INVALID"
	CodeCryptoBackend     = "DAT_CRYPTO_BACKEND"
	CodeCryptoUnknown     = "DAT_CRYPTO_UNKNOWN"

	// KEY : 키 재료
	CodeKeyInvalid               = "DAT_KEY_INVALID"
	CodeKeyVerifyOnlyUnsupported = "DAT_KEY_VERIFY_ONLY_UNSUPPORTED"
	CodeKeyUnknown               = "DAT_KEY_UNKNOWN"

	// MANAGER : 매니저 보유 상태
	CodeManagerNoCertificate         = "DAT_MANAGER_NO_CERTIFICATE"
	CodeManagerNoIssuableCertificate = "DAT_MANAGER_NO_ISSUABLE_CERTIFICATE"
	CodeManagerDisposed              = "DAT_MANAGER_DISPOSED"
	CodeManagerUnknown               = "DAT_MANAGER_UNKNOWN"

	// CMS : 서버 응답·전송
	CodeCmsUnreachable      = "DAT_CMS_UNREACHABLE"
	CodeCmsUnauthorized     = "DAT_CMS_UNAUTHORIZED"
	CodeCmsForbidden        = "DAT_CMS_FORBIDDEN"
	CodeCmsEndpointNotFound = "DAT_CMS_ENDPOINT_NOT_FOUND"
	CodeCmsServerError      = "DAT_CMS_SERVER_ERROR"
	CodeCmsHttpStatus       = "DAT_CMS_HTTP_STATUS"
	CodeCmsMalformed        = "DAT_CMS_MALFORMED"
	CodeCmsImportFailed     = "DAT_CMS_IMPORT_FAILED"
	CodeCmsVersionReset     = "DAT_CMS_VERSION_RESET"
	CodeCmsNotSynced        = "DAT_CMS_NOT_SYNCED"
	CodeCmsSyncInProgress   = "DAT_CMS_SYNC_IN_PROGRESS"
	CodeCmsNotSupported     = "DAT_CMS_NOT_SUPPORTED"
	CodeCmsUnknown          = "DAT_CMS_UNKNOWN"

	// CONFIG : 호출자가 넘긴 값
	CodeConfigAlgUnsupported  = "DAT_CONFIG_ALG_UNSUPPORTED"
	CodeConfigUriInvalid      = "DAT_CONFIG_URI_INVALID"
	CodeConfigArgumentInvalid = "DAT_CONFIG_ARGUMENT_INVALID"
	CodeConfigUnknown         = "DAT_CONFIG_UNKNOWN"

	// INTERNAL : 실행 환경
	CodeInternalUnavailable = "DAT_INTERNAL_UNAVAILABLE"
	CodeInternalUnknown     = "DAT_INTERNAL_UNKNOWN"
)

DAT 통합 오류 코드 (error.pre2.md).

코드 문자열은 모든 공식 클라이언트와 CMS 서버가 공유하는 공개 계약이다. Detail 은 자유롭게 바꿔도 되지만 Code 는 바꾸지 않는다.

  • 분류는 원인이다. "어느 함수에서 났는가"가 아니라 "무엇이 잘못됐는가"다.
  • *_UNKNOWN 은 각 영역의 폴백 전용이다. "알 수 없는 X" 라는 뜻으로 쓰지 않는다.
  • 하위 원인은 버리지 않고 Cause 로 보존한다. errors.Is / errors.As 가 그대로 동작한다.
View Source
const (
	P256 = EcdsaP256
	P384 = EcdsaP384
	P521 = EcdsaP521
)

Deprecated: Use EcdsaP256, EcdsaP384, EcdsaP521 instead

View Source
const CmsApiVersion = "v1"

Variables

View Source
var (
	ErrTokenMalformed = &Error{Code: CodeTokenMalformed}
	ErrTokenExpired   = &Error{Code: CodeTokenExpired}
	ErrTokenUnknown   = &Error{Code: CodeTokenUnknown}

	ErrCertMalformed      = &Error{Code: CodeCertMalformed}
	ErrCertExpired        = &Error{Code: CodeCertExpired}
	ErrCertNotYetIssuable = &Error{Code: CodeCertNotYetIssuable}
	ErrCertIssuanceEnded  = &Error{Code: CodeCertIssuanceEnded}
	ErrCertVerifyOnly     = &Error{Code: CodeCertVerifyOnly}
	ErrCertNotFound       = &Error{Code: CodeCertNotFound}
	ErrCertNotSynced      = &Error{Code: CodeCertNotSynced}
	ErrCertDuplicateCid   = &Error{Code: CodeCertDuplicateCid}
	ErrCertUnknown        = &Error{Code: CodeCertUnknown}

	ErrSigMismatch   = &Error{Code: CodeSigMismatch}
	ErrSigMalformed  = &Error{Code: CodeSigMalformed}
	ErrSigKeyMissing = &Error{Code: CodeSigKeyMissing}
	ErrSigBackend    = &Error{Code: CodeSigBackend}
	ErrSigUnknown    = &Error{Code: CodeSigUnknown}

	ErrCryptoTagMismatch = &Error{Code: CodeCryptoTagMismatch}
	ErrCryptoDataInvalid = &Error{Code: CodeCryptoDataInvalid}
	ErrCryptoBackend     = &Error{Code: CodeCryptoBackend}
	ErrCryptoUnknown     = &Error{Code: CodeCryptoUnknown}

	ErrKeyInvalid               = &Error{Code: CodeKeyInvalid}
	ErrKeyVerifyOnlyUnsupported = &Error{Code: CodeKeyVerifyOnlyUnsupported}
	ErrKeyUnknown               = &Error{Code: CodeKeyUnknown}

	ErrManagerNoCertificate         = &Error{Code: CodeManagerNoCertificate}
	ErrManagerNoIssuableCertificate = &Error{Code: CodeManagerNoIssuableCertificate}
	ErrManagerDisposed              = &Error{Code: CodeManagerDisposed}
	ErrManagerUnknown               = &Error{Code: CodeManagerUnknown}

	ErrCmsUnreachable      = &Error{Code: CodeCmsUnreachable}
	ErrCmsUnauthorized     = &Error{Code: CodeCmsUnauthorized}
	ErrCmsForbidden        = &Error{Code: CodeCmsForbidden}
	ErrCmsEndpointNotFound = &Error{Code: CodeCmsEndpointNotFound}
	ErrCmsServerError      = &Error{Code: CodeCmsServerError}
	ErrCmsHttpStatus       = &Error{Code: CodeCmsHttpStatus}
	ErrCmsMalformed        = &Error{Code: CodeCmsMalformed}
	ErrCmsImportFailed     = &Error{Code: CodeCmsImportFailed}
	ErrCmsVersionReset     = &Error{Code: CodeCmsVersionReset}
	ErrCmsNotSynced        = &Error{Code: CodeCmsNotSynced}
	ErrCmsSyncInProgress   = &Error{Code: CodeCmsSyncInProgress}
	ErrCmsNotSupported     = &Error{Code: CodeCmsNotSupported}
	ErrCmsUnknown          = &Error{Code: CodeCmsUnknown}

	ErrConfigAlgUnsupported  = &Error{Code: CodeConfigAlgUnsupported}
	ErrConfigUriInvalid      = &Error{Code: CodeConfigUriInvalid}
	ErrConfigArgumentInvalid = &Error{Code: CodeConfigArgumentInvalid}
	ErrConfigUnknown         = &Error{Code: CodeConfigUnknown}

	ErrInternalUnavailable = &Error{Code: CodeInternalUnavailable}
	ErrInternalUnknown     = &Error{Code: CodeInternalUnknown}
)

센티널. errors.Is 로 대조하고, 설명이 필요하면 .With(...) 로 사본을 만든다.

Functions

func Code added in v4.6.0

func Code(err error) string

Code 는 어떤 error 에서든 DAT 오류 코드를 꺼낸다. DAT 오류가 아니면 "" 다.

func DecodeBase64URL

func DecodeBase64URL(b64 string) ([]byte, error)

func EncodeBase64URL

func EncodeBase64URL(b []byte) string

func IsCritical

func IsCritical(err error) bool

func NowUnixTimestamp

func NowUnixTimestamp() uint64

func SecurityEvent added in v4.6.0

func SecurityEvent(err error) bool

SecurityEvent 는 어떤 error 에서든 보안 이벤트 여부를 꺼낸다.

func ToHexFromU64

func ToHexFromU64(n uint64) string

func ToHexFromU64Out

func ToHexFromU64Out(n uint64, out *string)

func ToUTF8

func ToUTF8(b []byte) (string, error)

Types

type Certificate

type Certificate struct {
	Cid uint64

	SignatureKey            *Signature
	CryptoKey               *Crypto
	DatIssuanceStartSeconds uint64
	DatIssuanceEndSeconds   uint64
	DatTtlSeconds           uint64
	// contains filtered or unexported fields
}

func GenerateCertificate

func GenerateCertificate(cid uint64, datIssuanceStartSeconds, datIssuanceDurationSeconds, datTtlSeconds uint64, signatureAlgorithm SignatureAlgorithm, cryptoAlgorithm CryptoAlgorithm) (*Certificate, error)

func NewCertificate

func NewCertificate(cid uint64, datIssuanceStartSeconds, datIssuanceDurationSeconds, datTtlSeconds uint64, signatureKey *Signature, cryptoKey *Crypto) (*Certificate, error)

func ParseCertificate

func ParseCertificate(format string) (*Certificate, error)

func (*Certificate) CryptoAlgorithm

func (c *Certificate) CryptoAlgorithm() CryptoAlgorithm

func (*Certificate) Expired

func (c *Certificate) Expired() bool

func (*Certificate) Export

func (c *Certificate) Export(verifyOnly bool) (string, error)

func (*Certificate) Issuable

func (c *Certificate) Issuable() bool

func (*Certificate) Signable

func (c *Certificate) Signable() bool

func (*Certificate) SignatureAlgorithm

func (c *Certificate) SignatureAlgorithm() SignatureAlgorithm

func (*Certificate) SupportVerifyOnly

func (c *Certificate) SupportVerifyOnly() bool

func (*Certificate) TryClone added in v4.6.0

func (c *Certificate) TryClone() (*Certificate, error)

TryClone deep copies the certificate, so a handed out copy cannot be mutated through the manager's live certificate (and vice versa).

type CmsManager

type CmsManager struct {
	// contains filtered or unexported fields
}

func (*CmsManager) Close

func (m *CmsManager) Close()

func (*CmsManager) GetManager

func (m *CmsManager) GetManager() *Manager

func (*CmsManager) GetVersion

func (m *CmsManager) GetVersion() uint64

func (*CmsManager) Issue

func (m *CmsManager) Issue(plain string, secure string) (string, error)

func (*CmsManager) LastError added in v4.6.0

func (m *CmsManager) LastError() error

LastError 는 마지막 동기화 실패다. 한 번도 성공하지 못했으면 ErrCmsNotSynced, 정상이면 nil 이다. 재시도 여부는 dat.Retry(err) 로 판정한다.

최초 sync 실패를 삼키고 "인증서 0개 매니저"를 성공 반환하던 동작은 그대로 두되 (list.md F-3), 실패가 어디에도 안 남던 것을 여기서 관측 가능하게 한다.

func (*CmsManager) Parse

func (m *CmsManager) Parse(datStr string) (Payload, error)

func (*CmsManager) ParseDat

func (m *CmsManager) ParseDat(dat *Dat) (Payload, error)

func (*CmsManager) ParseDatWithoutVerify

func (m *CmsManager) ParseDatWithoutVerify(dat *Dat) (Payload, error)

func (*CmsManager) ParseWithoutVerify

func (m *CmsManager) ParseWithoutVerify(datStr string) (Payload, error)

func (*CmsManager) Sync

func (m *CmsManager) Sync() error

type CmsManagerBuilder

type CmsManagerBuilder struct {
	// contains filtered or unexported fields
}

func NewDatCmsManagerBuilder

func NewDatCmsManagerBuilder() *CmsManagerBuilder

func (*CmsManagerBuilder) Build

func (b *CmsManagerBuilder) Build() (*CmsManager, error)

func (*CmsManagerBuilder) Interval

func (b *CmsManagerBuilder) Interval(interval time.Duration) *CmsManagerBuilder

func (*CmsManagerBuilder) IntervalOff

func (b *CmsManagerBuilder) IntervalOff() *CmsManagerBuilder

func (*CmsManagerBuilder) Logger

func (b *CmsManagerBuilder) Logger(logger *slog.Logger) *CmsManagerBuilder

func (*CmsManagerBuilder) Token

func (b *CmsManagerBuilder) Token(token string) *CmsManagerBuilder

func (*CmsManagerBuilder) Url

func (b *CmsManagerBuilder) Url(rawUrl string) (*CmsManagerBuilder, error)

func (*CmsManagerBuilder) VerifyOnly

func (b *CmsManagerBuilder) VerifyOnly(verifyOnly bool) *CmsManagerBuilder

type Crypto

type Crypto struct {
	// contains filtered or unexported fields
}

func GenerateCryptoKey

func GenerateCryptoKey(algorithm CryptoAlgorithm) (*Crypto, error)

func NewCryptoKey

func NewCryptoKey(algorithm CryptoAlgorithm, data []byte) (*Crypto, error)

func (*Crypto) Algorithm

func (ck *Crypto) Algorithm() CryptoAlgorithm

func (*Crypto) Decrypt

func (ck *Crypto) Decrypt(data []byte) ([]byte, error)

func (*Crypto) Encrypt

func (ck *Crypto) Encrypt(body []byte) ([]byte, error)

func (*Crypto) KeyBase64Len

func (ck *Crypto) KeyBase64Len() int

func (*Crypto) ToBytes

func (ck *Crypto) ToBytes() []byte

type CryptoAlgorithm

type CryptoAlgorithm string
const (
	IvAes128Gcm CryptoAlgorithm = "IV-AES128-GCM"
	IvAes256Gcm CryptoAlgorithm = "IV-AES256-GCM"
)

type Dat

type Dat struct {
	Expire uint64
	Cid    uint64

	Signature []byte
	// contains filtered or unexported fields
}

func ParseDat

func ParseDat(s string) (*Dat, error)

func (*Dat) BodyBytes

func (d *Dat) BodyBytes() []byte

func (*Dat) Plain

func (d *Dat) Plain() ([]byte, error)

func (*Dat) Secure

func (d *Dat) Secure() ([]byte, error)

func (*Dat) String

func (d *Dat) String() string

type Error

type Error struct {
	// Code 는 공개 계약이다. 모든 공식 클라이언트에서 동일하다.
	Code string
	// Detail 은 사람이 읽는 설명이다. 자유롭게 바꿔도 된다.
	Detail string
	// Cause 는 하위 원인이다. 체이닝을 버리지 않는다.
	Cause error
}

Error 는 DAT 의 단일 오류 타입이다. 센티널과의 대조는 errors.Is 로 한다.

func (*Error) Error

func (e *Error) Error() string

func (*Error) Is added in v4.6.0

func (e *Error) Is(target error) bool

Is 는 코드로만 대조한다. 같은 코드면 Detail·Cause 가 달라도 같은 오류다. 덕분에 errors.Is(err, ErrTokenExpired) 가 센티널 시절 그대로 동작한다.

func (*Error) IsCritical

func (e *Error) IsCritical() bool

IsCritical 은 이 실패가 우리 문제인지 알려준다.

클라이언트가 나쁜 토큰을 들고 오는 것은 일상이므로 critical 이 아니다. 예전에는 판정이 ErrInvalidDat 하나에 걸려 있었고, 인증서 파싱 오류에도 그 값을 쓰는 바람에 양방향으로 오작동했다.

func (*Error) Retry added in v4.6.0

func (e *Error) Retry() RetryClass

Retry 는 이 오류를 재시도해도 되는지 알려준다. 애매하면 Permanent 다 — 영구 오류에 대한 무한 재시도가 이 체계 이전의 실제 결함이었다.

func (*Error) SecurityEvent added in v4.6.0

func (e *Error) SecurityEvent() bool

SecurityEvent 는 위조·변조 시도의 직접 증거인지 알려준다. 다른 실패와 같은 경로로 로깅하지 않는다.

func (*Error) Unwrap added in v4.6.0

func (e *Error) Unwrap() error

func (*Error) With added in v4.6.0

func (e *Error) With(detail string) *Error

With 는 같은 코드에 설명만 붙인 사본을 만든다. 센티널 자체는 건드리지 않는다.

func (*Error) Wrap added in v4.6.0

func (e *Error) Wrap(cause error) *Error

Wrap 은 하위 원인을 매단 사본을 만든다.

type Manager

type Manager struct {
	// contains filtered or unexported fields
}

func NewManager

func NewManager() *Manager

func (*Manager) Export

func (m *Manager) Export(verifyOnly bool) string

func (*Manager) ExportCertificates

func (m *Manager) ExportCertificates() ([]*Certificate, error)

ExportCertificates returns deep copies: slices.Clone would hand out the manager's live *Certificate values, whose keys the caller could then mutate.

func (*Manager) ExportCids

func (m *Manager) ExportCids() []uint64

func (*Manager) Import

func (m *Manager) Import(format string, clear bool) (int, error)

func (*Manager) ImportCertificates

func (m *Manager) ImportCertificates(newCertificates []*Certificate, clear bool) (int, error)

func (*Manager) Issue

func (m *Manager) Issue(plain, secure string) (string, error)

func (*Manager) IssueWithCertificate

func (m *Manager) IssueWithCertificate(certificate *Certificate, plain, secure string) (string, error)

func (*Manager) Parse

func (m *Manager) Parse(datStr string) (Payload, error)

func (*Manager) ParseDat

func (m *Manager) ParseDat(dat *Dat) (Payload, error)

func (*Manager) ParseDatWithoutVerify

func (m *Manager) ParseDatWithoutVerify(dat *Dat) (Payload, error)

func (*Manager) ParseWithCertificate

func (m *Manager) ParseWithCertificate(certificate *Certificate, dat *Dat) (Payload, error)

func (*Manager) ParseWithoutVerify

func (m *Manager) ParseWithoutVerify(datStr string) (Payload, error)

func (*Manager) ParseWithoutVerifyWithCertificate

func (m *Manager) ParseWithoutVerifyWithCertificate(certificate *Certificate, dat *Dat) (Payload, error)

type Payload

type Payload struct {
	Plain  []byte
	Secure []byte
}

func (Payload) PlainText

func (p Payload) PlainText() string

func (Payload) SecureText

func (p Payload) SecureText() string

func (Payload) String

func (p Payload) String() string

type RetryClass added in v4.6.0

type RetryClass int

RetryClass 는 재시도 분류다. 중간값을 두지 않는다 — 호출부가 분기할 수 없기 때문이다.

const (
	// RetryPermanent : 설정·입력·배포를 고쳐야 한다. 재시도하지 않는다.
	RetryPermanent RetryClass = iota
	// RetryTransient : 같은 입력으로 재시도하면 해소될 수 있다.
	RetryTransient
	// RetryState : 오류가 아닌 상태 신호. 흐름 제어에만 쓴다.
	RetryState
)

func Retry added in v4.6.0

func Retry(err error) RetryClass

Retry 는 어떤 error 에서든 재시도 분류를 꺼낸다. DAT 오류가 아니면 Permanent 다.

type Signature

type Signature struct {
	// contains filtered or unexported fields
}

func GenerateSignatureKey

func GenerateSignatureKey(algorithm SignatureAlgorithm) (*Signature, error)

func NewSignatureKey

func NewSignatureKey(algorithm SignatureAlgorithm, privateBytes, publicBytes []byte) (*Signature, error)

func (*Signature) Algorithm

func (sk *Signature) Algorithm() SignatureAlgorithm

func (*Signature) ExportKey

func (sk *Signature) ExportKey() ([]byte, error)

func (*Signature) ExportKeyOption

func (sk *Signature) ExportKeyOption(verifyOnly bool) ([]byte, error)

func (*Signature) ExportVerifyOnlyKey

func (sk *Signature) ExportVerifyOnlyKey() ([]byte, error)

func (*Signature) KeyBase64Len

func (sk *Signature) KeyBase64Len() int

func (*Signature) Sign

func (sk *Signature) Sign(data []byte) ([]byte, error)

func (*Signature) Signable

func (sk *Signature) Signable() bool

func (*Signature) SupportVerifyOnly

func (sk *Signature) SupportVerifyOnly() bool

func (*Signature) ToBytes deprecated

func (sk *Signature) ToBytes() ([]byte, []byte)

Deprecated: Use ExportKey or ExportVerifyOnlyKey

func (*Signature) Verify

func (sk *Signature) Verify(body, sign []byte) error

type SignatureAlgorithm

type SignatureAlgorithm string
const (
	HmacSha256Mfs SignatureAlgorithm = "HMAC-SHA256-MFS"
	HmacSha384Mfs SignatureAlgorithm = "HMAC-SHA384-MFS"
	HmacSha512Mfs SignatureAlgorithm = "HMAC-SHA512-MFS"
	EcdsaP256     SignatureAlgorithm = "ECDSA-P256"
	EcdsaP384     SignatureAlgorithm = "ECDSA-P384"
	EcdsaP521     SignatureAlgorithm = "ECDSA-P521"
)

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL