github.com/shogo82148/std@v1.22.1-0.20240327122250-4e474527810c/encoding/asn1/asn1.go (about)

     1  // Copyright 2009 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  // パッケージasn1は、ITU-T Rec X.690で定義されたDERエンコードされたASN.1データ構造の解析を実装します。
     6  // また、「ASN.1、BER、およびDERのサブセットの素人向けガイド」も参照してください。
     7  // http://luca.ntop.org/Teaching/Appunti/asn1.html。
     8  package asn1
     9  
    10  // StructuralErrorは、ASN.1データが有効であることを示していますが、それを受け取るGoの型が一致していません。
    11  type StructuralError struct {
    12  	Msg string
    13  }
    14  
    15  func (e StructuralError) Error() string
    16  
    17  // SyntaxErrorは、ASN.1データが無効であることを示唆しています。
    18  type SyntaxError struct {
    19  	Msg string
    20  }
    21  
    22  func (e SyntaxError) Error() string
    23  
    24  // BitStringは、ASN.1 BIT STRINGタイプを使用したい場合に使用する構造体です。ビット文字列は、メモリ上で最も近いバイトまでパディングされ、有効なビット数が記録されます。パディングビットはゼロになります。
    25  type BitString struct {
    26  	Bytes     []byte
    27  	BitLength int
    28  }
    29  
    30  // Atは、指定されたインデックスのビットを返します。インデックスが範囲外の場合は0を返します。
    31  func (b BitString) At(i int) int
    32  
    33  // RightAlign はパディングビットが先頭にあるスライスを返します。スライスは BitString とメモリを共有する場合があります。
    34  func (b BitString) RightAlign() []byte
    35  
    36  // NullRawValue is a [RawValue] with its Tag set to the ASN.1 NULL type tag (5).
    37  var NullRawValue = RawValue{Tag: TagNull}
    38  
    39  // NullBytesには、DERエンコードされたASN.1 NULLタイプを表すバイトが含まれています。
    40  var NullBytes = []byte{TagNull, 0}
    41  
    42  // ObjectIdentifierは、ASN.1オブジェクト識別子を表します。
    43  type ObjectIdentifier []int
    44  
    45  // Equalはoiとotherが同じ識別子を表しているかどうかを報告します。
    46  func (oi ObjectIdentifier) Equal(other ObjectIdentifier) bool
    47  
    48  func (oi ObjectIdentifier) String() string
    49  
    50  // Enumerated(列挙型)はプレーンなintで表されます。
    51  type Enumerated int
    52  
    53  // フラグは任意のデータを受け入れ、存在する場合にはtrueに設定されます。
    54  type Flag bool
    55  
    56  // RawValueは、復号化されていないASN.1オブジェクトを表します。
    57  type RawValue struct {
    58  	Class, Tag int
    59  	IsCompound bool
    60  	Bytes      []byte
    61  	FullBytes  []byte
    62  }
    63  
    64  // RawContentは、未デコードのDERデータが構造体にとって保存される必要があることを示すために使用されます。使用するには、構造体の最初のフィールドはこの型でなければなりません。他のフィールドがこの型であることはエラーです。
    65  type RawContent []byte
    66  
    67  // UnmarshalはDER形式のASN.1データ構造bを解析し、reflectパッケージを使用してvalで指定された任意の値を埋める。
    68  // Unmarshalはreflectパッケージを使用するため、書き込まれる構造体は大文字のフィールド名を使用する必要がある。
    69  // valがnilまたはポインタでない場合、Unmarshalはエラーを返す。
    70  //
    71  // bを解析した後、valに埋めるために使用されなかったバイトはrestとして返される。
    72  // 構造体へのSEQUENCEの解析時、valにマッチするフィールドを持たないトレーリング要素は、
    73  // トレーリングデータではなくSEQUENCEの有効な要素と見なされないため、restには含まれません。
    74  //
    75  //   - An ASN.1 INTEGER can be written to an int, int32, int64,
    76  //     or *[big.Int].
    77  //     If the encoded value does not fit in the Go type,
    78  //     Unmarshal returns a parse error.
    79  //
    80  //   - An ASN.1 BIT STRING can be written to a [BitString].
    81  //
    82  //   - An ASN.1 OCTET STRING can be written to a []byte.
    83  //
    84  //   - An ASN.1 OBJECT IDENTIFIER can be written to an [ObjectIdentifier].
    85  //
    86  //   - An ASN.1 ENUMERATED can be written to an [Enumerated].
    87  //
    88  //   - An ASN.1 UTCTIME or GENERALIZEDTIME can be written to a [time.Time].
    89  //
    90  //   - An ASN.1 PrintableString, IA5String, or NumericString can be written to a string.
    91  //
    92  //   - Any of the above ASN.1 values can be written to an interface{}.
    93  //     The value stored in the interface has the corresponding Go type.
    94  //     For integers, that type is int64.
    95  //
    96  //   - An ASN.1 SEQUENCE OF x or SET OF x can be written
    97  //     to a slice if an x can be written to the slice's element type.
    98  //
    99  //   - An ASN.1 SEQUENCE or SET can be written to a struct
   100  //     if each of the elements in the sequence can be
   101  //     written to the corresponding element in the struct.
   102  //
   103  // 構造体フィールドに対する以下のタグにはUnmarshalに特別な意味があります。
   104  //
   105  //	applicationはAPPLICATIONタグが使用されていることを指定します
   106  //	privateはPRIVATEタグが使用されていることを指定します
   107  //	default:xはオプションの整数フィールドのデフォルト値を設定します(オプションも指定されている場合のみ使用)
   108  //	explicitは暗黙のタグを追加の明示的なタグでラップすることを指定します
   109  //	optionalはフィールドをASN.1 OPTIONALとしてマークします
   110  //	setはSEQUENCEではなくSET型を期待します
   111  //	tag:xはASN.1タグ番号を指定します。これはASN.1 CONTEXT SPECIFICであるということを意味します。
   112  //
   113  // IMPLICITタグを持つASN.1値を文字列フィールドにデコードする場合、
   114  // UnmarshalはデフォルトでPrintableStringになります。これは'@'や'&'などの文字をサポートしません。
   115  // 他のエンコーディングを強制するには、次のタグを使用します:
   116  //
   117  //	ia5は文字列をASN.1 IA5String値として復元します
   118  //	numericは文字列をASN.1 NumericString値として復元します
   119  //	utf8は文字列をASN.1 UTF8String値として復元します
   120  //
   121  // 構造体の最初のフィールドの型がRawContentの場合、構造体の生のASN1コンテンツがそれに保存されます。
   122  //
   123  // スライスの型名が"SET"で終わる場合、これは"set"タグが設定されたように扱われます。これにより、
   124  // タイプがSEQUENCEではなくSET OF xと解釈されます。これは、
   125  // 構造体タグが付けられないネストしたスライスで使用することができます。
   126  //
   127  // 他のASN.1の型はサポートされていません; 遭遇すると、
   128  // Unmarshalは解析エラーを返します。
   129  func Unmarshal(b []byte, val any) (rest []byte, err error)
   130  
   131  // UnmarshalWithParamsでは、トップレベルの要素にフィールドパラメータを指定することができます。パラメータの形式は、フィールドタグと同じです。
   132  func UnmarshalWithParams(b []byte, val any, params string) (rest []byte, err error)