@@ -939,11 +939,43 @@ pgp_sk_sesskey_t::write(pgp_dest_t &dst) const
939939 pgp_packet_body_t pktbody (PGP_PKT_SK_SESSION_KEY);
940940 /* version and algorithm fields */
941941 pktbody.add_byte (version);
942+ #if defined(ENABLE_CRYPTO_REFRESH)
943+ uint8_t s2k_len;
944+ /* A one-octet scalar octet count for the 5 fields following this octet. */
945+ /* TODO: unify with pgp_key_pkt_t::s2k_specifier_len() */
946+ if (version == PGP_SKSK_V6) {
947+ switch (s2k.specifier ) {
948+ case PGP_S2KS_SIMPLE:
949+ s2k_len = 2 ;
950+ break ;
951+ case PGP_S2KS_SALTED:
952+ s2k_len = 10 ;
953+ break ;
954+ case PGP_S2KS_ITERATED_AND_SALTED:
955+ s2k_len = 11 ;
956+ break ;
957+ default :
958+ RNP_LOG (" invalid specifier" );
959+ throw rnp::rnp_exception (RNP_ERROR_BAD_PARAMETERS);
960+ }
961+ pktbody.add_byte (3 + s2k_len + ivlen);
962+ }
963+ #endif
942964 pktbody.add_byte (alg);
943- if (version == PGP_SKSK_V5) {
965+ if (version == PGP_SKSK_V5
966+ #if defined(ENABLE_CRYPTO_REFRESH)
967+ || version == PGP_SKSK_V6
968+ #endif
969+ ) {
944970 pktbody.add_byte (aalg);
945971 }
946- /* S2K specifier */
972+ /* S2K specifier */
973+ #if defined(ENABLE_CRYPTO_REFRESH)
974+ /* A one-octet scalar octet count of the following field. */
975+ if (version == PGP_SKSK_V6) {
976+ pktbody.add_byte (s2k_len);
977+ }
978+ #endif
947979 pktbody.add_byte (s2k.specifier );
948980 pktbody.add_byte (s2k.hash_alg );
949981
@@ -962,7 +994,11 @@ pgp_sk_sesskey_t::write(pgp_dest_t &dst) const
962994 throw rnp::rnp_exception (RNP_ERROR_BAD_PARAMETERS);
963995 }
964996 /* v5 : iv */
965- if (version == PGP_SKSK_V5) {
997+ if (version == PGP_SKSK_V5
998+ #if defined(ENABLE_CRYPTO_REFRESH)
999+ || version == PGP_SKSK_V6
1000+ #endif
1001+ ) {
9661002 pktbody.add (iv, ivlen);
9671003 }
9681004 /* encrypted key and auth tag for v5 */
@@ -973,6 +1009,82 @@ pgp_sk_sesskey_t::write(pgp_dest_t &dst) const
9731009 pktbody.write (dst);
9741010}
9751011
1012+ #if defined(ENABLE_CRYPTO_REFRESH)
1013+ rnp_result_t
1014+ pgp_sk_sesskey_t ::parse_v6(pgp_packet_body_t &pkt)
1015+ {
1016+ uint8_t bt;
1017+ uint8_t octet_count;
1018+ uint8_t s2k_len;
1019+
1020+ /* A one-octet scalar octet count for the 5 fields following this octet. */
1021+ /* TODO: do we need to check octet_count? */
1022+ if (!pkt.get (octet_count)) {
1023+ RNP_LOG (" failed to get octet count of next 5 fields" );
1024+ return RNP_ERROR_BAD_FORMAT;
1025+ }
1026+
1027+ /* symmetric algorithm */
1028+ if (!pkt.get (bt)) {
1029+ RNP_LOG (" failed to get symm alg" );
1030+ return RNP_ERROR_BAD_FORMAT;
1031+ }
1032+ alg = (pgp_symm_alg_t ) bt;
1033+
1034+ /* aead algorithm */
1035+ if (!pkt.get (bt)) {
1036+ RNP_LOG (" failed to get aead alg" );
1037+ return RNP_ERROR_BAD_FORMAT;
1038+ }
1039+ aalg = (pgp_aead_alg_t ) bt;
1040+ if ((aalg != PGP_AEAD_EAX) && (aalg != PGP_AEAD_OCB)) {
1041+ RNP_LOG (" unsupported AEAD algorithm : %d" , (int ) aalg);
1042+ return RNP_ERROR_BAD_PARAMETERS;
1043+ }
1044+
1045+ /* A one-octet scalar octet count of the following field. */
1046+ /* TODO: do we need to check s2k_len? */
1047+ if (!pkt.get (s2k_len)) {
1048+ RNP_LOG (" failed to get octet count of next 5 fields" );
1049+ return RNP_ERROR_BAD_FORMAT;
1050+ }
1051+
1052+ /* s2k */
1053+ if (!pkt.get (s2k)) {
1054+ RNP_LOG (" failed to parse s2k" );
1055+ return RNP_ERROR_BAD_FORMAT;
1056+ }
1057+
1058+ size_t noncelen = pgp_cipher_aead_nonce_len (aalg);
1059+ size_t taglen = pgp_cipher_aead_tag_len (aalg);
1060+ size_t keylen = 0 ;
1061+
1062+ if (pkt.left () > noncelen + taglen + PGP_MAX_KEY_SIZE) {
1063+ RNP_LOG (" too long esk" );
1064+ return RNP_ERROR_BAD_FORMAT;
1065+ }
1066+ if (pkt.left () < noncelen + taglen + 8 ) {
1067+ RNP_LOG (" too short esk" );
1068+ return RNP_ERROR_BAD_FORMAT;
1069+ }
1070+ /* iv */
1071+ if (!pkt.get (iv, noncelen)) {
1072+ RNP_LOG (" failed to get iv" );
1073+ return RNP_ERROR_BAD_FORMAT;
1074+ }
1075+ ivlen = noncelen;
1076+
1077+ /* key */
1078+ keylen = pkt.left ();
1079+ if (!pkt.get (enckey, keylen)) {
1080+ RNP_LOG (" failed to get key" );
1081+ return RNP_ERROR_BAD_FORMAT;
1082+ }
1083+ enckeylen = keylen;
1084+ return RNP_SUCCESS;
1085+ }
1086+ #endif
1087+
9761088rnp_result_t
9771089pgp_sk_sesskey_t ::parse(pgp_source_t &src)
9781090{
@@ -985,6 +1097,12 @@ pgp_sk_sesskey_t::parse(pgp_source_t &src)
9851097 /* version */
9861098 uint8_t bt;
9871099 if (!pkt.get (bt) || ((bt != PGP_SKSK_V4) && (bt != PGP_SKSK_V5))) {
1100+ #if defined(ENABLE_CRYPTO_REFRESH)
1101+ if (bt == PGP_SKSK_V6) {
1102+ version = bt;
1103+ return parse_v6 (pkt);
1104+ }
1105+ #endif
9881106 RNP_LOG (" wrong packet version" );
9891107 return RNP_ERROR_BAD_FORMAT;
9901108 }
0 commit comments