2013-02-23 57 views
7

Tôi đang giải mã ASN1 (như được sử dụng trong X.509 cho các chứng chỉ HTTPS). Tôi đang làm khá tốt, nhưng có một điều mà tôi không thể tìm thấy và tài liệu dễ hiểu.[0] và [3] hoạt động như thế nào trong ASN1?

Trong trình phân tích cú pháp JS ASN1 (ví dụ http://lapo.it/asn1js/), bạn thấy [0] và [3] trong phần tử SEQUENCE, phần tử đầu tiên trông giống như sau: A0 03 02 01 02. Tôi muốn biết điều này có nghĩa là gì và cách giải mã nó.

Ví dụ khác là http://www.jensign.com/JavaScience/GetTBSCert/index.html, có [0] ngay sau hai phần tử SEQUENCE đầu tiên.

Điều tôi không hiểu là cách A0 phù hợp với sơ đồ nơi 2 bit đầu tiên của byte thẻ là một lớp, bit tiếp theo nguyên thủy/được xây dựng và 5 còn lại được coi là loại thẻ. A0 là 10100000 có nghĩa là giá trị loại thẻ sẽ bằng không.

+0

[0] và [3] là biểu diễn các thẻ (lớp CONTEXT-SPECIFIC, các giá trị 0 & 3). Dường như bạn hiểu cách A0 mã hóa một thẻ. Giá trị thẻ của 0 không phải là hiếm. Tôi không chắc bạn đang hỏi gì. – Kevin

+0

Tôi không hiểu mục đích của ngữ cảnh cụ thể ... Vậy ý nghĩa của [0] là gì? – Cocoanetics

Trả lời

10

ASN.1 BER và DER sử dụng ASN.1 TAGS để xác định rõ ràng các thành phần nhất định trong luồng được mã hóa. Có 4 loại thẻ ASN.1: UNIVERSAL, APPICATION, PRIVATE và ngữ cảnh cụ thể. [0] là một thẻ theo ngữ cảnh cụ thể vì không có keword lớp thẻ ở phía trước nó. UNIVERSAL được dành riêng cho các kiểu tích hợp trong ASN.1. Thông thường, bạn thấy các thẻ ngữ cảnh cụ thể để loại bỏ sự mơ hồ tiềm ẩn trong một SEQUENCE chứa các phần tử TÙY CHỌN. Nếu bạn biết bạn đang nhận được hai mục không phải là tùy chọn, cái khác, bạn biết cái nào là ngay cả khi các thẻ của chúng giống nhau. Tuy nhiên, nếu tùy chọn đầu tiên là tùy chọn, cả hai phải có các thẻ khác nhau hoặc bạn sẽ không thể biết được thẻ nào bạn đã nhận được nếu chỉ có một thẻ trong mã hóa.

Thông thường, đặc tả ASN.1 sử dụng "TỰ ĐỘNG TAGS" để bạn không phải lo lắng về loại định hướng này trong các thư vì các thành phần của SEQUENCE, SET và CHOICE sẽ tự động nhận được các thẻ cụ thể theo ngữ cảnh bắt đầu bằng [ 0], [1], [2], v.v. cho mỗi thành phần.

Bạn có thể tìm thêm thông tin về thẻ ASN.1 tại http://www.oss.com/asn1/resources/books-whitepapers-pubs/asn1-books.html nơi có sẵn hai sách có thể tải xuống miễn phí.

Một tài nguyên tuyệt vời khác là http://asn1-playground.oss.com nơi bạn có thể thử các biến thể của thông số kỹ thuật ASN.1 với các thẻ khác nhau trong trình biên dịch và bộ mã hóa/giải mã trực tuyến. Ở đó bạn có thể thấy tác động của thay đổi thẻ trên mã hóa.

+0

vì vậy nếu có các thẻ ngữ cảnh rõ ràng như [0] và [3] gặp phải trong chứng chỉ được mã hóa, điều đó có nghĩa là các phần 1 và 2 bị bỏ qua không? – Cocoanetics

+0

Có, nếu có các trường của SEQUENCE được đánh dấu OPTIONAL giữa các trường có [0] và [3], thì việc nhận [3] có nghĩa là các trường TÙY CHỌN không có trong thư. –

11

Có vẻ như bạn cần giới thiệu về gắn thẻ ASN.1. Có hai góc để tiếp cận điều này từ. X.690 định nghĩa các quy tắc mã hóa BER/CER/DER. Như vậy, nó trả lời câu hỏi về cách các thẻ được mã hóa. X.680 định nghĩa bản thân ASN.1. Như vậy, nó xác định cú pháp và quy tắc cho gắn thẻ. Cả hai thông số kỹ thuật có thể được tìm thấy trên trang web của ITU-T. Tôi sẽ cung cấp cho bạn một cái nhìn tổng quan nhanh chóng.

Thẻ được sử dụng trong BER/DER/CER để xác định loại. Chúng đặc biệt hữu ích cho việc phân biệt các thành phần của một SEQUENCE và các lựa chọn thay thế cho SỰ LỰA CHỌN.

Thẻ kết hợp một lớp thẻ và số thẻ. Các lớp thẻ là UNIVERSAL, APPLICATION, PRIVATE và CONTEXT-SPECIFIC. Lớp UNIVERSAL về cơ bản được sử dụng cho các kiểu tích hợp sẵn. APPLICATION thường được sử dụng cho các loại do người dùng định nghĩa. CONTEXT-SPECIFIC thường được sử dụng cho các thành phần bên trong các loại được xây dựng (SEQUENCE, CHOICE, SEQUENCE OF). Cú pháp, khi các thẻ được chỉ định trong một mô-đun ASN.1, chúng được viết bên trong các dấu ngoặc vuông: [tag_class tag_number]; cho CONTEXT-SPECIFIC, thẻ_class bị bỏ qua. Do đó, [APPLICATION 10] hoặc [0].

Mặc dù mọi loại ASN.1 đều có thẻ được liên kết, theo cú pháp, cũng có "Loại gắn thẻ", được tác giả ASN.1 sử dụng để chỉ định thẻ để mã hóa loại. Về cơ bản, một TaggedType đặt một tiền tố thẻ trước một loại.Ví dụ:

MyType ::= SEQUENCE { 
    field_with_tagged_type [0] UTF8String 
} 

Thẻ trong TaggedType rõ ràng hoặc ẩn. Nếu rõ ràng, điều này có nghĩa là tôi muốn thẻ gốc được mã hóa rõ ràng. Nếu ngầm định, điều này có nghĩa là tôi rất vui khi chỉ có thẻ mà tôi chỉ định được mã hóa. Trong trường hợp rõ ràng, các kết quả mã hóa BER trong một TLV lồng nhau (tag-length-value): thẻ bên ngoài ([0] trong ví dụ trên), độ dài và sau đó là TLV khác làm giá trị. Trong ví dụ này, TLV bên trong sẽ có thẻ [UNIVERSAL 12] cho UTF8String.

Thẻ có rõ ràng hay ngầm không phụ thuộc vào cách bạn viết thẻ và môi trường gắn thẻ. Ví dụ:

MyType2 ::= SEQUENCE { 
    field_with_explicit_tag [0] EXPLICIT UTF8String OPTIONAL, 
    field_with_implicit_tag [1] IMPLICIT UTF8String OPTIONAL, 
    field_with_tag [2] UTF8String OPTIONAL 
} 

Nếu bạn chỉ định không phải ngầm cũng không rõ ràng, có một số quy tắc để xác định liệu thẻ là rõ ràng hoặc ngầm (xem X.680 31). Các quy tắc này xem xét môi trường gắn thẻ được định nghĩa cho mô-đun ASN.1. Mô-đun ASN.1 có thể chỉ định môi trường gắn thẻ là các thẻ IMPLICIT, THẺ TỪ KHÓA, hoặc THẺ TỰ ĐỘNG. Nói đúng là, nếu bạn không chỉ định IMPLICIT hoặc EXPLICIT cho thẻ, thẻ sẽ rõ ràng nếu môi trường gắn thẻ là EXPLICIT và ngầm định nếu môi trường gắn thẻ là IMPLICIT hoặc AUTOMATIC. Môi trường gắn thẻ tự động về cơ bản giống với môi trường gắn thẻ IMPLICIT, ngoại trừ các thẻ duy nhất được tự động gán cho các thành viên của các loại SEQUENCE và CHOICE.

Lưu ý rằng trong ví dụ trên, ba thành phần của MyType2 đều là tùy chọn. Trong BER/CER/DER, bộ giải mã sẽ biết thành phần nào có mặt dựa trên thẻ được mã hóa (rõ ràng là tốt hơn là duy nhất).

+0

Cảm ơn lời giải thích dài! – Cocoanetics

+0

Bạn có thể nhận xét về câu hỏi của tôi http://stackoverflow.com/questions/15624838/what-is-the-effective-tagging-environment-in-case-of-an-imported-type –

1

[0] là loại được gắn thẻ theo ngữ cảnh, nghĩa là để tìm hiểu ý nghĩa của trường (nếu cờ "Xây dựng" được đặt) hoặc giá trị dữ liệu (nếu không đặt cờ "Xây dựng") nó kết thúc tốt đẹp; bạn phải biết trong ngữ cảnh nào xuất hiện trong đó.

Ngoài ra, bạn cũng cần biết loại đối tượng người gửi và người nhận đang trao đổi trong luồng DER, nghĩa là gì. "Mô-đun ASN.1".

Hãy nói rằng họ đang trao đổi một Certificate Request Ký và [0] xuất hiện như là lĩnh vực thứ 4 trong một SEQUENCE bên trong SEQUENCE root:

SEQUENCE 
    SEQUENCE 
     INTEGER 0 
     SEQUENCE { ... } 
     SEQUENCE { ... } 
     [0] { ... } 
    } 
} 

Sau đó theo RFC2968, trong đó xác định các nội dung DER cho Giấy chứng nhận Yêu cầu ký, Phụ lục A, trong đó xác định mô-đun ASN.1, ý nghĩa của điều đó lĩnh vực cụ thể được định nghĩa là lén lút "Thuộc tính" và "nên có bộ cờ được xây dựng":

attributes [0] Attributes{{ CRIAttributes }} 

Bạn cũng có thể đi theo cách khác và thấy rằng "thuộc tính" mu st là trường thứ 4 bên trong chuỗi đầu tiên bên trong trình tự gốc và gắn thẻ là [0] bằng cách xem định nghĩa chuỗi gốc (phần 4: "loại cấp cao nhất CertificationRequest"), tìm vị trí CertificationRequestInfo bên trong và tìm mục "thuộc tính" nằm bên trong CertificationRequestInfo và cuối cùng nhìn thấy nó được gắn thẻ như thế nào.

ASN.1 rất đơn giản, tôi không hiểu làm thế nào nhiều người không nhận được nó .. "Nó chỉ là một định dạng TLV .." ;-)

+1

Cảm ơn câu trả lời của bạn. Một bổ sung tốt đẹp sẽ bao gồm một liên kết đến các tài liệu mà bạn đang đề cập đến. – SherylHohman

Các vấn đề liên quan