rfc4211.py 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391
  1. # coding: utf-8
  2. #
  3. # This file is part of pyasn1-modules software.
  4. #
  5. # Created by Stanisław Pitucha with asn1ate tool.
  6. # Copyright (c) 2005-2017, Ilya Etingof <etingof@gmail.com>
  7. # License: http://pyasn1.sf.net/license.html
  8. #
  9. # Internet X.509 Public Key Infrastructure Certificate Request
  10. # Message Format (CRMF)
  11. #
  12. # ASN.1 source from:
  13. # http://www.ietf.org/rfc/rfc4211.txt
  14. #
  15. from pyasn1.type import univ, char, namedtype, namedval, tag, constraint
  16. from pyasn1_modules import rfc3280
  17. from pyasn1_modules import rfc3852
  18. MAX = 64
  19. def _buildOid(*components):
  20. output = []
  21. for x in tuple(components):
  22. if isinstance(x, univ.ObjectIdentifier):
  23. output.extend(list(x))
  24. else:
  25. output.append(int(x))
  26. return univ.ObjectIdentifier(output)
  27. id_pkix = _buildOid(1, 3, 6, 1, 5, 5, 7)
  28. id_pkip = _buildOid(id_pkix, 5)
  29. id_regCtrl = _buildOid(id_pkip, 1)
  30. class SinglePubInfo(univ.Sequence):
  31. pass
  32. SinglePubInfo.componentType = namedtype.NamedTypes(
  33. namedtype.NamedType('pubMethod', univ.Integer(
  34. namedValues=namedval.NamedValues(('dontCare', 0), ('x500', 1), ('web', 2), ('ldap', 3)))),
  35. namedtype.OptionalNamedType('pubLocation', rfc3280.GeneralName())
  36. )
  37. class UTF8Pairs(char.UTF8String):
  38. pass
  39. class PKMACValue(univ.Sequence):
  40. pass
  41. PKMACValue.componentType = namedtype.NamedTypes(
  42. namedtype.NamedType('algId', rfc3280.AlgorithmIdentifier()),
  43. namedtype.NamedType('value', univ.BitString())
  44. )
  45. class POPOSigningKeyInput(univ.Sequence):
  46. pass
  47. POPOSigningKeyInput.componentType = namedtype.NamedTypes(
  48. namedtype.NamedType(
  49. 'authInfo', univ.Choice(
  50. componentType=namedtype.NamedTypes(
  51. namedtype.NamedType(
  52. 'sender', rfc3280.GeneralName().subtype(implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatConstructed, 0))
  53. ),
  54. namedtype.NamedType(
  55. 'publicKeyMAC', PKMACValue()
  56. )
  57. )
  58. )
  59. ),
  60. namedtype.NamedType('publicKey', rfc3280.SubjectPublicKeyInfo())
  61. )
  62. class POPOSigningKey(univ.Sequence):
  63. pass
  64. POPOSigningKey.componentType = namedtype.NamedTypes(
  65. namedtype.OptionalNamedType('poposkInput', POPOSigningKeyInput().subtype(
  66. implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatConstructed, 0))),
  67. namedtype.NamedType('algorithmIdentifier', rfc3280.AlgorithmIdentifier()),
  68. namedtype.NamedType('signature', univ.BitString())
  69. )
  70. class Attributes(univ.SetOf):
  71. pass
  72. Attributes.componentType = rfc3280.Attribute()
  73. class PrivateKeyInfo(univ.Sequence):
  74. pass
  75. PrivateKeyInfo.componentType = namedtype.NamedTypes(
  76. namedtype.NamedType('version', univ.Integer()),
  77. namedtype.NamedType('privateKeyAlgorithm', rfc3280.AlgorithmIdentifier()),
  78. namedtype.NamedType('privateKey', univ.OctetString()),
  79. namedtype.OptionalNamedType('attributes',
  80. Attributes().subtype(implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 0)))
  81. )
  82. class EncryptedValue(univ.Sequence):
  83. pass
  84. EncryptedValue.componentType = namedtype.NamedTypes(
  85. namedtype.OptionalNamedType('intendedAlg', rfc3280.AlgorithmIdentifier().subtype(
  86. implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 0))),
  87. namedtype.OptionalNamedType('symmAlg', rfc3280.AlgorithmIdentifier().subtype(
  88. implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 1))),
  89. namedtype.OptionalNamedType('encSymmKey', univ.BitString().subtype(
  90. implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 2))),
  91. namedtype.OptionalNamedType('keyAlg', rfc3280.AlgorithmIdentifier().subtype(
  92. implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 3))),
  93. namedtype.OptionalNamedType('valueHint', univ.OctetString().subtype(
  94. implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 4))),
  95. namedtype.NamedType('encValue', univ.BitString())
  96. )
  97. class EncryptedKey(univ.Choice):
  98. pass
  99. EncryptedKey.componentType = namedtype.NamedTypes(
  100. namedtype.NamedType('encryptedValue', EncryptedValue()),
  101. namedtype.NamedType('envelopedData', rfc3852.EnvelopedData().subtype(
  102. implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 0)))
  103. )
  104. class KeyGenParameters(univ.OctetString):
  105. pass
  106. class PKIArchiveOptions(univ.Choice):
  107. pass
  108. PKIArchiveOptions.componentType = namedtype.NamedTypes(
  109. namedtype.NamedType('encryptedPrivKey',
  110. EncryptedKey().subtype(implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatConstructed, 0))),
  111. namedtype.NamedType('keyGenParameters',
  112. KeyGenParameters().subtype(implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 1))),
  113. namedtype.NamedType('archiveRemGenPrivKey',
  114. univ.Boolean().subtype(implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 2)))
  115. )
  116. id_regCtrl_authenticator = _buildOid(id_regCtrl, 2)
  117. id_regInfo = _buildOid(id_pkip, 2)
  118. id_regInfo_certReq = _buildOid(id_regInfo, 2)
  119. class ProtocolEncrKey(rfc3280.SubjectPublicKeyInfo):
  120. pass
  121. class Authenticator(char.UTF8String):
  122. pass
  123. class SubsequentMessage(univ.Integer):
  124. pass
  125. SubsequentMessage.namedValues = namedval.NamedValues(
  126. ('encrCert', 0),
  127. ('challengeResp', 1)
  128. )
  129. class AttributeTypeAndValue(univ.Sequence):
  130. pass
  131. AttributeTypeAndValue.componentType = namedtype.NamedTypes(
  132. namedtype.NamedType('type', univ.ObjectIdentifier()),
  133. namedtype.NamedType('value', univ.Any())
  134. )
  135. class POPOPrivKey(univ.Choice):
  136. pass
  137. POPOPrivKey.componentType = namedtype.NamedTypes(
  138. namedtype.NamedType('thisMessage',
  139. univ.BitString().subtype(implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 0))),
  140. namedtype.NamedType('subsequentMessage',
  141. SubsequentMessage().subtype(implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 1))),
  142. namedtype.NamedType('dhMAC',
  143. univ.BitString().subtype(implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 2))),
  144. namedtype.NamedType('agreeMAC',
  145. PKMACValue().subtype(implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatConstructed, 3))),
  146. namedtype.NamedType('encryptedKey', rfc3852.EnvelopedData().subtype(
  147. implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 4)))
  148. )
  149. class ProofOfPossession(univ.Choice):
  150. pass
  151. ProofOfPossession.componentType = namedtype.NamedTypes(
  152. namedtype.NamedType('raVerified',
  153. univ.Null().subtype(implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 0))),
  154. namedtype.NamedType('signature', POPOSigningKey().subtype(
  155. implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatConstructed, 1))),
  156. namedtype.NamedType('keyEncipherment',
  157. POPOPrivKey().subtype(implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatConstructed, 2))),
  158. namedtype.NamedType('keyAgreement',
  159. POPOPrivKey().subtype(implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatConstructed, 3)))
  160. )
  161. class OptionalValidity(univ.Sequence):
  162. pass
  163. OptionalValidity.componentType = namedtype.NamedTypes(
  164. namedtype.OptionalNamedType('notBefore', rfc3280.Time().subtype(
  165. implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatConstructed, 0))),
  166. namedtype.OptionalNamedType('notAfter', rfc3280.Time().subtype(
  167. implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatConstructed, 1)))
  168. )
  169. class CertTemplate(univ.Sequence):
  170. pass
  171. CertTemplate.componentType = namedtype.NamedTypes(
  172. namedtype.OptionalNamedType('version', rfc3280.Version().subtype(
  173. implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 0))),
  174. namedtype.OptionalNamedType('serialNumber', univ.Integer().subtype(
  175. implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 1))),
  176. namedtype.OptionalNamedType('signingAlg', rfc3280.AlgorithmIdentifier().subtype(
  177. implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 2))),
  178. namedtype.OptionalNamedType('issuer', rfc3280.Name().subtype(
  179. implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatConstructed, 3))),
  180. namedtype.OptionalNamedType('validity', OptionalValidity().subtype(
  181. implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatConstructed, 4))),
  182. namedtype.OptionalNamedType('subject', rfc3280.Name().subtype(
  183. implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatConstructed, 5))),
  184. namedtype.OptionalNamedType('publicKey', rfc3280.SubjectPublicKeyInfo().subtype(
  185. implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 6))),
  186. namedtype.OptionalNamedType('issuerUID', rfc3280.UniqueIdentifier().subtype(
  187. implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 7))),
  188. namedtype.OptionalNamedType('subjectUID', rfc3280.UniqueIdentifier().subtype(
  189. implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 8))),
  190. namedtype.OptionalNamedType('extensions', rfc3280.Extensions().subtype(
  191. implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 9)))
  192. )
  193. class Controls(univ.SequenceOf):
  194. pass
  195. Controls.componentType = AttributeTypeAndValue()
  196. Controls.subtypeSpec = constraint.ValueSizeConstraint(1, MAX)
  197. class CertRequest(univ.Sequence):
  198. pass
  199. CertRequest.componentType = namedtype.NamedTypes(
  200. namedtype.NamedType('certReqId', univ.Integer()),
  201. namedtype.NamedType('certTemplate', CertTemplate()),
  202. namedtype.OptionalNamedType('controls', Controls())
  203. )
  204. class CertReqMsg(univ.Sequence):
  205. pass
  206. CertReqMsg.componentType = namedtype.NamedTypes(
  207. namedtype.NamedType('certReq', CertRequest()),
  208. namedtype.OptionalNamedType('popo', ProofOfPossession()),
  209. namedtype.OptionalNamedType('regInfo', univ.SequenceOf(componentType=AttributeTypeAndValue()))
  210. )
  211. class CertReqMessages(univ.SequenceOf):
  212. pass
  213. CertReqMessages.componentType = CertReqMsg()
  214. CertReqMessages.subtypeSpec = constraint.ValueSizeConstraint(1, MAX)
  215. class CertReq(CertRequest):
  216. pass
  217. id_regCtrl_pkiPublicationInfo = _buildOid(id_regCtrl, 3)
  218. class CertId(univ.Sequence):
  219. pass
  220. CertId.componentType = namedtype.NamedTypes(
  221. namedtype.NamedType('issuer', rfc3280.GeneralName()),
  222. namedtype.NamedType('serialNumber', univ.Integer())
  223. )
  224. class OldCertId(CertId):
  225. pass
  226. class PKIPublicationInfo(univ.Sequence):
  227. pass
  228. PKIPublicationInfo.componentType = namedtype.NamedTypes(
  229. namedtype.NamedType('action',
  230. univ.Integer(namedValues=namedval.NamedValues(('dontPublish', 0), ('pleasePublish', 1)))),
  231. namedtype.OptionalNamedType('pubInfos', univ.SequenceOf(componentType=SinglePubInfo()))
  232. )
  233. class EncKeyWithID(univ.Sequence):
  234. pass
  235. EncKeyWithID.componentType = namedtype.NamedTypes(
  236. namedtype.NamedType('privateKey', PrivateKeyInfo()),
  237. namedtype.OptionalNamedType(
  238. 'identifier', univ.Choice(
  239. componentType=namedtype.NamedTypes(
  240. namedtype.NamedType('string', char.UTF8String()),
  241. namedtype.NamedType('generalName', rfc3280.GeneralName())
  242. )
  243. )
  244. )
  245. )
  246. id_regCtrl_protocolEncrKey = _buildOid(id_regCtrl, 6)
  247. id_regCtrl_oldCertID = _buildOid(id_regCtrl, 5)
  248. id_smime = _buildOid(1, 2, 840, 113549, 1, 9, 16)
  249. class PBMParameter(univ.Sequence):
  250. pass
  251. PBMParameter.componentType = namedtype.NamedTypes(
  252. namedtype.NamedType('salt', univ.OctetString()),
  253. namedtype.NamedType('owf', rfc3280.AlgorithmIdentifier()),
  254. namedtype.NamedType('iterationCount', univ.Integer()),
  255. namedtype.NamedType('mac', rfc3280.AlgorithmIdentifier())
  256. )
  257. id_regCtrl_regToken = _buildOid(id_regCtrl, 1)
  258. id_regCtrl_pkiArchiveOptions = _buildOid(id_regCtrl, 4)
  259. id_regInfo_utf8Pairs = _buildOid(id_regInfo, 1)
  260. id_ct = _buildOid(id_smime, 1)
  261. id_ct_encKeyWithID = _buildOid(id_ct, 21)
  262. class RegToken(char.UTF8String):
  263. pass