1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855
|
A Layman's Guide to a Subset of ASN.1, BER, and DER
An RSA Laboratories Technical Note
Burton S. Kaliski Jr.
Revised November 1, 1993
Supersedes June 3, 1991 version, which was also published as
NIST/OSI Implementors' Workshop document SEC-SIG-91-17.
PKCS documents are available by electronic mail to
<pkcs@rsa.com>.
Copyright (C) 1991-1993 RSA Laboratories, a division of RSA
Data Security, Inc. License to copy this document is granted
provided that it is identified as "RSA Data Security, Inc.
Public-Key Cryptography Standards (PKCS)" in all material
mentioning or referencing this document.
003-903015-110-000-000
Abstract. This note gives a layman's introduction to a
subset of OSI's Abstract Syntax Notation One (ASN.1), Basic
Encoding Rules (BER), and Distinguished Encoding Rules
(DER). The particular purpose of this note is to provide
background material sufficient for understanding and
implementing the PKCS family of standards.
1. Introduction
It is a generally accepted design principle that abstraction
is a key to managing software development. With abstraction,
a designer can specify a part of a system without concern
for how the part is actually implemented or represented.
Such a practice leaves the implementation open; it
simplifies the specification; and it makes it possible to
state "axioms" about the part that can be proved when the
part is implemented, and assumed when the part is employed
in another, higher-level part. Abstraction is the hallmark
of most modern software specifications.
One of the most complex systems today, and one that also
involves a great deal of abstraction, is Open Systems
Interconnection (OSI, described in X.200). OSI is an
internationally standardized architecture that governs the
interconnection of computers from the physical layer up to
the user application layer. Objects at higher layers are
defined abstractly and intended to be implemented with
objects at lower layers. For instance, a service at one
layer may require transfer of certain abstract objects
between computers; a lower layer may provide transfer
services for strings of ones and zeroes, using encoding
rules to transform the abstract objects into such strings.
OSI is called an open system because it supports many
different implementations of the services at each layer.
OSI's method of specifying abstract objects is called ASN.1
(Abstract Syntax Notation One, defined in X.208), and one
set of rules for representing such objects as strings of
ones and zeros is called the BER (Basic Encoding Rules,
defined in X.209). ASN.1 is a flexible notation that allows
one to define a variety data types, from simple types such
as integers and bit strings to structured types such as sets
and sequences, as well as complex types defined in terms of
others. BER describes how to represent or encode values of
each ASN.1 type as a string of eight-bit octets. There is
generally more than one way to BER-encode a given value.
Another set of rules, called the Distinguished Encoding
Rules (DER), which is a subset of BER, gives a unique
encoding to each ASN.1 value.
The purpose of this note is to describe a subset of ASN.1,
BER and DER sufficient to understand and implement one OSI-
based application, RSA Data Security, Inc.'s Public-Key
Cryptography Standards. The features described include an
overview of ASN.1, BER, and DER and an abridged list of
ASN.1 types and their BER and DER encodings. Sections 2-4
give an overview of ASN.1, BER, and DER, in that order.
Section 5 lists some ASN.1 types, giving their notation,
specific encoding rules, examples, and comments about their
application to PKCS. Section 6 concludes with an example,
X.500 distinguished names.
Advanced features of ASN.1, such as macros, are not
described in this note, as they are not needed to implement
PKCS. For information on the other features, and for more
detail generally, the reader is referred to CCITT
Recommendations X.208 and X.209, which define ASN.1 and BER.
Terminology and notation. In this note, an octet is an eight-
bit unsigned integer. Bit 8 of the octet is the most
significant and bit 1 is the least significant.
The following meta-syntax is used for in describing ASN.1
notation:
BIT monospace denotes literal characters in the type
and value notation; in examples, it generally
denotes an octet value in hexadecimal
n1 bold italics denotes a variable
[] bold square brackets indicate that a term is
optional
{} bold braces group related terms
| bold vertical bar delimits alternatives with a
group
... bold ellipsis indicates repeated occurrences
= bold equals sign expresses terms as subterms
2. Abstract Syntax Notation One
Abstract Syntax Notation One, abbreviated ASN.1, is a
notation for describing abstract types and values.
In ASN.1, a type is a set of values. For some types, there
are a finite number of values, and for other types there are
an infinite number. A value of a given ASN.1 type is an
element of the type's set. ASN.1 has four kinds of type:
simple types, which are "atomic" and have no components;
structured types, which have components; tagged types, which
are derived from other types; and other types, which include
the CHOICE type and the ANY type. Types and values can be
given names with the ASN.1 assignment operator (::=) , and
those names can be used in defining other types and values.
Every ASN.1 type other than CHOICE and ANY has a tag, which
consists of a class and a nonnegative tag number. ASN.1
types are abstractly the same if and only if their tag
numbers are the same. In other words, the name of an ASN.1
type does not affect its abstract meaning, only the tag
does. There are four classes of tag:
Universal, for types whose meaning is the same in all
applications; these types are only defined in
X.208.
Application, for types whose meaning is specific to an
application, such as X.500 directory services;
types in two different applications may have the
same application-specific tag and different
meanings.
Private, for types whose meaning is specific to a given
enterprise.
Context-specific, for types whose meaning is specific
to a given structured type; context-specific tags
are used to distinguish between component types
with the same underlying tag within the context of
a given structured type, and component types in
two different structured types may have the same
tag and different meanings.
The types with universal tags are defined in X.208, which
also gives the types' universal tag numbers. Types with
other tags are defined in many places, and are always
obtained by implicit or explicit tagging (see Section 2.3).
Table 1 lists some ASN.1 types and their universal-class
tags.
Type Tag number Tag number
(decimal) (hexadecimal)
INTEGER 2 02
BIT STRING 3 03
OCTET STRING 4 04
NULL 5 05
OBJECT IDENTIFIER 6 06
SEQUENCE and SEQUENCE OF 16 10
SET and SET OF 17 11
PrintableString 19 13
T61String 20 14
IA5String 22 16
UTCTime 23 17
Table 1. Some types and their universal-class tags.
ASN.1 types and values are expressed in a flexible,
programming-language-like notation, with the following
special rules:
o Layout is not significant; multiple spaces and
line breaks can be considered as a single space.
o Comments are delimited by pairs of hyphens (--),
or a pair of hyphens and a line break.
o Identifiers (names of values and fields) and type
references (names of types) consist of upper- and
lower-case letters, digits, hyphens, and spaces;
identifiers begin with lower-case letters; type
references begin with upper-case letters.
The following four subsections give an overview of simple
types, structured types, implicitly and explicitly tagged
types, and other types. Section 5 describes specific types
in more detail.
2.1 Simple types
Simple types are those not consisting of components; they
are the "atomic" types. ASN.1 defines several; the types
that are relevant to the PKCS standards are the following:
BIT STRING, an arbitrary string of bits (ones and
zeroes).
IA5String, an arbitrary string of IA5 (ASCII)
characters.
INTEGER, an arbitrary integer.
NULL, a null value.
OBJECT IDENTIFIER, an object identifier, which is a
sequence of integer components that identify an
object such as an algorithm or attribute type.
OCTET STRING, an arbitrary string of octets (eight-bit
values).
PrintableString, an arbitrary string of printable
characters.
T61String, an arbitrary string of T.61 (eight-bit)
characters.
UTCTime, a "coordinated universal time" or Greenwich
Mean Time (GMT) value.
Simple types fall into two categories: string types and non-
string types. BIT STRING, IA5String, OCTET STRING,
PrintableString, T61String, and UTCTime are string types.
String types can be viewed, for the purposes of encoding, as
consisting of components, where the components are
substrings. This view allows one to encode a value whose
length is not known in advance (e.g., an octet string value
input from a file stream) with a constructed, indefinite-
length encoding (see Section 3).
The string types can be given size constraints limiting the
length of values.
2.2 Structured types
Structured types are those consisting of components. ASN.1
defines four, all of which are relevant to the PKCS
standards:
SEQUENCE, an ordered collection of one or more types.
SEQUENCE OF, an ordered collection of zero or more
occurrences of a given type.
SET, an unordered collection of one or more types.
SET OF, an unordered collection of zero or more
occurrences of a given type.
The structured types can have optional components, possibly
with default values.
2.3 Implicitly and explicitly tagged types
Tagging is useful to distinguish types within an
application; it is also commonly used to distinguish
component types within a structured type. For instance,
optional components of a SET or SEQUENCE type are typically
given distinct context-specific tags to avoid ambiguity.
There are two ways to tag a type: implicitly and explicitly.
Implicitly tagged types are derived from other types by
changing the tag of the underlying type. Implicit tagging is
denoted by the ASN.1 keywords [class number] IMPLICIT (see
Section 5.1).
Explicitly tagged types are derived from other types by
adding an outer tag to the underlying type. In effect,
explicitly tagged types are structured types consisting of
one component, the underlying type. Explicit tagging is
denoted by the ASN.1 keywords [class number] EXPLICIT (see
Section 5.2).
The keyword [class number] alone is the same as explicit
tagging, except when the "module" in which the ASN.1 type is
defined has implicit tagging by default. ("Modules" are
among the advanced features not described in this note.)
For purposes of encoding, an implicitly tagged type is
considered the same as the underlying type, except that the
tag is different. An explicitly tagged type is considered
like a structured type with one component, the underlying
type. Implicit tags result in shorter encodings, but
explicit tags may be necessary to avoid ambiguity if the tag
of the underlying type is indeterminate (e.g., the
underlying type is CHOICE or ANY).
2.4 Other types
Other types in ASN.1 include the CHOICE and ANY types. The
CHOICE type denotes a union of one or more alternatives; the
ANY type denotes an arbitrary value of an arbitrary type,
where the arbitrary type is possibly defined in the
registration of an object identifier or integer value.
3. Basic Encoding Rules
The Basic Encoding Rules for ASN.1, abbreviated BER, give
one or more ways to represent any ASN.1 value as an octet
string. (There are certainly other ways to represent ASN.1
values, but BER is the standard for interchanging such
values in OSI.)
There are three methods to encode an ASN.1 value under BER,
the choice of which depends on the type of value and whether
the length of the value is known. The three methods are
primitive, definite-length encoding; constructed, definite-
length encoding; and constructed, indefinite-length
encoding. Simple non-string types employ the primitive,
definite-length method; structured types employ either of
the constructed methods; and simple string types employ any
of the methods, depending on whether the length of the value
is known. Types derived by implicit tagging employ the
method of the underlying type and types derived by explicit
tagging employ the constructed methods.
In each method, the BER encoding has three or four parts:
Identifier octets. These identify the class and tag
number of the ASN.1 value, and indicate whether
the method is primitive or constructed.
Length octets. For the definite-length methods, these
give the number of contents octets. For the
constructed, indefinite-length method, these
indicate that the length is indefinite.
Contents octets. For the primitive, definite-length
method, these give a concrete representation of
the value. For the constructed methods, these
give the concatenation of the BER encodings of the
components of the value.
End-of-contents octets. For the constructed, indefinite-
length method, these denote the end of the
contents. For the other methods, these are absent.
The three methods of encoding are described in the following
sections.
3.1 Primitive, definite-length method
This method applies to simple types and types derived from
simple types by implicit tagging. It requires that the
length of the value be known in advance. The parts of the
BER encoding are as follows:
Identifier octets. There are two forms: low tag number (for
tag numbers between 0 and 30) and high tag number (for tag
numbers 31 and greater).
Low-tag-number form. One octet. Bits 8 and 7 specify
the class (see Table 2), bit 6 has value "0,"
indicating that the encoding is primitive, and
bits 5-1 give the tag number.
Class Bit Bit
8 7
universal 0 0
application 0 1
context-specific 1 0
private 1 1
Table 2. Class encoding in identifier octets.
High-tag-number form. Two or more octets. First octet
is as in low-tag-number form, except that bits 5-1
all have value "1." Second and following octets
give the tag number, base 128, most significant
digit first, with as few digits as possible, and
with the bit 8 of each octet except the last set
to "1."
Length octets. There are two forms: short (for lengths
between 0 and 127), and long definite (for lengths between 0
and 21008-1).
Short form. One octet. Bit 8 has value "0" and bits 7-1
give the length.
Long form. Two to 127 octets. Bit 8 of first octet has
value "1" and bits 7-1 give the number of
additional length octets. Second and following
octets give the length, base 256, most significant
digit first.
Contents octets. These give a concrete representation of the
value (or the value of the underlying type, if the type is
derived by implicit tagging). Details for particular types
are given in Section 5.
3.2 Constructed, definite-length method
This method applies to simple string types, structured
types, types derived simple string types and structured
types by implicit tagging, and types derived from anything
by explicit tagging. It requires that the length of the
value be known in advance. The parts of the BER encoding are
as follows:
Identifier octets. As described in Section 3.1, except that
bit 6 has value "1," indicating that the encoding is
constructed.
Length octets. As described in Section 3.1.
Contents octets. The concatenation of the BER encodings of
the components of the value:
o For simple string types and types derived from
them by implicit tagging, the concatenation of the
BER encodings of consecutive substrings of the
value (underlying value for implicit tagging).
o For structured types and types derived from them
by implicit tagging, the concatenation of the BER
encodings of components of the value (underlying
value for implicit tagging).
o For types derived from anything by explicit
tagging, the BER encoding of the underlying value.
Details for particular types are given in Section 5.
3.3 Constructed, indefinite-length method
This method applies to simple string types, structured
types, types derived simple string types and structured
types by implicit tagging, and types derived from anything
by explicit tagging. It does not require that the length of
the value be known in advance. The parts of the BER encoding
are as follows:
Identifier octets. As described in Section 3.2.
Length octets. One octet, 80.
Contents octets. As described in Section 3.2.
End-of-contents octets. Two octets, 00 00.
Since the end-of-contents octets appear where an ordinary
BER encoding might be expected (e.g., in the contents octets
of a sequence value), the 00 and 00 appear as identifier and
length octets, respectively. Thus the end-of-contents octets
is really the primitive, definite-length encoding of a value
with universal class, tag number 0, and length 0.
4. Distinguished Encoding Rules
The Distinguished Encoding Rules for ASN.1, abbreviated DER,
are a subset of BER, and give exactly one way to represent
any ASN.1 value as an octet string. DER is intended for
applications in which a unique octet string encoding is
needed, as is the case when a digital signature is computed
on an ASN.1 value. DER is defined in Section 8.7 of X.509.
DER adds the following restrictions to the rules given in
Section 3:
1. When the length is between 0 and 127, the short
form of length must be used
2. When the length is 128 or greater, the long form
of length must be used, and the length must be
encoded in the minimum number of octets.
3. For simple string types and implicitly tagged
types derived from simple string types, the
primitive, definite-length method must be
employed.
4. For structured types, implicitly tagged types
derived from structured types, and explicitly
tagged types derived from anything, the
constructed, definite-length method must be
employed.
Other restrictions are defined for particular types (such as
BIT STRING, SEQUENCE, SET, and SET OF), and can be found in
Section 5.
5. Notation and encodings for some types
This section gives the notation for some ASN.1 types and
describes how to encode values of those types under both BER
and DER.
The types described are those presented in Section 2. They
are listed alphabetically here.
Each description includes ASN.1 notation, BER encoding, and
DER encoding. The focus of the encodings is primarily on the
contents octets; the tag and length octets follow Sections 3
and 4. The descriptions also explain where each type is used
in PKCS and related standards. ASN.1 notation is generally
only for types, although for the type OBJECT IDENTIFIER,
value notation is given as well.
5.1 Implicitly tagged types
An implicitly tagged type is a type derived from another
type by changing the tag of the underlying type.
Implicit tagging is used for optional SEQUENCE components
with underlying type other than ANY throughout PKCS, and for
the extendedCertificate alternative of PKCS #7's
ExtendedCertificateOrCertificate type.
ASN.1 notation:
[[class] number] IMPLICIT Type
class = UNIVERSAL | APPLICATION | PRIVATE
where Type is a type, class is an optional class name, and
number is the tag number within the class, a nonnegative
integer.
In ASN.1 "modules" whose default tagging method is implicit
tagging, the notation [[class] number] Type is also
acceptable, and the keyword IMPLICIT is implied. (See
Section 2.3.) For definitions stated outside a module, the
explicit inclusion of the keyword IMPLICIT is preferable to
prevent ambiguity.
If the class name is absent, then the tag is context-
specific. Context-specific tags can only appear in a
component of a structured or CHOICE type.
Example: PKCS #8's PrivateKeyInfo type has an optional
attributes component with an implicit, context-specific tag:
PrivateKeyInfo ::= SEQUENCE {
version Version,
privateKeyAlgorithm PrivateKeyAlgorithmIdentifier,
privateKey PrivateKey,
attributes [0] IMPLICIT Attributes OPTIONAL }
Here the underlying type is Attributes, the class is absent
(i.e., context-specific), and the tag number within the
class is 0.
BER encoding. Primitive or constructed, depending on the
underlying type. Contents octets are as for the BER encoding
of the underlying value.
Example: The BER encoding of the attributes component of a
PrivateKeyInfo value is as follows:
o the identifier octets are 80 if the underlying
Attributes value has a primitive BER encoding and
a0 if the underlying Attributes value has a
constructed BER encoding
o the length and contents octets are the same as the
length and contents octets of the BER encoding of
the underlying Attributes value
DER encoding. Primitive or constructed, depending on the
underlying type. Contents octets are as for the DER encoding
of the underlying value.
5.2 Explicitly tagged types
Explicit tagging denotes a type derived from another type by
adding an outer tag to the underlying type.
Explicit tagging is used for optional SEQUENCE components
with underlying type ANY throughout PKCS, and for the
version component of X.509's Certificate type.
ASN.1 notation:
[[class] number] EXPLICIT Type
class = UNIVERSAL | APPLICATION | PRIVATE
where Type is a type, class is an optional class name, and
number is the tag number within the class, a nonnegative
integer.
If the class name is absent, then the tag is context-
specific. Context-specific tags can only appear in a
component of a SEQUENCE, SET or CHOICE type.
In ASN.1 "modules" whose default tagging method is explicit
tagging, the notation [[class] number] Type is also
acceptable, and the keyword EXPLICIT is implied. (See
Section 2.3.) For definitions stated outside a module, the
explicit inclusion of the keyword EXPLICIT is preferable to
prevent ambiguity.
Example 1: PKCS #7's ContentInfo type has an optional
content component with an explicit, context-specific tag:
ContentInfo ::= SEQUENCE {
contentType ContentType,
content
[0] EXPLICIT ANY DEFINED BY contentType OPTIONAL }
Here the underlying type is ANY DEFINED BY contentType, the
class is absent (i.e., context-specific), and the tag number
within the class is 0.
Example 2: X.509's Certificate type has a version component
with an explicit, context-specific tag, where the EXPLICIT
keyword is omitted:
Certificate ::= ...
version [0] Version DEFAULT v1988,
...
The tag is explicit because the default tagging method for
the ASN.1 "module" in X.509 that defines the Certificate
type is explicit tagging.
BER encoding. Constructed. Contents octets are the BER
encoding of the underlying value.
Example: the BER encoding of the content component of a
ContentInfo value is as follows:
o identifier octets are a0
o length octets represent the length of the BER
encoding of the underlying ANY DEFINED BY
contentType value
o contents octets are the BER encoding of the
underlying ANY DEFINED BY contentType value
DER encoding. Constructed. Contents octets are the DER
encoding of the underlying value.
5.3 ANY
The ANY type denotes an arbitrary value of an arbitrary
type, where the arbitrary type is possibly defined in the
registration of an object identifier or associated with an
integer index.
The ANY type is used for content of a particular content
type in PKCS #7's ContentInfo type, for parameters of a
particular algorithm in X.509's AlgorithmIdentifier type,
and for attribute values in X.501's Attribute and
AttributeValueAssertion types. The Attribute type is used by
PKCS #6, #7, #8, #9 and #10, and the AttributeValueAssertion
type is used in X.501 distinguished names.
ASN.1 notation:
ANY [DEFINED BY identifier]
where identifier is an optional identifier.
In the ANY form, the actual type is indeterminate.
The ANY DEFINED BY identifier form can only appear in a
component of a SEQUENCE or SET type for which identifier
identifies some other component, and that other component
has type INTEGER or OBJECT IDENTIFIER (or a type derived
from either of those by tagging). In that form, the actual
type is determined by the value of the other component,
either in the registration of the object identifier value,
or in a table of integer values.
Example: X.509's AlgorithmIdentifier type has a component of
type ANY:
AlgorithmIdentifier ::= SEQUENCE {
algorithm OBJECT IDENTIFIER,
parameters ANY DEFINED BY algorithm OPTIONAL }
Here the actual type of the parameter component depends on
the value of the algorithm component. The actual type would
be defined in the registration of object identifier values
for the algorithm component.
BER encoding. Same as the BER encoding of the actual value.
Example: The BER encoding of the value of the parameter
component is the BER encoding of the value of the actual
type as defined in the registration of object identifier
values for the algorithm component.
DER encoding. Same as the DER encoding of the actual value.
5.4 BIT STRING
The BIT STRING type denotes an arbitrary string of bits
(ones and zeroes). A BIT STRING value can have any length,
including zero. This type is a string type.
The BIT STRING type is used for digital signatures on
extended certificates in PKCS #6's ExtendedCertificate type,
for digital signatures on certificates in X.509's
Certificate type, and for public keys in certificates in
X.509's SubjectPublicKeyInfo type.
ASN.1 notation:
BIT STRING
Example: X.509's SubjectPublicKeyInfo type has a component
of type BIT STRING:
SubjectPublicKeyInfo ::= SEQUENCE {
algorithm AlgorithmIdentifier,
publicKey BIT STRING }
BER encoding. Primitive or constructed. In a primitive
encoding, the first contents octet gives the number of bits
by which the length of the bit string is less than the next
multiple of eight (this is called the "number of unused
bits"). The second and following contents octets give the
value of the bit string, converted to an octet string. The
conversion process is as follows:
1. The bit string is padded after the last bit with
zero to seven bits of any value to make the length
of the bit string a multiple of eight. If the
length of the bit string is a multiple of eight
already, no padding is done.
2. The padded bit string is divided into octets. The
first eight bits of the padded bit string become
the first octet, bit 8 to bit 1, and so on through
the last eight bits of the padded bit string.
In a constructed encoding, the contents octets give the
concatenation of the BER encodings of consecutive substrings
of the bit string, where each substring except the last has
a length that is a multiple of eight bits.
Example: The BER encoding of the BIT STRING value
"011011100101110111" can be any of the following, among
others, depending on the choice of padding bits, the form of
length octets, and whether the encoding is primitive or
constructed:
03 04 06 6e 5d c0 DER encoding
03 04 06 6e 5d e0 padded with "100000"
03 81 04 06 6e 5d c0 long form of length octets
23 09 constructed encoding: "0110111001011101" + "11"
03 03 00 6e 5d
03 02 06 c0
DER encoding. Primitive. The contents octects are as for a
primitive BER encoding, except that the bit string is padded
with zero-valued bits.
Example: The DER encoding of the BIT STRING value
"011011100101110111" is
03 04 06 6e 5d c0
5.5 CHOICE
The CHOICE type denotes a union of one or more alternatives.
The CHOICE type is used to represent the union of an
extended certificate and an X.509 certificate in PKCS #7's
ExtendedCertificateOrCertificate type.
ASN.1 notation:
CHOICE {
[identifier1] Type1,
...,
[identifiern] Typen }
where identifier1 , ..., identifiern are optional, distinct
identifiers for the alternatives, and Type1, ..., Typen are
the types of the alternatives. The identifiers are primarily
for documentation; they do not affect values of the type or
their encodings in any way.
The types must have distinct tags. This requirement is
typically satisfied with explicit or implicit tagging on
some of the alternatives.
Example: PKCS #7's ExtendedCertificateOrCertificate type is
a CHOICE type:
ExtendedCertificateOrCertificate ::= CHOICE {
certificate Certificate, -- X.509
extendedCertificate [0] IMPLICIT ExtendedCertificate
}
Here the identifiers for the alternatives are certificate
and extendedCertificate, and the types of the alternatives
are Certificate and [0] IMPLICIT ExtendedCertificate.
BER encoding. Same as the BER encoding of the chosen
alternative. The fact that the alternatives have distinct
tags makes it possible to distinguish between their BER
encodings.
Example: The identifier octets for the BER encoding are 30
if the chosen alternative is certificate, and a0 if the
chosen alternative is extendedCertificate.
DER encoding. Same as the DER encoding of the chosen
alternative.
5.6 IA5String
The IA5String type denotes an arbtrary string of IA5
characters. IA5 stands for International Alphabet 5, which
is the same as ASCII. The character set includes non-
printing control characters. An IA5String value can have any
length, including zero. This type is a string type.
The IA5String type is used in PKCS #9's electronic-mail
address, unstructured-name, and unstructured-address
attributes.
ASN.1 notation:
IA5String
BER encoding. Primitive or constructed. In a primitive
encoding, the contents octets give the characters in the IA5
string, encoded in ASCII. In a constructed encoding, the
contents octets give the concatenation of the BER encodings
of consecutive substrings of the IA5 string.
Example: The BER encoding of the IA5String value
"test1@rsa.com" can be any of the following, among others,
depending on the form of length octets and whether the
encoding is primitive or constructed:
16 0d 74 65 73 74 31 40 72 73 61 2e 63 6f 6d DER encoding
16 81 0d long form of length octets
74 65 73 74 31 40 72 73 61 2e 63 6f 6d
36 13 constructed encoding: "test1" + "@" + "rsa.com"
16 05 74 65 73 74 31
16 01 40
16 07 72 73 61 2e 63 6f 6d
DER encoding. Primitive. Contents octets are as for a
primitive BER encoding.
Example: The DER encoding of the IA5String value
"test1@rsa.com" is
16 0d 74 65 73 74 31 40 72 73 61 2e 63 6f 6d
5.7 INTEGER
The INTEGER type denotes an arbitrary integer. INTEGER
values can be positive, negative, or zero, and can have any
magnitude.
The INTEGER type is used for version numbers throughout
PKCS, cryptographic values such as modulus, exponent, and
primes in PKCS #1's RSAPublicKey and RSAPrivateKey types and
PKCS #3's DHParameter type, a message-digest iteration count
in PKCS #5's PBEParameter type, and version numbers and
serial numbers in X.509's Certificate type.
ASN.1 notation:
INTEGER [{ identifier1(value1) ... identifiern(valuen) }]
where identifier1, ..., identifiern are optional distinct
identifiers and value1, ..., valuen are optional integer
values. The identifiers, when present, are associated with
values of the type.
Example: X.509's Version type is an INTEGER type with
identified values:
Version ::= INTEGER { v1988(0) }
The identifier v1988 is associated with the value 0. X.509's
Certificate type uses the identifier v1988 to give a default
value of 0 for the version component:
Certificate ::= ...
version Version DEFAULT v1988,
...
BER encoding. Primitive. Contents octets give the value of
the integer, base 256, in two's complement form, most
significant digit first, with the minimum number of octets.
The value 0 is encoded as a single 00 octet.
Some example BER encodings (which also happen to be DER
encodings) are given in Table 3.
Integer BER encoding
value
0 02 01 00
127 02 01 7F
128 02 02 00 80
256 02 02 01 00
-128 02 01 80
-129 02 02 FF 7F
Table 3. Example BER encodings of INTEGER values.
DER encoding. Primitive. Contents octets are as for a
primitive BER encoding.
5.8 NULL
The NULL type denotes a null value.
The NULL type is used for algorithm parameters in several
places in PKCS.
ASN.1 notation:
NULL
BER encoding. Primitive. Contents octets are empty.
Example: The BER encoding of a NULL value can be either of
the following, as well as others, depending on the form of
the length octets:
05 00
05 81 00
DER encoding. Primitive. Contents octets are empty; the DER
encoding of a NULL value is always 05 00.
5.9 OBJECT IDENTIFIER
The OBJECT IDENTIFIER type denotes an object identifier, a
sequence of integer components that identifies an object
such as an algorithm, an attribute type, or perhaps a
registration authority that defines other object
identifiers. An OBJECT IDENTIFIER value can have any number
of components, and components can generally have any
nonnegative value. This type is a non-string type.
OBJECT IDENTIFIER values are given meanings by registration
authorities. Each registration authority is responsible for
all sequences of components beginning with a given sequence.
A registration authority typically delegates responsibility
for subsets of the sequences in its domain to other
registration authorities, or for particular types of object.
There are always at least two components.
The OBJECT IDENTIFIER type is used to identify content in
PKCS #7's ContentInfo type, to identify algorithms in
X.509's AlgorithmIdentifier type, and to identify attributes
in X.501's Attribute and AttributeValueAssertion types. The
Attribute type is used by PKCS #6, #7, #8, #9, and #10, and
the AttributeValueAssertion type is used in X.501
distinguished names. OBJECT IDENTIFIER values are defined
throughout PKCS.
ASN.1 notation:
OBJECT IDENTIFIER
The ASN.1 notation for values of the OBJECT IDENTIFIER type
is
{ [identifier] component1 ... componentn }
componenti = identifieri | identifieri (valuei) | valuei
where identifier, identifier1, ..., identifiern are
identifiers, and value1, ..., valuen are optional integer
values.
The form without identifier is the "complete" value with all
its components; the form with identifier abbreviates the
beginning components with another object identifier value.
The identifiers identifier1, ..., identifiern are intended
primarily for documentation, but they must correspond to the
integer value when both are present. These identifiers can
appear without integer values only if they are among a small
set of identifiers defined in X.208.
Example: The following values both refer to the object
identifier assigned to RSA Data Security, Inc.:
{ iso(1) member-body(2) 840 113549 }
{ 1 2 840 113549 }
(In this example, which gives ASN.1 value notation, the
object identifier values are decimal, not hexadecimal.)
Table 4 gives some other object identifier values and their
meanings.
Object identifier value Meaning
{ 1 2 } ISO member bodies
{ 1 2 840 } US (ANSI)
{ 1 2 840 113549 } RSA Data Security, Inc.
{ 1 2 840 113549 1 } RSA Data Security, Inc. PKCS
{ 2 5 } directory services (X.500)
{ 2 5 8 } directory services-algorithms
Table 4. Some object identifier values and their meanings.
BER encoding. Primitive. Contents octets are as follows,
where value1, ..., valuen denote the integer values of the
components in the complete object identifier:
1. The first octet has value 40 * value1 + value2.
(This is unambiguous, since value1 is limited to
values 0, 1, and 2; value2 is limited to the range
0 to 39 when value1 is 0 or 1; and, according to
X.208, n is always at least 2.)
2. The following octets, if any, encode value3, ...,
valuen. Each value is encoded base 128, most
significant digit first, with as few digits as
possible, and the most significant bit of each
octet except the last in the value's encoding set
to "1."
Example: The first octet of the BER encoding of RSA Data
Security, Inc.'s object identifier is 40 * 1 + 2 = 42 =
2a16. The encoding of 840 = 6 * 128 + 4816 is 86 48 and the
encoding of 113549 = 6 * 1282 + 7716 * 128 + d16 is 86 f7
0d. This leads to the following BER encoding:
06 06 2a 86 48 86 f7 0d
DER encoding. Primitive. Contents octets are as for a
primitive BER encoding.
5.10 OCTET STRING
The OCTET STRING type denotes an arbitrary string of octets
(eight-bit values). An OCTET STRING value can have any
length, including zero. This type is a string type.
The OCTET STRING type is used for salt values in PKCS #5's
PBEParameter type, for message digests, encrypted message
digests, and encrypted content in PKCS #7, and for private
keys and encrypted private keys in PKCS #8.
ASN.1 notation:
OCTET STRING [SIZE ({size | size1..size2})]
where size, size1, and size2 are optional size constraints.
In the OCTET STRING SIZE (size) form, the octet string must
have size octets. In the OCTET STRING SIZE (size1..size2)
form, the octet string must have between size1 and size2
octets. In the OCTET STRING form, the octet string can have
any size.
Example: PKCS #5's PBEParameter type has a component of type
OCTET STRING:
PBEParameter ::= SEQUENCE {
salt OCTET STRING SIZE(8),
iterationCount INTEGER }
Here the size of the salt component is always eight octets.
BER encoding. Primitive or constructed. In a primitive
encoding, the contents octets give the value of the octet
string, first octet to last octet. In a constructed
encoding, the contents octets give the concatenation of the
BER encodings of substrings of the OCTET STRING value.
Example: The BER encoding of the OCTET STRING value 01 23 45
67 89 ab cd ef can be any of the following, among others,
depending on the form of length octets and whether the
encoding is primitive or constructed:
04 08 01 23 45 67 89 ab cd ef DER encoding
04 81 08 01 23 45 67 89 ab cd ef long form of length octets
24 0c constructed encoding: 01 ... 67 + 89 ... ef
04 04 01 23 45 67
04 04 89 ab cd ef
DER encoding. Primitive. Contents octets are as for a
primitive BER encoding.
Example: The BER encoding of the OCTET STRING value 01 23 45
67 89 ab cd ef is
04 08 01 23 45 67 89 ab cd ef
5.11 PrintableString
The PrintableString type denotes an arbitrary string of
printable characters from the following character set:
A, B, ..., Z
a, b, ..., z
0, 1, ..., 9
(space) ' ( ) + , - . / : = ?
This type is a string type.
The PrintableString type is used in PKCS #9's challenge-
password and unstructuerd-address attributes, and in several
X.521 distinguished names attributes.
ASN.1 notation:
PrintableString
BER encoding. Primitive or constructed. In a primitive
encoding, the contents octets give the characters in the
printable string, encoded in ASCII. In a constructed
encoding, the contents octets give the concatenation of the
BER encodings of consecutive substrings of the string.
Example: The BER encoding of the PrintableString value "Test
User 1" can be any of the following, among others, depending
on the form of length octets and whether the encoding is
primitive or constructed:
13 0b 54 65 73 74 20 55 73 65 72 20 31 DER encoding
13 81 0b long form of length octets
54 65 73 74 20 55 73 65 72 20 31
33 0f constructed encoding: "Test " + "User 1"
13 05 54 65 73 74 20
13 06 55 73 65 72 20 31
DER encoding. Primitive. Contents octets are as for a
primitive BER encoding.
Example: The DER encoding of the PrintableString value "Test
User 1" is
13 0b 54 65 73 74 20 55 73 65 72 20 31
5.12 SEQUENCE
The SEQUENCE type denotes an ordered collection of one or
more types.
The SEQUENCE type is used throughout PKCS and related
standards.
ASN.1 notation:
SEQUENCE {
[identifier1] Type1 [{OPTIONAL | DEFAULT value1}],
...,
[identifiern] Typen [{OPTIONAL | DEFAULT valuen}]}
where identifier1 , ..., identifiern are optional, distinct
identifiers for the components, Type1, ..., Typen are the
types of the components, and value1, ..., valuen are optional
default values for the components. The identifiers are
primarily for documentation; they do not affect values of
the type or their encodings in any way.
The OPTIONAL qualifier indicates that the value of a
component is optional and need not be present in the
sequence. The DEFAULT qualifier also indicates that the
value of a component is optional, and assigns a default
value to the component when the component is absent.
The types of any consecutive series of components with the
OPTIONAL or DEFAULT qualifier, as well as of any component
immediately following that series, must have distinct tags.
This requirement is typically satisfied with explicit or
implicit tagging on some of the components.
Example: X.509's Validity type is a SEQUENCE type with two
components:
Validity ::= SEQUENCE {
start UTCTime,
end UTCTime }
Here the identifiers for the components are start and end,
and the types of the components are both UTCTime.
BER encoding. Constructed. Contents octets are the
concatenation of the BER encodings of the values of the
components of the sequence, in order of definition, with the
following rules for components with the OPTIONAL and DEFAULT
qualifiers:
o if the value of a component with the OPTIONAL or
DEFAULT qualifier is absent from the sequence,
then the encoding of that component is not
included in the contents octets
o if the value of a component with the DEFAULT
qualifier is the default value, then the encoding
of that component may or may not be included in
the contents octets
DER encoding. Constructed. Contents octets are the same as
the BER encoding, except that if the value of a component
with the DEFAULT qualifier is the default value, the
encoding of that component is not included in the contents
octets.
5.13 SEQUENCE OF
The SEQUENCE OF type denotes an ordered collection of zero
or more occurrences of a given type.
The SEQUENCE OF type is used in X.501 distinguished names.
ASN.1 notation:
SEQUENCE OF Type
where Type is a type.
Example: X.501's RDNSequence type consists of zero or more
occurences of the RelativeDistinguishedName type, most
significant occurrence first:
RDNSequence ::= SEQUENCE OF RelativeDistinguishedName
BER encoding. Constructed. Contents octets are the
concatenation of the BER encodings of the values of the
occurrences in the collection, in order of occurence.
DER encoding. Constructed. Contents octets are the
concatenation of the DER encodings of the values of the
occurrences in the collection, in order of occurence.
5.14 SET
The SET type denotes an unordered collection of one or more
types.
The SET type is not used in PKCS.
ASN.1 notation:
SET {
[identifier1] Type1 [{OPTIONAL | DEFAULT value1}],
...,
[identifiern] Typen [{OPTIONAL | DEFAULT valuen}]}
where identifier1, ..., identifiern are optional, distinct
identifiers for the components, Type1, ..., Typen are the
types of the components, and value1, ..., valuen are
optional default values for the components. The identifiers
are primarily for documentation; they do not affect values
of the type or their encodings in any way.
The OPTIONAL qualifier indicates that the value of a
component is optional and need not be present in the set.
The DEFAULT qualifier also indicates that the value of a
component is optional, and assigns a default value to the
component when the component is absent.
The types must have distinct tags. This requirement is
typically satisfied with explicit or implicit tagging on
some of the components.
BER encoding. Constructed. Contents octets are the
concatenation of the BER encodings of the values of the
components of the set, in any order, with the following
rules for components with the OPTIONAL and DEFAULT
qualifiers:
o if the value of a component with the OPTIONAL or
DEFAULT qualifier is absent from the set, then the
encoding of that component is not included in the
contents octets
o if the value of a component with the DEFAULT
qualifier is the default value, then the encoding
of that component may or may not be included in
the contents octets
DER encoding. Constructed. Contents octets are the same as
for the BER encoding, except that:
1. If the value of a component with the DEFAULT
qualifier is the default value, the encoding of
that component is not included.
2. There is an order to the components, namely
ascending order by tag.
5.15 SET OF
The SET OF type denotes an unordered collection of zero or
more occurrences of a given type.
The SET OF type is used for sets of attributes in PKCS #6,
#7, #8, #9 and #10, for sets of message-digest algorithm
identifiers, signer information, and recipient information
in PKCS #7, and in X.501 distinguished names.
ASN.1 notation:
SET OF Type
where Type is a type.
Example: X.501's RelativeDistinguishedName type consists of
zero or more occurrences of the AttributeValueAssertion
type, where the order is unimportant:
RelativeDistinguishedName ::=
SET OF AttributeValueAssertion
BER encoding. Constructed. Contents octets are the
concatenation of the BER encodings of the values of the
occurrences in the collection, in any order.
DER encoding. Constructed. Contents octets are the same as
for the BER encoding, except that there is an order, namely
ascending lexicographic order of BER encoding. Lexicographic
comparison of two different BER encodings is done as
follows: Logically pad the shorter BER encoding after the
last octet with dummy octets that are smaller in value than
any normal octet. Scan the BER encodings from left to right
until a difference is found. The smaller-valued BER encoding
is the one with the smaller-valued octet at the point of
difference.
5.16 T61String
The T61String type denotes an arbtrary string of T.61
characters. T.61 is an eight-bit extension to the ASCII
character set. Special "escape" sequences specify the
interpretation of subsequent character values as, for
example, Japanese; the initial interpretation is Latin. The
character set includes non-printing control characters. The
T61String type allows only the Latin and Japanese character
interepretations, and implementors' agreements for directory
names exclude control characters [NIST92]. A T61String value
can have any length, including zero. This type is a string
type.
The T61String type is used in PKCS #9's unstructured-address
and challenge-password attributes, and in several X.521
attributes.
ASN.1 notation:
T61String
BER encoding. Primitive or constructed. In a primitive
encoding, the contents octets give the characters in the
T.61 string, encoded in ASCII. In a constructed encoding,
the contents octets give the concatenation of the BER
encodings of consecutive substrings of the T.61 string.
Example: The BER encoding of the T61String value "cl'es
publiques" (French for "public keys") can be any of the
following, among others, depending on the form of length
octets and whether the encoding is primitive or constructed:
14 0f DER encoding
63 6c c2 65 73 20 70 75 62 6c 69 71 75 65 73
14 81 0f long form of length octets
63 6c c2 65 73 20 70 75 62 6c 69 71 75 65 73
34 15 constructed encoding: "cl'es" + " " + "publiques"
14 05 63 6c c2 65 73
14 01 20
14 09 70 75 62 6c 69 71 75 65 73
The eight-bit character c2 is a T.61 prefix that adds an
acute accent (') to the next character.
DER encoding. Primitive. Contents octets are as for a
primitive BER encoding.
Example: The DER encoding of the T61String value "cl'es
publiques" is
14 0f 63 6c c2 65 73 20 70 75 62 6c 69 71 75 65 73
5.17 UTCTime
The UTCTime type denotes a "coordinated universal time" or
Greenwich Mean Time (GMT) value. A UTCTime value includes
the local time precise to either minutes or seconds, and an
offset from GMT in hours and minutes. It takes any of the
following forms:
YYMMDDhhmmZ
YYMMDDhhmm+hh'mm'
YYMMDDhhmm-hh'mm'
YYMMDDhhmmssZ
YYMMDDhhmmss+hh'mm'
YYMMDDhhmmss-hh'mm'
where:
YY is the least significant two digits of the year
MM is the month (01 to 12)
DD is the day (01 to 31)
hh is the hour (00 to 23)
mm are the minutes (00 to 59)
ss are the seconds (00 to 59)
Z indicates that local time is GMT, + indicates that
local time is later than GMT, and - indicates that
local time is earlier than GMT
hh' is the absolute value of the offset from GMT in
hours
mm' is the absolute value of the offset from GMT in
minutes
This type is a string type.
The UTCTime type is used for signing times in PKCS #9's
signing-time attribute and for certificate validity periods
in X.509's Validity type.
ASN.1 notation:
UTCTime
BER encoding. Primitive or constructed. In a primitive
encoding, the contents octets give the characters in the
string, encoded in ASCII. In a constructed encoding, the
contents octets give the concatenation of the BER encodings
of consecutive substrings of the string. (The constructed
encoding is not particularly interesting, since UTCTime
values are so short, but the constructed encoding is
permitted.)
Example: The time this sentence was originally written was
4:45:40 p.m. Pacific Daylight Time on May 6, 1991, which can
be represented with either of the following UTCTime values,
among others:
"910506164540-0700"
"910506234540Z"
These values have the following BER encodings, among others:
17 0d 39 31 30 35 30 36 32 33 34 35 34 30 5a
17 11 39 31 30 35 30 36 31 36 34 35 34 30 2D 30 37 30
30
DER encoding. Primitive. Contents octets are as for a
primitive BER encoding.
6. An example
This section gives an example of ASN.1 notation and DER
encoding: the X.501 type Name.
6.1 Abstract notation
This section gives the ASN.1 notation for the X.501 type
Name.
Name ::= CHOICE {
RDNSequence }
RDNSequence ::= SEQUENCE OF RelativeDistinguishedName
RelativeDistinguishedName ::=
SET OF AttributeValueAssertion
AttributeValueAssertion ::= SEQUENCE {
AttributeType,
AttributeValue }
AttributeType ::= OBJECT IDENTIFIER
AttributeValue ::= ANY
The Name type identifies an object in an X.500 directory.
Name is a CHOICE type consisting of one alternative:
RDNSequence. (Future revisions of X.500 may have other
alternatives.)
The RDNSequence type gives a path through an X.500 directory
tree starting at the root. RDNSequence is a SEQUENCE OF type
consisting of zero or more occurences of
RelativeDistinguishedName.
The RelativeDistinguishedName type gives a unique name to an
object relative to the object superior to it in the
directory tree. RelativeDistinguishedName is a SET OF type
consisting of zero or more occurrences of
AttributeValueAssertion.
The AttributeValueAssertion type assigns a value to some
attribute of a relative distinguished name, such as country
name or common name. AttributeValueAssertion is a SEQUENCE
type consisting of two components, an AttributeType type and
an AttributeValue type.
The AttributeType type identifies an attribute by object
identifier. The AttributeValue type gives an arbitrary
attribute value. The actual type of the attribute value is
determined by the attribute type.
6.2 DER encoding
This section gives an example of a DER encoding of a value
of type Name, working from the bottom up.
The name is that of the Test User 1 from the PKCS examples
[Kal93]. The name is represented by the following path:
(root)
|
countryName = "US"
|
organizationName = "Example Organization"
|
commonName = "Test User 1"
Each level corresponds to one RelativeDistinguishedName
value, each of which happens for this name to consist of one
AttributeValueAssertion value. The AttributeType value is
before the equals sign, and the AttributeValue value (a
printable string for the given attribute types) is after the
equals sign.
The countryName, organizationName, and commonUnitName are
attribute types defined in X.520 as:
attributeType OBJECT IDENTIFIER ::=
{ joint-iso-ccitt(2) ds(5) 4 }
countryName OBJECT IDENTIFIER ::= { attributeType 6 }
organizationName OBJECT IDENTIFIER ::=
{ attributeType 10 }
commonUnitName OBJECT IDENTIFIER ::=
{ attributeType 3 }
6.2.1 AttributeType
The three AttributeType values are OCTET STRING values, so
their DER encoding follows the primitive, definite-length
method:
06 03 55 04 06 countryName
06 03 55 04 0a organizationName
06 03 55 04 03 commonName
The identifier octets follow the low-tag form, since the tag
is 6 for OBJECT IDENTIFIER. Bits 8 and 7 have value "0,"
indicating universal class, and bit 6 has value "0,"
indicating that the encoding is primitive. The length octets
follow the short form. The contents octets are the
concatenation of three octet strings derived from
subidentifiers (in decimal): 40 * 2 + 5 = 85 = 5516; 4; and
6, 10, or 3.
6.2.2 AttributeValue
The three AttributeValue values are PrintableString values,
so their encodings follow the primitive, definite-length
method:
13 02 55 53 "US"
13 14 "Example Organization"
45 78 61 6d 70 6c 65 20 4f 72 67 61 6e 69 7a 61
74 69 6f 6e
13 0b "Test User 1"
54 65 73 74 20 55 73 65 72 20 31
The identifier octets follow the low-tag-number form, since
the tag for PrintableString, 19 (decimal), is between 0 and
30. Bits 8 and 7 have value "0" since PrintableString is in
the universal class. Bit 6 has value "0" since the encoding
is primitive. The length octets follow the short form, and
the contents octets are the ASCII representation of the
attribute value.
6.2.3 AttributeValueAssertion
The three AttributeValueAssertion values are SEQUENCE
values, so their DER encodings follow the constructed,
definite-length method:
30 09 countryName = "US"
06 03 55 04 06
13 02 55 53
30 1b organizationName = "Example Organizaiton"
06 03 55 04 0a
13 14 ... 6f 6e
30 12 commonName = "Test User 1"
06 03 55 04 0b
13 0b ... 20 31
The identifier octets follow the low-tag-number form, since
the tag for SEQUENCE, 16 (decimal), is between 0 and 30.
Bits 8 and 7 have value "0" since SEQUENCE is in the
universal class. Bit 6 has value "1" since the encoding is
constructed. The length octets follow the short form, and
the contents octets are the concatenation of the DER
encodings of the attributeType and attributeValue
components.
6.2.4 RelativeDistinguishedName
The three RelativeDistinguishedName values are SET OF
values, so their DER encodings follow the constructed,
definite-length method:
31 0b
30 09 ... 55 53
31 1d
30 1b ... 6f 6e
31 14
30 12 ... 20 31
The identifier octets follow the low-tag-number form, since
the tag for SET OF, 17 (decimal), is between 0 and 30. Bits
8 and 7 have value "0" since SET OF is in the universal
class Bit 6 has value "1" since the encoding is constructed.
The lengths octets follow the short form, and the contents
octets are the DER encodings of the respective
AttributeValueAssertion values, since there is only one
value in each set.
6.2.5 RDNSequence
The RDNSequence value is a SEQUENCE OF value, so its DER
encoding follows the constructed, definite-length method:
30 42
31 0b ... 55 53
31 1d ... 6f 6e
31 14 ... 20 31
The identifier octets follow the low-tag-number form, since
the tag for SEQUENCE OF, 16 (decimal), is between 0 and 30.
Bits 8 and 7 have value "0" since SEQUENCE OF is in the
universal class. Bit 6 has value "1" since the encoding is
constructed. The lengths octets follow the short form, and
the contents octets are the concatenation of the DER
encodings of the three RelativeDistinguishedName values, in
order of occurrence.
6.2.6 Name
The Name value is a CHOICE value, so its DER encoding is the
same as that of the RDNSequence value:
30 42
31 0b
30 09
06 03 55 04 06 attributeType = countryName
13 02 55 53 attributeValue = "US"
31 1d
30 1b
06 03 55 04 0a attributeType = organizationName
13 14 attributeValue = "Example Organization"
45 78 61 6d 70 6c 65 20 4f 72 67 61 6e 69 7a 61
74 69 6f 6e
31 14
30 12
06 03 55 04 03 attributeType = commonName
13 0b attributeValue = "Test User 1"
54 65 73 74 20 55 73 65 72 20 31
References
PKCS #1 RSA Laboratories. PKCS #1: RSA Encryption
Standard. Version 1.5, November 1993.
PKCS #3 RSA Laboratories. PKCS #3: Diffie-Hellman Key-
Agreement Standard. Version 1.4, November 1993.
PKCS #5 RSA Laboratories. PKCS #5: Password-Based
Encryption Standard. Version 1.5, November 1993.
PKCS #6 RSA Laboratories. PKCS #6: Extended-Certificate
Syntax Standard. Version 1.5, November 1993.
PKCS #7 RSA Laboratories. PKCS #7: Cryptographic Message
Syntax Standard. Version 1.5, November 1993.
PKCS #8 RSA Laboratories. PKCS #8: Private-Key Information
Syntax Standard. Version 1.2, November 1993.
PKCS #9 RSA Laboratories. PKCS #9: Selected Attribute
Types. Version 1.1, November 1993.
PKCS #10 RSA Laboratories. PKCS #10: Certification Request
Syntax Standard. Version 1.0, November 1993.
X.200 CCITT. Recommendation X.200: Reference Model of
Open Systems Interconnection for CCITT
Applications. 1984.
X.208 CCITT. Recommendation X.208: Specification of
Abstract Syntax Notation One (ASN.1). 1988.
X.209 CCITT. Recommendation X.209: Specification of
Basic Encoding Rules for Abstract Syntax Notation
One (ASN.1). 1988.
X.500 CCITT. Recommendation X.500: The
Directory--Overview of Concepts, Models and
Services. 1988.
X.501 CCITT. Recommendation X.501: The Directory--
Models. 1988.
X.509 CCITT. Recommendation X.509: The Directory--
Authentication Framework. 1988.
X.520 CCITT. Recommendation X.520: The Directory--
Selected Attribute Types. 1988.
[Kal93] Burton S. Kaliski Jr. Some Examples of the PKCS
Standards. RSA Laboratories, November 1993.
[NIST92] NIST. Special Publication 500-202: Stable
Implementation Agreements for Open Systems
Interconnection Protocols. Part 11 (Directory
Services Protocols). December 1992.
Revision history
June 3, 1991 version
The June 3, 1991 version is part of the initial public
release of PKCS. It was published as NIST/OSI Implementors'
Workshop document SEC-SIG-91-17.
November 1, 1993 version
The November 1, 1993 version incorporates several editorial
changes, including the addition of a revision history. It is
updated to be consistent with the following versions of the
PKCS documents:
PKCS #1: RSA Encryption Standard. Version 1.5, November
1993.
PKCS #3: Diffie-Hellman Key-Agreement Standard. Version
1.4, November 1993.
PKCS #5: Password-Based Encryption Standard. Version
1.5, November 1993.
PKCS #6: Extended-Certificate Syntax Standard. Version
1.5, November 1993.
PKCS #7: Cryptographic Message Syntax Standard. Version
1.5, November 1993.
PKCS #8: Private-Key Information Syntax Standard.
Version 1.2, November 1993.
PKCS #9: Selected Attribute Types. Version 1.1,
November 1993.
PKCS #10: Certification Request Syntax Standard.
Version 1.0, November 1993.
The following substantive changes were made:
Section 5: Description of T61String type is added.
Section 6: Names are changed, consistent with other
PKCS examples.
Author's address
Burton S. Kaliski Jr., Ph.D.
Chief Scientist
RSA Laboratories (415) 595-7703
100 Marine Parkway (415) 595-4126 (fax)
Redwood City, CA 94065 USA burt@rsa.com
|