Documentation
¶
Index ¶
- Constants
- Variables
- func Code(err error) string
- func DecodeBase64URL(b64 string) ([]byte, error)
- func EncodeBase64URL(b []byte) string
- func IsCritical(err error) bool
- func NowUnixTimestamp() uint64
- func SecurityEvent(err error) bool
- func ToHexFromU64(n uint64) string
- func ToHexFromU64Out(n uint64, out *string)
- func ToUTF8(b []byte) (string, error)
- type Certificate
- func (c *Certificate) CryptoAlgorithm() CryptoAlgorithm
- func (c *Certificate) Expired() bool
- func (c *Certificate) Export(verifyOnly bool) (string, error)
- func (c *Certificate) Issuable() bool
- func (c *Certificate) Signable() bool
- func (c *Certificate) SignatureAlgorithm() SignatureAlgorithm
- func (c *Certificate) SupportVerifyOnly() bool
- func (c *Certificate) TryClone() (*Certificate, error)
- type CmsManager
- func (m *CmsManager) Close()
- func (m *CmsManager) GetManager() *Manager
- func (m *CmsManager) GetVersion() uint64
- func (m *CmsManager) Issue(plain string, secure string) (string, error)
- func (m *CmsManager) LastError() error
- func (m *CmsManager) Parse(datStr string) (Payload, error)
- func (m *CmsManager) ParseDat(dat *Dat) (Payload, error)
- func (m *CmsManager) ParseDatWithoutVerify(dat *Dat) (Payload, error)
- func (m *CmsManager) ParseWithoutVerify(datStr string) (Payload, error)
- func (m *CmsManager) Sync() error
- type CmsManagerBuilder
- func (b *CmsManagerBuilder) Build() (*CmsManager, error)
- func (b *CmsManagerBuilder) Interval(interval time.Duration) *CmsManagerBuilder
- func (b *CmsManagerBuilder) IntervalOff() *CmsManagerBuilder
- func (b *CmsManagerBuilder) Logger(logger *slog.Logger) *CmsManagerBuilder
- func (b *CmsManagerBuilder) Token(token string) *CmsManagerBuilder
- func (b *CmsManagerBuilder) Url(rawUrl string) (*CmsManagerBuilder, error)
- func (b *CmsManagerBuilder) VerifyOnly(verifyOnly bool) *CmsManagerBuilder
- type Crypto
- type CryptoAlgorithm
- type Dat
- type Error
- type Manager
- func (m *Manager) Export(verifyOnly bool) string
- func (m *Manager) ExportCertificates() ([]*Certificate, error)
- func (m *Manager) ExportCids() []uint64
- func (m *Manager) Import(format string, clear bool) (int, error)
- func (m *Manager) ImportCertificates(newCertificates []*Certificate, clear bool) (int, error)
- func (m *Manager) Issue(plain, secure string) (string, error)
- func (m *Manager) IssueWithCertificate(certificate *Certificate, plain, secure string) (string, error)
- func (m *Manager) Parse(datStr string) (Payload, error)
- func (m *Manager) ParseDat(dat *Dat) (Payload, error)
- func (m *Manager) ParseDatWithoutVerify(dat *Dat) (Payload, error)
- func (m *Manager) ParseWithCertificate(certificate *Certificate, dat *Dat) (Payload, error)
- func (m *Manager) ParseWithoutVerify(datStr string) (Payload, error)
- func (m *Manager) ParseWithoutVerifyWithCertificate(certificate *Certificate, dat *Dat) (Payload, error)
- type Payload
- type RetryClass
- type Signature
- func (sk *Signature) Algorithm() SignatureAlgorithm
- func (sk *Signature) ExportKey() ([]byte, error)
- func (sk *Signature) ExportKeyOption(verifyOnly bool) ([]byte, error)
- func (sk *Signature) ExportVerifyOnlyKey() ([]byte, error)
- func (sk *Signature) KeyBase64Len() int
- func (sk *Signature) Sign(data []byte) ([]byte, error)
- func (sk *Signature) Signable() bool
- func (sk *Signature) SupportVerifyOnly() bool
- func (sk *Signature) ToBytes() ([]byte, []byte)deprecated
- func (sk *Signature) Verify(body, sign []byte) error
- type SignatureAlgorithm
Constants ¶
const ( AES128GCMN = IvAes128Gcm AES256GCMN = IvAes256Gcm )
Deprecated: Use IvAes128Gcm, IvAes256Gcm instead
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" 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 : 실행 환경 CodeInternalUnknown = "DAT_INTERNAL_UNKNOWN" )
DAT 통합 오류 코드 (error.pre2.md).
코드 문자열은 모든 공식 클라이언트와 CMS 서버가 공유하는 공개 계약이다. Detail 은 자유롭게 바꿔도 되지만 Code 는 바꾸지 않는다.
- 분류는 원인이다. "어느 함수에서 났는가"가 아니라 "무엇이 잘못됐는가"다.
- *_UNKNOWN 은 각 영역의 폴백 전용이다. "알 수 없는 X" 라는 뜻으로 쓰지 않는다.
- 하위 원인은 버리지 않고 Cause 로 보존한다. errors.Is / errors.As 가 그대로 동작한다.
const ( P256 = EcdsaP256 P384 = EcdsaP384 P521 = EcdsaP521 )
Deprecated: Use EcdsaP256, EcdsaP384, EcdsaP521 instead
const CmsApiVersion = "v1"
Variables ¶
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} 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} ErrInternalUnknown = &Error{Code: CodeInternalUnknown} )
센티널. errors.Is 로 대조하고, 설명이 필요하면 .With(...) 로 사본을 만든다.
Functions ¶
func DecodeBase64URL ¶
func EncodeBase64URL ¶
func IsCritical ¶
func NowUnixTimestamp ¶
func NowUnixTimestamp() uint64
func SecurityEvent ¶ added in v4.6.0
SecurityEvent 는 어떤 error 에서든 보안 이벤트 여부를 꺼낸다.
func ToHexFromU64 ¶
func ToHexFromU64Out ¶
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 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) 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) 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) 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) KeyBase64Len ¶
type CryptoAlgorithm ¶
type CryptoAlgorithm string
const ( IvAes128Gcm CryptoAlgorithm = "IV-AES128-GCM" IvAes256Gcm CryptoAlgorithm = "IV-AES256-GCM" )
type Dat ¶
type Error ¶
type Error struct {
// Code 는 공개 계약이다. 모든 공식 클라이언트에서 동일하다.
Code string
// Detail 은 사람이 읽는 설명이다. 자유롭게 바꿔도 된다.
Detail string
// Cause 는 하위 원인이다. 체이닝을 버리지 않는다.
Cause error
}
Error 는 DAT 의 단일 오류 타입이다. 센티널과의 대조는 errors.Is 로 한다.
func (*Error) Is ¶ added in v4.6.0
Is 는 코드로만 대조한다. 같은 코드면 Detail·Cause 가 달라도 같은 오류다. 덕분에 errors.Is(err, ErrTokenExpired) 가 센티널 시절 그대로 동작한다.
func (*Error) IsCritical ¶
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
SecurityEvent 는 위조·변조 시도의 직접 증거인지 알려준다. 다른 실패와 같은 경로로 로깅하지 않는다.
type Manager ¶
type Manager struct {
// contains filtered or unexported fields
}
func NewManager ¶
func NewManager() *Manager
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 (*Manager) ImportCertificates ¶
func (m *Manager) ImportCertificates(newCertificates []*Certificate, clear bool) (int, error)
func (*Manager) IssueWithCertificate ¶
func (m *Manager) IssueWithCertificate(certificate *Certificate, plain, secure string) (string, error)
func (*Manager) ParseDatWithoutVerify ¶
func (*Manager) ParseWithCertificate ¶
func (m *Manager) ParseWithCertificate(certificate *Certificate, dat *Dat) (Payload, error)
func (*Manager) ParseWithoutVerify ¶
func (*Manager) ParseWithoutVerifyWithCertificate ¶
func (m *Manager) ParseWithoutVerifyWithCertificate(certificate *Certificate, dat *Dat) (Payload, error)
type Payload ¶
func (Payload) SecureText ¶
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) ExportKeyOption ¶
func (*Signature) ExportVerifyOnlyKey ¶
func (*Signature) KeyBase64Len ¶
func (*Signature) SupportVerifyOnly ¶
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" )