blob: c8cf5a6ca2d4cdf11c605c025a4cd67e49a2d498 [file] [log] [blame]
// Copyright 2016 Masaki Hara
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
//! A library for reading and writing ASN.1 data.
//!
//! # Example
//!
//! To serialize ASN.1 data, you can use [`construct_der`][construct_der].
//!
//! [construct_der]: fn.construct_der.html
//!
//! ```
//! extern crate yasna;
//!
//! fn main() {
//! let der = yasna::construct_der(|writer| {
//! writer.write_sequence(|writer| {
//! writer.next().write_i64(10);
//! writer.next().write_bool(true);
//! })
//! });
//! println!("(10, true) = {:?}", der);
//! }
//! ```
//!
//! To deserialize ASN.1 data, you can use [`parse_ber`][parse_ber]
//! or [`parse_der`][parse_der].
//!
//! [parse_ber]: fn.parse_ber.html
//! [parse_der]: fn.parse_der.html
//!
//! ```
//! extern crate yasna;
//!
//! fn main() {
//! let asn = yasna::parse_der(&[48, 6, 2, 1, 10, 1, 1, 255], |reader| {
//! reader.read_sequence(|reader| {
//! let i = try!(reader.next().read_i64());
//! let b = try!(reader.next().read_bool());
//! return Ok((i, b));
//! })
//! }).unwrap();
//! println!("{:?} = [48, 6, 2, 1, 10, 1, 1, 255]", asn);
//! }
//! ```
#![cfg_attr(not(target_env = "sgx"), no_std)]
#![cfg_attr(target_env = "sgx", feature(rustc_private))]
#[cfg(not(target_env = "sgx"))]
#[macro_use]
extern crate sgx_tstd as std;
#[cfg(feature = "bigint")]
extern crate num_bigint;
#[cfg(feature = "bitvec")]
extern crate bit_vec;
pub mod tags;
pub mod models;
pub mod writer;
mod reader;
mod deserializer;
pub use writer::{construct_der,construct_der_seq};
pub use writer::{DERWriter,DERWriterSeq,DERWriterSet};
pub use reader::{parse_ber_general,parse_ber,parse_der,BERMode};
pub use reader::{BERReader,BERReaderSeq,BERReaderSet};
pub use reader::{ASN1Error,ASN1ErrorKind,ASN1Result};
pub use deserializer::FromBER;
/// An ASN.1 tag class, used in [`Tag`][tag].
///
/// [tag]: struct.Tag.html
///
/// A tag class is one of:
///
/// - UNIVERSAL
/// - APPLICATION
/// - context specific
/// - PRIVATE
#[derive(Debug, Clone, Copy, Eq, PartialEq, Ord, PartialOrd, Hash)]
pub enum TagClass {
Universal = 0, Application = 1, ContextSpecific = 2, Private = 3,
}
const TAG_CLASSES : [TagClass; 4] = [
TagClass::Universal,
TagClass::Application,
TagClass::ContextSpecific,
TagClass::Private,
];
/// An ASN.1 tag.
///
/// An ASN.1 tag is a pair of a tag class and a tag number.
///
/// - A tag class is one of:
/// - UNIVERSAL
/// - APPLICATION
/// - context specific
/// - PRIVATE
/// - A tag number is a nonnegative integer.
/// In this library. Tag numbers are assumed to be in `u64`.
#[derive(Debug, Clone, Copy, Eq, PartialEq, Ord, PartialOrd, Hash)]
pub struct Tag {
pub tag_class: TagClass,
pub tag_number: u64,
}
impl Tag {
/// Constructs an APPLICATION tag, namely \[APPLICATION n\].
pub fn application(tag_number: u64) -> Tag {
return Tag {
tag_class: TagClass::Application,
tag_number: tag_number,
}
}
/// Constructs a context specific tag, namely \[n\].
pub fn context(tag_number: u64) -> Tag {
return Tag {
tag_class: TagClass::ContextSpecific,
tag_number: tag_number,
}
}
/// Constructs a PRIVATE tag, namely \[PRIVATE n\].
pub fn private(tag_number: u64) -> Tag {
return Tag {
tag_class: TagClass::Private,
tag_number: tag_number,
}
}
}